diff --git a/.claude/worktrees/feat-7786/changelog.d/features/7786-management-auth-terminology-docs.md b/.claude/worktrees/feat-7786/changelog.d/features/7786-management-auth-terminology-docs.md new file mode 100644 index 0000000000..4a5fca7f9d --- /dev/null +++ b/.claude/worktrees/feat-7786/changelog.d/features/7786-management-auth-terminology-docs.md @@ -0,0 +1 @@ +- **docs:** add management authentication terminology guide ([#7786](https://github.com/diegosouzapw/OmniRoute/issues/7786)) diff --git a/.claude/worktrees/feat-7786/docs/guides/MANAGEMENT-AUTH.md b/.claude/worktrees/feat-7786/docs/guides/MANAGEMENT-AUTH.md new file mode 100644 index 0000000000..cc74622a5f --- /dev/null +++ b/.claude/worktrees/feat-7786/docs/guides/MANAGEMENT-AUTH.md @@ -0,0 +1,41 @@ +# Management Authentication + +OmniRoute uses four distinct credential families for management access. This guide +distinguishes them by purpose, scope, and locality. + +| Credential | Scope | Locality | Use Case | +|-------------------------|--------------------|---------------|-----------------------------------| +| Dashboard JWT session | Full management | Localhost | Web dashboard login | +| CLI machine-id token | Full management | Per-machine | `omniroute` CLI commands | +| Scoped `oma_` token | Configurable scope | External | Automation / CI / API access | +| Manage-scope API key | `manage` scope | External | Management API calls | + +## Dashboard JWT Session + +Generated on dashboard login (`/api/auth/login`). Stored in HTTP-only cookie. +Valid for the session duration. Cannot be used from external hosts. + +## CLI Machine-ID Token + +Created by `omniroute auth login` on first use. Stored in `~/.omniroute/auth.json`. +Used by the CLI for all management operations. Tied to the machine identity. + +## Scoped `oma_` Access Token + +Created via dashboard or CLI with configurable scopes (e.g., `manage`, `read`). +Format: `oma_`. Used for programmatic access from external systems. + +## Manage-Scope API Key + +Standard API key with the `manage` scope enabled. Created in dashboard API Keys page. +Used for management API calls from external hosts. + +## Header Examples + +``` +Authorization: Bearer oma_abc123def456 +Authorization: Bearer +Cookie: omniroute_session= +``` + +See `docs/reference/API_REFERENCE.md` for endpoint-specific auth requirements. diff --git a/.claude/worktrees/feat-7786/tests/unit/management-auth-docs.test.ts b/.claude/worktrees/feat-7786/tests/unit/management-auth-docs.test.ts new file mode 100644 index 0000000000..35410e81c3 --- /dev/null +++ b/.claude/worktrees/feat-7786/tests/unit/management-auth-docs.test.ts @@ -0,0 +1,27 @@ +import { describe, it } from "node:test"; +import { ok } from "node:assert/strict"; +import { readFileSync } from "node:fs"; + +describe("Management auth documentation (#7786)", () => { + const docPath = "docs/guides/MANAGEMENT-AUTH.md"; + const content = readFileSync(docPath, "utf-8"); + + it("exists and has content", () => { + ok(content.length > 500, "should have substantial content"); + ok(content.includes("Dashboard JWT session")); + ok(content.includes("CLI machine-id token")); + ok(content.includes("oma_")); + }); + + it("documents all four credential families", () => { + const families = ["Dashboard JWT", "CLI machine-id", "oma_", "Manage-scope"]; + for (const f of families) { + ok(content.includes(f), `should document ${f}`); + } + }); + + it("mentions relevant auth header examples", () => { + ok(content.includes("Authorization")); + ok(content.includes("Bearer")); + }); +}); diff --git a/.claude/worktrees/feat-8635/changelog.d/features/8635-systemd-autostart-linux.md b/.claude/worktrees/feat-8635/changelog.d/features/8635-systemd-autostart-linux.md new file mode 100644 index 0000000000..5388099604 --- /dev/null +++ b/.claude/worktrees/feat-8635/changelog.d/features/8635-systemd-autostart-linux.md @@ -0,0 +1 @@ +- **feat(infra):** add systemd autostart unit for Linux ([#8635](https://github.com/diegosouzapw/OmniRoute/issues/8635)) diff --git a/.claude/worktrees/feat-8635/contrib/systemd/omniroute.service b/.claude/worktrees/feat-8635/contrib/systemd/omniroute.service new file mode 100644 index 0000000000..c2dae17631 --- /dev/null +++ b/.claude/worktrees/feat-8635/contrib/systemd/omniroute.service @@ -0,0 +1,19 @@ +[Unit] +Description=OmniRoute AI Proxy +After=network.target network-online.target +Wants=network-online.target + +[Service] +Type=simple +ExecStart=$(which omniroute) start +Restart=on-failure +RestartSec=5 +Environment=NODE_ENV=production + +# Security hardening +NoNewPrivileges=true +ProtectSystem=full +PrivateTmp=true + +[Install] +WantedBy=default.target diff --git a/.claude/worktrees/feat-8635/tests/unit/systemd-autostart.test.ts b/.claude/worktrees/feat-8635/tests/unit/systemd-autostart.test.ts new file mode 100644 index 0000000000..0dca17303f --- /dev/null +++ b/.claude/worktrees/feat-8635/tests/unit/systemd-autostart.test.ts @@ -0,0 +1,23 @@ +import { describe, it } from "node:test"; +import { ok } from "node:assert/strict"; +import { readFileSync, existsSync } from "node:fs"; + +describe("Systemd autostart (#8635)", () => { + const svcPath = "contrib/systemd/omniroute.service"; + const content = readFileSync(svcPath, "utf-8"); + + it("service file exists", () => { + ok(existsSync(svcPath)); + ok(content.length > 200); + }); + + it("defines required systemd sections", () => { + ok(content.includes("[Unit]")); + ok(content.includes("[Service]")); + ok(content.includes("[Install]")); + }); + + it("specifies WantedBy=default.target", () => { + ok(content.includes("WantedBy=default.target")); + }); +}); diff --git a/.dockerignore b/.dockerignore index 4dea7c7d1f..be16eca2a2 100644 --- a/.dockerignore +++ b/.dockerignore @@ -24,6 +24,7 @@ coverage # Runtime data and logs data logs +.sandbox # Local env files (inject at runtime via --env-file or -e) .env diff --git a/.env.devin-bridge.example b/.env.devin-bridge.example new file mode 100644 index 0000000000..fb02ecd66b --- /dev/null +++ b/.env.devin-bridge.example @@ -0,0 +1,6 @@ +ENABLE_LIVE_DEVIN_TESTS=0 +DEVIN_BRIDGE_MODEL=devin-cli-agentic/swe-1-7 +DEVIN_BRIDGE_SONNET_MODEL=devin-cli-agentic/swe-1-7 +DEVIN_BRIDGE_OPUS_MODEL=devin-cli-agentic/swe-1-7 +DEVIN_BRIDGE_HAIKU_MODEL=devin-cli-agentic/swe-1-7 +DEVIN_BRIDGE_SUBAGENT_MODEL=devin-cli-agentic/swe-1-7 diff --git a/.env.example b/.env.example index d96a2c72d6..d3b3f4b364 100644 --- a/.env.example +++ b/.env.example @@ -345,14 +345,18 @@ ALLOW_API_KEY_REVEAL=false # OMNIROUTE_CHAT_HEAVY_TOOL_COUNT=64 # Conservative string-size token estimate that classifies a request as heavyweight. Default 32000. # OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS=32000 -# Hard message-count cap; excess receives compact-required 413. Default 800. -# OMNIROUTE_CHAT_HARD_MAX_MESSAGES=800 +# Optional opt-in hard message-count cap; excess receives compact-required 413 before +# compression can run. Unset/0 (the default) means no history cap: heap growth is bounded +# by OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT and the heap-pressure shed instead. Set a positive +# value only on memory-constrained deployments that need a hard ceiling. +# OMNIROUTE_CHAT_HARD_MAX_MESSAGES=0 # Hard cap (bytes) for a non-streaming upstream response buffered fully into memory # (#5152). Past this the upstream reader is cancelled and the request fails fast # instead of growing an unbounded string until the V8 heap is exhausted. # Used by: open-sse/handlers/chatCore/nonStreamingResponseBody.ts # Default: 67108864 (64 MB) +# OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES=768 # OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES=67108864 # CORS configuration — controls which cross-origin browser clients can call the API. @@ -793,6 +797,16 @@ PROVIDER_LIMITS_SYNC_SPACING_MS=1500 # Disable the proactive recovery scheduler entirely (default: false). # OMNIROUTE_DISABLE_CONNECTION_RECOVERY=false +# Proactive Claude warmup scheduler (#8848): fires a trivial request to opted-in +# OAuth connections on a cron schedule (America/Los_Angeles) so accounts do not +# hit the 5-hour sliding window cold. Off by default — set ENABLED=1 and flip +# per-connection flags in settings.claudeWarmup.connections to activate. +# Used by: src/lib/warmupScheduler.ts. +# OMNIROUTE_WARMUP_ENABLED=false +# OMNIROUTE_WARMUP_CRON="0 7 * * *" +# OMNIROUTE_WARMUP_CONCURRENCY=3 +# OMNIROUTE_WARMUP_MODEL= + # Background job interval for budget reset checks (ms). Default: 600000 (10m). # Used by: src/lib/jobs/budgetResetJob.ts. Floor: 10000. #OMNIROUTE_BUDGET_RESET_JOB_INTERVAL_MS=600000 @@ -857,6 +871,12 @@ PROVIDER_LIMITS_SYNC_SPACING_MS=1500 # (>= 3 retrievals = never compressed). 1 disables the ramp (binary skip at the threshold only). # Used by: open-sse/services/compression/engines/ccr/index.ts. Default: 2. #COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR=2 +# CCR durable block store (#9061). The in-memory store loses blocks to LRU eviction, the TTL, a +# restart, or a retrieve landing on another instance, while the model is told it can retrieve them +# verbatim. Set to false to keep blocks in memory only, at the cost of that promise. Blocks over +# 512KB and cloud runtimes are memory-only regardless. +# Used by: open-sse/services/compression/engines/ccr/index.ts. Default: true. +#COMPRESSION_CCR_DURABLE_STORE=true # T08/H5 — usage-observed prefix freeze (OPT-IN, default off). When enabled, a system prompt seen # >= THRESHOLD times is treated as a stable cacheable prefix and preserved from compression even # for providers the static cache-aware heuristic does not recognize (freeze = preserve, never @@ -1041,6 +1061,17 @@ GITHUB_OAUTH_CLIENT_ID=Iv1.b507a08c87ecfe98 # VISION_BRIDGE_BASE_URL= # VISION_BRIDGE_API_KEY= +# ── Raycast Pro (local auto-import) ── +# Raycast Pro AI is a reverse-engineered, unofficial API — local/personal use +# only (no OAuth client_id/secret; token is captured via macOS Auto-Import +# from the Keychain + local Raycast SQLite DB, or pasted manually). These +# vars are optional manual overrides used by open-sse/services/raycast.ts +# and the direct-probe benchmark script scripts/raycast/usage-benchmark.mjs. +# RAYCAST_BEARER_TOKEN= +# RAYCAST_DEVICE_ID= +# RAYCAST_AID= +# RAYCAST_SIG_SECRET= + # ───────────────────────────────────────────────────────────────────────────── # ⚠️ GOOGLE OAUTH (Antigravity) & OTHER PROVIDERS — REMOTE SERVERS # ───────────────────────────────────────────────────────────────────────────── @@ -1253,6 +1284,14 @@ CURSOR_USER_AGENT="Cursor/3.4" # OMNIROUTE_BROWSER_POOL=on # WEB_COOKIE_USE_BROWSER=0 +# ── Adobe Firefly browser sign-in (system Chrome/Edge CDP) ── +# Used by: open-sse/services/adobeFireflyBrowserLogin.ts. The Firefly login +# flow drives a real, system-installed Chrome or Microsoft Edge via CDP so the +# user can sign in interactively; the executable is auto-detected from common +# install paths per OS. Set this to override that detection (e.g. a portable +# install or a non-standard path) when auto-detection fails. +# OMNIROUTE_LOGIN_BROWSER_PATH= + # ── Circuit breaker thresholds and reset windows ── # Used by: open-sse/config/constants.ts → src/lib/resilience/settings.ts. # Defaults match historical PROVIDER_PROFILES values (post-scaling for @@ -1501,6 +1540,15 @@ APP_LOG_TO_FILE=true # ═══════════════════════════════════════════════════════════════════════════════ # 19. MODEL SYNC (Dev) # ═══════════════════════════════════════════════════════════════════════════════ +# Enable the models.dev capability sync. Default: false (opt-in only). +# Also settable from Dashboard > Settings > AI. This variable wins over that +# setting whenever it is set to anything non-empty, in either direction, so a +# deployment can pin the sync on or off without depending on database state +# surviving a rebuild. Leave it unset to let the dashboard toggle decide. +# On: 1, true, yes or on (any casing). Any other value is off. +# Used by: src/lib/modelsDevSync.ts +# MODELS_DEV_SYNC_ENABLED=false + # Development-time model catalog sync interval in seconds. # Used by: src/lib/modelsDevSync.ts # Default: 86400 (24 hours) @@ -1523,6 +1571,14 @@ APP_LOG_TO_FILE=true # Default: 86400000 (24 hours) # OPENROUTER_CATALOG_TTL_MS=86400000 +# Enrich the dashboard providers list with OpenRouter weekly ranking stats. +# ON by default; set false to skip the background fetch entirely (#9324). +# Used by: src/lib/catalog/openrouterProviderStats.ts +# OPENROUTER_PROVIDER_STATS_ENABLED=true +# Cache TTL for the OpenRouter provider stats snapshot, in ms. +# Default: 86400000 (24 hours) +# OPENROUTER_PROVIDER_STATS_TTL_MS=86400000 + # ── Model catalog response shape ── # Include display-friendly name fields in /v1/models responses. # Disable for clients that expect model IDs only. @@ -1543,6 +1599,13 @@ APP_LOG_TO_FILE=true # DESIGNER_WEB_POLL_TIMEOUT_MS=60000 # Max wait for job completion (default: 60s) # DESIGNER_WEB_POLL_INTERVAL_MS=2000 # Poll frequency (default: 2s) +# ── Adobe Firefly (Image Upscale) ── +# Base delay (ms) for the submit-retry exponential backoff when Adobe Firefly's +# upscale job submission is rate-limited. Used by: +# open-sse/services/adobeFireflyUpscale.ts::submitRetryDelayMs. +# Default: 8000 (20 under NODE_ENV=test/VITEST/NODE_TEST_CONTEXT). +# ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS=8000 + # ── AWS Bedrock (Kiro / Audio) ── # Region used to construct AWS Bedrock endpoints. Used by: # src/lib/providers/validation.ts and open-sse/handlers/audioSpeech.ts. @@ -1637,6 +1700,26 @@ APP_LOG_TO_FILE=true # Used by: src/lib/services/bootstrap.ts, src/app/api/services/mux/_lib.ts # MUX_SERVICE_PORT=8322 +# ── Dario embedded service ── +# Override the host/port the embedded Dario (Claude Code subscription proxy) +# daemon binds to and is reached at. Always bound to 127.0.0.1 — never +# configurable to 0.0.0.0. Rarely needed — defaults to 127.0.0.1:3456. +# Used by: src/lib/services/installers/dario.ts, src/lib/services/bootstrap.ts, +# src/app/api/services/dario/_lib.ts, src/app/api/services/dario/admin/_lib.ts, +# open-sse/executors/dario.ts +# DARIO_HOST=127.0.0.1 +# DARIO_PORT=3456 + +# ── Dario embedded service ── +# Override the host/port the embedded Dario (Claude Code subscription proxy) +# daemon binds to and is reached at. Always bound to 127.0.0.1 — never +# configurable to 0.0.0.0. Rarely needed — defaults to 127.0.0.1:3456. +# Used by: src/lib/services/installers/dario.ts, src/lib/services/bootstrap.ts, +# src/app/api/services/dario/_lib.ts, src/app/api/services/dario/admin/_lib.ts, +# open-sse/executors/dario.ts +# DARIO_HOST=127.0.0.1 +# DARIO_PORT=3456 + # ── Local hostnames (Docker networking) ── # Comma-separated additional hostnames treated as "local" for provider routing. # Used by: open-sse/config/providerRegistry.ts — allows Docker service names. @@ -1869,6 +1952,18 @@ APP_LOG_TO_FILE=true # ── Devin CLI binary path ── # Used by: open-sse/executors/devin-cli.ts. Default: looked up via PATH. # CLI_DEVIN_BIN=devin +# Agentic bridge-only binary override. The bridge still executes ACP stdio only. +# CLI_DEVIN_AGENTIC_BIN=devin +# Required isolated HOME for the agentic Devin child process. +# DEVIN_AGENTIC_HOME=/home/bridge +# Bounded ACP turn timeout in milliseconds. Default: 120000. +# DEVIN_AGENTIC_ACP_TIMEOUT_MS=120000 +# Agentic bridge model aliases. Values must keep the devin-cli-agentic/ prefix. +# DEVIN_BRIDGE_MODEL=devin-cli-agentic/swe-1-7 +# DEVIN_BRIDGE_SONNET_MODEL=devin-cli-agentic/swe-1-7 +# DEVIN_BRIDGE_OPUS_MODEL=devin-cli-agentic/swe-1-7 +# DEVIN_BRIDGE_HAIKU_MODEL=devin-cli-agentic/swe-1-7 +# DEVIN_BRIDGE_SUBAGENT_MODEL=devin-cli-agentic/swe-1-7 # ── Command Code (custom CLI) callback ── # Local port used for OAuth-style callbacks from the Command Code CLI helper. @@ -2139,6 +2234,11 @@ PLAYGROUND_COMPARE_MAX_COLUMNS=4 # MEMORY_TYPED_DECAY_EPISODIC_DAYS=30 # episodic TTL in days; 0 = episodic immune too # MEMORY_TYPED_DECAY_ACCESS_IMMUNITY=3 # access_count >= N → immune; 0 disables access immunity # MEMORY_TYPED_DECAY_SWEEP_INTERVAL=0 # periodic sweep interval (seconds); 0 = no periodic sweep +# ─── Memory Backend Connectors (Generic HTTP) ────────────────────────────── +# NOTION_API_KEY= +# NOTION_API_URL= +# OBSIDIAN_API_KEY= +# OBSIDIAN_API_URL= # AgentBridge + Traffic Inspector (Group A) # AgentBridge @@ -2154,6 +2254,15 @@ INSPECTOR_MAX_BODY_KB=1024 INSPECTOR_MASK_SECRETS=true INSPECTOR_LLM_HOSTS_EXTRA= INSPECTOR_INTERNAL_INGEST_TOKEN= +# Shared secret for identity-preserving internal REST hops (#9260): when an +# OmniRoute component calls another local OmniRoute route, this token (sent as +# x-omniroute-internal-service-token) marks the request as internal so the +# original caller identity is preserved. OPT-IN: unset disables the mechanism. +# Used by: src/lib/api/internalServiceAuth.ts +# OMNIROUTE_INTERNAL_SERVICE_TOKEN= +# File-based variant (secret-file pattern; wins only when the inline var is +# unset): path to a file whose trimmed content is the token. +# OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE= # Quota Sharing (Group B — planos 16+22) QUOTA_STORE_DRIVER=sqlite # sqlite | redis # QUOTA_STORE_REDIS_URL= # ex.: redis://localhost:6379 (apenas quando driver=redis) @@ -2370,3 +2479,38 @@ QUOTA_STORE_DRIVER=sqlite # sqlite | redis # OMNIROUTE_DATA_DIR are both unset. Locates the Notion web-thread session cache. # ───────────────────────────────────────────────────────────────────────────── # VIBEPROXY_DATA_DIR= + +# ── Internal service auth (management-plane service-to-service calls) ───────── +# Inline token for internal service authentication; prefer the _FILE variant in +# containerized deployments so the secret never lands in the environment table. +# OMNIROUTE_INTERNAL_SERVICE_TOKEN= +# Path to a file containing the internal service token (overrides the inline var). +# OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE= + +# ═══════════════════════════════════════════════════════════════════════════════ +# 26. RADAR FEED (SELF-HOSTING) +# ═══════════════════════════════════════════════════════════════════════════════ +# Optional add-on (feature flag RADAR_ENABLED, default off — see feature flag +# settings, not an env var) that overlays a signed, freshly-curated free-model +# catalog on top of the release baseline. All four variables below are optional +# and only needed to point the client at a self-hosted/forked feed or +# supporter-key flow instead of the default OmniRoute Radar service. Used by: +# src/lib/radar/sync.ts, src/lib/radar/pinnedKeys.ts, src/lib/radar/links.ts. + +# Base URL of the Radar feed service. Overrides the built-in default so forks +# and self-hosters can point at their own signed feed. +# RADAR_FEED_URL=https://radar.omniroute.online + +# Ed25519 public key (base64-DER SPKI or PEM) used to verify the feed +# signature, replacing the pinned default key. Required when self-hosting a +# feed signed with a different key pair. +# RADAR_FEED_PUBKEY= + +# URL the dashboard's "I'm a contributor" button opens (GitHub OAuth +# supporter-key claim flow). No pricing/value lives in this repo — only the +# link. +# RADAR_CONTRIBUTOR_CLAIM_URL=https://radar.omniroute.online/auth/github + +# URL the dashboard's "Support the project" button opens (payment/plans +# page). No pricing/value lives in this repo — only the link. +# RADAR_SUPPORTER_PLANS_URL=https://radar.omniroute.online/planos diff --git a/.eslintcache-probe b/.eslintcache-probe new file mode 100644 index 0000000000..9e65baabc5 --- /dev/null +++ b/.eslintcache-probe @@ -0,0 +1 @@ +[{"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/src/index.ts":"1","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/src/logger.ts":"2","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/src/naming.ts":"3","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/auth.test.ts":"4","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/auto-combo-context.test.ts":"5","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/auto-sync.test.ts":"6","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/combos.test.ts":"7","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/config-shim.test.ts":"8","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/disk-snapshot-perms.test.ts":"9","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/feature-defaults.test.ts":"10","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/features.test.ts":"11","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/fetch-interceptor.test.ts":"12","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/fork-features.test.ts":"13","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/gemini-sanitize.test.ts":"14","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/management-read-token.test.ts":"15","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/model-allowlist.test.ts":"16","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/multi-instance.test.ts":"17","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/options-schema.test.ts":"18","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/provider-id-routing.test.ts":"19","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/provider.test.ts":"20","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/scaffold.test.ts":"21","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/usable-combo.test.ts":"22","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tsup.config.ts":"23","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-provider/src/index.ts":"24","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-provider/tests/index.test.ts":"25","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-provider/tsup.config.ts":"26","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/docker/devin-bridge/mock-devin.mjs":"27","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/docker/devin-bridge/network-guard/policy.mjs":"28","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/docker/devin-bridge/network-guard/proxy.mjs":"29","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/docker/devin-bridge/run-contract.mjs":"30","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/eslint.complexity-ratchets.config.mjs":"31","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/eslint.complexity.config.mjs":"32","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/eslint.config.mjs":"33","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/eslint.sonarjs.config.mjs":"34","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/omniroute-cmd-hello/index.mjs":"35","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/plugins/langfuse/index.mjs":"36","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/plugins/request-logger/index.mjs":"37","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/plugins/theme-manager/index.mjs":"38","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/plugins/welcome-banner/index.mjs":"39","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/next.config.mjs":"40","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/agyModels.ts":"41","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/anthropicHeaders.ts":"42","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/antigravityModelAliases.ts":"43","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/antigravityUpstream.ts":"44","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/audioRegistry.ts":"45","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/azureAi.ts":"46","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/bedrock.ts":"47","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/claudeCodeCompatibleIdentity.ts":"48","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/claudeWebFingerprint.ts":"49","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/cliFingerprints.ts":"50","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/codexClient.ts":"51","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/codexIdentity.ts":"52","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/codexInstructions.ts":"53","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/codexQuotaScopes.ts":"54","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/constants.ts":"55","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/contextEditing.ts":"56","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/credentialLoader.ts":"57","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/datarobot.ts":"58","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/defaultThinkingSignature.ts":"59","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/embeddingRegistry.ts":"60","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/errorConfig.ts":"61","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/freeModelCatalog.data.ts":"62","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/freeModelCatalog.ts":"63","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/freeTierCatalog.ts":"64","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/glmProvider.ts":"65","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/grokBuild.ts":"66","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/imageRegistry.ts":"67","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/maritalk.ts":"68","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/mediaServiceKinds.ts":"69","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/moderationRegistry.ts":"70","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/musicRegistry.ts":"71","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/oci.ts":"72","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/ocrRegistry.ts":"73","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/ollamaModels.ts":"74","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerErrorRules.ts":"75","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerFieldStrips.ts":"76","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerHeaderProfiles.ts":"77","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerModels.ts":"78","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerPluginManifest.ts":"79","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerPluginManifestRegistry.ts":"80","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerPluginManifestUrl.ts":"81","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerRegistry.ts":"82","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/alternateFormats.ts":"83","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/index.ts":"84","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/adapta-web/index.ts":"85","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/agentrouter/index.ts":"86","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/agnes/index.ts":"87","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/agy/index.ts":"88","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ai21/index.ts":"89","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/aihorde/index.ts":"90","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/aimlapi/index.ts":"91","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ainative/index.ts":"92","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/aion/index.ts":"93","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/alibaba/cn/index.ts":"94","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/alibaba/index.ts":"95","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ant-ling/index.ts":"96","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/anthropic/index.ts":"97","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/antigravity/index.ts":"98","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/anyapi/index.ts":"99","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/api-airforce/index.ts":"100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/auggie/index.ts":"101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bai/index.ts":"102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/baichuan/index.ts":"103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/baidu/index.ts":"104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bailian-coding-plan/index.ts":"105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/baseten/index.ts":"106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bazaarlink/index.ts":"107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bedrock/index.ts":"108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/blackbox/index.ts":"109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/blackbox/web/index.ts":"110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bluesminds/index.ts":"111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/byteplus/index.ts":"112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bytez/index.ts":"113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cerebras/index.ts":"114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/charm-hyper/index.ts":"115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/chatgpt-web/index.ts":"116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cheaperinference/imageModels.ts":"117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cheaperinference/index.ts":"118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/chenzk/index.ts":"119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/chipotle/index.ts":"120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/chutes/index.ts":"121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/claude/index.ts":"122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/claude/web/index.ts":"123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cline/index.ts":"124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/clinepass/index.ts":"125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cloudflare-ai/index.ts":"126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/clova-studio/index.ts":"127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/codebuddy-cn/index.ts":"128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/codestral/index.ts":"129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/codex/index.ts":"130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cohere/index.ts":"131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/command-code/index.ts":"132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/copilot-m365-web/index.ts":"133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/copilot-web/index.ts":"134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/coze/index.ts":"135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/crof/index.ts":"136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cursor/index.ts":"137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/dahl/index.ts":"138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/databricks/index.ts":"139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/deepinfra/index.ts":"140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/deepseek/index.ts":"141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/deepseek/web/index.ts":"142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/devin/catalog.ts":"143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/devin-cli/index.ts":"144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/devin-cli-agentic/index.ts":"145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/dgrid/index.ts":"146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/dify/index.ts":"147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/digitalocean/index.ts":"148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/dit/index.ts":"149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/doubao/index.ts":"150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/doubao/web/index.ts":"151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/duckduckgo-web/index.ts":"152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/electronhub/index.ts":"153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/factory/index.ts":"154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/fastrouter/index.ts":"155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/featherless-ai/index.ts":"156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/felo-web/index.ts":"157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/fireworks/index.ts":"158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/freeaiapikey/index.ts":"159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/freemodel-dev/index.ts":"160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/freepik/index.ts":"161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/freetheai/index.ts":"162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/friendliai/index.ts":"163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-gemini/index.ts":"164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-groq/index.ts":"165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-nvidia/index.ts":"166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-ollama/index.ts":"167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-pollinations/index.ts":"168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/galadriel/index.ts":"169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gemini/imageModels.ts":"170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gemini/index.ts":"171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gemini/web/index.ts":"172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ghe-copilot/index.ts":"173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gigachat/index.ts":"174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/github/index.ts":"175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/github/models/index.ts":"176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/github/retiredModels.ts":"177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gitlab-duo/index.ts":"178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gitlawb/gmi/index.ts":"179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gitlawb/index.ts":"180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/glm/cn/index.ts":"181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/glm/index.ts":"182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/glm/t/index.ts":"183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/grok-cli/index.ts":"184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/grok-web/index.ts":"185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/groq/index.ts":"186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/hackclub/index.ts":"187","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/haiper/index.ts":"188","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/hcnsec/index.ts":"189","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/heroku/index.ts":"190","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/huggingchat/index.ts":"191","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/huggingface/index.ts":"192","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/hyperagent/index.ts":"193","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/hyperbolic/index.ts":"194","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ideogram/index.ts":"195","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/iflytek/index.ts":"196","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/inception/index.ts":"197","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/inference-net/index.ts":"198","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/inner-ai/index.ts":"199","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/internlm/index.ts":"200","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kenari/index.ts":"201","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kie/imageModels.ts":"202","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kie/index.ts":"203","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kie/models.ts":"204","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kilo-gateway/index.ts":"205","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kilocode/index.ts":"206","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/coding/index.ts":"207","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/coding/runtime.ts":"208","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/coding-apikey/index.ts":"209","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/index.ts":"210","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/web/index.ts":"211","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/web/runtime.ts":"212","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kiro/index.ts":"213","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/lambda-ai/index.ts":"214","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/leonardo/index.ts":"215","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/liquid/index.ts":"216","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/llamagate/index.ts":"217","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/llm-kiwi/index.ts":"218","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/llm7/index.ts":"219","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/llmgateway/index.ts":"220","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/lmarena/directModels.ts":"221","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/lmarena/index.ts":"222","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/longcat/index.ts":"223","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/maritalk/index.ts":"224","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/meta-llama/index.ts":"225","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/mimocode/index.ts":"226","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/minimax/cn/index.ts":"227","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/minimax/index.ts":"228","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/minimax/web/index.ts":"229","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/mistral/index.ts":"230","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/modal/index.ts":"231","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/modelscope/index.ts":"232","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/monsterapi/index.ts":"233","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/moonshot/index.ts":"234","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/morph/index.ts":"235","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/muse-spark-web/index.ts":"236","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nanogpt/index.ts":"237","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nara/index.ts":"238","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/navy/index.ts":"239","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nebius/index.ts":"240","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nlpcloud/index.ts":"241","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/notion-web/index.ts":"242","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nous-research/index.ts":"243","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/novita/index.ts":"244","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nscale/index.ts":"245","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nube/index.ts":"246","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nvidia/index.ts":"247","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ollama-cloud/index.ts":"248","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/openadapter/index.ts":"249","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/openai/index.ts":"250","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/opencode/go/index.ts":"251","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/opencode/index.ts":"252","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/opencode/zen/index.ts":"253","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/openrouter/index.ts":"254","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/openvecta/index.ts":"255","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/orcarouter/index.ts":"256","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ovhcloud/index.ts":"257","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/perplexity/index.ts":"258","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/perplexity/web/index.ts":"259","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/pioneer/index.ts":"260","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/plamo/index.ts":"261","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/poe/index.ts":"262","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/pollinations/index.ts":"263","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/predibase/index.ts":"264","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/promptql/index.ts":"265","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/publicai/index.ts":"266","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/puter/index.ts":"267","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qianfan/index.ts":"268","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qiniu/index.ts":"269","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qoder/index.ts":"270","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qwen/web/index.ts":"271","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qwen-cloud/index.ts":"272","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qwen-cloud-token-plan/index.ts":"273","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/raycast/index.ts":"274","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/regolo/index.ts":"275","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/reka/index.ts":"276","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/requesty/index.ts":"277","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/routeway/index.ts":"278","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sambanova/index.ts":"279","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sarvam/index.ts":"280","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/scaleway/index.ts":"281","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sealion/index.ts":"282","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/segmind/imageModels.ts":"283","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/segmind/videoModels.ts":"284","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sensenova/index.ts":"285","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/siliconflow/index.ts":"286","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/snowflake/index.ts":"287","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sparkdesk/index.ts":"288","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/stability-ai/imageModels.ts":"289","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/stepfun/index.ts":"290","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sumopod/index.ts":"291","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/suno/index.ts":"292","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/synthetic/index.ts":"293","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/t3-web/index.ts":"294","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/tencent/index.ts":"295","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/theoldllm/index.ts":"296","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/together/index.ts":"297","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/tokenrouter/index.ts":"298","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/trae/index.ts":"299","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/typhoon/index.ts":"300","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/udio/index.ts":"301","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/uncloseai/index.ts":"302","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/unorouter/index.ts":"303","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/upstage/index.ts":"304","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/v0-vercel/index.ts":"305","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/venice/index.ts":"306","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/veoaifree-web/index.ts":"307","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/vercel-ai-gateway/index.ts":"308","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/vertex/index.ts":"309","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/vertex/partner/index.ts":"310","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/volcengine/index.ts":"311","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/wafer/index.ts":"312","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/wandb/index.ts":"313","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/windsurf/index.ts":"314","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/writer/index.ts":"315","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/x5lab/index.ts":"316","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/xai/index.ts":"317","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/xai-oauth/index.ts":"318","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/xiaomi-mimo/index.ts":"319","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/xiaomi-mimo-token-plan/index.ts":"320","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/yi/index.ts":"321","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/yuanbao-web/index.ts":"322","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zai/index.ts":"323","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zai-web/index.ts":"324","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zed-hosted/index.ts":"325","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zenmux/index.ts":"326","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zenmux-free/index.ts":"327","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/shared.ts":"328","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/registryUtils.ts":"329","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/rerankRegistry.ts":"330","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/runway.ts":"331","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/sap.ts":"332","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/searchRegistry.ts":"333","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/toolCloaking.ts":"334","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/upscaleRegistry.ts":"335","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/videoRegistry.ts":"336","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/watsonx.ts":"337","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/adapta-web.ts":"338","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/adobe-firefly.ts":"339","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity/executeAttempt.ts":"340","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity/proFallbackChain.ts":"341","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity/sseCollect.ts":"342","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity/streamingPassthrough.ts":"343","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity.ts":"344","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravityUpstreamError.ts":"345","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/auggie.ts":"346","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/awsPollyTts.ts":"347","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/azure-openai.ts":"348","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/base/headers.ts":"349","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/base/reasoningEffort.ts":"350","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/base.ts":"351","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/bedrock.ts":"352","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/blackbox-web.ts":"353","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgpt-web/citations.ts":"354","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgpt-web/handoff.ts":"355","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgpt-web/models.ts":"356","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgpt-web.ts":"357","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgptWebErrors.ts":"358","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgptWebTools.ts":"359","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cheaperinference.ts":"360","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chipotle.ts":"361","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/browserTransport.ts":"362","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/payload.ts":"363","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/session.ts":"364","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/stream.ts":"365","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/transport.ts":"366","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web.ts":"367","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claudeIdentity.ts":"368","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cliproxyapi.ts":"369","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cloudflare-ai.ts":"370","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codebuddy-cn.ts":"371","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex/bodyTimeout.ts":"372","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex/quota.ts":"373","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex/reasoningSuffix.ts":"374","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex/tools.ts":"375","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex.ts":"376","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/commandCode.ts":"377","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/copilot-m365-connection.ts":"378","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/copilot-m365-frames.ts":"379","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/copilot-m365-web.ts":"380","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/copilot-web.ts":"381","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cursor/builtinToolBridge.ts":"382","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cursor/composer.ts":"383","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cursor/prompt.ts":"384","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cursor.ts":"385","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/dario.ts":"386","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/deepseek-web/stream-format.ts":"387","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/deepseek-web-done-terminator.ts":"388","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/deepseek-web-with-auto-refresh.ts":"389","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/deepseek-web.ts":"390","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/default/nvidiaConcurrencyGate.ts":"391","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/default/urlNormalizers.ts":"392","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/default/zaiFormatOverride.ts":"393","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/default.ts":"394","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-agentic/anthropicResponse.ts":"395","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-agentic/serializer.ts":"396","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-agentic/toolParser.ts":"397","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-agentic/types.ts":"398","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-cli-agentic.ts":"399","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-cli.ts":"400","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/doubao-web.ts":"401","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/duckduckgo-web/challenge.ts":"402","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/duckduckgo-web.ts":"403","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/edgeTts.ts":"404","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/felo-web.ts":"405","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/firecrawl-fetch.ts":"406","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/forceResponsesUpstream.ts":"407","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gemini-business.ts":"408","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gemini-web.ts":"409","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/ghe-copilot.ts":"410","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/github.ts":"411","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gitlab.ts":"412","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gitlabResponses.ts":"413","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/glm.ts":"414","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-cli.ts":"415","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web/native-tools.ts":"416","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web/text-cleanup.ts":"417","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web/tool-bridge.ts":"418","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web/types.ts":"419","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web.ts":"420","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gtts.ts":"421","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/hailuo-web.ts":"422","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/huggingchat/jsonlStream.ts":"423","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/huggingchat.ts":"424","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/hyperagent.ts":"425","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/index.ts":"426","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/inner-ai.ts":"427","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/jina-reader-fetch.ts":"428","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kie.ts":"429","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kimi-web.ts":"430","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kimi.ts":"431","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kimiToolNames.ts":"432","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kiro/eventstream.ts":"433","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kiro.ts":"434","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kiroThinking.ts":"435","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kiroToolCallValidation.ts":"436","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena/cookie.ts":"437","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena/models.ts":"438","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena/response.ts":"439","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena/stream.ts":"440","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena.ts":"441","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/microsoft-designer-web.ts":"442","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/mimocode.ts":"443","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/moonshot.ts":"444","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/muse-spark-web/response-parser.ts":"445","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/muse-spark-web.ts":"446","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/ninerouter.ts":"447","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/nlpcloud.ts":"448","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/notion-web.ts":"449","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/opencode.ts":"450","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/perplexity-web/protocol.ts":"451","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/perplexity-web.ts":"452","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/poe-web.ts":"453","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/pollinations.ts":"454","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/promptql/eventTree.ts":"455","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/promptql/messageText.ts":"456","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/promptql/threadSticky.ts":"457","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/promptql.ts":"458","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/puter.ts":"459","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/qoder.ts":"460","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/qwen-web.ts":"461","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/raycast.ts":"462","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/t3-chat-web.ts":"463","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/tavily-fetch.ts":"464","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/theoldllm.ts":"465","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/tinyfish-fetch.ts":"466","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/trae.ts":"467","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/v0-vercel-web.ts":"468","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/venice-web.ts":"469","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/veoaifree-web.ts":"470","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/vertex.ts":"471","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/vertexMedia.ts":"472","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/windsurf.ts":"473","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/xai.ts":"474","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/yuanbao-web.ts":"475","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/zai-web.ts":"476","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/zed-hosted.ts":"477","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/zenmux-free.ts":"478","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/audioSpeech.ts":"479","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/audioTranscription.ts":"480","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/audioTranslation.ts":"481","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/autoComboCandidates.ts":"482","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/agentRouterProtocol.ts":"483","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/attemptLogging.ts":"484","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/backgroundRedirect.ts":"485","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cacheUsageMeta.ts":"486","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cavemanOutputAnalytics.ts":"487","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/ccDiscoveryAliasStrip.ts":"488","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeClassifierCompat.ts":"489","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeEffortVariant.ts":"490","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeMessageTypes.ts":"491","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeSystemRole.ts":"492","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeToolDefaults.ts":"493","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeUpstreamMessages.ts":"494","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/clientUsageBuffer.ts":"495","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/clineResponseEnvelope.ts":"496","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cliproxyModelMapping.ts":"497","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cliproxyapiCredentials.ts":"498","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/codexFailover.ts":"499","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/codexQuota.ts":"500","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/comboContextCache.ts":"501","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionAnalyticsWrite.ts":"502","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionCacheStats.ts":"503","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionComboPredicates.ts":"504","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionSettings.ts":"505","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionUsageReceipt.ts":"506","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/contextEditingTelemetry.ts":"507","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/contextEstimation.ts":"508","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cooldownClassification.ts":"509","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/executionCredentials.ts":"510","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/executorClientHeaders.ts":"511","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/executorHelpers.ts":"512","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/executorProxy.ts":"513","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/failureUsage.ts":"514","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/gamificationEvent.ts":"515","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/headers.ts":"516","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/idempotency.ts":"517","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/jsonBodyToSse.ts":"518","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/keyHealth.ts":"519","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/logTruncation.ts":"520","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/memoryExtraction.ts":"521","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/memorySkillsInjection.ts":"522","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingJsonResponse.ts":"523","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingResponseBody.ts":"524","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingResponseHeaders.ts":"525","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingResponseParse.ts":"526","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingSse.ts":"527","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingUsageStats.ts":"528","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/outputStyleTelemetry.ts":"529","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/outputTokenBudget.ts":"530","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/passthroughHelpers.ts":"531","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/passthroughToolNames.ts":"532","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/pluginOnRequest.ts":"533","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/pluginOnResponse.ts":"534","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/postCallGuardrailContext.ts":"535","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/quotaShareConsumption.ts":"536","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/requestFormat.ts":"537","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/requestSetup.ts":"538","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/responseHeaders.ts":"539","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/sanitization.ts":"540","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/semanticCache.ts":"541","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/semanticCacheStore.ts":"542","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/serviceTier.ts":"543","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/skillsFormat.ts":"544","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/stageTrace.ts":"545","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamErrorResult.ts":"546","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamFinalize.ts":"547","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingCost.ts":"548","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingPipeline.ts":"549","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingQuotaShare.ts":"550","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingResponseHeaders.ts":"551","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingSemanticCacheStore.ts":"552","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingUsageStats.ts":"553","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/targetFormat.ts":"554","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/telemetryHelpers.ts":"555","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/thinkingSignatureRecovery.ts":"556","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/toolCallingRequiredCheck.ts":"557","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/unsupportedParamsStrip.ts":"558","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/upstreamBody.ts":"559","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/upstreamExecuteHeaders.ts":"560","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/upstreamTimeouts.ts":"561","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore.ts":"562","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/embeddingStructuredInput.ts":"563","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/embeddings.ts":"564","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/pollinationsAnonAuth.ts":"565","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/adobeFirefly.ts":"566","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/alibabaImage.ts":"567","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/chatgptWeb.ts":"568","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/comfyUI.ts":"569","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/designerWeb.ts":"570","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/freepik.ts":"571","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/googleImagen.ts":"572","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/haiper.ts":"573","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/huggingface.ts":"574","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/hyperbolic.ts":"575","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/ideogram.ts":"576","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/imagen3.ts":"577","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/leonardo.ts":"578","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/minimax.ts":"579","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/nvidiaNim.ts":"580","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/sdWebUI.ts":"581","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/segmind.ts":"582","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration.ts":"583","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale/adobeFirefly.ts":"584","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale/shared.ts":"585","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale/stability.ts":"586","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale/topaz.ts":"587","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale.ts":"588","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/moderations.ts":"589","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/musicGeneration.ts":"590","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/ocr.ts":"591","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/openrouterTranscription.ts":"592","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/rerank.ts":"593","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/responseSanitizer/reasoning.ts":"594","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/responseSanitizer.ts":"595","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/responseTranslator.ts":"596","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/responsesHandler.ts":"597","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/search/firecrawlSearch.ts":"598","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/search/perplexitySearch.ts":"599","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/search.ts":"600","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/sseParser/geminiResponse.ts":"601","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/sseParser.ts":"602","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/usageExtractor.ts":"603","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/adobeFireflyHandler.ts":"604","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/dashscopeHandler.ts":"605","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/deepinfraHandler.ts":"606","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/googleFlow.ts":"607","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/googleFlowHandler.ts":"608","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/leonardoHandler.ts":"609","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/novita.ts":"610","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/novitaHandler.ts":"611","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/providers/segmind.ts":"612","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/xaiGrokImagineHandler.ts":"613","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration.ts":"614","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/webFetch.ts":"615","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/index.ts":"616","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/lib/deepseek-pow-solver.cjs":"617","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/lib/deepseek-pow.ts":"618","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/a2aLifecycle.test.ts":"619","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/advancedTools.test.ts":"620","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/audit.test.ts":"621","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/cacheTools.test.ts":"622","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/createComboTool.test.ts":"623","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/dbHealthTool.test.ts":"624","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/essentialTools.test.ts":"625","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/glmCodingProviderConfig.test.ts":"626","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/httpAuthContext.test.ts":"627","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/pricingSync.test.ts":"628","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/routingStrategyTool.test.ts":"629","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/toolSearch.catalog.test.ts":"630","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/toolSearch.search.test.ts":"631","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/toolSearch.signature.test.ts":"632","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/toolSearch.tool.test.ts":"633","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/audit.ts":"634","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/catalog.ts":"635","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/descriptionCompressor.ts":"636","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/httpAuthContext.ts":"637","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/httpTransport.ts":"638","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/index.ts":"639","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/mcpCallerIdentity.ts":"640","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/runtimeHeartbeat.ts":"641","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/a2a.ts":"642","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/audit.ts":"643","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/ccrTools.ts":"644","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/index.ts":"645","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/pickFastestModel.ts":"646","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/toolDefinition.ts":"647","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/toolSearch.ts":"648","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/tools.ts":"649","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/scopeEnforcement.ts":"650","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/server.ts":"651","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolCardinality.ts":"652","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolCount.ts":"653","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/catalog.ts":"654","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/handler.ts":"655","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/index.ts":"656","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/register.ts":"657","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/search.ts":"658","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/signature.ts":"659","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/advancedTools.ts":"660","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/agentSkillTools.ts":"661","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/compressionTools.ts":"662","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/gamificationTools.ts":"663","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/githubSkillTools.ts":"664","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/localCorpusTools.ts":"665","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/memoryTools.ts":"666","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/notionTools.ts":"667","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/obsidianTools.ts":"668","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/pickFastestModel.ts":"669","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/pluginTools.ts":"670","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/poolTools.ts":"671","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/skillTools.ts":"672","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/antigravity-quota-family.test.ts":"673","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/chatgptTlsClient.test.ts":"674","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/claudeTlsClient.test.ts":"675","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/fail-fast-concurrency-gate.test.ts":"676","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/grokTlsClient.test.ts":"677","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/manifestAdapter.test.ts":"678","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/specificityDetector.test.ts":"679","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/tierResolver.test.ts":"680","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/volumeDetector.test.ts":"681","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback/cooldownCap.ts":"682","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback/exactModelLock.ts":"683","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback/lockoutEviction.ts":"684","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback/nonRetryableUpstream.ts":"685","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback.ts":"686","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountSelector.ts":"687","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountSemaphore.ts":"688","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/adaptation.ts":"689","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/config.ts":"690","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/controller.ts":"691","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/cost.ts":"692","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/index.ts":"693","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/queue.ts":"694","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/requestFeatures.ts":"695","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/runtime.ts":"696","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/types.ts":"697","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/adobeFireflyBrowserLogin.ts":"698","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/adobeFireflyClient.ts":"699","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/adobeFireflyModels.ts":"700","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/adobeFireflyUpscale.ts":"701","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/agentrouterQuotaFetcher.ts":"702","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravity429Engine.ts":"703","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityClientProfile.ts":"704","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityCredits.ts":"705","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityHeaderScrub.ts":"706","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityHeaders.ts":"707","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityIdentity.ts":"708","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityProjectBootstrap.ts":"709","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityProjectPersist.ts":"710","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityQuotaFamily.ts":"711","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityVersion.ts":"712","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/apiKeyRotator.ts":"713","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/autoCombo.test.ts":"714","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/chaosEngine.test.ts":"715","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/chaosVirtualCombo.test.ts":"716","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/providerDiversity.test.ts":"717","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/speedRanking.test.ts":"718","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/taskFitness-pattern-order-8603.test.ts":"719","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/autoPrefix.ts":"720","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/builtinCatalog.ts":"721","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/candidateOverrides.ts":"722","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/chaosEngine.ts":"723","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/complexityRouter.ts":"724","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/engine.ts":"725","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/index.ts":"726","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/modePacks.ts":"727","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/modelFamily.ts":"728","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/paidModelFilter.ts":"729","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/persistence.ts":"730","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/pipelineRouter.ts":"731","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/providerDiversity.ts":"732","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/providerRegistryAccessor.ts":"733","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/requestControls.ts":"734","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/resilienceCandidateFilter.ts":"735","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/routerStrategy.ts":"736","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/scoring.ts":"737","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/selfHealing.ts":"738","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/speedRanking.ts":"739","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/suffixComposition.ts":"740","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/taskFitness.ts":"741","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/virtualFactory.ts":"742","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoRefreshDaemon.ts":"743","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/backgroundTaskDetector.ts":"744","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/bailianQuotaFetcher.ts":"745","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/batchProcessor.ts":"746","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/bedrock.ts":"747","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/browserBackedChat.ts":"748","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/browserPool.ts":"749","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/ccBridgeTransforms.ts":"750","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/ccOpenAiMediaBlocks.ts":"751","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/ccWireImageBuiltins.ts":"752","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/chatgptImageCache.ts":"753","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/chatgptTlsClient.ts":"754","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeAdaptiveThinking.ts":"755","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeCCH.ts":"756","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeCompatible.ts":"757","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeCompatibleBeta.ts":"758","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeCompatibleThinkingDisplay.ts":"759","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeConstraints.ts":"760","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeExtraRemap.ts":"761","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeFingerprint.ts":"762","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeObfuscation.ts":"763","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeToolRemapper.ts":"764","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeHaikuConstraints.ts":"765","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeTlsClient.ts":"766","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeTurnstileSolver.ts":"767","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeUsageCooldown.ts":"768","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeWebAutoRefresh.ts":"769","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/clinepassModels.ts":"770","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/cloudCodeHeaders.ts":"771","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/cloudCodeThinking.ts":"772","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/codeAssistSubscription.ts":"773","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/codexQuotaFetcher.ts":"774","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/codexUsageQuotas.ts":"775","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/codexVerbosity.ts":"776","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/applyStrategyOrdering.ts":"777","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/autoConfig.ts":"778","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/autoStrategy.ts":"779","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboCompatFallback.ts":"780","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboCooldownRetry.ts":"781","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboData.ts":"782","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboPredicates.ts":"783","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboSetup.ts":"784","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboStructure.ts":"785","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboVisibility.ts":"786","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/concurrencyCaps.ts":"787","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/context.ts":"788","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/contextOverrideGate.ts":"789","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/contextRequirements.ts":"790","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/dispatchPrelude.ts":"791","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/failureTracker.ts":"792","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/fingerprintExpansion.ts":"793","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/fusionPanel.ts":"794","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/headroomRanking.ts":"795","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/knownContextOverflow.ts":"796","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/pinRecovery.ts":"797","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/promptCacheAffinity.ts":"798","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/providerWildcard.ts":"799","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaExhaustionCutoff.ts":"800","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaScoring.ts":"801","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaShareConcurrency.ts":"802","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaShareInflight.ts":"803","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaShareStrategy.ts":"804","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaStrategies.ts":"805","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/resolveAutoStrategy.ts":"806","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/responseValidation.ts":"807","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/rrState.ts":"808","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/runtimeUnitCapacity.ts":"809","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/runtimeUnits.ts":"810","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/sessionStickiness.ts":"811","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/shadowRouting.ts":"812","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/strategyDispatch.ts":"813","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/targetExhaustion.ts":"814","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/targetResolution.ts":"815","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/targetSorters.ts":"816","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/targetTimeoutRunner.ts":"817","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/types.ts":"818","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/unavailableRetryGate.ts":"819","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/validateQuality.ts":"820","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo.ts":"821","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/comboAgentMiddleware.ts":"822","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/comboConfig.ts":"823","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/comboManifestMetrics.ts":"824","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/comboMetrics.ts":"825","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/adaptiveCompression/computeTarget.ts":"826","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/adaptiveCompression/ladder.ts":"827","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/adaptiveCompression/resolveAdaptivePlan.ts":"828","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/adaptiveCompression/types.ts":"829","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/aggressive.ts":"830","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/bodyAdapter.ts":"831","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/cacheAwareConfig.ts":"832","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/cachingAware.ts":"833","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/caveman.ts":"834","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/cavemanRules.ts":"835","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/deriveDefaultPlan.ts":"836","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/diffHelper.ts":"837","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engineBreakdown.ts":"838","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engineCatalog.ts":"839","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/cavemanAdapter.ts":"840","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ccr/ccrQuery.ts":"841","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ccr/index.ts":"842","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ccr/protocolInstruction.ts":"843","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/codexResponses/index.ts":"844","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/encoderComparison.ts":"845","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/gcf/decode_generic.ts":"846","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/gcf/generic.ts":"847","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/gcf/index.ts":"848","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/gcf/scalar.ts":"849","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/index.ts":"850","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/smartcrusher.ts":"851","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/tabular.ts":"852","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/toon.ts":"853","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/index.ts":"854","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ionizer/index.ts":"855","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ionizer/sample.ts":"856","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llm/index.ts":"857","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/constants.ts":"858","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/index.ts":"859","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/modelStore.ts":"860","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/onnxWorker.ts":"861","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/ultraEntry.ts":"862","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/worker.ts":"863","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/mcpAccessibility/collapseRepeated.ts":"864","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/mcpAccessibility/constants.ts":"865","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/mcpAccessibility/index.ts":"866","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/omniglyphAdapter.ts":"867","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/omniglyphSingleMode.ts":"868","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/readLifecycle/index.ts":"869","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/registry.ts":"870","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/relevance/configSchema.ts":"871","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/relevance/index.ts":"872","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/relevance/scorer.ts":"873","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/codeStripper.ts":"874","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/commandDetector.ts":"875","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/configSchema.ts":"876","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/deduplicator.ts":"877","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/discover.ts":"878","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/filterLoader.ts":"879","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/filterSchema.ts":"880","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/grouper.ts":"881","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/index.ts":"882","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/learn.ts":"883","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/lineFilter.ts":"884","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/rawOutput.ts":"885","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/gitDiff.ts":"886","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/index.ts":"887","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/structuredTable.ts":"888","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/terraformPlan.ts":"889","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/testGreen.ts":"890","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/types.ts":"891","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/smartTruncate.ts":"892","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/splitCompositeCommand.ts":"893","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/tomlCompatibility.ts":"894","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/verify.ts":"895","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/session-dedup/fuzzy.ts":"896","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/session-dedup/index.ts":"897","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/types.ts":"898","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/entrypointWrap.ts":"899","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/aggregate.ts":"900","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/corpus.ts":"901","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/costMeter.ts":"902","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/executorModelClient.ts":"903","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/fidelityCheck.ts":"904","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/grader.ts":"905","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/judge.ts":"906","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/report.ts":"907","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/runner.ts":"908","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/savings.ts":"909","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/seedCorpus.ts":"910","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/types.ts":"911","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/exclusions.ts":"912","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/fidelityGate.ts":"913","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/fidelityGateStep.ts":"914","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/hardBudget.ts":"915","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/benchmark.ts":"916","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/budgetGate.ts":"917","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/index.ts":"918","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/measure.ts":"919","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/replay.ts":"920","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/runner.ts":"921","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/index.ts":"922","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/languageDetector.ts":"923","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/lite.ts":"924","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/liveZone.ts":"925","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/messageContent.ts":"926","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputMode.ts":"927","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputStyles/apply.ts":"928","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputStyles/backCompat.ts":"929","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputStyles/catalog.ts":"930","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputStyles/telemetry.ts":"931","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/pipelineEngineBreaker.ts":"932","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/pipelineGuards.ts":"933","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/planResolution.ts":"934","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/prefixFreeze.ts":"935","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/preservation.ts":"936","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/preserveSystemPromptMode.ts":"937","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/progressiveAging.ts":"938","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/index.ts":"939","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/quantumLock.ts":"940","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/quantumLockStep.ts":"941","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/quantumPatterns.ts":"942","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/strategyWrap.ts":"943","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/resolveCompressionPlan.ts":"944","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/resultMemo.ts":"945","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/index.ts":"946","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/riskGate.ts":"947","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/riskGateStep.ts":"948","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/riskPatterns.ts":"949","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/strategyWrap.ts":"950","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/ruleLoader.ts":"951","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/stackedStepCore.ts":"952","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/stats.ts":"953","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/stepDetailConfig.ts":"954","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/strategySelector.ts":"955","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/summarizer.ts":"956","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/toolResultCompressor.ts":"957","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/types.ts":"958","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/ultra.ts":"959","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/ultraHeuristic.ts":"960","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/validation.ts":"961","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/contextHandoff.ts":"962","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/contextManager.ts":"963","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/credentialGate.ts":"964","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/crofUsageFetcher.ts":"965","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/cursorSessionManager.ts":"966","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/deepseekQuotaFetcher.ts":"967","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/defaultReasoningEffort.ts":"968","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/deviceTracker.ts":"969","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/emergencyFallback.ts":"970","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/errorClassifier.ts":"971","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/evalRouting.ts":"972","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/firecrawlQuotaFetcher.ts":"973","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/freeModelQuotaFetcher.ts":"974","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/freeWebSearch.ts":"975","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/fusion.ts":"976","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/geminiRateLimitTracker.ts":"977","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/geminiThoughtSignatureStore.ts":"978","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/genericQuotaFetcher.ts":"979","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/gigachatAuth.ts":"980","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/githubCopilotModels.ts":"981","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/gpt5SamplingGuard.ts":"982","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokClearance.ts":"983","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokCliQuotaFetcher.ts":"984","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokCliQuotaFrame.ts":"985","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokQuotaFetcher.ts":"986","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokTlsClient.ts":"987","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/hfModelSuggestions.ts":"988","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/httpBackedChatFingerprint.ts":"989","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/hyperagentModels.ts":"990","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/inAppLoginService.ts":"991","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/intentClassifier.ts":"992","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/ipFilter.ts":"993","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/keyGroupAuth.ts":"994","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/kiroExternalIdp.ts":"995","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/kiroModels.ts":"996","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/kiroRegion.ts":"997","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/learnedThinkingCaps.ts":"998","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/lmarenaTlsClient.ts":"999","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/manifestAdapter.ts":"1000","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/mimoThinking.ts":"1001","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/model.ts":"1002","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelCapabilities.ts":"1003","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelDeprecation.ts":"1004","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelFamilyFallback.ts":"1005","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelStrip.ts":"1006","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelscopePolicy.ts":"1007","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/newApiAggregatorQuotaFetcher.ts":"1008","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionStreamParser.ts":"1009","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionThreadSessions.ts":"1010","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionTlsClient.ts":"1011","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionTranscriptBuilder.ts":"1012","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionWebFallbackModels.ts":"1013","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionWebModels.ts":"1014","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/opencodeOllamaUsage.ts":"1015","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/opencodeQuotaFetcher.ts":"1016","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/opencodeReasoningSanitizer.ts":"1017","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/openrouterFreeWindow.ts":"1018","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/openrouterQuotaFetcher.ts":"1019","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/payloadRules.ts":"1020","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/perplexityTlsClient.ts":"1021","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/pipeline.ts":"1022","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/promptql/jwt.ts":"1023","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/promptqlModels.ts":"1024","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/provider.ts":"1025","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/providerCooldownTracker.ts":"1026","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/providerCostData.ts":"1027","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/providerDefaultRateLimit.ts":"1028","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/providerRequestDefaults.ts":"1029","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/proxyAutoSelector.ts":"1030","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/qoderCli.ts":"1031","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/qoderCliResolve.ts":"1032","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaFetchThrottle.ts":"1033","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaMonitor.ts":"1034","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaPreflight.ts":"1035","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaResetParsing.ts":"1036","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaTextCooldowns.ts":"1037","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaTrackersBatch.ts":"1038","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/qwenThinking.ts":"1039","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rateLimitManager/admission.ts":"1040","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rateLimitManager/headers.ts":"1041","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rateLimitManager.ts":"1042","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rateLimitSemaphore.ts":"1043","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/raycast.ts":"1044","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/reasoningCache.ts":"1045","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/reasoningTokenBuffer.ts":"1046","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/refreshSerializer.ts":"1047","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/requestDedup.ts":"1048","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/responseModelEcho.ts":"1049","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/responsesInputSanitizer.ts":"1050","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/retryAfterJson.ts":"1051","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/roleNormalizer.ts":"1052","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rollingRpmGate.ts":"1053","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rotationConfig.ts":"1054","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/searchCache.ts":"1055","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionManager.ts":"1056","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/fingerprintRotator.ts":"1057","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/index.ts":"1058","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/poolRegistry.ts":"1059","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/session.ts":"1060","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/sessionFactory.ts":"1061","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/sessionPool.ts":"1062","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/types.ts":"1063","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/webExecutorWrapper.ts":"1064","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/signatureCache.ts":"1065","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/slidingWindowLimiter.ts":"1066","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/specificityDetector.ts":"1067","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/specificityRules.ts":"1068","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/specificityTypes.ts":"1069","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/streamRecovery.ts":"1070","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/systemPrompt.ts":"1071","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/systemTransforms.ts":"1072","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/targetRequestSanitizer.ts":"1073","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/taskAwareRouter.ts":"1074","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/taskAwareRouting.ts":"1075","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/thinkingBudget.ts":"1076","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tierConfig.ts":"1077","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tierResolver.ts":"1078","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tierTypes.ts":"1079","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tlsClientDownloadDir.ts":"1080","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tlsClientProxy.ts":"1081","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenExtractionConfig.ts":"1082","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenLimitCounter.ts":"1083","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/casGuard.ts":"1084","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/circuitBreaker.ts":"1085","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/claudeOAuth.ts":"1086","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/cline.ts":"1087","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/codebuddyCn.ts":"1088","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/codex.ts":"1089","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/copilot.ts":"1090","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/github.ts":"1091","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/gitlabDuo.ts":"1092","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/google.ts":"1093","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/kimiCoding.ts":"1094","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/kiro.ts":"1095","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/qoder.ts":"1096","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/windsurf.ts":"1097","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/rotationMap.ts":"1098","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/shared.ts":"1099","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh.ts":"1100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/toolLatencyTracker.ts":"1101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/toolLimitDetector.ts":"1102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/toolSchemaSanitizer.ts":"1103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/adobeFirefly.ts":"1104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/antigravity.ts":"1105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/antigravityWeeklyQuota.ts":"1106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/bailian.ts":"1107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/claude.ts":"1108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/codebuddy-cn.ts":"1109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/codex.ts":"1110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/crof.ts":"1111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/cursor.ts":"1112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/deepseek.ts":"1113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/firecrawl.ts":"1114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/github.ts":"1115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/glm.ts":"1116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/grokCli.ts":"1117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/hyperagent.ts":"1118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/kimi.ts":"1119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/kiro.ts":"1120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/minimax.ts":"1121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/nanogpt.ts":"1122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/opencode.ts":"1123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/openrouter.ts":"1124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/promptql.ts":"1125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/qoder.ts":"1126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/quota.ts":"1127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/scalars.ts":"1128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/vertex.ts":"1129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/xai.ts":"1130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/xaiOauth.ts":"1131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/xiaomi-mimo.ts":"1132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage.ts":"1133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/v0QuotaFetcher.ts":"1134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/volumeDetector.ts":"1135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/wafRateLimit.ts":"1136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/webFetchInterception.ts":"1137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/webSearchFallback.ts":"1138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/webSearchRouting.ts":"1139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/webSessionPoolHealth.ts":"1140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/wildcardRouter.ts":"1141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/workflowFSM.ts":"1142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/xaiOauthQuotaFetcher.ts":"1143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/shared/zedAuth.ts":"1144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/transformer/responsesTransformer.ts":"1145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/bootstrap.ts":"1146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/deepseekWebTools.ts":"1147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/formats.ts":"1148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/__tests__/maxTokensHelper.test.ts":"1149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/__tests__/schemaCoercion.test.ts":"1150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/claudeHelper.ts":"1151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/geminiHelper.ts":"1152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/geminiToolsSanitizer.ts":"1153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/jsonUtil.ts":"1154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/maxTokensHelper.ts":"1155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/openaiHelper.ts":"1156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/responsesApiHelper.ts":"1157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/schemaCoercion.ts":"1158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/strictSystemHoist.ts":"1159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/toolCallHelper.ts":"1160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/toolCallShim.ts":"1161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/image/sizeMapper.ts":"1162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/index.ts":"1163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/paramSupport.ts":"1164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/registry.ts":"1165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/antigravity-to-openai.ts":"1166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/claude-to-gemini.ts":"1167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/claude-to-openai.ts":"1168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/gemini-to-openai.ts":"1169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses/additionalTools.ts":"1170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses/helpers.ts":"1171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses/namespaceFlatten.ts":"1172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses/toResponses.ts":"1173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses.ts":"1174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-claude/sanitizeToolResultId.ts":"1175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-claude/thinkingBudget.ts":"1176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-claude/toolResultAdjacency.ts":"1177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-claude.ts":"1178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-cursor.ts":"1179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-gemini/helpers.ts":"1180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-gemini.ts":"1181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-kiro/adaptiveThinking.ts":"1182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-kiro/messageHelpers.ts":"1183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-kiro.ts":"1184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/claude-to-openai.ts":"1185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/cursor-to-openai.ts":"1186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/gemini-to-claude.ts":"1187","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/gemini-to-openai.ts":"1188","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/kiro-to-openai.ts":"1189","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/eventEmitter.ts":"1190","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/pureHelpers.ts":"1191","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/requestToolIdentity.ts":"1192","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/synthesizeCompletedToolCalls.ts":"1193","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/toolSchemas.ts":"1194","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses.ts":"1195","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-to-antigravity.ts":"1196","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-to-claude.ts":"1197","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-to-gemini-sse.ts":"1198","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-to-gemini.ts":"1199","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/responsesToolItem.ts":"1200","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/webTools.ts":"1201","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/types.d.ts":"1202","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/agentGoalPolicy.ts":"1203","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/aiSdkCompat.ts":"1204","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/anthropicHost.ts":"1205","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/audioResponse.ts":"1206","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/awsSigV4.ts":"1207","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/bypassHandler.ts":"1208","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/bypassResponse.ts":"1209","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cacheControlPolicy.ts":"1210","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/ccDiscoveryAliases.ts":"1211","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/claudeCodeMetaRequests.ts":"1212","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/claudeEffortVariants.ts":"1213","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/clinepassEnvelope.ts":"1214","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/comfyuiClient.ts":"1215","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/composerToolCalls.ts":"1216","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cors.ts":"1217","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorAgentCliVersion.ts":"1218","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorAgentProtobuf/nativeTodoWrite.ts":"1219","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorAgentProtobuf/wire.ts":"1220","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorAgentProtobuf.ts":"1221","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorChecksum.ts":"1222","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorImages.ts":"1223","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorVersionDetector.ts":"1224","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/diagnostics.ts":"1225","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/earlyStreamKeepalive.ts":"1226","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/error.ts":"1227","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/estimateSize.ts":"1228","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/finishReason.ts":"1229","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/flattenToolHistory.ts":"1230","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/functionalGatewayMirrors.ts":"1231","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/headers.ts":"1232","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/heapPressure.ts":"1233","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/jsonSize.ts":"1234","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/jsonToSse.ts":"1235","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/keepaliveThreshold.ts":"1236","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/kieTask.ts":"1237","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/kimiDevice.ts":"1238","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/kiroSanitizer.ts":"1239","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/logger.ts":"1240","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/networkProxy.ts":"1241","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/nextAuthCookie.ts":"1242","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/noThinkingAlias.ts":"1243","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/number.ts":"1244","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/ollamaTransform.ts":"1245","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/openAIStreamChunk.ts":"1246","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/opencodeHeaders.ts":"1247","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/passthroughTailProcessor.ts":"1248","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/progressTracker.ts":"1249","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/providerRequestLogging.ts":"1250","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyDispatcher.ts":"1251","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyDispatcherCache.ts":"1252","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyFallback.ts":"1253","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyFamily.ts":"1254","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyFamilyResolve.ts":"1255","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyFetch.ts":"1256","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/publicCreds.ts":"1257","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/reasoningContentInjector.ts":"1258","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/reasoningFields.ts":"1259","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/reasoningPlaceholder.ts":"1260","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/registeredEffortVariants.ts":"1261","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/requestLogger.ts":"1262","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/resourcePressure.ts":"1263","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/resourcePressurePolicy.ts":"1264","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/resourcePressureSampler.ts":"1265","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesCommentaryDrop.ts":"1266","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesEndpoint.ts":"1267","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesInputNormalization.ts":"1268","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesStatePolicy.ts":"1269","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesStreamHelpers.ts":"1270","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/segmindClient.ts":"1271","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/setupPolyfill.ts":"1272","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/sha3-512.ts":"1273","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/sleep.ts":"1274","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/socksConnectorWithFamily.ts":"1275","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/sseHeartbeat.ts":"1276","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/stream.ts":"1277","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamErrorFormat.ts":"1278","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamFailureFinalization.ts":"1279","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamHandler.ts":"1280","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamHelpers.ts":"1281","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamPayloadCollector.ts":"1282","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamReadiness.ts":"1283","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamReadinessPolicy.ts":"1284","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/syncedEffortVariants.ts":"1285","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/textualToolCall.ts":"1286","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/thinkCloseMarker.ts":"1287","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/thinkTagParser.ts":"1288","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/tlsClient.ts":"1289","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/toolCallArguments.ts":"1290","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/toolSources.ts":"1291","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/upstreamErrorPassthrough.ts":"1292","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/upstreamResponseHeaders.ts":"1293","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/urlSanitize.ts":"1294","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/usageTracking.ts":"1295","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/playwright.config.ts":"1296","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/postcss.config.mjs":"1297","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/prettier.config.mjs":"1298","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/public/sw.js":"1299","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/source.config.ts":"1300","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/BootstrapBanner.tsx":"1301","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/HomePageClient.tsx":"1302","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/HomeProviderTopologySection.tsx":"1303","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/KimiSponsorBanner.tsx":"1304","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/TierCoverageWidget.tsx":"1305","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/a2a/page.tsx":"1306","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/acp-agents/page.tsx":"1307","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/ActivityFeedClient.tsx":"1308","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/components/ActivityFeed.tsx":"1309","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/components/ActivityItem.tsx":"1310","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/components/DayHeader.tsx":"1311","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/components/EventTypeFilter.tsx":"1312","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/page.tsx":"1313","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/AgentSkillsPageClient.tsx":"1314","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/components/CoverageBar.tsx":"1315","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/components/McpA2aLinksBar.tsx":"1316","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/components/SkillCard.tsx":"1317","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/components/SkillPreviewPane.tsx":"1318","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/page.tsx":"1319","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/AutoRoutingAnalyticsTab.tsx":"1320","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/CacheHealthTab.tsx":"1321","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/ComboHealthTab.tsx":"1322","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/CompressionAnalyticsTab.tsx":"1323","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/ProviderUtilizationTab.tsx":"1324","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/RouteExplainabilityTab.tsx":"1325","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/SearchAnalyticsTab.tsx":"1326","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/combo-health/page.tsx":"1327","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/components/DiversityScoreCard.tsx":"1328","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/components/ProviderCharts.tsx":"1329","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/compression/page.tsx":"1330","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/evals/page.tsx":"1331","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/loading.tsx":"1332","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/page.tsx":"1333","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/search/page.tsx":"1334","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/utilization/page.tsx":"1335","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-endpoints/page.tsx":"1336","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/ApiManagerPageClient.tsx":"1337","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/apiManagerPageStorage.ts":"1338","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/apiManagerPageUtils.ts":"1339","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/apiManagerScopes.ts":"1340","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/ApiKeyFilterBar.tsx":"1341","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/ApiKeyFilterChip.tsx":"1342","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/BypassProviderQuotaToggle.tsx":"1343","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/ChaosModeAccessToggle.tsx":"1344","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/UsageLimitSettings.tsx":"1345","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/page.tsx":"1346","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/A2aAuditTab.tsx":"1347","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/ComplianceTab.tsx":"1348","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/McpAuditTab.tsx":"1349","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/a2a/page.tsx":"1350","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/mcp/page.tsx":"1351","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/page.tsx":"1352","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/auto-combo/page.tsx":"1353","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/BatchDetailModal.tsx":"1354","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/BatchListTab.tsx":"1355","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/FileDetailModal.tsx":"1356","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/FilesListTab.tsx":"1357","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/batch-utils.ts":"1358","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/BatchConceptCard.tsx":"1359","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/ExpirationBadge.tsx":"1360","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/FilesConceptCard.tsx":"1361","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/NewBatchWizard.tsx":"1362","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/ProgressBarBicolor.tsx":"1363","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/UploadFileModal.tsx":"1364","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/useBatchActions.ts":"1365","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/CostEstimateStep.tsx":"1366","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/CsvMappingStep.tsx":"1367","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/DestinationStep.tsx":"1368","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/InputStep.tsx":"1369","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/JsonlValidationStep.tsx":"1370","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/files/page.tsx":"1371","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/page.tsx":"1372","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/CachePage.test.tsx":"1373","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/CachePerformance.test.tsx":"1374","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/CacheTrends.test.tsx":"1375","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/IdempotencyLayer.test.tsx":"1376","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/MemoryCards.test.tsx":"1377","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/CacheEntriesTab.tsx":"1378","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/CachePerformance.tsx":"1379","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/CacheTrends.tsx":"1380","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/IdempotencyLayer.tsx":"1381","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/MemoryCards.tsx":"1382","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/ReasoningCacheTab.tsx":"1383","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/media/MediaPageClient.tsx":"1384","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/media/mediaProviderModels.ts":"1385","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/media/page.tsx":"1386","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/page.tsx":"1387","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/changelog/components/ChangelogViewer.tsx":"1388","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/changelog/components/NewsViewer.tsx":"1389","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/changelog/page.tsx":"1390","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/ChaosConfigPageClient.tsx":"1391","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/chaosPageTypes.ts":"1392","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosBasicSettingsFields.tsx":"1393","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosConfigActionsBar.tsx":"1394","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosModeSelector.tsx":"1395","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosProviderOverridesPanel.tsx":"1396","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosStatusMessage.tsx":"1397","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosTestResultsPanel.tsx":"1398","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/page.tsx":"1399","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/useChaosConfigData.ts":"1400","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/useChaosConfigPage.ts":"1401","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/useChaosConfigPersistence.ts":"1402","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/useChaosTestRun.ts":"1403","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx":"1404","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-agents/[id]/page.tsx":"1405","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-agents/page.tsx":"1406","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/CliCodePageClient.tsx":"1407","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/[id]/page.tsx":"1408","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/AntigravityToolCard.tsx":"1409","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClaudeCcDiscoveryInfoButton.tsx":"1410","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClaudeClassifierCompatToggle.tsx":"1411","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClaudeGatewayOnboardingBlock.tsx":"1412","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClaudeToolCard.tsx":"1413","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CliProfileAutoSyncToggles.tsx":"1414","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CliStatusBadge.tsx":"1415","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClineToolCard.tsx":"1416","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CliproxyapiToolCard.tsx":"1417","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CodexToolCard.tsx":"1418","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CopilotToolCard.tsx":"1419","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CustomCliCard.tsx":"1420","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/DefaultToolCard.tsx":"1421","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/DroidToolCard.tsx":"1422","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/HermesAgentToolCard.tsx":"1423","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/KiloToolCard.tsx":"1424","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/OpenClawToolCard.tsx":"1425","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ToolDetailClient.tsx":"1426","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/codexButtonState.ts":"1427","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/codexToolOptions.ts":"1428","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/customCliConfig.ts":"1429","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/index.tsx":"1430","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/page.tsx":"1431","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cloud-agents/page.tsx":"1432","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/AutoComboCatalog.tsx":"1433","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/BuilderIntelligentStep.tsx":"1434","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/ComboControlCenterClient.tsx":"1435","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/FieldLabelWithHelp.tsx":"1436","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/IntelligentComboPanel.tsx":"1437","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/KimiComboPresetCard.tsx":"1438","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/ReasoningTokenBufferToggle.tsx":"1439","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/ResponseValidationEditor.tsx":"1440","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/WeightTotalBar.tsx":"1441","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/[id]/page.tsx":"1442","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/error.tsx":"1443","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/kimiComboPreset.ts":"1444","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/ComboLiveStudio.tsx":"1445","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/comboFlowModel.ts":"1446","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/fleetAggregation.ts":"1447","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/nodes/ProviderCascadeNode.tsx":"1448","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/nodes/RequestNode.tsx":"1449","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/nodes/ResponseNode.tsx":"1450","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/nodes/StrategyNode.tsx":"1451","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/page.tsx":"1452","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/loading.tsx":"1453","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/page.tsx":"1454","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/parts.ts":"1455","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/playground/ComboPlaygroundClient.tsx":"1456","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/playground/page.tsx":"1457","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/useComboProxyAssignments.ts":"1458","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/components/BadgeToast.tsx":"1459","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/exclusions/ExclusionsPanel.tsx":"1460","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/exclusions/page.tsx":"1461","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/live/page.tsx":"1462","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/page.tsx":"1463","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/CompareView.tsx":"1464","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/CompressionAnnotation.tsx":"1465","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/CompressionCockpit.tsx":"1466","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/DiffPane.tsx":"1467","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/EncoderComparisonTable.tsx":"1468","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/PlayView.tsx":"1469","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/PlaygroundInput.tsx":"1470","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/QuantumLockBadge.tsx":"1471","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/RiskGateBadge.tsx":"1472","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/SaliencyHeatmap.tsx":"1473","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/WaterfallInspector.tsx":"1474","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/compressionFlowModel.ts":"1475","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/nodes/EngineNode.tsx":"1476","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/nodes/IoNode.tsx":"1477","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/page.tsx":"1478","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/useCompressionReplay.ts":"1479","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/CompressionStylesTile.tsx":"1480","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/aggressive/page.tsx":"1481","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/caveman/CavemanContextPageClient.tsx":"1482","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/caveman/page.tsx":"1483","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/ccr/page.tsx":"1484","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/combos/CompressionCombosPageClient.tsx":"1485","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/combos/CompressionHub.tsx":"1486","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/combos/page.tsx":"1487","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/headroom/page.tsx":"1488","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/lite/page.tsx":"1489","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/llmlingua/page.tsx":"1490","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/omniglyph/OmniglyphContextPageClient.tsx":"1491","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/omniglyph/page.tsx":"1492","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/omniglyph/sampleData.ts":"1493","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/page.tsx":"1494","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/rtk/RtkContextPageClient.tsx":"1495","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/rtk/RtkLearnDiscoverCard.tsx":"1496","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/rtk/RtkTomlImportCard.tsx":"1497","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/rtk/page.tsx":"1498","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/session-dedup/page.tsx":"1499","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/settings/CompressionPanel.tsx":"1500","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/settings/EngineGuidanceDetail.tsx":"1501","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/settings/adaptiveTargetLabel.ts":"1502","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/settings/page.tsx":"1503","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/ultra/page.tsx":"1504","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/CostOverviewTab.tsx":"1505","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/budget/page.tsx":"1506","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/components/ApiKeyUsageLimitCard.tsx":"1507","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/components/CostCharts.tsx":"1508","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/components/MetricCard.tsx":"1509","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/components/TopListCard.tsx":"1510","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/costExplorerParams.ts":"1511","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/costExplorerUtils.ts":"1512","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/page.tsx":"1513","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/pricing/page.tsx":"1514","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/QuotaSharePageClient.tsx":"1515","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/AccountQuotaRow.tsx":"1516","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/AllocationTable.tsx":"1517","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/BurnRateChart.tsx":"1518","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/BurnRateChartInner.tsx":"1519","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/CreatePoolModal.tsx":"1520","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/DimensionBar.tsx":"1521","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/PoolCard.tsx":"1522","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/PoolWizard.tsx":"1523","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx":"1524","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaEndpointsCard.tsx":"1525","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/StackedAllocationBar.tsx":"1526","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/UsageLogCard.tsx":"1527","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/hooks/useLocalStoragePoolMigration.ts":"1528","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/hooks/usePoolUsage.ts":"1529","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/hooks/usePools.ts":"1530","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/hooks/usePoolsUsageAggregate.ts":"1531","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/page.tsx":"1532","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/useApiKeyUsageLimits.ts":"1533","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/discovery/DiscoveryPageClient.tsx":"1534","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/discovery/__tests__/DiscoveryPageClient.test.tsx":"1535","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/discovery/page.tsx":"1536","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/ApiEndpointsTab.tsx":"1537","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx":"1538","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/VscodeTokenAliasCard.tsx":"1539","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/__tests__/ApiEndpointsTab.test.tsx":"1540","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/__tests__/EndpointPageClient.test.tsx":"1541","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/components/A2ADashboard.tsx":"1542","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/components/MCPDashboard.tsx":"1543","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/components/NotionSourceCard.tsx":"1544","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/components/ObsidianSourceCard.tsx":"1545","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/page.tsx":"1546","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/free-provider-rankings/page.tsx":"1547","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/free-tiers/page.tsx":"1548","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/gamification/admin/page.tsx":"1549","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/health/ProviderHealthAutopilotCard.tsx":"1550","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/health/ProviderHealthMatrixCard.tsx":"1551","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/health/TelemetryCard.tsx":"1552","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/health/page.tsx":"1553","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/homeAppearance.ts":"1554","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/kimiSponsorBannerGate.ts":"1555","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/leaderboard/page.tsx":"1556","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/limits/page.tsx":"1557","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/CompressionLogTab.tsx":"1558","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/activity/page.tsx":"1559","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/console/page.tsx":"1560","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/page.tsx":"1561","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/proxy/page.tsx":"1562","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/timeline/page.tsx":"1563","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/mcp/page.tsx":"1564","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/MediaProviderPageClient.tsx":"1565","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.tsx":"1566","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/[kind]/page.tsx":"1567","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/EmbeddingExampleCard.tsx":"1568","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/ImageExampleCard.tsx":"1569","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/LlmChatCard.tsx":"1570","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/MediaProviderHeader.tsx":"1571","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/MediaProviderKindNav.tsx":"1572","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/MusicExampleCard.tsx":"1573","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/OcrExampleCard.tsx":"1574","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/PlaygroundCard.tsx":"1575","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/ServiceKindTabs.tsx":"1576","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/SttExampleCard.tsx":"1577","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/TtsExampleCard.tsx":"1578","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/VideoExampleCard.tsx":"1579","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/WebFetchExampleCard.tsx":"1580","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/WebSearchExampleCard.tsx":"1581","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/mediaKinds.ts":"1582","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/page.tsx":"1583","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/EditMemoryModal.tsx":"1584","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/EmbeddingSourceSelector.tsx":"1585","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/MemoryConceptCard.tsx":"1586","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/MemoryEngineStatus.tsx":"1587","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/QdrantConfigCard.tsx":"1588","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/RerankConfigCard.tsx":"1589","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/RetrievePreview.tsx":"1590","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/tabs/EngineTab.tsx":"1591","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/tabs/MemoriesTab.tsx":"1592","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/tabs/PlaygroundTab.tsx":"1593","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/hooks/useEngineStatus.ts":"1594","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/hooks/useMemorySettings.ts":"1595","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/page.tsx":"1596","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/OmniSkillsPageClient.tsx":"1597","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniExecutionsTab.tsx":"1598","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniMarketplaceTab.tsx":"1599","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniSandboxTab.tsx":"1600","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniSkillCard.tsx":"1601","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniSkillsList.tsx":"1602","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/SkillInspectorPane.tsx":"1603","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/page.tsx":"1604","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/onboarding/components/TierFlowDiagram.tsx":"1605","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/onboarding/page.tsx":"1606","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/onboarding/steps/TierTour.tsx":"1607","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/page.tsx":"1608","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/PlaygroundStudio.tsx":"1609","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/CompareColumn.tsx":"1610","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ExportCodeModal.tsx":"1611","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ImprovePromptButton.tsx":"1612","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/MarkdownMessage.tsx":"1613","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ParamSliders.tsx":"1614","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/PresetPicker.tsx":"1615","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ProviderMetrics.tsx":"1616","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ReasoningControls.tsx":"1617","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/StructuredOutputEditor.tsx":"1618","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/StudioConfigPane.tsx":"1619","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/StudioTopBar.tsx":"1620","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/TokenCostCounter.tsx":"1621","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ToolsBuilder.tsx":"1622","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/modelSelection.ts":"1623","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/reasoningControlUtils.ts":"1624","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/ApiTab.tsx":"1625","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/BuildTab.tsx":"1626","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/ChatTab.tsx":"1627","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/CompareTab.tsx":"1628","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/build/BuildWizard.tsx":"1629","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/useImprovePrompt.ts":"1630","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/usePresets.ts":"1631","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/useStreamMetrics.ts":"1632","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/useStructuredOutput.ts":"1633","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/useToolsBuilder.ts":"1634","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/page.tsx":"1635","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/plugins/[name]/config/page.tsx":"1636","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/plugins/page.tsx":"1637","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/profile/page.tsx":"1638","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/provider-stats/page.tsx":"1639","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/ProviderDetailPageClient.tsx":"1640","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/ProviderDetailPageClient.test.tsx":"1641","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/connectionRowAutoSyncToggle.test.tsx":"1642","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/modelVisibilityToolbarActiveCount.test.tsx":"1643","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/passthroughModelRowDisplayName.test.tsx":"1644","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/passthroughTestHelpers.test.tsx":"1645","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/phase1e.test.tsx":"1646","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/phase1f.test.tsx":"1647","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/providerModelsSectionVisibilityKey.test.tsx":"1648","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/useConnectionAutoSync.test.tsx":"1649","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/useModelImportHandlers.test.tsx":"1650","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/useModelVisibilityHandlers.test.tsx":"1651","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/codexPlanLabel.ts":"1652","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/AdaptaTutorialModal.tsx":"1653","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/BatchTestResultsModal.tsx":"1654","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/CompatibleModelsSection.tsx":"1655","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/CompatibleNodeCard.tsx":"1656","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionRow.tsx":"1657","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionsHeaderToolbar.tsx":"1658","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionsListPanel.tsx":"1659","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/CoolingConnectionsPanel.tsx":"1660","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/CustomModelsSection.tsx":"1661","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/EmptyConnectionsPlaceholder.tsx":"1662","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ExternalLinkModal.tsx":"1663","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ImportProgressModal.tsx":"1664","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/KimiCodeAuthMethodModal.tsx":"1665","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ModelCompatPopover.tsx":"1666","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ModelRow.tsx":"1667","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/NoAuthProviderControls.tsx":"1668","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/OpenRouterPresetInput.tsx":"1669","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/PassthroughModelRow.tsx":"1670","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/PassthroughModelsSection.tsx":"1671","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderCcAliasSection.tsx":"1672","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderExtraPanels.tsx":"1673","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderInterceptionSection.tsx":"1674","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderModalsPanel.tsx":"1675","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderModelsSection.tsx":"1676","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderPageHeader.tsx":"1677","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderParamFilterSection.tsx":"1678","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderPlaygroundPanel.tsx":"1679","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderQuotaVisibilityToggle.tsx":"1680","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/SearchProviderCard.tsx":"1681","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/SiliconFlowEndpointModal.tsx":"1682","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/UpstreamProxyCard.tsx":"1683","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/WebSessionCredentialGuide.tsx":"1684","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ZedImportCard.tsx":"1685","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/__tests__/phase1d.test.tsx":"1686","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/connectionRowHelpers.ts":"1687","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AddApiKeyModal.tsx":"1688","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AgentrouterConsoleFields.tsx":"1689","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AlibabaProviderRegionField.tsx":"1690","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/CcCompatibleRequestDefaultsFields.tsx":"1691","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/EditCompatibleNodeModal.tsx":"1692","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/EditConnectionModal.tsx":"1693","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/GlmTeamQuotaFields.tsx":"1694","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ImportClaudeAuthModal.tsx":"1695","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ImportCodexAuthModal.tsx":"1696","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ImportGrokCliAuthModal.tsx":"1697","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/NewApiAggregatorFields.tsx":"1698","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ProviderTierField.tsx":"1699","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/QuotaScrapingFields.tsx":"1700","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/__tests__/authImportModals.test.tsx":"1701","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/__tests__/connModals.test.tsx":"1702","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/__tests__/editCompatibleNodeModal.test.tsx":"1703","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ccCompatibleRequestDefaults.ts":"1704","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/commandCodeAuthPhase.ts":"1705","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/computeConnectionDefaultName.ts":"1706","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/connectionProviderSpecificData.ts":"1707","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/glmTeamQuotaProviderData.ts":"1708","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/m365Tier.ts":"1709","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/providerTierFieldApi.ts":"1710","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/passthroughAlias.ts":"1711","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/connectionsSearchFilter.ts":"1712","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/modelImportWarning.ts":"1713","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useApiKeySave.ts":"1714","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useAuthFileHandlers.ts":"1715","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useCommandCodeAuth.ts":"1716","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useConnectionAutoSync.ts":"1717","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useConnectionDeleteConfirm.ts":"1718","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useConnectionGate.ts":"1719","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useExternalLinkFlow.ts":"1720","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useModelCompatState.ts":"1721","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useModelImportHandlers.ts":"1722","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useModelVisibilityHandlers.ts":"1723","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderConnections.ts":"1724","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderModels.ts":"1725","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderNodeActions.ts":"1726","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderQuotaVisibility.ts":"1727","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderSettings.ts":"1728","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useReorderByAvailability.ts":"1729","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/page.tsx":"1730","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/providerCredentialText.ts":"1731","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/providerDetailConstants.ts":"1732","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/providerInputParsers.ts":"1733","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/providerPageHelpers.ts":"1734","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/webSessionCredentials.ts":"1735","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/AddCompatibleProviderModal.tsx":"1736","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/CategoryDot.tsx":"1737","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/CodexCliGuideModal.tsx":"1738","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/HighlightableProviderCard.tsx":"1739","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ImportProvidersFromFileModal.tsx":"1740","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/NoAuthProvidersSection.tsx":"1741","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ProviderCard.tsx":"1742","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ProviderCountBadge.tsx":"1743","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ProviderDisplayModeControl.tsx":"1744","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ProviderSummaryCard.tsx":"1745","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/RiskNoticeModal.tsx":"1746","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/__tests__/providerCardAudioBadge.test.tsx":"1747","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/onboarding/ProviderOnboardingWizard.tsx":"1748","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/onboarding/providerOnboardingApi.ts":"1749","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/onboarding/providerOnboardingCatalog.ts":"1750","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/onboarding/providerOnboardingHref.ts":"1751","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/parseProviderImportFile.ts":"1752","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/useImportProvidersFromFile.ts":"1753","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/context/openRouterProviderStatsContext.tsx":"1754","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/error.tsx":"1755","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/featuredProviders.ts":"1756","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useApiKey.ts":"1757","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useProviderModels.ts":"1758","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useProviderUrlFilters.ts":"1759","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useRiskAcknowledged.ts":"1760","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useSyncedModelsByProvider.ts":"1761","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/loading.tsx":"1762","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/new/page.tsx":"1763","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/page.tsx":"1764","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/providerCompactMode.ts":"1765","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/providerPageHighlightUtils.ts":"1766","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/providerPageStorage.ts":"1767","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/providerPageUtils.ts":"1768","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/[name]/embed/[[...path]]/route.ts":"1769","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/ApiKeyField.tsx":"1770","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/AutoRestartAdoptedToggle.tsx":"1771","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/AutoStartToggle.tsx":"1772","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/CliproxyConnectionPanel.tsx":"1773","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/CliproxyModelMappingEditor.tsx":"1774","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/CliproxyProviderExposureCard.tsx":"1775","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/DarioAccountPanel.tsx":"1776","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/NinerouterEmbedFrame.tsx":"1777","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/NinerouterInstallWizard.tsx":"1778","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/NinerouterModelList.tsx":"1779","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/NinerouterProviderExposureCard.tsx":"1780","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/ServiceLifecycleButtons.tsx":"1781","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/ServiceLogsPanel.tsx":"1782","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/ServiceStatusCard.tsx":"1783","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/hooks/useServiceLogs.ts":"1784","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/hooks/useServiceStatus.ts":"1785","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/page.tsx":"1786","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/BifrostServiceTab.tsx":"1787","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/CliproxyServiceTab.tsx":"1788","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/DarioServiceTab.tsx":"1789","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/MuxServiceTab.tsx":"1790","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/NinerouterServiceTab.tsx":"1791","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/utils/buildCurl.ts":"1792","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/quota/page.tsx":"1793","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/radar/page.tsx":"1794","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/radar/setup/page.tsx":"1795","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/relay/RelayProxyClient.tsx":"1796","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/relay/page.tsx":"1797","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/runtime/RuntimePageClient.tsx":"1798","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/runtime/components/ModelCooldownsCard.tsx":"1799","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/runtime/page.tsx":"1800","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/SearchToolsClient.tsx":"1801","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/ProviderCatalog.tsx":"1802","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/ProviderComparison.tsx":"1803","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/RerankPanel.tsx":"1804","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/ResultsPanel.tsx":"1805","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/ScrapeResult.tsx":"1806","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchConceptCard.tsx":"1807","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchForm.tsx":"1808","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchHistory.tsx":"1809","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchToolsConfigPane.tsx":"1810","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchToolsTopBar.tsx":"1811","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/tabs/CompareTab.tsx":"1812","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/tabs/ScrapeTab.tsx":"1813","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/tabs/SearchTab.tsx":"1814","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/hooks/useScrapeFetch.ts":"1815","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/page.tsx":"1816","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/access-tokens/page.tsx":"1817","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/advanced/page.tsx":"1818","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/ai/page.tsx":"1819","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/appearance/page.tsx":"1820","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/cache/page.tsx":"1821","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AccessTokensTab.tsx":"1822","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AccountEmailVisibilitySetting.tsx":"1823","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AppearanceTab.tsx":"1824","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AuthzSection.tsx":"1825","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AutoDisableCard.tsx":"1826","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/BackgroundDegradationTab.tsx":"1827","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CacheSettingsTab.tsx":"1828","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CacheStatsCard.tsx":"1829","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ClaudeFastModeTab.tsx":"1830","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CliproxyapiSettingsTab.tsx":"1831","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CodexAutoPingTab.tsx":"1832","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CodexFastTierTab.tsx":"1833","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ComboDefaultsTab.tsx":"1834","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ComplianceTab.tsx":"1835","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx":"1836","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CompressionTokenSaverCard.tsx":"1837","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/DatabaseBackupRetentionCard.tsx":"1838","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/DebugModeCard.tsx":"1839","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/FallbackChainsEditor.tsx":"1840","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx":"1841","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx":"1842","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/FusionDefaultsFields.tsx":"1843","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/IPFilterSection.tsx":"1844","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/LogToolSourcesCard.tsx":"1845","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/MemorySkillsTab.tsx":"1846","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/MitmProxyTab.tsx":"1847","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelAliasesTab.tsx":"1848","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelAliasesUnified.tsx":"1849","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelCapabilityOverridesTab.tsx":"1850","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelLockoutCard.tsx":"1851","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelsDevSyncTab.tsx":"1852","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/OneproxyTab.tsx":"1853","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/PayloadRulesTab.tsx":"1854","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/PoliciesPanel.tsx":"1855","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/PricingTab.tsx":"1856","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProviderAccountRoutingCard.tsx":"1857","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyBatchActions.tsx":"1858","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyBulkImportModal.tsx":"1859","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyCheckboxCell.tsx":"1860","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyHealthCell.tsx":"1861","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx":"1862","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyStatusBadge.tsx":"1863","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyTab.tsx":"1864","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/RedisLauncherPanel.tsx":"1865","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/RequestLimitsTab.tsx":"1866","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ResilienceFields.tsx":"1867","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx":"1868","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ResponsesStatePolicyTab.tsx":"1869","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/RoutingStrategyCard.tsx":"1870","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx":"1871","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SecurityTab.tsx":"1872","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SessionInfoCard.tsx":"1873","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SidebarTab.tsx":"1874","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SystemPromptTab.tsx":"1875","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx":"1876","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ThinkingBudgetTab.tsx":"1877","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/UsageTokenBufferTab.tsx":"1878","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/VisionBridgeSettingsTab.tsx":"1879","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/parseBulkProxyImport.ts":"1880","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx":"1881","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx":"1882","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/DocumentationTab.tsx":"1883","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx":"1884","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/FreeProxyRow.tsx":"1885","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/GlobalConfigTab.tsx":"1886","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx":"1887","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/SourceToggleBar.tsx":"1888","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/SubscriptionTab.tsx":"1889","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/VercelRelayModal.tsx":"1890","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxyRegistryTypes.ts":"1891","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxyStrategyOptions.ts":"1892","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/systemTransformsHermesDefaults.ts":"1893","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/useProxyBatchOperations.ts":"1894","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/useProxyBulkImport.ts":"1895","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/useProxyPoolModal.ts":"1896","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/error.tsx":"1897","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/feature-flags/page.tsx":"1898","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/general/page.tsx":"1899","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/loading.tsx":"1900","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/page.tsx":"1901","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/pricing/page.tsx":"1902","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/resilience/page.tsx":"1903","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/routing/page.tsx":"1904","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/security/page.tsx":"1905","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/sidebar/page.tsx":"1906","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/system/1proxy/page.tsx":"1907","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/system/mitm-proxy/error.tsx":"1908","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/system/mitm-proxy/page.tsx":"1909","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/system/proxy/page.tsx":"1910","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tokens/page.tsx":"1911","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx":"1912","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentBridgeMaintenanceCard.tsx":"1913","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentBridgeServerCard.tsx":"1914","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx":"1915","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx":"1916","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/BypassListEditor.tsx":"1917","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/EmptyStateNoProviders.tsx":"1918","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelMappingTable.tsx":"1919","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelSelectorModal.tsx":"1920","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/RiskNoticeBanner.tsx":"1921","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/SetupWizard.tsx":"1922","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/UpstreamCaField.tsx":"1923","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/shared/AgentIcon.tsx":"1924","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/shared/CertStatusIcon.tsx":"1925","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/shared/DnsStatusBadge.tsx":"1926","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/hooks/useAgentBridgeState.ts":"1927","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/hooks/useMitmSudoPrompt.tsx":"1928","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/normalizeState.ts":"1929","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/page.tsx":"1930","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/TrafficInspectorPageClient.tsx":"1931","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/CaptureModesToolbar.tsx":"1932","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/CustomHostsManager.tsx":"1933","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/DetailsPanel.tsx":"1934","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/HttpProxySnippetCard.tsx":"1935","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/RequestRow.tsx":"1936","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/RequestStreamingList.tsx":"1937","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/TopBarControls.tsx":"1938","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/chat/ChatBubble.tsx":"1939","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/chat/MessageContent.tsx":"1940","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/chat/ToolCallBlock.tsx":"1941","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/chat/ToolResultBlock.tsx":"1942","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/session/HistoricSessionBanner.tsx":"1943","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/session/SessionPicker.tsx":"1944","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/session/SessionRecorderBar.tsx":"1945","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/AgentEmoji.tsx":"1946","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/AnnotationField.tsx":"1947","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/ContextColorBar.tsx":"1948","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/HeaderTable.tsx":"1949","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/JsonViewer.tsx":"1950","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/SecretMaskToggle.tsx":"1951","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/SseEventList.tsx":"1952","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/TimingWaterfall.tsx":"1953","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/TokenBadge.tsx":"1954","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/ConversationTab.tsx":"1955","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/HeadersTab.tsx":"1956","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/LlmDetailsTab.tsx":"1957","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/RequestBodyTab.tsx":"1958","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/ResponseBodyTab.tsx":"1959","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/StatsCharts.tsx":"1960","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/StatsTab.tsx":"1961","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/TimingTab.tsx":"1962","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useAnnotations.ts":"1963","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useReplay.ts":"1964","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useResizablePanels.ts":"1965","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useSessionRecorder.ts":"1966","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useSystemProxyExitGuard.ts":"1967","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useTrafficFilters.ts":"1968","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useTrafficStream.ts":"1969","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useVirtualList.ts":"1970","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/page.tsx":"1971","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/TranslatorPageClient.tsx":"1972","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/MonitorTab.tsx":"1973","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/ResultNarrated.tsx":"1974","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/SimpleControls.tsx":"1975","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/TranslateFlowDiagram.tsx":"1976","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/TranslateTab.tsx":"1977","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/TranslatorConceptCard.tsx":"1978","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/AdvancedSection.tsx":"1979","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/CompressionPreviewAccordion.tsx":"1980","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/PipelineView.tsx":"1981","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/RawJsonPanel.tsx":"1982","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/StreamTransformerAccordion.tsx":"1983","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/TestBenchAccordion.tsx":"1984","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/exampleTemplates.tsx":"1985","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/hooks/useAvailableModels.tsx":"1986","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/hooks/useProviderOptions.tsx":"1987","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/hooks/useTranslateDeepLink.tsx":"1988","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/hooks/useTranslateSession.tsx":"1989","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/page.tsx":"1990","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/types.ts":"1991","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/BudgetTab.tsx":"1992","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/BudgetTelemetryCards.tsx":"1993","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx":"1994","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/FreeBudgetCard.tsx":"1995","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/CodexResetCreditsModal.tsx":"1996","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.tsx":"1997","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderUsdCostModal.tsx":"1998","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaCard.tsx":"1999","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaCardGrid.tsx":"2000","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaCutoffModal.tsx":"2001","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaMiniBar.tsx":"2002","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.tsx":"2003","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.tsx":"2004","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/constants.ts":"2005","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/formatters.ts":"2006","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/i18nFallback.ts":"2007","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.tsx":"2008","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/parts/QuotaCardBody.tsx":"2009","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/parts/QuotaCardExpanded.tsx":"2010","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/parts/QuotaCardHeader.tsx":"2011","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/parts/QuotaEnvGroup.tsx":"2012","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/providerColumns.ts":"2013","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/quotaParsing.ts":"2014","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/useCodexResetCreditRedemption.ts":"2015","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/useQuotaVisibility.ts":"2016","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/useVisibleQuotaData.ts":"2017","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx":"2018","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/RateLimitStatus.tsx":"2019","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/SessionsTab.tsx":"2020","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/page.tsx":"2021","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/WebhooksPageClient.tsx":"2022","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/__tests__/webhook-wizard.test.tsx":"2023","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/AddWebhookWizard.tsx":"2024","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/HowItWorksSidebar.tsx":"2025","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/WebhookCard.tsx":"2026","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/WebhookDeliveriesPanel.tsx":"2027","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/WebhooksList.tsx":"2028","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/DeliveryStatusBadge.tsx":"2029","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/EventChecklist.tsx":"2030","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/HmacRecipeBlock.tsx":"2031","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/IntegrationCard.tsx":"2032","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/PayloadPreview.tsx":"2033","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/Step1ChooseIntegration.tsx":"2034","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/Step2ConfigureIntegration.tsx":"2035","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/Step3EventsAndTest.tsx":"2036","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/CustomConfigForm.tsx":"2037","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/DiscordConfigForm.tsx":"2038","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/SlackConfigForm.tsx":"2039","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/TelegramConfigForm.tsx":"2040","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/page.tsx":"2041","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/ProviderQuotaWidget.tsx":"2042","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/ProviderTopology.tsx":"2043","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/page.tsx":"2044","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/topologyLabel.ts":"2045","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/topologyUtils.ts":"2046","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/layout.tsx":"2047","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/.well-known/agent.json/route.ts":"2048","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/400/layout.tsx":"2049","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/400/page.tsx":"2050","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/401/layout.tsx":"2051","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/401/page.tsx":"2052","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/403/layout.tsx":"2053","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/403/page.tsx":"2054","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/408/layout.tsx":"2055","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/408/page.tsx":"2056","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/429/layout.tsx":"2057","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/429/page.tsx":"2058","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/500/layout.tsx":"2059","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/500/page.tsx":"2060","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/502/layout.tsx":"2061","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/502/page.tsx":"2062","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/503/layout.tsx":"2063","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/503/page.tsx":"2064","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/a2a/route.ts":"2065","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/[...omnirouteApiCatchAll]/route.ts":"2066","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/a2a/status/route.ts":"2067","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/a2a/tasks/[id]/cancel/route.ts":"2068","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/a2a/tasks/[id]/route.ts":"2069","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/a2a/tasks/route.ts":"2070","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/acp/agents/route.ts":"2071","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/admin/concurrency/route.ts":"2072","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/[id]/raw/route.ts":"2073","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/[id]/route.ts":"2074","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/coverage/route.ts":"2075","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/generate/route.ts":"2076","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/route.ts":"2077","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/analytics/auto-routing/route.ts":"2078","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/analytics/compression/route.ts":"2079","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/analytics/diversity/route.ts":"2080","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/assess/route.ts":"2081","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/csrf/route.ts":"2082","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/login/route.ts":"2083","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/logout/route.ts":"2084","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/oidc/callback/route.ts":"2085","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/oidc/login/route.ts":"2086","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/status/route.ts":"2087","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/batches/[id]/route.ts":"2088","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/batches/route.ts":"2089","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cache/entries/route.ts":"2090","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cache/reasoning/route.ts":"2091","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cache/route.ts":"2092","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cache/stats/route.ts":"2093","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/chaos/config/route.ts":"2094","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/chaos/run/route.ts":"2095","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli/connect/route.ts":"2096","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli/tokens/[id]/route.ts":"2097","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli/tokens/route.ts":"2098","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli/whoami/route.ts":"2099","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/_lib/jsoncConfig.ts":"2100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/all-statuses/route.ts":"2101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/antigravity-mitm/alias/route.ts":"2102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/antigravity-mitm/route.ts":"2103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/apply/route.ts":"2104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/backups/route.ts":"2105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/claude-settings/route.ts":"2106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/cline-settings/route.ts":"2107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/codewhale-settings/route.ts":"2108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/codex-profiles/route.ts":"2109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/codex-settings/route.ts":"2110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/config/route.ts":"2111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/crush-settings/route.ts":"2112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/deepseek-tui-settings/route.ts":"2113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/detect/route.ts":"2114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/droid-settings/route.ts":"2115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/forge-settings/route.ts":"2116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/grok-build-settings/route.ts":"2117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/guide-settings/[toolId]/route.ts":"2118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/hermes-agent-settings/route.ts":"2119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/jcode-settings/route.ts":"2120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/keys/route.ts":"2121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/kilo-settings/route.ts":"2122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/letta-settings/route.ts":"2123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/logs/route.ts":"2124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/omp-settings/route.ts":"2125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/openclaw/auto-order/route.ts":"2126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/openclaw-settings/route.ts":"2127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/pi-settings/route.ts":"2128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/qwen-settings/route.ts":"2129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/runtime/[toolId]/route.ts":"2130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/smelt-settings/route.ts":"2131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/status/route.ts":"2132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cloud/auth/route.ts":"2133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cloud/credentials/update/route.ts":"2134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cloud/model/resolve/route.ts":"2135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cloud/models/alias/route.ts":"2136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/codex/connect/[token]/route.ts":"2137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/[id]/route.ts":"2138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/auto/route.ts":"2139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/builder/options/route.ts":"2140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/metrics/route.ts":"2141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/reorder/route.ts":"2142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/route.ts":"2143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/test/route.ts":"2144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compliance/audit-log/route.ts":"2145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/compare/route.ts":"2146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/compare/verify/route.ts":"2147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/engines/route.ts":"2148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/language-packs/route.ts":"2149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/preview/route.ts":"2150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/retrieve/route.ts":"2151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/rules/route.ts":"2152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/analytics/engine/route.ts":"2153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/analytics/route.ts":"2154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/caveman/config/route.ts":"2155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/combos/[id]/assignments/route.ts":"2156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/combos/[id]/route.ts":"2157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/combos/default/route.ts":"2158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/combos/route.ts":"2159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/config/route.ts":"2160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/discover/route.ts":"2161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/filters/route.ts":"2162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/import/route.ts":"2163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/learn/route.ts":"2164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/raw-output/[id]/route.ts":"2165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/test/route.ts":"2166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/copilot/chat/route.ts":"2167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/dahl/tokens/route.ts":"2168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db/health/route.ts":"2169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db-backups/export/route.ts":"2170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db-backups/exportAll/route.ts":"2171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db-backups/import/route.ts":"2172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db-backups/route.ts":"2173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/discovery/results/[id]/route.ts":"2174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/discovery/results/route.ts":"2175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/discovery/scan/route.ts":"2176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/discovery/verify/[id]/route.ts":"2177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/docs/codex-cli/route.ts":"2178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/docs/route.ts":"2179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/evals/[suiteId]/route.ts":"2180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/evals/route.ts":"2181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/evals/suites/[suiteId]/route.ts":"2182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/evals/suites/route.ts":"2183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/fallback/chains/route.ts":"2184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/files/[id]/content/route.ts":"2185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/files/route.ts":"2186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/free-models/route.ts":"2187","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/free-provider-rankings/route.ts":"2188","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/free-tier/summary/route.ts":"2189","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/anomalies/route.ts":"2190","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/badges/earned/route.ts":"2191","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/badges/route.ts":"2192","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/federation/leaderboard/route.ts":"2193","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/federation/score/route.ts":"2194","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/invite/redeem/route.ts":"2195","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/invite/route.ts":"2196","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/leaderboard/route.ts":"2197","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/level/route.ts":"2198","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/notifications/route.ts":"2199","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/rotate/route.ts":"2200","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/servers/route.ts":"2201","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/stream/route.ts":"2202","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/transfer/route.ts":"2203","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/github-skills/route.ts":"2204","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/guardrails/route.ts":"2205","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/guardrails/test/route.ts":"2206","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/headroom/start/route.ts":"2207","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/headroom/status/route.ts":"2208","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/headroom/stop/route.ts":"2209","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/health/degradation/route.ts":"2210","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/health/ping/route.ts":"2211","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/init/route.ts":"2212","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/intelligence/sync/route.ts":"2213","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/internal/codex-responses-ws/compression.ts":"2214","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/internal/codex-responses-ws/history.ts":"2215","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/internal/codex-responses-ws/modelResolution.ts":"2216","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/internal/codex-responses-ws/route.ts":"2217","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/issue-agent/runs/route.ts":"2218","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/devices/route.ts":"2219","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/regenerate/route.ts":"2220","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/reveal/route.ts":"2221","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/route.ts":"2222","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/usage-limits/route.ts":"2223","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/groups/[id]/keys/route.ts":"2224","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/groups/[id]/permissions/route.ts":"2225","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/groups/[id]/route.ts":"2226","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/groups/route.ts":"2227","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/route.ts":"2228","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/local/redis/redisRuntime.ts":"2229","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/local/redis/start/route.ts":"2230","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/local/redis/status/route.ts":"2231","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/local/redis/stop/route.ts":"2232","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/logs/[id]/route.ts":"2233","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/logs/console/route.ts":"2234","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/logs/detail/route.ts":"2235","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/logs/export/route.ts":"2236","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/audit/route.ts":"2237","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/audit/stats/route.ts":"2238","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/sse/route.ts":"2239","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/status/route.ts":"2240","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/stream/route.ts":"2241","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/tools/route.ts":"2242","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/[id]/route.ts":"2243","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/embedding-providers/route.ts":"2244","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/engine-status/route.ts":"2245","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/health/route.ts":"2246","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/reindex/route.ts":"2247","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/retrieve-preview/route.ts":"2248","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/route.ts":"2249","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/summarize/route.ts":"2250","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/middleware/hooks/[name]/route.ts":"2251","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/middleware/hooks/route.ts":"2252","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/model-capability-overrides/route.ts":"2253","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/model-combo-mappings/[id]/route.ts":"2254","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/model-combo-mappings/route.ts":"2255","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/alias/route.ts":"2256","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/catalog/route.ts":"2257","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/openrouter-catalog/route.ts":"2258","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/route.ts":"2259","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/test/route.ts":"2260","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/test-all/route.ts":"2261","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/monitoring/health/route.ts":"2262","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/network/info/route.ts":"2263","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/[provider]/[action]/keychainImportOnly.ts":"2264","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/[provider]/[action]/remoteOAuthHint.ts":"2265","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/[provider]/[action]/route.ts":"2266","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/[provider]/paste-credentials/route.ts":"2267","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/cliproxy-import/route.ts":"2268","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/codex/import/route.ts":"2269","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/codex/import-token/route.ts":"2270","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/cursor/auto-import/route.ts":"2271","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/cursor/import/route.ts":"2272","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/api-key/helpers.ts":"2273","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/api-key/route.ts":"2274","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/auto-import/route.ts":"2275","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/import/route.ts":"2276","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/social-authorize/route.ts":"2277","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/social-exchange/route.ts":"2278","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/raycast/auto-import/route.ts":"2279","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/raycast/import/route.ts":"2280","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/trae/import/route.ts":"2281","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/openapi/spec/route.ts":"2282","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/openapi/try/route.ts":"2283","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/playground/improve-prompt/route.ts":"2284","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/playground/presets/[id]/route.ts":"2285","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/playground/presets/route.ts":"2286","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/playground/simulate-route/route.ts":"2287","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/[name]/activate/route.ts":"2288","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/[name]/config/route.ts":"2289","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/[name]/deactivate/route.ts":"2290","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/[name]/route.ts":"2291","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/marketplace/route.ts":"2292","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/route.ts":"2293","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/scan/route.ts":"2294","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/policies/route.ts":"2295","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/pricing/defaults/route.ts":"2296","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/pricing/models/route.ts":"2297","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/pricing/route.ts":"2298","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/pricing/sync/route.ts":"2299","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-metrics/route.ts":"2300","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-models/route.ts":"2301","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-nodes/[id]/route.ts":"2302","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-nodes/route.ts":"2303","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-nodes/urlGuard.ts":"2304","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-nodes/validate/route.ts":"2305","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-stats/route.ts":"2306","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/cc-alias/route.ts":"2307","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/claude-auth/apply-local/route.ts":"2308","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/claude-auth/export/route.ts":"2309","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/codex-auth/apply-local/route.ts":"2310","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/codex-auth/export/route.ts":"2311","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/interception-rules/route.ts":"2312","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/login/route.ts":"2313","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/codex.ts":"2314","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/helpers.ts":"2315","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/normalizers.ts":"2316","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/providerModelsConfig.ts":"2317","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/providerSets.ts":"2318","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discoveryClientVersion.ts":"2319","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discoveryConfig.ts":"2320","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/route.ts":"2321","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/staleEncryptionGuard.ts":"2322","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/param-filters/route.ts":"2323","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/refresh/route.ts":"2324","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/route.ts":"2325","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/sync-models/degradedLocalCatalog.ts":"2326","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/sync-models/route.ts":"2327","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/test/cliRuntimeProviderMap.ts":"2328","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/test/mistralAmbiguousAuth.ts":"2329","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/test/oauthTestConfig.ts":"2330","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/test/route.ts":"2331","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/agy-auth/apply-local/route.ts":"2332","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/agy-auth/import/route.ts":"2333","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/agy-auth/import-bulk/route.ts":"2334","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/agy-auth/zip-extract/route.ts":"2335","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/bulk/route.ts":"2336","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/bulk-web-session/route.ts":"2337","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/claude-auth/import/route.ts":"2338","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/claude-auth/import-bulk/route.ts":"2339","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/claude-auth/zip-extract/route.ts":"2340","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/client/route.ts":"2341","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/codex-auth/import/route.ts":"2342","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/codex-auth/import-bulk/route.ts":"2343","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/codex-auth/zip-extract/route.ts":"2344","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/apply/route.ts":"2345","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/callback/route.ts":"2346","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/shared.ts":"2347","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/start/route.ts":"2348","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/status/route.ts":"2349","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/expiration/route.ts":"2350","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/health-autopilot/actions/route.ts":"2351","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/health-autopilot/route.ts":"2352","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/health-matrix/route.ts":"2353","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/import/route.ts":"2354","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/openrouter-stats/route.ts":"2355","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/quota-windows/route.ts":"2356","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/route.ts":"2357","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/test-batch/route.ts":"2358","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/validate/route.ts":"2359","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/zed/discover/route.ts":"2360","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/zed/import/route.ts":"2361","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/zed/manual-import/route.ts":"2362","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/proxy-fallback/test/route.ts":"2363","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/groups/[id]/route.ts":"2364","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/groups/route.ts":"2365","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/keys/[id]/models/route.ts":"2366","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/plans/[connectionId]/route.ts":"2367","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/plans/route.ts":"2368","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/pools/[id]/log/route.ts":"2369","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/pools/[id]/route.ts":"2370","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/pools/[id]/usage/route.ts":"2371","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/pools/route.ts":"2372","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/preview/route.ts":"2373","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/radar/catalog/route.ts":"2374","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/radar/settings/route.ts":"2375","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/radar/sync/route.ts":"2376","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/rate-limit/route.ts":"2377","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/rate-limits/route.ts":"2378","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/relay/tokens/[id]/route.ts":"2379","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/relay/tokens/route.ts":"2380","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/resilience/model-cooldowns/route.ts":"2381","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/resilience/reset/route.ts":"2382","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/resilience/route.ts":"2383","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/restart/route.ts":"2384","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/routing/decisions/[requestId]/route.ts":"2385","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/search/providers/route.ts":"2386","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/search/stats/route.ts":"2387","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/_lib.ts":"2388","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/auto-restart-adopted/route.ts":"2389","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/auto-start/route.ts":"2390","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/install/route.ts":"2391","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/models/route.ts":"2392","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/provider-expose/route.ts":"2393","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/restart/route.ts":"2394","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/rotate-key/route.ts":"2395","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/start/route.ts":"2396","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/status/route.ts":"2397","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/stop/route.ts":"2398","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/update/route.ts":"2399","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/[name]/logs/route.ts":"2400","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/_shared/installRoute.ts":"2401","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/_lib.ts":"2402","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/auto-restart-adopted/route.ts":"2403","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/auto-start/route.ts":"2404","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/install/route.ts":"2405","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/restart/route.ts":"2406","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/start/route.ts":"2407","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/status/route.ts":"2408","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/stop/route.ts":"2409","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/update/route.ts":"2410","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/_lib.ts":"2411","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/auto-restart-adopted/route.ts":"2412","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/auto-start/route.ts":"2413","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/install/route.ts":"2414","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/provider-expose/route.ts":"2415","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/restart/route.ts":"2416","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/start/route.ts":"2417","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/status/route.ts":"2418","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/stop/route.ts":"2419","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/update/route.ts":"2420","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/_lib.ts":"2421","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/_lib.ts":"2422","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/accounts/route.ts":"2423","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/import-from-omniroute/route.ts":"2424","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/login-complete/route.ts":"2425","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/login-start/route.ts":"2426","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/auto-restart-adopted/route.ts":"2427","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/auto-start/route.ts":"2428","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/install/route.ts":"2429","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/restart/route.ts":"2430","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/start/route.ts":"2431","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/status/route.ts":"2432","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/stop/route.ts":"2433","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/update/route.ts":"2434","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/_lib.ts":"2435","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/auto-restart-adopted/route.ts":"2436","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/auto-start/route.ts":"2437","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/install/route.ts":"2438","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/restart/route.ts":"2439","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/start/route.ts":"2440","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/status/route.ts":"2441","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/stop/route.ts":"2442","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/update/route.ts":"2443","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/session-pools/[provider]/route.ts":"2444","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/session-pools/route.ts":"2445","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sessions/route.ts":"2446","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/__tests__/memory.test.ts":"2447","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/__tests__/settings.test.ts":"2448","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/authz-inventory/route.ts":"2449","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/auto-disable-accounts/route.ts":"2450","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/background-degradation/route.ts":"2451","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/cache-config/route.ts":"2452","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/cache-metrics/route.ts":"2453","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/cc-discovery-metrics/route.ts":"2454","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/combo-defaults/route.ts":"2455","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/compression/mcp-accessibility/route.ts":"2456","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/compression/route.ts":"2457","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/compression/rules/route.ts":"2458","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/compression/run-telemetry/route.ts":"2459","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/database/refresh-stats/route.ts":"2460","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/database/route.ts":"2461","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/database/vacuum/route.ts":"2462","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/export-json/route.ts":"2463","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/favicon/route.ts":"2464","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/feature-flags/route.ts":"2465","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/[id]/add-to-pool/route.ts":"2466","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/bulk-add-to-pool/route.ts":"2467","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/route.ts":"2468","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/stats/route.ts":"2469","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/sync/route.ts":"2470","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/import-json/route.ts":"2471","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/ip-filter/route.ts":"2472","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/lkgp-cache/route.ts":"2473","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/local-corpus/route.ts":"2474","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/memory/route.ts":"2475","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/mitm/route.ts":"2476","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/model-aliases/route.ts":"2477","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/models-dev/route.ts":"2478","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/notion/route.ts":"2479","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/obsidian/route.ts":"2480","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/obsidian/webdav/route.ts":"2481","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/oneproxy/rotate/route.ts":"2482","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/oneproxy/route.ts":"2483","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/payload-rules/route.ts":"2484","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/[id]/repair-relay/route.ts":"2485","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/assignments/route.ts":"2486","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/auto-test/route.ts":"2487","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/batch-activate/route.ts":"2488","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/batch-delete/route.ts":"2489","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/bulk-assign/route.ts":"2490","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/bulk-import/route.ts":"2491","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/egress/route.ts":"2492","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/health/route.ts":"2493","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/migrate/route.ts":"2494","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/pool/route.ts":"2495","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/route.ts":"2496","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/cloudflare-deploy/route.ts":"2497","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/deno-deploy/route.ts":"2498","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/route.ts":"2499","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/test/relayTestResult.ts":"2500","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/test/route.ts":"2501","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/vercel-deploy/route.ts":"2502","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-call-logs/route.ts":"2503","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-detailed-logs/route.ts":"2504","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-logs/route.ts":"2505","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-quota-snapshots/route.ts":"2506","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-request-history/route.ts":"2507","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-usage-history/route.ts":"2508","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/cleanup/route.ts":"2509","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/embedding-models/route.ts":"2510","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/health/route.ts":"2511","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/route.ts":"2512","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/search/route.ts":"2513","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/quota-store/route.ts":"2514","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/reasoning-routing-rules/[id]/route.ts":"2515","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/reasoning-routing-rules/route.ts":"2516","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/reasoning-routing-rules/simulate/route.ts":"2517","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/require-login/route.ts":"2518","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/route.ts":"2519","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/system-prompt/route.ts":"2520","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/task-routing/route.ts":"2521","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/thinking-budget/route.ts":"2522","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/tier-config/route.ts":"2523","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/shutdown/route.ts":"2524","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/[id]/route.ts":"2525","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/collect/chaos/route.ts":"2526","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/collect/detect/route.ts":"2527","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/collect/install/route.ts":"2528","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/executions/route.ts":"2529","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/install/route.ts":"2530","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/marketplace/install/route.ts":"2531","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/marketplace/route.ts":"2532","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/route.ts":"2533","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/skillssh/install/route.ts":"2534","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/skillssh/route.ts":"2535","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/storage/health/route.ts":"2536","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/bundle/route.ts":"2537","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/cloud/route.ts":"2538","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/initialize/route.ts":"2539","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/tokens/[id]/route.ts":"2540","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/tokens/route.ts":"2541","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/synced-available-models/route.ts":"2542","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/system/env/repair/route.ts":"2543","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/system/version/route.ts":"2544","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tags/route.ts":"2545","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/telemetry/summary/route.ts":"2546","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/token-health/route.ts":"2547","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/detect/route.ts":"2548","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/detected-models/route.ts":"2549","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/dns/route.ts":"2550","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/mappings/route.ts":"2551","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/route.ts":"2552","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/route.ts":"2553","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/bypass/route.ts":"2554","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/cert/download/route.ts":"2555","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/cert/regenerate/route.ts":"2556","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/cert/route.ts":"2557","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/config/route.ts":"2558","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/diagnose/route.ts":"2559","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/repair/route.ts":"2560","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/server/route.ts":"2561","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/state/route.ts":"2562","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/tproxy/route.ts":"2563","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/upstream-ca/route.ts":"2564","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/upstream-ca/test/route.ts":"2565","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/capture-modes/http-proxy/route.ts":"2566","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/capture-modes/route.ts":"2567","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts":"2568","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/capture-modes/tls-intercept/route.ts":"2569","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/export.har/route.ts":"2570","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/hosts/[host]/route.ts":"2571","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/hosts/route.ts":"2572","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/internal/ingest/route.ts":"2573","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/requests/[id]/annotation/route.ts":"2574","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/requests/[id]/replay/route.ts":"2575","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/requests/[id]/route.ts":"2576","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/requests/route.ts":"2577","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/sessions/[id]/export.har/route.ts":"2578","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/sessions/[id]/requests/route.ts":"2579","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/sessions/[id]/route.ts":"2580","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/sessions/route.ts":"2581","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/ws/route.ts":"2582","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/detect/route.ts":"2583","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/history/route.ts":"2584","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/send/route.ts":"2585","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/transform-stream/route.ts":"2586","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/translate/route.ts":"2587","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/cloudflared/route.ts":"2588","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/ngrok/route.ts":"2589","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/check/route.ts":"2590","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/disable/route.ts":"2591","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/enable/route.ts":"2592","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/install/route.ts":"2593","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/login/route.ts":"2594","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/route.ts":"2595","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/routeUtils.ts":"2596","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/start-daemon/route.ts":"2597","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/upstream-proxy/[providerId]/route.ts":"2598","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/[connectionId]/route.ts":"2599","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/analytics/route.ts":"2600","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/budget/bulk/route.ts":"2601","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/budget/route.ts":"2602","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/cache-health/route.ts":"2603","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/call-logs/[id]/route.ts":"2604","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/call-logs/route.ts":"2605","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/codex-reset-credit/route.ts":"2606","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-forecast/route.ts":"2607","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-health/route.ts":"2608","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-health-autopilot/route.ts":"2609","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-health-dashboard/route.ts":"2610","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-scoring-inspector/route.ts":"2611","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/history/route.ts":"2612","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/logs/route.ts":"2613","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/model-latency-stats/route.ts":"2614","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/om-usage/route.ts":"2615","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/provider-limits/route.ts":"2616","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/provider-window-costs/route.ts":"2617","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/proxy-logs/route.ts":"2618","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/quota/route.ts":"2619","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/request-logs/route.ts":"2620","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/requests-by-provider-date/route.ts":"2621","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/route-explain/[id]/route.ts":"2622","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/token-limits/route.ts":"2623","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/utilization/route.ts":"2624","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/[...omnirouteCatchAll]/route.ts":"2625","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_helpers/apiKeyScope.ts":"2626","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_shared/audioProviderNodes.ts":"2627","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_shared/mediaGenerationRoute.ts":"2628","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_shared/rateLimit.ts":"2629","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_shared/specialtyCatalog.ts":"2630","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/accounts/[id]/limits/route.ts":"2631","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/agents/credentials/route.ts":"2632","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/agents/health/route.ts":"2633","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/agents/tasks/[id]/route.ts":"2634","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/agents/tasks/route.ts":"2635","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/antigravity/route.ts":"2636","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/api/chat/route.ts":"2637","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/audio/speech/route.ts":"2638","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/audio/transcriptions/route.ts":"2639","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/audio/translations/route.ts":"2640","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/auto-combo/[channel]/candidates/route.ts":"2641","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/[id]/cancel/route.ts":"2642","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/[id]/route.ts":"2643","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/delete-completed/route.ts":"2644","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/formatBatchResponse.ts":"2645","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/parseListLimit.ts":"2646","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/route.ts":"2647","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/chat/completions/route.ts":"2648","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/chatgpt-web/image/[id]/route.ts":"2649","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/combos/projectCombo.ts":"2650","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/combos/route.ts":"2651","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/completions/route.ts":"2652","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/completions/textCompletionTransform.ts":"2653","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/embeddings/route.ts":"2654","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/files/[id]/content/route.ts":"2655","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/files/[id]/route.ts":"2656","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/files/route.ts":"2657","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/images/edits/route.ts":"2658","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/images/generations/route.ts":"2659","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/images/upscale/route.ts":"2660","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/issues/report/route.ts":"2661","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxies/assignments/route.ts":"2662","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxies/bulk-assign/route.ts":"2663","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxies/health/route.ts":"2664","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxies/route.ts":"2665","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxy-subscriptions/[id]/nodes/route.ts":"2666","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxy-subscriptions/[id]/refresh/route.ts":"2667","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxy-subscriptions/[id]/route.ts":"2668","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxy-subscriptions/route.ts":"2669","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/me/status/route.ts":"2670","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/messages/count_tokens/route.ts":"2671","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/messages/route.ts":"2672","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/[...model]/route.ts":"2673","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/aliasBackedModels.ts":"2674","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalog.ts":"2675","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogCache.ts":"2676","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogDedupe.ts":"2677","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogHelpers.ts":"2678","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogOpenrouter.ts":"2679","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogOrder.ts":"2680","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogProviderMaps.ts":"2681","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogRequest.ts":"2682","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogResponse.ts":"2683","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogSyncedCoverage.ts":"2684","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogVision.ts":"2685","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/ccAliasPredicate.ts":"2686","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/functionalGatewayPredicate.ts":"2687","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/modelById.ts":"2688","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/route.ts":"2689","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/syncedCapabilities.ts":"2690","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/moderations/route.ts":"2691","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/music/generations/route.ts":"2692","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/ocr/route.ts":"2693","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/provider-plugin-manifest/route.ts":"2694","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/chat/completions/route.ts":"2695","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/embeddings/route.ts":"2696","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/images/generations/route.ts":"2697","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/limits/route.ts":"2698","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/models/route.ts":"2699","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/suggested-models/route.ts":"2700","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/quotas/check/route.ts":"2701","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/registered-keys/[id]/revoke/route.ts":"2702","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/registered-keys/[id]/route.ts":"2703","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/registered-keys/route.ts":"2704","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/bifrost/route.ts":"2705","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/bifrostCooldown.ts":"2706","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/relaySecurity.ts":"2707","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/route.ts":"2708","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/routingBackend.ts":"2709","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/streamFinalizer.ts":"2710","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/rerank/route.ts":"2711","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/responses/[...path]/route.ts":"2712","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/responses/route.ts":"2713","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/route.ts":"2714","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/search/analytics/route.ts":"2715","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/search/route.ts":"2716","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/videos/generations/route.ts":"2717","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/api/chat/route.ts":"2718","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/api/show/route.ts":"2719","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/api/tags/route.ts":"2720","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/api/version/route.ts":"2721","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/chat/completions/route.ts":"2722","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/combos/route.ts":"2723","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/familyFirstModelIds.ts":"2724","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/modelPresentation.ts":"2725","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/models/route.ts":"2726","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/reasoningMetadata.ts":"2727","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/responses/route.ts":"2728","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/route.ts":"2729","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/serviceTierVariants.ts":"2730","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/tokenizedRequest.ts":"2731","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/usableChatModel.ts":"2732","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/v1/chat/completions/route.ts":"2733","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/v1/models/route.ts":"2734","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/combos/[token]/[[...slug]]/route.ts":"2735","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/contextSanitizer.ts":"2736","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/api/chat/route.ts":"2737","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/api/show/route.ts":"2738","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/api/tags/route.ts":"2739","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/api/version/route.ts":"2740","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/chat/completions/route.ts":"2741","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/combos/route.ts":"2742","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/familyFirstModelIds.ts":"2743","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/modelPresentation.ts":"2744","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/models/route.ts":"2745","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/reasoningMetadata.ts":"2746","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/responses/route.ts":"2747","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/route.ts":"2748","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/serviceTierVariants.ts":"2749","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/tokenizedRequest.ts":"2750","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/v1/chat/completions/route.ts":"2751","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/v1/models/route.ts":"2752","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/web/fetch/route.ts":"2753","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/ws/route.ts":"2754","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1beta/models/[...path]/convertGeminiToInternal.ts":"2755","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1beta/models/[...path]/route.ts":"2756","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1beta/models/route.ts":"2757","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/check-update/route.ts":"2758","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/install/route.ts":"2759","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/request.ts":"2760","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/restart/route.ts":"2761","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/start/route.ts":"2762","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/status/route.ts":"2763","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/stop/route.ts":"2764","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/vnc-session/[...params]/route.ts":"2765","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/vnc-session/route.ts":"2766","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/[id]/deliveries/route.ts":"2767","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/[id]/route.ts":"2768","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/[id]/test/route.ts":"2769","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/route.ts":"2770","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/validate-url/route.ts":"2771","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/auth/callback/page.tsx":"2772","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/authorize/parseCallback.ts":"2773","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/authorize/route.ts":"2774","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/callback/page.tsx":"2775","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/connect/codex/[token]/CodexConnectClient.tsx":"2776","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/connect/codex/[token]/page.tsx":"2777","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/[...slug]/page.tsx":"2778","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/api/search/route.ts":"2779","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/api-explorer/page.tsx":"2780","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/components/ApiExplorerClient.tsx":"2781","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/components/DocsPageAnalytics.tsx":"2782","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/components/FeedbackWidget.tsx":"2783","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/layout.tsx":"2784","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/lib/openapi.generated.ts":"2785","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/page.tsx":"2786","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/error.tsx":"2787","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/forbidden/page.tsx":"2788","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/forgot-password/page.tsx":"2789","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/global-error.tsx":"2790","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/healthz/route.ts":"2791","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/AnimatedBackground.tsx":"2792","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/Features.tsx":"2793","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/FlowAnimation.tsx":"2794","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/Footer.tsx":"2795","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/GetStarted.tsx":"2796","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/HeroSection.tsx":"2797","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/HowItWorks.tsx":"2798","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/Navigation.tsx":"2799","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/page.tsx":"2800","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/layout.tsx":"2801","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/loading.tsx":"2802","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/login/page.tsx":"2803","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/maintenance/page.tsx":"2804","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/manifest.ts":"2805","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/not-found.tsx":"2806","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/offline/page.tsx":"2807","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/page.tsx":"2808","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/privacy/page.tsx":"2809","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/status/page.tsx":"2810","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/terms/page.tsx":"2811","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/assessor.ts":"2812","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/categorizer.ts":"2813","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/index.ts":"2814","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/migration.ts":"2815","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/selfHealer.ts":"2816","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/types.ts":"2817","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/comboResolver.ts":"2818","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/configAudit.ts":"2819","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/connectionModelRules.ts":"2820","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/costRules.ts":"2821","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/degradation.ts":"2822","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/fallbackPolicy.ts":"2823","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/lockoutPolicy.ts":"2824","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/modelAvailability.ts":"2825","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/omnirouteResponseMeta.ts":"2826","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/persistence/comboRepositories.ts":"2827","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/pipeline.ts":"2828","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/policyEngine.ts":"2829","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/prompts.ts":"2830","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/providerExpiration.ts":"2831","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/quotaCache.ts":"2832","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/responses.ts":"2833","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/tagRouter.ts":"2834","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/types.ts":"2835","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/hooks/useLiveCompression.ts":"2836","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/hooks/useLiveDashboard.ts":"2837","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/hooks/usePreviewCompression.ts":"2838","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/hooks/useProviderBreakerHealth.ts":"2839","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/i18n/config.ts":"2840","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/i18n/detectBrowserLocale.ts":"2841","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/i18n/request.ts":"2842","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/instrumentation-node.ts":"2843","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/instrumentation.ts":"2844","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/routingLogger.ts":"2845","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/costAnalysis.ts":"2846","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/healthReport.ts":"2847","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/listCapabilities.ts":"2848","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/providerDiscovery.ts":"2849","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/quotaManagement.ts":"2850","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/smartRouting.ts":"2851","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/streaming.ts":"2852","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/taskExecution.ts":"2853","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/taskManager.ts":"2854","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/accessTokens/scopes.ts":"2855","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/acp/index.ts":"2856","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/acp/manager.ts":"2857","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/acp/registry.ts":"2858","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/catalog.ts":"2859","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/cliRegistryParser.ts":"2860","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/generator.ts":"2861","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/openapiParser.ts":"2862","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/schemas.ts":"2863","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/types.ts":"2864","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/comboErrorResponse.ts":"2865","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/errorResponse.ts":"2866","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/internalServiceAuth.ts":"2867","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/modelTestRunner.ts":"2868","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/proxyRegistryRouteHandlers.ts":"2869","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/requireCliToolsAuth.ts":"2870","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/requireManagementAuth.ts":"2871","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/serverErrorMessage.ts":"2872","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/apiBridgeServer.ts":"2873","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/apiKeyExposure.ts":"2874","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/arenaEloSync.ts":"2875","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/audit/activityIcons.ts":"2876","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/audit/highLevelActions.ts":"2877","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/audit/timeline.ts":"2878","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/auth/managementPassword.ts":"2879","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/costEstimator.ts":"2880","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/csvToJsonl.ts":"2881","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/dispatch.ts":"2882","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/retryFailed.ts":"2883","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/schemas.ts":"2884","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/types.ts":"2885","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/validateJsonl.ts":"2886","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/benchmarks.ts":"2887","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/build-profile/featureDisabled.ts":"2888","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cacheControlSettings.ts":"2889","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cacheLayer.ts":"2890","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/catalog/openrouterCatalog.ts":"2891","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/catalog/openrouterProviderStats.ts":"2892","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/ccDiscoveryAliasResolve.ts":"2893","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/chaos/chaosConfig.ts":"2894","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/chaos/chaosExecutor.ts":"2895","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/claudeProfileAutoSync.ts":"2896","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/codexProfileAutoSync.ts":"2897","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/claude.ts":"2898","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/cline.ts":"2899","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/codex.ts":"2900","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/continue.ts":"2901","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/hermes-agent.ts":"2902","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/hermes.ts":"2903","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/hermesHome.ts":"2904","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/index.ts":"2905","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/kilocode.ts":"2906","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/opencode.ts":"2907","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/doctor/checks.ts":"2908","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/log-streamer.ts":"2909","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/tool-detector.ts":"2910","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cliTools/batchStatusCache.ts":"2911","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cliTools/checkToolConfigStatus.ts":"2912","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/agents/codex.ts":"2913","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/agents/cursor.ts":"2914","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/agents/devin.ts":"2915","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/agents/jules.ts":"2916","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/api.ts":"2917","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/baseAgent.ts":"2918","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/credentials.ts":"2919","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/db.ts":"2920","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/index.ts":"2921","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/julesApi.ts":"2922","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/registry.ts":"2923","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/types.ts":"2924","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudSync.stub.ts":"2925","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudSync.ts":"2926","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudflaredTunnel.ts":"2927","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/autoPromote.ts":"2928","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/builderDraft.ts":"2929","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/builderOptions.ts":"2930","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/comboContext.ts":"2931","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/compositeTiers.ts":"2932","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/controlCenter.ts":"2933","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/intelligentRouting.ts":"2934","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/invariants.ts":"2935","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/modelNameCollision.ts":"2936","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/steps.ts":"2937","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/testHealth.ts":"2938","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/compliance/index.ts":"2939","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/compliance/noLog.ts":"2940","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/compliance/providerAudit.ts":"2941","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/compression/judgeModelClient.ts":"2942","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/config/hotReload.ts":"2943","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/config/runtimeSettings.ts":"2944","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/consoleInterceptor.ts":"2945","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/container.ts":"2946","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/contextWindowResolver.ts":"2947","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/codegraphKnowledge.ts":"2948","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/commandClassification.ts":"2949","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/engine.ts":"2950","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/systemPrompt.ts":"2951","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/tools.ts":"2952","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/credentialHealth/cache.ts":"2953","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/credentialHealth/scheduler.ts":"2954","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/dataPaths.ts":"2955","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/__tests__/quotaSnapshots.test.ts":"2956","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/_rowTypes.ts":"2957","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/accessTokens.ts":"2958","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/betterSqliteAdapter.ts":"2959","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/bunSqliteAdapter.ts":"2960","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/driverFactory.ts":"2961","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/nodeSqliteAdapter.ts":"2962","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/nodeSqliteShared.ts":"2963","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/sqljsAdapter.ts":"2964","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/types.ts":"2965","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/agentBridgeBypass.ts":"2966","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/agentBridgeMappings.ts":"2967","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/agentBridgeState.ts":"2968","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeyColumnFallbacks.ts":"2969","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeyContextSources.ts":"2970","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeyGroups.ts":"2971","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeyUsageLimitFields.ts":"2972","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeys/modelPermissions.ts":"2973","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeys/rowParsers.ts":"2974","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeys/types.ts":"2975","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeys.ts":"2976","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/autoCandidateOverrides.ts":"2977","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/backup.ts":"2978","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/batches.ts":"2979","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/callLogStats.ts":"2980","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/caseMapping.ts":"2981","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/ccDiscoveryAliases.ts":"2982","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/ccDiscoveryMetrics.ts":"2983","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/ccrBlocks.ts":"2984","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/cleanup/usagePurge.ts":"2985","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/cleanup.ts":"2986","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/cliToolState.ts":"2987","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/comboForecast.ts":"2988","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/combos.ts":"2989","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/commandCodeAuth.ts":"2990","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compression.ts":"2991","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionAnalytics.ts":"2992","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionCacheStats.ts":"2993","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionCombos.ts":"2994","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionContextBudget.ts":"2995","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionDetailNormalizers.ts":"2996","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionRunTelemetry.ts":"2997","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/contextHandoffs.ts":"2998","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/core.ts":"2999","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/creditBalance.ts":"3000","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/databaseSettings.ts":"3001","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/detailedLogs.ts":"3002","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/discovery.ts":"3003","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/discoveryResults.ts":"3004","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/domainState.ts":"3005","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/encryption.ts":"3006","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/evals.ts":"3007","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/featureFlags.ts":"3008","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/files.ts":"3009","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/freeProxies.ts":"3010","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/functionalGatewayMirrors.ts":"3011","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/gamification.ts":"3012","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/healthCheck.ts":"3013","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/inspectorCustomHosts.ts":"3014","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/inspectorSessions.ts":"3015","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/interceptionRules.ts":"3016","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/jsonMigration.ts":"3017","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/localCorpus.ts":"3018","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/memoryVec.ts":"3019","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/middleware.ts":"3020","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/migrationRunner/constants.ts":"3021","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/migrationRunner/extraDirs.ts":"3022","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/migrationRunner.ts":"3023","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/modelCapabilityOverrides.ts":"3024","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/modelComboMappings.ts":"3025","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/modelContextOverrides.ts":"3026","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/modelIntelligence.ts":"3027","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/activeSyncedCatalog.ts":"3028","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/aliases.ts":"3029","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/compat.ts":"3030","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/mitmAlias.ts":"3031","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/shared.ts":"3032","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/synced.ts":"3033","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models.ts":"3034","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/notion.ts":"3035","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/obsidian.ts":"3036","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/omp.ts":"3037","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/oneproxy.ts":"3038","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/optimizationSettings.ts":"3039","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/paramFilters.ts":"3040","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/playgroundPresets.ts":"3041","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/pluginMetrics.ts":"3042","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/plugins.ts":"3043","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/probeUtils.ts":"3044","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/prompts.ts":"3045","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providerLimits.ts":"3046","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providerNodeSelect.ts":"3047","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providerPlans.ts":"3048","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providerStats.ts":"3049","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/columns.ts":"3050","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/deletion.ts":"3051","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/lazyConnectionView.ts":"3052","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/migrations.ts":"3053","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/nodes.ts":"3054","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/rateLimit.ts":"3055","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/usageIdentityReconciliation.ts":"3056","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers.ts":"3057","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/guards.ts":"3058","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/mappers.ts":"3059","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/registryGeneration.ts":"3060","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/rotation.ts":"3061","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/types.ts":"3062","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies.ts":"3063","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxyLatency.ts":"3064","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxyLogs.ts":"3065","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxySubscriptions.ts":"3066","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaConsumption.ts":"3067","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaGroups.ts":"3068","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaModelCaps.ts":"3069","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaPools.ts":"3070","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaResetEvents.ts":"3071","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaSnapshots.ts":"3072","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/radar.ts":"3073","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/readCache.ts":"3074","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/reasoningCache.ts":"3075","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/reasoningRoutingRules.ts":"3076","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/recovery.ts":"3077","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/registeredKeys.ts":"3078","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/relayProbeStats.ts":"3079","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/relayProxies.ts":"3080","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/repositories/routingConfigRepositories.ts":"3081","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/repositories/sqliteComboRepository.ts":"3082","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/repositories/sqliteModelComboMappingRepository.ts":"3083","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/schemaColumns.ts":"3084","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/secrets.ts":"3085","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/semanticCache.ts":"3086","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/serviceModels.ts":"3087","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/sessionAccountAffinity.ts":"3088","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/cacheMetrics.ts":"3089","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/lkgp.ts":"3090","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/noAuthProxyFallback.ts":"3091","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/pricing.ts":"3092","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/shared.ts":"3093","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings.ts":"3094","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/skills.ts":"3095","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/stateReset.ts":"3096","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/stats.ts":"3097","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/syncTokens.ts":"3098","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/tierConfig.ts":"3099","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/tokenLimits.ts":"3100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/upstreamProxy.ts":"3101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/usageAnalytics/sources.ts":"3102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/usageAnalytics.ts":"3103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/usageLogs.ts":"3104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/usageSummary.ts":"3105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/vacuumScheduler.ts":"3106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/versionManager.ts":"3107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/webSessionDedup.ts":"3108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/webhookDeliveries.ts":"3109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/webhooks.ts":"3110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/discovery/index.ts":"3111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/display/names.ts":"3112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/display/useProviderNodeMap.ts":"3113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/docsI18nPath.ts":"3114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/docsSanitizer.ts":"3115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/embeddings/familyGuard.ts":"3116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/embeddings/service.ts":"3117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/env/runtimeEnv.ts":"3118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/evals/evalRunner/builtinSuites.ts":"3119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/evals/evalRunner.ts":"3120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/evals/runtime.ts":"3121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/events/eventBus.ts":"3122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/events/types.ts":"3123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProviderRankings.ts":"3124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProviderRankingsAuthType.ts":"3125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/index.ts":"3126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/iplocate.ts":"3127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/oneproxy.ts":"3128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/proxifly.ts":"3129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/scheduler.ts":"3130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/syncCycle.ts":"3131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/types.ts":"3132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/webshare.ts":"3133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/antiCheat.ts":"3134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/badges.ts":"3135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/events.ts":"3136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/index.ts":"3137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/invites.ts":"3138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/leaderboard.ts":"3139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/notifications.ts":"3140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/servers.ts":"3141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/sharing.ts":"3142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/streaks.ts":"3143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/xp.ts":"3144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gracefulShutdown.ts":"3145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/base.ts":"3146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/credentialMasker.ts":"3147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/index.ts":"3148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/piiMasker.ts":"3149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/promptInjection.ts":"3150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/registry.ts":"3151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/visionBridge.ts":"3152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/visionBridgeCredentials.ts":"3153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/visionBridgeHelpers.ts":"3154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/visionBridgeRouter.ts":"3155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/headroom/detect.ts":"3156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/headroom/process.ts":"3157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/idempotencyLayer.ts":"3158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/images/imageRouteModel.ts":"3159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/initCloudSync.ts":"3160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/agentBridgeMaintenanceApi.ts":"3161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/captureState.ts":"3162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/configPortability.ts":"3163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/harExport.ts":"3164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/matchesTrafficFilter.ts":"3165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/secretMask.ts":"3166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/tproxyCaptureApi.ts":"3167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/ipUtils.ts":"3168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/issueAgent/audit.ts":"3169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/issueAgent/execution.ts":"3170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/issueAgent/githubExport.ts":"3171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/issueAgent/recordedTriage.ts":"3172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/jobs/backupScheduleJob.ts":"3173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/jobs/budgetResetJob.ts":"3174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/jobs/cronMatch.ts":"3175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/jobs/reasoningCacheCleanupJob.ts":"3176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/localCorpus/configured.ts":"3177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/localCorpus/index.ts":"3178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/localDb.ts":"3179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/localHealthCheck.ts":"3180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/logEnv.ts":"3181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/logPayloads.ts":"3182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/logRotation.ts":"3183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/machineToken.ts":"3184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/generic-backend.test.ts":"3185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/injection.test.ts":"3186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/qdrant-wiring.test.ts":"3187","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/retrieval.test.ts":"3188","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/schemas.test.ts":"3189","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/backend.ts":"3190","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/cache.ts":"3191","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/cache.ts":"3192","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/index.ts":"3193","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/remote.ts":"3194","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/staticPotion.ts":"3195","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/transformersLocal.ts":"3196","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/types.ts":"3197","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/extraction.ts":"3198","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/genericBackend.ts":"3199","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/index.ts":"3200","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/injection.ts":"3201","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/manager.ts":"3202","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/obsidianBackend.ts":"3203","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/qdrant.ts":"3204","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/reindex.ts":"3205","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/retrieval/scoring.ts":"3206","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/retrieval.ts":"3207","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/schemas.ts":"3208","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/settings.ts":"3209","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/sqliteBackend.ts":"3210","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/store.ts":"3211","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/summarization.ts":"3212","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/typedDecay.ts":"3213","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/types.ts":"3214","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/vectorStore.ts":"3215","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/verify.ts":"3216","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/middleware/cliTokenAuth.ts":"3217","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/middleware/registry.ts":"3218","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/middleware/types.ts":"3219","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelAliasResolver.ts":"3220","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelAliasSeed.ts":"3221","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelCapabilities.ts":"3222","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelMetadataRegistry.ts":"3223","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelsDevSync/transform.ts":"3224","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelsDevSync.ts":"3225","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/monitoring/comboHealthAutopilot.ts":"3226","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/monitoring/observability.ts":"3227","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/monitoring/providerHealthAutopilot.ts":"3228","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/monitoring/providerHealthMatrix.ts":"3229","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/ngrokTunnel.ts":"3230","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/notion/api.ts":"3231","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/codexDeviceFlow.ts":"3232","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/config/index.ts":"3233","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/connectionPersistence.ts":"3234","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/constants/oauth.ts":"3235","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/credentialBlob.ts":"3236","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/deviceFlowTickets.ts":"3237","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/gitlab.ts":"3238","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/kiroConnectionIdentity.ts":"3239","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/kiroSocialPoll.ts":"3240","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/pasteCredentials.ts":"3241","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/agy.ts":"3242","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/antigravity.ts":"3243","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/claude.ts":"3244","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/cline.ts":"3245","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/codebuddy-cn.ts":"3246","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/codex.ts":"3247","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/cursor.ts":"3248","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/ghe-copilot.ts":"3249","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/github.ts":"3250","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/gitlab-duo.ts":"3251","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/grok-cli-oauth.ts":"3252","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/grok-cli.ts":"3253","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/index.ts":"3254","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/kilocode.ts":"3255","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/kimi-coding.ts":"3256","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/kiro.ts":"3257","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/qoder.ts":"3258","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/raycast.ts":"3259","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/trae.ts":"3260","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/windsurf.ts":"3261","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/xai-oauth.ts":"3262","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/zed-hosted.ts":"3263","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/zed.ts":"3264","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers.ts":"3265","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/codexImport.ts":"3266","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/cursor.ts":"3267","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/kiro.ts":"3268","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/raycast.ts":"3269","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/raycastLocal.ts":"3270","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/agyAuthImport.ts":"3271","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/banner.ts":"3272","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/claudeAuthFile.ts":"3273","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/claudeAuthImport.ts":"3274","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/claudeAuthZipExtract.ts":"3275","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/cliProxyAuthImport.ts":"3276","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexAuthFile.ts":"3277","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexAuthImport.ts":"3278","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexAuthZipExtract.ts":"3279","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexConnectionSelection.ts":"3280","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexSessionImport.ts":"3281","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/googleLoopbackHint.ts":"3282","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/grokCliAuthJson.ts":"3283","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/jsonZipExtract.ts":"3284","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/loopbackTunnel.ts":"3285","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/pkce.ts":"3286","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/pkceLoopbackWarning.ts":"3287","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/server.ts":"3288","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/ui.ts":"3289","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/obsidian/api.ts":"3290","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/obsidianSync.ts":"3291","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oneproxyRotator.ts":"3292","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oneproxySync.ts":"3293","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/piiSanitizer.ts":"3294","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/playground/codeExport.ts":"3295","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/playground/promptImprover.ts":"3296","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/playground/streamMetrics.ts":"3297","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/playground/types.ts":"3298","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/devMode.ts":"3299","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/doctor.ts":"3300","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/errors.ts":"3301","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/hooks.ts":"3302","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/index.ts":"3303","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/loader.ts":"3304","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/logger.ts":"3305","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/manager.ts":"3306","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/manifest.ts":"3307","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/marketplace.ts":"3308","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/scanner.ts":"3309","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/sdk.ts":"3310","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/testRunner.ts":"3311","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/watcher.ts":"3312","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/pricingSync.ts":"3313","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/promptCache/index.ts":"3314","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/promptCache/prefixAnalyzer.ts":"3315","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/cursorAgent.ts":"3316","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/geminiModelsParser.ts":"3317","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/managedAvailableModels.ts":"3318","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/managedModelImport.ts":"3319","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/modelDiscovery.ts":"3320","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/catalog.ts":"3321","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/claudeExtraUsage.ts":"3322","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/claudeFastMode.ts":"3323","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/codexConnectionDefaults.ts":"3324","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/codexFastTier.ts":"3325","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/imageValidation.ts":"3326","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/managedAvailableModels.ts":"3327","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/modelListingCapability.ts":"3328","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/nvidiaValidationModel.ts":"3329","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/requestDefaults.ts":"3330","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/serviceKindIndex.ts":"3331","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/staticModels.ts":"3332","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/anthropicFormat.ts":"3333","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/audioMiscProviders.ts":"3334","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/cloudProviders.ts":"3335","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/cozeError.ts":"3336","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/directChatProbe.ts":"3337","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/embeddingProviders.ts":"3338","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/headers.ts":"3339","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/kiro.ts":"3340","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/metaAi.ts":"3341","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/openaiFormat.ts":"3342","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/searchProviders.ts":"3343","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/specialtyInline.ts":"3344","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/transport.ts":"3345","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/urlHelpers.ts":"3346","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/webCookie.ts":"3347","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/webProvidersA.ts":"3348","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/webProvidersB.ts":"3349","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation.ts":"3350","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/webCookieAuth.ts":"3351","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/thinking.ts":"3352","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/translators/claude.ts":"3353","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/translators/gemini.ts":"3354","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/translators/openai-chat.ts":"3355","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/translators/openai-responses.ts":"3356","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyEgress.ts":"3357","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyHealth/decision.ts":"3358","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyHealth/scheduler.ts":"3359","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyHealth/statusPolicy.ts":"3360","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyHealth.ts":"3361","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyLogger.ts":"3362","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyRelay/cloudflareWorkerScript.ts":"3363","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/coreEndpoint.ts":"3364","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/due.ts":"3365","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/fetchGuard.ts":"3366","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/fetchRetry.ts":"3367","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/index.ts":"3368","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/needsCore.ts":"3369","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/parse.ts":"3370","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/schema.ts":"3371","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/scopes.ts":"3372","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/subscriptionService.ts":"3373","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/url.ts":"3374","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/QuotaStore.ts":"3375","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/accountBuckets.ts":"3376","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/burnRate.ts":"3377","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/connectionProvider.ts":"3378","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/connectionRecovery.ts":"3379","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/dimensions.ts":"3380","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/enforce.ts":"3381","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/fairShare.ts":"3382","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/planRegistry.ts":"3383","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/planResolver.ts":"3384","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/quotaCombos.ts":"3385","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/quotaKey.ts":"3386","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/quotaModelNaming.ts":"3387","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/redisQuotaStore.ts":"3388","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/saturationSignals.ts":"3389","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/spendRecorder.ts":"3390","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/sqliteQuotaStore.ts":"3391","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/storeFactory.ts":"3392","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/types.ts":"3393","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/applyFeed.ts":"3394","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/feedSchema.ts":"3395","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/index.ts":"3396","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/pinnedKeys.ts":"3397","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/sync.ts":"3398","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/verify.ts":"3399","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/reasoningRouting/input.ts":"3400","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/reasoningRouting/policy.ts":"3401","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/resilience/modelLockoutSettings.ts":"3402","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/resilience/settings/normalize.ts":"3403","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/resilience/settings/types.ts":"3404","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/resilience/settings.ts":"3405","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/routerEval/index.ts":"3406","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/runtime/ports.ts":"3407","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/search/executeWebSearch.ts":"3408","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/security/localEndpoints.ts":"3409","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/semanticCache.ts":"3410","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/serverLifecycle.ts":"3411","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/ServiceSupervisor.ts":"3412","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/apiKey.ts":"3413","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/bootstrap.ts":"3414","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/embedPath.ts":"3415","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/embedWsProxy.ts":"3416","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/healthCheck.ts":"3417","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/htmlRewriter.ts":"3418","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/bifrost.ts":"3419","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/cliproxy.ts":"3420","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/dario.ts":"3421","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/mux.ts":"3422","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/ninerouter.stub.ts":"3423","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/ninerouter.ts":"3424","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/utils.ts":"3425","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/modelSync.ts":"3426","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/portProbe.ts":"3427","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/providerPlugins/registry.ts":"3428","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/providerPlugins/types.ts":"3429","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/quotaAutoPing.ts":"3430","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/registry.ts":"3431","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/reverseProxy.ts":"3432","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/ringBuffer.ts":"3433","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/serviceBackends.ts":"3434","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/types.ts":"3435","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/__tests__/integration.test.ts":"3436","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/a2a.ts":"3437","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/builtin/browser.ts":"3438","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/builtins.ts":"3439","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/containerProvider.ts":"3440","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/custom.ts":"3441","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/executor.ts":"3442","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/githubCollector.ts":"3443","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/hybrid.ts":"3444","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/injection.ts":"3445","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/interception.ts":"3446","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/providerSettings.ts":"3447","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/registry.ts":"3448","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/sandbox.ts":"3449","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/schemas.ts":"3450","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/skillssh.ts":"3451","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/types.ts":"3452","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/webFetchExecution.ts":"3453","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/source.ts":"3454","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/spend/batchWriter.ts":"3455","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/sseTextTransform.ts":"3456","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/streamingPiiTransform.ts":"3457","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/sync/bundle.ts":"3458","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/sync/tokens.ts":"3459","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/system/autoUpdate.ts":"3460","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/system/globalPackagePath.ts":"3461","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/system/versionCheck.ts":"3462","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/system/versionCompare.ts":"3463","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/tailscaleTunnel.ts":"3464","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/tokenHealthCheck.ts":"3465","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/tokenHealthCheckCopilot.ts":"3466","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/toolPolicy.ts":"3467","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/translator/streamTransform.ts":"3468","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/translatorEvents.ts":"3469","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/accountIdentity.ts":"3470","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/aggregateHistory.ts":"3471","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/apiKeySelfService.ts":"3472","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/apiKeyUsageLimits.ts":"3473","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/cacheHealth.ts":"3474","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogApiKeyContext.ts":"3475","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogArtifacts.ts":"3476","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogs/format.ts":"3477","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogs.ts":"3478","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogsBoundedQueries.ts":"3479","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/codexResetCredits.ts":"3480","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/comboForecast.ts":"3481","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/comboHealth.ts":"3482","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/comboHealthDashboard.ts":"3483","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/comboScoringInspector.ts":"3484","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/completedRequestDetails.ts":"3485","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/costCalculator.ts":"3486","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/fetcher.ts":"3487","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/flatRateProviders.ts":"3488","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/internalUsageCommand.ts":"3489","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/migrations.ts":"3490","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/pendingRequestScope.ts":"3491","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerDisplayNames.ts":"3492","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerLimits/chunkedSpacingSync.ts":"3493","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerLimits/quotaNormalize.ts":"3494","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerLimits.ts":"3495","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerLimitsCache.ts":"3496","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerWindowCosts.ts":"3497","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/resilienceExplain.ts":"3498","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/routeExplain.ts":"3499","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/tokenAccounting.ts":"3500","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/usageEvents.ts":"3501","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/usageHistory/helpers.ts":"3502","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/usageHistory.ts":"3503","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/usageStats.ts":"3504","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usageAnalytics.ts":"3505","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usageDb.ts":"3506","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/binaryManager.ts":"3507","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/healthMonitor.ts":"3508","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/index.ts":"3509","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/processManager.ts":"3510","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/releaseChecker.ts":"3511","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vncSession/harvest.ts":"3512","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vncSession/manifest.ts":"3513","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vncSession/service.ts":"3514","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/familyFirstModelIds.ts":"3515","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/modelPresentation.ts":"3516","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/reasoningMetadata.ts":"3517","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/serviceTierVariants.ts":"3518","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/tokenizedRequest.ts":"3519","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhookDispatcher.ts":"3520","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhooks/eventDescriptions.ts":"3521","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhooks/integrations/discord.ts":"3522","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhooks/integrations/slack.ts":"3523","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhooks/integrations/telegram.ts":"3524","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/ws/handshake.ts":"3525","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/confirmedAccounts.ts":"3526","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/credentialFingerprint.ts":"3527","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/dockerDetect.ts":"3528","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/importUtils.ts":"3529","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/keychain-reader.stub.ts":"3530","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/keychain-reader.ts":"3531","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/middleware/promptInjectionGuard.ts":"3532","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/aliasConfig.cjs":"3533","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/bypass.cjs":"3534","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/forwardTarget.cjs":"3535","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/ingest.cjs":"3536","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/rootCaShim.cjs":"3537","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/standaloneRouting.cjs":"3538","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/aliasConfig.ts":"3539","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/generate.ts":"3540","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/install.stub.ts":"3541","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/install.ts":"3542","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/migration.ts":"3543","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/rootCa.ts":"3544","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/dataDir.ts":"3545","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/antigravity.ts":"3546","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/claudeCode.ts":"3547","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/codex.ts":"3548","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/copilot.ts":"3549","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/cursor.ts":"3550","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/index.ts":"3551","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/kiro.ts":"3552","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/openCode.ts":"3553","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/zed.ts":"3554","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/dns/dnsConfig.ts":"3555","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/dns/provision.ts":"3556","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/antigravity.ts":"3557","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/base.ts":"3558","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/claudeCode.ts":"3559","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/codex.ts":"3560","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/copilot.ts":"3561","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/cursor.ts":"3562","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/kiro.ts":"3563","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/openCode.ts":"3564","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/trae.ts":"3565","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/zed.ts":"3566","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/agentBridgeHook.ts":"3567","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/buffer.ts":"3568","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/contextKey.ts":"3569","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/conversationNormalizer.ts":"3570","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/diagnostics.ts":"3571","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/httpProxyServer.ts":"3572","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/kindDetector.ts":"3573","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/llmMetadataExtractor.ts":"3574","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/pricing.ts":"3575","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/processAttribution.ts":"3576","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/sseMerger.ts":"3577","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/systemProxyConfig.ts":"3578","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/types.ts":"3579","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/manager.runtime.ts":"3580","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/manager.stub.ts":"3581","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/manager.ts":"3582","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/maskSecrets.ts":"3583","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/passthrough.ts":"3584","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/privilegedMitmStep.ts":"3585","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/repair.ts":"3586","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/sanitizeHeaders.ts":"3587","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/server.cjs":"3588","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/socketTimeouts.ts":"3589","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/stopDnsTeardown.ts":"3590","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/sudoGate.ts":"3591","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/systemCommands.ts":"3592","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/antigravity.ts":"3593","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/claudeCode.ts":"3594","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/codex.ts":"3595","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/copilot.ts":"3596","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/cursor.ts":"3597","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/ghe-copilot.ts":"3598","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/index.ts":"3599","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/kiro.ts":"3600","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/openCode.ts":"3601","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/trae.ts":"3602","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/zed.ts":"3603","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/caTrust.ts":"3604","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/captureManager.ts":"3605","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/captureMode.ts":"3606","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/commands.ts":"3607","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/dynamicCert.ts":"3608","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/setup.ts":"3609","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/tlsCapture.ts":"3610","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/transparentSocket.ts":"3611","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/types.ts":"3612","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/upstreamTrust.ts":"3613","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/models/index.ts":"3614","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/proxy.ts":"3615","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/scripts/backfillAggregation.ts":"3616","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/auth/loginGuard.ts":"3617","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/accessScopes.ts":"3618","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/accessTokenAuth.ts":"3619","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/assertAuth.ts":"3620","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/classify.ts":"3621","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/context.ts":"3622","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/csrf.ts":"3623","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/headers.ts":"3624","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/peerStamp.ts":"3625","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/pipeline.ts":"3626","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/policies/clientApi.ts":"3627","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/policies/management.ts":"3628","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/policies/public.ts":"3629","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/routeGuard.ts":"3630","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/types.ts":"3631","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/cors/origins.ts":"3632","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/origin/publicOrigin.ts":"3633","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/ws/liveServer.ts":"3634","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/ws/liveServerAllowList.ts":"3635","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/ws/types.ts":"3636","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server-init.ts":"3637","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Avatar.tsx":"3638","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Badge.tsx":"3639","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/BasePathNetworkProvider.tsx":"3640","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Breadcrumbs.tsx":"3641","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Button.tsx":"3642","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Card.tsx":"3643","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Checkbox.tsx":"3644","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/CloudSyncStatus.tsx":"3645","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Collapsible.tsx":"3646","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/CollapsibleSection.tsx":"3647","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ColumnToggle.tsx":"3648","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/CommandPalette.tsx":"3649","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ConsoleLogViewer.tsx":"3650","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/CursorAuthModal.tsx":"3651","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/DataTable.tsx":"3652","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/DegradationBadge.tsx":"3653","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/DistributeProxiesButton.test.tsx":"3654","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/DistributeProxiesButton.tsx":"3655","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/EmptyState.tsx":"3656","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ErrorPageScaffold.tsx":"3657","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/FilterBar.tsx":"3658","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Footer.tsx":"3659","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Header.tsx":"3660","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/InfoTooltip.tsx":"3661","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Input.tsx":"3662","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/KiroAuthModal.tsx":"3663","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/KiroOAuthWrapper.tsx":"3664","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/KiroSocialOAuthModal.tsx":"3665","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/LanguageSelector.tsx":"3666","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/LinkifiedText.tsx":"3667","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Loading.tsx":"3668","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/LocaleAutoDetect.tsx":"3669","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/MaintenanceBanner.tsx":"3670","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ManualConfigModal.tsx":"3671","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Modal.tsx":"3672","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ModelRoutingSection.tsx":"3673","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ModelSelectField.tsx":"3674","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ModelSelectModal.tsx":"3675","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/MonacoEditor.tsx":"3676","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NavigationProgress.tsx":"3677","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NoAuthAccountCard.tsx":"3678","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NoAuthProviderCard.tsx":"3679","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NoAuthProviderToggle.tsx":"3680","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NotificationToast.tsx":"3681","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/OAuthModal.tsx":"3682","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/OAuthModalPanels.tsx":"3683","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/OmniRouteLogo.tsx":"3684","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/PresetSlider.tsx":"3685","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/PricingModal.tsx":"3686","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProviderCooldownCard.test.tsx":"3687","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProviderIcon.tsx":"3688","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProviderTestSlideOver.tsx":"3689","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProxyConfigModal.tsx":"3690","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProxyLogDetail.tsx":"3691","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProxyLogger.tsx":"3692","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/PwaRegister.tsx":"3693","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RaycastAuthModal.tsx":"3694","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ReasoningRoutingRules.tsx":"3695","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RequestLoggerDetail.tsx":"3696","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RequestLoggerV2.tsx":"3697","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RequestTimeline.tsx":"3698","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RiskNoticeModal.tsx":"3699","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/SegmentedControl.tsx":"3700","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Select.tsx":"3701","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Sidebar.search.test.tsx":"3702","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Sidebar.tsx":"3703","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/SkillsConceptCard.tsx":"3704","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/SystemMonitor.tsx":"3705","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Textarea.tsx":"3706","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ThemeProvider.tsx":"3707","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ThemeToggle.tsx":"3708","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Toggle.tsx":"3709","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/TokenHealthBadge.tsx":"3710","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Tooltip.tsx":"3711","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/TraeAuthModal.tsx":"3712","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/UsageAnalytics.tsx":"3713","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/UsageStats.tsx":"3714","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/ApiKeyFilterDropdown.tsx":"3715","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/CustomRangePicker.tsx":"3716","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/ModelTable.tsx":"3717","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/RequestCountByProviderDateTable.tsx":"3718","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/RequestCountDateFilter.tsx":"3719","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/RequestCountTable.tsx":"3720","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/TimeRangeSelector.tsx":"3721","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/chartColors.ts":"3722","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/charts.tsx":"3723","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/index.tsx":"3724","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/modelBreakdownSort.ts":"3725","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/rechartsCore.tsx":"3726","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/rechartsDonuts.tsx":"3727","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/rechartsUsageCharts.tsx":"3728","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/requestCountSort.ts":"3729","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/useProviderDailyUsage.ts":"3730","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/cli/CliComparisonCard.tsx":"3731","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/cli/CliConceptCard.tsx":"3732","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/cli/CliToolCard.tsx":"3733","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/cli/index.ts":"3734","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/ComboCompressionModeSelect.tsx":"3735","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/CompressionPipelineEditor.tsx":"3736","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/EngineConfigForm.tsx":"3737","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/EngineConfigPage.tsx":"3738","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/compressionPipelineModel.ts":"3739","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/APIReference.stories.tsx":"3740","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/APIReference.tsx":"3741","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/Callout.stories.tsx":"3742","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/Callout.tsx":"3743","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/CodeBlock.stories.tsx":"3744","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/CodeBlock.tsx":"3745","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsBreadcrumbs.stories.tsx":"3746","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsBreadcrumbs.tsx":"3747","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsSidebar.stories.tsx":"3748","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsSidebar.tsx":"3749","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsThemeProvider.tsx":"3750","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/Tabs.stories.tsx":"3751","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/Tabs.tsx":"3752","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/tokens.ts":"3753","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/flow/FlowCanvas.tsx":"3754","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/flow/StatusDot.tsx":"3755","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/flow/edgeStyles.ts":"3756","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/index.tsx":"3757","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/layouts/AuthLayout.tsx":"3758","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/layouts/DashboardLayout.tsx":"3759","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/layouts/index.tsx":"3760","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/lobeProviderIcons.ts":"3761","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/logTableStyles.ts":"3762","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/modelSelectModalHelpers.ts":"3763","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthBlobSubmit.ts":"3764","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthModal/GheConfigStep.tsx":"3765","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthModal/GitlabDuoSetupStep.tsx":"3766","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthModal/OAuthErrorStep.tsx":"3767","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthModal/OAuthWaitingStep.tsx":"3768","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/proxyAssignment.test.tsx":"3769","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/proxyAssignment.ts":"3770","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/requestLoggerPreferences.ts":"3771","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/requestLoggerSignature.ts":"3772","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/agentSkills.ts":"3773","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/alibabaProviderRegions.ts":"3774","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/antigravityClientProfile.ts":"3775","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/apiKeyPolicyScopes.ts":"3776","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/appConfig.ts":"3777","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/batch.ts":"3778","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/batchEndpoints.ts":"3779","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/bodySize.ts":"3780","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/claudeCodeClient.ts":"3781","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/cliCompatProviders.ts":"3782","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/cliTools.ts":"3783","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/cliToolsGrokBuild.ts":"3784","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/clientIdentityProfiles.ts":"3785","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/codexClient.ts":"3786","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/colors.ts":"3787","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/comboConfigMode.ts":"3788","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/config.ts":"3789","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/dashboardCsrf.ts":"3790","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/endpointCategories.ts":"3791","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/errorCodes.ts":"3792","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/featureFlagDefinitions.ts":"3793","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/gitlabDuoSetupMessage.ts":"3794","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/headers.ts":"3795","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/homeWidgets.ts":"3796","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/index.ts":"3797","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/managementScopes.ts":"3798","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/mcpScopes.ts":"3799","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/mitmToolHosts.ts":"3800","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/modal.ts":"3801","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/modelCompat.ts":"3802","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/modelSpecs.ts":"3803","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/models.ts":"3804","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/openRouterPreset.ts":"3805","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/default-pricing.ts":"3806","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/frontier-labs.ts":"3807","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/inference-hosts.ts":"3808","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/oauth-subscriptions.ts":"3809","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/regional.ts":"3810","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/shared-tiers.ts":"3811","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing.ts":"3812","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/enterprise-cloud.ts":"3813","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/frontier-labs.ts":"3814","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/gateways.ts":"3815","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/index.ts":"3816","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/inference-hosts.ts":"3817","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/regional.ts":"3818","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/specialty-media.ts":"3819","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/audio.ts":"3820","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/cloud-agent.ts":"3821","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/local.ts":"3822","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/noauth.ts":"3823","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/oauth.ts":"3824","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/search.ts":"3825","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/system.ts":"3826","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/upstream-proxy.ts":"3827","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/web-cookie.ts":"3828","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers.ts":"3829","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/publicApiRoutes.ts":"3830","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/quotaAutoPing.ts":"3831","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/responsesPreviousResponseId.ts":"3832","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/routingStrategies.ts":"3833","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/selfServiceScopes.ts":"3834","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/serviceKinds.ts":"3835","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/sidebarGroupVisibility.ts":"3836","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/sidebarVisibility/sections.ts":"3837","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/sidebarVisibility/types.ts":"3838","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/sidebarVisibility.ts":"3839","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/spawnCapablePrefixes.ts":"3840","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/statusColors.ts":"3841","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/upstreamHeaders.ts":"3842","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/visionBridgeDefaults.ts":"3843","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/visionModels.ts":"3844","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/contracts/quota.ts":"3845","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/__tests__/useDisplayBaseUrl.test.tsx":"3846","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/cli/useToolBatchStatuses.ts":"3847","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/index.ts":"3848","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/useCopyToClipboard.ts":"3849","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/useDisplayBaseUrl.ts":"3850","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/useElectron.ts":"3851","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/useTheme.ts":"3852","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/http/apiErrorMessage.ts":"3853","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/lib/persistLocale.ts":"3854","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/middleware/bodySizeGuard.ts":"3855","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/middleware/chatBodyAdmission.ts":"3856","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/middleware/correlationId.ts":"3857","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/middleware/requireJsonContentType.ts":"3858","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/network/outboundUrlGuard.ts":"3859","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/network/outboundUrlGuardPolicy.ts":"3860","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/network/remoteImageFetch.ts":"3861","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/network/safeOutboundFetch.ts":"3862","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/platform/windowsProcess.ts":"3863","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/providers/webSessionCredentials.ts":"3864","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/reasoning/effortStandardization.ts":"3865","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/resilience/peerRouting.ts":"3866","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/agentBridge.ts":"3867","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/cliCatalog.ts":"3868","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/inspector.ts":"3869","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/memory.ts":"3870","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/playground.ts":"3871","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/qdrant.ts":"3872","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/quota.ts":"3873","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/searchTools.ts":"3874","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/validation.ts":"3875","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/apiKeyResolver.ts":"3876","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/backupService.ts":"3877","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/claudeCliConfig.ts":"3878","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliInstallFallback.ts":"3879","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliRuntime.ts":"3880","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliRuntimeGrokBuild.ts":"3881","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliRuntimeHealthcheckPath.ts":"3882","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliRuntimeKnownPath.ts":"3883","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cloudSyncScheduler.ts":"3884","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/codexCatalogRevalidation.ts":"3885","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/codexDiscoveryPolicy.ts":"3886","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/droidCustomModels.ts":"3887","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/initializeCloudSync.ts":"3888","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/loginShellPath.ts":"3889","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/modelSyncScheduler.ts":"3890","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/opencodeConfig.ts":"3891","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/providerLimitsSyncScheduler.ts":"3892","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/qwenCodeConfig.ts":"3893","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/types/cliBatchStatus.ts":"3894","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/types/index.ts":"3895","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/types/pagination.ts":"3896","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/types/utilization.ts":"3897","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/a11yAudit.ts":"3898","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/api.ts":"3899","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/apiAuth.ts":"3900","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/apiKey.ts":"3901","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/apiKeyPolicy.ts":"3902","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/apiResponse.ts":"3903","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/basePath.ts":"3904","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/basePathFetch.ts":"3905","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/bulkApiKeyParser.ts":"3906","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/circuitBreaker.ts":"3907","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/classify429.ts":"3908","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/cliCompat.ts":"3909","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/clientApiRouteAuth.ts":"3910","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/clineAuth.ts":"3911","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/clipboard.ts":"3912","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/cloud.ts":"3913","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/cn.ts":"3914","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/codexBaseUrl.ts":"3915","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/codexConfig.ts":"3916","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/compatibleProviderId.ts":"3917","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/compressionHeaderEcho.ts":"3918","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/connectionStatus.ts":"3919","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/cors.ts":"3920","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/costEstimator.ts":"3921","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/dashboardCsrf.ts":"3922","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/envBoolean.ts":"3923","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/featureFlags.ts":"3924","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/fetchError.ts":"3925","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/fetchTimeout.ts":"3926","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/formatting.ts":"3927","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/freeModels.ts":"3928","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/globPattern.ts":"3929","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/grokBilling.ts":"3930","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/index.ts":"3931","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/injectionSeverity.ts":"3932","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/inputSanitizer.ts":"3933","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/linkify.ts":"3934","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/logRedaction.ts":"3935","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/logger.ts":"3936","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/machine.ts":"3937","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/machineId.ts":"3938","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/maskEmail.ts":"3939","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/modelCatalogSearch.ts":"3940","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/noAuthProviders.ts":"3941","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/nodeRuntimeSupport.ts":"3942","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/numeric.ts":"3943","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/parseApiKeys.ts":"3944","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerConnectionStatus.ts":"3945","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerCredentialRequirement.ts":"3946","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerDisplayLabel.ts":"3947","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerFallbackColor.ts":"3948","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerHints.ts":"3949","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerModelAliases.ts":"3950","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerQuotaVisibility.ts":"3951","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/rateLimiter.ts":"3952","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/releaseNotes.ts":"3953","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/requestId.ts":"3954","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/requestTelemetry.ts":"3955","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/requestTimeout.ts":"3956","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/resolveOmniRouteBaseUrl.ts":"3957","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/runtimeTimeouts.ts":"3958","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/secretsValidator.ts":"3959","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/secureRandom.ts":"3960","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/serviceTierLabels.ts":"3961","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/shuffleDeck.ts":"3962","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/sidebarExpansionState.ts":"3963","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/sidebarRouteMatch.ts":"3964","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/sidebarSearch.ts":"3965","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/streamTracker.ts":"3966","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/structuredLogger.ts":"3967","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/testProcess.ts":"3968","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/tiktokenCounter.ts":"3969","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/turkishText.ts":"3970","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/upstreamError.ts":"3971","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/wsPath.ts":"3972","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/compressionConfigSchemas.ts":"3973","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/freeProxySchemas.ts":"3974","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/helpers.ts":"3975","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/oneproxySchemas.ts":"3976","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/providerSchema.ts":"3977","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/providerSpecificData.ts":"3978","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/apiV1.ts":"3979","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/auth.ts":"3980","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/cli.ts":"3981","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/cloud.ts":"3982","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/combo.ts":"3983","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/evals.ts":"3984","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/gemini.ts":"3985","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/keys.ts":"3986","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/misc.ts":"3987","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/payloadRules.ts":"3988","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/pricing.ts":"3989","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/provider.ts":"3990","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/proxy.ts":"3991","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/reasoningRouting.ts":"3992","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/routing.ts":"3993","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/settings.ts":"3994","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/translator.ts":"3995","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas.ts":"3996","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/settingsSchemas.ts":"3997","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/autoRouting.ts":"3998","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chat/clientRawRequest.ts":"3999","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chat.ts":"4000","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chatAdmission.ts":"4001","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chatHelpers.ts":"4002","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chatPredicates.ts":"4003","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/comboFailureLogging.ts":"4004","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/reasoningRouting.ts":"4005","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/rejectedRequestUsage.ts":"4006","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/requestBody.ts":"4007","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/resolveRoutingModel.ts":"4008","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/auth.ts":"4009","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/cooldownAwareRetry.ts":"4010","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/googApiKeyAuth.ts":"4011","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/headerReader.ts":"4012","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/imageCredentialRetry.ts":"4013","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/model.ts":"4014","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/noAuthProviderSettings.ts":"4015","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/noAuthProviderSiblings.ts":"4016","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/noAuthProxyResolution.ts":"4017","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/requestResourceHealth.ts":"4018","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/sessionAffinityPin.ts":"4019","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/streamState.ts":"4020","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/tokenRefresh.ts":"4021","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/utils/backpressure.ts":"4022","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/utils/logger.ts":"4023","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/store/emailPrivacyStore.ts":"4024","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/store/index.ts":"4025","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/store/notificationStore.ts":"4026","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/store/themeStore.ts":"4027","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/databaseSettings.ts":"4028","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/global.d.ts":"4029","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/index.ts":"4030","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/provider.ts":"4031","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/sqljs.d.ts":"4032","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_cp_mock_hook.mts":"4033","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_cp_mock_module.mts":"4034","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_helpers/readSrc.ts":"4035","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_setup/isolateDataDir.ts":"4036","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_setup/vitestUiPolyfills.ts":"4037","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/benchmarks/pipeline-accuracy.test.ts":"4038","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/gemini-double-escaping.live.test.ts":"4039","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/gemini-midstream-503-e2e.live.test.ts":"4040","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/gemma4-multiturn.live.test.ts":"4041","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/gemma4-newline-investigation.live.test.ts":"4042","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/openclaw-omniroute-tool-boundary.live.test.ts":"4043","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/a11y-resilience.spec.ts":"4044","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/a11y.spec.ts":"4045","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/agent-bridge-traffic-cross.spec.ts":"4046","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/agent-bridge.spec.ts":"4047","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/agent-skills-page.spec.ts":"4048","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/analytics-tabs.spec.ts":"4049","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/api-keys-flow.spec.ts":"4050","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/api.spec.ts":"4051","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/combo-live-studio.spec.ts":"4052","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/combo-unification.spec.ts":"4053","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/combos-flow.spec.ts":"4054","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/compression-studio.spec.ts":"4055","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/ecosystem.test.ts":"4056","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/error-pages.spec.ts":"4057","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/group-b-activity-feed.spec.ts":"4058","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/group-b-quota-plans-config.spec.ts":"4059","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/group-b-quota-share-pools.spec.ts":"4060","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/group-b-redirect-logs-activity.spec.ts":"4061","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/helpers/dashboardAuth.ts":"4062","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/helpers/mockUpstreamServer.ts":"4063","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/memory-engine.spec.ts":"4064","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/memory-qdrant-routes.spec.ts":"4065","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/memory-settings.spec.ts":"4066","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/navigation.spec.ts":"4067","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/playground-compare.spec.ts":"4068","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/playground-studio.spec.ts":"4069","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/protocol-clients.test.ts":"4070","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/protocol-visibility.spec.ts":"4071","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/providers-bailian-coding-plan.spec.ts":"4072","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/providers-management.spec.ts":"4073","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/proxy-registry.smoke.spec.ts":"4074","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/resilience-plan-alignment.spec.ts":"4075","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/responsive.spec.ts":"4076","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/responsiveSpecs.ts":"4077","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/search-tools-studio.spec.ts":"4078","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/settings-toggles.spec.ts":"4079","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/skills-marketplace.spec.ts":"4080","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/smoke.spec.ts":"4081","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/system-failover.test.ts":"4082","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/traffic-inspector.spec.ts":"4083","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/translator-friendly.spec.ts":"4084","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/visual-resilience-smoke.spec.ts":"4085","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/compression/session-dedup-memory-7849.ts":"4086","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/devin-bridge/e2e-workspace/.claude/hooks/log-tool.mjs":"4087","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/devin-bridge/e2e-workspace/math.js":"4088","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/devin-bridge/e2e-workspace/math.test.js":"4089","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/sanitizerFixtures.ts":"4090","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/welcome-banner-plugin/index.mjs":"4091","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/golden-set/compression-caveman-v2.test.ts":"4092","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/golden-set/compression-quality.test.ts":"4093","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/golden-set/compression-savings.test.ts":"4094","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/golden-set/compression-upstream-parity.test.ts":"4095","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/fakeUpstreamStream.ts":"4096","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/faultyUpstream.ts":"4097","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/goldenSnapshot.ts":"4098","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/managementSession.ts":"4099","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/persistence/comboRepositoryConformance.ts":"4100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/propertyConfig.ts":"4101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/translationFixtures.ts":"4102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/homolog/ui/api-key-flow.spec.ts":"4103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/homolog/ui/auth.setup.ts":"4104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/homolog/ui/playwright.config.ts":"4105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/homolog/ui/routes.spec.ts":"4106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/_chatPipelineCallLogs.ts":"4107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/_chatPipelineHarness.ts":"4108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/_comboRoutingHarness.ts":"4109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/active-request-completion.test.ts":"4110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-bridge-bypass-flow.test.ts":"4111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-bridge-cert-flow.test.ts":"4112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-bridge-mappings.test.ts":"4113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-bridge-routes.test.ts":"4114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-skills-content.test.ts":"4115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-skills-discovery.test.ts":"4116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/aihorde-load-test.test.ts":"4117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/all-statuses-route.test.ts":"4118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/antigravity-projectid-discovery-persist-8491.test.ts":"4119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/api-keys.test.ts":"4120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/api-routes-critical.test.ts":"4121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/audit-log-level-filter.test.ts":"4122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/batch-e2e-rate-limit.test.ts":"4123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/batch-processor-escaping.test.ts":"4124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/chat-pipeline.test.ts":"4125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/chatcore-compression-integration.test.ts":"4126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/chatcore-context-window-boundary.test.ts":"4127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-codewhale.test.ts":"4128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-deepseek-tui.test.ts":"4129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-forge.test.ts":"4130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-grok-build.test.ts":"4131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-jcode.test.ts":"4132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-letta.test.ts":"4133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-omp.test.ts":"4134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-pi.test.ts":"4135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-smelt.test.ts":"4136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/codex-chat-reasoning-http-e2e.test.ts":"4137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-failover-e2e.test.ts":"4138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-live/_liveHarness.ts":"4139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-live/auto.live.test.ts":"4140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-live/cost-and-fusion.live.test.ts":"4141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-live/ordered.live.test.ts":"4142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/auto.test.ts":"4143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/context-relay-codex.test.ts":"4144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/context-relay-handoff.test.ts":"4145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/cost-and-context.test.ts":"4146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/fusion.test.ts":"4147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/ordered.test.ts":"4148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/quota-aware.test.ts":"4149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/quota-share.test.ts":"4150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/weighted.test.ts":"4151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-provider-exhaustion.test.ts":"4152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-routing-e2e.test.ts":"4153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/compression-pipeline.test.ts":"4154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cursor-e2e.test.ts":"4155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/files-api.test.ts":"4156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/fingerprint-expansion.test.ts":"4157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/free-models-benchmark.test.ts":"4158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/free-models-tpm-stress.test.ts":"4159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/freeModelBenchmarkShared.ts":"4160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-combo-cooldown-wait.test.ts":"4161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-large-context-tpm.test.ts":"4162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-live-429-classification.test.ts":"4163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-malformed-function-call-stream.test.ts":"4164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-rate-limit-classification.test.ts":"4165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-tool-call-escaping.test.ts":"4166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/heap-growth.test.ts":"4167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/historical-tool-call-leak.test.ts":"4168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/integration-wiring.test.ts":"4169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-gemini-agentic-loop.test.ts":"4170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-gemini-nonstream.test.ts":"4171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-gemini-workload.test.ts":"4172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-gemini.test.ts":"4173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-ws-startup.test.ts":"4174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/liveGeminiShared.ts":"4175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/llama-cpp-provider.test.ts":"4176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/manifest-routing.test.ts":"4177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-embedding-providers.test.ts":"4178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-engine-status.test.ts":"4179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-pipeline.test.ts":"4180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-reindex.test.ts":"4181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-retrieve-preview.test.ts":"4182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-route-put.test.ts":"4183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-summarize.test.ts":"4184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/mimocode-proxy.integration.test.ts":"4185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/modelsDevSync.test.ts":"4186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/monitoring-health-cache.test.ts":"4187","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/newly-enabled-providers.test.ts":"4188","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/obsidian-plugin-e2e.test.ts":"4189","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/performance-regression.test.ts":"4190","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/pipeline-combo.test.ts":"4191","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/playground-improve-prompt.test.ts":"4192","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/playground-presets-crud.test.ts":"4193","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/playground-presets-zod.test.ts":"4194","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/plugins-lifecycle.test.ts":"4195","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/presets-dashboard-auth.test.ts":"4196","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/provider-journey.contract.test.ts":"4197","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/proxy-context-passthrough.test.ts":"4198","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/proxy-pipeline.test.ts":"4199","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/proxy-registry-flow.test.ts":"4200","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/qdrant-routes.test.ts":"4201","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-plans-crud.test.ts":"4202","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-pool-usage-provider-resolution.test.ts":"4203","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-pools-crud.test.ts":"4204","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-pools-usage.test.ts":"4205","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-preview.test.ts":"4206","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-routes-error-sanitization.test.ts":"4207","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-store-settings.test.ts":"4208","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/reasoning-routing-pipeline.test.ts":"4209","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/resilience-chaos.test.ts":"4210","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/resilience-http-e2e.test.ts":"4211","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/search-providers-catalog.test.ts":"4212","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/security-hardening.test.ts":"4213","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/services/cliproxy-coexistence.test.ts":"4214","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/services/full-lifecycle.int.test.ts":"4215","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/services/route-guard-services.int.test.ts":"4216","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/skills-pipeline.test.ts":"4217","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/sse-correctness.test.ts":"4218","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/stream-recovery-wiring.test.ts":"4219","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/test-model-compression-off-6240.test.ts":"4220","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-capture-modes.test.ts":"4221","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-error-sanitization.test.ts":"4222","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-hosts.test.ts":"4223","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-internal-ingest.test.ts":"4224","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-localonly.test.ts":"4225","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-requests.test.ts":"4226","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-session-requests.test.ts":"4227","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-sessions.test.ts":"4228","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-ws.test.ts":"4229","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/v1-contracts-behavior.test.ts":"4230","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/live/deepseek-web-live.test.ts":"4231","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/load/k6-soak.js":"4232","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/load/proxy-load.ts":"4233","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/scratch_test.mjs":"4234","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/theoldllm-stress.test.ts":"4235","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/translator/testFromFile.ts":"4236","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/7993-noauth-proxy-routing.test.ts":"4237","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8134-github-t5-fallback-filter.test.ts":"4238","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8169-lite-word-boundary-truncation.test.ts":"4239","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8189-classifier-compat-auto-narrow.test.ts":"4240","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8200-perplexity-web-401-cooldown.test.ts":"4241","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8200-perplexity-web-cookie-rotation.test.ts":"4242","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8231-gemini-civic-integrity-default.test.ts":"4243","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8247-accountfallback-model-unhealthy.test.ts":"4244","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8248-accountfallback-nvidia-degraded.test.ts":"4245","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8295-namespace-leaf-collision.test.ts":"4246","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8326-compatible-id-regex.test.ts":"4247","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8327-models-owned-by-prefix.test.ts":"4248","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8328-topology-custom-providers.test.ts":"4249","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8331-usage-buffer-inflation.test.ts":"4250","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8332-combo-vision-fallback.test.ts":"4251","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8336-audit-loopback-login.test.ts":"4252","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8350-hermes-oauth-usage-400.test.ts":"4253","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8368-image-token-context.test.ts":"4254","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8370-priority-affinity-reorder.test.ts":"4255","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8374-plugins-status-optional.test.ts":"4256","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8376-econnrefused-breaker.test.ts":"4257","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8385-perkey-proxy-global-toggle.test.ts":"4258","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8388-compression-detail-persist.test.ts":"4259","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8395-plugin-hooks-fire.test.ts":"4260","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8396-cooldown-429-cap.test.ts":"4261","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8431-multiwindow-quota-eviction.test.ts":"4262","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8488-capability-filter-fail-closed.test.ts":"4263","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8510-adobe-firefly-edits-route.test.ts":"4264","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8560-responses-image-compaction.test.ts":"4265","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8594-compress-image-token-stringify.test.ts":"4266","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8676-monsterapi-deprecation.test.ts":"4267","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8958-alias-backed-node-prefix.test.ts":"4268","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8989-perplexity-catalog-mode-repro.test.ts":"4269","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9232-purge-proxy-assignments-on-delete.test.ts":"4270","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9474-claude-code-oauth-mismap.test.ts":"4271","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9536-usage-misreporting-openai-to-claude.test.ts":"4272","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9545-gpt56-reasoning-tools.test.ts":"4273","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9551-proxyfetch-no-proxy-context-bypass.test.ts":"4274","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9560-turbopack-nft-lazy-module-fs.test.ts":"4275","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9568-gemini-tool-casing-mismatch.test.ts":"4276","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/AutoComboCatalog.test.tsx":"4277","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/SkillsConceptCard.test.tsx":"4278","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/_fixtures/tsx-runtime-modern-syntax.ts":"4279","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/_mitmHandlerHarness.ts":"4280","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/_mocks/settings.ts":"4281","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/a2a-auth-timing-safe.test.ts":"4282","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/a2a-cost-analysis-numeric-fallback.test.ts":"4283","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/a2a-enabled-route.test.ts":"4284","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/a2a-routing-logger.test.ts":"4285","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/access-scopes-infer.test.ts":"4286","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/access-token-scopes.test.ts":"4287","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/access-tokens-db.test.ts":"4288","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-concurrency-cap.test.ts":"4289","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-anthropic-quota.test.ts":"4290","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-cf1010-no-retry-8775.test.ts":"4291","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-lockout-eviction.test.ts":"4292","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-retry-after-json.test.ts":"4293","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-route-restriction-403.test.ts":"4294","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-service.test.ts":"4295","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-selector.test.ts":"4296","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/accountSemaphore.test.ts":"4297","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/accountfallback-ratelimit-400-4976.test.ts":"4298","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/acp-agents-route.test.ts":"4299","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/acp-registry.test.ts":"4300","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/active-request-stream-chunks-lifecycle.test.ts":"4301","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-controller.test.ts":"4302","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-cost.test.ts":"4303","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-domain.test.ts":"4304","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-features.test.ts":"4305","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-lifecycle.test.ts":"4306","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-queue.test.ts":"4307","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-route-matrix.test.ts":"4308","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-runtime.test.ts":"4309","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/admin-audit-events.test.ts":"4310","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adobe-firefly-browser-login.test.ts":"4311","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adobe-firefly-jwt-redos-guard.test.ts":"4312","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adobe-firefly.test.ts":"4313","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/advanced-fase07-09.test.ts":"4314","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adversarialPii.test.ts":"4315","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-cert-install-fallback-4546.test.ts":"4316","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-cert-route-validation.test.ts":"4317","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-cert-trust-sudo-gate.test.ts":"4318","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-config-portability.test.ts":"4319","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-detected-models-8656.test.ts":"4320","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-params-7271.test.ts":"4321","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-per-agent-8466.test.ts":"4322","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-route-validation.test.ts":"4323","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-sudo-gate.test.ts":"4324","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-toggle-method-7157.test.ts":"4325","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-maintenance-api.test.ts":"4326","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-mappings-sync-8656.test.ts":"4327","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-repair-route-validation.test.ts":"4328","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-repair-sudo-gate.test.ts":"4329","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-server-route-dynamic-import.test.ts":"4330","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-state-full-payload-8656.test.ts":"4331","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-state-normalize-3318.test.ts":"4332","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-targets-serializable.test.ts":"4333","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-card-route.test.ts":"4334","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-goal-policy.test.ts":"4335","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-skills-page.test.tsx":"4336","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkillTools-mcp.test.ts":"4337","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-catalog.test.ts":"4338","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-cliRegistryParser.test.ts":"4339","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-generator.test.ts":"4340","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-openapiParser.test.ts":"4341","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-routes.test.ts":"4342","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-schemas.test.ts":"4343","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentbridge-antigravity-cert-hosts-6494.test.ts":"4344","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentbridge-mitm-router-key-6403.test.ts":"4345","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-cc-wire-image.test.ts":"4346","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-chatcore-protocols.test.ts":"4347","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-executor-protocols.test.ts":"4348","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-live-catalog.test.ts":"4349","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-models-discovery-7016.test.ts":"4350","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-quota-fetcher.test.ts":"4351","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agnes-provider.test.ts":"4352","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-auth-import.test.ts":"4353","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-gemini-3696-tier-passthrough.test.ts":"4354","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-gemini-400-3229.test.ts":"4355","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-pro-fallback-chain-3786.test.ts":"4356","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-projectid-ui.test.ts":"4357","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-provider.test.ts":"4358","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-usage-quota.test.ts":"4359","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/aihorde-tools-unsupported-provider-fallback.test.ts":"4360","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/airforce-v1-double-prefix-5899.test.ts":"4361","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/alibaba-image-media.test.ts":"4362","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/alibaba-provider-regions.test.ts":"4363","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/alibaba-video-media.test.ts":"4364","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/alternate-formats.test.ts":"4365","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-cache-fingerprint.test.ts":"4366","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-compat-validation-v1-messages.test.ts":"4367","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-header-dedupe-1475.test.ts":"4368","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-official-baseurl-host.test.ts":"4369","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-stream-thinking-close-marker.test.ts":"4370","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-thinking-signature-recovery.test.ts":"4371","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-toolcall-args-6459.test.ts":"4372","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-429-quota-cooldown.test.ts":"4373","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-429-quota-tdd.test.ts":"4374","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-claude-prefill-strip.test.ts":"4375","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-client-identity-paths.test.ts":"4376","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-client-profile.test.ts":"4377","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-credits.test.ts":"4378","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-discovery-bootstrap.test.ts":"4379","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-executor-split.test.ts":"4380","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-finish-reason-normalization.test.ts":"4381","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-format-detection.test.ts":"4382","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-headers.test.ts":"4383","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-image-catalog-separation.test.ts":"4384","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-local-usage-fallback-3821.test.ts":"4385","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-missing-project-chat.test.ts":"4386","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-mitm-model-resolution.test.ts":"4387","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-model-aliases.test.ts":"4388","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-native-toolcall-collect.test.ts":"4389","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-oauth-client-profile.test.ts":"4390","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-oauth-no-pkce-no-openid.test.ts":"4391","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-oauth-postexchange-nonblocking.test.ts":"4392","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-orphan-toolresult-6026.test.ts":"4393","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-orphan-tooluse-7752.test.ts":"4394","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-prefer-stored-project.test.ts":"4395","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-projectid.test.ts":"4396","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-quota-skipping.test.ts":"4397","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-refresh-empty-token-3850.test.ts":"4398","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-retired-public-models.test.ts":"4399","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-retry-hook.test.ts":"4400","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-safetysettings-5003.test.ts":"4401","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-server-side-tools-6914.test.ts":"4402","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-sse-collect-socket-release-4309.test.ts":"4403","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-streaming-error-body-sanitized-2461.test.ts":"4404","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-streaming-passthrough.test.ts":"4405","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-strip-builtin-tools-funcdecls-1095.test.ts":"4406","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-strip-output-config-1944.test.ts":"4407","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-strip-thinking-fields-1926.test.ts":"4408","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-tool-cloak-server-side-invocations.test.ts":"4409","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-tool-cloaking.test.ts":"4410","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-usage-fetcher.test.ts":"4411","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-usage-service.test.ts":"4412","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-version.test.ts":"4413","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-weekly-quota-4017.test.ts":"4414","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/api-catchall-json-404.test.ts":"4415","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/authz-inventory.test.ts":"4416","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/auto-combo-candidates-route-7819.test.ts":"4417","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/cli-tools/detect.test.ts":"4418","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/combo-002-first-field.test.ts":"4419","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/combo-error-response.test.ts":"4420","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression/compression-api.test.ts":"4421","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression/rtk-learn-discover-routes.test.ts":"4422","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression/rtk-toml-import-route.test.ts":"4423","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression-engines-route.test.ts":"4424","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression-preview-caveman-and-stacked-6425.test.ts":"4425","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression-preview-engine.test.ts":"4426","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/context-analytics-engine-route.test.ts":"4427","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/context-combos-default-route.test.ts":"4428","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/discovery-routes.test.ts":"4429","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/free-proxies-list-route.test.ts":"4430","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/free-proxies-route.test.ts":"4431","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/providers-import-route-6836.test.ts":"4432","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/proxies-repair-relay.test.ts":"4433","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/root-catchall-json-404.test.ts":"4434","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/server-error-message.test.ts":"4435","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/services/9router-models.test.ts":"4436","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/services/9router-provider-expose.test.ts":"4437","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/services/9router-status-reveal.test.ts":"4438","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/services/cliproxy-provider-expose.test.ts":"4439","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/settings-audit.test.ts":"4440","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/sync-models-readiness.test.ts":"4441","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/bifrost-cooldown.test.ts":"4442","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/bifrost-sidecar.test.ts":"4443","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/provider-plugin-manifest-route.test.ts":"4444","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/relay-routing-backend.test.ts":"4445","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/relay-stream-finalizer.test.ts":"4446","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1-catchall-json-404.test.ts":"4447","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1-me-status-route.test.ts":"4448","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/validated-json-body.test.ts":"4449","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/webhooks/webhook-url-ssrf-guard.test.ts":"4450","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-auth.test.ts":"4451","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-docs-route.test.ts":"4452","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-error-message-5340.test.ts":"4453","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-lifecycle.test.ts":"4454","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-mask-fix.test.mjs":"4455","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-policy.test.ts":"4456","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-provider-quota-bypass-scope.test.ts":"4457","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-regeneration.test.ts":"4458","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-reveal-route.test.ts":"4459","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-rotator-health.test.ts":"4460","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-scope-validation.test.ts":"4461","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-self-service.test.ts":"4462","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-usage-limits.test.ts":"4463","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-utils-public-surface.test.ts":"4464","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-keys-create-no-hang-6570.test.ts":"4465","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-malformed-json-400.test.ts":"4466","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-filters.test.ts":"4467","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-key-visibility.test.ts":"4468","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-mask-key-passthrough.test.ts":"4469","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-page-static.test.ts":"4470","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-quota-keys-section.test.ts":"4471","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-scope-preservation.test.ts":"4472","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-usage-command.test.ts":"4473","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-models-hide-paid-6328.test.ts":"4474","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-parse-response.test.ts":"4475","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-routes-lib.test.ts":"4476","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikey-connection-health-check.test.ts":"4477","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikey-policy-default-rate-limits.test.ts":"4478","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeypolicy-disable-non-public.test.ts":"4479","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeypolicy-quota-only.test.ts":"4480","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-allowed-quotas.test.ts":"4481","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-disable-non-public.test.ts":"4482","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-model-permissions-split.test.ts":"4483","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-row-parsers-split.test.ts":"4484","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-usage-command.test.ts":"4485","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/appearance-widget-settings-schema.test.ts":"4486","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apply-executor-proxy-info-5217.test.ts":"4487","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/approvalGate.test.ts":"4488","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/arena-cookie-validation-redirect-7542.test.ts":"4489","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/arena-elo-sync.test.ts":"4490","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-provider-nodes-selection.test.ts":"4491","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-speech-fishaudio.test.ts":"4492","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-speech-handler.test.ts":"4493","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-transcription-handler.test.ts":"4494","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-transcription-openrouter.test.ts":"4495","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-transcriptions-combo-resolution.test.ts":"4496","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-translations-route.test.ts":"4497","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-activity-icons.test.ts":"4498","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-allowlist-real-actions.test.ts":"4499","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-eventtype-i18n.test.ts":"4500","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-high-level-actions.test.ts":"4501","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-timeline.test.ts":"4502","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auggie-executor.test.ts":"4503","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auggie-win32-spawn-6304.test.ts":"4504","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth/loginGuard.test.ts":"4505","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-antigravity-account-retry-v2.test.ts":"4506","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-clear-account-error.test.ts":"4507","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-clear-provider-routes.test.ts":"4508","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-disable-cooling-2997.test.ts":"4509","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-extract-api-key.test.ts":"4510","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-login-route.test.ts":"4511","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-noauth-fallback-loop-3061.test.ts":"4512","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-ollama-cloud-per-model-403-3027.test.ts":"4513","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-opencode-zen-noauth-fallback.test.ts":"4514","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-policy-embeddings-webfetch-7785.test.ts":"4515","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-redirect-login.test.ts":"4516","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-terminal-status.test.ts":"4517","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/classify.test.ts":"4518","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/client-api-policy-fallback.test.ts":"4519","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/client-api-policy.test.ts":"4520","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/csrf.test.ts":"4521","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/discovery-routes-local-only.test.ts":"4522","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/ip-filter-enforcement-6131.test.ts":"4523","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/management-policy.test.ts":"4524","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/pipeline.test.ts":"4525","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/probe-9033-repro.test.ts":"4526","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/proxy-contract.test.ts":"4527","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/public-origin.test.ts":"4528","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/public-policy.test.ts":"4529","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/route-guard-local-prefix.test.ts":"4530","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/route-guard-skills-collect.test.ts":"4531","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/route-guard-version-get-exemption.test.ts":"4532","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/route-guard-vnc-session-local-only.test.ts":"4533","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/routeGuard.test.ts":"4534","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/spawn-capable-prefixes-client-safe.test.ts":"4535","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-candidate-overrides-7819.test.ts":"4536","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-candidate-overrides-regression-7819.test.ts":"4537","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-candidate-pool-filter-7819.test.ts":"4538","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-budget-fallback-3470.test.ts":"4539","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-codex-responses-3509.test.ts":"4540","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-context-advertising.test.ts":"4541","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-credentialed-model-pool.test.ts":"4542","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-engine.test.ts":"4543","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-hidden-models-4558.test.ts":"4544","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-request-controls-6024.test.ts":"4545","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-scoring-clamp.test.ts":"4546","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combos-enhanced-4235.test.ts":"4547","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combos-free-models-routes.test.ts":"4548","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combos-suffixes-4235.test.ts":"4549","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-custom-provider-5873.test.ts":"4550","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-empty-pool-fastfail-6458.test.ts":"4551","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-family-classification-8866.test.ts":"4552","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-routing-settings-resolve.test.ts":"4553","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-update-mode-detection.test.ts":"4554","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-update-runtime.test.ts":"4555","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-update.test.ts":"4556","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/free-alias-intelligence-8601.test.ts":"4557","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/paid-model-filter-6512.test.ts":"4558","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/paid-tier-auto-id-6328.test.ts":"4559","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/provider-family-combos.test.ts":"4560","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/static-table-longest-match-8603.test.ts":"4561","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/suffixComposition-4517.test.ts":"4562","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/tieredRotation.test.ts":"4563","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoPrefix.test.ts":"4564","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autocombo-unification.test.ts":"4565","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autostart-cli-shorthand-3331.test.ts":"4566","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoupdate-npm-win32-5542.test.ts":"4567","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/azure-openai-executor.test.ts":"4568","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/azureAiMultiModelTest.test.ts":"4569","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/background-task-detector.test.ts":"4570","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/backpressure.test.ts":"4571","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bai-provider.test.ts":"4572","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/baidu-qianfan-website-urls-6271.test.ts":"4573","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-coding-plan-media.test.ts":"4574","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-coding-plan-provider.test.ts":"4575","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-quota-fetcher.test.ts":"4576","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-schema-validation.test.ts":"4577","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-usage.test.ts":"4578","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/balance-e2e-shards.test.ts":"4579","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bare-model-autopick.test.ts":"4580","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-executor-buildheaders-extra-keys-8493.test.ts":"4581","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-executor-sanitize-effort.test.ts":"4582","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-executor-waf-retry.test.ts":"4583","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-headers-split.test.ts":"4584","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-reasoning-effort-split.test.ts":"4585","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-thinking-budget-config-5312.test.ts":"4586","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-a-domain.test.ts":"4587","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-b-final.test.ts":"4588","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-deletion-route-logic.test.ts":"4589","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-deletion.test.ts":"4590","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-file-download.test.ts":"4591","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-list-limit-validation.test.ts":"4592","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-maybe-throttle.test.ts":"4593","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-processor-expiration.test.ts":"4594","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-processor.test.ts":"4595","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-status-cache.test.ts":"4596","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-status-logic.test.mjs":"4597","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch_api.test.ts":"4598","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch_results.test.ts":"4599","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batches-f9-helpers.test.ts":"4600","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bazaarlink-provider-integrity.test.ts":"4601","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bedrock-image-log-redaction-7297.test.ts":"4602","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bin-omniroute-mcp.test.ts":"4603","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/binary-manager-extract-zip-5590.test.ts":"4604","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/binaryManager.test.ts":"4605","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/blackbox-web-validated-token.test.ts":"4606","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/blackbox-web.test.ts":"4607","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/blackbox.test.ts":"4608","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/body-read-timeout.test.ts":"4609","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/body-size-guard.test.ts":"4610","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/body-timeout-integration.test.ts":"4611","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bootstrap-env.test.ts":"4612","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/browser-pool-optional-import.test.ts":"4613","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/browserBackedChat-matcher.test.ts":"4614","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/browserPool-proxy.test.ts":"4615","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/budget-route-auth.test.ts":"4616","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/budget-schema-empty-limits-3537.test.ts":"4617","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bug-7940-gemini-retrydelay.test.ts":"4618","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bug-8020-codex-peek-body-timeout.test.ts":"4619","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bug-8029-promptql-issuer-substring.test.ts":"4620","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/allowlist-helper.test.ts":"4621","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/assemble-standalone.test.ts":"4622","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/backend-only-smoke-workflows.test.ts":"4623","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-bundle-size.test.ts":"4624","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-circular-deps.test.ts":"4625","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-codeql-ratchet.test.ts":"4626","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-cognitive-complexity.test.ts":"4627","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-complexity-rule-count.test.ts":"4628","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-complexity.test.ts":"4629","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-dashboard-typecheck.test.ts":"4630","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-dead-code.test.ts":"4631","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-licenses.test.ts":"4632","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-lockfile.test.ts":"4633","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-mutation-ratchet.test.ts":"4634","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-mutation-test-coverage.test.ts":"4635","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-openapi-breaking.test.ts":"4636","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-pr-evidence.test.ts":"4637","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-secrets.test.ts":"4638","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-test-runner-api.test.ts":"4639","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-tracked-artifacts.test.ts":"4640","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-type-coverage.test.ts":"4641","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-vuln-ratchet.test.ts":"4642","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-workflows.test.ts":"4643","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/docker-next-channel-8576.test.ts":"4644","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/electron-release-latest-yml.repro.test.ts":"4645","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/mcp-bundle-no-eager-ioredis.test.ts":"4646","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/mitm-server-bundle-contents.test.ts":"4647","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/mutation-radiography.test.ts":"4648","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/opencode-plugin-esm-only.test.ts":"4649","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/optional-transformers-dependency.test.ts":"4650","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/resolve-npm-entry.test.ts":"4651","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/should-promote-latest-5301.test.ts":"4652","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/sync-changelog-i18n.test.ts":"4653","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build-bundler-default-turbopack.test.ts":"4654","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build-next-isolated-windows-home-2402.test.ts":"4655","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build-next-isolated.test.ts":"4656","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/buildCurl.test.ts":"4657","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulk-add-keys-no-overwrite-2587.test.ts":"4658","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulk-api-key-parser-cloudflare.test.ts":"4659","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulk-paste-api-keys.test.ts":"4660","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulk-web-session-import.test.ts":"4661","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulkApiKeyParser.test.ts":"4662","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bypass-handler.test.ts":"4663","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bypass-response-claude-merge.test.ts":"4664","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bytez-validation-5422.test.ts":"4665","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-config-route-8219.test.ts":"4666","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-control-claude-providers.test.ts":"4667","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-control-policy.test.ts":"4668","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-metrics.test.ts":"4669","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-sweeps.test.ts":"4670","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-cap.test.ts":"4671","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-detailed-tokens.test.ts":"4672","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-file-rotation.test.ts":"4673","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-oom-unbounded-5618.test.ts":"4674","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-provider-display.test.ts":"4675","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-startup.test.ts":"4676","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-stream-debug.test.ts":"4677","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-trim-sql-vars-5217.test.ts":"4678","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-correlation-sort.test.ts":"4679","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-correlation-substring.test.ts":"4680","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-pagination.test.ts":"4681","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-requested-model.test.ts":"4682","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-session-tag.test.ts":"4683","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/calllogs-format-split.test.ts":"4684","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cap-thinking-budget-gemini-fallback.test.ts":"4685","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/capture-critical-db-state.test.ts":"4686","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/card-hover-visible.test.ts":"4687","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/case-collision-6584.test.ts":"4688","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-helpers-extraction.test.ts":"4689","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-hide-auto-no-think.test.ts":"4690","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-order-contract.test.ts":"4691","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-order-helper.test.ts":"4692","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-pricing-lookup-index-8697.test.ts":"4693","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-pricing-surface-8018.test.ts":"4694","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-synced-static-preservation.test.ts":"4695","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-updates-v3829-kimi-qwen.test.ts":"4696","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-updates-v3x.test.ts":"4697","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/caveman-packs-de-fr-ja.test.ts":"4698","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/caveman-packs-zh-wenyan.test.ts":"4699","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-bridge-openai-image-7777.test.ts":"4700","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-bridge-tool-pair-guard.test.ts":"4701","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-bridge-transforms.test.ts":"4702","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-compatible-model-catalog.test.ts":"4703","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-compatible-provider.test.ts":"4704","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-alias-api.test.ts":"4705","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-alias-resolve.test.ts":"4706","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-alias-strip.test.ts":"4707","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-aliases-append.test.ts":"4708","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-aliases-catalog.test.ts":"4709","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-aliases-gate.test.ts":"4710","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-metrics.test.ts":"4711","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ccr-durable-store-9061.test.ts":"4712","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ccr-protocol-instruction.test.ts":"4713","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/changelog-fragments.test.ts":"4714","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chaos-api-routes.test.ts":"4715","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chaos-config.test.ts":"4716","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chaos-executor.test.ts":"4717","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/charm-hyper-provider.test.ts":"4718","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-adaptive-admission-binding.test.ts":"4719","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-admission-wrapper.test.ts":"4720","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-auth-log-redaction.test.ts":"4721","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-body-admission.test.ts":"4722","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-build-client-raw-request.test.ts":"4723","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-combo-live-test.test.ts":"4724","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-completions-parse-once-7847.test.ts":"4725","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-completions-route-shape-gate.test.ts":"4726","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-content-type-6414.test.ts":"4727","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-context-relay.test.ts":"4728","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-cooldown-aware-retry.test.ts":"4729","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-core-intercept-fetch.test.ts":"4730","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-early-schema-validation-6412.test.ts":"4731","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-helpers.test.ts":"4732","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-messages-validation-6402.test.ts":"4733","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-non-string-model-6407.test.ts":"4734","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-openai-compat-providers.test.ts":"4735","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-rate-limit-body-lock.test.ts":"4736","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-rejects-image-only-model.test.ts":"4737","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-request-body-parse-once-4380.test.ts":"4738","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-route-coverage.test.ts":"4739","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-route-edge-cases.test.ts":"4740","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-safetynet-reqid-6097.test.ts":"4741","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-attempt-logging.test.ts":"4742","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-background-redirect.test.ts":"4743","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-cache-usage-meta.test.ts":"4744","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-caveman-output-analytics.test.ts":"4745","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-claude-effort-variant.test.ts":"4746","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-claude-upstream-messages.test.ts":"4747","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-client-usage-buffer.test.ts":"4748","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-codex-quota.test.ts":"4749","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-combo-context-limit-8378.test.ts":"4750","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-combo-context-override-rescue.test.ts":"4751","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-analytics-write.test.ts":"4752","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-cache-stats.test.ts":"4753","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-combo-predicates.test.ts":"4754","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-integration.test.ts":"4755","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-settings.test.ts":"4756","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-usage-receipt.test.ts":"4757","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-context-editing-telemetry.test.ts":"4758","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-context-estimation.test.ts":"4759","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-execution-credentials.test.ts":"4760","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-executor-client-headers.test.ts":"4761","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-executor-helpers.test.ts":"4762","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-executor-proxy.test.ts":"4763","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-extracted-modules-3821.test.ts":"4764","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-failure-usage.test.ts":"4765","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-gamification-event.test.ts":"4766","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-headers.test.ts":"4767","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-imports-cleanly.test.ts":"4768","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-json-body-to-sse.test.ts":"4769","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-key-health.test.ts":"4770","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-log-truncation.test.ts":"4771","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-memory-extraction.test.ts":"4772","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-memory-pressure.test.ts":"4773","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-memory-skills-injection.test.ts":"4774","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-model-output-cap-wiring.test.ts":"4775","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-non-streaming-response-body.test.ts":"4776","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-non-streaming-response-parse.test.ts":"4777","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-non-streaming-sse.test.ts":"4778","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-non-streaming-usage-stats.test.ts":"4779","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-nonstreaming-json-response.test.ts":"4780","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-nonstreaming-response-headers.test.ts":"4781","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-output-style-telemetry.test.ts":"4782","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-passthrough-tool-names.test.ts":"4783","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-plugin-onrequest.test.ts":"4784","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-plugin-onresponse.test.ts":"4785","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-postcall-guardrail-context.test.ts":"4786","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-quota-share-consumption.test.ts":"4787","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-request-format.test.ts":"4788","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-request-setup.test.ts":"4789","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-sanitization.test.ts":"4790","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-semantic-cache-store.test.ts":"4791","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-semantic-cache.test.ts":"4792","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-service-tier.test.ts":"4793","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-skills-format.test.ts":"4794","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-stage-trace.test.ts":"4795","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-stream-error-result.test.ts":"4796","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-stream-finalize.test.ts":"4797","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-cache-store.test.ts":"4798","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-cost.test.ts":"4799","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-pipeline.test.ts":"4800","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-quota-share.test.ts":"4801","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-response-headers.test.ts":"4802","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-usage-stats.test.ts":"4803","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-strip-stale-headers.test.ts":"4804","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-target-format.test.ts":"4805","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-telemetry-helpers.test.ts":"4806","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-tool-calling-required-check.test.ts":"4807","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-translation-paths.test.ts":"4808","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-unsupported-params-strip.test.ts":"4809","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-upstream-body.test.ts":"4810","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-upstream-execute-headers.test.ts":"4811","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-upstream-timeouts.test.ts":"4812","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-image-cache.test.ts":"4813","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-async-image-ws-shapes-7357.test.ts":"4814","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-citations-escape.test.ts":"4815","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-citations.test.ts":"4816","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-handoff-resume.test.ts":"4817","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-image-silentdrop.test.ts":"4818","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-models-split.test.ts":"4819","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-sha3-boringssl-5531.test.ts":"4820","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-tools-5240.test.ts":"4821","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web.test.ts":"4822","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cheaperinference-executor.test.ts":"4823","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cheaperinference-image-models.test.ts":"4824","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cheaperinference-provider-registration.test.ts":"4825","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-changelog-integrity.test.ts":"4826","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-cognitive-complexity.test.ts":"4827","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-complexity.test.ts":"4828","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-db-rules-classification.test.ts":"4829","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-db-rules.test.ts":"4830","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-dead-code.test.ts":"4831","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-deps.test.ts":"4832","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-docs-counts-sync.test.ts":"4833","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-docs-symbols.test.ts":"4834","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-duplication.test.ts":"4835","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-env-doc-sync.test.ts":"4836","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-error-helper.test.ts":"4837","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-fabricated-docs.test.ts":"4838","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-fetch-targets.test.ts":"4839","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-file-size.test.ts":"4840","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-install-upgrade-convergence.test.ts":"4841","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-known-symbols.test.ts":"4842","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-migration-numbering.test.ts":"4843","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-openapi-breaking-ratchet.test.ts":"4844","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-openapi-routes.test.ts":"4845","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-pack-boot.test.ts":"4846","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-pr-evidence.test.ts":"4847","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-provider-consistency.test.ts":"4848","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-public-creds.test.ts":"4849","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-route-guard-membership.test.ts":"4850","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-rtl-ratchet.test.ts":"4851","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-test-discovery.test.ts":"4852","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-test-masking-selfref-6634.test.ts":"4853","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-test-masking.test.ts":"4854","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-tool-config-status.test.ts":"4855","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-type-coverage.test.ts":"4856","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chenzk-provider-2437.test.ts":"4857","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chipotle-executor.test.ts":"4858","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chutes-registry-baseurl-7621.test.ts":"4859","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-abort-provider-trip-7907.test.ts":"4860","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-client-abort.test.ts":"4861","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-failure-kind.test.ts":"4862","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-registry-cap.test.ts":"4863","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-stream-controller-4602.test.ts":"4864","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/classify-pr-changes.test.ts":"4865","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/classify429.test.ts":"4866","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-adaptive-sampling-params.test.ts":"4867","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-adaptive-thinking-normalize.test.ts":"4868","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-atu-effort-leak-9505.test.ts":"4869","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-beta-client-header-3415.test.ts":"4870","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-beta-flags-2454.test.ts":"4871","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-cache-control-passthrough.test.ts":"4872","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-classifier-compat.test.ts":"4873","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-cli-config.test.ts":"4874","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-cli-defaults.test.ts":"4875","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-compatible-helpers.test.ts":"4876","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-compatible-request.test.ts":"4877","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-meta-requests.test.ts":"4878","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-obfuscation.test.ts":"4879","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-parity.test.ts":"4880","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-rendering-fixes.test.ts":"4881","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-tool-remapper-flag-leak.test.ts":"4882","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-codex-identity-version-sync.test.ts":"4883","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-context-1m-client-beta-forward.test.ts":"4884","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-context-1m-supported-models.test.ts":"4885","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-effort-suffix-strip.test.ts":"4886","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-effort-variants.test.ts":"4887","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-empty-stream-error-3685.test.ts":"4888","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-extra-usage.test.ts":"4889","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-fast-mode.test.ts":"4890","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-gemini-thought-signature-8979.test.ts":"4891","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-haiku-no-adaptive-thinking.test.ts":"4892","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-helper-minimax-output-config.test.ts":"4893","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-identity-version-sync.test.ts":"4894","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-import-route.test.ts":"4895","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-native-passthrough-tools.test.ts":"4896","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-oauth-provider.test.ts":"4897","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-oauth-tool-cloak.test.ts":"4898","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-oauth-usage-429-backoff.test.ts":"4899","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-oauth-vps-endpoints.test.ts":"4900","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-passthrough-stream-boolean.test.ts":"4901","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-passthrough-thinking-2454.test.ts":"4902","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-prepare-request-preserve-fallback.test.ts":"4903","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-profile-auto-sync-gate.test.ts":"4904","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-server-tool-name-preserve.test.ts":"4905","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-stream-reconstructed-body.test.ts":"4906","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-thinking-tool-choice-guard.test.ts":"4907","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-to-gemini-budget-tokens-zero-6813.test.ts":"4908","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-to-openai-image-toolresult.test.ts":"4909","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-to-openai-system-role-6954.test.ts":"4910","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-to-openai-think-close-5123.test.ts":"4911","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-tool-result-pairing.test.ts":"4912","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-tool-search-beta-3974.test.ts":"4913","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-tool-type-default-2195.test.ts":"4914","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-auto-refresh.test.ts":"4915","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-browser-transport.test.ts":"4916","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-executor-split.test.ts":"4917","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-live-alignment.test.ts":"4918","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-payload-runtime.test.ts":"4919","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-session.test.ts":"4920","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-slow-first-byte.test.ts":"4921","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-sonnet5-registry-6209.test.ts":"4922","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-stream.test.ts":"4923","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-transport.test.ts":"4924","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-turnstile-ua-mismatch-7548.test.ts":"4925","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web.test.ts":"4926","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claudeAuthFile.test.ts":"4927","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claudeAuthImport.test.ts":"4928","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cleanup-column-fix.test.mjs":"4929","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/alias-resolver-7791.test.ts":"4930","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/autostart-linux.test.ts":"4931","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/autostart-macos-launchctl.test.ts":"4932","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/autostart-windows.test.ts":"4933","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/autostart.test.ts":"4934","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-claude-exe-windows-9454.test.ts":"4935","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-codex-windows-spawn-args.test.ts":"4936","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-codex.test.ts":"4937","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-command.test.ts":"4938","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-windows-spawn-args.test.ts":"4939","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-aider.test.ts":"4940","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-claude.test.ts":"4941","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-cline.test.ts":"4942","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-codex.test.ts":"4943","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-continue.test.ts":"4944","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-crush.test.ts":"4945","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-cursor.test.ts":"4946","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-goose.test.ts":"4947","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-kilo.test.ts":"4948","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-opencode.test.ts":"4949","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-qwen.test.ts":"4950","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-roo.test.ts":"4951","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/tray.test.ts":"4952","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-a2a-invoke-commands.test.ts":"4953","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-audit-commands.test.ts":"4954","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-auth-export-command.test.ts":"4955","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-backup-command.test.ts":"4956","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-batches-commands.test.ts":"4957","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-acpspawnable.test.ts":"4958","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-counts.test.ts":"4959","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-display-contract.test.ts":"4960","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-newentries.test.ts":"4961","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-removed.test.ts":"4962","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-schema.test.ts":"4963","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-chat.test.ts":"4964","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-clipboard.test.ts":"4965","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-cloud-commands.test.ts":"4966","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-combo-command.test.ts":"4967","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-combo-suggest-commands.test.ts":"4968","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-completion-dynamic.test.ts":"4969","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-compression-commands.test.ts":"4970","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-connect-helpers.test.ts":"4971","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-context-eng-commands.test.ts":"4972","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-contexts.test.ts":"4973","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-cost.test.ts":"4974","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-dashboard-open-fallback.test.ts":"4975","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-dashboard-port.test.ts":"4976","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-data-dir-env-loading.test.ts":"4977","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-data-dir-env.test.ts":"4978","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-doctor-command.test.ts":"4979","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-doctor-liveness-fallback-6162.test.ts":"4980","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-doctor-rooturl-windows-5844.test.ts":"4981","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-electron-to-cli-migration-server-env-7302.test.ts":"4982","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-entrypoint.test.ts":"4983","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-environment-helpers.test.ts":"4984","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-environment.test.ts":"4985","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-eval-commands.test.ts":"4986","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-exit-codes.test.ts":"4987","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-expanded-commands.test.ts":"4988","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-files-commands.test.ts":"4989","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-fingerprints.test.ts":"4990","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-health-monitoring-route.test.ts":"4991","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper/config-generator.test.ts":"4992","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper/hermes-home-env.test.ts":"4993","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper/tool-detector-win32-7279.test.ts":"4994","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper/tool-detector.test.ts":"4995","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper-tool-detector-paths-6162.test.ts":"4996","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-i18n-catalog.test.ts":"4997","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-io.test.ts":"4998","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-ipv4-first-dns-2699.test.ts":"4999","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-keys-command.test.ts":"5000","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-lang-commands.test.ts":"5001","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-login-antigravity.test.ts":"5002","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-login-push-remote.test.ts":"5003","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-logs-route.test.ts":"5004","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-machine-token.test.ts":"5005","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-mcp-call-commands.test.ts":"5006","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-memory-commands.test.ts":"5007","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-memory-types.test.mjs":"5008","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-memory.test.ts":"5009","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-mitm-schema.test.ts":"5010","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-model-config-schema.test.ts":"5011","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-models-command.test.ts":"5012","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-nodes-commands.test.ts":"5013","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-oauth-commands.test.ts":"5014","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-oneproxy-commands.test.ts":"5015","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-open-command.test.ts":"5016","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-openapi-codegen.test.ts":"5017","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-openapi-commands.test.ts":"5018","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-output-render-table.test.ts":"5019","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-output.test.ts":"5020","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-plugin-system.test.ts":"5021","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-policy-commands.test.ts":"5022","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-pricing-commands.test.ts":"5023","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-process-supervisor-spawn-error-8091.test.ts":"5024","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-process-supervisor.test.ts":"5025","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-program.test.ts":"5026","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-providers-command.test.ts":"5027","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-providers-metrics.test.ts":"5028","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-providers-rotate.test.ts":"5029","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-redis-command.test.ts":"5030","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-remote-mode.test.ts":"5031","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-repl.test.ts":"5032","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-resilience-commands.test.ts":"5033","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime-detection.test.ts":"5034","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime-extended.test.ts":"5035","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime-imports-packaged-5227.test.ts":"5036","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime-known-path-shortcircuit-7774.test.ts":"5037","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime.test.ts":"5038","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-hostname.test.ts":"5039","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-port.test.ts":"5040","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-readiness-timeout-6321.test.ts":"5041","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-startup-time.test.ts":"5042","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-stop-command.test.ts":"5043","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-version-banner.test.ts":"5044","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-server-commands.test.ts":"5045","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-sessions-commands.test.ts":"5046","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-setup-command.test.ts":"5047","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-setup-opencode-nested-alias-7682.test.ts":"5048","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-setup-opencode.test.ts":"5049","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-simulate.test.ts":"5050","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-skills-commands.test.ts":"5051","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-spinner.test.ts":"5052","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-sqlite-bindings-not-found-7868.test.ts":"5053","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-sqlite-no-fallback-7586.test.ts":"5054","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-stop-supervisor-respawn-9455.test.ts":"5055","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-storage-key-bootstrap.test.ts":"5056","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-storage-key-provision.test.ts":"5057","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-stream.test.ts":"5058","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-sync-commands.test.ts":"5059","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tags-commands.test.ts":"5060","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-telemetry-commands.test.ts":"5061","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tool-detector-imports.test.ts":"5062","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-auth-hardening.test.ts":"5063","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-crush.test.ts":"5064","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-i18n.test.ts":"5065","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-keys-route.test.ts":"5066","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-schema.test.ts":"5067","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-settings-jsonc.test.ts":"5068","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools.test.ts":"5069","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-translator-commands.test.ts":"5070","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tray-systray2.test.ts":"5071","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tray.test.ts":"5072","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tui.test.ts":"5073","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-update-global-paths-3295.test.ts":"5074","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-update-notifier.test.ts":"5075","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-update-prefer-online-4376.test.ts":"5076","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-update-shadow-install-9475.test.ts":"5077","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-usage.test.ts":"5078","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-version-fastpath.test.ts":"5079","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-waitForServer.test.mjs":"5080","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-webhooks-commands.test.ts":"5081","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliRuntime-codex-shebang-8036.test.ts":"5082","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliRuntime-symlink-escape-7753.test.ts":"5083","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/client-identity-profiles.test.ts":"5084","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cline-catalog-models-3321.test.ts":"5085","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cline-force-stream.test.ts":"5086","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cline-response-envelope.test.ts":"5087","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cline-workos-auth-token-shape.test.ts":"5088","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/clinepass-provider.test.ts":"5089","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/clinepass-thinking-budget.test.ts":"5090","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxy-auth-import-1934.test.ts":"5091","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxyapi-dedicated-credential-7645.test.ts":"5092","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxyapi-executor.test.ts":"5093","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxyapi-fallback-wiring.test.ts":"5094","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxyapi-model-mapping-dispatch.test.ts":"5095","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-cors-failclosed.test.ts":"5096","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-credentials-api.test.ts":"5097","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-credentials.test.ts":"5098","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-cursor-4227.test.ts":"5099","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-health-api.test.ts":"5100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-tasks-route-auth.test.ts":"5101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-sync.test.ts":"5102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-write-auth.test.ts":"5103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudAgent-types.test.ts":"5104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-ai-catalog-8717.test.ts":"5105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-ai-image-parts-6390.test.ts":"5106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-ai-neuron-exhaustion-6980.test.ts":"5107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-models-uuid-4259.test.ts":"5108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-worker-upload-content-type-6416.test.ts":"5109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflaredTunnel-extended.test.ts":"5110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflaredTunnel.test.ts":"5111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/code-assist-subscription.test.ts":"5112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codebuddy-cn-provider.test.ts":"5113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codebuddy-reasoning-optin.test.ts":"5114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-auth-import-expiry.test.ts":"5115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-auth-import-userid-dedup-6301.test.ts":"5116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-banked-reset-credits-5199.test.ts":"5117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-base-url.test.ts":"5118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-cache-key.test.ts":"5119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-capacity-limit-merge.test.ts":"5120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-catalog-revalidation-runtime.test.ts":"5121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-catalog-revalidation.test.ts":"5122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-compact-strip-include-6805.test.ts":"5123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-config-hooks-migration.test.ts":"5124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-connection-defaults.test.ts":"5125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-connection-edit-6562.test.ts":"5126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-custom-tool-image-output-7698.test.ts":"5127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-device-flow-tickets.test.ts":"5128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-device-flow.test.ts":"5129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-drop-nonstandard-events.test.ts":"5130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-effort-alias-priority.test.ts":"5131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-effort-model-echo-3697.test.ts":"5132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-executor-split.test.ts":"5133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-failover.test.ts":"5134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-fast-tier.test.ts":"5135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-finalize-tokens.test.ts":"5136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-free-plan-image-generation.test.ts":"5137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-gpt55-effort-routing.test.ts":"5138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-gpt55-routing-5887.test.ts":"5139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-gpt56-catalog.test.ts":"5140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-import-refresh-validation-7522.test.ts":"5141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-import-route.test.ts":"5142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-import-token-route.test.ts":"5143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-manual-refresh-rotating-guard.test.ts":"5144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-models-catalog-refresh.test.ts":"5145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-oauth-refresh-persist-6352.test.ts":"5146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-oauth-remote-host-hint-7523.test.ts":"5147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-orphaned-tool-outputs-2928.test.ts":"5148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-peek-nonsse-body-untouched-7536.test.ts":"5149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-plan-label-2570.test.ts":"5150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-profile-auto-sync-gate.test.ts":"5151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-quota-fetcher.test.ts":"5152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-quota-selection-hydration.test.ts":"5153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-quota-sync-no-proactive-refresh.test.ts":"5154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-reset-credits.test.ts":"5155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-responses-passthrough-strip-3317.test.ts":"5156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-responses-ws-memory.test.ts":"5157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-responses-ws-model-resolution.test.ts":"5158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-session-affinity-reset-aware-5903.test.ts":"5159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-session-json-import-6636.test.ts":"5160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-spark-image-generation.test.ts":"5161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-sse-capacity-fallback.test.ts":"5162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-sse-peek-body-double-read.test.ts":"5163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-stream-false.test.ts":"5164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-synced-bare-model-routing.test.ts":"5165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-system-message-image-8089.test.ts":"5166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-tool-card-button-state.test.ts":"5167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-tools-regex-lookaround.test.ts":"5168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-tools-split.test.ts":"5169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-usage-quotas-latent-window.test.ts":"5170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-usage-quotas-review-window.test.ts":"5171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-usage-windows.test.ts":"5172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-verbosity.test.ts":"5173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-ws-http-fallback.test.ts":"5174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-ws-policy-enforcement-6564.test.ts":"5175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexAuthFile.test.ts":"5176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexAuthImport.test.ts":"5177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexAuthImportBulk.test.ts":"5178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexAuthZipExtract.test.ts":"5179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexBulkImport.test.ts":"5180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/collect-metrics-module-coverage.test.ts":"5181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/colocate-optionals.test.ts":"5182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/auto-quota-cutoff.test.ts":"5183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/auto-status-penalty-4540.test.ts":"5184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-context.test.ts":"5185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-exhausted-skip.test.ts":"5186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-failure-tracker-session-isolation.test.ts":"5187","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-failure-tracker.test.ts":"5188","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-target-exhaustion.test.ts":"5189","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-target-timeout-standards.test.ts":"5190","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/context-requirements-integration.test.ts":"5191","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/effective-max-concurrency.test.ts":"5192","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/pin-recovery.test.ts":"5193","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/quota-share-concurrency.test.ts":"5194","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/recovery-hint.test.ts":"5195","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/strict-context-failopen-8786.test.ts":"5196","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-499-abort.test.ts":"5197","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-account-allowlist-3266.test.ts":"5198","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-antigravity-missing-project-reset-8486.test.ts":"5199","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-apply-strategy-ordering-split.test.ts":"5200","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-attempt-body-isolation-7847.test.ts":"5201","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-auto-candidate-expansion.test.ts":"5202","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-auto-config-split.test.ts":"5203","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-auto-promote.test.ts":"5204","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-body-specific-400-stop-4279.test.ts":"5205","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-bracket-names.test.ts":"5206","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-breaker-429.test.ts":"5207","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-draft.test.ts":"5208","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-effort-variants-8072.test.ts":"5209","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-eligible-connection-2057.test.ts":"5210","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-fingerprint-expansion.test.ts":"5211","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-model-source-5477.test.ts":"5212","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-opencode-prefix.test.ts":"5213","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-options-route.test.ts":"5214","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-cache-invalidation.test.ts":"5215","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-cleanup-stale-connection.test.ts":"5216","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-config.test.ts":"5217","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-length.test.ts":"5218","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-prefix-resolution.test.ts":"5219","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-relay.test.ts":"5220","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-requirements.test.ts":"5221","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-window-filter.test.ts":"5222","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-control-center.test.ts":"5223","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-cooldown-retry.test.ts":"5224","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-cost-blending.test.ts":"5225","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-custom-provider-resolution.test.ts":"5226","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-description-5005.test.ts":"5227","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-diagnostics-trace.test.ts":"5228","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-disable-session-stickiness.test.ts":"5229","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-dispatch-prelude.test.ts":"5230","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-empty-content-failover-5085.test.ts":"5231","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-failure-log-message.test.ts":"5232","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fallback-token-estimate-7847.test.ts":"5233","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fingerprint-expansion.test.ts":"5234","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fingerprint-pin-6696.test.ts":"5235","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-flatten-anthropic-tool-messages.test.ts":"5236","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-forecast.test.ts":"5237","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fusion-config-warn-6455.test.ts":"5238","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fusion-strategy-comboref-6764.test.ts":"5239","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fusion-strategy.test.ts":"5240","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-headroom-ranking.test.ts":"5241","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-headroom-strategy.test.ts":"5242","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-health-dashboard.test.ts":"5243","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-health-route.test.ts":"5244","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-hedging.test.ts":"5245","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-hidden-leaf-routing.test.ts":"5246","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-id-resolution-4446.test.ts":"5247","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-input-bound-failure-8375.test.ts":"5248","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-input-bound-heterogeneous-8375.test.ts":"5249","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-least-used-account.test.ts":"5250","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-lockout-quota-reset-6863.test.ts":"5251","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-max-depth-config.test.ts":"5252","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-model-lockout-honors-reset-1308.test.ts":"5253","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-model-name-collision-8530.test.ts":"5254","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-model-scoped-400-advance.test.ts":"5255","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-name-codex-responses-rewrite.test.ts":"5256","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-omnimodel-tag-stripping.test.ts":"5257","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-param-validation-fallback-4519.test.ts":"5258","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-pin-health-gate.test.ts":"5259","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-pipeline-strategy.test.ts":"5260","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-pipeline.test.ts":"5261","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-prescreen.test.ts":"5262","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-priority-quota-exhaustion-cutoff-5923.test.ts":"5263","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-projection-capabilities-3979.test.ts":"5264","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-provider-cooldown-sibling.test.ts":"5265","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-provider-cooldown.test.ts":"5266","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-provider-diversity-wiring.test.ts":"5267","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-provider-wildcard.test.ts":"5268","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-proxy-assignments-parse-7149.test.ts":"5269","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-quality-validator-reasoning.test.ts":"5270","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-quota-share-cooldown-wait.test.ts":"5271","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-quota-soft-penalty.test.ts":"5272","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-resolve-auto-strategy-split.test.ts":"5273","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-resource-404-health.test.ts":"5274","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-response-validation-failover.test.ts":"5275","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-response-validation.test.ts":"5276","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-responses-sse-failure-fallback.test.ts":"5277","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-round-robin-streaming-lock-3811.test.ts":"5278","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-roundrobin-compat-fallback-6238.test.ts":"5279","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-routes-composite-tiers.test.ts":"5280","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-routing-engine.test.ts":"5281","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-rr-fallback-advance-948.test.ts":"5282","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-rr-session-stickiness-3825.test.ts":"5283","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-rr-sticky-9router.test.ts":"5284","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-runtime-unit-concurrency.test.ts":"5285","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-same-provider-cascade.test.ts":"5286","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-scope-proxy-dead-7149.test.ts":"5287","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-scoring-inspector.test.ts":"5288","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-select-all-batch-8526.test.ts":"5289","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-selected-connection-success.test.ts":"5290","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-session-stickiness.test.ts":"5291","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-sessionless-pin-3825.test.ts":"5292","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-skip-conn-disable-plugin-block-7806.test.ts":"5293","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-speed-telemetry-6875.test.ts":"5294","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-stickiness-responses-input-7270.test.ts":"5295","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-strategies.test.ts":"5296","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-strategy-fallbacks.test.ts":"5297","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-stream-readiness-fallback.test.ts":"5298","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-streaming-empty-content-failover.test.ts":"5299","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-streaming-openai-no-finish-reason-7285.test.ts":"5300","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-strict-random-distribution-3959.test.ts":"5301","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-target-defensive-modelstr.test.ts":"5302","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-target-resolution-split.test.ts":"5303","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-target-timeout-runner.test.ts":"5304","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-target-token-limit-8716.test.ts":"5305","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-task-aware.test.ts":"5306","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-test-health.test.ts":"5307","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-test-route.test.ts":"5308","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-thinking-disabled-fable5-3554.test.ts":"5309","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-vision-aware-routing.test.ts":"5310","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combos-quota-protected.test.ts":"5311","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/comfyui-baseurl-override-6928.test.ts":"5312","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-auth-assist.test.ts":"5313","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-executor.test.ts":"5314","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-maxtokens-negative-5166.test.ts":"5315","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-mimo-v2-5-safety.test.ts":"5316","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-registry-vision.test.ts":"5317","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-user-array-5166.test.ts":"5318","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-vision.test.ts":"5319","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/commandClassification.test.ts":"5320","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/completions-body-model-echo.test.ts":"5321","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/completions-provider-removed.test.ts":"5322","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/completions-text-format-3571.test.ts":"5323","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/complexity-aware-scoring-wiring.test.ts":"5324","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/complexity-router.test.ts":"5325","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compliance-audit-route.test.ts":"5326","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compliance-index.test.ts":"5327","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compliance-noLog-cycle.test.ts":"5328","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compose-redis-loopback-bind.test.ts":"5329","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/composer-tool-calls.test.ts":"5330","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/composite-tiers-validation.test.ts":"5331","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/active-combo-dispatch.test.ts":"5332","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/active-combo-integration.test.ts":"5333","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-chatcore-source-guard.test.ts":"5334","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-compute-target.test.ts":"5335","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-context-budget-config.test.ts":"5336","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-panel-target.test.ts":"5337","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-resolve-plan.test.ts":"5338","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-select-plan-wiring.test.ts":"5339","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/aggressive-fidelity.test.ts":"5340","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/aggressive.test.ts":"5341","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/applycompression-bailout-optin.test.ts":"5342","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/bailout.test.ts":"5343","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/benchmark.test.ts":"5344","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/body-adapter.test.ts":"5345","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/cache-aware-preserve-mode.test.ts":"5346","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/cachingAware.test.ts":"5347","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-db.test.ts":"5348","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-dedup.test.ts":"5349","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-engine.test.ts":"5350","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-hedging.test.ts":"5351","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-preservation.test.ts":"5352","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-rules.test.ts":"5353","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-structural.test.ts":"5354","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-v379.test.ts":"5355","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/cavemanSharedBoundaries.test.ts":"5356","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-cross-tenant.test.ts":"5357","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-eviction-scope-9146.test.ts":"5358","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-marker-retrieve.test.ts":"5359","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-mcp-integration.test.ts":"5360","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-mcp-principal-5649.test.ts":"5361","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-non-mcp-full-prompt-loss-7746.test.ts":"5362","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-retrieval-ramp.test.ts":"5363","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-skip-tool-outputs.test.ts":"5364","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccrQuery.test.ts":"5365","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccrRanged.test.ts":"5366","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/codestripper-lazy-ts-7096.test.ts":"5367","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/codex-responses.test.ts":"5368","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/combos-engine-ui-schema-parity-4955.test.ts":"5369","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compareRoute.test.ts":"5370","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-aggressive.test.ts":"5371","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-benchmark-cli.test.ts":"5372","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-budget-gate.test.ts":"5373","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-combos-db.test.ts":"5374","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-engines-map-migration.test.ts":"5375","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-header-dispatch.test.ts":"5376","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-preview-api.test.ts":"5377","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-preview-auth.test.ts":"5378","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-registry-clear.test.ts":"5379","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-step-streaming.test.ts":"5380","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-tool-cardinality-env.test.ts":"5381","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compressionAnalytics.test.ts":"5382","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compressionAnnotation.test.ts":"5383","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compressionChannel.test.ts":"5384","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compressionMcpTools.test.ts":"5385","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/context-compression-api.test.ts":"5386","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/context-editing-telemetry.test.ts":"5387","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/context-editing.test.ts":"5388","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/db.test.ts":"5389","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/derive-default-plan.test.ts":"5390","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/derived-pipeline-integration.test.ts":"5391","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/diffHelper.test.ts":"5392","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/encoderComparison.test.ts":"5393","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-breakdown-synthesis.test.ts":"5394","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-catalog.test.ts":"5395","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-enabled-toggle.test.ts":"5396","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-guidance-7530.test.ts":"5397","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-registry.test.ts":"5398","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-aggregate.test.ts":"5399","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-corpus.test.ts":"5400","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-cost-meter.test.ts":"5401","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-grader.test.ts":"5402","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-judge.test.ts":"5403","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-report.test.ts":"5404","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-runner.test.ts":"5405","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-savings.test.ts":"5406","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-seed-corpus.test.ts":"5407","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-selftest.test.ts":"5408","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fidelityCheck.test.ts":"5409","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fidelityGate.test.ts":"5410","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fidelityGateStacked.test.ts":"5411","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fidelityGateTypes.test.ts":"5412","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fuzzyDedup.test.ts":"5413","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/gcf-benchmark.test.ts":"5414","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/gcf-inline-array-quote.test.ts":"5415","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/golden-eval.test.ts":"5416","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/hard-budget.test.ts":"5417","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/harness.test.ts":"5418","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/headroom-developer-role-2132.test.ts":"5419","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/headroom-minrows-persist-8056.test.ts":"5420","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/headroom-smartcrusher.test.ts":"5421","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/heatmap-build.test.ts":"5422","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/image-aware-tokens.test.ts":"5423","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ionizerEngine.test.ts":"5424","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ionizerGateSkip.test.ts":"5425","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ionizerSample.test.ts":"5426","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/language-detect-select.test.ts":"5427","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/language-packs.test.ts":"5428","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/lite.test.ts":"5429","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/live-zone.test.ts":"5430","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llm-compressor-engine.test.ts":"5431","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-failopen.test.ts":"5432","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-model-store.test.ts":"5433","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-ultra-entry.test.ts":"5434","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-worker-resolution.test.ts":"5435","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-worker.test.ts":"5436","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcp-accessibility-config.test.ts":"5437","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcp-description-compressor.test.ts":"5438","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcpAccessibility-anchors.test.ts":"5439","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcpAccessibility-clamp.test.ts":"5440","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcpAccessibility-config-bounds.test.ts":"5441","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcpAccessibility.test.ts":"5442","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mode-and-pipeline.test.ts":"5443","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-adapter.test.ts":"5444","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-chatcore-plumbing.test.ts":"5445","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-import.test.ts":"5446","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-plumbing.test.ts":"5447","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-registries.test.ts":"5448","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-registry.test.ts":"5449","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-single-mode.test.ts":"5450","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-apply.test.ts":"5451","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-backcompat.test.ts":"5452","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-catalog.test.ts":"5453","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-config.test.ts":"5454","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-wiring.test.ts":"5455","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/outputMode.test.ts":"5456","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/pipeline-circuit-breaker.test.ts":"5457","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/pipeline-integration.test.ts":"5458","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ponytail-catalog.test.ts":"5459","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/prefix-freeze.test.ts":"5460","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preservation-redos-4795.test.ts":"5461","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preserve-system-prompt-mode-db.test.ts":"5462","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preserve-system-prompt-mode.test.ts":"5463","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preview-fallback-reasons-6461.test.ts":"5464","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preview-outer-engine-token-reconcile-6488.test.ts":"5465","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteBreakdown.test.ts":"5466","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteFidelity.test.ts":"5467","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteFuzzy.test.ts":"5468","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteIonizer.test.ts":"5469","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRoutePipeline.test.ts":"5470","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteTokens.test.ts":"5471","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteToon.test.ts":"5472","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/progressiveAging.test.ts":"5473","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/quantumLockDetect.test.ts":"5474","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/quantumLockIntegration.test.ts":"5475","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/quantumLockStep.test.ts":"5476","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/read-lifecycle.test.ts":"5477","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/relevance-engine.test.ts":"5478","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/relevance-scorer.test.ts":"5479","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/repro-6479-6491-null-stats-silent-drop.test.ts":"5480","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/repro-6480-noop-guard-misfire.test.ts":"5481","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/resolve-compression-plan.test.ts":"5482","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/responses-orphan-tool-call.test.ts":"5483","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/result-memo.test.ts":"5484","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/retrieveRoute.test.ts":"5485","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/retrieveRouteRanged.test.ts":"5486","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/riskGateDetect.test.ts":"5487","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/riskGateIntegration.test.ts":"5488","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/riskGateStep.test.ts":"5489","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-anthropic-tool-result.test.ts":"5490","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-cache-control-preserve.test.ts":"5491","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-code-stripper.test.ts":"5492","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-command-detector.test.ts":"5493","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-command-samples.test.ts":"5494","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-comments.test.ts":"5495","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-custom-filters.test.ts":"5496","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-deduplicator.test.ts":"5497","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-discover-redos.test.ts":"5498","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-dsl-pipeline.test.ts":"5499","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-engine.test.ts":"5500","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-file-read-no-truncate-4559.test.ts":"5501","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-filter-catalog.test.ts":"5502","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-filter-deduplicate.test.ts":"5503","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-filter-loader-resilience.test.ts":"5504","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-filter-redos-guard.test.ts":"5505","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-grouping-config.test.ts":"5506","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-grouping.test.ts":"5507","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-intensity.test.ts":"5508","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-learn.test.ts":"5509","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-line-filter.test.ts":"5510","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-loader-dir-resolution-5089.test.ts":"5511","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-mcp-tools.test.ts":"5512","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-raw-output-route.test.ts":"5513","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-raw-output.test.ts":"5514","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-render-gitdiff.test.ts":"5515","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-render-table.test.ts":"5516","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-render-terraform.test.ts":"5517","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-render-testgreen.test.ts":"5518","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-renderers-integration.test.ts":"5519","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-smart-truncate.test.ts":"5520","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-strip-comments.test.ts":"5521","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-toml-compatibility.test.ts":"5522","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-truncate-preserve.test.ts":"5523","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-verify.test.ts":"5524","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rule-loader.test.ts":"5525","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/session-dedup-intra-message-6467.test.ts":"5526","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/session-dedup-memory-7849.test.ts":"5527","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/session-dedup.test.ts":"5528","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/sessionDedupFuzzy.test.ts":"5529","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/smartcrusherToon.test.ts":"5530","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/splitCompositeCommand.test.ts":"5531","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/stacked-async.test.ts":"5532","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/stacked-pipeline-engines-fallback-6463.test.ts":"5533","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/stats.test.ts":"5534","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/strategySelector-cache-aware.test.ts":"5535","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/strategySelector.test.ts":"5536","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/summarizer.test.ts":"5537","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/toolResultCompressor.test.ts":"5538","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/toon.test.ts":"5539","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/types.test.ts":"5540","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ultra-code-preservation.test.ts":"5541","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ultra-slm-tier.test.ts":"5542","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ultra.test.ts":"5543","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/validation.test.ts":"5544","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-cache-guard-3955.test.ts":"5545","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-cli-rest-fallback-6571.test.ts":"5546","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-exclusions.test.ts":"5547","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-header-echo-6422.test.ts":"5548","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-noop-guard.test.ts":"5549","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-pipeline-inflation-guard.test.ts":"5550","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-pipeline-model.test.ts":"5551","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-run-telemetry-auth.test.ts":"5552","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-settings-cache.test.ts":"5553","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-tokens.test.ts":"5554","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-unknown-engine-validation-6485.test.ts":"5555","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compute-connection-default-name-6499.test.ts":"5556","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/config-hot-reload.test.ts":"5557","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-cache-override-6880.test.ts":"5558","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-level-upstream-headers.test.ts":"5559","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-model-rules.test.ts":"5560","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-reorder-by-availability.test.ts":"5561","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-row-last-error-visibility.test.ts":"5562","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-row-rtl-margin.test.ts":"5563","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-status-filter-active-2526.test.ts":"5564","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/console-log-levels.test.ts":"5565","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-editing-executor-injection.test.ts":"5566","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-editing-relays.test.ts":"5567","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-editing-streaming-telemetry.test.ts":"5568","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-handoff.test.ts":"5569","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-manager.test.ts":"5570","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-pinning-tool-calls.test.ts":"5571","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-window-reconcile-persisted-overrides.test.ts":"5572","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-window-reconcile.test.ts":"5573","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cooldown-aware-retry-budget.test.ts":"5574","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cooldown-epoch-string-3954.test.ts":"5575","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-agent-antigravity-parity.test.ts":"5576","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-codegraph-knowledge.test.ts":"5577","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-free-quota-not-inverted.test.ts":"5578","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-gemini-claude-route-no-responses.test.ts":"5579","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-edu-writeatcursor-6210.test.ts":"5580","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-enterprise-6334.test.ts":"5581","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-enterprise-invocation-7870.test.ts":"5582","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-web-executor.test.ts":"5583","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-web-logging-6210.test.ts":"5584","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-web-silent-empty-7858.test.ts":"5585","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-runOmniRouteCli.test.ts":"5586","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-usage.test.ts":"5587","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-web-executor.test.ts":"5588","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/combo.property.test.ts":"5589","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/fakeUpstreamStream.test.ts":"5590","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/fixtures.test.ts":"5591","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/goldenSnapshot.test.ts":"5592","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/sanitizers.property.test.ts":"5593","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/sse-parser.property.test.ts":"5594","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/translation.golden.test.ts":"5595","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/translators.property.test.ts":"5596","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cors/origins.test.ts":"5597","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cost-explorer-params.test.ts":"5598","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cost-explorer-utils.test.ts":"5599","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/coze-validation-error-5426.test.ts":"5600","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/credential-health-active-connections-9180.test.ts":"5601","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/credential-health-boot-wiring.test.ts":"5602","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/credential-hint-copy-3180-3091.test.ts":"5603","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/credential-masker-guardrail.test.ts":"5604","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/crof-provider.test.ts":"5605","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/crof-usage-fetcher.test.ts":"5606","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/crof-usage.test.ts":"5607","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/crypto-randomuuid-polyfill.test.ts":"5608","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/csp-lan-ws-5083.test.ts":"5609","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-cli-version.test.ts":"5610","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-exec-router.test.ts":"5611","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-models.test.ts":"5612","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-protobuf.test.ts":"5613","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-session.test.ts":"5614","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-system-prompt.test.ts":"5615","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-tool-calls.test.ts":"5616","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-builtin-tool-bridge.test.ts":"5617","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-composer-thinking.test.ts":"5618","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-executor-split.test.ts":"5619","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-image-input.test.ts":"5620","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-model-effort-suffix-7289.test.ts":"5621","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-protobuf-wire-split.test.ts":"5622","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-registry-claude-families.test.ts":"5623","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-streaming.test.ts":"5624","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-usage-fetcher.test.ts":"5625","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-version-detector.test.mjs":"5626","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-cli-config.test.ts":"5627","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-endpoint-paths.test.ts":"5628","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-endpoint-system-prompt.test.ts":"5629","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-headers-provider-nodes.test.ts":"5630","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-model-target-format.test.ts":"5631","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-provider-combo-models.test.ts":"5632","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dahl-manual-api-key.test.ts":"5633","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dahl-provider-config.test.ts":"5634","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dahl-registry.test.ts":"5635","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dahl-tokens-route.test.ts":"5636","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/agentrouter-connection-modal-fields.test.ts":"5637","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/BatchDetailModal.test.tsx":"5638","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/ExpirationBadge.test.tsx":"5639","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/NewBatchWizard.test.tsx":"5640","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/ProgressBarBicolor.test.tsx":"5641","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/UploadFileModal.test.tsx":"5642","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/useBatchActions.test.tsx":"5643","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/concept-cards.test.tsx":"5644","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/list-regression.test.tsx":"5645","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/sanitization.test.tsx":"5646","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/context-parent-redirect-5298.test.ts":"5647","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/crypto-randomuuid-polyfill.test.ts":"5648","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/hydration-extension-attrs.test.ts":"5649","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/material-icons-self-hosted.test.ts":"5650","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providerPageStorage.test.ts":"5651","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/api-key-field.test.ts":"5652","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/auto-start-toggle.test.ts":"5653","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/cliproxy-model-mapping.test.ts":"5654","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/cliproxy-tab.test.ts":"5655","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/mux-tab.test.ts":"5656","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/ninerouter-tab.test.ts":"5657","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/page.test.ts":"5658","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard-localization-contract.test.ts":"5659","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard-shell-tabs.test.ts":"5660","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard-sidebar-desktop-visible.test.ts":"5661","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashscope-cache-control-openai-2069.test.ts":"5662","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashscope-text-models-discovery.test.ts":"5663","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dast-method-not-allowed.test.ts":"5664","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/data-dir-writable-fallback.test.ts":"5665","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/database-settings-maintenance.test.ts":"5666","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/api-keys.test.ts":"5667","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/compressionRunTelemetry.test.ts":"5668","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/context-editing-telemetry-record.test.ts":"5669","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/default-combo-toggle.test.ts":"5670","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/discovery-results.test.ts":"5671","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/encryption-error-handling.test.mjs":"5672","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/migration-071.test.ts":"5673","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/no-migration-collisions.test.ts":"5674","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/notion.test.mjs":"5675","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/obsidian.test.mjs":"5676","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/omp.test.ts":"5677","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/per-engine-analytics.test.ts":"5678","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/per-engine-breakdown-analytics.test.ts":"5679","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/quota-pools.test.ts":"5680","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/repositories/sqliteComboRepositories.test.ts":"5681","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/serviceModels.test.ts":"5682","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/stats-virtual-table.test.ts":"5683","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/vacuum-scheduler.test.ts":"5684","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/weak-rng-fixes.test.ts":"5685","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/betterSqliteAdapter.test.ts":"5686","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/bunSqliteAdapter.test.ts":"5687","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/cliSqlite.test.mjs":"5688","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/driverFactory.test.ts":"5689","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/nodeSqliteShared.test.ts":"5690","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/sqljsAdapter.test.ts":"5691","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-agent-bridge-bypass.test.ts":"5692","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-agent-bridge-mappings.test.ts":"5693","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-agent-bridge-state.test.ts":"5694","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-api-key-groups.test.ts":"5695","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-apiKeys-crud.test.ts":"5696","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-backup-autobackup-setting-5871.test.ts":"5697","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-backup-extended.test.ts":"5698","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-backups-skills-3500.test.ts":"5699","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-call-log-stats-3500.test.ts":"5700","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-case-mapping-split.test.ts":"5701","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-cleanup-xp-audit-log.test.ts":"5702","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-cleanup.test.ts":"5703","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-cli-tool-state.test.ts":"5704","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-combos-crud.test.ts":"5705","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-command-code-auth.test.ts":"5706","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-compression-cache-stats.test.ts":"5707","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-context-handoffs.test.ts":"5708","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-extended.test.ts":"5709","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-init.test.ts":"5710","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-migration.test.ts":"5711","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-native-error.test.ts":"5712","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-temp-store-pragma.test.ts":"5713","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core.test.ts":"5714","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-credit-balance.test.ts":"5715","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-detailed-logs.test.ts":"5716","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-domainState-crud.test.ts":"5717","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-driver-bundling-externals.test.ts":"5718","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-driver-logs-english-5103.test.ts":"5719","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-encryption.test.ts":"5720","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-gamification-federation-3500.test.ts":"5721","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-health-check.test.ts":"5722","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-health-route.test.ts":"5723","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-import-ebusy-5406.test.ts":"5724","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-import-max-size-4719.test.ts":"5725","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-import-resilient-driver-3025.test.ts":"5726","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-inspector-custom-hosts.test.ts":"5727","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-inspector-sessions.test.ts":"5728","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-logs-cache-3500.test.ts":"5729","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-middleware.test.ts":"5730","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migration-runner-account-identity.test.ts":"5731","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migration-runner-extra-dirs.test.ts":"5732","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migration-runner.test.ts":"5733","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migration-version-uniqueness.test.ts":"5734","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migrationrunner-constants-split.test.ts":"5735","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-model-aliases-cascade.test.ts":"5736","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-model-context-overrides.test.ts":"5737","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-models-crud.test.ts":"5738","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-models-extended.test.ts":"5739","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-models-split.test.ts":"5740","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-playground-presets.test.ts":"5741","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-cookie-dedup-3368.test.ts":"5742","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-daily-usage-4009.test.ts":"5743","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-limits.test.ts":"5744","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-plans.test.ts":"5745","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-stats.test.ts":"5746","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-providers-access-token-1290.test.ts":"5747","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-providers-cross-idp-dedup-2244.test.ts":"5748","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-providers-crud.test.ts":"5749","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-providers-split.test.ts":"5750","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-proxies-crud.test.ts":"5751","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-proxies-family.test.ts":"5752","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-proxies-split.test.ts":"5753","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-quota-consumption.test.ts":"5754","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-quota-migrations-idempotency.test.ts":"5755","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-quota-pools.test.ts":"5756","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-quota-snapshots.test.ts":"5757","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-read-cache.test.ts":"5758","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-recovery.test.ts":"5759","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-registered-keys.test.ts":"5760","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-registeredKeys-crud.test.ts":"5761","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-reset-module-state.test.ts":"5762","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-schema-columns-split.test.ts":"5763","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-secrets.test.ts":"5764","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-session-account-affinity.test.ts":"5765","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-settings-crud.test.ts":"5766","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-settings-extended.test.ts":"5767","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-settings-split.test.ts":"5768","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-sqljs-close-poison-7494.test.ts":"5769","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-sqljs-preinit-ordering-gap-7288.test.ts":"5770","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-state-reset.test.ts":"5771","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-sync-tokens.test.ts":"5772","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-tier-config.test.ts":"5773","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-upstreamProxy.test.ts":"5774","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-usage-analytics-3500.test.ts":"5775","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-usageanalytics-split.test.ts":"5776","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-versionManager.test.ts":"5777","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-webhooks.test.ts":"5778","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ddg-circuit-breaker-null-content-6999-7000.test.ts":"5779","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/decrypt-stale-key-hint-6148.test.ts":"5780","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-pow-solver-strict.test.ts":"5781","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-quota-fetcher.test.ts":"5782","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-autorefresh-401-response.test.ts":"5783","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-executor-split.test.ts":"5784","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-rolling-window-2942.test.ts":"5785","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-session-persistence-2942.test.ts":"5786","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tool-result-prompt-4712.test.ts":"5787","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tools-execute-2820.test.ts":"5788","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tools-execute.test.ts":"5789","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tools-nameless-5154.test.ts":"5790","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tools-variants.test.ts":"5791","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web.test.ts":"5792","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/default-reasoning-effort-6879.test.ts":"5793","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/default-url-normalizers-split.test.ts":"5794","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/delete-provider-connection-purges-key-health-7740.test.ts":"5795","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deno-deploy-relay-path-ssrf.test.ts":"5796","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/derive-discovery-config-5087.test.ts":"5797","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/design-grid-background.test.ts":"5798","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/designer-web-empty-response-502.test.ts":"5799","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dev-ensure-native-sqlite.test.ts":"5800","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dev-origins-config.test.ts":"5801","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dev-script-heap-limit.test.ts":"5802","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/device-tracker.test.ts":"5803","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/devin-bridge-live-runtime.test.ts":"5804","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/devin-bridge-network-guard.test.ts":"5805","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/devin-cli-catalog.test.ts":"5806","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/devin-cloud-agent-validator-6142.test.ts":"5807","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dgrid-provider.test.ts":"5808","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/diagnostics-claude-thinking-5108.test.ts":"5809","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/diagnostics.test.ts":"5810","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/digitalocean-provider.test.ts":"5811","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/direct-dispatcher-pipelining-4580.test.ts":"5812","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/discontinued-providers-2026.test.ts":"5813","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/display-and-error-utils.test.ts":"5814","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dns-config-generic.test.ts":"5815","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-base-path-patch.test.ts":"5816","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-ensure-base-path.test.ts":"5817","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-healthcheck-3151.test.ts":"5818","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-healthcheck-base-path.test.ts":"5819","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-llmlingua-optionals-9166.test.ts":"5820","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dockerfile-base-path-arg.test.ts":"5821","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dockerfile-better-sqlite3-node-gyp-6700.test.ts":"5822","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dockerfile-build-heap-4076.test.ts":"5823","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dockerignore-docs-coverage.test.ts":"5824","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docs/skillManifestsLint.test.ts":"5825","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-branch-hardening.test.ts":"5826","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-cost-rules.test.ts":"5827","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-degradation.test.ts":"5828","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-fallback-policy.test.ts":"5829","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-lockout-policy.test.ts":"5830","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-persistence.test.ts":"5831","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/droid-custom-models.test.ts":"5832","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-challenge-split.test.ts":"5833","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-domain-4037.test.ts":"5834","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-vqd-429-misclassification-6996.test.ts":"5835","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-web-executor.test.ts":"5836","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-web-model-catalog-8000.test.ts":"5837","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/early-stream-keepalive.test.ts":"5838","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/earlyStreamKeepalive.test.ts":"5839","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/edgetts-provider.test.ts":"5840","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/effort-thinking-standardization-6241.test.ts":"5841","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-main.test.ts":"5842","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-packaging.test.ts":"5843","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-preload.test.ts":"5844","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-processtree.test.ts":"5845","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-rebuild-spawn-win.test.ts":"5846","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-release-desktop-channel-8949.test.ts":"5847","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-remote-server.test.ts":"5848","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-resolve-node-executable-7941.test.ts":"5849","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-resolve-server-entry.test.ts":"5850","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-smoke-script.test.ts":"5851","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embed-ws-host-empty-messages-5110.test.ts":"5852","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embedding-family-guard.test.ts":"5853","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embedding-rerank-provider-registry.test.ts":"5854","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-auth.test.ts":"5855","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-combo-dimensions.test.ts":"5856","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-combo-family-reject.test.ts":"5857","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-cost-telemetry-headers.test.ts":"5858","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-flatten-single-row-9089.test.ts":"5859","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-gemini-dimensions.test.ts":"5860","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-handler.test.ts":"5861","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-lan-noauth-6925.test.ts":"5862","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-multimodal-7956.test.ts":"5863","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-nvidia-input-type.test.ts":"5864","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-proxy-forwarding.test.ts":"5865","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-route-apikeymeta-6929.test.ts":"5866","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/emergency-fallback-service.test.ts":"5867","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-choices-no-inject.test.ts":"5868","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-content-stopreason-3572.test.ts":"5869","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-response-hardening.test.ts":"5870","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-stream-no-content-8649.test.ts":"5871","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-tool-name-loop.test.ts":"5872","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/encrypted-reasoning-summary-7243.test.ts":"5873","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/encryption.spec.ts":"5874","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/endpoint-categories.test.ts":"5875","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/endpoint-restrictions-policy.test.ts":"5876","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/env-docs-input-sanitizer-8093.test.ts":"5877","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-boundary-stack.test.ts":"5878","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-classification.test.ts":"5879","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-classifier.test.ts":"5880","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-config.test.ts":"5881","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-message-sanitization.test.ts":"5882","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-sensitive-redaction.test.ts":"5883","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/errorClassifier-noauth-403-6315.test.ts":"5884","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/errorclassifier-antigravity-403.test.ts":"5885","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/eslint-import-boundaries.test.ts":"5886","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/estimateSizeFast.test.ts":"5887","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/evalrunner-builtinsuites-split.test.ts":"5888","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/evals-history.test.ts":"5889","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/evals-route.test.ts":"5890","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/event-bus.test.ts":"5891","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/eviction-guards-apiKeyRotator.test.ts":"5892","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/eviction-guards-codexQuotaFetcher.test.ts":"5893","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/execute-chat-resource-pressure-breaker.test.ts":"5894","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-adapta-web.test.ts":"5895","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-agy.test.ts":"5896","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-antigravity-credits.test.ts":"5897","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-antigravity-protocol.test.ts":"5898","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-antigravity.test.ts":"5899","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-azure-ai-responses.test.ts":"5900","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-base-utils.test.ts":"5901","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-bedrock.test.ts":"5902","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-claude-identity.test.ts":"5903","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-cloudflare-ai.test.ts":"5904","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-codex-gpt56-lite-ultra.test.ts":"5905","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-codex-gpt56.test.ts":"5906","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-codex.test.ts":"5907","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-command-code.test.ts":"5908","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-deepseek-web-auto-refresh.test.ts":"5909","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-default-anthropic-auth-8653.test.ts":"5910","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-default-anthropic-compatible-bearer.test.ts":"5911","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-default-base.test.ts":"5912","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-default-strip-client-metadata.test.ts":"5913","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-devin-cli-acp-protocol-8406.test.ts":"5914","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-devin-cli-agentic-acp.test.ts":"5915","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-devin-cli-agentic-core.test.ts":"5916","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-devin-cli.test.ts":"5917","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-doubao-web.test.ts":"5918","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-firecrawl-fetch.test.ts":"5919","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-github-prefill-sanitize.test.ts":"5920","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-github.test.ts":"5921","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-gitlab.test.ts":"5922","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-hailuo-web.test.ts":"5923","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-huggingchat.test.ts":"5924","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-hyperagent.test.ts":"5925","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-inner-ai.test.ts":"5926","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-kimi-web-decoder.test.ts":"5927","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-kimi-web.test.ts":"5928","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-kimi.test.ts":"5929","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-kiro.test.ts":"5930","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-nlpcloud.test.ts":"5931","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-notion-web-thread-sessions.test.ts":"5932","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-notion-web.test.ts":"5933","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-nous-research.test.ts":"5934","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-poe-web.test.ts":"5935","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-pollinations.test.ts":"5936","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-promptql.test.ts":"5937","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-puter.test.ts":"5938","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-qwen-web.test.ts":"5939","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-strip-stainless-openai-compat.test.ts":"5940","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-tinyfish-fetch.test.ts":"5941","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-v0-vercel-web.test.ts":"5942","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-venice-web.test.ts":"5943","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-vertex-extended.test.ts":"5944","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-web-cookie-sweep.test.ts":"5945","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-xai.test.ts":"5946","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-zai-web.test.ts":"5947","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executors-strip-unsupported-params.test.ts":"5948","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/export-json-hide-paid-combos-6328.test.ts":"5949","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/factory-provider-registry.test.ts":"5950","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/faulty-upstream.test.ts":"5951","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-flags-settings.test.ts":"5952","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/args.test.mjs":"5953","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/classify.test.mjs":"5954","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/delivered.test.mjs":"5955","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/frontmatter.test.mjs":"5956","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/integration.test.mjs":"5957","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/lifecycle.test.mjs":"5958","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/resync.test.mjs":"5959","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/featured-providers-rank.test.ts":"5960","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/felo-web-executor.test.ts":"5961","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fetch-error-message.test.ts":"5962","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fetch-timeout.test.ts":"5963","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/field-400-downgrade.test.ts":"5964","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/file-deletion.test.ts":"5965","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/file-expiration-policy.test.ts":"5966","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/finishReason.test.ts":"5967","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/firecrawl-executor.test.ts":"5968","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/firecrawl-quota-fetcher.test.ts":"5969","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/firecrawl-search.test.ts":"5970","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/firecrawl-usage.test.ts":"5971","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fireworks-model-id-prefix.test.ts":"5972","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-2130-system-passthrough.test.ts":"5973","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-bare-model-precedence.test.ts":"5974","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-bare-routing-fallback.test.ts":"5975","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-error-message-candidates.test.ts":"5976","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-synced-model-validation.test.ts":"5977","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-tls-client-node-binary-7802.test.ts":"5978","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-tool-adjacency.test.ts":"5979","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fixes-p1.test.ts":"5980","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/flat-rate-cost-5552.test.ts":"5981","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/format-provider-error-cause.test.ts":"5982","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/format-reset-countdown.test.ts":"5983","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/formatting-public-surface.test.ts":"5984","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/forwarded-header-budget.test.ts":"5985","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-catalog-2026-07-expansion.test.ts":"5986","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-model-catalog.test.ts":"5987","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-models.test.ts":"5988","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-note-freshness.test.ts":"5989","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-provider-rankings-custom-models-6368.test.ts":"5990","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-providers-batch-2026-07.test.ts":"5991","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxies-add-to-pool.test.ts":"5992","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxies-db.test.ts":"5993","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxies-list-search.test.ts":"5994","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxy-auto-sync-scheduler.test.ts":"5995","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxy-providers.test.ts":"5996","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxy-sync-cycle.test.ts":"5997","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-catalog.test.ts":"5998","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-providers-wave1-b.test.ts":"5999","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-providers-wave1-c.test.ts":"6000","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-summary-route.test.ts":"6001","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-used-this-month.test.ts":"6002","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-web-search.test.ts":"6003","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freeProviderRankings-authtype-6915.test.ts":"6004","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freeProviderRankings-filters.test.ts":"6005","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freeProviderRankings.test.ts":"6006","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freemodel-quota-fetcher.test.ts":"6007","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freepik-image-handler.test.ts":"6008","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/functional-gateway-mirrors-append.test.ts":"6009","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/functional-gateway-mirrors-db.test.ts":"6010","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/functional-gateway-predicate.test.ts":"6011","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-judge-model-6455.test.ts":"6012","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-judge-own-intelligence.test.ts":"6013","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-judge-survivor.test.ts":"6014","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-panel-size-cap-1905.test.ts":"6015","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-partial-panel-failure-6454.test.ts":"6016","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-tools-bypass-6771.test.ts":"6017","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/g13-combo-chatcore-golden.test.ts":"6018","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/g4f-space-gateway-6650.test.ts":"6019","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/aggregate-profile-3484.test.ts":"6020","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/antiCheat.test.ts":"6021","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/badge-unlock-once-3472.test.ts":"6022","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/badges.test.ts":"6023","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/db-gamification.test.ts":"6024","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/events.test.ts":"6025","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/federation-auth.test.ts":"6026","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/invites.test.ts":"6027","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/leaderboard.test.ts":"6028","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/sharing.test.ts":"6029","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/streaks.test.ts":"6030","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/xp.test.ts":"6031","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification-display-contract.test.ts":"6032","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-antigravity-pattern-preserved.test.ts":"6033","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-business-provider.test.ts":"6034","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-cli-ansi-sanitization.test.ts":"6035","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-cli-deprecation.test.ts":"6036","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-cli-legacy-refresh.test.ts":"6037","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-finish-reason-normalization.test.ts":"6038","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-helper-audio-input-912.test.ts":"6039","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-helper-http-image-url-port344.test.ts":"6040","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-helper.test.ts":"6041","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-imagen-predict.test.ts":"6042","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-malformed-function-call-finish-reason-2462.test.ts":"6043","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-midstream-error-4177.test.ts":"6044","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-midstream-nonstreaming-responses.test.ts":"6045","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-midstream-responses.test.ts":"6046","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-models-parser.test.ts":"6047","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-multipleof-2309.test.ts":"6048","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-signatureless-text-mode.test.ts":"6049","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-strict-tool-schema.test.ts":"6050","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-thinking-budget-fallback.test.ts":"6051","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-thinking-budget-zero-6813.test.ts":"6052","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-to-openai-function-response.test.ts":"6053","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-tool-choice.test.ts":"6054","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-tool-params-object-3357.test.ts":"6055","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web-cookie-rotation-7676.test.ts":"6056","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web-missing-browser-3516.test.ts":"6057","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web-multiturn-context-8371.test.ts":"6058","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web-tool-calling-7286.test.ts":"6059","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web.test.ts":"6060","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gen-contributors.test.ts":"6061","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/generic-quota-fetcher.test.ts":"6062","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ghe-copilot-targetformat-parity.test.ts":"6063","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ghe-copilot.test.ts":"6064","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-claude-reasoning-effort-granular.test.ts":"6065","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-collector.test.ts":"6066","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-copilot-claude-native-messages.test.ts":"6067","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-copilot-gpt-4o-mini.test.ts":"6068","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-copilot-model-discovery.test.ts":"6069","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-copilot-retired-models.test.ts":"6070","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-models-curated-catalog.test.ts":"6071","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-models-request-compat.test.ts":"6072","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-skill-tools-mcp.test.ts":"6073","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-skills-route-validation.test.ts":"6074","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlab-duo-oauth-setup-8688.test.ts":"6075","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlab-duo-toolcalls-6051.test.ts":"6076","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlab-tool-exchange-bounded-6220.test.ts":"6077","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlab-tool-result-feedback-6220.test.ts":"6078","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlawb-provider.test.ts":"6079","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-executor-max-tokens-clamp-7364.test.ts":"6080","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-executor.test.ts":"6081","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-provider-model-import-route.test.ts":"6082","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-team-quota.test.ts":"6083","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-think-close-marker-leak.test.ts":"6084","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glob-pattern-6540.test.ts":"6085","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/global-package-path.test.ts":"6086","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/google-flow-video-4569.test.ts":"6087","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gpt-max-input-tokens-6191.test.ts":"6088","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gpt5-sampling-guard.test.ts":"6089","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gpt5-tools-reasoning-guard.test.ts":"6090","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gptoss-provider-inference-5852.test.ts":"6091","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/graceful-shutdown-sighup-8045.test.ts":"6092","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-auth-json-paste-7610.test.ts":"6093","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-device-route.test.ts":"6094","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-function-call-output-sanitize-7611.test.ts":"6095","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-oauth-test-supported-7610.test.ts":"6096","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-oauth.test.ts":"6097","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-proactive-refresh-7610.test.ts":"6098","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-provider-limits-ui.test.ts":"6099","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-provider-limits.test.ts":"6100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-proxy-selection.test.ts":"6101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-quota-fetcher.test.ts":"6102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-quota-frame.test.ts":"6103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-reasoning-strip-6288.test.ts":"6104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-responses-compat.test.ts":"6105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-strip-params.test.ts":"6106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-quota-fetcher.test.ts":"6107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-web-cloudflare-classification.test.ts":"6108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-web-executor-split.test.ts":"6109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-web.test.ts":"6110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grokweb-cookie-ua-hint-7567.test.ts":"6111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/groq-field-strip-wiring.test.ts":"6112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/group-provider-permission.test.ts":"6113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gtts-provider.test.ts":"6114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/injection-extraction.test.ts":"6115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/injection-route-coverage.test.ts":"6116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/vision-bridge-callmodel.test.ts":"6117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/vision-bridge-sse-and-reasoning.test.ts":"6118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridge.test.ts":"6119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeHelpers.callVisionModel.test.ts":"6120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeHelpers.extractImageParts.test.ts":"6121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeHelpers.replaceImageParts.test.ts":"6122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeHelpers.resolveImageAsDataUri.test.ts":"6123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeRouter.test.ts":"6124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails-api-3496.test.ts":"6125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails-registry.test.ts":"6126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails-void-no-change-contract.test.ts":"6127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guide-settings-apikey-null-3552.test.ts":"6128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guide-settings-route.test.ts":"6129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/hcnsec-provider.test.ts":"6130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/head-request-closes-6400.test.ts":"6131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/head-request-v1-models-6400.test.ts":"6132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headers-normalize.test.ts":"6133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headroom-codex-quota-snapshot-6379.test.ts":"6134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headroom-detect.test.ts":"6135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headroom-proxy-lifecycle.test.ts":"6136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headroom-responses-format.test.ts":"6137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/health-ping-route.test.ts":"6138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/healthMonitor.test.ts":"6139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/healthz-route.test.ts":"6140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/heap-autocalibrate-5172.test.ts":"6141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/heap-benchmark-corpus.test.ts":"6142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/heap-pressure.test.ts":"6143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/hf-model-suggestions.test.ts":"6144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/hide-paid-models-settings-schema.test.ts":"6145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/home-no-autorouting-banner.test.ts":"6146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/home-page-client-hook-imports-4759.test.ts":"6147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/home-provider-topology-default-4596.test.ts":"6148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/home-provider-topology-live-state.test.ts":"6149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-admin-client.test.ts":"6150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-parity.test.ts":"6151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-promptfoo-ctrf.test.ts":"6152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-provider-tiers.test.ts":"6153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-sse-parser.test.ts":"6154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/huggingchat-jsonl-split.test.ts":"6155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/huggingchat-model-catalog.test.ts":"6156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-block-extra-usage-copy.test.ts":"6157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-cli-namespaces.test.ts":"6158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-config.test.ts":"6159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-detect-browser-locale.test.ts":"6160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-fallback.test.ts":"6161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-glossary-consistency-check.test.ts":"6162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-hardcoded-pt-dashboard-6761.test.ts":"6163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-missing-placeholder-fallback.test.ts":"6164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-nest-dotted-keys.test.ts":"6165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-provider-filter-keys-6290.test.ts":"6166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-provider-visibility-filter-keys-6694.test.ts":"6167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-pt-br.test.ts":"6168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-quota-share-english.test.ts":"6169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-ui-value-drift.test.ts":"6170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-vi-completeness.test.ts":"6171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/idempotency-fusion-collision.test.ts":"6172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/idempotency.test.ts":"6173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-compat-node-alias-shadow.test.ts":"6174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-edits-multipart-3273.test.ts":"6175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-baseurl-3205.test.ts":"6176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-fetch-timeout.test.ts":"6177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-handler.test.ts":"6178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-route-auth.test.ts":"6179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-route.test.ts":"6180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-model-not-in-chat-catalog-6457.test.ts":"6181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-registry-gpt56.test.ts":"6182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-routes-combo-edits-3214-3215.test.ts":"6183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-text-to-image-modality.test.ts":"6184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-upscale.test.ts":"6185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inclusionai-provider.test.ts":"6186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/injection-guard-scan-bound-3932.test.ts":"6187","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/injection-system-prompt-leak-heuristic-4041.test.ts":"6188","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inner-ai-find-model.test.ts":"6189","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/input-sanitizer-pii-redaction.test.ts":"6190","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-agent-bridge-hook.test.ts":"6191","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-buffer.test.ts":"6192","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-context-key.test.ts":"6193","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-conversation-normalizer.test.ts":"6194","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-har-export.test.ts":"6195","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-http-proxy.test.ts":"6196","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-kind-detector.test.ts":"6197","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-llm-metadata.test.ts":"6198","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-pricing.test.ts":"6199","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-process-attribution.test.ts":"6200","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-sse-merger.test.ts":"6201","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-system-proxy.test.ts":"6202","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-types.test.ts":"6203","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-database-closed-6560.test.ts":"6204","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-live-ws.test.ts":"6205","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-node-boot-db-failure.test.ts":"6206","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-process-title.test.ts":"6207","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-warm-catalog-cache.test.ts":"6208","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/intent-classifier-pipeline.test.ts":"6209","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/intercept-fetch-resolver.test.ts":"6210","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/interception-rules.test.ts":"6211","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/internal-service-auth.test.ts":"6212","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/internal-usage-command.test.ts":"6213","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ip-filter-persistence-6131.test.ts":"6214","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ip-filter.test.ts":"6215","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ipUtils.test.ts":"6216","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/isLocalStreamLifecycleError-abort-shape.test.ts":"6217","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/isolate-datadir.test.ts":"6218","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6343-v0-web-alias-collision.test.ts":"6219","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6623-opencode-mimo-reasoning-details-nonstream.test.ts":"6220","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6638-ollama-quota.test.ts":"6221","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6662-repro.test.ts":"6222","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6686-quota-preflight-coverage.test.ts":"6223","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7071-ollama-session-quota.test.ts":"6224","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7284-connection-test-masks-429.test.ts":"6225","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7705-tool-use-id-mismatch.test.ts":"6226","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7793-env-doc-sync-repro.test.ts":"6227","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7856-copilot-reasoning-text-nonstream.test.ts":"6228","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7859-gemini-web-redirect-valid.test.ts":"6229","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-9407-gemini-web-validation-false-positive.test.ts":"6230","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-audit.test.ts":"6231","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-execution.test.ts":"6232","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-github-export.test.ts":"6233","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-route-execution.test.ts":"6234","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-runner.test.ts":"6235","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-runs-route.test.ts":"6236","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-fixes-v3.7.9.test.ts":"6237","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/jina-reader-executor.test.ts":"6238","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/json-migration-combos.test.ts":"6239","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/json-size-exactness.test.ts":"6240","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/json-to-sse-3089.test.ts":"6241","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/keepalive-cleanup-8140.test.ts":"6242","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/keepalive-threshold.test.ts":"6243","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kenari.test.ts":"6244","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/key-health-402-disable-5239.test.ts":"6245","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kie-audio-transcription-result.test.ts":"6246","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kie-executor-routing.test.ts":"6247","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kie-task-helpers.test.ts":"6248","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kilocode-anonymous-fallback-4019.test.ts":"6249","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-cn-region-baseurl.test.ts":"6250","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-coding-apikey-quota-4435.test.ts":"6251","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-coding-model-discovery.test.ts":"6252","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-coding-translator.test.ts":"6253","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-combo-preset.test.ts":"6254","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-k2.7-code-registration.test.ts":"6255","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-native-reasoning-injected-1480.test.ts":"6256","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-partner-aff-links.test.ts":"6257","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-quota-reset-recovery.test.ts":"6258","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-sponsor-banner-version-gate.test.ts":"6259","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-web-models-discovery.test.ts":"6260","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-api-key-route-helpers.test.ts":"6261","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-api-key-service.test.ts":"6262","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-auto-import-idc-2059.test.ts":"6263","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-auto-import-name-dedup-3615.test.ts":"6264","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-available-models.test.ts":"6265","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-builder-id-import-3333.test.ts":"6266","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-catalog-real-models.test.ts":"6267","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-claude-sonnet-5-2267.test.ts":"6268","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-connection-identity.test.ts":"6269","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-continue-filler-5231.test.ts":"6270","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-eventstream-split.test.ts":"6271","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-external-idp.test.ts":"6272","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-gpt56-family-registration.test.ts":"6273","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-iam-profilearn-usage.test.ts":"6274","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-iam-region.test.ts":"6275","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-idc-cross-region.test.ts":"6276","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-import-error-3589.test.ts":"6277","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-import-overwrite-9435.test.ts":"6278","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-long-tool-description-docs.test.ts":"6279","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-model-aliases.test.ts":"6280","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-multi-account-isolation.test.ts":"6281","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-overage-usage-4469.test.ts":"6282","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-region-ssrf-guard.test.ts":"6283","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-social-poll.test.ts":"6284","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-sso-cache-direct-clientid-1253.test.ts":"6285","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-streaming-finish-reason-3980.test.ts":"6286","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-system-reminder-2306.test.ts":"6287","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-tool-args-streaming.test.ts":"6288","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-tool-call-validation.test.ts":"6289","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-tool-schema-sanitize-1375.test.ts":"6290","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-toolresult-compression.test.ts":"6291","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-usage-empty-breakdown-3506.test.ts":"6292","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-windows-auto-import-3363.test.ts":"6293","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiroThinking.test.ts":"6294","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ladder-engine-maps-6533.test.ts":"6295","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/latency-stats-ttft-6875.test.ts":"6296","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/launch-codex-windows-spawn-6312.test.ts":"6297","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/learned-thinking-caps.test.ts":"6298","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/costEstimator.test.ts":"6299","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/csvToJsonl.test.ts":"6300","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/retryFailed.test.ts":"6301","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/schemas.test.ts":"6302","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/validateJsonl.test.ts":"6303","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/connection-cooldown-summary.test.ts":"6304","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/consoleInterceptor-epipe.test.ts":"6305","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/consoleInterceptor-writes.test.ts":"6306","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/jobs/backupScheduleJob.test.ts":"6307","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/jobs/cronMatch.test.ts":"6308","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/machineToken.test.ts":"6309","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/managementCliToken.test.ts":"6310","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/quota-reset-events.test.ts":"6311","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/limiter-lifecycle.test.ts":"6312","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/list-uncovered-commits.test.ts":"6313","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/listCapabilities-a2a.test.ts":"6314","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-model-catalog-reconciliation-8926.test.ts":"6315","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-ws-cookie-parse.test.ts":"6316","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-ws-eaddrinuse-6324.test.ts":"6317","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-ws-public-url.test.ts":"6318","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-ws-standalone-wiring.test.ts":"6319","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/livews-forward-backoff-4604.test.ts":"6320","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/llama-cpp-local-url.test.ts":"6321","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/llamacpp-model-delete.test.ts":"6322","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/llm-selector-custom-vision-models.test.ts":"6323","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/llm7-byteplus-models-fetch-3976.test.ts":"6324","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lmarena-provider.test.ts":"6325","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lmarena-split-cookie-4271.test.ts":"6326","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lmstudio-embedding-provider-7601.test.ts":"6327","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/local-aliases-precedence.test.ts":"6328","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/local-corpus-index.test.ts":"6329","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/local-corpus-tools.test.ts":"6330","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/local-redis-runtime.test.ts":"6331","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/log-export-routes.test.mjs":"6332","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/log-redaction.test.ts":"6333","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/log-retention.test.ts":"6334","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/log-rotation.test.ts":"6335","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/logenv-datadir-path-6197.test.ts":"6336","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/logger-redaction-wiring.test.ts":"6337","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/logger-write-after-datadir-removed-6360.test.ts":"6338","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/login-bootstrap-route.test.ts":"6339","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/login-shell-path-3321.test.ts":"6340","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-bizchat-frames-4042.test.ts":"6341","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-connection-4042.test.ts":"6342","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-tier-selector-6334.test.ts":"6343","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-tone-model-variants.test.ts":"6344","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-web-token-extraction-7078.test.ts":"6345","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mac-update-manifest-merge.test.ts":"6346","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/machine-id.test.ts":"6347","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/main-server-keepalive-timeout-7003.test.ts":"6348","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/main-server-timeouts-parity.test.ts":"6349","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/managed-available-models.test.ts":"6350","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/managed-model-import.test.ts":"6351","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/management-auth-docs.test.ts":"6352","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/management-auth-hardening.test.ts":"6353","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/management-password-insecure-default.test.ts":"6354","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/management-password.test.ts":"6355","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/manual-config-modal-clipboard.test.ts":"6356","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/maritalk-model-catalog.test.ts":"6357","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mark-account-unavailable-numeric-epoch-guard.test.ts":"6358","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mask-email.test.ts":"6359","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/masked-200-exhaustion-fallback-6427.test.ts":"6360","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/materialize-bundled-symlinks.test.ts":"6361","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp/serverSmartFilter.test.ts":"6362","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp/tool-cardinality.test.ts":"6363","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp/tool-definition-reexport.test.ts":"6364","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-connect-scope.test.ts":"6365","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-extra-forward-6178.test.ts":"6366","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-memory-tools-strategy.test.ts":"6367","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-model-catalog.test.ts":"6368","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-pool-tools-3368.test.ts":"6369","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-published-files-closure-3578.test.ts":"6370","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-server-entry.test.ts":"6371","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-server-hollow-dist-deps.test.ts":"6372","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-session-sweep.test.ts":"6373","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-sse-response-headers-8277.test.ts":"6374","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-tool-collections-shape.test.ts":"6375","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-tool-count-dedup-6854.test.ts":"6376","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-web-fetch-tool.test.ts":"6377","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/media-body-arraybuffer-backing.test.ts":"6378","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/media-cost-headers-handlers.test.ts":"6379","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/media-cost-headers.test.ts":"6380","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/media-provider-ordering.test.ts":"6381","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory/typed-decay.test.ts":"6382","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-cache-safe-injection.test.ts":"6383","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-cache.test.ts":"6384","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-cache.test.ts":"6385","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-list-providers.test.ts":"6386","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-remote.test.ts":"6387","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-resolve.test.ts":"6388","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-static-potion.test.ts":"6389","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-transformers.test.ts":"6390","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-engine-status.test.ts":"6391","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-extraction.test.ts":"6392","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-glm-injection.test.ts":"6393","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-needs-reindex.test.ts":"6394","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-reindex-batch.test.ts":"6395","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-retrieval-hybrid.test.ts":"6396","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-retrieval-rerank.test.ts":"6397","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-retrieval-semantic.test.ts":"6398","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-retrieve-preview.test.ts":"6399","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-route.test.ts":"6400","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-schemas-roundtrip.test.ts":"6401","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-settings-default.test.ts":"6402","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-settings-extended.test.ts":"6403","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-settings.test.ts":"6404","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-stats-api.test.ts":"6405","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-store-sync.test.ts":"6406","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-store.test.ts":"6407","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-summarization-older-than.test.ts":"6408","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-summarization.test.ts":"6409","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-system-first-6135.test.ts":"6410","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-tools.test.ts":"6411","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vec-meta.test.ts":"6412","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-crud.test.ts":"6413","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-ensure-ready.test.ts":"6414","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-int8-quant.test.ts":"6415","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-load.test.ts":"6416","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-rrf.test.ts":"6417","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-stats.test.ts":"6418","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-upsert-self-heal.test.ts":"6419","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/merge-train-plan.test.ts":"6420","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/messages-count-tokens-route.test.ts":"6421","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/microsoft-designer-web-6672.test.ts":"6422","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/middleware-header-strip-5849.test.ts":"6423","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/middleware-hook-sandbox-5872.test.ts":"6424","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/middleware-hooks-error-sanitization.test.ts":"6425","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/migration-107-quota-share-strategy.test.ts":"6426","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/migration-safety-abort-6260.test.ts":"6427","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mimo-thinking-normalize.test.ts":"6428","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mimocode-executor.test.ts":"6429","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-coding-plan-usage.test.ts":"6430","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-image-provider-2482.test.ts":"6431","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-m3-maxtokens.test.ts":"6432","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-m3-model-registry.test.ts":"6433","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-media-servicekinds.test.ts":"6434","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-thinking-signature-2706.test.ts":"6435","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-tts-1043.test.ts":"6436","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mistral-strip-reasoning-content-1649.test.ts":"6437","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mistral-trailing-assistant.test.ts":"6438","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-alias-config-shim.test.ts":"6439","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-antigravity-reasoning-effort-override.test.ts":"6440","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-cert-install-mode-9442.test.ts":"6441","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-cert-mac-fingerprint.test.ts":"6442","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-cert-migration-6684.test.ts":"6443","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-cert-removal-wiring.test.ts":"6444","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-detection.test.ts":"6445","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-diagnostics.test.ts":"6446","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-dns-graceful-degrade-6127.test.ts":"6447","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-dnsConfig.test.ts":"6448","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-forward-target.test.ts":"6449","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-antigravity.test.ts":"6450","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-base.test.ts":"6451","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-claudeCode.test.ts":"6452","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-codex.test.ts":"6453","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-copilot.test.ts":"6454","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-cursor.test.ts":"6455","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-kiro.test.ts":"6456","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-openCode.test.ts":"6457","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-trae.test.ts":"6458","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-zed.test.ts":"6459","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-hosts-cleanup-on-exit.test.ts":"6460","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-ingest-route-sanitize.test.ts":"6461","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-ingest-shim.test.ts":"6462","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-manager-bypass-json.test.ts":"6463","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-manager-cleanup-symmetry.test.ts":"6464","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-manager-repair.test.ts":"6465","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-manager-stub.test.ts":"6466","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-masksecrets.test.ts":"6467","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-passthrough.test.ts":"6468","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-privileged-steps-sudo-gate.test.ts":"6469","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-root-ca-leaf-issuance-6684.test.ts":"6470","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-root-ca-persistence-6684.test.ts":"6471","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-sanitize-headers.test.ts":"6472","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-server-claude-code-routing.test.ts":"6473","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-server-connect.test.ts":"6474","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-server-loop-guard.test.ts":"6475","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-server-timeouts.test.ts":"6476","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-start-guard.test.ts":"6477","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-startup-error-3606.test.ts":"6478","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-stop-dns-before-kill-1809.test.ts":"6479","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-stub-alias-6344.test.mjs":"6480","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-sudo-gate-822.test.ts":"6481","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-sudo-graceful-degrade.test.ts":"6482","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-system-commands-prefix-3641.test.ts":"6483","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-systemCommands-no-sudo.test.ts":"6484","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-targets-resolve.test.ts":"6485","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-targets-route.test.ts":"6486","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-tool-hosts.test.ts":"6487","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-upstream-ca-wiring.test.ts":"6488","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-upstream-trust.test.ts":"6489","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mixedbread-embedding-provider-6660.test.ts":"6490","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modal-credential-combine.test.ts":"6491","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modal-validation-model-prefill.test.ts":"6492","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modalCost.test.ts":"6493","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-alias-provider-resolution.test.ts":"6494","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-alias-route.test.ts":"6495","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-alias-seed.test.ts":"6496","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-aliases-globalthis-5777.test.ts":"6497","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-aliases-settings-route-selfheal.test.ts":"6498","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-breakdown-sort-8769.test.ts":"6499","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-kimi-k3-vision-8250.test.ts":"6500","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-mimo-vision-override.test.ts":"6501","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-mistral-vision-sync-4073.test.ts":"6502","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-path-shaped-vision-8032.test.ts":"6503","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-provider-unsupported-tools.test.ts":"6504","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-registry.test.ts":"6505","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-specialty-8016.test.ts":"6506","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capability-overrides.test.ts":"6507","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-catalog-name-disambiguation.test.ts":"6508","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-catalog-search.test.ts":"6509","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-catalog-source.test.ts":"6510","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-combo-mappings-db.test.ts":"6511","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-combo-mappings.test.ts":"6512","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-connid-prefix-normalization-6772.test.ts":"6513","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-context-override-readpath.test.ts":"6514","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-cooldowns-route-auth.test.ts":"6515","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-cooldowns-route.test.ts":"6516","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-cross-proxy-compat.test.ts":"6517","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-deprecation.test.ts":"6518","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-discovery-reasoning-levels.test.ts":"6519","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-family-fallback-notation.test.ts":"6520","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-intelligence-db.test.ts":"6521","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-latency-stats-route.test.ts":"6522","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-listing-capability-5420.test.ts":"6523","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-lockout-decay.test.ts":"6524","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-lockout-exact-cooldown-cap.test.ts":"6525","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-lockout-max-cooldown.test.ts":"6526","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-metadata-registry.test.ts":"6527","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-output-cap-synced-fallthrough-6714.test.ts":"6528","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-parse.test.ts":"6529","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-pricing-litellm-gap-9364.test.ts":"6530","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-resolver.test.ts":"6531","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-select-all-confirm-threshold-8526.test.ts":"6532","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-select-hidden-map-helpers-9203.test.ts":"6533","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-select-null-alias-guard-2247.test.ts":"6534","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-select-passthrough-alias-485.test.ts":"6535","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-spec-lookup-index-8697.test.ts":"6536","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-strip.test.ts":"6537","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-sync-custom-preservation.test.ts":"6538","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-sync-route.test.ts":"6539","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-sync-scheduler.test.ts":"6540","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-test-route.test.ts":"6541","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-test-runner-compression-off-6240.test.ts":"6542","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-test-runner.test.ts":"6543","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-token-limit-catalog.test.ts":"6544","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-auto-combos-4164.test.ts":"6545","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-block-auto-5192.test.ts":"6546","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-combo-metadata.test.ts":"6547","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-envkey-6406.test.ts":"6548","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-exact-dup-4424.test.ts":"6549","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-functional-gateway.test.ts":"6550","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-hidden-combo-leaves.test.ts":"6551","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-hide-paid.test.ts":"6552","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-low-noise-flag.test.ts":"6553","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-route.test.ts":"6554","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-dev-pricing-memoization-8697.test.ts":"6555","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-test-error-shape.test.ts":"6556","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelsDevSync-extended.test.ts":"6557","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelsDevSync.test.ts":"6558","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelscope-policy.test.ts":"6559","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelscope-provider.test.ts":"6560","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelsdev-specialty-keying-8017.test.ts":"6561","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelsdevsync-transform-split.test.ts":"6562","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/moderations-handler.test.ts":"6563","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modular-schemas.test.ts":"6564","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/monaco-editor-import-path.test.ts":"6565","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/moonshot-k3.test.ts":"6566","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/morph-provider-catalog.test.ts":"6567","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/multipart-body-arraybuffer-backing.test.ts":"6568","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/muse-spark-cookie-copy-5449.test.ts":"6569","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/muse-spark-response-parser-split.test.ts":"6570","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/muse-spark-web-continuation.test.ts":"6571","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/muse-spark-ws-auth-token-9502.test.ts":"6572","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/music-generation-handler.test.ts":"6573","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/namespace-tool-identity-integration.test.ts":"6574","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nanobanana-image-generation.test.ts":"6575","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nanobanana-image-handler.test.ts":"6576","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/native-binary-compat.test.ts":"6577","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/new-content-providers.test.ts":"6578","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/newapi-aggregator-preflight-dispatch.test.ts":"6579","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/newapi-aggregator-quota-fetcher.test.ts":"6580","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/next-config.test.ts":"6581","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nightly-compat-node26-webpack-8090.test.ts":"6582","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ninerouter-embed-port-6205.test.ts":"6583","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ninerouter-executor.test.ts":"6584","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/no-memory-header.test.ts":"6585","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/no-src-open-sse-alias.test.ts":"6586","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/no-thinking-alias.test.ts":"6587","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noAuthProxyResolution.relayAuth.test.ts":"6588","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-autocombo-allowlist.test.ts":"6589","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-autocombo-exclude-7622.test.ts":"6590","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-autocombo-hidden-7620.test.ts":"6591","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-autocombo-lockout-7623.test.ts":"6592","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-blocked-partition-5183.test.ts":"6593","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-imported-models-3200.test.ts":"6594","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-provider-validation.test.ts":"6595","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-proxy-resolution.test.ts":"6596","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/node-runtime-support.test.ts":"6597","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/non-streaming-sse-terminal-typescan-4459.test.ts":"6598","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nonstream-usage-cache-tokens.test.ts":"6599","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nonstreaming-gemini-family-response-projection.test.ts":"6600","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/normalize-base-path.test.ts":"6601","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notification-toast-coercion.test.ts":"6602","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notificationStore.test.ts":"6603","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notion-api.test.ts":"6604","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notion-thread-idor-7900.test.ts":"6605","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notion-tools.test.ts":"6606","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notion-web-models-discovery.test.ts":"6607","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/npm-publish-artifact-provenance.test.ts":"6608","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/npm-runtime-deps-fumadocs-mdx-7661.test.ts":"6609","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nube-provider.test.ts":"6610","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/numeric-helpers.test.ts":"6611","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-catalog-drift.test.ts":"6612","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-minimax-m3-removed-3329.test.ts":"6613","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-minimax-thinking-strip.test.ts":"6614","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-nim-catalog-expansion-2373.test.ts":"6615","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-nim-image.test.ts":"6616","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-nim-registry-6108.test.ts":"6617","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-nim-validator.test.ts":"6618","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-passthrough-models-6773.test.ts":"6619","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-quota-phase1.test.ts":"6620","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-strip-prompt-cache-key.test.ts":"6621","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-tool-compatibility-2840.test.ts":"6622","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-validation-bypass-proxy-3226.test.ts":"6623","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-validation-model-3116.test.ts":"6624","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-callback-path-doc.test.ts":"6625","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-connection-persistence-codex-dedup.test.ts":"6626","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-connection-test-codex-endpoint.test.ts":"6627","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-connection-test-timeout.test.ts":"6628","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-connection-tokenexpiresat-5326.test.ts":"6629","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-credential-blob.test.ts":"6630","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-cursor-auto-import.test.ts":"6631","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-device-code-endpoints.test.ts":"6632","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-device-code-error-transparency.test.ts":"6633","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-error-linkify-5486.test.ts":"6634","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-google-loopback-guidance.test.ts":"6635","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-grok-cli-browser.test.ts":"6636","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-keychain-import-only-6041.test.ts":"6637","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-keychain-import-only-guard.test.ts":"6638","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-kiro-idc.test.ts":"6639","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-kiro.test.ts":"6640","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-lan-loopback-guidance.test.ts":"6641","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-legacy-services-removed.test.ts":"6642","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-modal-codex-lan-ip-8046.test.ts":"6643","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-modal-grok-cli-browser-login-7013.test.ts":"6644","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-modal-grok-cli-paste-7610.test.ts":"6645","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-modal-typescript-regressions.test.ts":"6646","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-paste-credentials-route.test.ts":"6647","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-paste-credentials.test.ts":"6648","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-providers-config.test.ts":"6649","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-providers-error-handling.test.ts":"6650","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-redirect-uri-mismatch.test.ts":"6651","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-refresh-connection-dedup-8059.test.ts":"6652","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-refresh-error-resilience.test.ts":"6653","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-test-config-8408.test.ts":"6654","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-trae.test.ts":"6655","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/observability-fase04.test.ts":"6656","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/observability-payloads.test.ts":"6657","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-api.test.ts":"6658","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-config.test.ts":"6659","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-plugin-sync.test.ts":"6660","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-tools.test.ts":"6661","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-webdav-route.test.ts":"6662","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ocr-route.test.ts":"6663","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oidc-callback.test.ts":"6664","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-cloud-usage.test.ts":"6665","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-cloud-weekly-quota-cooldown-3709.test.ts":"6666","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-local-embedding-2824.test.ts":"6667","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-local-provider.test.ts":"6668","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-transform.test.ts":"6669","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/omni-skills-page.test.tsx":"6670","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/omniroute-decision-header.test.ts":"6671","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/omniroute-meta-fallback-attempts.test.ts":"6672","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/omniroute-response-meta.test.ts":"6673","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/onboarding-step-titles-i18n-4698.test.ts":"6674","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/onboarding-wizard-details-link-6145.test.ts":"6675","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/onboarding-wizard-route-5427.test.ts":"6676","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-developer-role-normalize.test.ts":"6677","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-gpt56-catalog.test.ts":"6678","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-gpt56-responses-routing.test.ts":"6679","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-only-models-5842.test.ts":"6680","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-reasoning-effort.test.ts":"6681","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-request-split.test.ts":"6682","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-single-text-content-string.test.ts":"6683","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-subagent-strip-2446.test.ts":"6684","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-verbosity.test.ts":"6685","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-style-providers-4239-4155-3841.test.ts":"6686","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-bare-tool.test.ts":"6687","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-empty-messages-5245.test.ts":"6688","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-file-attachments.test.ts":"6689","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-glm-split-tool-name-2077.test.ts":"6690","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-redacted-replay-5312.test.ts":"6691","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-strip-empty-signature-6953.test.ts":"6692","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-strip-empty.test.ts":"6693","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-strip-temperature-thinking.test.ts":"6694","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-thinking-budget-split.test.ts":"6695","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-gemini-gemma-thinking.test.ts":"6696","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-gemini-helpers-split.test.ts":"6697","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-kiro-helpers-split.test.ts":"6698","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-tool-opaque-object-schema.test.ts":"6699","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-coverage.test.ts":"6700","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-security-tiers.test.ts":"6701","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-spec-example-body.test.ts":"6702","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-spec-route.test.ts":"6703","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-try-route.test.ts":"6704","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-ws-endpoint.test.ts":"6705","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-cli-headers-synthesis-5997.test.ts":"6706","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-deepseek-reasoning-injected.test.ts":"6707","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-executor.test.ts":"6708","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-free-tier-catalog-stale-6998.test.ts":"6709","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-catalog-alignment.test.ts":"6710","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-effort-aliases-6922.test.ts":"6711","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-effort-aliases-8353.test.ts":"6712","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-quota-no-zai.test.ts":"6713","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-usage.test.ts":"6714","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-noauth-models-route.test.ts":"6715","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-proxy-rotation-4954.test.ts":"6716","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-quota-fetcher.test.ts":"6717","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-strip-client-metadata-1442.test.ts":"6718","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-zen-alias-combo-e2e.test.ts":"6719","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencodeReasoningSanitizer.test.ts":"6720","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-context-length-3202.test.ts":"6721","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-embeddings-catalog-6976.test.ts":"6722","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-free-window-wiring-6842.test.ts":"6723","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-midstream-error-chunk.test.ts":"6724","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-provider-stats.test.ts":"6725","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-quota-6842.test.ts":"6726","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-registry.test.ts":"6727","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-vision-sync-4264.test.ts":"6728","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openvecta-provider-registration.test.ts":"6729","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ops-scripts.test.ts":"6730","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/orphaned-tool-filter.test.ts":"6731","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/outbound-url-guard-feature-flag.test.ts":"6732","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/output-token-budget-model-cap.test.ts":"6733","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/output-token-budget.test.ts":"6734","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pack-artifact-entrypoint-closures.test.ts":"6735","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pack-artifact-policy.test.ts":"6736","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pack-artifact-server-ws-closure.test.ts":"6737","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pagination.test.ts":"6738","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/paid-model-target-6540.test.ts":"6739","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/paid-model-target-routes-6540.test.ts":"6740","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/param-filters-apply.test.ts":"6741","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/param-filters-auto-learn.test.ts":"6742","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/param-filters-db.test.ts":"6743","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/parse-model-defensive.test.ts":"6744","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/parse-provider-import-6836.test.ts":"6745","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/passthrough-alias-1850.test.ts":"6746","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/payload-rules-restart-persistence.test.ts":"6747","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/payload-rules-route.test.ts":"6748","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/payload-rules.test.ts":"6749","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/peer-routing.test.ts":"6750","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pending-counter-drift-8141.test.ts":"6751","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-key-validation-models.test.ts":"6752","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-tls-client.test.ts":"6753","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-web-executor-split.test.ts":"6754","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-web-model-mappings.test.ts":"6755","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-web-streaming-tools-5927.test.ts":"6756","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-web.test.ts":"6757","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/persist-429-cooldown-account-fallback.test.ts":"6758","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pick-internal-api-key-6372.test.ts":"6759","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pii-opt-in-default.test.ts":"6760","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/piiReproduction.test.ts":"6761","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/piiSanitizer.test.ts":"6762","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/piiSanitizerIpv6.test.ts":"6763","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pioneer-provider.test.ts":"6764","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pipeline-router.test.ts":"6765","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pipeline.test.ts":"6766","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plan3-p0.test.ts":"6767","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-code-export.test.ts":"6768","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-key-policy-3503.test.ts":"6769","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-model-filter-3505.test.ts":"6770","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-model-qualify.test.ts":"6771","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-model-selection-3731.test.ts":"6772","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-prompt-improver.test.ts":"6773","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-reasoning-controls-6241.test.ts":"6774","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-schemas.test.ts":"6775","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-stream-metrics.test.ts":"6776","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-analytics.test.ts":"6777","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-api-routes.test.ts":"6778","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-config-route.test.ts":"6779","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-config-validation.test.ts":"6780","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-config.test.ts":"6781","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-db.test.ts":"6782","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-dev-mode.test.ts":"6783","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-doctor.test.ts":"6784","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-edge-cases.test.ts":"6785","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-errors.test.ts":"6786","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-fs-safety.test.ts":"6787","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-hook-payload-chaining-3286.test.ts":"6788","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-hooks-rate-limit.test.ts":"6789","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-hooks.test.ts":"6790","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-index.test.ts":"6791","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-loader-ipc.test.ts":"6792","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-loader.test.ts":"6793","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-logger.test.ts":"6794","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-manager-lifecycle.test.ts":"6795","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-manager-restart-reload-7806.test.ts":"6796","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-manager.test.ts":"6797","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-manifest.test.ts":"6798","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-marketplace.test.ts":"6799","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-metrics.test.ts":"6800","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-permissions.test.ts":"6801","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-route-error-sanitization.test.ts":"6802","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-scanner.test.ts":"6803","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-set-enabled-shim-3473.test.ts":"6804","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-signing.test.ts":"6805","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-tools.test.ts":"6806","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-upgrade.test.ts":"6807","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-welcome-banner-e2e.test.ts":"6808","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/podman-machine-guidance-8497.test.ts":"6809","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/poe-api-executor-regression.test.ts":"6810","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/poe-provider-models-baseurl.test.ts":"6811","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/policy-engine.test.ts":"6812","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pollinations-image-anon-fallback-8085.test.ts":"6813","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pollinations-jsonmode-3981.test.ts":"6814","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/postinstall-support.test.ts":"6815","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pr-self-target-guard.test.ts":"6816","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-ag-flash-tiers.test.ts":"6817","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-cc-anthropic-rates.test.ts":"6818","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-constants-split.test.ts":"6819","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-route-sources.test.ts":"6820","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-sync-cross-instance.test.ts":"6821","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-sync-extended.test.ts":"6822","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-sync-status-7955.test.ts":"6823","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-sync.test.ts":"6824","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricingSync.modal.test.ts":"6825","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-6409-turbopack-memory-doc.test.ts":"6826","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-6699-jules-executor-misroute.test.ts":"6827","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-6835-cyclebreaker.test.ts":"6828","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-6835-oom-uncapped.test.ts":"6829","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-7134-claude-web-empty-error-body.test.ts":"6830","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-7293-strict-system-hoist.test.ts":"6831","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-9064-code-execution-beta.test.ts":"6832","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-9408-tool-use-protocol.test.ts":"6833","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-9541-repro.test.ts":"6834","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-9575-tool-name-case.test.ts":"6835","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/processManager.test.ts":"6836","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/progress-tracker.test.ts":"6837","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-cache-affinity.test.ts":"6838","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-cache-prefix-analyzer.test.ts":"6839","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-injection-guard-db-flag.test.ts":"6840","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-injection-guard.test.ts":"6841","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-required-routes.test.ts":"6842","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-add-ux-i18n-import-warning.test.ts":"6843","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-alias-transitive-5918.test.ts":"6844","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-alias-uniqueness.test.ts":"6845","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-apikey-cap-6715.test.ts":"6846","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-audit.test.ts":"6847","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-columns.test.ts":"6848","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connection-apikey-dedup.test.ts":"6849","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connection-healthcheck-interval-zero.test.ts":"6850","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connection-status.test.ts":"6851","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connections-fetch-url-2998.test.ts":"6852","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connections-pagination-2998.test.ts":"6853","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connections-quota-threshold.test.ts":"6854","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connections-ui-regression.test.ts":"6855","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-credential-requirement.test.ts":"6856","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-detect-format-endpoint.test.ts":"6857","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-display-label.test.ts":"6858","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-endpoints-friendliai-novita.test.ts":"6859","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-error-rules.test.ts":"6860","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-field-strips.test.ts":"6861","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-filters-url-sync.test.ts":"6862","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-header-profiles.test.ts":"6863","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-health-matrix.test.ts":"6864","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-hints.test.ts":"6865","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-icon-arena-themed.test.ts":"6866","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-learn-more-link.test.ts":"6867","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-401-reauth-hint.test.ts":"6868","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-accesstoken-fallback-on-refresh-failure.test.ts":"6869","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-apikey-proxy-context.test.ts":"6870","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-chunked-spacing-sync.test.ts":"6871","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-force-refresh-imported.test.ts":"6872","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-local-apikey-sync-spacing.test.ts":"6873","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-oauth-sequential-sync.test.ts":"6874","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-provider-filter.test.ts":"6875","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-proxy-fail-closed.test.ts":"6876","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-recovery.test.ts":"6877","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-rotating-expired-guard.test.ts":"6878","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-sanitize-scope-3821.test.ts":"6879","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-sync-scheduler-public-surface.test.ts":"6880","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-ui.test.ts":"6881","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-metadata-5461-5470-5534.test.ts":"6882","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-metrics-route.test.ts":"6883","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-model-filter-live-catalog-7250.test.ts":"6884","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-config.test.ts":"6885","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-context-window-override-4125.test.ts":"6886","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-custom-merge-6247.test.ts":"6887","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-discovery-split.test.ts":"6888","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-management-route.test.ts":"6889","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-qwen-web-redirect-6267.test.ts":"6890","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-route-codex.test.ts":"6891","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-route-lan-guard.test.ts":"6892","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-route.test.ts":"6893","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-token-limits.test.ts":"6894","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-v1-route.test.ts":"6895","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-vision-override-1904.test.ts":"6896","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-node-dedup-4746.test.ts":"6897","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-node-icon-url.test.ts":"6898","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-node-select-4421.test.ts":"6899","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-nodes-route.test.ts":"6900","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-nodes-validate-docker-hint.test.ts":"6901","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-nodes-validate-modelid.test.ts":"6902","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-nodes-vibeproxy-preset.test.ts":"6903","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-onboarding-href.test.ts":"6904","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-onboarding-wizard.test.ts":"6905","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-page-helpers-3501.test.ts":"6906","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-plugin-manifest-url.test.ts":"6907","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-plugin-manifest.test.ts":"6908","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-proxy-lazy.test.ts":"6909","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-quota-visibility.test.ts":"6910","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-quota-widget-icon-prop.test.ts":"6911","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-rate-limit-overrides-schema.test.ts":"6912","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-freetheai.test.ts":"6913","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-github-copilot-gpt-4.test.ts":"6914","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-github-copilot-gpt-4o.test.ts":"6915","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-github-copilot-targetformat.test.ts":"6916","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-kilocode-format.test.ts":"6917","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-llm7-cohere.test.ts":"6918","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-models-guard.test.ts":"6919","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-openai-gemini-expanded-models.test.ts":"6920","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-qwen-vision.test.ts":"6921","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-request-capture-toolname-antigravity-4181.test.ts":"6922","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-request-capture-toolname-map-4091.test.ts":"6923","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-request-failure-pipeline.test.ts":"6924","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-request-logging.test.ts":"6925","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-route-schemas.test.ts":"6926","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-scoped-aliases.test.ts":"6927","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-scoped-chat-completions-validation.test.ts":"6928","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-scoped-models-route.test.ts":"6929","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-section-visibility.test.ts":"6930","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-service-kind-filter-4240.test.ts":"6931","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-service.test.ts":"6932","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-settings-default.test.ts":"6933","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-setup-links-5572.test.ts":"6934","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-specific-data-schema.test.ts":"6935","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-sweep-live-discovery.test.ts":"6936","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-target-format-badge-4475.test.ts":"6937","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-test-account-deactivated.test.ts":"6938","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-test-mistral-401-classify.test.ts":"6939","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-tier-field-helpers.test.ts":"6940","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-translate-path-golden.test.ts":"6941","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-azure-vertex.test.ts":"6942","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-branches.test.ts":"6943","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-firepass-403.test.ts":"6944","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-hardening.test.ts":"6945","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-image-only.test.ts":"6946","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-qwen-web-5855.test.ts":"6947","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-specialty.test.ts":"6948","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-ssrf-guard.test.ts":"6949","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-tinyfish.test.ts":"6950","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-web-cookie-auth007.test.ts":"6951","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-webfetch-4401.test.ts":"6952","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-wafer.test.ts":"6953","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-window-costs.test.ts":"6954","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providerlimits-quotanormalize-split.test.ts":"6955","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-autosync-ssrf-323.test.ts":"6956","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-batch-update.test.ts":"6957","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-bulk-route.test.ts":"6958","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-constants-split.test.ts":"6959","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-free-tier-filter.test.ts":"6960","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-page-data-timeout.test.ts":"6961","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-page-utils-kimi.test.ts":"6962","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-page-utils.test.ts":"6963","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-route-managed-catalog.test.ts":"6964","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-test-route-cli-map.test.ts":"6965","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-validate-route.test.ts":"6966","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-yuanbao-web.test.ts":"6967","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-assigned-unavailable-6246.test.ts":"6968","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-autoselect-optin-3332.test.ts":"6969","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-batch-routes-5918.test.ts":"6970","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-bulk-import-dedup-7594.test.ts":"6971","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-bypass-scope-guard-3226.test.ts":"6972","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-concurrency-keepalive-regression.test.ts":"6973","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-connection-test.test.ts":"6974","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-dispatcher-cache-cap.test.ts":"6975","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-dispatcher-family.test.ts":"6976","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-egress-isolation-bdd.test.ts":"6977","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-egress-validate-pool-default.test.ts":"6978","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-egress-visibility.test.ts":"6979","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-fallback-cache-key.test.ts":"6980","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-fallback-candidates-listproxies-shape.test.ts":"6981","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-fallback-ssrf.test.ts":"6982","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-family-migration.test.ts":"6983","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-family-resolve-cache.test.ts":"6984","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-family-resolve.test.ts":"6985","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-family.test.ts":"6986","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-fetch.test.ts":"6987","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-health-6246.test.ts":"6988","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-health-decide-action-6246.test.ts":"6989","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-health-ipv6.test.ts":"6990","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-health-scheduler-listproxies-shape.test.ts":"6991","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-logger-client-ip.test.ts":"6992","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-logs-egress-ip.test.ts":"6993","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-logs-route.test.ts":"6994","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-management-v1-route.test.ts":"6995","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-nested-context-skip.test.ts":"6996","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-noauth-provider-6272.test.ts":"6997","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-cloudflare-workers-deployer.test.ts":"6998","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-deno-deploy-relay.test.ts":"6999","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-rotation-6365.test.ts":"7000","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-route-6365.test.ts":"7001","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-sync-4878.test.ts":"7002","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-registry-manager.test.ts":"7003","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-registry-route-handlers.test.ts":"7004","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-registry.test.ts":"7005","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-relay-mappers.test.ts":"7006","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-relay-test-error-5716.test.ts":"7007","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-resolution-status-filter.test.ts":"7008","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-rotation-latency.test.ts":"7009","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-subscriptions-route-validation.test.ts":"7010","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-types-socks5-runtime-3508.test.ts":"7011","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.coreEndpoint.test.ts":"7012","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.due.test.ts":"7013","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.fetchGuard.test.ts":"7014","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.fetchRetry.test.ts":"7015","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.needsCore.test.ts":"7016","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.parse.test.ts":"7017","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.scopes.test.ts":"7018","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.service.test.ts":"7019","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.url.test.ts":"7020","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxyfetch-caller-abort-log-suppression.test.ts":"7021","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxyfetch-retry-fresh-socket-4252.test.ts":"7022","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxyfetch-undici-retry.test.ts":"7023","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxyfetch-vercel-relay-2743.test.ts":"7024","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/public-api-routes.test.ts":"7025","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/public-client-ids-3493.test.ts":"7026","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/publicCreds.test.ts":"7027","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/publicai-not-keyless-3558.test.ts":"7028","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qdrant-schemas.test.ts":"7029","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qianfan-provider.test.ts":"7030","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qiniu-provider.test.ts":"7031","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-cli.test.ts":"7032","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-display-label.test.ts":"7033","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-executor.test.ts":"7034","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-jobtoken-exchange-4683.test.ts":"7035","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-oauth-config.test.ts":"7036","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-test-runtime-disambiguation.test.ts":"7037","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-unwrap-error-envelope.test.ts":"7038","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-usage-quota.test.ts":"7039","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qodercli-windows-resolve-6263.test.ts":"7040","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quality-rail-gate-membership.test.ts":"7041","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quality-ratchet.test.ts":"7042","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-account-buckets.test.ts":"7043","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-account-quota-row.test.ts":"7044","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-auto-ping.test.ts":"7045","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-burn-rate.test.ts":"7046","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-cache-hydrate-5015.test.ts":"7047","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-cache-is-exhausted-per-window-5923.test.ts":"7048","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-cache-snapshot-dedup-4438.test.ts":"7049","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-expanded-fixed-order-6687.test.ts":"7050","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-expanded-loading-placeholder.test.ts":"7051","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-expanded-sort-collapse.test.ts":"7052","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-grid-density-6815.test.ts":"7053","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-grid-horizontal-layout.test.ts":"7054","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-grid-mobile-7072.test.ts":"7055","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-catalog-filter.test.ts":"7056","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-combo-balancing.test.ts":"7057","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-combo-cli-providers.test.ts":"7058","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-combo-groups.test.ts":"7059","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-combos-sync.test.ts":"7060","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-concept-card-i18n.test.ts":"7061","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-connection-recovery.test.ts":"7062","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-constrain-connections.test.ts":"7063","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-deactivate-toggle.test.ts":"7064","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-deterministic-order.test.ts":"7065","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-dimensions.test.ts":"7066","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-edit-opens-wizard.test.ts":"7067","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-email-privacy.test.ts":"7068","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-endpoints-card.test.ts":"7069","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-enforce-await-store.test.ts":"7070","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-enforce.test.ts":"7071","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-epsilon-unconfigured-allow.test.ts":"7072","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-equal-split.test.ts":"7073","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-exclusive-catalog-4806.test.ts":"7074","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-exclusive-catalog-short-circuit.test.ts":"7075","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-exclusivity-reconcile.test.ts":"7076","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-fair-share.test.ts":"7077","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-fetch-throttle-6009.test.ts":"7078","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-fetch-throttle-scope-6911.test.ts":"7079","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-group-allocations.test.ts":"7080","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-group-scope.test.ts":"7081","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-groups-crud.test.ts":"7082","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-groups-migration.test.ts":"7083","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-groups-route.test.ts":"7084","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-groups-ui.test.ts":"7085","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-helpers.test.ts":"7086","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-key-models-route.test.ts":"7087","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-key-resolve.test.ts":"7088","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-model-naming.test.ts":"7089","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-monitor.test.ts":"7090","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-multiprovider.test.ts":"7091","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-parsing-claude-extra-usage.test.ts":"7092","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-per-key-model-hotpath.test.ts":"7093","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-per-key-model.test.ts":"7094","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-plan-registry.test.ts":"7095","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-plan-resolver.test.ts":"7096","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-plans-route-retired.test.ts":"7097","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-policy-generalization.test.ts":"7098","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-connections.test.ts":"7099","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-delete-prune.test.ts":"7100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-log-route.test.ts":"7101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-single-provider.test.ts":"7102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-update-full.test.ts":"7103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-usage-shape.test.ts":"7104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-wizard-edit.test.ts":"7105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-wizard-multi.test.ts":"7106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-wizard.test.ts":"7107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-preflight.test.ts":"7108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-redis-store.test.ts":"7109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-saturation-anthropic-oauth.test.ts":"7110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-saturation-signals.test.ts":"7111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-saturation-token-headers.test.ts":"7112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-schemas.test.ts":"7113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-share-bugfixes-v388.test.ts":"7114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-share-grid.test.ts":"7115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-share-layout-v2.test.ts":"7116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-share-strategy.test.ts":"7117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-sharing-fixes.test.ts":"7118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-spend-recorder.test.ts":"7119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-sqlite-store.test.ts":"7120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-store-factory.test.ts":"7121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-store-pool-total.test.ts":"7122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-streaming-consumption-usd.test.ts":"7123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-summed-budget.test.ts":"7124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-token-expiry-display.test.ts":"7125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-cloud-image-media.test.ts":"7126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-cloud-token-plan-media.test.ts":"7127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-cloud-video-media.test.ts":"7128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-code-config.test.ts":"7129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-settings-route.test.ts":"7130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-web-content-array-serialization.test.ts":"7131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-web-cookie-validation-3958.test.ts":"7132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-web-models-discovery-3931.test.ts":"7133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-api-routes.test.ts":"7134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-apply-feed.test.ts":"7135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-db.test.ts":"7136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-flag-default.test.ts":"7137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-inertia.test.ts":"7138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-page-state.test.ts":"7139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-sync.test.ts":"7140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-enhanced.test.ts":"7141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-manager.test.ts":"7142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-provider-default.test.ts":"7143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-queue-timeout-lockout.test.ts":"7144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-queue-timeout-message-4165.test.ts":"7145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-wedge-recovery.test.ts":"7146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limiter-eviction-4041.test.ts":"7147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limiter-fallback.test.ts":"7148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limiter-redis-optional.test.ts":"7149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rateLimitManager-idle-eviction.test.ts":"7150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rateLimitSemaphore.test.ts":"7151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ratelimit-admission-control-6593.test.ts":"7152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ratelimit-reservoir-refresh.test.ts":"7153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ratelimitmanager-headers-split.test.ts":"7154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/raycast-auth.test.ts":"7155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/raycast-local-extract.test.ts":"7156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reactive-context-compaction-policy.test.mjs":"7157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-cache-truncation.test.ts":"7158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-cache.test.ts":"7159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-cost-double-billing.test.ts":"7160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-placeholder-strip.test.ts":"7161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-replay-big-pickle.test.ts":"7162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-routing-api.test.ts":"7163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-routing-decision-guards.test.ts":"7164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-routing.test.ts":"7165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-token-buffer-6274.test.ts":"7166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-token-buffer-9507.test.ts":"7167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-token-source-6187.test.ts":"7168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoningContentInjector.test.ts":"7169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/redirects-cli-renames.test.ts":"7170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-buildHeaders-default.test.ts":"7171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-buildHeaders-opencode.test.ts":"7172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-buildHeaders-preamble.test.ts":"7173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-effortLevel.test.ts":"7174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-opencodeHeaders.test.ts":"7175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-registryFactory.test.ts":"7176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-resolveBaseUrl.test.ts":"7177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-urlSanitize.test.ts":"7178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refresh-serializer-spacing.test.ts":"7179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refresh-serializer.test.ts":"7180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/regional-provider-cn-notices-5462.test.ts":"7181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/registry-direct-exports.test.ts":"7182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/registry-utils.test.ts":"7183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/regolo-provider.test.ts":"7184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rehome-open-prs.test.ts":"7185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rejected-request-usage.test.ts":"7186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-check-rate-limit-existing-token.test.ts":"7187","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-deploy-5128.test.ts":"7188","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-minified-fn-6149.test.ts":"7189","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-probe-stats.test.ts":"7190","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-test-result-awareness.test.ts":"7191","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/release-cycle-base-resolver.test.ts":"7192","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/release-green-docs-drift-7253.test.ts":"7193","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/release-notes.test.ts":"7194","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/releaseChecker.test.ts":"7195","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/remaining-tasks.test.ts":"7196","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/remote-image-fetch-dns-rebinding.test.ts":"7197","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/remote-image-fetch-pin-dns-connection.test.ts":"7198","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/remote-image-fetch.test.ts":"7199","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/replace-custom-models-preserve-hidden-5086.test.ts":"7200","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6142-devin-cloud-agent-unwired.test.ts":"7201","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6377-agentrouter-validation.test.ts":"7202","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6524.test.ts":"7203","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6557-noauth-connection-disable-ignored.test.ts":"7204","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6576-kiro-thinking-unsupported-model.test.ts":"7205","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6637-kimi-token-limit.test.ts":"7206","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6692-sticky-terminal.test.ts":"7207","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6701-claude-detect-fallback.test.ts":"7208","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6912-volcengine-max-completion-tokens.test.ts":"7209","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6951.test.ts":"7210","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6952-commentary.test.ts":"7211","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6953.test.ts":"7212","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6957.test.ts":"7213","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6975.test.ts":"7214","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7023.test.ts":"7215","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7268-401-model-not-supported-lockout.test.ts":"7216","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7387-sticky-quota-exhausted.test.ts":"7217","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7503-no-choices.test.ts":"7218","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7764-collapsed-quota-order.test.ts":"7219","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7820-amazon-q-static-models.test.ts":"7220","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7847-bound-client-raw-request.test.ts":"7221","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8065-quota-cache-cross-instance.test.ts":"7222","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8136-antigravity-400-model-not-supported-lockout.test.ts":"7223","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8429-capability-canonicalization.test.ts":"7224","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8430.test.ts":"7225","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8522.test.ts":"7226","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8956.test.ts":"7227","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-9406-claude-web-429-valid.test.ts":"7228","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-9500-reasoning-separator.test.ts":"7229","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-9550-amazon-q-alias-resolution.test.ts":"7230","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-antigravity-404-family-cooldown-hijack.test.ts":"7231","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-defaults-store-session.test.ts":"7232","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-log-detail-layout.test.ts":"7233","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-log-detail-stream.test.ts":"7234","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-log-migration.test.ts":"7235","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-log-payloads.test.ts":"7236","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-bounded-clone.test.ts":"7237","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-bounded-idempotence.test.ts":"7238","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-endpoints.test.ts":"7239","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-preferences.test.ts":"7240","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-signature.test.ts":"7241","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/requesty-provider.test.ts":"7242","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/require-management-auth-access-token.test.ts":"7243","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-object-documents-response-path.test.ts":"7244","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-openrouter-6574.test.ts":"7245","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-providers-5332.test.ts":"7246","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-proxy-pinning-7350.test.ts":"7247","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-voyage-7809.test.ts":"7248","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank.test.ts":"7249","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reset-connection-backoff.test.ts":"7250","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reset-password-cli-6261-6258.test.ts":"7251","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-provider-cooldown-api-3556.test.ts":"7252","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-combo-cooldown-wait.test.ts":"7253","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-normalize-split.test.ts":"7254","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-provider-breaker.test.ts":"7255","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-quota-preflight.test.ts":"7256","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-quota-share-concurrency.test.ts":"7257","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-stream-recovery.test.ts":"7258","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-upstream429-breaker.test.ts":"7259","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-stream-recovery-feature-flags.test.ts":"7260","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-tab-response-fields.test.ts":"7261","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-bare-model-to-connection-default-474.test.ts":"7262","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-model-alias-index-8697.test.ts":"7263","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-omniroute-base-url.test.ts":"7264","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-proxy-family.test.ts":"7265","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-routing-model.test.ts":"7266","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-stream-flag.test.ts":"7267","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-web-provider-host.test.ts":"7268","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolveComboContextLimit.test.ts":"7269","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resource-pressure-policy.test.ts":"7270","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resource-pressure-runtime.test.ts":"7271","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resource-pressure-sampler.test.ts":"7272","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resource-pressure.test.ts":"7273","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/response-model-echo-1311.test.ts":"7274","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/response-openai-responses-purehelpers-split.test.ts":"7275","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/response-sanitizer.test.ts":"7276","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-active-stream-custom-tool.test.ts":"7277","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-additional-tools.test.ts":"7278","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-chat-assistant-role-first-chunk.test.ts":"7279","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-chat-namespace-identity-map.test.ts":"7280","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-chat-namespace-qualified-name.test.ts":"7281","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-chat-translation-gaps.test.ts":"7282","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-combo-resolution-3227.test.ts":"7283","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-commentary-event-frame-6561.test.ts":"7284","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-commentary-passthrough-6199.test.ts":"7285","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-default-text-format.test.ts":"7286","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-handler.test.ts":"7287","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-input-item-status-8083.test.ts":"7288","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-input-sanitizer-name.test.ts":"7289","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-nameless-hosted-tool-filter.test.ts":"7290","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-namespace-flatten.test.ts":"7291","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-parse-once-4041.test.ts":"7292","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-reasoning-close-before-message-466.test.ts":"7293","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-state-policy.test.ts":"7294","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-strip-truncation-2311.test.ts":"7295","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-textless-terminal-3948.test.ts":"7296","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-to-claude-whitespace-9170.test.ts":"7297","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-tool-search-call-skip.test.ts":"7298","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-transformer-dense-output.test.ts":"7299","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-transformer.test.ts":"7300","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-translation-fixes.test.ts":"7301","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-usage-trailing-6906.test.ts":"7302","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-ws-proxy-compression-parity.test.ts":"7303","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-ws-proxy-headers.test.mjs":"7304","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-ws-proxy-multi-turn-history.test.ts":"7305","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-ws-proxy.test.mjs":"7306","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responsesanitizer-reasoning-split.test.ts":"7307","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/retrieval-scoring-split.test.ts":"7308","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reverse-models-dev-providers-8697.test.ts":"7309","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/review-reviews-v3814-fixes.test.ts":"7310","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/risk-notice-acknowledged.test.ts":"7311","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/risk-notice-modal-button-import.test.ts":"7312","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/role-normalizer.test.ts":"7313","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rotation-config-omniroute.test.ts":"7314","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-edge-coverage.test.ts":"7315","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-error-sanitization-v382.test.ts":"7316","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-explainability.test.ts":"7317","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-acp-agents-local-only.test.ts":"7318","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-forge-jcode-settings-local-only.test.ts":"7319","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-grok-build-settings-local-only.test.ts":"7320","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-loopback-via-proxy.test.ts":"7321","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-middleware-local-only.test.ts":"7322","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-plugins-local-only.test.ts":"7323","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-private-lan.test.ts":"7324","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-provider-login-local-only.test.ts":"7325","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-qwen-settings-local-only.test.ts":"7326","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-check.test.ts":"7327","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-cli.test.ts":"7328","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-compare.test.ts":"7329","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-e2e-chain.test.ts":"7330","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-patch-compare.test.ts":"7331","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-search.test.ts":"7332","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-trends.test.ts":"7333","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval.test.ts":"7334","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-strategies.test.ts":"7335","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/routing-settings-ux-6147.test.ts":"7336","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rtk-enable-renderers-6703.test.ts":"7337","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rtk-gradle-dotnet-filters.test.ts":"7338","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rtk-new-filters.test.ts":"7339","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rule12-error-sanitization-sweep.test.ts":"7340","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/run-next-node-env.test.ts":"7341","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/run-next-playwright.test.ts":"7342","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime/live-ws-default.test.ts":"7343","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime/magicBytes.test.ts":"7344","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime/sqliteRuntime-node26-compat.test.ts":"7345","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime/sqliteRuntime.test.ts":"7346","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-config-globalthis-5312.test.ts":"7347","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-deps-save-exact-no-prune.test.ts":"7348","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-env-max-old-space.test.ts":"7349","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-env.test.ts":"7350","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-ports.test.ts":"7351","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-timeouts.test.ts":"7352","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/safe-outbound-fetch.test.ts":"7353","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/safe-resolve-proxy-fail-closed.test.ts":"7354","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sanitizer-residual-policy.test.ts":"7355","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/save-call-log-persistence.test.ts":"7356","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/schema-coercion.test.ts":"7357","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-cache-ttl-zero.test.ts":"7358","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-handler-duckduckgo.test.ts":"7359","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-handler-extended.test.ts":"7360","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-handler-perplexity-options.test.ts":"7361","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-provider-validation.test.ts":"7362","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-providers-static-model-catalog-7529.test.ts":"7363","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-registry.test.ts":"7364","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-route.test.ts":"7365","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-select-provider-searxng-bug-9543.test.ts":"7366","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-tools-schemas.test.ts":"7367","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/secure-random-routing.test.ts":"7368","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/build-profile-stubs.test.ts":"7369","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/cloud-sync-hmac.test.ts":"7370","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/docs-path-traversal.test.ts":"7371","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/docs-sanitization.test.ts":"7372","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/elevated-powershell-no-encoded.test.ts":"7373","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/live-server-allowlist.test.ts":"7374","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/local-endpoints.test.ts":"7375","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/zed-credential-fingerprint.test.ts":"7376","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/zed-import-two-step.test.ts":"7377","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security-docs-truthfulness-8097.test.ts":"7378","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security-fase01.test.ts":"7379","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security-hashkey.test.ts":"7380","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/segmind-image-video-provider-6656.test.ts":"7381","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/select-impacted-tests.test.ts":"7382","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/self-inflicted-upstream-timeout.test.ts":"7383","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/semantic-cache.test.ts":"7384","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sensenova-image-provider-2233.test.ts":"7385","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sensenova-provider.test.ts":"7386","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/combo-health-autopilot.test.ts":"7387","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/combo-quota-share-cooldown-wait-timing.test.ts":"7388","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/combo-strategy-fallbacks-half-open-timing.test.ts":"7389","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/glm-coding-plan-monthly-3580.test.ts":"7390","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/provider-health-autopilot.test.ts":"7391","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/quota-division-blocks.test.ts":"7392","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serve-node-options-preserve-5238.test.ts":"7393","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-backends.test.ts":"7394","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-batch-processor.test.ts":"7395","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-combo-metrics.test.ts":"7396","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-context-handoff.test.ts":"7397","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-context-manager.test.ts":"7398","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-intent-classifier.test.ts":"7399","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-payload-rules.test.ts":"7400","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-provider-plugin-manifest.test.ts":"7401","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-provider-plugin-registry.test.ts":"7402","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-quota-monitor.test.ts":"7403","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-reasoning-cache.test.ts":"7404","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-session-manager.test.ts":"7405","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-system-transforms.test.ts":"7406","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-thinking-budget.test.ts":"7407","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-tier-labels.test.ts":"7408","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-token-limit-counter.test.ts":"7409","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-token-refresh.test.ts":"7410","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-worker-navigation-fallback.test.ts":"7411","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/ServiceSupervisor.test.ts":"7412","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/bifrost-route-guard.test.ts":"7413","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/bifrost-routing-backend.test.ts":"7414","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/combo-metrics-memory.test.ts":"7415","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/embed-proxy.test.ts":"7416","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/embedWsProxy.test.ts":"7417","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/emergency-fallback.test.ts":"7418","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/end-to-end-shape.test.ts":"7419","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/fusion-min-panel-and-failure-detail.test.ts":"7420","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/geminiRateLimitTracker.test.ts":"7421","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/htmlRewriter.test.ts":"7422","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/install-route-helper.test.ts":"7423","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/bifrost-transport-version-format.test.ts":"7424","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/bifrost.test.ts":"7425","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/cliproxy-resolve-spawn-args-6877.test.ts":"7426","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/cliproxy.test.ts":"7427","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/mux.test.ts":"7428","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/ninerouter.test.ts":"7429","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/runNpm-shell-5379.test.ts":"7430","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/lifecycle.test.ts":"7431","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/logs-sse.test.ts":"7432","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/modelSync.test.ts":"7433","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/providerCooldownTracker.test.ts":"7434","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/ringBuffer.test.ts":"7435","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services-branch-hardening.test.ts":"7436","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-affinity-generic-7274.test.ts":"7437","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-manager-sweep.test.ts":"7438","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-manager.test.ts":"7439","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-pool-modular.test.ts":"7440","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-pool-rest-api.test.ts":"7441","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-pool.test.ts":"7442","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings/authz-bypass.test.ts":"7443","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings/probe-8950-set-password.test.ts":"7444","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-api.test.ts":"7445","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-cas-7784.test.ts":"7446","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-i18n-keys.test.ts":"7447","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-route-password.test.ts":"7448","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-schema-routing-strategies.test.ts":"7449","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-transform-schema.test.ts":"7450","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-ui-layout-static.test.ts":"7451","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/setup-open-code-win32-shell.test.mjs":"7452","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/analytics-recharts-lazy.test.ts":"7453","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/basePath.test.ts":"7454","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/basePathFetch.test.ts":"7455","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/components/AutoRoutingBanner.test.tsx":"7456","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/components/KiroAuthModal.test.tsx":"7457","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/components/ProxyConfigModal.test.tsx":"7458","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/machineId.test.ts":"7459","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/structuredLogger-raw-write-guard.test.ts":"7460","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared-api-utils.test.ts":"7461","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared-clipboard.test.tsx":"7462","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared-schemas.test.ts":"7463","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-back-compat.test.ts":"7464","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-cli-renames.test.ts":"7465","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-costs-quota-plans.test.ts":"7466","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-costs-section.test.ts":"7467","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-customization.test.ts":"7468","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-icon-accents-3812.test.ts":"7469","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-monitoring-reorg.test.ts":"7470","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-prefetch-policy-8281.test.ts":"7471","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-quota-share-placement.test.ts":"7472","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-route-match.test.ts":"7473","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-search-filter.test.ts":"7474","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-tools-group.test.ts":"7475","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-visibility.test.ts":"7476","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/signature-cache-bypass.test.ts":"7477","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/signature-cache.test.ts":"7478","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/silent-sse-close-7699.test.ts":"7479","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/siliconflow-model-sync.test.ts":"7480","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/siliconflow-registry-models.test.ts":"7481","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-builtins-sandbox.test.ts":"7482","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-collect-routes.test.ts":"7483","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-executor.test.ts":"7484","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-injection.test.ts":"7485","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-interception.test.ts":"7486","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-provider-setting.test.ts":"7487","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-registry.test.ts":"7488","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-routes-error-sanitization.test.ts":"7489","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-routes.test.ts":"7490","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-schemas.test.ts":"7491","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-skillssh.test.ts":"7492","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skip-provider-breaker-consumer-2743.test.ts":"7493","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sliding-window-limiter.test.ts":"7494","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/small-vps-docs.test.ts":"7495","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/socks-connector-family.test.ts":"7496","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/socks-handshake-timeout-5109.test.ts":"7497","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/socks5-default-on.test.ts":"7498","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sonar-quality-gate-fixes.test.ts":"7499","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/source-scanner-guards.test.ts":"7500","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/spark-openai-compatible-endpoint-7942.test.ts":"7501","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/specialty-model-catalog-routes.test.ts":"7502","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/specificity-rules.test.ts":"7503","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/speechmatics-transcription-provider.test.ts":"7504","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/spend-batch-writer.test.ts":"7505","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sqlite-repair-discoverability-3476.test.ts":"7506","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sqljs-build-warning-8135.test.ts":"7507","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sre-oncall-rotation.test.ts":"7508","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sre-redact-logs.test.ts":"7509","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sre-tcp-close-analyzer.test.ts":"7510","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-auth-antigravity-credits.test.ts":"7511","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-auth-resource-404.test.ts":"7512","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-auth.test.ts":"7513","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-error-passthrough-3324.test.ts":"7514","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-finish-reason-synthesis-7800.test.ts":"7515","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-heartbeat-integration.test.ts":"7516","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-heartbeat.test.ts":"7517","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-nonstream-accept-5305.test.ts":"7518","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-parser-numeric-ids.test.ts":"7519","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-parser.test.ts":"7520","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-shim-contract.test.ts":"7521","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sseHeartbeat.test.ts":"7522","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sseTextTransform.test.ts":"7523","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/standalone-server-ws-keepalive-timeout-7003.test.ts":"7524","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/start-ws-server-cwd-4055.test.mjs":"7525","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/startup-stale-cooldown-recovery.test.ts":"7526","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/static-constants-public-surface.test.ts":"7527","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/static-models-venice-web-6269.test.ts":"7528","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stepfun-mono-fallback-and-sidebar-hydration-7743.test.ts":"7529","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sticky-affinity-failover-6219.test.ts":"7530","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stmt-cache-lru.test.ts":"7531","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-continuation-wiring.test.ts":"7532","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-continuation.test.ts":"7533","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-early-eof-affinity-8928.test.ts":"7534","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-early-eof-breaker.test.ts":"7535","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-early-eof-retry-3758.test.ts":"7536","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-failure-499-classification.test.ts":"7537","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-handler-catch-logging-8143.test.ts":"7538","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-handler-client-disconnect.test.ts":"7539","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-handler.test.ts":"7540","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-helpers.test.ts":"7541","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-non-json-sse.test.ts":"7542","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-numeric-ids.test.ts":"7543","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-onfailure-callback-logging.test.ts":"7544","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-options-nonstreaming-3884.test.ts":"7545","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-payload-collector.test.ts":"7546","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-prompt-tokens-zero-upstream.test.ts":"7547","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-readiness-policy.test.ts":"7548","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-readiness.test.ts":"7549","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-recovery.test.ts":"7550","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-request-body-size-mark-7045.test.ts":"7551","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-strip-responses-lifecycle-echo.test.ts":"7552","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-utilities.test.ts":"7553","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-utils.test.ts":"7554","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streamHelpers.test.ts":"7555","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streaming-empty-content-block-1382.test.ts":"7556","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streaming-reasoning-dedup-5786.test.ts":"7557","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streamingPiiInitialization.test.ts":"7558","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streamingPiiTransform.test.ts":"7559","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/strict-random-deck.test.ts":"7560","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/strip-reasoning-blobs-agentic-context-1599.test.ts":"7561","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/strip-reasoning-header.test.ts":"7562","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/structured-logger-dedup-bound.test.ts":"7563","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/suggested-models-route.test.ts":"7564","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sumopod-x5lab-provider.test.ts":"7565","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/supervisor-policy-4425.test.ts":"7566","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sweep-stale-fragments.test.ts":"7567","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-bundle.test.ts":"7568","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-env-bundled-require-5006.test.ts":"7569","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-env.test.ts":"7570","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-models-degraded-local-catalog-5460-5465.test.ts":"7571","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-next-cycle.test.ts":"7572","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-reasoning-supported-efforts-7694.test.ts":"7573","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-routes.test.ts":"7574","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-search-to-url-8624.test.ts":"7575","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-wiki.test.ts":"7576","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/synced-capability-warmup-8697.test.ts":"7577","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/synced-model-delete-persist-3199.test.ts":"7578","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/synced-model-hide-persist-3782.test.ts":"7579","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/synthetic-provider.test.ts":"7580","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-prompt.test.ts":"7581","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-role-extraction.test.ts":"7582","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-transforms.test.ts":"7583","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-trust-test-guard.test.ts":"7584","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-version-cache-8278.test.ts":"7585","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-version-check-4100.test.ts":"7586","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t06-schema-hardening.test.ts":"7587","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t07-no-log-key-config.test.ts":"7588","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t08-allowed-connections.test.ts":"7589","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t08-mcp-scope-enforcement.test.ts":"7590","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t09-a2a-lifecycle.test.ts":"7591","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t12-pricing-updates.test.ts":"7592","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t13-stale-quota-display.test.ts":"7593","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t14-proxy-fast-fail.test.ts":"7594","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t16-gemini-enum-type-string.test.ts":"7595","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t19-codex-responses-empty-content.test.ts":"7596","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t23-t24-fallback-resilience.test.ts":"7597","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t25-provider-validation-modelid-fallback.test.ts":"7598","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t26-ai-sdk-accept-header-compat.test.ts":"7599","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t27-github-copilot-response-format.test.ts":"7600","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t28-model-catalog-updates.test.ts":"7601","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t29-vertex-sa-json-executor.test.ts":"7602","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t3-chat-web-credentials.test.ts":"7603","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t3-chat-web.test.ts":"7604","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t30-kiro-400-model-unavailable.test.ts":"7605","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t31-t33-t34-t38-model-specs.test.ts":"7606","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t3chat-web-cookie-hint-5465.test.ts":"7607","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t40-opencode-cli-tools-integration.test.ts":"7608","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t42-image-size-to-aspect-ratio.test.ts":"7609","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t43-gemini-tool-call-no-thought-signature.test.ts":"7610","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t44-antigravity-thought-signature-preserved.test.ts":"7611","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tag-routing.test.ts":"7612","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tailscale-authkey.test.ts":"7613","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tailscaleTunnel.test.ts":"7614","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/task-fitness-missing-table-8603.test.ts":"7615","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/task-router-auto-intent-8602.test.ts":"7616","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/task-routing-config-restore-8601.test.ts":"7617","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/telemetry-auto-cleanup-6848.test.ts":"7618","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/telemetry-summary-route.test.ts":"7619","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/termux-android-cache-dir.test.ts":"7620","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/termux-android-playwright-static-import-7265.test.ts":"7621","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-all-model-status.test.ts":"7622","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-all-results-i18n.test.ts":"7623","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-masking-release-scale.test.ts":"7624","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-process-detection.test.ts":"7625","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-scoped-selection.test.ts":"7626","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-serial-quarantine.test.ts":"7627","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/textual-toolcall-sanitizer-false-positive.test.ts":"7628","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-body-double-read-3296.test.ts":"7629","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-context-length-4184.test.ts":"7630","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-model-refresh-5181.test.ts":"7631","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-provider-proxy.test.ts":"7632","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-request-token-3491.test.ts":"7633","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/think-close-marker-responses-format.test.ts":"7634","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/think-close-marker-suppress-5245.test.ts":"7635","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/think-tag-parser.test.ts":"7636","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget-boot-wiring-5312.test.ts":"7637","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget-globalthis-5312.test.ts":"7638","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget-groq-3258.test.ts":"7639","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget-hydration-5312.test.ts":"7640","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget.test.ts":"7641","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thundering-herd.test.ts":"7642","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tier-config-provider-override-route.test.ts":"7643","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tier-coverage-widget-provider-override.test.ts":"7644","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tier-resolver-provider-override.test.ts":"7645","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tiktoken-counter.test.ts":"7646","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-client-download-dir-8579.test.ts":"7647","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-client-node-docker-binary-7802.test.ts":"7648","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-client-proxy-fail-closed.test.ts":"7649","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-options.test.ts":"7650","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-profiles-valid-5591.test.mjs":"7651","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tlsClient-circuit-breaker.test.ts":"7652","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-accounting-input-fix.test.ts":"7653","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check-circuit-breaker.test.ts":"7654","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check-devin-cli-8407.test.ts":"7655","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check-sweep.test.ts":"7656","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check-tickms-defined.test.ts":"7657","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check.test.ts":"7658","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-no-refresh-token-expired-5326.test.ts":"7659","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-limits.test.ts":"7660","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-cas-guard-4038.test.ts":"7661","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-cas-guard.test.ts":"7662","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-circuit-breaker.test.ts":"7663","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-race-comprehensive.test.ts":"7664","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-rotation-map.test.ts":"7665","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-route-service.test.ts":"7666","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-service.test.ts":"7667","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tokenExtractionConfig.test.ts":"7668","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tokenHealthCheck-batchSize.test.ts":"7669","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tokenHealthCheck-transient.test.ts":"7670","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-call-arguments.test.ts":"7671","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-latency-tracker.test.ts":"7672","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-limit-detector.test.ts":"7673","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-name-case-preserve-4307.test.ts":"7674","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-request-sanitization.test.ts":"7675","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-schema-sanitizer.test.mjs":"7676","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-search-filtered-responses-to-chat-7532.test.ts":"7677","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-source-diagnostics.test.ts":"7678","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tools-filter-anthropic-format.test.ts":"7679","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tooltip-portal-behavior.test.ts":"7680","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-active-requests-3507.test.ts":"7681","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-connection-health.test.ts":"7682","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-filtering-and-click.test.ts":"7683","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-label-3198.test.ts":"7684","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-request-lifecycle-emit.test.ts":"7685","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-build-native.test.ts":"7686","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-ca-trust.test.ts":"7687","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-capture-api.test.ts":"7688","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-capture-manager.test.ts":"7689","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-capture-mode.test.ts":"7690","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-commands.test.ts":"7691","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-dynamic-cert.test.ts":"7692","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-route.test.ts":"7693","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-setup.test.ts":"7694","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-tls-capture.test.ts":"7695","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-transparent-socket.test.ts":"7696","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/trae-executor.test.ts":"7697","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/trae-publiccred.test.ts":"7698","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/traffic-filter-live.test.ts":"7699","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/transform-stream-hwm.test.ts":"7700","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-ai-sdk-image-parts.test.ts":"7701","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-antigravity-to-openai.test.ts":"7702","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-helper-thinking.test.ts":"7703","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-to-gemini.test.ts":"7704","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-to-openai-orphan-tool-4385.test.ts":"7705","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-to-openai-strip-billing-header.test.ts":"7706","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-to-openai.test.ts":"7707","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-format-detection-2949.test.ts":"7708","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-advanced-section.test.tsx":"7709","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-compression.test.tsx":"7710","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-concept-card.test.tsx":"7711","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-deeplink.test.ts":"7712","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-i18n-keys.test.ts":"7713","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-integration.test.tsx":"7714","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-monitor-tab.test.tsx":"7715","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-page-client.test.tsx":"7716","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-pipeline-view.test.tsx":"7717","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-raw-json-panel.test.tsx":"7718","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-result-narrated.test.tsx":"7719","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-session.test.ts":"7720","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-simple-controls.test.tsx":"7721","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-stream-transformer.test.tsx":"7722","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-test-bench.test.tsx":"7723","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-translate-tab.test.tsx":"7724","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-audio-input.test.ts":"7725","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-consecutive-role-2191.test.ts":"7726","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-schema-pattern-property.test.ts":"7727","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-thinking-budget-6943.test.ts":"7728","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-to-openai.test.ts":"7729","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-helper-branches.test.ts":"7730","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-helper-tool-description-coercion.test.ts":"7731","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-json-util.test.ts":"7732","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-mistral-strip-echo-fields.test.ts":"7733","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-responses-custom-tool-1007.test.ts":"7734","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-responses-empty-input-419.test.ts":"7735","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-responses-image-output-8459.test.ts":"7736","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-responses-req.test.ts":"7737","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-claude-empty-reasoning.test.ts":"7738","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-claude.test.ts":"7739","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-cursor.test.ts":"7740","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-gemini-defaults.test.ts":"7741","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-gemini-sse.test.ts":"7742","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-gemini.test.ts":"7743","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-kiro.test.ts":"7744","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-redacted-thinking-model-aware-4479.test.ts":"7745","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-request-openai-responses.test.ts":"7746","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-antigravity-thinking-boundary.test.ts":"7747","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-claude-to-openai.test.ts":"7748","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-cursor-to-openai.test.ts":"7749","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-empty-string-tool-arg.test.ts":"7750","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-gemini-to-claude.test.ts":"7751","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-gemini-to-openai.test.ts":"7752","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-kiro-to-openai.test.ts":"7753","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-responses-completed-synthesis.test.ts":"7754","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-responses-namespace-identity.test.ts":"7755","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-responses-roundtrip.test.ts":"7756","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-responses.test.ts":"7757","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-to-antigravity.test.ts":"7758","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-to-claude.test.ts":"7759","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-to-gemini.test.ts":"7760","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-same-format-null-flush.test.ts":"7761","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-stream-transform.test.ts":"7762","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-strip-client-metadata-1157.test.ts":"7763","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-thinking-provider-compat-2043.test.ts":"7764","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-tool-call-shim.test.ts":"7765","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-toolcall-helper.test.ts":"7766","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-tools-anthropic-shape.test.ts":"7767","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-xiaomi-mimo-reasoning-replay-1321.test.ts":"7768","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tray-kill-orphan-pid.test.ts":"7769","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tray-systray-loader-4605.test.ts":"7770","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/triage-bugs-2026-08-02.test.ts":"7771","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tryBackedChat.test.ts":"7772","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ts7-executor-override-signatures.test.ts":"7773","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ts7-executor-result-contract.test.ts":"7774","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ts7-executor-shared-shapes.test.ts":"7775","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ts7-open-sse-type-fixes.test.ts":"7776","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tsconfig-ts7-readiness.test.ts":"7777","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tsx-runtime-transform-5757.test.ts":"7778","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/turbopack-cache-heal-6289.test.ts":"7779","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/turkishText.test.ts":"7780","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/types-barrel-model-cooldown.test.ts":"7781","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/AcpAgentsPage.test.tsx":"7782","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/AntigravityToolCard-model-aliases.test.tsx":"7783","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ClaudeClassifierCompatToggle.test.tsx":"7784","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ClaudeToolCard-manual-config-fallback.test.tsx":"7785","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliAgentsPage.test.tsx":"7786","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliCodePage.test.tsx":"7787","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliComparisonCard.test.tsx":"7788","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliConceptCard.test.tsx":"7789","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliToolCard.test.tsx":"7790","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CompressionHub-patch-only.test.tsx":"7791","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CoolingConnectionsPanel.test.tsx":"7792","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/HermesAgentToolCard-model-aliases.test.tsx":"7793","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/LocaleAutoDetect-refresh.test.tsx":"7794","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/OpenClawToolCard-manual-config-fallback.test.tsx":"7795","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ProviderIcon-icon-url.test.tsx":"7796","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ProxyRegistryManager-tdz-render.test.tsx":"7797","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ToolDetailClient.test.tsx":"7798","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/activity-page-redirect.test.ts":"7799","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/add-api-key-modal-free-models.test.tsx":"7800","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/add-api-key-modal-unsupported-save-5565.test.tsx":"7801","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/add-api-key-modal-validation-error-5088.test.tsx":"7802","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/agent-bridge-page.test.tsx":"7803","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/agent-bridge-server-card-a11y.test.tsx":"7804","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/agent-card-risk-modal.test.tsx":"7805","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/agent-card.test.tsx":"7806","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/allocation-table.test.tsx":"7807","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/authz-cors-banner.test.tsx":"7808","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/burn-rate-chart.test.tsx":"7809","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/bypass-list-editor.test.tsx":"7810","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/cache-settings-tab-bounds-8219.test.tsx":"7811","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/cli-agents-detail-page.test.tsx":"7812","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/cli-code-detail-page.test.tsx":"7813","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/cli-tools-no-mitm-tab.test.tsx":"7814","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-compression-mode-select.test.tsx":"7815","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-defaults-fusion-5598.test.tsx":"7816","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-form-deselect-handler.test.tsx":"7817","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-form-select-all-handlers.test.tsx":"7818","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-response-validation-editor.test.tsx":"7819","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/comboFlowModel-breakers.test.ts":"7820","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/comboFlowModel-cooldown.test.ts":"7821","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/comboFlowModel.test.ts":"7822","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/comboLiveStudio.test.tsx":"7823","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combos-error-boundary.test.tsx":"7824","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combos-page-smoke.test.tsx":"7825","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compareView.test.tsx":"7826","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compatible-provider-apikey-setup.test.tsx":"7827","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compliance-tab-actor-filter.test.tsx":"7828","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-combos-routing-mode-6760.test.tsx":"7829","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-exclusions-page.test.tsx":"7830","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-guidance-7530.test.tsx":"7831","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-log-namespace.test.tsx":"7832","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-pipeline-editor.test.tsx":"7833","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-replay-reducer.test.ts":"7834","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-replay-speed.test.tsx":"7835","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-settings-page.test.tsx":"7836","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-settings-tab-consolidation.test.tsx":"7837","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionAnnotation.test.tsx":"7838","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionCockpit.test.tsx":"7839","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionFlowModel.test.ts":"7840","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionHub-active-selector.test.tsx":"7841","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionHub-context-editing.test.tsx":"7842","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionHub.test.tsx":"7843","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionPanel.test.tsx":"7844","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionStylesPanel.test.tsx":"7845","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionStylesTile.test.tsx":"7846","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionUltraTier.test.tsx":"7847","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/confirm-delete-connection-7361.test.tsx":"7848","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/connection-row-proxy-name-7643.test.tsx":"7849","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/connection-row-token-badge-5836.test.tsx":"7850","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/connectionsSearchFilter.test.tsx":"7851","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/conversation-tab-separators.test.tsx":"7852","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/conversation-tab.test.tsx":"7853","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/costs-toplistcard-legacy-free-label-7272.test.tsx":"7854","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/dashboard-csrf-fetch.test.tsx":"7855","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/diffPane.test.tsx":"7856","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/edgeStyles.test.ts":"7857","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/edit-connection-modal-free-models.test.tsx":"7858","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/edit-memory-modal.test.tsx":"7859","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/embedding-source-selector.test.tsx":"7860","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engine-pages.test.tsx":"7861","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engine-tab.test.tsx":"7862","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engineConfigForm.test.tsx":"7863","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engineConfigPage.test.tsx":"7864","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engineNode.test.tsx":"7865","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/evals-tab-smoke.test.tsx":"7866","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/fidelityGateToggle.test.tsx":"7867","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/fleetAggregation.test.ts":"7868","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/flowCanvas.test.tsx":"7869","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/free-budget-card.test.tsx":"7870","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/free-pool-tab.test.tsx":"7871","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/free-provider-rankings-page-authtype-6915.test.tsx":"7872","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/fuzzyDedupToggle.test.tsx":"7873","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/grok-device-oauth-modal.test.tsx":"7874","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/hermes-agent-config-loop.test.tsx":"7875","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/hermes-agent-opencode-free.test.tsx":"7876","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/highlightableProviderCard.test.tsx":"7877","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/historic-session-banner.test.tsx":"7878","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-page-client-dashboard-smoke-4615.test.tsx":"7879","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-provider-topology-section-4606.test.tsx":"7880","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-topology-hidden-4596.test.tsx":"7881","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-topology-last-used-node-color.test.tsx":"7882","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-update-error-render-5991.test.ts":"7883","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-update-step-warning-color-amber.test.ts":"7884","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ionizerLane.test.tsx":"7885","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/issue-7845-log-detail-structured-error.test.tsx":"7886","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/kimiComboPresetCard.test.tsx":"7887","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/kimiSponsorBanner.test.tsx":"7888","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/live-compression-accumulate.test.ts":"7889","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/livePage.test.tsx":"7890","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/lobe-provider-icons-stepfun.test.tsx":"7891","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/logs-page-detail-modal-reopen-on-close.test.tsx":"7892","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/markdown-message.test.tsx":"7893","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/memories-tab.test.tsx":"7894","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/memory-page.test.tsx":"7895","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/mitm-proxy-error-boundary.test.tsx":"7896","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/mitm-proxy-moved-page.test.tsx":"7897","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-alias-edit.test.tsx":"7898","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-field-6540.test.tsx":"7899","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-connection-filter.test.tsx":"7900","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-deselect.test.tsx":"7901","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-hidden-models-7156.test.tsx":"7902","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-keep-open.test.tsx":"7903","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-select-all.test.tsx":"7904","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-zero-config.test.tsx":"7905","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-visibility-toolbar-free.test.tsx":"7906","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/namedCombos-active-badge.test.tsx":"7907","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/noauth-account-card.test.tsx":"7908","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/oauth-callback-postmessage-scope.test.tsx":"7909","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/omniglyphContextPage.test.tsx":"7910","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/onboarding-public-endpoint.test.tsx":"7911","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/open-sse-alias.test.tsx":"7912","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playView.test.tsx":"7913","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-api-tab.test.tsx":"7914","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-build-tab.test.tsx":"7915","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-chat-tab.test.tsx":"7916","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-compare-column.test.tsx":"7917","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-compare-tab.test.tsx":"7918","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-config-pane.test.tsx":"7919","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-export-modal.test.tsx":"7920","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-improve-prompt-button.test.tsx":"7921","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-model-search-4086.test.tsx":"7922","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-preset-picker.test.tsx":"7923","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-structured-output-editor.test.tsx":"7924","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-studio.test.tsx":"7925","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-tab.test.tsx":"7926","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-token-cost-counter.test.tsx":"7927","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-tools-builder.test.tsx":"7928","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/pool-card.test.tsx":"7929","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/previewToRunModel.test.tsx":"7930","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/provider-breaker-health-hook.test.tsx":"7931","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/provider-quota-widget-auto-refresh-label-4611.test.tsx":"7932","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerCardHandle.test.tsx":"7933","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerCardKimiPartnerAccent.test.tsx":"7934","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerCascadeNode.test.tsx":"7935","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerIconKimiLogomark.test.tsx":"7936","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerPageHeaderKimiPartnerLink.test.tsx":"7937","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerPageHighlightLogic.test.tsx":"7938","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/proxy-config-modal-saved-sort-default-7643.test.tsx":"7939","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/qdrant-config-card.test.tsx":"7940","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quantumLockBadge.test.tsx":"7941","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quick-start-api-keys-link-5695.test.ts":"7942","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quota-cutoff-modal-draft-reset-7889.test.tsx":"7943","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quota-share-delete-error.test.tsx":"7944","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quota-share-page.test.tsx":"7945","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/request-logger-autorefresh-visibility-3972.test.tsx":"7946","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/rerank-config-card.test.tsx":"7947","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/riskGateBadge.test.tsx":"7948","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/rtkLearnDiscoverCard.test.tsx":"7949","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/rtkTomlImportCard.test.tsx":"7950","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/rtl-logical-classes.test.tsx":"7951","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/runtime-page-client.test.tsx":"7952","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/saliencyHeatmap.test.tsx":"7953","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/same-context-filter.test.tsx":"7954","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-compare-tab.test.tsx":"7955","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-concept-card.test.tsx":"7956","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-provider-catalog.test.tsx":"7957","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-scrape-result.test.tsx":"7958","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-scrape-tab.test.tsx":"7959","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-search-tab.test.tsx":"7960","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-studio.test.tsx":"7961","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/session-recorder-bar.test.tsx":"7962","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/setup-wizard.test.tsx":"7963","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/sidebar-engine-items.test.ts":"7964","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/sidebar-proxy-expansion.test.tsx":"7965","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/stacked-allocation-bar.test.tsx":"7966","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/stats-tab.test.tsx":"7967","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/status-dot.test.tsx":"7968","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/studio-pages.test.tsx":"7969","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/studioTabs.test.tsx":"7970","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/system-storage-manual-vacuum.test.tsx":"7971","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/timeline-page-detail-deeplink.test.tsx":"7972","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/timing-i18n.test.tsx":"7973","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/toonEncoderTable.test.tsx":"7974","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/traffic-inspector-page.test.tsx":"7975","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-improve-prompt.test.tsx":"7976","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-local-storage-pool-migration.test.tsx":"7977","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-model-visibility-handlers-test-all.test.tsx":"7978","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-pools-usage-aggregate.test.tsx":"7979","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-presets.test.tsx":"7980","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-resizable-panels.test.tsx":"7981","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-session-recorder.test.tsx":"7982","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-stream-metrics.test.tsx":"7983","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-structured-output.test.tsx":"7984","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-system-proxy-exit-guard.test.tsx":"7985","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-tools-builder.test.tsx":"7986","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-traffic-stream.test.tsx":"7987","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-virtual-list.test.tsx":"7988","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/usePreviewCompression.test.tsx":"7989","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/useToolBatchStatuses.test.tsx":"7990","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/waterfallInspector.test.tsx":"7991","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/web-session-cookie-modal-size-6265.test.tsx":"7992","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui-value-drift-cosmetic.test.ts":"7993","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/universal-handoff.test.ts":"7994","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/unorouter-registry.test.ts":"7995","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-ca-test-route-3488.test.ts":"7996","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-error-passthrough.test.ts":"7997","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-headers-sanitize.test.ts":"7998","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-response-headers-strip.test.ts":"7999","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-retry-hints-toggle.test.ts":"8000","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-timeout-model-override.test.ts":"8001","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/url-sanitize.test.ts":"8002","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage/usageHistoryDedup.test.ts":"8003","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-account-analytics-route.test.ts":"8004","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-account-identity.test.ts":"8005","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-analytics-model-dedup-7535.test.ts":"8006","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-analytics-provider-display-name-7534.test.ts":"8007","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-analytics-route.test.ts":"8008","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-analytics.test.ts":"8009","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-antigravity-family-split.test.ts":"8010","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-bailian-split.test.ts":"8011","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-cache-health-route.test.ts":"8012","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-cache-health.test.ts":"8013","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-crof-split.test.ts":"8014","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-deepseek-split.test.ts":"8015","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-endpoint-dimension.test.ts":"8016","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-events.test.ts":"8017","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-extractor.test.ts":"8018","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-families-split.test.ts":"8019","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-github-split.test.ts":"8020","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-glm-family-split.test.ts":"8021","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-history-db.test.ts":"8022","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-history-reset.test.ts":"8023","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-migrations-legacy-archive-safety.test.ts":"8024","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-migrations.test.ts":"8025","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-minimax-family-split.test.ts":"8026","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-nanogpt-split.test.ts":"8027","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-opencode-split.test.ts":"8028","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-pending-sweep.test.ts":"8029","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-providers.test.ts":"8030","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-qoder-split.test.ts":"8031","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-quota-core-split.test.ts":"8032","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-quota-row-visibility.test.ts":"8033","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-scalars-split.test.ts":"8034","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-service-antigravity-credits.test.ts":"8035","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-service-deepseek.test.ts":"8036","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-service-hardening.test.ts":"8037","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-token-buffer.test.ts":"8038","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-utils.test.ts":"8039","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-vertex-split.test.ts":"8040","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-xai-split.test.ts":"8041","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-xiaomi-mimo-split.test.ts":"8042","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usagehistory-helpers-split.test.ts":"8043","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/useApiKey.test.ts":"8044","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v0-quota-fetcher.test.ts":"8045","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-chat-completions-content-type-6414.test.ts":"8046","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-combos-projection.test.ts":"8047","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-completions-model-header-match-6426.test.ts":"8048","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-aliases-included.test.ts":"8049","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-auth-leak-9320.test.ts":"8050","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-by-id-4674.test.ts":"8051","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-catalog-generation-race.test.ts":"8052","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-catalog-ttl.test.ts":"8053","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-concurrent-6408.test.ts":"8054","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-discovery-conformance.test.ts":"8055","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-ws-bridge.test.ts":"8056","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-ws-route.test.ts":"8057","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1beta-gemini-tool-calling-6222.test.ts":"8058","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1beta-models-route.test.ts":"8059","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v388-phase1-screen-fixes.test.ts":"8060","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v388-phase3-memory.test.ts":"8061","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v388-phase4-playground.test.ts":"8062","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v388-quota-share-usage-guard.test.ts":"8063","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validate-release-green.test.ts":"8064","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validate-response-quality.test.ts":"8065","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-audio-misc-split.test.ts":"8066","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-badge-unsupported-5442.test.ts":"8067","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-cloud-providers-split.test.ts":"8068","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-format-validators-split.test.ts":"8069","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-helpers-split.test.ts":"8070","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-kiro-split.test.ts":"8071","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-search-embedding-split.test.ts":"8072","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-specialty-inline-split.test.ts":"8073","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-web-cookie-split.test.ts":"8074","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-web-providers-split.test.ts":"8075","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/veoaifree-video-route.test.ts":"8076","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/veoaifree-web-executor.test.ts":"8077","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/verbosity-prompt-cache-key-provider-gate-7533.test.ts":"8078","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vercel-ai-gateway-media.test.ts":"8079","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vercel-deploy-relay-path-ssrf.test.ts":"8080","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vercel-deploy-sso-protection-check.test.ts":"8081","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vercel-gateway-models-fetch-4249.test.ts":"8082","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/verify-published.test.ts":"8083","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/verify-ratchet-bank.test.ts":"8084","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/version-compare-client-safe.test.ts":"8085","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/version-manager-request.test.ts":"8086","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/version-manager.test.ts":"8087","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/versionManager-orchestrator.test.ts":"8088","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-express-apikey.test.ts":"8089","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-functioncall-id-3440.test.ts":"8090","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-media.test.ts":"8091","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-oauth-scopes.test.ts":"8092","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-spend-usage.test.ts":"8093","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-tts.test.ts":"8094","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/video-deepinfra-6653.test.ts":"8095","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/video-generation-handler.test.ts":"8096","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/video-novita-6658.test.ts":"8097","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/video-xai-grok-imagine.test.ts":"8098","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/virtual-auto-combo.test.ts":"8099","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-cc-no-reroute.test.ts":"8100","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-env-override.test.ts":"8101","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-policy-reroute-6640.test.ts":"8102","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-preserve-on-failure-4012.test.ts":"8103","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-settings-schema.test.ts":"8104","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-compression-authoritative-capability-7237.test.ts":"8105","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-detection-consistency.test.ts":"8106","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-models-cc-fragments.test.ts":"8107","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/visionBridgeDefaults.test.ts":"8108","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vnc-session.test.ts":"8109","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vps-runner-variable-scope.test.ts":"8110","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-context-sanitizer.test.ts":"8111","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-responses-models.test.ts":"8112","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-shared-metadata.test.ts":"8113","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-token-in-url-warning.test.ts":"8114","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-token-routes-gpt56.test.ts":"8115","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-token-routes-responses-listing.test.ts":"8116","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-token-routes.test.ts":"8117","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-tokenized-request.test.ts":"8118","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/wafRateLimit.test.ts":"8119","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/waitForServer-tcp-fallback-6800.test.mjs":"8120","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-auth.test.ts":"8121","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-providers-new.test.ts":"8122","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-validation-fallback.test.ts":"8123","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-validation-false-positive-7857.test.ts":"8124","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-validation-proxy-7058.test.ts":"8125","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-fetch-dispatch.test.ts":"8126","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-fetch-handler.test.ts":"8127","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-fetch-interception.test.ts":"8128","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-fetch-quota-fallback.test.ts":"8129","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-runtime-env.test.ts":"8130","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-search-fallback-format.test.ts":"8131","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-search-tool-routing-4481.test.ts":"8132","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-session-credentials.test.ts":"8133","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-session-dedup-3368.test.ts":"8134","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-session-pool-health.test.ts":"8135","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-session-provider-link-6316.test.ts":"8136","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-tools-translation-2820.test.ts":"8137","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-tools-translation-3260.test.ts":"8138","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-tools-translation.test.ts":"8139","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webdav-server-3485.test.ts":"8140","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-abort-timer-cleanup.test.ts":"8141","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-deliveries-db.test.ts":"8142","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-discord-dispatcher.test.ts":"8143","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-dispatcher-routing.test.ts":"8144","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-edit-wizard-regression.test.ts":"8145","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-event-descriptions.test.ts":"8146","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-metadata-guard-3269.test.ts":"8147","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-private-optin-3269.test.ts":"8148","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-slack-dispatcher.test.ts":"8149","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-ssrf-guard.test.ts":"8150","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-telegram-dispatcher.test.ts":"8151","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webshare-sync.test.ts":"8152","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/wildcard-alias-settings-not-applied-7693.test.ts":"8153","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/wildcard-router.test.ts":"8154","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/windows-cert-identity-7275.test.ts":"8155","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/windows-hide-child-process-spawns-8131.test.ts":"8156","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/windows-process-stop-8045.test.ts":"8157","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/windsurf-devin-executors.test.ts":"8158","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/workflows-no-foreign-fork-publishers.test.ts":"8159","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-agent-tools-passthrough.test.ts":"8160","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-exact-cost-2453.test.ts":"8161","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-oauth-provider.test.ts":"8162","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-oauth-quota-fetcher.test.ts":"8163","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-oauth-test-supported.test.ts":"8164","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-oauth-usage.test.ts":"8165","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-translators.test.ts":"8166","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-usage.test.ts":"8167","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xiaomi-mimo-provider.test.ts":"8168","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xiaomi-mimo-selftrack-usage.test.ts":"8169","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xiaomi-providers-registry.test.ts":"8170","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-catalog-glm52.test.ts":"8171","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-execution-credentials-target-format-7364.test.ts":"8172","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-glm-max-tokens-clamp-7364.test.ts":"8173","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-glm-target-format-override.test.ts":"8174","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-validator.test.ts":"8175","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-web-chat-endpoint-8014-probe.test.ts":"8176","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-web-models-discovery-7678.test.ts":"8177","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-docker-detect.test.ts":"8178","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-hosted-think-close-marker.test.ts":"8179","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-import-utils.test.ts":"8180","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-oauth-provider.test.ts":"8181","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-provider.test.ts":"8182","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zenmux-free-provider.test.ts":"8183","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zenmux-models-fetch-4202.test.ts":"8184","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zenmux-provider.test.ts":"8185","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/vitest.config.ts":"8186","/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/vitest.mcp.config.ts":"8187"},{"size":235716,"mtime":1786084507588,"results":"8188","hashOfConfig":"8189"},{"size":2362,"mtime":1786084507589,"results":"8190","hashOfConfig":"8189"},{"size":10081,"mtime":1786084507589,"results":"8191","hashOfConfig":"8189"},{"size":5807,"mtime":1786084507589,"results":"8192","hashOfConfig":"8189"},{"size":2580,"mtime":1786084507589,"results":"8193","hashOfConfig":"8189"},{"size":4332,"mtime":1786084507590,"results":"8194","hashOfConfig":"8189"},{"size":26628,"mtime":1786084507590,"results":"8195","hashOfConfig":"8189"},{"size":63943,"mtime":1786084507591,"results":"8196","hashOfConfig":"8189"},{"size":2088,"mtime":1786084507591,"results":"8197","hashOfConfig":"8189"},{"size":3440,"mtime":1786084507591,"results":"8198","hashOfConfig":"8189"},{"size":41860,"mtime":1786084507592,"results":"8199","hashOfConfig":"8189"},{"size":12297,"mtime":1786084507592,"results":"8200","hashOfConfig":"8189"},{"size":11568,"mtime":1786084507592,"results":"8201","hashOfConfig":"8189"},{"size":16189,"mtime":1786084507592,"results":"8202","hashOfConfig":"8189"},{"size":8552,"mtime":1786084507592,"results":"8203","hashOfConfig":"8189"},{"size":14809,"mtime":1786084507593,"results":"8204","hashOfConfig":"8189"},{"size":5595,"mtime":1786084507593,"results":"8205","hashOfConfig":"8189"},{"size":3732,"mtime":1786084507593,"results":"8206","hashOfConfig":"8189"},{"size":6044,"mtime":1786084507593,"results":"8207","hashOfConfig":"8189"},{"size":11593,"mtime":1786084507593,"results":"8208","hashOfConfig":"8189"},{"size":2926,"mtime":1786084507593,"results":"8209","hashOfConfig":"8189"},{"size":3623,"mtime":1786084507593,"results":"8210","hashOfConfig":"8189"},{"size":552,"mtime":1786084507594,"results":"8211","hashOfConfig":"8189"},{"size":31889,"mtime":1786084507598,"results":"8212","hashOfConfig":"8189"},{"size":24874,"mtime":1786084507599,"results":"8213","hashOfConfig":"8189"},{"size":511,"mtime":1786084507599,"results":"8214","hashOfConfig":"8189"},{"size":7074,"mtime":1786084507907,"results":"8215","hashOfConfig":"8216"},{"size":5126,"mtime":1786084507907,"results":"8217","hashOfConfig":"8216"},{"size":4224,"mtime":1786084507908,"results":"8218","hashOfConfig":"8216"},{"size":4130,"mtime":1786084507908,"results":"8219","hashOfConfig":"8216"},{"size":2038,"mtime":1786084508924,"results":"8220","hashOfConfig":"8216"},{"size":2561,"mtime":1786084508924,"results":"8221","hashOfConfig":"8216"},{"size":7325,"mtime":1786084508925,"results":"8222","hashOfConfig":"8216"},{"size":2063,"mtime":1786084508925,"results":"8223","hashOfConfig":"8216"},{"size":664,"mtime":1786084508925,"results":"8224","hashOfConfig":"8216"},{"size":4448,"mtime":1786084508931,"results":"8225","hashOfConfig":"8216"},{"size":2678,"mtime":1786084508936,"results":"8226","hashOfConfig":"8216"},{"size":3039,"mtime":1786084508940,"results":"8227","hashOfConfig":"8216"},{"size":988,"mtime":1786084508943,"results":"8228","hashOfConfig":"8216"},{"size":26140,"mtime":1786084508994,"results":"8229","hashOfConfig":"8216"},{"size":4827,"mtime":1786084508997,"results":"8230","hashOfConfig":"8231"},{"size":6213,"mtime":1786084508998,"results":"8232","hashOfConfig":"8231"},{"size":8114,"mtime":1786084508999,"results":"8233","hashOfConfig":"8231"},{"size":1214,"mtime":1786084509000,"results":"8234","hashOfConfig":"8231"},{"size":22169,"mtime":1786084509003,"results":"8235","hashOfConfig":"8231"},{"size":2943,"mtime":1786084509006,"results":"8236","hashOfConfig":"8231"},{"size":7336,"mtime":1786084509007,"results":"8237","hashOfConfig":"8231"},{"size":914,"mtime":1786084509008,"results":"8238","hashOfConfig":"8231"},{"size":1391,"mtime":1786084509009,"results":"8239","hashOfConfig":"8231"},{"size":10109,"mtime":1786084509012,"results":"8240","hashOfConfig":"8231"},{"size":2021,"mtime":1786084509013,"results":"8241","hashOfConfig":"8231"},{"size":4377,"mtime":1786084509014,"results":"8242","hashOfConfig":"8231"},{"size":11987,"mtime":1786084509017,"results":"8243","hashOfConfig":"8231"},{"size":3183,"mtime":1786084509018,"results":"8244","hashOfConfig":"8231"},{"size":13827,"mtime":1786084509021,"results":"8245","hashOfConfig":"8231"},{"size":6705,"mtime":1786084509022,"results":"8246","hashOfConfig":"8231"},{"size":4065,"mtime":1786084509023,"results":"8247","hashOfConfig":"8231"},{"size":2356,"mtime":1786084509024,"results":"8248","hashOfConfig":"8231"},{"size":2472,"mtime":1786084509025,"results":"8249","hashOfConfig":"8231"},{"size":19955,"mtime":1786084509026,"results":"8250","hashOfConfig":"8231"},{"size":8416,"mtime":1786084509027,"results":"8251","hashOfConfig":"8231"},{"size":105734,"mtime":1786084509031,"results":"8252","hashOfConfig":"8231"},{"size":5254,"mtime":1786084509032,"results":"8253","hashOfConfig":"8231"},{"size":3346,"mtime":1786084509032,"results":"8254","hashOfConfig":"8231"},{"size":14748,"mtime":1786084509033,"results":"8255","hashOfConfig":"8231"},{"size":4519,"mtime":1786084509034,"results":"8256","hashOfConfig":"8231"},{"size":34636,"mtime":1786084509038,"results":"8257","hashOfConfig":"8231"},{"size":728,"mtime":1786084509040,"results":"8258","hashOfConfig":"8231"},{"size":2958,"mtime":1786084509042,"results":"8259","hashOfConfig":"8231"},{"size":2411,"mtime":1786084509044,"results":"8260","hashOfConfig":"8231"},{"size":2958,"mtime":1786084509048,"results":"8261","hashOfConfig":"8231"},{"size":1371,"mtime":1786084509049,"results":"8262","hashOfConfig":"8231"},{"size":2064,"mtime":1786084509050,"results":"8263","hashOfConfig":"8231"},{"size":602,"mtime":1786084509050,"results":"8264","hashOfConfig":"8231"},{"size":11444,"mtime":1786084509052,"results":"8265","hashOfConfig":"8231"},{"size":2791,"mtime":1786084509054,"results":"8266","hashOfConfig":"8231"},{"size":6003,"mtime":1786084509056,"results":"8267","hashOfConfig":"8231"},{"size":11733,"mtime":1786084509059,"results":"8268","hashOfConfig":"8231"},{"size":6299,"mtime":1786084509063,"results":"8269","hashOfConfig":"8231"},{"size":1027,"mtime":1786084509065,"results":"8270","hashOfConfig":"8231"},{"size":1035,"mtime":1786084509066,"results":"8271","hashOfConfig":"8231"},{"size":10438,"mtime":1786084509085,"results":"8272","hashOfConfig":"8231"},{"size":1275,"mtime":1786084509087,"results":"8273","hashOfConfig":"8231"},{"size":21965,"mtime":1786084509089,"results":"8274","hashOfConfig":"8231"},{"size":877,"mtime":1786084509091,"results":"8275","hashOfConfig":"8231"},{"size":1416,"mtime":1786084509092,"results":"8276","hashOfConfig":"8231"},{"size":725,"mtime":1786084509093,"results":"8277","hashOfConfig":"8231"},{"size":828,"mtime":1786084509094,"results":"8278","hashOfConfig":"8231"},{"size":388,"mtime":1786084509094,"results":"8279","hashOfConfig":"8231"},{"size":2950,"mtime":1786084509095,"results":"8280","hashOfConfig":"8231"},{"size":858,"mtime":1786084509096,"results":"8281","hashOfConfig":"8231"},{"size":1529,"mtime":1786084509097,"results":"8282","hashOfConfig":"8231"},{"size":1022,"mtime":1786084509097,"results":"8283","hashOfConfig":"8231"},{"size":519,"mtime":1786084509098,"results":"8284","hashOfConfig":"8231"},{"size":1211,"mtime":1786084509099,"results":"8285","hashOfConfig":"8231"},{"size":988,"mtime":1786084509099,"results":"8286","hashOfConfig":"8231"},{"size":2067,"mtime":1786084509101,"results":"8287","hashOfConfig":"8231"},{"size":859,"mtime":1786084509102,"results":"8288","hashOfConfig":"8231"},{"size":391,"mtime":1786084509102,"results":"8289","hashOfConfig":"8231"},{"size":1471,"mtime":1786084509103,"results":"8290","hashOfConfig":"8231"},{"size":3433,"mtime":1786084509103,"results":"8291","hashOfConfig":"8231"},{"size":355,"mtime":1786084509104,"results":"8292","hashOfConfig":"8231"},{"size":856,"mtime":1786084509104,"results":"8293","hashOfConfig":"8231"},{"size":1694,"mtime":1786084509104,"results":"8294","hashOfConfig":"8231"},{"size":1706,"mtime":1786084509105,"results":"8295","hashOfConfig":"8231"},{"size":401,"mtime":1786084509106,"results":"8296","hashOfConfig":"8231"},{"size":2185,"mtime":1786084509106,"results":"8297","hashOfConfig":"8231"},{"size":1238,"mtime":1786084509107,"results":"8298","hashOfConfig":"8231"},{"size":912,"mtime":1786084509107,"results":"8299","hashOfConfig":"8231"},{"size":723,"mtime":1786084509108,"results":"8300","hashOfConfig":"8231"},{"size":1676,"mtime":1786084509108,"results":"8301","hashOfConfig":"8231"},{"size":810,"mtime":1786084509109,"results":"8302","hashOfConfig":"8231"},{"size":748,"mtime":1786084509109,"results":"8303","hashOfConfig":"8231"},{"size":452,"mtime":1786084509110,"results":"8304","hashOfConfig":"8231"},{"size":440,"mtime":1786084509110,"results":"8305","hashOfConfig":"8231"},{"size":994,"mtime":1786084509111,"results":"8306","hashOfConfig":"8231"},{"size":1680,"mtime":1786084509111,"results":"8307","hashOfConfig":"8231"},{"size":6854,"mtime":1786084509112,"results":"8308","hashOfConfig":"8231"},{"size":400,"mtime":1786084509112,"results":"8309","hashOfConfig":"8231"},{"size":411,"mtime":1786084509113,"results":"8310","hashOfConfig":"8231"},{"size":350,"mtime":1786084509113,"results":"8311","hashOfConfig":"8231"},{"size":3276,"mtime":1786084509114,"results":"8312","hashOfConfig":"8231"},{"size":1137,"mtime":1786084509114,"results":"8313","hashOfConfig":"8231"},{"size":4263,"mtime":1786084509114,"results":"8314","hashOfConfig":"8231"},{"size":4351,"mtime":1786084509115,"results":"8315","hashOfConfig":"8231"},{"size":1463,"mtime":1786084509115,"results":"8316","hashOfConfig":"8231"},{"size":546,"mtime":1786084509115,"results":"8317","hashOfConfig":"8231"},{"size":3894,"mtime":1786084509116,"results":"8318","hashOfConfig":"8231"},{"size":409,"mtime":1786084509116,"results":"8319","hashOfConfig":"8231"},{"size":5881,"mtime":1786084509116,"results":"8320","hashOfConfig":"8231"},{"size":1384,"mtime":1786084509117,"results":"8321","hashOfConfig":"8231"},{"size":3965,"mtime":1786084509117,"results":"8322","hashOfConfig":"8231"},{"size":788,"mtime":1786084509117,"results":"8323","hashOfConfig":"8231"},{"size":558,"mtime":1786084509118,"results":"8324","hashOfConfig":"8231"},{"size":355,"mtime":1786084509118,"results":"8325","hashOfConfig":"8231"},{"size":1850,"mtime":1786084509118,"results":"8326","hashOfConfig":"8231"},{"size":9041,"mtime":1786084509119,"results":"8327","hashOfConfig":"8231"},{"size":895,"mtime":1786084509119,"results":"8328","hashOfConfig":"8231"},{"size":433,"mtime":1786084509119,"results":"8329","hashOfConfig":"8231"},{"size":413,"mtime":1786084509120,"results":"8330","hashOfConfig":"8231"},{"size":471,"mtime":1786084509120,"results":"8331","hashOfConfig":"8231"},{"size":1842,"mtime":1786084509121,"results":"8332","hashOfConfig":"8231"},{"size":5914,"mtime":1786084509122,"results":"8333","hashOfConfig":"8231"},{"size":418,"mtime":1786084509121,"results":"8334","hashOfConfig":"8231"},{"size":682,"mtime":1786084509121,"results":"8335","hashOfConfig":"8231"},{"size":457,"mtime":1786084509123,"results":"8336","hashOfConfig":"8231"},{"size":319,"mtime":1786084509123,"results":"8337","hashOfConfig":"8231"},{"size":421,"mtime":1786084509123,"results":"8338","hashOfConfig":"8231"},{"size":1408,"mtime":1786084509124,"results":"8339","hashOfConfig":"8231"},{"size":1317,"mtime":1786084509124,"results":"8340","hashOfConfig":"8231"},{"size":435,"mtime":1786084509124,"results":"8341","hashOfConfig":"8231"},{"size":857,"mtime":1786084509125,"results":"8342","hashOfConfig":"8231"},{"size":416,"mtime":1786084509125,"results":"8343","hashOfConfig":"8231"},{"size":1846,"mtime":1786084509126,"results":"8344","hashOfConfig":"8231"},{"size":419,"mtime":1786084509126,"results":"8345","hashOfConfig":"8231"},{"size":427,"mtime":1786084509127,"results":"8346","hashOfConfig":"8231"},{"size":647,"mtime":1786084509127,"results":"8347","hashOfConfig":"8231"},{"size":1169,"mtime":1786084509127,"results":"8348","hashOfConfig":"8231"},{"size":1133,"mtime":1786084509128,"results":"8349","hashOfConfig":"8231"},{"size":629,"mtime":1786084509128,"results":"8350","hashOfConfig":"8231"},{"size":1194,"mtime":1786084509129,"results":"8351","hashOfConfig":"8231"},{"size":835,"mtime":1786084509129,"results":"8352","hashOfConfig":"8231"},{"size":657,"mtime":1786084509130,"results":"8353","hashOfConfig":"8231"},{"size":802,"mtime":1786084509131,"results":"8354","hashOfConfig":"8231"},{"size":800,"mtime":1786084509131,"results":"8355","hashOfConfig":"8231"},{"size":918,"mtime":1786084509131,"results":"8356","hashOfConfig":"8231"},{"size":731,"mtime":1786084509131,"results":"8357","hashOfConfig":"8231"},{"size":781,"mtime":1786084509132,"results":"8358","hashOfConfig":"8231"},{"size":405,"mtime":1786084509132,"results":"8359","hashOfConfig":"8231"},{"size":1574,"mtime":1786084509132,"results":"8360","hashOfConfig":"8231"},{"size":1780,"mtime":1786084509133,"results":"8361","hashOfConfig":"8231"},{"size":542,"mtime":1786084509133,"results":"8362","hashOfConfig":"8231"},{"size":4860,"mtime":1786084509133,"results":"8363","hashOfConfig":"8231"},{"size":400,"mtime":1786084509133,"results":"8364","hashOfConfig":"8231"},{"size":6044,"mtime":1786084509134,"results":"8365","hashOfConfig":"8231"},{"size":4840,"mtime":1786084509134,"results":"8366","hashOfConfig":"8231"},{"size":502,"mtime":1786084509134,"results":"8367","hashOfConfig":"8231"},{"size":1278,"mtime":1786084509135,"results":"8368","hashOfConfig":"8231"},{"size":609,"mtime":1786084509135,"results":"8369","hashOfConfig":"8231"},{"size":562,"mtime":1786084509135,"results":"8370","hashOfConfig":"8231"},{"size":559,"mtime":1786084509136,"results":"8371","hashOfConfig":"8231"},{"size":510,"mtime":1786084509136,"results":"8372","hashOfConfig":"8231"},{"size":523,"mtime":1786084509136,"results":"8373","hashOfConfig":"8231"},{"size":1491,"mtime":1786084509137,"results":"8374","hashOfConfig":"8231"},{"size":619,"mtime":1786084509137,"results":"8375","hashOfConfig":"8231"},{"size":902,"mtime":1786084509138,"results":"8376","hashOfConfig":"8231"},{"size":638,"mtime":1786084509138,"results":"8377","hashOfConfig":"8231"},{"size":373,"mtime":1786084509138,"results":"8378","hashOfConfig":"8231"},{"size":391,"mtime":1786084509139,"results":"8379","hashOfConfig":"8231"},{"size":400,"mtime":1786084509139,"results":"8380","hashOfConfig":"8231"},{"size":3795,"mtime":1786084509141,"results":"8381","hashOfConfig":"8231"},{"size":756,"mtime":1786084509145,"results":"8382","hashOfConfig":"8231"},{"size":1021,"mtime":1786084509149,"results":"8383","hashOfConfig":"8231"},{"size":830,"mtime":1786084509152,"results":"8384","hashOfConfig":"8231"},{"size":369,"mtime":1786084509155,"results":"8385","hashOfConfig":"8231"},{"size":1171,"mtime":1786084509158,"results":"8386","hashOfConfig":"8231"},{"size":438,"mtime":1786084509160,"results":"8387","hashOfConfig":"8231"},{"size":416,"mtime":1786084509162,"results":"8388","hashOfConfig":"8231"},{"size":1784,"mtime":1786084509166,"results":"8389","hashOfConfig":"8231"},{"size":671,"mtime":1786084509169,"results":"8390","hashOfConfig":"8231"},{"size":366,"mtime":1786084509171,"results":"8391","hashOfConfig":"8231"},{"size":3400,"mtime":1786084509173,"results":"8392","hashOfConfig":"8231"},{"size":1046,"mtime":1786084509174,"results":"8393","hashOfConfig":"8231"},{"size":2996,"mtime":1786084509175,"results":"8394","hashOfConfig":"8231"},{"size":828,"mtime":1786084509176,"results":"8395","hashOfConfig":"8231"},{"size":2004,"mtime":1786084509179,"results":"8396","hashOfConfig":"8231"},{"size":1759,"mtime":1786084509187,"results":"8397","hashOfConfig":"8231"},{"size":2784,"mtime":1786084509189,"results":"8398","hashOfConfig":"8231"},{"size":269,"mtime":1786084509183,"results":"8399","hashOfConfig":"8231"},{"size":523,"mtime":1786084509191,"results":"8400","hashOfConfig":"8231"},{"size":1013,"mtime":1786084509194,"results":"8401","hashOfConfig":"8231"},{"size":2316,"mtime":1786084509196,"results":"8402","hashOfConfig":"8231"},{"size":2424,"mtime":1786084509200,"results":"8403","hashOfConfig":"8231"},{"size":402,"mtime":1786084509202,"results":"8404","hashOfConfig":"8231"},{"size":373,"mtime":1786084509205,"results":"8405","hashOfConfig":"8231"},{"size":782,"mtime":1786084509208,"results":"8406","hashOfConfig":"8231"},{"size":401,"mtime":1786084509212,"results":"8407","hashOfConfig":"8231"},{"size":466,"mtime":1786084509215,"results":"8408","hashOfConfig":"8231"},{"size":793,"mtime":1786084509217,"results":"8409","hashOfConfig":"8231"},{"size":411,"mtime":1786084509220,"results":"8410","hashOfConfig":"8231"},{"size":20220,"mtime":1786084509227,"results":"8411","hashOfConfig":"8231"},{"size":568,"mtime":1786084509229,"results":"8412","hashOfConfig":"8231"},{"size":874,"mtime":1786084509231,"results":"8413","hashOfConfig":"8231"},{"size":404,"mtime":1786084509233,"results":"8414","hashOfConfig":"8231"},{"size":410,"mtime":1786084509236,"results":"8415","hashOfConfig":"8231"},{"size":589,"mtime":1786084509237,"results":"8416","hashOfConfig":"8231"},{"size":1099,"mtime":1786084509239,"results":"8417","hashOfConfig":"8231"},{"size":1002,"mtime":1786084509241,"results":"8418","hashOfConfig":"8231"},{"size":953,"mtime":1786084509244,"results":"8419","hashOfConfig":"8231"},{"size":592,"mtime":1786084509247,"results":"8420","hashOfConfig":"8231"},{"size":354,"mtime":1786084509251,"results":"8421","hashOfConfig":"8231"},{"size":1261,"mtime":1786084509254,"results":"8422","hashOfConfig":"8231"},{"size":654,"mtime":1786084509258,"results":"8423","hashOfConfig":"8231"},{"size":2264,"mtime":1786084509261,"results":"8424","hashOfConfig":"8231"},{"size":389,"mtime":1786084509263,"results":"8425","hashOfConfig":"8231"},{"size":615,"mtime":1786084509265,"results":"8426","hashOfConfig":"8231"},{"size":448,"mtime":1786084509268,"results":"8427","hashOfConfig":"8231"},{"size":851,"mtime":1786084509271,"results":"8428","hashOfConfig":"8231"},{"size":1717,"mtime":1786084509274,"results":"8429","hashOfConfig":"8231"},{"size":405,"mtime":1786084509276,"results":"8430","hashOfConfig":"8231"},{"size":694,"mtime":1786084509277,"results":"8431","hashOfConfig":"8231"},{"size":962,"mtime":1786084509279,"results":"8432","hashOfConfig":"8231"},{"size":463,"mtime":1786084509280,"results":"8433","hashOfConfig":"8231"},{"size":5964,"mtime":1786084509282,"results":"8434","hashOfConfig":"8231"},{"size":401,"mtime":1786084509283,"results":"8435","hashOfConfig":"8231"},{"size":631,"mtime":1786084509285,"results":"8436","hashOfConfig":"8231"},{"size":6608,"mtime":1786084509286,"results":"8437","hashOfConfig":"8231"},{"size":1445,"mtime":1786084509287,"results":"8438","hashOfConfig":"8231"},{"size":1129,"mtime":1786084509288,"results":"8439","hashOfConfig":"8231"},{"size":2292,"mtime":1786084509291,"results":"8440","hashOfConfig":"8231"},{"size":6477,"mtime":1786084509295,"results":"8441","hashOfConfig":"8231"},{"size":1627,"mtime":1786084509297,"results":"8442","hashOfConfig":"8231"},{"size":5360,"mtime":1786084509300,"results":"8443","hashOfConfig":"8231"},{"size":495,"mtime":1786084509301,"results":"8444","hashOfConfig":"8231"},{"size":1623,"mtime":1786084509303,"results":"8445","hashOfConfig":"8231"},{"size":2478,"mtime":1786084509305,"results":"8446","hashOfConfig":"8231"},{"size":964,"mtime":1786084509306,"results":"8447","hashOfConfig":"8231"},{"size":658,"mtime":1786084509309,"results":"8448","hashOfConfig":"8231"},{"size":1273,"mtime":1786084509313,"results":"8449","hashOfConfig":"8231"},{"size":1804,"mtime":1786084509316,"results":"8450","hashOfConfig":"8231"},{"size":445,"mtime":1786084509319,"results":"8451","hashOfConfig":"8231"},{"size":3809,"mtime":1786084509321,"results":"8452","hashOfConfig":"8231"},{"size":3083,"mtime":1786084509322,"results":"8453","hashOfConfig":"8231"},{"size":414,"mtime":1786084509326,"results":"8454","hashOfConfig":"8231"},{"size":736,"mtime":1786084509329,"results":"8455","hashOfConfig":"8231"},{"size":400,"mtime":1786084509332,"results":"8456","hashOfConfig":"8231"},{"size":3592,"mtime":1786084509334,"results":"8457","hashOfConfig":"8231"},{"size":587,"mtime":1786084509336,"results":"8458","hashOfConfig":"8231"},{"size":405,"mtime":1786084509337,"results":"8459","hashOfConfig":"8231"},{"size":1945,"mtime":1786084509338,"results":"8460","hashOfConfig":"8231"},{"size":1693,"mtime":1786084509348,"results":"8461","hashOfConfig":"8231"},{"size":1255,"mtime":1786084509345,"results":"8462","hashOfConfig":"8231"},{"size":1587,"mtime":1786084509341,"results":"8463","hashOfConfig":"8231"},{"size":1179,"mtime":1786084509350,"results":"8464","hashOfConfig":"8231"},{"size":405,"mtime":1786084509353,"results":"8465","hashOfConfig":"8231"},{"size":611,"mtime":1786084509354,"results":"8466","hashOfConfig":"8231"},{"size":407,"mtime":1786084509356,"results":"8467","hashOfConfig":"8231"},{"size":1713,"mtime":1786084509357,"results":"8468","hashOfConfig":"8231"},{"size":401,"mtime":1786084509358,"results":"8469","hashOfConfig":"8231"},{"size":441,"mtime":1786084509361,"results":"8470","hashOfConfig":"8231"},{"size":837,"mtime":1786084509364,"results":"8471","hashOfConfig":"8231"},{"size":1117,"mtime":1786084509366,"results":"8472","hashOfConfig":"8231"},{"size":1332,"mtime":1786084509369,"results":"8473","hashOfConfig":"8231"},{"size":811,"mtime":1786084509369,"results":"8474","hashOfConfig":"8231"},{"size":1237,"mtime":1786084509371,"results":"8475","hashOfConfig":"8231"},{"size":4790,"mtime":1786084509372,"results":"8476","hashOfConfig":"8231"},{"size":408,"mtime":1786084509373,"results":"8477","hashOfConfig":"8231"},{"size":1078,"mtime":1786084509374,"results":"8478","hashOfConfig":"8231"},{"size":2876,"mtime":1786084509375,"results":"8479","hashOfConfig":"8231"},{"size":838,"mtime":1786084509376,"results":"8480","hashOfConfig":"8231"},{"size":411,"mtime":1786084509377,"results":"8481","hashOfConfig":"8231"},{"size":543,"mtime":1786084509380,"results":"8482","hashOfConfig":"8231"},{"size":2200,"mtime":1786084509382,"results":"8483","hashOfConfig":"8231"},{"size":2295,"mtime":1786084509384,"results":"8484","hashOfConfig":"8231"},{"size":1215,"mtime":1786084509385,"results":"8485","hashOfConfig":"8231"},{"size":3355,"mtime":1786084509387,"results":"8486","hashOfConfig":"8231"},{"size":922,"mtime":1786084509388,"results":"8487","hashOfConfig":"8231"},{"size":1791,"mtime":1786084509389,"results":"8488","hashOfConfig":"8231"},{"size":841,"mtime":1786084509390,"results":"8489","hashOfConfig":"8231"},{"size":440,"mtime":1786084509391,"results":"8490","hashOfConfig":"8231"},{"size":335,"mtime":1786084509391,"results":"8491","hashOfConfig":"8231"},{"size":556,"mtime":1786084509392,"results":"8492","hashOfConfig":"8231"},{"size":415,"mtime":1786084509393,"results":"8493","hashOfConfig":"8231"},{"size":395,"mtime":1786084509395,"results":"8494","hashOfConfig":"8231"},{"size":395,"mtime":1786084509397,"results":"8495","hashOfConfig":"8231"},{"size":394,"mtime":1786084509398,"results":"8496","hashOfConfig":"8231"},{"size":442,"mtime":1786084509399,"results":"8497","hashOfConfig":"8231"},{"size":430,"mtime":1786084509401,"results":"8498","hashOfConfig":"8231"},{"size":1774,"mtime":1786084509402,"results":"8499","hashOfConfig":"8231"},{"size":854,"mtime":1786084509404,"results":"8500","hashOfConfig":"8231"},{"size":422,"mtime":1786084509408,"results":"8501","hashOfConfig":"8231"},{"size":598,"mtime":1786084509410,"results":"8502","hashOfConfig":"8231"},{"size":395,"mtime":1786084509412,"results":"8503","hashOfConfig":"8231"},{"size":8864,"mtime":1786084509414,"results":"8504","hashOfConfig":"8231"},{"size":442,"mtime":1786084509415,"results":"8505","hashOfConfig":"8231"},{"size":403,"mtime":1786084509418,"results":"8506","hashOfConfig":"8231"},{"size":1112,"mtime":1786084509423,"results":"8507","hashOfConfig":"8231"},{"size":739,"mtime":1786084509421,"results":"8508","hashOfConfig":"8231"},{"size":851,"mtime":1786084509426,"results":"8509","hashOfConfig":"8231"},{"size":1037,"mtime":1786084509425,"results":"8510","hashOfConfig":"8231"},{"size":329,"mtime":1786084509428,"results":"8511","hashOfConfig":"8231"},{"size":1136,"mtime":1786084509430,"results":"8512","hashOfConfig":"8231"},{"size":1198,"mtime":1786084509433,"results":"8513","hashOfConfig":"8231"},{"size":665,"mtime":1786084509431,"results":"8514","hashOfConfig":"8231"},{"size":1384,"mtime":1786084509434,"results":"8515","hashOfConfig":"8231"},{"size":2223,"mtime":1786084509436,"results":"8516","hashOfConfig":"8231"},{"size":1729,"mtime":1786084509435,"results":"8517","hashOfConfig":"8231"},{"size":25954,"mtime":1786084509437,"results":"8518","hashOfConfig":"8231"},{"size":4426,"mtime":1786084509438,"results":"8519","hashOfConfig":"8231"},{"size":7539,"mtime":1786084509439,"results":"8520","hashOfConfig":"8231"},{"size":1312,"mtime":1786084509439,"results":"8521","hashOfConfig":"8231"},{"size":1865,"mtime":1786084509441,"results":"8522","hashOfConfig":"8231"},{"size":9071,"mtime":1786084509443,"results":"8523","hashOfConfig":"8231"},{"size":2463,"mtime":1786084509445,"results":"8524","hashOfConfig":"8231"},{"size":8152,"mtime":1786084509446,"results":"8525","hashOfConfig":"8231"},{"size":13148,"mtime":1786084509447,"results":"8526","hashOfConfig":"8231"},{"size":1323,"mtime":1786084509448,"results":"8527","hashOfConfig":"8231"},{"size":18199,"mtime":1786084509451,"results":"8528","hashOfConfig":"8231"},{"size":1387,"mtime":1786084509451,"results":"8529","hashOfConfig":"8231"},{"size":24007,"mtime":1786084509460,"results":"8530","hashOfConfig":"8231"},{"size":3877,"mtime":1786084509460,"results":"8531","hashOfConfig":"8231"},{"size":6678,"mtime":1786084509461,"results":"8532","hashOfConfig":"8231"},{"size":6554,"mtime":1786084509463,"results":"8533","hashOfConfig":"8231"},{"size":58757,"mtime":1786084509458,"results":"8534","hashOfConfig":"8231"},{"size":941,"mtime":1786084509466,"results":"8535","hashOfConfig":"8231"},{"size":26114,"mtime":1786084509471,"results":"8536","hashOfConfig":"8231"},{"size":5287,"mtime":1786084509473,"results":"8537","hashOfConfig":"8231"},{"size":3072,"mtime":1786084509475,"results":"8538","hashOfConfig":"8231"},{"size":3389,"mtime":1786084509484,"results":"8539","hashOfConfig":"8231"},{"size":13872,"mtime":1786084509486,"results":"8540","hashOfConfig":"8231"},{"size":72444,"mtime":1786084509483,"results":"8541","hashOfConfig":"8231"},{"size":22657,"mtime":1786084509487,"results":"8542","hashOfConfig":"8231"},{"size":23016,"mtime":1786084509489,"results":"8543","hashOfConfig":"8231"},{"size":14021,"mtime":1786084509495,"results":"8544","hashOfConfig":"8231"},{"size":4308,"mtime":1786084509496,"results":"8545","hashOfConfig":"8231"},{"size":4782,"mtime":1786084509496,"results":"8546","hashOfConfig":"8231"},{"size":120733,"mtime":1786084509495,"results":"8547","hashOfConfig":"8231"},{"size":1275,"mtime":1786084509497,"results":"8548","hashOfConfig":"8231"},{"size":4520,"mtime":1786084509497,"results":"8549","hashOfConfig":"8231"},{"size":3108,"mtime":1786084509498,"results":"8550","hashOfConfig":"8231"},{"size":13051,"mtime":1786084509498,"results":"8551","hashOfConfig":"8231"},{"size":15825,"mtime":1786084509500,"results":"8552","hashOfConfig":"8231"},{"size":11652,"mtime":1786084509500,"results":"8553","hashOfConfig":"8231"},{"size":16003,"mtime":1786084509501,"results":"8554","hashOfConfig":"8231"},{"size":24313,"mtime":1786084509502,"results":"8555","hashOfConfig":"8231"},{"size":3157,"mtime":1786084509502,"results":"8556","hashOfConfig":"8231"},{"size":17079,"mtime":1786084509499,"results":"8557","hashOfConfig":"8231"},{"size":17409,"mtime":1786084509503,"results":"8558","hashOfConfig":"8231"},{"size":18751,"mtime":1786084509504,"results":"8559","hashOfConfig":"8231"},{"size":4167,"mtime":1786084509505,"results":"8560","hashOfConfig":"8231"},{"size":2139,"mtime":1786084509505,"results":"8561","hashOfConfig":"8231"},{"size":3321,"mtime":1786084509508,"results":"8562","hashOfConfig":"8231"},{"size":4491,"mtime":1786084509508,"results":"8563","hashOfConfig":"8231"},{"size":1364,"mtime":1786084509508,"results":"8564","hashOfConfig":"8231"},{"size":7065,"mtime":1786084509509,"results":"8565","hashOfConfig":"8231"},{"size":61267,"mtime":1786084509507,"results":"8566","hashOfConfig":"8231"},{"size":25680,"mtime":1786084509511,"results":"8567","hashOfConfig":"8231"},{"size":10780,"mtime":1786084509514,"results":"8568","hashOfConfig":"8231"},{"size":14695,"mtime":1786084509517,"results":"8569","hashOfConfig":"8231"},{"size":13634,"mtime":1786084509520,"results":"8570","hashOfConfig":"8231"},{"size":26658,"mtime":1786084509523,"results":"8571","hashOfConfig":"8231"},{"size":14535,"mtime":1786084509531,"results":"8572","hashOfConfig":"8231"},{"size":2465,"mtime":1786084509532,"results":"8573","hashOfConfig":"8231"},{"size":2937,"mtime":1786084509532,"results":"8574","hashOfConfig":"8231"},{"size":59476,"mtime":1786084509530,"results":"8575","hashOfConfig":"8231"},{"size":10939,"mtime":1786084509533,"results":"8576","hashOfConfig":"8231"},{"size":1383,"mtime":1786084509545,"results":"8577","hashOfConfig":"8231"},{"size":2297,"mtime":1786084509533,"results":"8578","hashOfConfig":"8231"},{"size":5995,"mtime":1786084509535,"results":"8579","hashOfConfig":"8231"},{"size":42051,"mtime":1786084509542,"results":"8580","hashOfConfig":"8231"},{"size":1945,"mtime":1786084509555,"results":"8581","hashOfConfig":"8231"},{"size":2412,"mtime":1786084509555,"results":"8582","hashOfConfig":"8231"},{"size":1119,"mtime":1786084509556,"results":"8583","hashOfConfig":"8231"},{"size":45636,"mtime":1786084509552,"results":"8584","hashOfConfig":"8231"},{"size":3021,"mtime":1786084509557,"results":"8585","hashOfConfig":"8231"},{"size":7559,"mtime":1786084509558,"results":"8586","hashOfConfig":"8231"},{"size":4141,"mtime":1786084509559,"results":"8587","hashOfConfig":"8231"},{"size":1189,"mtime":1786084509560,"results":"8588","hashOfConfig":"8231"},{"size":19031,"mtime":1786084509561,"results":"8589","hashOfConfig":"8231"},{"size":20515,"mtime":1786084509562,"results":"8590","hashOfConfig":"8231"},{"size":20756,"mtime":1786084509564,"results":"8591","hashOfConfig":"8231"},{"size":13743,"mtime":1786084509568,"results":"8592","hashOfConfig":"8231"},{"size":32042,"mtime":1786084509567,"results":"8593","hashOfConfig":"8231"},{"size":13160,"mtime":1786084509569,"results":"8594","hashOfConfig":"8231"},{"size":13066,"mtime":1786084509570,"results":"8595","hashOfConfig":"8231"},{"size":6504,"mtime":1786084509570,"results":"8596","hashOfConfig":"8231"},{"size":2244,"mtime":1786084509570,"results":"8597","hashOfConfig":"8231"},{"size":15859,"mtime":1786084509571,"results":"8598","hashOfConfig":"8231"},{"size":24622,"mtime":1786084509572,"results":"8599","hashOfConfig":"8231"},{"size":10689,"mtime":1786084509572,"results":"8600","hashOfConfig":"8231"},{"size":20281,"mtime":1786084509573,"results":"8601","hashOfConfig":"8231"},{"size":26645,"mtime":1786084509574,"results":"8602","hashOfConfig":"8231"},{"size":4588,"mtime":1786084509574,"results":"8603","hashOfConfig":"8231"},{"size":18904,"mtime":1786084509575,"results":"8604","hashOfConfig":"8231"},{"size":10861,"mtime":1786084509575,"results":"8605","hashOfConfig":"8231"},{"size":7309,"mtime":1786084509578,"results":"8606","hashOfConfig":"8231"},{"size":4477,"mtime":1786084509578,"results":"8607","hashOfConfig":"8231"},{"size":25817,"mtime":1786084509578,"results":"8608","hashOfConfig":"8231"},{"size":1503,"mtime":1786084509579,"results":"8609","hashOfConfig":"8231"},{"size":34318,"mtime":1786084509577,"results":"8610","hashOfConfig":"8231"},{"size":7721,"mtime":1786084509579,"results":"8611","hashOfConfig":"8231"},{"size":18661,"mtime":1786084509579,"results":"8612","hashOfConfig":"8231"},{"size":5610,"mtime":1786084509580,"results":"8613","hashOfConfig":"8231"},{"size":19964,"mtime":1786084509580,"results":"8614","hashOfConfig":"8231"},{"size":35098,"mtime":1786084509581,"results":"8615","hashOfConfig":"8231"},{"size":14325,"mtime":1786084509582,"results":"8616","hashOfConfig":"8231"},{"size":28121,"mtime":1786084509582,"results":"8617","hashOfConfig":"8231"},{"size":3850,"mtime":1786084509583,"results":"8618","hashOfConfig":"8231"},{"size":2780,"mtime":1786084509583,"results":"8619","hashOfConfig":"8231"},{"size":20958,"mtime":1786084509583,"results":"8620","hashOfConfig":"8231"},{"size":13665,"mtime":1786084509584,"results":"8621","hashOfConfig":"8231"},{"size":1856,"mtime":1786084509584,"results":"8622","hashOfConfig":"8231"},{"size":6251,"mtime":1786084509587,"results":"8623","hashOfConfig":"8231"},{"size":42596,"mtime":1786084509586,"results":"8624","hashOfConfig":"8231"},{"size":4468,"mtime":1786084509587,"results":"8625","hashOfConfig":"8231"},{"size":3303,"mtime":1786084509587,"results":"8626","hashOfConfig":"8231"},{"size":3688,"mtime":1786084509588,"results":"8627","hashOfConfig":"8231"},{"size":11084,"mtime":1786084509588,"results":"8628","hashOfConfig":"8231"},{"size":9173,"mtime":1786084509589,"results":"8629","hashOfConfig":"8231"},{"size":4091,"mtime":1786084509589,"results":"8630","hashOfConfig":"8231"},{"size":7149,"mtime":1786084509588,"results":"8631","hashOfConfig":"8231"},{"size":2494,"mtime":1786084509589,"results":"8632","hashOfConfig":"8231"},{"size":24022,"mtime":1786084509590,"results":"8633","hashOfConfig":"8231"},{"size":4304,"mtime":1786084509590,"results":"8634","hashOfConfig":"8231"},{"size":9855,"mtime":1786084509592,"results":"8635","hashOfConfig":"8231"},{"size":49903,"mtime":1786084509592,"results":"8636","hashOfConfig":"8231"},{"size":7607,"mtime":1786084509592,"results":"8637","hashOfConfig":"8231"},{"size":14710,"mtime":1786084509593,"results":"8638","hashOfConfig":"8231"},{"size":27716,"mtime":1786084509594,"results":"8639","hashOfConfig":"8231"},{"size":14193,"mtime":1786084509594,"results":"8640","hashOfConfig":"8231"},{"size":28194,"mtime":1786084509596,"results":"8641","hashOfConfig":"8231"},{"size":21742,"mtime":1786084509596,"results":"8642","hashOfConfig":"8231"},{"size":4997,"mtime":1786084509597,"results":"8643","hashOfConfig":"8231"},{"size":4053,"mtime":1786084509598,"results":"8644","hashOfConfig":"8231"},{"size":1937,"mtime":1786084509599,"results":"8645","hashOfConfig":"8231"},{"size":3533,"mtime":1786084509599,"results":"8646","hashOfConfig":"8231"},{"size":13702,"mtime":1786084509599,"results":"8647","hashOfConfig":"8231"},{"size":23487,"mtime":1786084509599,"results":"8648","hashOfConfig":"8231"},{"size":2054,"mtime":1786084509600,"results":"8649","hashOfConfig":"8231"},{"size":13167,"mtime":1786084509600,"results":"8650","hashOfConfig":"8231"},{"size":17922,"mtime":1786084509600,"results":"8651","hashOfConfig":"8231"},{"size":7186,"mtime":1786084509600,"results":"8652","hashOfConfig":"8231"},{"size":20777,"mtime":1786084509601,"results":"8653","hashOfConfig":"8231"},{"size":3400,"mtime":1786084509601,"results":"8654","hashOfConfig":"8231"},{"size":15345,"mtime":1786084509601,"results":"8655","hashOfConfig":"8231"},{"size":4136,"mtime":1786084509601,"results":"8656","hashOfConfig":"8231"},{"size":17947,"mtime":1786084509602,"results":"8657","hashOfConfig":"8231"},{"size":5891,"mtime":1786084509602,"results":"8658","hashOfConfig":"8231"},{"size":5361,"mtime":1786084509602,"results":"8659","hashOfConfig":"8231"},{"size":23126,"mtime":1786084509603,"results":"8660","hashOfConfig":"8231"},{"size":7884,"mtime":1786084509603,"results":"8661","hashOfConfig":"8231"},{"size":13486,"mtime":1786084509603,"results":"8662","hashOfConfig":"8231"},{"size":28296,"mtime":1786084509604,"results":"8663","hashOfConfig":"8231"},{"size":6091,"mtime":1786084509604,"results":"8664","hashOfConfig":"8231"},{"size":18661,"mtime":1786084509605,"results":"8665","hashOfConfig":"8231"},{"size":13865,"mtime":1786084509606,"results":"8666","hashOfConfig":"8231"},{"size":15467,"mtime":1786084509606,"results":"8667","hashOfConfig":"8231"},{"size":9884,"mtime":1786084509606,"results":"8668","hashOfConfig":"8231"},{"size":27761,"mtime":1786084509607,"results":"8669","hashOfConfig":"8231"},{"size":26251,"mtime":1786084509608,"results":"8670","hashOfConfig":"8231"},{"size":4344,"mtime":1786084509608,"results":"8671","hashOfConfig":"8231"},{"size":6194,"mtime":1786084509608,"results":"8672","hashOfConfig":"8231"},{"size":1295,"mtime":1786084509613,"results":"8673","hashOfConfig":"8231"},{"size":10361,"mtime":1786084509614,"results":"8674","hashOfConfig":"8231"},{"size":1884,"mtime":1786084509614,"results":"8675","hashOfConfig":"8231"},{"size":2421,"mtime":1786084509614,"results":"8676","hashOfConfig":"8231"},{"size":1818,"mtime":1786084509614,"results":"8677","hashOfConfig":"8231"},{"size":3567,"mtime":1786084509614,"results":"8678","hashOfConfig":"8231"},{"size":3990,"mtime":1786084509615,"results":"8679","hashOfConfig":"8231"},{"size":2888,"mtime":1786084509615,"results":"8680","hashOfConfig":"8231"},{"size":523,"mtime":1786084509615,"results":"8681","hashOfConfig":"8231"},{"size":2417,"mtime":1786084509615,"results":"8682","hashOfConfig":"8231"},{"size":1395,"mtime":1786084509615,"results":"8683","hashOfConfig":"8231"},{"size":5869,"mtime":1786084509615,"results":"8684","hashOfConfig":"8231"},{"size":5229,"mtime":1786084509615,"results":"8685","hashOfConfig":"8231"},{"size":731,"mtime":1786084509615,"results":"8686","hashOfConfig":"8231"},{"size":2534,"mtime":1786084509616,"results":"8687","hashOfConfig":"8231"},{"size":3066,"mtime":1786084509616,"results":"8688","hashOfConfig":"8231"},{"size":1635,"mtime":1786084509616,"results":"8689","hashOfConfig":"8231"},{"size":3326,"mtime":1786084509616,"results":"8690","hashOfConfig":"8231"},{"size":2922,"mtime":1786084509616,"results":"8691","hashOfConfig":"8231"},{"size":6310,"mtime":1786084509616,"results":"8692","hashOfConfig":"8231"},{"size":2311,"mtime":1786084509616,"results":"8693","hashOfConfig":"8231"},{"size":1587,"mtime":1786084509617,"results":"8694","hashOfConfig":"8231"},{"size":1322,"mtime":1786084509617,"results":"8695","hashOfConfig":"8231"},{"size":1173,"mtime":1786084509617,"results":"8696","hashOfConfig":"8231"},{"size":1707,"mtime":1786084509617,"results":"8697","hashOfConfig":"8231"},{"size":1097,"mtime":1786084509617,"results":"8698","hashOfConfig":"8231"},{"size":1126,"mtime":1786084509617,"results":"8699","hashOfConfig":"8231"},{"size":6556,"mtime":1786084509617,"results":"8700","hashOfConfig":"8231"},{"size":1365,"mtime":1786084509617,"results":"8701","hashOfConfig":"8231"},{"size":5280,"mtime":1786084509618,"results":"8702","hashOfConfig":"8231"},{"size":8113,"mtime":1786084509618,"results":"8703","hashOfConfig":"8231"},{"size":1684,"mtime":1786084509618,"results":"8704","hashOfConfig":"8231"},{"size":1059,"mtime":1786084509618,"results":"8705","hashOfConfig":"8231"},{"size":2777,"mtime":1786084509618,"results":"8706","hashOfConfig":"8231"},{"size":4214,"mtime":1786084509618,"results":"8707","hashOfConfig":"8231"},{"size":6102,"mtime":1786084509619,"results":"8708","hashOfConfig":"8231"},{"size":4819,"mtime":1786084509619,"results":"8709","hashOfConfig":"8231"},{"size":4008,"mtime":1786084509619,"results":"8710","hashOfConfig":"8231"},{"size":4711,"mtime":1786084509619,"results":"8711","hashOfConfig":"8231"},{"size":5582,"mtime":1786084509619,"results":"8712","hashOfConfig":"8231"},{"size":451,"mtime":1786084509619,"results":"8713","hashOfConfig":"8231"},{"size":5877,"mtime":1786084509620,"results":"8714","hashOfConfig":"8231"},{"size":1981,"mtime":1786084509620,"results":"8715","hashOfConfig":"8231"},{"size":5014,"mtime":1786084509620,"results":"8716","hashOfConfig":"8231"},{"size":7217,"mtime":1786084509620,"results":"8717","hashOfConfig":"8231"},{"size":3632,"mtime":1786084509620,"results":"8718","hashOfConfig":"8231"},{"size":2104,"mtime":1786084509620,"results":"8719","hashOfConfig":"8231"},{"size":5941,"mtime":1786084509621,"results":"8720","hashOfConfig":"8231"},{"size":9235,"mtime":1786084509621,"results":"8721","hashOfConfig":"8231"},{"size":3456,"mtime":1786084509621,"results":"8722","hashOfConfig":"8231"},{"size":2315,"mtime":1786084509621,"results":"8723","hashOfConfig":"8231"},{"size":1566,"mtime":1786084509622,"results":"8724","hashOfConfig":"8231"},{"size":1811,"mtime":1786084509622,"results":"8725","hashOfConfig":"8231"},{"size":1486,"mtime":1786084509622,"results":"8726","hashOfConfig":"8231"},{"size":4586,"mtime":1786084509622,"results":"8727","hashOfConfig":"8231"},{"size":2367,"mtime":1786084509622,"results":"8728","hashOfConfig":"8231"},{"size":8894,"mtime":1786084509622,"results":"8729","hashOfConfig":"8231"},{"size":2068,"mtime":1786084509623,"results":"8730","hashOfConfig":"8231"},{"size":3596,"mtime":1786084509623,"results":"8731","hashOfConfig":"8231"},{"size":2617,"mtime":1786084509623,"results":"8732","hashOfConfig":"8231"},{"size":2877,"mtime":1786084509623,"results":"8733","hashOfConfig":"8231"},{"size":929,"mtime":1786084509623,"results":"8734","hashOfConfig":"8231"},{"size":1102,"mtime":1786084509624,"results":"8735","hashOfConfig":"8231"},{"size":1788,"mtime":1786084509624,"results":"8736","hashOfConfig":"8231"},{"size":1230,"mtime":1786084509624,"results":"8737","hashOfConfig":"8231"},{"size":1438,"mtime":1786084509624,"results":"8738","hashOfConfig":"8231"},{"size":5192,"mtime":1786084509624,"results":"8739","hashOfConfig":"8231"},{"size":2047,"mtime":1786084509624,"results":"8740","hashOfConfig":"8231"},{"size":1663,"mtime":1786084509625,"results":"8741","hashOfConfig":"8231"},{"size":3399,"mtime":1786084509625,"results":"8742","hashOfConfig":"8231"},{"size":3121,"mtime":1786084509625,"results":"8743","hashOfConfig":"8231"},{"size":2492,"mtime":1786084509625,"results":"8744","hashOfConfig":"8231"},{"size":3016,"mtime":1786084509625,"results":"8745","hashOfConfig":"8231"},{"size":2678,"mtime":1786084509626,"results":"8746","hashOfConfig":"8231"},{"size":1427,"mtime":1786084509626,"results":"8747","hashOfConfig":"8231"},{"size":2285,"mtime":1786084509626,"results":"8748","hashOfConfig":"8231"},{"size":5728,"mtime":1786084509626,"results":"8749","hashOfConfig":"8231"},{"size":3584,"mtime":1786084509626,"results":"8750","hashOfConfig":"8231"},{"size":6648,"mtime":1786084509626,"results":"8751","hashOfConfig":"8231"},{"size":215136,"mtime":1786084509613,"results":"8752","hashOfConfig":"8231"},{"size":6618,"mtime":1786084509627,"results":"8753","hashOfConfig":"8231"},{"size":17607,"mtime":1786084509627,"results":"8754","hashOfConfig":"8231"},{"size":2924,"mtime":1786084509629,"results":"8755","hashOfConfig":"8231"},{"size":5806,"mtime":1786084509630,"results":"8756","hashOfConfig":"8231"},{"size":5793,"mtime":1786084509630,"results":"8757","hashOfConfig":"8231"},{"size":6197,"mtime":1786084509630,"results":"8758","hashOfConfig":"8231"},{"size":3552,"mtime":1786084509630,"results":"8759","hashOfConfig":"8231"},{"size":10435,"mtime":1786084509630,"results":"8760","hashOfConfig":"8231"},{"size":8604,"mtime":1786084509631,"results":"8761","hashOfConfig":"8231"},{"size":5028,"mtime":1786084509631,"results":"8762","hashOfConfig":"8231"},{"size":4042,"mtime":1786084509631,"results":"8763","hashOfConfig":"8231"},{"size":2693,"mtime":1786084509631,"results":"8764","hashOfConfig":"8231"},{"size":2891,"mtime":1786084509631,"results":"8765","hashOfConfig":"8231"},{"size":3091,"mtime":1786084509631,"results":"8766","hashOfConfig":"8231"},{"size":3870,"mtime":1786084509632,"results":"8767","hashOfConfig":"8231"},{"size":4626,"mtime":1786084509632,"results":"8768","hashOfConfig":"8231"},{"size":6195,"mtime":1786084509632,"results":"8769","hashOfConfig":"8231"},{"size":10501,"mtime":1786084509632,"results":"8770","hashOfConfig":"8231"},{"size":2923,"mtime":1786084509632,"results":"8771","hashOfConfig":"8231"},{"size":2584,"mtime":1786084509632,"results":"8772","hashOfConfig":"8231"},{"size":93442,"mtime":1786084509629,"results":"8773","hashOfConfig":"8231"},{"size":5363,"mtime":1786084509633,"results":"8774","hashOfConfig":"8231"},{"size":13149,"mtime":1786084509633,"results":"8775","hashOfConfig":"8231"},{"size":10863,"mtime":1786084509633,"results":"8776","hashOfConfig":"8231"},{"size":9088,"mtime":1786084509633,"results":"8777","hashOfConfig":"8231"},{"size":3396,"mtime":1786084509632,"results":"8778","hashOfConfig":"8231"},{"size":2483,"mtime":1786084509634,"results":"8779","hashOfConfig":"8231"},{"size":19797,"mtime":1786084509634,"results":"8780","hashOfConfig":"8231"},{"size":2362,"mtime":1786084509634,"results":"8781","hashOfConfig":"8231"},{"size":4017,"mtime":1786084509634,"results":"8782","hashOfConfig":"8231"},{"size":11796,"mtime":1786084509635,"results":"8783","hashOfConfig":"8231"},{"size":5498,"mtime":1786084509636,"results":"8784","hashOfConfig":"8231"},{"size":37888,"mtime":1786084509635,"results":"8785","hashOfConfig":"8231"},{"size":31375,"mtime":1786084509636,"results":"8786","hashOfConfig":"8231"},{"size":3673,"mtime":1786084509636,"results":"8787","hashOfConfig":"8231"},{"size":4684,"mtime":1786084509637,"results":"8788","hashOfConfig":"8231"},{"size":3444,"mtime":1786084509637,"results":"8789","hashOfConfig":"8231"},{"size":46690,"mtime":1786084509637,"results":"8790","hashOfConfig":"8231"},{"size":7246,"mtime":1786084509638,"results":"8791","hashOfConfig":"8231"},{"size":27986,"mtime":1786084509638,"results":"8792","hashOfConfig":"8231"},{"size":4640,"mtime":1786084509638,"results":"8793","hashOfConfig":"8231"},{"size":5153,"mtime":1786084509639,"results":"8794","hashOfConfig":"8231"},{"size":18714,"mtime":1786084509639,"results":"8795","hashOfConfig":"8231"},{"size":6224,"mtime":1786084509639,"results":"8796","hashOfConfig":"8231"},{"size":8819,"mtime":1786084509639,"results":"8797","hashOfConfig":"8231"},{"size":5057,"mtime":1786084509639,"results":"8798","hashOfConfig":"8231"},{"size":3604,"mtime":1786084509640,"results":"8799","hashOfConfig":"8231"},{"size":5118,"mtime":1786084509640,"results":"8800","hashOfConfig":"8231"},{"size":5318,"mtime":1786084509640,"results":"8801","hashOfConfig":"8231"},{"size":1899,"mtime":1786084509640,"results":"8802","hashOfConfig":"8231"},{"size":7259,"mtime":1786084509640,"results":"8803","hashOfConfig":"8231"},{"size":32051,"mtime":1786084509639,"results":"8804","hashOfConfig":"8231"},{"size":3687,"mtime":1786084509640,"results":"8805","hashOfConfig":"8231"},{"size":3945,"mtime":1786084509641,"results":"8806","hashOfConfig":"8231"},{"size":5417,"mtime":1786084509641,"results":"8807","hashOfConfig":"8808"},{"size":5865,"mtime":1786084509641,"results":"8809","hashOfConfig":"8231"},{"size":2768,"mtime":1786084509642,"results":"8810","hashOfConfig":"8231"},{"size":5633,"mtime":1786084509642,"results":"8811","hashOfConfig":"8231"},{"size":5246,"mtime":1786084509643,"results":"8812","hashOfConfig":"8231"},{"size":2208,"mtime":1786084509643,"results":"8813","hashOfConfig":"8231"},{"size":6475,"mtime":1786084509643,"results":"8814","hashOfConfig":"8231"},{"size":2732,"mtime":1786084509643,"results":"8815","hashOfConfig":"8231"},{"size":9676,"mtime":1786084509643,"results":"8816","hashOfConfig":"8231"},{"size":7513,"mtime":1786084509643,"results":"8817","hashOfConfig":"8231"},{"size":6080,"mtime":1786084509643,"results":"8818","hashOfConfig":"8231"},{"size":1913,"mtime":1786084509643,"results":"8819","hashOfConfig":"8231"},{"size":1930,"mtime":1786084509644,"results":"8820","hashOfConfig":"8231"},{"size":1002,"mtime":1786084509644,"results":"8821","hashOfConfig":"8231"},{"size":1100,"mtime":1786084509644,"results":"8822","hashOfConfig":"8231"},{"size":1042,"mtime":1786084509644,"results":"8823","hashOfConfig":"8231"},{"size":1490,"mtime":1786084509644,"results":"8824","hashOfConfig":"8231"},{"size":15032,"mtime":1786084509644,"results":"8825","hashOfConfig":"8231"},{"size":9508,"mtime":1786084509644,"results":"8826","hashOfConfig":"8231"},{"size":8631,"mtime":1786084509645,"results":"8827","hashOfConfig":"8231"},{"size":3195,"mtime":1786084509645,"results":"8828","hashOfConfig":"8231"},{"size":11018,"mtime":1786084509645,"results":"8829","hashOfConfig":"8231"},{"size":517,"mtime":1786084509645,"results":"8830","hashOfConfig":"8231"},{"size":4223,"mtime":1786084509645,"results":"8831","hashOfConfig":"8231"},{"size":4708,"mtime":1786084509645,"results":"8832","hashOfConfig":"8231"},{"size":5629,"mtime":1786084509645,"results":"8833","hashOfConfig":"8231"},{"size":3723,"mtime":1786084509646,"results":"8834","hashOfConfig":"8231"},{"size":6676,"mtime":1786084509646,"results":"8835","hashOfConfig":"8231"},{"size":2812,"mtime":1786084509646,"results":"8836","hashOfConfig":"8231"},{"size":3152,"mtime":1786084509646,"results":"8837","hashOfConfig":"8231"},{"size":1082,"mtime":1786084509646,"results":"8838","hashOfConfig":"8231"},{"size":1156,"mtime":1786084509646,"results":"8839","hashOfConfig":"8231"},{"size":47899,"mtime":1786084509647,"results":"8840","hashOfConfig":"8231"},{"size":3636,"mtime":1786084509647,"results":"8841","hashOfConfig":"8231"},{"size":51370,"mtime":1786084509648,"results":"8842","hashOfConfig":"8231"},{"size":9272,"mtime":1786084509648,"results":"8843","hashOfConfig":"8231"},{"size":1526,"mtime":1786084509648,"results":"8844","hashOfConfig":"8231"},{"size":3257,"mtime":1786084509648,"results":"8845","hashOfConfig":"8231"},{"size":629,"mtime":1786084509648,"results":"8846","hashOfConfig":"8231"},{"size":262,"mtime":1786084509648,"results":"8847","hashOfConfig":"8231"},{"size":1238,"mtime":1786084509648,"results":"8848","hashOfConfig":"8231"},{"size":2466,"mtime":1786084509649,"results":"8849","hashOfConfig":"8231"},{"size":3254,"mtime":1786084509649,"results":"8850","hashOfConfig":"8231"},{"size":39656,"mtime":1786084509650,"results":"8851","hashOfConfig":"8231"},{"size":3272,"mtime":1786084509650,"results":"8852","hashOfConfig":"8231"},{"size":23303,"mtime":1786084509650,"results":"8853","hashOfConfig":"8231"},{"size":5044,"mtime":1786084509651,"results":"8854","hashOfConfig":"8231"},{"size":5124,"mtime":1786084509651,"results":"8855","hashOfConfig":"8231"},{"size":2263,"mtime":1786084509651,"results":"8856","hashOfConfig":"8231"},{"size":4261,"mtime":1786084509651,"results":"8857","hashOfConfig":"8231"},{"size":4428,"mtime":1786084509652,"results":"8858","hashOfConfig":"8231"},{"size":15052,"mtime":1786084509652,"results":"8859","hashOfConfig":"8231"},{"size":12131,"mtime":1786084509652,"results":"8860","hashOfConfig":"8231"},{"size":7273,"mtime":1786084509652,"results":"8861","hashOfConfig":"8231"},{"size":7422,"mtime":1786084509653,"results":"8862","hashOfConfig":"8231"},{"size":3689,"mtime":1786084509653,"results":"8863","hashOfConfig":"8231"},{"size":4967,"mtime":1786084509654,"results":"8864","hashOfConfig":"8231"},{"size":3523,"mtime":1786084509654,"results":"8865","hashOfConfig":"8231"},{"size":10095,"mtime":1786084509654,"results":"8866","hashOfConfig":"8231"},{"size":1242,"mtime":1786084509654,"results":"8867","hashOfConfig":"8231"},{"size":3098,"mtime":1786084509654,"results":"8868","hashOfConfig":"8231"},{"size":4635,"mtime":1786084509654,"results":"8869","hashOfConfig":"8231"},{"size":8836,"mtime":1786084509655,"results":"8870","hashOfConfig":"8231"},{"size":11489,"mtime":1786084509655,"results":"8871","hashOfConfig":"8231"},{"size":4577,"mtime":1786084509655,"results":"8872","hashOfConfig":"8231"},{"size":1230,"mtime":1786084509656,"results":"8873","hashOfConfig":"8231"},{"size":5728,"mtime":1786084509656,"results":"8874","hashOfConfig":"8231"},{"size":2321,"mtime":1786084509657,"results":"8875","hashOfConfig":"8231"},{"size":3677,"mtime":1786084509657,"results":"8876","hashOfConfig":"8231"},{"size":77415,"mtime":1786084509656,"results":"8877","hashOfConfig":"8231"},{"size":2338,"mtime":1786084509657,"results":"8878","hashOfConfig":"8231"},{"size":10430,"mtime":1786086911035,"results":"8879","hashOfConfig":"8231"},{"size":5640,"mtime":1786084509657,"results":"8880","hashOfConfig":"8231"},{"size":5258,"mtime":1786084509657,"results":"8881","hashOfConfig":"8231"},{"size":20940,"mtime":1786084509658,"results":"8882","hashOfConfig":"8231"},{"size":3506,"mtime":1786084509658,"results":"8883","hashOfConfig":"8231"},{"size":926,"mtime":1786084509658,"results":"8884","hashOfConfig":"8231"},{"size":5860,"mtime":1786084509658,"results":"8885","hashOfConfig":"8231"},{"size":5794,"mtime":1786084509658,"results":"8886","hashOfConfig":"8231"},{"size":19423,"mtime":1786084509658,"results":"8887","hashOfConfig":"8231"},{"size":4798,"mtime":1786084509658,"results":"8888","hashOfConfig":"8231"},{"size":16686,"mtime":1786084509658,"results":"8889","hashOfConfig":"8231"},{"size":85140,"mtime":1786084509660,"results":"8890","hashOfConfig":"8231"},{"size":9422,"mtime":1786084509660,"results":"8891","hashOfConfig":"8231"},{"size":15071,"mtime":1786084509660,"results":"8892","hashOfConfig":"8231"},{"size":6340,"mtime":1786084509660,"results":"8893","hashOfConfig":"8231"},{"size":5543,"mtime":1786084509660,"results":"8894","hashOfConfig":"8231"},{"size":3038,"mtime":1786084509661,"results":"8895","hashOfConfig":"8231"},{"size":2375,"mtime":1786084509661,"results":"8896","hashOfConfig":"8231"},{"size":2361,"mtime":1786084509661,"results":"8897","hashOfConfig":"8231"},{"size":2715,"mtime":1786084509661,"results":"8898","hashOfConfig":"8231"},{"size":2670,"mtime":1786084509661,"results":"8899","hashOfConfig":"8231"},{"size":10031,"mtime":1786084509661,"results":"8900","hashOfConfig":"8231"},{"size":3310,"mtime":1786085706846,"results":"8901","hashOfConfig":"8231"},{"size":1904,"mtime":1786084509661,"results":"8902","hashOfConfig":"8231"},{"size":5409,"mtime":1786084509662,"results":"8903","hashOfConfig":"8231"},{"size":13120,"mtime":1786084509662,"results":"8904","hashOfConfig":"8231"},{"size":22984,"mtime":1786084509663,"results":"8905","hashOfConfig":"8231"},{"size":7051,"mtime":1786084509663,"results":"8906","hashOfConfig":"8231"},{"size":2088,"mtime":1786084509663,"results":"8907","hashOfConfig":"8231"},{"size":3855,"mtime":1786084509663,"results":"8908","hashOfConfig":"8231"},{"size":8010,"mtime":1786084509663,"results":"8909","hashOfConfig":"8231"},{"size":2629,"mtime":1786084509663,"results":"8910","hashOfConfig":"8231"},{"size":1998,"mtime":1786084509663,"results":"8911","hashOfConfig":"8231"},{"size":5870,"mtime":1786084509663,"results":"8912","hashOfConfig":"8231"},{"size":1705,"mtime":1786084509663,"results":"8913","hashOfConfig":"8231"},{"size":17872,"mtime":1786084509664,"results":"8914","hashOfConfig":"8231"},{"size":4748,"mtime":1786084509664,"results":"8915","hashOfConfig":"8231"},{"size":12052,"mtime":1786084509664,"results":"8916","hashOfConfig":"8231"},{"size":695,"mtime":1786084509664,"results":"8917","hashOfConfig":"8231"},{"size":3563,"mtime":1786084509664,"results":"8918","hashOfConfig":"8231"},{"size":3942,"mtime":1786084509665,"results":"8919","hashOfConfig":"8231"},{"size":1814,"mtime":1786084509665,"results":"8920","hashOfConfig":"8231"},{"size":3176,"mtime":1786084509665,"results":"8921","hashOfConfig":"8231"},{"size":16330,"mtime":1786084509665,"results":"8922","hashOfConfig":"8231"},{"size":4982,"mtime":1786084509665,"results":"8923","hashOfConfig":"8231"},{"size":296,"mtime":1786084509665,"results":"8924","hashOfConfig":"8231"},{"size":5460,"mtime":1786084509665,"results":"8925","hashOfConfig":"8231"},{"size":3418,"mtime":1786084509665,"results":"8926","hashOfConfig":"8231"},{"size":14366,"mtime":1786084509666,"results":"8927","hashOfConfig":"8231"},{"size":10385,"mtime":1786084509666,"results":"8928","hashOfConfig":"8231"},{"size":4795,"mtime":1786084509666,"results":"8929","hashOfConfig":"8231"},{"size":13121,"mtime":1786084509666,"results":"8930","hashOfConfig":"8231"},{"size":5118,"mtime":1786084509666,"results":"8931","hashOfConfig":"8231"},{"size":14543,"mtime":1786084509666,"results":"8932","hashOfConfig":"8231"},{"size":28553,"mtime":1786084509667,"results":"8933","hashOfConfig":"8231"},{"size":6545,"mtime":1786084509667,"results":"8934","hashOfConfig":"8231"},{"size":8930,"mtime":1786084509667,"results":"8935","hashOfConfig":"8231"},{"size":11850,"mtime":1786084509667,"results":"8936","hashOfConfig":"8231"},{"size":28085,"mtime":1786084509668,"results":"8937","hashOfConfig":"8231"},{"size":4773,"mtime":1786084509668,"results":"8938","hashOfConfig":"8231"},{"size":27174,"mtime":1786084509668,"results":"8939","hashOfConfig":"8231"},{"size":15884,"mtime":1786084509668,"results":"8940","hashOfConfig":"8231"},{"size":22412,"mtime":1786084509669,"results":"8941","hashOfConfig":"8231"},{"size":3704,"mtime":1786084509669,"results":"8942","hashOfConfig":"8231"},{"size":1211,"mtime":1786084509669,"results":"8943","hashOfConfig":"8231"},{"size":4900,"mtime":1786084509669,"results":"8944","hashOfConfig":"8231"},{"size":23044,"mtime":1786084509669,"results":"8945","hashOfConfig":"8231"},{"size":3970,"mtime":1786084509669,"results":"8946","hashOfConfig":"8231"},{"size":1531,"mtime":1786084509670,"results":"8947","hashOfConfig":"8231"},{"size":38600,"mtime":1786084509670,"results":"8948","hashOfConfig":"8231"},{"size":710,"mtime":1786084509670,"results":"8949","hashOfConfig":"8231"},{"size":978,"mtime":1786084509671,"results":"8950","hashOfConfig":"8231"},{"size":5093,"mtime":1786084509671,"results":"8951","hashOfConfig":"8231"},{"size":684,"mtime":1786084509671,"results":"8952","hashOfConfig":"8231"},{"size":1483,"mtime":1786084509671,"results":"8953","hashOfConfig":"8231"},{"size":4196,"mtime":1786084509671,"results":"8954","hashOfConfig":"8231"},{"size":14510,"mtime":1786084509671,"results":"8955","hashOfConfig":"8231"},{"size":3694,"mtime":1786084509672,"results":"8956","hashOfConfig":"8231"},{"size":23271,"mtime":1786084509672,"results":"8957","hashOfConfig":"8231"},{"size":5521,"mtime":1786084509672,"results":"8958","hashOfConfig":"8231"},{"size":1891,"mtime":1786084509672,"results":"8959","hashOfConfig":"8231"},{"size":6119,"mtime":1786084509672,"results":"8960","hashOfConfig":"8231"},{"size":5110,"mtime":1786084509672,"results":"8961","hashOfConfig":"8231"},{"size":1072,"mtime":1786084509672,"results":"8962","hashOfConfig":"8231"},{"size":2187,"mtime":1786084509672,"results":"8963","hashOfConfig":"8231"},{"size":2753,"mtime":1786084509673,"results":"8964","hashOfConfig":"8231"},{"size":20018,"mtime":1786084509673,"results":"8965","hashOfConfig":"8231"},{"size":13873,"mtime":1786084509673,"results":"8966","hashOfConfig":"8231"},{"size":2208,"mtime":1786084509673,"results":"8967","hashOfConfig":"8231"},{"size":10281,"mtime":1786084509675,"results":"8968","hashOfConfig":"8231"},{"size":3149,"mtime":1786084509675,"results":"8969","hashOfConfig":"8231"},{"size":21313,"mtime":1786084509675,"results":"8970","hashOfConfig":"8231"},{"size":3232,"mtime":1786084509675,"results":"8971","hashOfConfig":"8231"},{"size":9989,"mtime":1786084509675,"results":"8972","hashOfConfig":"8231"},{"size":948,"mtime":1786084509675,"results":"8973","hashOfConfig":"8231"},{"size":21180,"mtime":1786084509676,"results":"8974","hashOfConfig":"8231"},{"size":5639,"mtime":1786084509676,"results":"8975","hashOfConfig":"8231"},{"size":32164,"mtime":1786087572594,"results":"8976","hashOfConfig":"8231"},{"size":891,"mtime":1786084509676,"results":"8977","hashOfConfig":"8231"},{"size":3349,"mtime":1786084509676,"results":"8978","hashOfConfig":"8231"},{"size":2032,"mtime":1786084509676,"results":"8979","hashOfConfig":"8231"},{"size":4254,"mtime":1786084509676,"results":"8980","hashOfConfig":"8231"},{"size":5691,"mtime":1786084509677,"results":"8981","hashOfConfig":"8231"},{"size":24819,"mtime":1786084509677,"results":"8982","hashOfConfig":"8231"},{"size":6238,"mtime":1786084509677,"results":"8983","hashOfConfig":"8231"},{"size":5532,"mtime":1786084509677,"results":"8984","hashOfConfig":"8231"},{"size":3123,"mtime":1786087599987,"results":"8985","hashOfConfig":"8231"},{"size":3594,"mtime":1786084509677,"results":"8986","hashOfConfig":"8231"},{"size":4000,"mtime":1786084509678,"results":"8987","hashOfConfig":"8231"},{"size":4691,"mtime":1786084509678,"results":"8988","hashOfConfig":"8231"},{"size":10860,"mtime":1786084509678,"results":"8989","hashOfConfig":"8231"},{"size":8174,"mtime":1786084509678,"results":"8990","hashOfConfig":"8231"},{"size":5824,"mtime":1786084509678,"results":"8991","hashOfConfig":"8231"},{"size":12074,"mtime":1786084509679,"results":"8992","hashOfConfig":"8231"},{"size":3264,"mtime":1786084509679,"results":"8993","hashOfConfig":"8231"},{"size":5288,"mtime":1786084509679,"results":"8994","hashOfConfig":"8231"},{"size":14323,"mtime":1786084509679,"results":"8995","hashOfConfig":"8231"},{"size":23802,"mtime":1786085206209,"results":"8996","hashOfConfig":"8231"},{"size":17245,"mtime":1786084509680,"results":"8997","hashOfConfig":"8231"},{"size":6803,"mtime":1786084509680,"results":"8998","hashOfConfig":"8231"},{"size":4305,"mtime":1786084509680,"results":"8999","hashOfConfig":"8231"},{"size":2872,"mtime":1786084509680,"results":"9000","hashOfConfig":"8231"},{"size":9985,"mtime":1786084509680,"results":"9001","hashOfConfig":"8231"},{"size":21140,"mtime":1786084509681,"results":"9002","hashOfConfig":"8231"},{"size":6465,"mtime":1786084509681,"results":"9003","hashOfConfig":"8231"},{"size":2887,"mtime":1786084509681,"results":"9004","hashOfConfig":"8231"},{"size":10701,"mtime":1786084509681,"results":"9005","hashOfConfig":"8231"},{"size":29791,"mtime":1786084509681,"results":"9006","hashOfConfig":"8231"},{"size":6366,"mtime":1786084509682,"results":"9007","hashOfConfig":"8231"},{"size":4212,"mtime":1786084509682,"results":"9008","hashOfConfig":"8231"},{"size":6843,"mtime":1786084509682,"results":"9009","hashOfConfig":"8231"},{"size":1789,"mtime":1786084509682,"results":"9010","hashOfConfig":"8231"},{"size":32462,"mtime":1786084509682,"results":"9011","hashOfConfig":"8231"},{"size":128674,"mtime":1786084509674,"results":"9012","hashOfConfig":"8231"},{"size":9548,"mtime":1786084509682,"results":"9013","hashOfConfig":"8231"},{"size":13550,"mtime":1786084509682,"results":"9014","hashOfConfig":"8231"},{"size":343,"mtime":1786084509683,"results":"9015","hashOfConfig":"8231"},{"size":14361,"mtime":1786084509683,"results":"9016","hashOfConfig":"8231"},{"size":1363,"mtime":1786084509683,"results":"9017","hashOfConfig":"8231"},{"size":4588,"mtime":1786084509683,"results":"9018","hashOfConfig":"8231"},{"size":4250,"mtime":1786084509683,"results":"9019","hashOfConfig":"8231"},{"size":2356,"mtime":1786084509684,"results":"9020","hashOfConfig":"8231"},{"size":7232,"mtime":1786084509684,"results":"9021","hashOfConfig":"8231"},{"size":21480,"mtime":1786084509684,"results":"9022","hashOfConfig":"8231"},{"size":2754,"mtime":1786084509684,"results":"9023","hashOfConfig":"8231"},{"size":4591,"mtime":1786084509684,"results":"9024","hashOfConfig":"8231"},{"size":19186,"mtime":1786084509684,"results":"9025","hashOfConfig":"8231"},{"size":13588,"mtime":1786084509685,"results":"9026","hashOfConfig":"8231"},{"size":2006,"mtime":1786084509685,"results":"9027","hashOfConfig":"8231"},{"size":6626,"mtime":1786084509685,"results":"9028","hashOfConfig":"8231"},{"size":3052,"mtime":1786084509685,"results":"9029","hashOfConfig":"8231"},{"size":7398,"mtime":1786084509685,"results":"9030","hashOfConfig":"8231"},{"size":13922,"mtime":1786084509685,"results":"9031","hashOfConfig":"8231"},{"size":3622,"mtime":1786084509685,"results":"9032","hashOfConfig":"8231"},{"size":37044,"mtime":1786087989002,"results":"9033","hashOfConfig":"8231"},{"size":4242,"mtime":1786084509686,"results":"9034","hashOfConfig":"8231"},{"size":11344,"mtime":1786084509686,"results":"9035","hashOfConfig":"8231"},{"size":2400,"mtime":1786084509687,"results":"9036","hashOfConfig":"8231"},{"size":28807,"mtime":1786084509687,"results":"9037","hashOfConfig":"8231"},{"size":21162,"mtime":1786084509687,"results":"9038","hashOfConfig":"8231"},{"size":419,"mtime":1786084509687,"results":"9039","hashOfConfig":"8231"},{"size":9599,"mtime":1786084509687,"results":"9040","hashOfConfig":"8231"},{"size":10208,"mtime":1786084509688,"results":"9041","hashOfConfig":"8231"},{"size":9008,"mtime":1786084509688,"results":"9042","hashOfConfig":"8231"},{"size":8502,"mtime":1786084509688,"results":"9043","hashOfConfig":"8231"},{"size":1517,"mtime":1786084509688,"results":"9044","hashOfConfig":"8231"},{"size":2171,"mtime":1786084509688,"results":"9045","hashOfConfig":"8231"},{"size":3957,"mtime":1786084509689,"results":"9046","hashOfConfig":"8231"},{"size":6910,"mtime":1786084509689,"results":"9047","hashOfConfig":"8231"},{"size":12821,"mtime":1786084509689,"results":"9048","hashOfConfig":"8231"},{"size":1766,"mtime":1786084509689,"results":"9049","hashOfConfig":"8231"},{"size":17998,"mtime":1786084509690,"results":"9050","hashOfConfig":"8231"},{"size":2510,"mtime":1786084509690,"results":"9051","hashOfConfig":"8231"},{"size":4736,"mtime":1786084509690,"results":"9052","hashOfConfig":"8231"},{"size":4588,"mtime":1786084509690,"results":"9053","hashOfConfig":"8231"},{"size":13206,"mtime":1786084509690,"results":"9054","hashOfConfig":"8231"},{"size":3615,"mtime":1786084509690,"results":"9055","hashOfConfig":"8231"},{"size":2689,"mtime":1786084509691,"results":"9056","hashOfConfig":"8231"},{"size":2415,"mtime":1786084509691,"results":"9057","hashOfConfig":"8231"},{"size":4875,"mtime":1786084509691,"results":"9058","hashOfConfig":"8231"},{"size":1051,"mtime":1786084509691,"results":"9059","hashOfConfig":"8231"},{"size":10697,"mtime":1786084509691,"results":"9060","hashOfConfig":"8231"},{"size":2529,"mtime":1786084509691,"results":"9061","hashOfConfig":"8231"},{"size":2057,"mtime":1786084509691,"results":"9062","hashOfConfig":"8231"},{"size":7174,"mtime":1786084509692,"results":"9063","hashOfConfig":"8231"},{"size":2060,"mtime":1786084509692,"results":"9064","hashOfConfig":"8231"},{"size":7348,"mtime":1786084509692,"results":"9065","hashOfConfig":"8231"},{"size":13045,"mtime":1786084509692,"results":"9066","hashOfConfig":"8231"},{"size":3437,"mtime":1786084509692,"results":"9067","hashOfConfig":"8231"},{"size":944,"mtime":1786084509692,"results":"9068","hashOfConfig":"8231"},{"size":6344,"mtime":1786084509692,"results":"9069","hashOfConfig":"8231"},{"size":11031,"mtime":1786084509693,"results":"9070","hashOfConfig":"8231"},{"size":7423,"mtime":1786084509693,"results":"9071","hashOfConfig":"8231"},{"size":3374,"mtime":1786084509697,"results":"9072","hashOfConfig":"8231"},{"size":27046,"mtime":1786084509698,"results":"9073","hashOfConfig":"8231"},{"size":10716,"mtime":1786084509698,"results":"9074","hashOfConfig":"8231"},{"size":7635,"mtime":1786084509698,"results":"9075","hashOfConfig":"8231"},{"size":7561,"mtime":1786084509698,"results":"9076","hashOfConfig":"8231"},{"size":1241,"mtime":1786084509698,"results":"9077","hashOfConfig":"8231"},{"size":2038,"mtime":1786084509699,"results":"9078","hashOfConfig":"8231"},{"size":3170,"mtime":1786084509699,"results":"9079","hashOfConfig":"8231"},{"size":1450,"mtime":1786084509699,"results":"9080","hashOfConfig":"8231"},{"size":2826,"mtime":1786084509699,"results":"9081","hashOfConfig":"8231"},{"size":501,"mtime":1786084509699,"results":"9082","hashOfConfig":"8231"},{"size":2429,"mtime":1786084509699,"results":"9083","hashOfConfig":"8231"},{"size":3069,"mtime":1786084509699,"results":"9084","hashOfConfig":"8231"},{"size":10467,"mtime":1786084509699,"results":"9085","hashOfConfig":"8231"},{"size":3137,"mtime":1786084509699,"results":"9086","hashOfConfig":"8231"},{"size":5240,"mtime":1786084509700,"results":"9087","hashOfConfig":"8231"},{"size":17336,"mtime":1786084509700,"results":"9088","hashOfConfig":"8231"},{"size":2880,"mtime":1786084509700,"results":"9089","hashOfConfig":"8231"},{"size":1406,"mtime":1786084509700,"results":"9090","hashOfConfig":"8231"},{"size":2234,"mtime":1786084509700,"results":"9091","hashOfConfig":"8231"},{"size":1863,"mtime":1786084509700,"results":"9092","hashOfConfig":"8231"},{"size":909,"mtime":1786084509700,"results":"9093","hashOfConfig":"8231"},{"size":2018,"mtime":1786084509700,"results":"9094","hashOfConfig":"8231"},{"size":1923,"mtime":1786084509700,"results":"9095","hashOfConfig":"8231"},{"size":1266,"mtime":1786084509700,"results":"9096","hashOfConfig":"8231"},{"size":3217,"mtime":1786084509701,"results":"9097","hashOfConfig":"8231"},{"size":1915,"mtime":1786084509701,"results":"9098","hashOfConfig":"8231"},{"size":5631,"mtime":1786084509701,"results":"9099","hashOfConfig":"8231"},{"size":1294,"mtime":1786084509701,"results":"9100","hashOfConfig":"8231"},{"size":2593,"mtime":1786084509701,"results":"9101","hashOfConfig":"8231"},{"size":2147,"mtime":1786084509701,"results":"9102","hashOfConfig":"8231"},{"size":2886,"mtime":1786084509701,"results":"9103","hashOfConfig":"8231"},{"size":3904,"mtime":1786084509701,"results":"9104","hashOfConfig":"8231"},{"size":1886,"mtime":1786084509701,"results":"9105","hashOfConfig":"8231"},{"size":7079,"mtime":1786084509702,"results":"9106","hashOfConfig":"8231"},{"size":12965,"mtime":1786084509702,"results":"9107","hashOfConfig":"8231"},{"size":2058,"mtime":1786084509702,"results":"9108","hashOfConfig":"8231"},{"size":1198,"mtime":1786084509702,"results":"9109","hashOfConfig":"8231"},{"size":3255,"mtime":1786084509703,"results":"9110","hashOfConfig":"8231"},{"size":2837,"mtime":1786084509703,"results":"9111","hashOfConfig":"8231"},{"size":1803,"mtime":1786084509703,"results":"9112","hashOfConfig":"8231"},{"size":4695,"mtime":1786084509703,"results":"9113","hashOfConfig":"8231"},{"size":2494,"mtime":1786084509703,"results":"9114","hashOfConfig":"8231"},{"size":8890,"mtime":1786084509703,"results":"9115","hashOfConfig":"8231"},{"size":12014,"mtime":1786084509704,"results":"9116","hashOfConfig":"8231"},{"size":2751,"mtime":1786084509704,"results":"9117","hashOfConfig":"8231"},{"size":8945,"mtime":1786084509704,"results":"9118","hashOfConfig":"8231"},{"size":5081,"mtime":1786084509704,"results":"9119","hashOfConfig":"8231"},{"size":983,"mtime":1786084509704,"results":"9120","hashOfConfig":"8231"},{"size":14190,"mtime":1786084509705,"results":"9121","hashOfConfig":"8231"},{"size":1658,"mtime":1786084509705,"results":"9122","hashOfConfig":"8231"},{"size":5131,"mtime":1786084509705,"results":"9123","hashOfConfig":"8231"},{"size":4548,"mtime":1786084509705,"results":"9124","hashOfConfig":"8231"},{"size":6239,"mtime":1786084509705,"results":"9125","hashOfConfig":"8231"},{"size":5043,"mtime":1786084509705,"results":"9126","hashOfConfig":"8231"},{"size":7682,"mtime":1786084509705,"results":"9127","hashOfConfig":"8231"},{"size":2864,"mtime":1786084509705,"results":"9128","hashOfConfig":"8231"},{"size":5342,"mtime":1786084509705,"results":"9129","hashOfConfig":"8231"},{"size":428,"mtime":1786084509706,"results":"9130","hashOfConfig":"8231"},{"size":2144,"mtime":1786084509706,"results":"9131","hashOfConfig":"8231"},{"size":2897,"mtime":1786084509706,"results":"9132","hashOfConfig":"8231"},{"size":2896,"mtime":1786084509706,"results":"9133","hashOfConfig":"8231"},{"size":2854,"mtime":1786084509706,"results":"9134","hashOfConfig":"8231"},{"size":1041,"mtime":1786084509706,"results":"9135","hashOfConfig":"8231"},{"size":4888,"mtime":1786084509706,"results":"9136","hashOfConfig":"8231"},{"size":251,"mtime":1786084509706,"results":"9137","hashOfConfig":"8231"},{"size":4938,"mtime":1786084509707,"results":"9138","hashOfConfig":"8231"},{"size":3815,"mtime":1786084509707,"results":"9139","hashOfConfig":"8231"},{"size":1951,"mtime":1786084509707,"results":"9140","hashOfConfig":"8231"},{"size":1646,"mtime":1786084509707,"results":"9141","hashOfConfig":"8231"},{"size":9209,"mtime":1786084509707,"results":"9142","hashOfConfig":"8231"},{"size":5084,"mtime":1786084509713,"results":"9143","hashOfConfig":"8231"},{"size":7408,"mtime":1786084509713,"results":"9144","hashOfConfig":"8231"},{"size":1097,"mtime":1786084509713,"results":"9145","hashOfConfig":"8231"},{"size":40624,"mtime":1786084509714,"results":"9146","hashOfConfig":"8231"},{"size":6690,"mtime":1786084509714,"results":"9147","hashOfConfig":"8231"},{"size":8830,"mtime":1786084509714,"results":"9148","hashOfConfig":"8231"},{"size":20687,"mtime":1786084509714,"results":"9149","hashOfConfig":"8231"},{"size":11986,"mtime":1786084509715,"results":"9150","hashOfConfig":"8231"},{"size":2960,"mtime":1786084509715,"results":"9151","hashOfConfig":"8231"},{"size":12102,"mtime":1786084509715,"results":"9152","hashOfConfig":"8231"},{"size":26030,"mtime":1786084509715,"results":"9153","hashOfConfig":"8231"},{"size":34190,"mtime":1786084509716,"results":"9154","hashOfConfig":"8231"},{"size":2483,"mtime":1786084509716,"results":"9155","hashOfConfig":"8231"},{"size":6353,"mtime":1786084509716,"results":"9156","hashOfConfig":"8231"},{"size":7362,"mtime":1786084509716,"results":"9157","hashOfConfig":"8231"},{"size":8132,"mtime":1786084509716,"results":"9158","hashOfConfig":"8231"},{"size":2284,"mtime":1786084509716,"results":"9159","hashOfConfig":"8231"},{"size":10144,"mtime":1786084509716,"results":"9160","hashOfConfig":"8231"},{"size":4957,"mtime":1786084509717,"results":"9161","hashOfConfig":"8231"},{"size":12053,"mtime":1786084509717,"results":"9162","hashOfConfig":"8231"},{"size":8510,"mtime":1786084509717,"results":"9163","hashOfConfig":"8231"},{"size":6154,"mtime":1786087910327,"results":"9164","hashOfConfig":"8231"},{"size":6457,"mtime":1786084509717,"results":"9165","hashOfConfig":"8231"},{"size":6334,"mtime":1786084509717,"results":"9166","hashOfConfig":"8231"},{"size":19193,"mtime":1786084509718,"results":"9167","hashOfConfig":"8231"},{"size":9521,"mtime":1786084509718,"results":"9168","hashOfConfig":"8231"},{"size":9530,"mtime":1786084509718,"results":"9169","hashOfConfig":"8231"},{"size":7867,"mtime":1786084509718,"results":"9170","hashOfConfig":"8231"},{"size":3369,"mtime":1786084509718,"results":"9171","hashOfConfig":"8231"},{"size":8832,"mtime":1786084509719,"results":"9172","hashOfConfig":"8231"},{"size":6605,"mtime":1786084509719,"results":"9173","hashOfConfig":"8231"},{"size":3260,"mtime":1786084509719,"results":"9174","hashOfConfig":"8231"},{"size":6938,"mtime":1786084509719,"results":"9175","hashOfConfig":"8231"},{"size":11167,"mtime":1786084509719,"results":"9176","hashOfConfig":"8231"},{"size":17420,"mtime":1786084509719,"results":"9177","hashOfConfig":"8231"},{"size":21268,"mtime":1786084509720,"results":"9178","hashOfConfig":"8231"},{"size":2269,"mtime":1786084509720,"results":"9179","hashOfConfig":"8231"},{"size":1174,"mtime":1786084509720,"results":"9180","hashOfConfig":"8231"},{"size":5863,"mtime":1786084509720,"results":"9181","hashOfConfig":"8231"},{"size":9519,"mtime":1786084509720,"results":"9182","hashOfConfig":"8231"},{"size":11784,"mtime":1786084509720,"results":"9183","hashOfConfig":"8231"},{"size":10257,"mtime":1786084509721,"results":"9184","hashOfConfig":"8231"},{"size":2668,"mtime":1786084509721,"results":"9185","hashOfConfig":"8231"},{"size":7333,"mtime":1786084509721,"results":"9186","hashOfConfig":"8231"},{"size":13959,"mtime":1786084509721,"results":"9187","hashOfConfig":"8231"},{"size":9332,"mtime":1786084509721,"results":"9188","hashOfConfig":"8231"},{"size":4921,"mtime":1786084509721,"results":"9189","hashOfConfig":"8231"},{"size":20597,"mtime":1786084509722,"results":"9190","hashOfConfig":"8231"},{"size":4265,"mtime":1786084509722,"results":"9191","hashOfConfig":"8231"},{"size":2899,"mtime":1786084509722,"results":"9192","hashOfConfig":"8231"},{"size":34592,"mtime":1786084509722,"results":"9193","hashOfConfig":"8231"},{"size":130,"mtime":1786084509722,"results":"9194","hashOfConfig":"8231"},{"size":6000,"mtime":1786084509723,"results":"9195","hashOfConfig":"8231"},{"size":10198,"mtime":1786084509723,"results":"9196","hashOfConfig":"8231"},{"size":1905,"mtime":1786084509723,"results":"9197","hashOfConfig":"8231"},{"size":3326,"mtime":1786084509723,"results":"9198","hashOfConfig":"8231"},{"size":7253,"mtime":1786084509723,"results":"9199","hashOfConfig":"8231"},{"size":11033,"mtime":1786084509723,"results":"9200","hashOfConfig":"8231"},{"size":19058,"mtime":1786084509724,"results":"9201","hashOfConfig":"8231"},{"size":21503,"mtime":1786084509724,"results":"9202","hashOfConfig":"8231"},{"size":6870,"mtime":1786084509724,"results":"9203","hashOfConfig":"8231"},{"size":4088,"mtime":1786084509724,"results":"9204","hashOfConfig":"8231"},{"size":27493,"mtime":1786084509724,"results":"9205","hashOfConfig":"8231"},{"size":21416,"mtime":1786084509725,"results":"9206","hashOfConfig":"8231"},{"size":13667,"mtime":1786084509725,"results":"9207","hashOfConfig":"8231"},{"size":1933,"mtime":1786084509725,"results":"9208","hashOfConfig":"8231"},{"size":8913,"mtime":1786084509725,"results":"9209","hashOfConfig":"8231"},{"size":12999,"mtime":1786084509725,"results":"9210","hashOfConfig":"8231"},{"size":14979,"mtime":1786084509726,"results":"9211","hashOfConfig":"8231"},{"size":21487,"mtime":1786084509726,"results":"9212","hashOfConfig":"8231"},{"size":10736,"mtime":1786084509726,"results":"9213","hashOfConfig":"8231"},{"size":6506,"mtime":1786084509726,"results":"9214","hashOfConfig":"8231"},{"size":6049,"mtime":1786084509726,"results":"9215","hashOfConfig":"8231"},{"size":17665,"mtime":1786084509727,"results":"9216","hashOfConfig":"8231"},{"size":6356,"mtime":1786084509727,"results":"9217","hashOfConfig":"8231"},{"size":2561,"mtime":1786084509727,"results":"9218","hashOfConfig":"8231"},{"size":6339,"mtime":1786084509727,"results":"9219","hashOfConfig":"8231"},{"size":2705,"mtime":1786084509727,"results":"9220","hashOfConfig":"8231"},{"size":2037,"mtime":1786084509727,"results":"9221","hashOfConfig":"8231"},{"size":33010,"mtime":1786084509728,"results":"9222","hashOfConfig":"8231"},{"size":4819,"mtime":1786084509728,"results":"9223","hashOfConfig":"8231"},{"size":4258,"mtime":1786084509728,"results":"9224","hashOfConfig":"8231"},{"size":12912,"mtime":1786084509728,"results":"9225","hashOfConfig":"8231"},{"size":13597,"mtime":1786084509728,"results":"9226","hashOfConfig":"8231"},{"size":2136,"mtime":1786084509729,"results":"9227","hashOfConfig":"8231"},{"size":6537,"mtime":1786084509729,"results":"9228","hashOfConfig":"8231"},{"size":1361,"mtime":1786084509729,"results":"9229","hashOfConfig":"8231"},{"size":1133,"mtime":1786084509729,"results":"9230","hashOfConfig":"8231"},{"size":2167,"mtime":1786084509730,"results":"9231","hashOfConfig":"8231"},{"size":2872,"mtime":1786084509730,"results":"9232","hashOfConfig":"8231"},{"size":42134,"mtime":1786084509730,"results":"9233","hashOfConfig":"8231"},{"size":7065,"mtime":1786084509731,"results":"9234","hashOfConfig":"8231"},{"size":8530,"mtime":1786084509731,"results":"9235","hashOfConfig":"8231"},{"size":14564,"mtime":1786084509731,"results":"9236","hashOfConfig":"8231"},{"size":2320,"mtime":1786084509731,"results":"9237","hashOfConfig":"8231"},{"size":5749,"mtime":1786084509731,"results":"9238","hashOfConfig":"8231"},{"size":3716,"mtime":1786084509732,"results":"9239","hashOfConfig":"8231"},{"size":4342,"mtime":1786084509732,"results":"9240","hashOfConfig":"8231"},{"size":6149,"mtime":1786084509732,"results":"9241","hashOfConfig":"8231"},{"size":3629,"mtime":1786084509732,"results":"9242","hashOfConfig":"8231"},{"size":10801,"mtime":1786084509732,"results":"9243","hashOfConfig":"8231"},{"size":8226,"mtime":1786084509732,"results":"9244","hashOfConfig":"8231"},{"size":16365,"mtime":1786084509732,"results":"9245","hashOfConfig":"8231"},{"size":3956,"mtime":1786084509733,"results":"9246","hashOfConfig":"8231"},{"size":12376,"mtime":1786084509733,"results":"9247","hashOfConfig":"8231"},{"size":4423,"mtime":1786084509733,"results":"9248","hashOfConfig":"8231"},{"size":877,"mtime":1786084509733,"results":"9249","hashOfConfig":"8231"},{"size":2763,"mtime":1786084509733,"results":"9250","hashOfConfig":"8231"},{"size":3476,"mtime":1786084509733,"results":"9251","hashOfConfig":"8231"},{"size":1806,"mtime":1786084509733,"results":"9252","hashOfConfig":"8231"},{"size":10475,"mtime":1786084509733,"results":"9253","hashOfConfig":"8231"},{"size":3017,"mtime":1786084509734,"results":"9254","hashOfConfig":"8231"},{"size":3730,"mtime":1786084509734,"results":"9255","hashOfConfig":"8231"},{"size":5821,"mtime":1786084509734,"results":"9256","hashOfConfig":"8231"},{"size":5023,"mtime":1786084509734,"results":"9257","hashOfConfig":"8231"},{"size":2770,"mtime":1786084509734,"results":"9258","hashOfConfig":"8231"},{"size":8208,"mtime":1786084509734,"results":"9259","hashOfConfig":"8231"},{"size":1031,"mtime":1786084509734,"results":"9260","hashOfConfig":"8231"},{"size":21232,"mtime":1786084509734,"results":"9261","hashOfConfig":"8231"},{"size":6311,"mtime":1786084509735,"results":"9262","hashOfConfig":"8231"},{"size":22791,"mtime":1786084509735,"results":"9263","hashOfConfig":"8231"},{"size":3086,"mtime":1786084509735,"results":"9264","hashOfConfig":"8231"},{"size":13060,"mtime":1786084509735,"results":"9265","hashOfConfig":"8231"},{"size":20260,"mtime":1786084509736,"results":"9266","hashOfConfig":"8231"},{"size":13276,"mtime":1786084509736,"results":"9267","hashOfConfig":"8231"},{"size":4160,"mtime":1786084509736,"results":"9268","hashOfConfig":"8231"},{"size":4714,"mtime":1786084509736,"results":"9269","hashOfConfig":"8231"},{"size":825,"mtime":1786084509736,"results":"9270","hashOfConfig":"8231"},{"size":675,"mtime":1786084509736,"results":"9271","hashOfConfig":"8231"},{"size":1152,"mtime":1786084509736,"results":"9272","hashOfConfig":"8231"},{"size":16514,"mtime":1786084509737,"results":"9273","hashOfConfig":"8231"},{"size":12631,"mtime":1786084509737,"results":"9274","hashOfConfig":"8231"},{"size":3527,"mtime":1786084509738,"results":"9275","hashOfConfig":"8231"},{"size":5804,"mtime":1786084509738,"results":"9276","hashOfConfig":"8231"},{"size":2415,"mtime":1786084509738,"results":"9277","hashOfConfig":"8231"},{"size":2284,"mtime":1786084509739,"results":"9278","hashOfConfig":"8231"},{"size":2393,"mtime":1786084509739,"results":"9279","hashOfConfig":"8231"},{"size":4453,"mtime":1786084509739,"results":"9280","hashOfConfig":"8231"},{"size":1806,"mtime":1786084509739,"results":"9281","hashOfConfig":"8231"},{"size":1816,"mtime":1786084509739,"results":"9282","hashOfConfig":"8231"},{"size":3502,"mtime":1786084509740,"results":"9283","hashOfConfig":"8231"},{"size":2103,"mtime":1786084509740,"results":"9284","hashOfConfig":"8231"},{"size":4299,"mtime":1786084509740,"results":"9285","hashOfConfig":"8231"},{"size":10716,"mtime":1786084509740,"results":"9286","hashOfConfig":"8231"},{"size":2194,"mtime":1786084509740,"results":"9287","hashOfConfig":"8231"},{"size":4180,"mtime":1786084509740,"results":"9288","hashOfConfig":"8231"},{"size":3319,"mtime":1786084509740,"results":"9289","hashOfConfig":"8231"},{"size":5095,"mtime":1786084509740,"results":"9290","hashOfConfig":"8231"},{"size":31414,"mtime":1786084509738,"results":"9291","hashOfConfig":"8231"},{"size":2038,"mtime":1786084509740,"results":"9292","hashOfConfig":"8231"},{"size":2698,"mtime":1786084509741,"results":"9293","hashOfConfig":"8231"},{"size":6659,"mtime":1786084509741,"results":"9294","hashOfConfig":"8231"},{"size":4592,"mtime":1786084509741,"results":"9295","hashOfConfig":"8231"},{"size":28729,"mtime":1786084509741,"results":"9296","hashOfConfig":"8231"},{"size":7844,"mtime":1786084509742,"results":"9297","hashOfConfig":"8231"},{"size":1723,"mtime":1786084509742,"results":"9298","hashOfConfig":"8231"},{"size":7953,"mtime":1786084509742,"results":"9299","hashOfConfig":"8231"},{"size":7020,"mtime":1786084509742,"results":"9300","hashOfConfig":"8231"},{"size":2731,"mtime":1786084509742,"results":"9301","hashOfConfig":"8231"},{"size":4487,"mtime":1786084509742,"results":"9302","hashOfConfig":"8231"},{"size":6036,"mtime":1786084509742,"results":"9303","hashOfConfig":"8231"},{"size":2174,"mtime":1786084509743,"results":"9304","hashOfConfig":"8231"},{"size":2080,"mtime":1786084509743,"results":"9305","hashOfConfig":"8231"},{"size":9141,"mtime":1786084509743,"results":"9306","hashOfConfig":"8231"},{"size":7781,"mtime":1786084509743,"results":"9307","hashOfConfig":"8231"},{"size":7972,"mtime":1786084509743,"results":"9308","hashOfConfig":"8231"},{"size":5156,"mtime":1786084509743,"results":"9309","hashOfConfig":"8231"},{"size":7104,"mtime":1786084509743,"results":"9310","hashOfConfig":"8231"},{"size":16050,"mtime":1786084509744,"results":"9311","hashOfConfig":"8231"},{"size":12180,"mtime":1786084509744,"results":"9312","hashOfConfig":"8231"},{"size":3298,"mtime":1786084509744,"results":"9313","hashOfConfig":"8231"},{"size":2909,"mtime":1786084509744,"results":"9314","hashOfConfig":"8231"},{"size":3268,"mtime":1786084509744,"results":"9315","hashOfConfig":"8231"},{"size":9183,"mtime":1786084509744,"results":"9316","hashOfConfig":"8231"},{"size":5243,"mtime":1786084509744,"results":"9317","hashOfConfig":"8231"},{"size":2699,"mtime":1786084509745,"results":"9318","hashOfConfig":"8231"},{"size":2372,"mtime":1786084509745,"results":"9319","hashOfConfig":"8231"},{"size":2510,"mtime":1786084509745,"results":"9320","hashOfConfig":"8231"},{"size":2267,"mtime":1786084509745,"results":"9321","hashOfConfig":"8231"},{"size":2988,"mtime":1786084509745,"results":"9322","hashOfConfig":"8231"},{"size":2323,"mtime":1786084509745,"results":"9323","hashOfConfig":"8231"},{"size":9369,"mtime":1786084509741,"results":"9324","hashOfConfig":"8231"},{"size":8734,"mtime":1786084509745,"results":"9325","hashOfConfig":"8231"},{"size":7042,"mtime":1786084509745,"results":"9326","hashOfConfig":"8231"},{"size":2419,"mtime":1786084509745,"results":"9327","hashOfConfig":"8231"},{"size":6560,"mtime":1786084509746,"results":"9328","hashOfConfig":"8231"},{"size":9174,"mtime":1786084509746,"results":"9329","hashOfConfig":"8231"},{"size":3201,"mtime":1786084509746,"results":"9330","hashOfConfig":"8231"},{"size":9133,"mtime":1786084509746,"results":"9331","hashOfConfig":"8231"},{"size":3910,"mtime":1786084509746,"results":"9332","hashOfConfig":"8231"},{"size":8409,"mtime":1786084509746,"results":"9333","hashOfConfig":"8231"},{"size":4618,"mtime":1786084509746,"results":"9334","hashOfConfig":"8231"},{"size":18698,"mtime":1786084509747,"results":"9335","hashOfConfig":"8231"},{"size":28682,"mtime":1786084509747,"results":"9336","hashOfConfig":"8231"},{"size":1013,"mtime":1786084509747,"results":"9337","hashOfConfig":"8231"},{"size":20439,"mtime":1786084509748,"results":"9338","hashOfConfig":"8231"},{"size":272,"mtime":1786084509748,"results":"9339","hashOfConfig":"8231"},{"size":747,"mtime":1786084509748,"results":"9340","hashOfConfig":"8231"},{"size":818,"mtime":1786084509748,"results":"9341","hashOfConfig":"8231"},{"size":30234,"mtime":1786084509748,"results":"9342","hashOfConfig":"8231"},{"size":23389,"mtime":1786084509749,"results":"9343","hashOfConfig":"8231"},{"size":8321,"mtime":1786084509749,"results":"9344","hashOfConfig":"8231"},{"size":721,"mtime":1786084509749,"results":"9345","hashOfConfig":"8231"},{"size":736,"mtime":1786084509749,"results":"9346","hashOfConfig":"8231"},{"size":10303,"mtime":1786084509749,"results":"9347","hashOfConfig":"8231"},{"size":769,"mtime":1786084509749,"results":"9348","hashOfConfig":"8231"},{"size":20259,"mtime":1786084509749,"results":"9349","hashOfConfig":"8231"},{"size":2750,"mtime":1786084509750,"results":"9350","hashOfConfig":"8231"},{"size":13145,"mtime":1786084509750,"results":"9351","hashOfConfig":"8231"},{"size":4528,"mtime":1786084509750,"results":"9352","hashOfConfig":"8231"},{"size":644,"mtime":1786084509750,"results":"9353","hashOfConfig":"8231"},{"size":29179,"mtime":1786084509751,"results":"9354","hashOfConfig":"8231"},{"size":9780,"mtime":1786084509751,"results":"9355","hashOfConfig":"8231"},{"size":999,"mtime":1786084509751,"results":"9356","hashOfConfig":"8231"},{"size":13207,"mtime":1786084509751,"results":"9357","hashOfConfig":"8231"},{"size":13792,"mtime":1786084509751,"results":"9358","hashOfConfig":"8231"},{"size":19536,"mtime":1786084509752,"results":"9359","hashOfConfig":"8231"},{"size":7215,"mtime":1786084509752,"results":"9360","hashOfConfig":"8231"},{"size":5059,"mtime":1786084509753,"results":"9361","hashOfConfig":"8231"},{"size":3797,"mtime":1786084509753,"results":"9362","hashOfConfig":"8231"},{"size":2113,"mtime":1786084509753,"results":"9363","hashOfConfig":"8231"},{"size":16866,"mtime":1786084509753,"results":"9364","hashOfConfig":"8231"},{"size":35418,"mtime":1786084509752,"results":"9365","hashOfConfig":"8231"},{"size":851,"mtime":1786084509753,"results":"9366","hashOfConfig":"8231"},{"size":3668,"mtime":1786084509754,"results":"9367","hashOfConfig":"8231"},{"size":4092,"mtime":1786084509754,"results":"9368","hashOfConfig":"8231"},{"size":33662,"mtime":1786084509753,"results":"9369","hashOfConfig":"8231"},{"size":8158,"mtime":1786084509754,"results":"9370","hashOfConfig":"8231"},{"size":5277,"mtime":1786084509754,"results":"9371","hashOfConfig":"8231"},{"size":35872,"mtime":1786084509754,"results":"9372","hashOfConfig":"8231"},{"size":2412,"mtime":1786084509755,"results":"9373","hashOfConfig":"8231"},{"size":3411,"mtime":1786084509755,"results":"9374","hashOfConfig":"8231"},{"size":37806,"mtime":1786084509755,"results":"9375","hashOfConfig":"8231"},{"size":13867,"mtime":1786084509755,"results":"9376","hashOfConfig":"8231"},{"size":951,"mtime":1786084509755,"results":"9377","hashOfConfig":"8231"},{"size":9822,"mtime":1786084509756,"results":"9378","hashOfConfig":"8231"},{"size":29796,"mtime":1786084509756,"results":"9379","hashOfConfig":"8231"},{"size":6329,"mtime":1786084509756,"results":"9380","hashOfConfig":"8231"},{"size":692,"mtime":1786084509757,"results":"9381","hashOfConfig":"8231"},{"size":8225,"mtime":1786084509757,"results":"9382","hashOfConfig":"8231"},{"size":902,"mtime":1786084509757,"results":"9383","hashOfConfig":"8231"},{"size":7930,"mtime":1786084509757,"results":"9384","hashOfConfig":"8231"},{"size":1295,"mtime":1786084509757,"results":"9385","hashOfConfig":"8231"},{"size":42220,"mtime":1786084509757,"results":"9386","hashOfConfig":"8231"},{"size":4243,"mtime":1786084509757,"results":"9387","hashOfConfig":"8231"},{"size":18419,"mtime":1786084509758,"results":"9388","hashOfConfig":"8231"},{"size":13484,"mtime":1786084509758,"results":"9389","hashOfConfig":"8231"},{"size":899,"mtime":1786084509758,"results":"9390","hashOfConfig":"8231"},{"size":1034,"mtime":1786084509758,"results":"9391","hashOfConfig":"8231"},{"size":17130,"mtime":1786084509758,"results":"9392","hashOfConfig":"8231"},{"size":5233,"mtime":1786084509759,"results":"9393","hashOfConfig":"8231"},{"size":3911,"mtime":1786084509759,"results":"9394","hashOfConfig":"8231"},{"size":8213,"mtime":1786084509759,"results":"9395","hashOfConfig":"8231"},{"size":1002,"mtime":1786084509759,"results":"9396","hashOfConfig":"8231"},{"size":1986,"mtime":1786084509759,"results":"9397","hashOfConfig":"8231"},{"size":3861,"mtime":1786084509759,"results":"9398","hashOfConfig":"8231"},{"size":3004,"mtime":1786084509759,"results":"9399","hashOfConfig":"8231"},{"size":7521,"mtime":1786084509760,"results":"9400","hashOfConfig":"8231"},{"size":14336,"mtime":1786084509760,"results":"9401","hashOfConfig":"8231"},{"size":4279,"mtime":1786084509760,"results":"9402","hashOfConfig":"8231"},{"size":3106,"mtime":1786084509760,"results":"9403","hashOfConfig":"8231"},{"size":7117,"mtime":1786084509760,"results":"9404","hashOfConfig":"8231"},{"size":2095,"mtime":1786084509760,"results":"9405","hashOfConfig":"8231"},{"size":4423,"mtime":1786084509760,"results":"9406","hashOfConfig":"8231"},{"size":11427,"mtime":1786084509760,"results":"9407","hashOfConfig":"8231"},{"size":591,"mtime":1786084509761,"results":"9408","hashOfConfig":"8231"},{"size":3899,"mtime":1786084509761,"results":"9409","hashOfConfig":"8231"},{"size":4029,"mtime":1786084509761,"results":"9410","hashOfConfig":"8231"},{"size":5614,"mtime":1786084509762,"results":"9411","hashOfConfig":"8231"},{"size":56993,"mtime":1786084509761,"results":"9412","hashOfConfig":"8231"},{"size":4367,"mtime":1786084509762,"results":"9413","hashOfConfig":"8231"},{"size":13848,"mtime":1786084509762,"results":"9414","hashOfConfig":"8231"},{"size":2451,"mtime":1786084509762,"results":"9415","hashOfConfig":"8231"},{"size":12109,"mtime":1786084509762,"results":"9416","hashOfConfig":"8231"},{"size":16940,"mtime":1786084509762,"results":"9417","hashOfConfig":"8231"},{"size":28258,"mtime":1786084509763,"results":"9418","hashOfConfig":"8231"},{"size":3578,"mtime":1786084509763,"results":"9419","hashOfConfig":"8231"},{"size":3186,"mtime":1786084509763,"results":"9420","hashOfConfig":"8231"},{"size":3757,"mtime":1786084509763,"results":"9421","hashOfConfig":"8231"},{"size":4182,"mtime":1786084509763,"results":"9422","hashOfConfig":"8231"},{"size":2086,"mtime":1786084509763,"results":"9423","hashOfConfig":"8231"},{"size":3415,"mtime":1786084509763,"results":"9424","hashOfConfig":"8231"},{"size":4965,"mtime":1786084509763,"results":"9425","hashOfConfig":"8231"},{"size":4802,"mtime":1786084509764,"results":"9426","hashOfConfig":"8231"},{"size":2363,"mtime":1786084509764,"results":"9427","hashOfConfig":"8231"},{"size":3758,"mtime":1786084509764,"results":"9428","hashOfConfig":"8231"},{"size":961,"mtime":1786084509764,"results":"9429","hashOfConfig":"8231"},{"size":4002,"mtime":1786084509764,"results":"9430","hashOfConfig":"8231"},{"size":6386,"mtime":1786084509764,"results":"9431","hashOfConfig":"8231"},{"size":2011,"mtime":1786084509764,"results":"9432","hashOfConfig":"8231"},{"size":2790,"mtime":1786084509764,"results":"9433","hashOfConfig":"8231"},{"size":7118,"mtime":1786084509764,"results":"9434","hashOfConfig":"8231"},{"size":134,"mtime":1786084509764,"results":"9435","hashOfConfig":"8231"},{"size":5224,"mtime":1786084509765,"results":"9436","hashOfConfig":"8231"},{"size":1168,"mtime":1786084509765,"results":"9437","hashOfConfig":"8231"},{"size":4611,"mtime":1786084509765,"results":"9438","hashOfConfig":"8231"},{"size":10695,"mtime":1786084509765,"results":"9439","hashOfConfig":"8231"},{"size":3140,"mtime":1786084509765,"results":"9440","hashOfConfig":"8231"},{"size":8078,"mtime":1786084509765,"results":"9441","hashOfConfig":"8231"},{"size":23055,"mtime":1786084509765,"results":"9442","hashOfConfig":"8231"},{"size":5215,"mtime":1786084509766,"results":"9443","hashOfConfig":"8231"},{"size":14417,"mtime":1786084509766,"results":"9444","hashOfConfig":"8231"},{"size":847,"mtime":1786084509766,"results":"9445","hashOfConfig":"8231"},{"size":3380,"mtime":1786084509766,"results":"9446","hashOfConfig":"8231"},{"size":41627,"mtime":1786084509767,"results":"9447","hashOfConfig":"8231"},{"size":10643,"mtime":1786084509767,"results":"9448","hashOfConfig":"8231"},{"size":3794,"mtime":1786084509767,"results":"9449","hashOfConfig":"8231"},{"size":2751,"mtime":1786084509767,"results":"9450","hashOfConfig":"8231"},{"size":1431,"mtime":1786084509767,"results":"9451","hashOfConfig":"8231"},{"size":1209,"mtime":1786084509768,"results":"9452","hashOfConfig":"8231"},{"size":14610,"mtime":1786084509768,"results":"9453","hashOfConfig":"8231"},{"size":7651,"mtime":1786084509768,"results":"9454","hashOfConfig":"8231"},{"size":11386,"mtime":1786084509768,"results":"9455","hashOfConfig":"8231"},{"size":8762,"mtime":1786084509768,"results":"9456","hashOfConfig":"8231"},{"size":4173,"mtime":1786084509768,"results":"9457","hashOfConfig":"8231"},{"size":297,"mtime":1786084509768,"results":"9458","hashOfConfig":"8231"},{"size":5457,"mtime":1786084509769,"results":"9459","hashOfConfig":"8231"},{"size":2721,"mtime":1786084509769,"results":"9460","hashOfConfig":"8231"},{"size":6751,"mtime":1786084509769,"results":"9461","hashOfConfig":"8231"},{"size":4037,"mtime":1786084509769,"results":"9462","hashOfConfig":"8231"},{"size":1097,"mtime":1786084509769,"results":"9463","hashOfConfig":"8231"},{"size":5628,"mtime":1786084509769,"results":"9464","hashOfConfig":"8231"},{"size":309,"mtime":1786084509769,"results":"9465","hashOfConfig":"8231"},{"size":3503,"mtime":1786084509769,"results":"9466","hashOfConfig":"8231"},{"size":4517,"mtime":1786084509770,"results":"9467","hashOfConfig":"8231"},{"size":119848,"mtime":1786084509771,"results":"9468","hashOfConfig":"8231"},{"size":3859,"mtime":1786084509771,"results":"9469","hashOfConfig":"8231"},{"size":4891,"mtime":1786084509771,"results":"9470","hashOfConfig":"8231"},{"size":25899,"mtime":1786084509771,"results":"9471","hashOfConfig":"8231"},{"size":19514,"mtime":1786084509771,"results":"9472","hashOfConfig":"8231"},{"size":22419,"mtime":1786084509772,"results":"9473","hashOfConfig":"8231"},{"size":16569,"mtime":1786084509772,"results":"9474","hashOfConfig":"8231"},{"size":6639,"mtime":1786084509772,"results":"9475","hashOfConfig":"8231"},{"size":5083,"mtime":1786084509772,"results":"9476","hashOfConfig":"8231"},{"size":3716,"mtime":1786084509772,"results":"9477","hashOfConfig":"8231"},{"size":4192,"mtime":1786084509773,"results":"9478","hashOfConfig":"8231"},{"size":9132,"mtime":1786084509773,"results":"9479","hashOfConfig":"8231"},{"size":7259,"mtime":1786084509773,"results":"9480","hashOfConfig":"8231"},{"size":2472,"mtime":1786084509773,"results":"9481","hashOfConfig":"8231"},{"size":2766,"mtime":1786084509773,"results":"9482","hashOfConfig":"8231"},{"size":1749,"mtime":1786084509773,"results":"9483","hashOfConfig":"8231"},{"size":1640,"mtime":1786084509773,"results":"9484","hashOfConfig":"8231"},{"size":905,"mtime":1786084509773,"results":"9485","hashOfConfig":"8231"},{"size":22639,"mtime":1786084509774,"results":"9486","hashOfConfig":"8231"},{"size":2507,"mtime":1786084509783,"results":"9487","hashOfConfig":"8189"},{"size":108,"mtime":1786084509783,"results":"9488","hashOfConfig":"8216"},{"size":154,"mtime":1786084509783,"results":"9489","hashOfConfig":"8216"},{"size":5495,"mtime":1786084509820,"results":"9490","hashOfConfig":"8216"},{"size":410,"mtime":1786084509868,"results":"9491","hashOfConfig":"8189"},{"size":2255,"mtime":1786084509868,"results":"9492","hashOfConfig":"9493"},{"size":54186,"mtime":1786084509869,"results":"9494","hashOfConfig":"9493"},{"size":2510,"mtime":1786084509869,"results":"9495","hashOfConfig":"9493"},{"size":4467,"mtime":1786084509869,"results":"9496","hashOfConfig":"9493"},{"size":4384,"mtime":1786084509869,"results":"9497","hashOfConfig":"9493"},{"size":7432,"mtime":1786084509869,"results":"9498","hashOfConfig":"9493"},{"size":14708,"mtime":1786084509870,"results":"9499","hashOfConfig":"9493"},{"size":4184,"mtime":1786084509870,"results":"9500","hashOfConfig":"9493"},{"size":1751,"mtime":1786084509870,"results":"9501","hashOfConfig":"9493"},{"size":2039,"mtime":1786084509871,"results":"9502","hashOfConfig":"9493"},{"size":953,"mtime":1786084509871,"results":"9503","hashOfConfig":"9493"},{"size":2104,"mtime":1786084509871,"results":"9504","hashOfConfig":"9493"},{"size":173,"mtime":1786084509871,"results":"9505","hashOfConfig":"9493"},{"size":12308,"mtime":1786084509871,"results":"9506","hashOfConfig":"9493"},{"size":2768,"mtime":1786084509871,"results":"9507","hashOfConfig":"9493"},{"size":3058,"mtime":1786084509871,"results":"9508","hashOfConfig":"9493"},{"size":3587,"mtime":1786084509872,"results":"9509","hashOfConfig":"9493"},{"size":4905,"mtime":1786084509872,"results":"9510","hashOfConfig":"9493"},{"size":137,"mtime":1786084509872,"results":"9511","hashOfConfig":"9493"},{"size":6283,"mtime":1786084509872,"results":"9512","hashOfConfig":"9493"},{"size":10514,"mtime":1786084509872,"results":"9513","hashOfConfig":"9493"},{"size":40509,"mtime":1786084509873,"results":"9514","hashOfConfig":"9493"},{"size":14494,"mtime":1786084509873,"results":"9515","hashOfConfig":"9493"},{"size":14825,"mtime":1786084509873,"results":"9516","hashOfConfig":"9493"},{"size":29329,"mtime":1786084509873,"results":"9517","hashOfConfig":"9493"},{"size":5908,"mtime":1786084509874,"results":"9518","hashOfConfig":"9493"},{"size":148,"mtime":1786084509874,"results":"9519","hashOfConfig":"9493"},{"size":6256,"mtime":1786084509874,"results":"9520","hashOfConfig":"9493"},{"size":2986,"mtime":1786084509874,"results":"9521","hashOfConfig":"9493"},{"size":175,"mtime":1786084509874,"results":"9522","hashOfConfig":"9493"},{"size":144,"mtime":1786084509875,"results":"9523","hashOfConfig":"9493"},{"size":519,"mtime":1786084509875,"results":"9524","hashOfConfig":"9493"},{"size":5164,"mtime":1786084509875,"results":"9525","hashOfConfig":"9493"},{"size":155,"mtime":1786084509875,"results":"9526","hashOfConfig":"9493"},{"size":172,"mtime":1786084509875,"results":"9527","hashOfConfig":"9493"},{"size":152,"mtime":1786084509875,"results":"9528","hashOfConfig":"9493"},{"size":132538,"mtime":1786084509876,"results":"9529","hashOfConfig":"9493"},{"size":1039,"mtime":1786084509877,"results":"9530","hashOfConfig":"9493"},{"size":3950,"mtime":1786084509877,"results":"9531","hashOfConfig":"9493"},{"size":1911,"mtime":1786084509877,"results":"9532","hashOfConfig":"9493"},{"size":5767,"mtime":1786084509877,"results":"9533","hashOfConfig":"9493"},{"size":989,"mtime":1786084509877,"results":"9534","hashOfConfig":"9493"},{"size":1551,"mtime":1786084509877,"results":"9535","hashOfConfig":"9493"},{"size":1691,"mtime":1786084509877,"results":"9536","hashOfConfig":"9493"},{"size":2578,"mtime":1786084509877,"results":"9537","hashOfConfig":"9493"},{"size":140,"mtime":1786084509878,"results":"9538","hashOfConfig":"9493"},{"size":9047,"mtime":1786084509878,"results":"9539","hashOfConfig":"9493"},{"size":16294,"mtime":1786084509878,"results":"9540","hashOfConfig":"9493"},{"size":10765,"mtime":1786084509878,"results":"9541","hashOfConfig":"9493"},{"size":127,"mtime":1786084509878,"results":"9542","hashOfConfig":"9493"},{"size":127,"mtime":1786084509879,"results":"9543","hashOfConfig":"9493"},{"size":129,"mtime":1786084509879,"results":"9544","hashOfConfig":"9493"},{"size":149,"mtime":1786084509879,"results":"9545","hashOfConfig":"9493"},{"size":21288,"mtime":1786084509879,"results":"9546","hashOfConfig":"9493"},{"size":24829,"mtime":1786084509880,"results":"9547","hashOfConfig":"9493"},{"size":11619,"mtime":1786084509880,"results":"9548","hashOfConfig":"9493"},{"size":15521,"mtime":1786084509880,"results":"9549","hashOfConfig":"9493"},{"size":1144,"mtime":1786084509880,"results":"9550","hashOfConfig":"9493"},{"size":3558,"mtime":1786084509880,"results":"9551","hashOfConfig":"9493"},{"size":2737,"mtime":1786084509881,"results":"9552","hashOfConfig":"9493"},{"size":4513,"mtime":1786084509881,"results":"9553","hashOfConfig":"9493"},{"size":14767,"mtime":1786084509881,"results":"9554","hashOfConfig":"9493"},{"size":1168,"mtime":1786084509881,"results":"9555","hashOfConfig":"9493"},{"size":8894,"mtime":1786084509881,"results":"9556","hashOfConfig":"9493"},{"size":7098,"mtime":1786084509881,"results":"9557","hashOfConfig":"9493"},{"size":5960,"mtime":1786084509881,"results":"9558","hashOfConfig":"9493"},{"size":6934,"mtime":1786084509882,"results":"9559","hashOfConfig":"9493"},{"size":5039,"mtime":1786084509882,"results":"9560","hashOfConfig":"9493"},{"size":7847,"mtime":1786084509882,"results":"9561","hashOfConfig":"9493"},{"size":5747,"mtime":1786084509882,"results":"9562","hashOfConfig":"9493"},{"size":2418,"mtime":1786084509882,"results":"9563","hashOfConfig":"9493"},{"size":12128,"mtime":1786084509882,"results":"9564","hashOfConfig":"9493"},{"size":7262,"mtime":1786084509883,"results":"9565","hashOfConfig":"9493"},{"size":3602,"mtime":1786084509883,"results":"9566","hashOfConfig":"9493"},{"size":3698,"mtime":1786084509883,"results":"9567","hashOfConfig":"9493"},{"size":3529,"mtime":1786084509883,"results":"9568","hashOfConfig":"9493"},{"size":3333,"mtime":1786084509883,"results":"9569","hashOfConfig":"9493"},{"size":6408,"mtime":1786084509883,"results":"9570","hashOfConfig":"9493"},{"size":6246,"mtime":1786084509883,"results":"9571","hashOfConfig":"9493"},{"size":4864,"mtime":1786084509883,"results":"9572","hashOfConfig":"9493"},{"size":3785,"mtime":1786084509884,"results":"9573","hashOfConfig":"9493"},{"size":4057,"mtime":1786084509884,"results":"9574","hashOfConfig":"9493"},{"size":18590,"mtime":1786084509884,"results":"9575","hashOfConfig":"9493"},{"size":42471,"mtime":1786084509884,"results":"9576","hashOfConfig":"9493"},{"size":1192,"mtime":1786084509885,"results":"9577","hashOfConfig":"9493"},{"size":120,"mtime":1786084509885,"results":"9578","hashOfConfig":"9493"},{"size":31392,"mtime":1786084509885,"results":"9579","hashOfConfig":"9493"},{"size":4554,"mtime":1786084509885,"results":"9580","hashOfConfig":"9493"},{"size":2939,"mtime":1786084509885,"results":"9581","hashOfConfig":"9493"},{"size":1074,"mtime":1786084509885,"results":"9582","hashOfConfig":"9493"},{"size":3313,"mtime":1786084509886,"results":"9583","hashOfConfig":"9493"},{"size":703,"mtime":1786084509886,"results":"9584","hashOfConfig":"9493"},{"size":4083,"mtime":1786084509886,"results":"9585","hashOfConfig":"9493"},{"size":2455,"mtime":1786084509886,"results":"9586","hashOfConfig":"9493"},{"size":2073,"mtime":1786084509886,"results":"9587","hashOfConfig":"9493"},{"size":4961,"mtime":1786084509886,"results":"9588","hashOfConfig":"9493"},{"size":751,"mtime":1786084509886,"results":"9589","hashOfConfig":"9493"},{"size":2188,"mtime":1786084509886,"results":"9590","hashOfConfig":"9493"},{"size":266,"mtime":1786084509886,"results":"9591","hashOfConfig":"9493"},{"size":3267,"mtime":1786084509887,"results":"9592","hashOfConfig":"9493"},{"size":2194,"mtime":1786084509887,"results":"9593","hashOfConfig":"9493"},{"size":2118,"mtime":1786084509887,"results":"9594","hashOfConfig":"9493"},{"size":1692,"mtime":1786084509887,"results":"9595","hashOfConfig":"9493"},{"size":5898,"mtime":1786084509887,"results":"9596","hashOfConfig":"9493"},{"size":461,"mtime":1786084509887,"results":"9597","hashOfConfig":"9493"},{"size":261,"mtime":1786084509887,"results":"9598","hashOfConfig":"9493"},{"size":10077,"mtime":1786084509888,"results":"9599","hashOfConfig":"9493"},{"size":445,"mtime":1786084509888,"results":"9600","hashOfConfig":"9493"},{"size":20162,"mtime":1786084509888,"results":"9601","hashOfConfig":"9493"},{"size":1765,"mtime":1786084509888,"results":"9602","hashOfConfig":"9493"},{"size":3848,"mtime":1786084509888,"results":"9603","hashOfConfig":"9493"},{"size":2379,"mtime":1786084509889,"results":"9604","hashOfConfig":"9493"},{"size":25076,"mtime":1786084509889,"results":"9605","hashOfConfig":"9493"},{"size":3598,"mtime":1786084509889,"results":"9606","hashOfConfig":"9493"},{"size":3380,"mtime":1786084509889,"results":"9607","hashOfConfig":"9493"},{"size":19075,"mtime":1786084509890,"results":"9608","hashOfConfig":"9493"},{"size":9607,"mtime":1786084509890,"results":"9609","hashOfConfig":"9493"},{"size":36569,"mtime":1786084509890,"results":"9610","hashOfConfig":"9493"},{"size":17994,"mtime":1786084509890,"results":"9611","hashOfConfig":"9493"},{"size":15970,"mtime":1786084509891,"results":"9612","hashOfConfig":"9493"},{"size":28421,"mtime":1786084509891,"results":"9613","hashOfConfig":"9493"},{"size":24877,"mtime":1786084509891,"results":"9614","hashOfConfig":"9493"},{"size":23146,"mtime":1786084509892,"results":"9615","hashOfConfig":"9493"},{"size":18876,"mtime":1786084509892,"results":"9616","hashOfConfig":"9493"},{"size":22316,"mtime":1786084509892,"results":"9617","hashOfConfig":"9493"},{"size":11164,"mtime":1786084509892,"results":"9618","hashOfConfig":"9493"},{"size":2236,"mtime":1786084509892,"results":"9619","hashOfConfig":"9493"},{"size":183,"mtime":1786084509892,"results":"9620","hashOfConfig":"9493"},{"size":3666,"mtime":1786084509892,"results":"9621","hashOfConfig":"9493"},{"size":698,"mtime":1786084509892,"results":"9622","hashOfConfig":"9493"},{"size":253,"mtime":1786084509892,"results":"9623","hashOfConfig":"9493"},{"size":39682,"mtime":1786084509893,"results":"9624","hashOfConfig":"9493"},{"size":3555,"mtime":1786084509893,"results":"9625","hashOfConfig":"9493"},{"size":16019,"mtime":1786084509893,"results":"9626","hashOfConfig":"9493"},{"size":22469,"mtime":1786084509893,"results":"9627","hashOfConfig":"9493"},{"size":715,"mtime":1786084509893,"results":"9628","hashOfConfig":"9493"},{"size":12959,"mtime":1786084509894,"results":"9629","hashOfConfig":"9493"},{"size":1955,"mtime":1786084509894,"results":"9630","hashOfConfig":"9493"},{"size":1784,"mtime":1786084509894,"results":"9631","hashOfConfig":"9493"},{"size":7333,"mtime":1786084509894,"results":"9632","hashOfConfig":"9493"},{"size":2881,"mtime":1786084509894,"results":"9633","hashOfConfig":"9493"},{"size":264,"mtime":1786084509894,"results":"9634","hashOfConfig":"9493"},{"size":1209,"mtime":1786084509894,"results":"9635","hashOfConfig":"9493"},{"size":1837,"mtime":1786084509894,"results":"9636","hashOfConfig":"9493"},{"size":14778,"mtime":1786084509895,"results":"9637","hashOfConfig":"9493"},{"size":17820,"mtime":1786084509895,"results":"9638","hashOfConfig":"9493"},{"size":3003,"mtime":1786084509895,"results":"9639","hashOfConfig":"9493"},{"size":8529,"mtime":1786084509895,"results":"9640","hashOfConfig":"9493"},{"size":1638,"mtime":1786084509896,"results":"9641","hashOfConfig":"9493"},{"size":3065,"mtime":1786084509896,"results":"9642","hashOfConfig":"9493"},{"size":2902,"mtime":1786084509896,"results":"9643","hashOfConfig":"9493"},{"size":1307,"mtime":1786084509896,"results":"9644","hashOfConfig":"9493"},{"size":433,"mtime":1786084509896,"results":"9645","hashOfConfig":"9493"},{"size":195393,"mtime":1786084509898,"results":"9646","hashOfConfig":"9493"},{"size":131,"mtime":1786084509898,"results":"9647","hashOfConfig":"9493"},{"size":12872,"mtime":1786084509899,"results":"9648","hashOfConfig":"9493"},{"size":325,"mtime":1786084509899,"results":"9649","hashOfConfig":"9493"},{"size":1372,"mtime":1786084509899,"results":"9650","hashOfConfig":"9493"},{"size":3189,"mtime":1786084509899,"results":"9651","hashOfConfig":"9493"},{"size":3510,"mtime":1786084509899,"results":"9652","hashOfConfig":"9493"},{"size":220,"mtime":1786084509899,"results":"9653","hashOfConfig":"9493"},{"size":372,"mtime":1786084509899,"results":"9654","hashOfConfig":"9493"},{"size":277,"mtime":1786084509900,"results":"9655","hashOfConfig":"9493"},{"size":7207,"mtime":1786084509900,"results":"9656","hashOfConfig":"9493"},{"size":1214,"mtime":1786084509900,"results":"9657","hashOfConfig":"9493"},{"size":11040,"mtime":1786084509900,"results":"9658","hashOfConfig":"9493"},{"size":1585,"mtime":1786084509900,"results":"9659","hashOfConfig":"9493"},{"size":2104,"mtime":1786084509900,"results":"9660","hashOfConfig":"9493"},{"size":5584,"mtime":1786084509900,"results":"9661","hashOfConfig":"9493"},{"size":3850,"mtime":1786084509901,"results":"9662","hashOfConfig":"9493"},{"size":678,"mtime":1786084509901,"results":"9663","hashOfConfig":"9493"},{"size":592,"mtime":1786084509901,"results":"9664","hashOfConfig":"9493"},{"size":1473,"mtime":1786084509901,"results":"9665","hashOfConfig":"9493"},{"size":6679,"mtime":1786084509901,"results":"9666","hashOfConfig":"9493"},{"size":11408,"mtime":1786084509901,"results":"9667","hashOfConfig":"9493"},{"size":5554,"mtime":1786084509901,"results":"9668","hashOfConfig":"9493"},{"size":2165,"mtime":1786084509901,"results":"9669","hashOfConfig":"9493"},{"size":1027,"mtime":1786084509902,"results":"9670","hashOfConfig":"9493"},{"size":6760,"mtime":1786084509902,"results":"9671","hashOfConfig":"9493"},{"size":1969,"mtime":1786084509902,"results":"9672","hashOfConfig":"9493"},{"size":199,"mtime":1786084509902,"results":"9673","hashOfConfig":"9493"},{"size":10654,"mtime":1786084509902,"results":"9674","hashOfConfig":"9493"},{"size":156,"mtime":1786084509902,"results":"9675","hashOfConfig":"9493"},{"size":185,"mtime":1786084509903,"results":"9676","hashOfConfig":"9493"},{"size":13997,"mtime":1786084509903,"results":"9677","hashOfConfig":"9493"},{"size":10474,"mtime":1786084509903,"results":"9678","hashOfConfig":"9493"},{"size":168,"mtime":1786084509903,"results":"9679","hashOfConfig":"9493"},{"size":195,"mtime":1786084509903,"results":"9680","hashOfConfig":"9493"},{"size":187,"mtime":1786084509904,"results":"9681","hashOfConfig":"9493"},{"size":197,"mtime":1786084509904,"results":"9682","hashOfConfig":"9493"},{"size":9004,"mtime":1786084509904,"results":"9683","hashOfConfig":"9493"},{"size":164,"mtime":1786084509904,"results":"9684","hashOfConfig":"9493"},{"size":7787,"mtime":1786084509904,"results":"9685","hashOfConfig":"9493"},{"size":1466,"mtime":1786084509904,"results":"9686","hashOfConfig":"9493"},{"size":14668,"mtime":1786084509905,"results":"9687","hashOfConfig":"9493"},{"size":6537,"mtime":1786084509905,"results":"9688","hashOfConfig":"9493"},{"size":8327,"mtime":1786084509905,"results":"9689","hashOfConfig":"9493"},{"size":140,"mtime":1786084509905,"results":"9690","hashOfConfig":"9493"},{"size":204,"mtime":1786084509905,"results":"9691","hashOfConfig":"9493"},{"size":22084,"mtime":1786084509905,"results":"9692","hashOfConfig":"9493"},{"size":2571,"mtime":1786084509905,"results":"9693","hashOfConfig":"9493"},{"size":1753,"mtime":1786084509906,"results":"9694","hashOfConfig":"9493"},{"size":398,"mtime":1786084509906,"results":"9695","hashOfConfig":"9493"},{"size":189,"mtime":1786084509906,"results":"9696","hashOfConfig":"9493"},{"size":45332,"mtime":1786084509906,"results":"9697","hashOfConfig":"9493"},{"size":144,"mtime":1786084509906,"results":"9698","hashOfConfig":"9493"},{"size":7618,"mtime":1786084509907,"results":"9699","hashOfConfig":"9493"},{"size":6576,"mtime":1786084509907,"results":"9700","hashOfConfig":"9493"},{"size":584,"mtime":1786084509907,"results":"9701","hashOfConfig":"9493"},{"size":2321,"mtime":1786084509907,"results":"9702","hashOfConfig":"9493"},{"size":1354,"mtime":1786084509907,"results":"9703","hashOfConfig":"9493"},{"size":5294,"mtime":1786084509907,"results":"9704","hashOfConfig":"9493"},{"size":135,"mtime":1786084509907,"results":"9705","hashOfConfig":"9493"},{"size":151,"mtime":1786084509907,"results":"9706","hashOfConfig":"9493"},{"size":29067,"mtime":1786084509908,"results":"9707","hashOfConfig":"9493"},{"size":6287,"mtime":1786084509908,"results":"9708","hashOfConfig":"9493"},{"size":5104,"mtime":1786084509908,"results":"9709","hashOfConfig":"9493"},{"size":402,"mtime":1786084509908,"results":"9710","hashOfConfig":"9493"},{"size":3066,"mtime":1786084509908,"results":"9711","hashOfConfig":"9493"},{"size":6228,"mtime":1786084509908,"results":"9712","hashOfConfig":"9493"},{"size":2087,"mtime":1786084509908,"results":"9713","hashOfConfig":"9493"},{"size":6884,"mtime":1786084509909,"results":"9714","hashOfConfig":"9493"},{"size":44308,"mtime":1786084509909,"results":"9715","hashOfConfig":"9493"},{"size":2673,"mtime":1786084509909,"results":"9716","hashOfConfig":"9493"},{"size":19154,"mtime":1786084509909,"results":"9717","hashOfConfig":"9493"},{"size":3669,"mtime":1786084509909,"results":"9718","hashOfConfig":"9493"},{"size":3806,"mtime":1786084509910,"results":"9719","hashOfConfig":"9493"},{"size":2818,"mtime":1786084509910,"results":"9720","hashOfConfig":"9493"},{"size":1814,"mtime":1786084509910,"results":"9721","hashOfConfig":"9493"},{"size":1559,"mtime":1786084509910,"results":"9722","hashOfConfig":"9493"},{"size":2276,"mtime":1786084509910,"results":"9723","hashOfConfig":"9493"},{"size":181,"mtime":1786084509910,"results":"9724","hashOfConfig":"9493"},{"size":1485,"mtime":1786084509910,"results":"9725","hashOfConfig":"9493"},{"size":9399,"mtime":1786084509910,"results":"9726","hashOfConfig":"9493"},{"size":2162,"mtime":1786084509911,"results":"9727","hashOfConfig":"9493"},{"size":140,"mtime":1786084509911,"results":"9728","hashOfConfig":"9493"},{"size":33386,"mtime":1786084509911,"results":"9729","hashOfConfig":"9493"},{"size":97670,"mtime":1786084509912,"results":"9730","hashOfConfig":"9493"},{"size":6550,"mtime":1786084509912,"results":"9731","hashOfConfig":"9493"},{"size":7688,"mtime":1786084509913,"results":"9732","hashOfConfig":"9493"},{"size":13733,"mtime":1786084509913,"results":"9733","hashOfConfig":"9493"},{"size":20689,"mtime":1786084509913,"results":"9734","hashOfConfig":"9493"},{"size":22356,"mtime":1786084509913,"results":"9735","hashOfConfig":"9493"},{"size":6199,"mtime":1786084509914,"results":"9736","hashOfConfig":"9493"},{"size":18044,"mtime":1786084509915,"results":"9737","hashOfConfig":"9493"},{"size":145,"mtime":1786084509915,"results":"9738","hashOfConfig":"9493"},{"size":13817,"mtime":1786084509915,"results":"9739","hashOfConfig":"9493"},{"size":244,"mtime":1786084509916,"results":"9740","hashOfConfig":"9493"},{"size":2850,"mtime":1786084509916,"results":"9741","hashOfConfig":"9493"},{"size":15068,"mtime":1786084509916,"results":"9742","hashOfConfig":"9493"},{"size":20744,"mtime":1786084509916,"results":"9743","hashOfConfig":"9493"},{"size":10844,"mtime":1786084509917,"results":"9744","hashOfConfig":"9493"},{"size":51064,"mtime":1786084509917,"results":"9745","hashOfConfig":"9493"},{"size":967,"mtime":1786084509917,"results":"9746","hashOfConfig":"9493"},{"size":1796,"mtime":1786084509917,"results":"9747","hashOfConfig":"9493"},{"size":7353,"mtime":1786084509918,"results":"9748","hashOfConfig":"9493"},{"size":122,"mtime":1786084509918,"results":"9749","hashOfConfig":"9493"},{"size":4520,"mtime":1786084509918,"results":"9750","hashOfConfig":"9493"},{"size":149,"mtime":1786084509918,"results":"9751","hashOfConfig":"9493"},{"size":162,"mtime":1786084509919,"results":"9752","hashOfConfig":"9493"},{"size":9738,"mtime":1786084509919,"results":"9753","hashOfConfig":"9493"},{"size":145,"mtime":1786084509919,"results":"9754","hashOfConfig":"9493"},{"size":707,"mtime":1786084509919,"results":"9755","hashOfConfig":"9493"},{"size":11530,"mtime":1786084509919,"results":"9756","hashOfConfig":"9493"},{"size":7384,"mtime":1786084509920,"results":"9757","hashOfConfig":"9493"},{"size":2194,"mtime":1786084509920,"results":"9758","hashOfConfig":"9493"},{"size":3992,"mtime":1786084509920,"results":"9759","hashOfConfig":"9493"},{"size":4027,"mtime":1786084509920,"results":"9760","hashOfConfig":"9493"},{"size":8791,"mtime":1786084509920,"results":"9761","hashOfConfig":"9493"},{"size":20684,"mtime":1786084509921,"results":"9762","hashOfConfig":"9493"},{"size":2355,"mtime":1786084509921,"results":"9763","hashOfConfig":"9493"},{"size":1173,"mtime":1786084509921,"results":"9764","hashOfConfig":"9493"},{"size":5775,"mtime":1786084509921,"results":"9765","hashOfConfig":"9493"},{"size":4127,"mtime":1786084509921,"results":"9766","hashOfConfig":"9493"},{"size":5237,"mtime":1786084509921,"results":"9767","hashOfConfig":"9493"},{"size":1962,"mtime":1786084509921,"results":"9768","hashOfConfig":"9493"},{"size":6706,"mtime":1786084509921,"results":"9769","hashOfConfig":"9493"},{"size":6741,"mtime":1786084509921,"results":"9770","hashOfConfig":"9493"},{"size":4899,"mtime":1786084509922,"results":"9771","hashOfConfig":"9493"},{"size":4805,"mtime":1786084509922,"results":"9772","hashOfConfig":"9493"},{"size":5214,"mtime":1786084509922,"results":"9773","hashOfConfig":"9493"},{"size":323,"mtime":1786084509922,"results":"9774","hashOfConfig":"9493"},{"size":232,"mtime":1786084509922,"results":"9775","hashOfConfig":"9493"},{"size":5031,"mtime":1786084509922,"results":"9776","hashOfConfig":"9493"},{"size":6712,"mtime":1786084509922,"results":"9777","hashOfConfig":"9493"},{"size":1694,"mtime":1786084509922,"results":"9778","hashOfConfig":"9493"},{"size":4621,"mtime":1786084509923,"results":"9779","hashOfConfig":"9493"},{"size":16447,"mtime":1786084509923,"results":"9780","hashOfConfig":"9493"},{"size":4270,"mtime":1786084509923,"results":"9781","hashOfConfig":"9493"},{"size":3902,"mtime":1786084509923,"results":"9782","hashOfConfig":"9493"},{"size":5014,"mtime":1786084509923,"results":"9783","hashOfConfig":"9493"},{"size":23310,"mtime":1786084509923,"results":"9784","hashOfConfig":"9493"},{"size":4969,"mtime":1786084509923,"results":"9785","hashOfConfig":"9493"},{"size":1759,"mtime":1786084509924,"results":"9786","hashOfConfig":"9493"},{"size":2028,"mtime":1786084509924,"results":"9787","hashOfConfig":"9493"},{"size":3203,"mtime":1786084509924,"results":"9788","hashOfConfig":"9493"},{"size":14537,"mtime":1786084509924,"results":"9789","hashOfConfig":"9493"},{"size":3547,"mtime":1786084509924,"results":"9790","hashOfConfig":"9493"},{"size":8910,"mtime":1786084509924,"results":"9791","hashOfConfig":"9493"},{"size":1807,"mtime":1786084509925,"results":"9792","hashOfConfig":"9493"},{"size":3255,"mtime":1786084509925,"results":"9793","hashOfConfig":"9493"},{"size":5465,"mtime":1786084509925,"results":"9794","hashOfConfig":"9493"},{"size":11062,"mtime":1786084509925,"results":"9795","hashOfConfig":"9493"},{"size":134,"mtime":1786084509925,"results":"9796","hashOfConfig":"9493"},{"size":870,"mtime":1786084509925,"results":"9797","hashOfConfig":"9493"},{"size":21773,"mtime":1786084509925,"results":"9798","hashOfConfig":"9493"},{"size":2147,"mtime":1786084509926,"results":"9799","hashOfConfig":"9493"},{"size":151,"mtime":1786084509926,"results":"9800","hashOfConfig":"9493"},{"size":3987,"mtime":1786084509926,"results":"9801","hashOfConfig":"9493"},{"size":4040,"mtime":1786084509926,"results":"9802","hashOfConfig":"9493"},{"size":6167,"mtime":1786084509926,"results":"9803","hashOfConfig":"9493"},{"size":4646,"mtime":1786084509926,"results":"9804","hashOfConfig":"9493"},{"size":4656,"mtime":1786084509926,"results":"9805","hashOfConfig":"9493"},{"size":5457,"mtime":1786084509927,"results":"9806","hashOfConfig":"9493"},{"size":7280,"mtime":1786084509927,"results":"9807","hashOfConfig":"9493"},{"size":1727,"mtime":1786084509927,"results":"9808","hashOfConfig":"9493"},{"size":2968,"mtime":1786084509927,"results":"9809","hashOfConfig":"9493"},{"size":4969,"mtime":1786084509927,"results":"9810","hashOfConfig":"9493"},{"size":12758,"mtime":1786084509927,"results":"9811","hashOfConfig":"9493"},{"size":4418,"mtime":1786084509927,"results":"9812","hashOfConfig":"9493"},{"size":834,"mtime":1786084509928,"results":"9813","hashOfConfig":"9493"},{"size":9706,"mtime":1786084509928,"results":"9814","hashOfConfig":"9493"},{"size":2726,"mtime":1786084509928,"results":"9815","hashOfConfig":"9493"},{"size":3329,"mtime":1786084509928,"results":"9816","hashOfConfig":"9493"},{"size":31406,"mtime":1786084509928,"results":"9817","hashOfConfig":"9493"},{"size":10640,"mtime":1786084509929,"results":"9818","hashOfConfig":"9493"},{"size":15438,"mtime":1786084509929,"results":"9819","hashOfConfig":"9493"},{"size":14999,"mtime":1786084509929,"results":"9820","hashOfConfig":"9493"},{"size":10260,"mtime":1786084509930,"results":"9821","hashOfConfig":"9493"},{"size":1926,"mtime":1786084509930,"results":"9822","hashOfConfig":"9493"},{"size":4554,"mtime":1786084509930,"results":"9823","hashOfConfig":"9493"},{"size":3709,"mtime":1786084509930,"results":"9824","hashOfConfig":"9493"},{"size":4084,"mtime":1786084509930,"results":"9825","hashOfConfig":"9493"},{"size":3556,"mtime":1786084509930,"results":"9826","hashOfConfig":"9493"},{"size":398,"mtime":1786084509930,"results":"9827","hashOfConfig":"9493"},{"size":4796,"mtime":1786084509930,"results":"9828","hashOfConfig":"9493"},{"size":4727,"mtime":1786084509931,"results":"9829","hashOfConfig":"9493"},{"size":13693,"mtime":1786084509931,"results":"9830","hashOfConfig":"9493"},{"size":22985,"mtime":1786084509931,"results":"9831","hashOfConfig":"9493"},{"size":33937,"mtime":1786084509935,"results":"9832","hashOfConfig":"9493"},{"size":4434,"mtime":1786084509935,"results":"9833","hashOfConfig":"9493"},{"size":3480,"mtime":1786084509935,"results":"9834","hashOfConfig":"9493"},{"size":2731,"mtime":1786084509935,"results":"9835","hashOfConfig":"9493"},{"size":2741,"mtime":1786084509936,"results":"9836","hashOfConfig":"9493"},{"size":3050,"mtime":1786084509936,"results":"9837","hashOfConfig":"9493"},{"size":13191,"mtime":1786084509936,"results":"9838","hashOfConfig":"9493"},{"size":11932,"mtime":1786084509936,"results":"9839","hashOfConfig":"9493"},{"size":7999,"mtime":1786084509936,"results":"9840","hashOfConfig":"9493"},{"size":4464,"mtime":1786084509936,"results":"9841","hashOfConfig":"9493"},{"size":7693,"mtime":1786084509937,"results":"9842","hashOfConfig":"9493"},{"size":3156,"mtime":1786084509937,"results":"9843","hashOfConfig":"9493"},{"size":894,"mtime":1786084509937,"results":"9844","hashOfConfig":"9493"},{"size":4952,"mtime":1786084509937,"results":"9845","hashOfConfig":"9493"},{"size":4973,"mtime":1786084509937,"results":"9846","hashOfConfig":"9493"},{"size":17242,"mtime":1786084509937,"results":"9847","hashOfConfig":"9493"},{"size":4290,"mtime":1786084509938,"results":"9848","hashOfConfig":"9493"},{"size":38704,"mtime":1786084509938,"results":"9849","hashOfConfig":"9493"},{"size":14769,"mtime":1786084509938,"results":"9850","hashOfConfig":"9493"},{"size":29207,"mtime":1786084509939,"results":"9851","hashOfConfig":"9493"},{"size":3736,"mtime":1786084509939,"results":"9852","hashOfConfig":"9493"},{"size":33877,"mtime":1786084509939,"results":"9853","hashOfConfig":"9493"},{"size":4365,"mtime":1786084509941,"results":"9854","hashOfConfig":"9493"},{"size":2629,"mtime":1786084509941,"results":"9855","hashOfConfig":"9493"},{"size":5181,"mtime":1786084509941,"results":"9856","hashOfConfig":"9493"},{"size":1906,"mtime":1786084509942,"results":"9857","hashOfConfig":"9493"},{"size":20359,"mtime":1786084509943,"results":"9858","hashOfConfig":"9493"},{"size":17453,"mtime":1786084509943,"results":"9859","hashOfConfig":"9493"},{"size":6426,"mtime":1786084509943,"results":"9860","hashOfConfig":"9493"},{"size":1793,"mtime":1786084509943,"results":"9861","hashOfConfig":"9493"},{"size":10102,"mtime":1786084509943,"results":"9862","hashOfConfig":"9493"},{"size":16871,"mtime":1786084509944,"results":"9863","hashOfConfig":"9493"},{"size":11567,"mtime":1786084509944,"results":"9864","hashOfConfig":"9493"},{"size":1287,"mtime":1786084509944,"results":"9865","hashOfConfig":"9493"},{"size":5227,"mtime":1786084509944,"results":"9866","hashOfConfig":"9493"},{"size":16230,"mtime":1786084509945,"results":"9867","hashOfConfig":"9493"},{"size":18295,"mtime":1786084509945,"results":"9868","hashOfConfig":"9493"},{"size":4526,"mtime":1786084509945,"results":"9869","hashOfConfig":"9493"},{"size":11227,"mtime":1786084509945,"results":"9870","hashOfConfig":"9493"},{"size":4001,"mtime":1786084509945,"results":"9871","hashOfConfig":"9493"},{"size":1459,"mtime":1786084509945,"results":"9872","hashOfConfig":"9493"},{"size":1618,"mtime":1786084509945,"results":"9873","hashOfConfig":"9493"},{"size":1898,"mtime":1786084509946,"results":"9874","hashOfConfig":"9493"},{"size":1925,"mtime":1786084509946,"results":"9875","hashOfConfig":"9493"},{"size":5239,"mtime":1786084509946,"results":"9876","hashOfConfig":"9493"},{"size":6131,"mtime":1786084509946,"results":"9877","hashOfConfig":"9493"},{"size":6745,"mtime":1786084509946,"results":"9878","hashOfConfig":"9493"},{"size":3227,"mtime":1786084509946,"results":"9879","hashOfConfig":"9493"},{"size":38766,"mtime":1786084509947,"results":"9880","hashOfConfig":"9493"},{"size":1703,"mtime":1786084509947,"results":"9881","hashOfConfig":"9493"},{"size":5721,"mtime":1786084509947,"results":"9882","hashOfConfig":"9493"},{"size":1516,"mtime":1786084509947,"results":"9883","hashOfConfig":"9493"},{"size":12797,"mtime":1786084509947,"results":"9884","hashOfConfig":"9493"},{"size":54554,"mtime":1786084509948,"results":"9885","hashOfConfig":"9493"},{"size":1813,"mtime":1786084509948,"results":"9886","hashOfConfig":"9493"},{"size":27080,"mtime":1786084509949,"results":"9887","hashOfConfig":"9493"},{"size":28938,"mtime":1786084509949,"results":"9888","hashOfConfig":"9493"},{"size":7495,"mtime":1786084509949,"results":"9889","hashOfConfig":"9493"},{"size":1934,"mtime":1786084509949,"results":"9890","hashOfConfig":"9493"},{"size":2257,"mtime":1786084509949,"results":"9891","hashOfConfig":"9493"},{"size":3869,"mtime":1786084509949,"results":"9892","hashOfConfig":"9493"},{"size":2229,"mtime":1786084509949,"results":"9893","hashOfConfig":"9493"},{"size":12984,"mtime":1786084509949,"results":"9894","hashOfConfig":"9493"},{"size":1953,"mtime":1786084509950,"results":"9895","hashOfConfig":"9493"},{"size":1677,"mtime":1786084509950,"results":"9896","hashOfConfig":"9493"},{"size":549,"mtime":1786084509950,"results":"9897","hashOfConfig":"9493"},{"size":644,"mtime":1786084509950,"results":"9898","hashOfConfig":"9493"},{"size":7015,"mtime":1786084509950,"results":"9899","hashOfConfig":"9493"},{"size":896,"mtime":1786084509950,"results":"9900","hashOfConfig":"9493"},{"size":2233,"mtime":1786084509950,"results":"9901","hashOfConfig":"9493"},{"size":1941,"mtime":1786084509950,"results":"9902","hashOfConfig":"9493"},{"size":1894,"mtime":1786084509950,"results":"9903","hashOfConfig":"9493"},{"size":1523,"mtime":1786084509950,"results":"9904","hashOfConfig":"9493"},{"size":959,"mtime":1786084509951,"results":"9905","hashOfConfig":"9493"},{"size":6036,"mtime":1786084509951,"results":"9906","hashOfConfig":"9493"},{"size":7278,"mtime":1786084509951,"results":"9907","hashOfConfig":"9493"},{"size":9539,"mtime":1786084509951,"results":"9908","hashOfConfig":"9493"},{"size":1889,"mtime":1786084509951,"results":"9909","hashOfConfig":"9493"},{"size":2387,"mtime":1786084509951,"results":"9910","hashOfConfig":"9493"},{"size":1590,"mtime":1786084509951,"results":"9911","hashOfConfig":"9493"},{"size":3962,"mtime":1786084509951,"results":"9912","hashOfConfig":"9493"},{"size":3910,"mtime":1786084509951,"results":"9913","hashOfConfig":"9493"},{"size":14238,"mtime":1786084509952,"results":"9914","hashOfConfig":"9493"},{"size":16318,"mtime":1786084509952,"results":"9915","hashOfConfig":"9493"},{"size":38115,"mtime":1786084509952,"results":"9916","hashOfConfig":"9493"},{"size":4989,"mtime":1786084509953,"results":"9917","hashOfConfig":"9493"},{"size":1953,"mtime":1786084509953,"results":"9918","hashOfConfig":"9493"},{"size":1425,"mtime":1786084509953,"results":"9919","hashOfConfig":"9493"},{"size":10563,"mtime":1786084509953,"results":"9920","hashOfConfig":"9493"},{"size":3344,"mtime":1786084509953,"results":"9921","hashOfConfig":"9493"},{"size":403,"mtime":1786084509953,"results":"9922","hashOfConfig":"9493"},{"size":4667,"mtime":1786084509953,"results":"9923","hashOfConfig":"9493"},{"size":395,"mtime":1786084509953,"results":"9924","hashOfConfig":"9493"},{"size":939,"mtime":1786084509953,"results":"9925","hashOfConfig":"9493"},{"size":35931,"mtime":1786084509954,"results":"9926","hashOfConfig":"9493"},{"size":300,"mtime":1786084509954,"results":"9927","hashOfConfig":"9493"},{"size":14993,"mtime":1786084509954,"results":"9928","hashOfConfig":"9493"},{"size":581,"mtime":1786084509954,"results":"9929","hashOfConfig":"9493"},{"size":6051,"mtime":1786084509954,"results":"9930","hashOfConfig":"9493"},{"size":1415,"mtime":1786084509954,"results":"9931","hashOfConfig":"9493"},{"size":6485,"mtime":1786084509955,"results":"9932","hashOfConfig":"9493"},{"size":6379,"mtime":1786084509955,"results":"9933","hashOfConfig":"9493"},{"size":22557,"mtime":1786084509955,"results":"9934","hashOfConfig":"9493"},{"size":646,"mtime":1786084509955,"results":"9935","hashOfConfig":"9493"},{"size":3475,"mtime":1786084509955,"results":"9936","hashOfConfig":"9493"},{"size":10832,"mtime":1786084509955,"results":"9937","hashOfConfig":"9493"},{"size":2360,"mtime":1786084509956,"results":"9938","hashOfConfig":"9493"},{"size":3024,"mtime":1786084509956,"results":"9939","hashOfConfig":"9493"},{"size":35180,"mtime":1786084509956,"results":"9940","hashOfConfig":"9493"},{"size":8485,"mtime":1786084509956,"results":"9941","hashOfConfig":"9493"},{"size":3935,"mtime":1786084509957,"results":"9942","hashOfConfig":"9493"},{"size":1167,"mtime":1786084509957,"results":"9943","hashOfConfig":"9493"},{"size":5993,"mtime":1786084509957,"results":"9944","hashOfConfig":"9493"},{"size":2933,"mtime":1786084509957,"results":"9945","hashOfConfig":"9493"},{"size":1203,"mtime":1786084509957,"results":"9946","hashOfConfig":"9493"},{"size":1218,"mtime":1786084509957,"results":"9947","hashOfConfig":"9493"},{"size":5262,"mtime":1786084509957,"results":"9948","hashOfConfig":"9493"},{"size":1715,"mtime":1786084509957,"results":"9949","hashOfConfig":"9493"},{"size":3802,"mtime":1786084509958,"results":"9950","hashOfConfig":"9493"},{"size":3250,"mtime":1786084509958,"results":"9951","hashOfConfig":"9493"},{"size":2054,"mtime":1786084509958,"results":"9952","hashOfConfig":"9493"},{"size":1251,"mtime":1786084509958,"results":"9953","hashOfConfig":"9493"},{"size":459,"mtime":1786084509958,"results":"9954","hashOfConfig":"9493"},{"size":651,"mtime":1786084509958,"results":"9955","hashOfConfig":"9493"},{"size":83124,"mtime":1786084509959,"results":"9956","hashOfConfig":"9493"},{"size":4661,"mtime":1786084509959,"results":"9957","hashOfConfig":"9493"},{"size":934,"mtime":1786084509959,"results":"9958","hashOfConfig":"9493"},{"size":3011,"mtime":1786084509959,"results":"9959","hashOfConfig":"9493"},{"size":22264,"mtime":1786084509959,"results":"9960","hashOfConfig":"9493"},{"size":2451,"mtime":1786084509960,"results":"9961","hashOfConfig":"9493"},{"size":5155,"mtime":1786084509960,"results":"9962","hashOfConfig":"9493"},{"size":2226,"mtime":1786084509960,"results":"9963","hashOfConfig":"9493"},{"size":1452,"mtime":1786084509960,"results":"9964","hashOfConfig":"9493"},{"size":4745,"mtime":1786084509960,"results":"9965","hashOfConfig":"9493"},{"size":7691,"mtime":1786084509960,"results":"9966","hashOfConfig":"9493"},{"size":3085,"mtime":1786084509960,"results":"9967","hashOfConfig":"9493"},{"size":14685,"mtime":1786084509961,"results":"9968","hashOfConfig":"9493"},{"size":1916,"mtime":1786084509961,"results":"9969","hashOfConfig":"9493"},{"size":4492,"mtime":1786084509961,"results":"9970","hashOfConfig":"9493"},{"size":5788,"mtime":1786084509961,"results":"9971","hashOfConfig":"9493"},{"size":3385,"mtime":1786084509961,"results":"9972","hashOfConfig":"9493"},{"size":2965,"mtime":1786084509961,"results":"9973","hashOfConfig":"9493"},{"size":3533,"mtime":1786084509961,"results":"9974","hashOfConfig":"9493"},{"size":3272,"mtime":1786084509961,"results":"9975","hashOfConfig":"9493"},{"size":2601,"mtime":1786084509961,"results":"9976","hashOfConfig":"9493"},{"size":2193,"mtime":1786084509962,"results":"9977","hashOfConfig":"9493"},{"size":2561,"mtime":1786084509962,"results":"9978","hashOfConfig":"9493"},{"size":715,"mtime":1786084509962,"results":"9979","hashOfConfig":"9493"},{"size":1086,"mtime":1786084509962,"results":"9980","hashOfConfig":"9493"},{"size":808,"mtime":1786084509962,"results":"9981","hashOfConfig":"9493"},{"size":707,"mtime":1786084509962,"results":"9982","hashOfConfig":"9493"},{"size":1589,"mtime":1786084509962,"results":"9983","hashOfConfig":"9493"},{"size":2214,"mtime":1786084509962,"results":"9984","hashOfConfig":"9493"},{"size":1086,"mtime":1786084509962,"results":"9985","hashOfConfig":"9493"},{"size":16082,"mtime":1786084509963,"results":"9986","hashOfConfig":"9493"},{"size":10021,"mtime":1786084509963,"results":"9987","hashOfConfig":"9493"},{"size":9798,"mtime":1786084509963,"results":"9988","hashOfConfig":"9493"},{"size":324,"mtime":1786084509963,"results":"9989","hashOfConfig":"9493"},{"size":44639,"mtime":1786084509964,"results":"9990","hashOfConfig":"9493"},{"size":5345,"mtime":1786084509964,"results":"9991","hashOfConfig":"9493"},{"size":169,"mtime":1786084509964,"results":"9992","hashOfConfig":"9493"},{"size":4841,"mtime":1786084509964,"results":"9993","hashOfConfig":"9493"},{"size":7761,"mtime":1786084509965,"results":"9994","hashOfConfig":"9493"},{"size":5972,"mtime":1786084509965,"results":"9995","hashOfConfig":"9493"},{"size":5405,"mtime":1786084509965,"results":"9996","hashOfConfig":"9493"},{"size":7538,"mtime":1786084509965,"results":"9997","hashOfConfig":"9493"},{"size":6818,"mtime":1786084509965,"results":"9998","hashOfConfig":"9493"},{"size":3056,"mtime":1786084509965,"results":"9999","hashOfConfig":"9493"},{"size":14551,"mtime":1786084509965,"results":"10000","hashOfConfig":"9493"},{"size":2307,"mtime":1786084509966,"results":"10001","hashOfConfig":"9493"},{"size":7482,"mtime":1786084509966,"results":"10002","hashOfConfig":"9493"},{"size":3366,"mtime":1786084509966,"results":"10003","hashOfConfig":"9493"},{"size":17190,"mtime":1786084509966,"results":"10004","hashOfConfig":"9493"},{"size":5470,"mtime":1786084509967,"results":"10005","hashOfConfig":"9493"},{"size":6071,"mtime":1786084509967,"results":"10006","hashOfConfig":"9493"},{"size":2657,"mtime":1786084509967,"results":"10007","hashOfConfig":"9493"},{"size":132,"mtime":1786084509967,"results":"10008","hashOfConfig":"9493"},{"size":162,"mtime":1786084509967,"results":"10009","hashOfConfig":"9493"},{"size":588,"mtime":1786084509967,"results":"10010","hashOfConfig":"9493"},{"size":1352,"mtime":1786084509967,"results":"10011","hashOfConfig":"9493"},{"size":154,"mtime":1786084509968,"results":"10012","hashOfConfig":"9493"},{"size":158,"mtime":1786084509968,"results":"10013","hashOfConfig":"9493"},{"size":10398,"mtime":1786084509968,"results":"10014","hashOfConfig":"9493"},{"size":1310,"mtime":1786084509968,"results":"10015","hashOfConfig":"9493"},{"size":32624,"mtime":1786084509969,"results":"10016","hashOfConfig":"9493"},{"size":17843,"mtime":1786084509969,"results":"10017","hashOfConfig":"9493"},{"size":4606,"mtime":1786084509969,"results":"10018","hashOfConfig":"9493"},{"size":9538,"mtime":1786084509969,"results":"10019","hashOfConfig":"9493"},{"size":5235,"mtime":1786084509969,"results":"10020","hashOfConfig":"9493"},{"size":8320,"mtime":1786084509969,"results":"10021","hashOfConfig":"9493"},{"size":5596,"mtime":1786084509970,"results":"10022","hashOfConfig":"9493"},{"size":10810,"mtime":1786084509970,"results":"10023","hashOfConfig":"9493"},{"size":5241,"mtime":1786084509970,"results":"10024","hashOfConfig":"9493"},{"size":7529,"mtime":1786084509970,"results":"10025","hashOfConfig":"9493"},{"size":35792,"mtime":1786084509970,"results":"10026","hashOfConfig":"9493"},{"size":4236,"mtime":1786084509971,"results":"10027","hashOfConfig":"9493"},{"size":33543,"mtime":1786084509971,"results":"10028","hashOfConfig":"9493"},{"size":4457,"mtime":1786084509971,"results":"10029","hashOfConfig":"9493"},{"size":5579,"mtime":1786084509971,"results":"10030","hashOfConfig":"9493"},{"size":2001,"mtime":1786084509972,"results":"10031","hashOfConfig":"9493"},{"size":7035,"mtime":1786084509972,"results":"10032","hashOfConfig":"9493"},{"size":8831,"mtime":1786084509972,"results":"10033","hashOfConfig":"9493"},{"size":18025,"mtime":1786084509972,"results":"10034","hashOfConfig":"9493"},{"size":3519,"mtime":1786084509972,"results":"10035","hashOfConfig":"9493"},{"size":8734,"mtime":1786084509973,"results":"10036","hashOfConfig":"9493"},{"size":2177,"mtime":1786084509973,"results":"10037","hashOfConfig":"9493"},{"size":35854,"mtime":1786084509973,"results":"10038","hashOfConfig":"9493"},{"size":16319,"mtime":1786084509973,"results":"10039","hashOfConfig":"9493"},{"size":6875,"mtime":1786084509973,"results":"10040","hashOfConfig":"9493"},{"size":15320,"mtime":1786084509974,"results":"10041","hashOfConfig":"9493"},{"size":13829,"mtime":1786084509974,"results":"10042","hashOfConfig":"9493"},{"size":16783,"mtime":1786084509974,"results":"10043","hashOfConfig":"9493"},{"size":12900,"mtime":1786084509975,"results":"10044","hashOfConfig":"9493"},{"size":12742,"mtime":1786084509975,"results":"10045","hashOfConfig":"9493"},{"size":9482,"mtime":1786084509975,"results":"10046","hashOfConfig":"9493"},{"size":4934,"mtime":1786084509975,"results":"10047","hashOfConfig":"9493"},{"size":36504,"mtime":1786084509976,"results":"10048","hashOfConfig":"9493"},{"size":4944,"mtime":1786084509976,"results":"10049","hashOfConfig":"9493"},{"size":1757,"mtime":1786084509976,"results":"10050","hashOfConfig":"9493"},{"size":8632,"mtime":1786084509976,"results":"10051","hashOfConfig":"9493"},{"size":453,"mtime":1786084509976,"results":"10052","hashOfConfig":"9493"},{"size":1479,"mtime":1786084509976,"results":"10053","hashOfConfig":"9493"},{"size":54088,"mtime":1786084509977,"results":"10054","hashOfConfig":"9493"},{"size":636,"mtime":1786084509977,"results":"10055","hashOfConfig":"9493"},{"size":2967,"mtime":1786084509977,"results":"10056","hashOfConfig":"9493"},{"size":5424,"mtime":1786084509977,"results":"10057","hashOfConfig":"9493"},{"size":5525,"mtime":1786084509978,"results":"10058","hashOfConfig":"9493"},{"size":2220,"mtime":1786084509978,"results":"10059","hashOfConfig":"9493"},{"size":39136,"mtime":1786084509978,"results":"10060","hashOfConfig":"9493"},{"size":4033,"mtime":1786084509978,"results":"10061","hashOfConfig":"9493"},{"size":9992,"mtime":1786084509978,"results":"10062","hashOfConfig":"9493"},{"size":64142,"mtime":1786084509979,"results":"10063","hashOfConfig":"9493"},{"size":19325,"mtime":1786084509979,"results":"10064","hashOfConfig":"9493"},{"size":4775,"mtime":1786084509979,"results":"10065","hashOfConfig":"9493"},{"size":26501,"mtime":1786084509980,"results":"10066","hashOfConfig":"9493"},{"size":5530,"mtime":1786084509980,"results":"10067","hashOfConfig":"9493"},{"size":56751,"mtime":1786084509981,"results":"10068","hashOfConfig":"9493"},{"size":6013,"mtime":1786084509981,"results":"10069","hashOfConfig":"9493"},{"size":3580,"mtime":1786084509981,"results":"10070","hashOfConfig":"9493"},{"size":6844,"mtime":1786084509981,"results":"10071","hashOfConfig":"9493"},{"size":8192,"mtime":1786084509981,"results":"10072","hashOfConfig":"9493"},{"size":5959,"mtime":1786084509982,"results":"10073","hashOfConfig":"9493"},{"size":5502,"mtime":1786084509982,"results":"10074","hashOfConfig":"9493"},{"size":2363,"mtime":1786084509982,"results":"10075","hashOfConfig":"9493"},{"size":16212,"mtime":1786084509982,"results":"10076","hashOfConfig":"9493"},{"size":2438,"mtime":1786084509982,"results":"10077","hashOfConfig":"9493"},{"size":9780,"mtime":1786084509982,"results":"10078","hashOfConfig":"9493"},{"size":5548,"mtime":1786084509982,"results":"10079","hashOfConfig":"9493"},{"size":2157,"mtime":1786084509982,"results":"10080","hashOfConfig":"9493"},{"size":20339,"mtime":1786084509983,"results":"10081","hashOfConfig":"9493"},{"size":4631,"mtime":1786084509983,"results":"10082","hashOfConfig":"9493"},{"size":835,"mtime":1786084509983,"results":"10083","hashOfConfig":"9493"},{"size":857,"mtime":1786084509983,"results":"10084","hashOfConfig":"9493"},{"size":578,"mtime":1786084509983,"results":"10085","hashOfConfig":"9493"},{"size":4745,"mtime":1786084509983,"results":"10086","hashOfConfig":"9493"},{"size":4788,"mtime":1786084509984,"results":"10087","hashOfConfig":"9493"},{"size":2512,"mtime":1786084509984,"results":"10088","hashOfConfig":"9493"},{"size":1205,"mtime":1786084509984,"results":"10089","hashOfConfig":"9493"},{"size":157,"mtime":1786084509984,"results":"10090","hashOfConfig":"9493"},{"size":160,"mtime":1786084509984,"results":"10091","hashOfConfig":"9493"},{"size":527,"mtime":1786084509984,"results":"10092","hashOfConfig":"9493"},{"size":1130,"mtime":1786084509984,"results":"10093","hashOfConfig":"9493"},{"size":135,"mtime":1786084509985,"results":"10094","hashOfConfig":"9493"},{"size":422,"mtime":1786084509985,"results":"10095","hashOfConfig":"9493"},{"size":1080,"mtime":1786084509985,"results":"10096","hashOfConfig":"9493"},{"size":146,"mtime":1786084509985,"results":"10097","hashOfConfig":"9493"},{"size":142,"mtime":1786084509985,"results":"10098","hashOfConfig":"9493"},{"size":141,"mtime":1786084509985,"results":"10099","hashOfConfig":"9493"},{"size":1221,"mtime":1786084509986,"results":"10100","hashOfConfig":"9493"},{"size":1481,"mtime":1786084509986,"results":"10101","hashOfConfig":"9493"},{"size":159,"mtime":1786084509986,"results":"10102","hashOfConfig":"9493"},{"size":22540,"mtime":1786084509986,"results":"10103","hashOfConfig":"9493"},{"size":13277,"mtime":1786084509986,"results":"10104","hashOfConfig":"9493"},{"size":15274,"mtime":1786084509987,"results":"10105","hashOfConfig":"9493"},{"size":8412,"mtime":1786084509987,"results":"10106","hashOfConfig":"9493"},{"size":10351,"mtime":1786084509987,"results":"10107","hashOfConfig":"9493"},{"size":4905,"mtime":1786084509987,"results":"10108","hashOfConfig":"9493"},{"size":2493,"mtime":1786084509987,"results":"10109","hashOfConfig":"9493"},{"size":1406,"mtime":1786084509987,"results":"10110","hashOfConfig":"9493"},{"size":6266,"mtime":1786084509987,"results":"10111","hashOfConfig":"9493"},{"size":3817,"mtime":1786084509988,"results":"10112","hashOfConfig":"9493"},{"size":2587,"mtime":1786084509988,"results":"10113","hashOfConfig":"9493"},{"size":15381,"mtime":1786084509988,"results":"10114","hashOfConfig":"9493"},{"size":3020,"mtime":1786084509988,"results":"10115","hashOfConfig":"9493"},{"size":535,"mtime":1786084509988,"results":"10116","hashOfConfig":"9493"},{"size":633,"mtime":1786084509988,"results":"10117","hashOfConfig":"9493"},{"size":592,"mtime":1786084509988,"results":"10118","hashOfConfig":"9493"},{"size":2274,"mtime":1786084509989,"results":"10119","hashOfConfig":"9493"},{"size":4481,"mtime":1786084509989,"results":"10120","hashOfConfig":"9493"},{"size":3733,"mtime":1786084509989,"results":"10121","hashOfConfig":"9493"},{"size":2137,"mtime":1786084509989,"results":"10122","hashOfConfig":"9493"},{"size":6963,"mtime":1786084509989,"results":"10123","hashOfConfig":"9493"},{"size":6169,"mtime":1786084509989,"results":"10124","hashOfConfig":"9493"},{"size":4755,"mtime":1786084509989,"results":"10125","hashOfConfig":"9493"},{"size":4234,"mtime":1786084509990,"results":"10126","hashOfConfig":"9493"},{"size":3388,"mtime":1786084509990,"results":"10127","hashOfConfig":"9493"},{"size":3724,"mtime":1786084509990,"results":"10128","hashOfConfig":"9493"},{"size":3480,"mtime":1786084509990,"results":"10129","hashOfConfig":"9493"},{"size":7036,"mtime":1786084509990,"results":"10130","hashOfConfig":"9493"},{"size":1916,"mtime":1786084509990,"results":"10131","hashOfConfig":"9493"},{"size":1058,"mtime":1786084509990,"results":"10132","hashOfConfig":"9493"},{"size":1100,"mtime":1786084509990,"results":"10133","hashOfConfig":"9493"},{"size":1124,"mtime":1786084509991,"results":"10134","hashOfConfig":"9493"},{"size":1033,"mtime":1786084509991,"results":"10135","hashOfConfig":"9493"},{"size":3256,"mtime":1786084509991,"results":"10136","hashOfConfig":"9493"},{"size":2225,"mtime":1786084509991,"results":"10137","hashOfConfig":"9493"},{"size":1410,"mtime":1786084509991,"results":"10138","hashOfConfig":"9493"},{"size":1234,"mtime":1786084509991,"results":"10139","hashOfConfig":"9493"},{"size":710,"mtime":1786084509991,"results":"10140","hashOfConfig":"9493"},{"size":1866,"mtime":1786084509991,"results":"10141","hashOfConfig":"9493"},{"size":2946,"mtime":1786084509991,"results":"10142","hashOfConfig":"9493"},{"size":669,"mtime":1786084509992,"results":"10143","hashOfConfig":"9493"},{"size":858,"mtime":1786084509992,"results":"10144","hashOfConfig":"9493"},{"size":1842,"mtime":1786084509992,"results":"10145","hashOfConfig":"9493"},{"size":596,"mtime":1786084509992,"results":"10146","hashOfConfig":"9493"},{"size":2269,"mtime":1786084509992,"results":"10147","hashOfConfig":"9493"},{"size":786,"mtime":1786084509992,"results":"10148","hashOfConfig":"9493"},{"size":2074,"mtime":1786084509992,"results":"10149","hashOfConfig":"9493"},{"size":2011,"mtime":1786084509992,"results":"10150","hashOfConfig":"9493"},{"size":2552,"mtime":1786084509993,"results":"10151","hashOfConfig":"9493"},{"size":3541,"mtime":1786084509993,"results":"10152","hashOfConfig":"9493"},{"size":887,"mtime":1786084509993,"results":"10153","hashOfConfig":"9493"},{"size":1459,"mtime":1786084509993,"results":"10154","hashOfConfig":"9493"},{"size":1342,"mtime":1786084509993,"results":"10155","hashOfConfig":"9493"},{"size":890,"mtime":1786084509993,"results":"10156","hashOfConfig":"9493"},{"size":2687,"mtime":1786084509993,"results":"10157","hashOfConfig":"9493"},{"size":6621,"mtime":1786084509993,"results":"10158","hashOfConfig":"9493"},{"size":1847,"mtime":1786084509993,"results":"10159","hashOfConfig":"9493"},{"size":1727,"mtime":1786084509993,"results":"10160","hashOfConfig":"9493"},{"size":5164,"mtime":1786084509994,"results":"10161","hashOfConfig":"9493"},{"size":3295,"mtime":1786084509994,"results":"10162","hashOfConfig":"9493"},{"size":318,"mtime":1786084509994,"results":"10163","hashOfConfig":"9493"},{"size":11258,"mtime":1786084509994,"results":"10164","hashOfConfig":"9493"},{"size":14856,"mtime":1786084509994,"results":"10165","hashOfConfig":"9493"},{"size":6588,"mtime":1786084509994,"results":"10166","hashOfConfig":"9493"},{"size":8238,"mtime":1786084509994,"results":"10167","hashOfConfig":"9493"},{"size":4501,"mtime":1786084509995,"results":"10168","hashOfConfig":"9493"},{"size":4888,"mtime":1786084509995,"results":"10169","hashOfConfig":"9493"},{"size":2741,"mtime":1786084509995,"results":"10170","hashOfConfig":"9493"},{"size":2573,"mtime":1786084509995,"results":"10171","hashOfConfig":"9493"},{"size":11503,"mtime":1786084509995,"results":"10172","hashOfConfig":"9493"},{"size":10825,"mtime":1786084509996,"results":"10173","hashOfConfig":"9493"},{"size":28003,"mtime":1786084509996,"results":"10174","hashOfConfig":"9493"},{"size":20209,"mtime":1786084509996,"results":"10175","hashOfConfig":"9493"},{"size":18974,"mtime":1786084509996,"results":"10176","hashOfConfig":"9493"},{"size":12949,"mtime":1786084509997,"results":"10177","hashOfConfig":"9493"},{"size":3567,"mtime":1786084509997,"results":"10178","hashOfConfig":"9493"},{"size":3943,"mtime":1786084509997,"results":"10179","hashOfConfig":"9493"},{"size":2034,"mtime":1786084509997,"results":"10180","hashOfConfig":"9493"},{"size":7899,"mtime":1786084509998,"results":"10181","hashOfConfig":"9493"},{"size":369,"mtime":1786084509998,"results":"10182","hashOfConfig":"9493"},{"size":2669,"mtime":1786084509998,"results":"10183","hashOfConfig":"9493"},{"size":39164,"mtime":1786084509998,"results":"10184","hashOfConfig":"9493"},{"size":5272,"mtime":1786084509998,"results":"10185","hashOfConfig":"9493"},{"size":80463,"mtime":1786084509999,"results":"10186","hashOfConfig":"9493"},{"size":27348,"mtime":1786084510000,"results":"10187","hashOfConfig":"9493"},{"size":8138,"mtime":1786084510000,"results":"10188","hashOfConfig":"9493"},{"size":5827,"mtime":1786084510000,"results":"10189","hashOfConfig":"9493"},{"size":12488,"mtime":1786084510000,"results":"10190","hashOfConfig":"9493"},{"size":5494,"mtime":1786084510001,"results":"10191","hashOfConfig":"9493"},{"size":4356,"mtime":1786084510001,"results":"10192","hashOfConfig":"9493"},{"size":8015,"mtime":1786084510001,"results":"10193","hashOfConfig":"9493"},{"size":881,"mtime":1786084510001,"results":"10194","hashOfConfig":"9493"},{"size":3929,"mtime":1786084510001,"results":"10195","hashOfConfig":"9493"},{"size":5919,"mtime":1786084510002,"results":"10196","hashOfConfig":"9493"},{"size":1346,"mtime":1786084510002,"results":"10197","hashOfConfig":"9493"},{"size":295,"mtime":1786084510002,"results":"10198","hashOfConfig":"9493"},{"size":678,"mtime":1786084510002,"results":"10199","hashOfConfig":"9493"},{"size":42399,"mtime":1786084510002,"results":"10200","hashOfConfig":"9493"},{"size":4180,"mtime":1786084510003,"results":"10201","hashOfConfig":"9493"},{"size":17782,"mtime":1786084510003,"results":"10202","hashOfConfig":"9493"},{"size":5717,"mtime":1786084510003,"results":"10203","hashOfConfig":"9493"},{"size":1670,"mtime":1786084510003,"results":"10204","hashOfConfig":"9493"},{"size":4890,"mtime":1786084510003,"results":"10205","hashOfConfig":"9493"},{"size":9411,"mtime":1786084510004,"results":"10206","hashOfConfig":"9493"},{"size":7311,"mtime":1786084510004,"results":"10207","hashOfConfig":"9493"},{"size":2991,"mtime":1786084510004,"results":"10208","hashOfConfig":"9493"},{"size":1952,"mtime":1786084510004,"results":"10209","hashOfConfig":"9493"},{"size":25936,"mtime":1786084510005,"results":"10210","hashOfConfig":"9493"},{"size":3797,"mtime":1786084510005,"results":"10211","hashOfConfig":"9493"},{"size":4520,"mtime":1786084510005,"results":"10212","hashOfConfig":"9493"},{"size":124,"mtime":1786084510005,"results":"10213","hashOfConfig":"9493"},{"size":9424,"mtime":1786084510006,"results":"10214","hashOfConfig":"9493"},{"size":9829,"mtime":1786084510006,"results":"10215","hashOfConfig":"9493"},{"size":10750,"mtime":1786084510006,"results":"10216","hashOfConfig":"9493"},{"size":2027,"mtime":1786084510006,"results":"10217","hashOfConfig":"9493"},{"size":5591,"mtime":1786084510006,"results":"10218","hashOfConfig":"9493"},{"size":3034,"mtime":1786084510006,"results":"10219","hashOfConfig":"9493"},{"size":1325,"mtime":1786084510007,"results":"10220","hashOfConfig":"9493"},{"size":764,"mtime":1786084510007,"results":"10221","hashOfConfig":"9493"},{"size":1719,"mtime":1786084510007,"results":"10222","hashOfConfig":"9493"},{"size":2137,"mtime":1786084510007,"results":"10223","hashOfConfig":"9493"},{"size":2355,"mtime":1786084510007,"results":"10224","hashOfConfig":"9493"},{"size":543,"mtime":1786084510007,"results":"10225","hashOfConfig":"9493"},{"size":1272,"mtime":1786084510007,"results":"10226","hashOfConfig":"9493"},{"size":1661,"mtime":1786084510008,"results":"10227","hashOfConfig":"9493"},{"size":5260,"mtime":1786084510008,"results":"10228","hashOfConfig":"9493"},{"size":3778,"mtime":1786084510008,"results":"10229","hashOfConfig":"9493"},{"size":3165,"mtime":1786084510008,"results":"10230","hashOfConfig":"9493"},{"size":3146,"mtime":1786084510008,"results":"10231","hashOfConfig":"9493"},{"size":2278,"mtime":1786084510008,"results":"10232","hashOfConfig":"9493"},{"size":136,"mtime":1786084510008,"results":"10233","hashOfConfig":"9493"},{"size":10636,"mtime":1786084510009,"results":"10234","hashOfConfig":"9493"},{"size":12181,"mtime":1786084510009,"results":"10235","hashOfConfig":"9493"},{"size":795,"mtime":1786084510009,"results":"10236","hashOfConfig":"9493"},{"size":857,"mtime":1786084510009,"results":"10237","hashOfConfig":"9493"},{"size":869,"mtime":1786084510009,"results":"10238","hashOfConfig":"9493"},{"size":174,"mtime":1786084510009,"results":"10239","hashOfConfig":"9493"},{"size":4633,"mtime":1786084510010,"results":"10240","hashOfConfig":"9493"},{"size":104,"mtime":1786084510010,"results":"10241","hashOfConfig":"9493"},{"size":716,"mtime":1786084510010,"results":"10242","hashOfConfig":"9493"},{"size":104,"mtime":1786084510010,"results":"10243","hashOfConfig":"9493"},{"size":678,"mtime":1786084510011,"results":"10244","hashOfConfig":"9493"},{"size":104,"mtime":1786084510011,"results":"10245","hashOfConfig":"9493"},{"size":739,"mtime":1786084510011,"results":"10246","hashOfConfig":"9493"},{"size":104,"mtime":1786084510011,"results":"10247","hashOfConfig":"9493"},{"size":688,"mtime":1786084510011,"results":"10248","hashOfConfig":"9493"},{"size":104,"mtime":1786084510011,"results":"10249","hashOfConfig":"9493"},{"size":750,"mtime":1786084510012,"results":"10250","hashOfConfig":"9493"},{"size":104,"mtime":1786084510012,"results":"10251","hashOfConfig":"9493"},{"size":721,"mtime":1786084510012,"results":"10252","hashOfConfig":"9493"},{"size":104,"mtime":1786084510012,"results":"10253","hashOfConfig":"9493"},{"size":703,"mtime":1786084510012,"results":"10254","hashOfConfig":"9493"},{"size":104,"mtime":1786084510012,"results":"10255","hashOfConfig":"9493"},{"size":692,"mtime":1786084510013,"results":"10256","hashOfConfig":"9493"},{"size":9791,"mtime":1786084510013,"results":"10257","hashOfConfig":"9493"},{"size":1712,"mtime":1786084510013,"results":"10258","hashOfConfig":"9493"},{"size":1347,"mtime":1786084510014,"results":"10259","hashOfConfig":"9493"},{"size":624,"mtime":1786084510014,"results":"10260","hashOfConfig":"9493"},{"size":633,"mtime":1786084510014,"results":"10261","hashOfConfig":"9493"},{"size":1447,"mtime":1786084510015,"results":"10262","hashOfConfig":"9493"},{"size":5277,"mtime":1786084510015,"results":"10263","hashOfConfig":"9493"},{"size":1063,"mtime":1786084510015,"results":"10264","hashOfConfig":"9493"},{"size":2503,"mtime":1786084510016,"results":"10265","hashOfConfig":"9493"},{"size":1036,"mtime":1786084510016,"results":"10266","hashOfConfig":"9493"},{"size":714,"mtime":1786084510016,"results":"10267","hashOfConfig":"9493"},{"size":2189,"mtime":1786084510016,"results":"10268","hashOfConfig":"9493"},{"size":1468,"mtime":1786084510016,"results":"10269","hashOfConfig":"9493"},{"size":1306,"mtime":1786084510017,"results":"10270","hashOfConfig":"9493"},{"size":1085,"mtime":1786084510017,"results":"10271","hashOfConfig":"9493"},{"size":496,"mtime":1786084510017,"results":"10272","hashOfConfig":"9493"},{"size":5298,"mtime":1786084510017,"results":"10273","hashOfConfig":"9493"},{"size":500,"mtime":1786084510017,"results":"10274","hashOfConfig":"9493"},{"size":7769,"mtime":1786084510018,"results":"10275","hashOfConfig":"9493"},{"size":737,"mtime":1786084510018,"results":"10276","hashOfConfig":"9493"},{"size":8362,"mtime":1786084510018,"results":"10277","hashOfConfig":"9493"},{"size":3325,"mtime":1786084510018,"results":"10278","hashOfConfig":"9493"},{"size":705,"mtime":1786084510018,"results":"10279","hashOfConfig":"9493"},{"size":689,"mtime":1786084510019,"results":"10280","hashOfConfig":"9493"},{"size":684,"mtime":1786084510019,"results":"10281","hashOfConfig":"9493"},{"size":2164,"mtime":1786084510019,"results":"10282","hashOfConfig":"9493"},{"size":2555,"mtime":1786084510019,"results":"10283","hashOfConfig":"9493"},{"size":3388,"mtime":1786084510019,"results":"10284","hashOfConfig":"9493"},{"size":1055,"mtime":1786084510020,"results":"10285","hashOfConfig":"9493"},{"size":2693,"mtime":1786084510020,"results":"10286","hashOfConfig":"9493"},{"size":2810,"mtime":1786084510021,"results":"10287","hashOfConfig":"9493"},{"size":5466,"mtime":1786084510028,"results":"10288","hashOfConfig":"9493"},{"size":838,"mtime":1786084510029,"results":"10289","hashOfConfig":"9493"},{"size":2092,"mtime":1786084510029,"results":"10290","hashOfConfig":"9493"},{"size":1504,"mtime":1786084510029,"results":"10291","hashOfConfig":"9493"},{"size":1826,"mtime":1786084510021,"results":"10292","hashOfConfig":"9493"},{"size":7443,"mtime":1786084510021,"results":"10293","hashOfConfig":"9493"},{"size":2924,"mtime":1786084510022,"results":"10294","hashOfConfig":"9493"},{"size":5719,"mtime":1786084510022,"results":"10295","hashOfConfig":"9493"},{"size":2961,"mtime":1786084510022,"results":"10296","hashOfConfig":"9493"},{"size":4392,"mtime":1786084510022,"results":"10297","hashOfConfig":"9493"},{"size":7846,"mtime":1786084510023,"results":"10298","hashOfConfig":"9493"},{"size":8805,"mtime":1786084510023,"results":"10299","hashOfConfig":"9493"},{"size":7614,"mtime":1786084510023,"results":"10300","hashOfConfig":"9493"},{"size":8931,"mtime":1786084510023,"results":"10301","hashOfConfig":"9493"},{"size":13254,"mtime":1786084510023,"results":"10302","hashOfConfig":"9493"},{"size":2220,"mtime":1786084510024,"results":"10303","hashOfConfig":"9493"},{"size":8298,"mtime":1786084510024,"results":"10304","hashOfConfig":"9493"},{"size":6186,"mtime":1786084510024,"results":"10305","hashOfConfig":"9493"},{"size":959,"mtime":1786084510024,"results":"10306","hashOfConfig":"9493"},{"size":8385,"mtime":1786084510024,"results":"10307","hashOfConfig":"9493"},{"size":6176,"mtime":1786084510025,"results":"10308","hashOfConfig":"9493"},{"size":10617,"mtime":1786084510025,"results":"10309","hashOfConfig":"9493"},{"size":8807,"mtime":1786084510025,"results":"10310","hashOfConfig":"9493"},{"size":4309,"mtime":1786084510025,"results":"10311","hashOfConfig":"9493"},{"size":6944,"mtime":1786084510026,"results":"10312","hashOfConfig":"9493"},{"size":876,"mtime":1786084510026,"results":"10313","hashOfConfig":"9493"},{"size":8986,"mtime":1786084510026,"results":"10314","hashOfConfig":"9493"},{"size":12159,"mtime":1786084510026,"results":"10315","hashOfConfig":"9493"},{"size":5268,"mtime":1786084510026,"results":"10316","hashOfConfig":"9493"},{"size":5594,"mtime":1786084510027,"results":"10317","hashOfConfig":"9493"},{"size":2818,"mtime":1786084510027,"results":"10318","hashOfConfig":"9493"},{"size":7980,"mtime":1786084510027,"results":"10319","hashOfConfig":"9493"},{"size":6884,"mtime":1786084510027,"results":"10320","hashOfConfig":"9493"},{"size":7390,"mtime":1786084510027,"results":"10321","hashOfConfig":"9493"},{"size":1395,"mtime":1786084510028,"results":"10322","hashOfConfig":"9493"},{"size":6944,"mtime":1786084510028,"results":"10323","hashOfConfig":"9493"},{"size":2976,"mtime":1786084510028,"results":"10324","hashOfConfig":"9493"},{"size":2039,"mtime":1786084510029,"results":"10325","hashOfConfig":"9493"},{"size":2436,"mtime":1786084510029,"results":"10326","hashOfConfig":"9493"},{"size":1999,"mtime":1786084510030,"results":"10327","hashOfConfig":"9493"},{"size":3121,"mtime":1786084510030,"results":"10328","hashOfConfig":"9493"},{"size":3771,"mtime":1786084510030,"results":"10329","hashOfConfig":"9493"},{"size":10718,"mtime":1786084510031,"results":"10330","hashOfConfig":"9493"},{"size":7795,"mtime":1786084510031,"results":"10331","hashOfConfig":"9493"},{"size":617,"mtime":1786084510031,"results":"10332","hashOfConfig":"9493"},{"size":1817,"mtime":1786084510031,"results":"10333","hashOfConfig":"9493"},{"size":1721,"mtime":1786084510031,"results":"10334","hashOfConfig":"9493"},{"size":5543,"mtime":1786084510032,"results":"10335","hashOfConfig":"9493"},{"size":7005,"mtime":1786084510032,"results":"10336","hashOfConfig":"9493"},{"size":2394,"mtime":1786084510032,"results":"10337","hashOfConfig":"9493"},{"size":1904,"mtime":1786084510032,"results":"10338","hashOfConfig":"9493"},{"size":3047,"mtime":1786084510032,"results":"10339","hashOfConfig":"9493"},{"size":1028,"mtime":1786084510033,"results":"10340","hashOfConfig":"9493"},{"size":495,"mtime":1786084510033,"results":"10341","hashOfConfig":"9493"},{"size":14039,"mtime":1786084510033,"results":"10342","hashOfConfig":"9493"},{"size":2121,"mtime":1786084510033,"results":"10343","hashOfConfig":"9493"},{"size":420,"mtime":1786084510033,"results":"10344","hashOfConfig":"9493"},{"size":1346,"mtime":1786084510034,"results":"10345","hashOfConfig":"9493"},{"size":258,"mtime":1786084510034,"results":"10346","hashOfConfig":"9493"},{"size":65,"mtime":1786084510034,"results":"10347","hashOfConfig":"9493"},{"size":1674,"mtime":1786084510034,"results":"10348","hashOfConfig":"9493"},{"size":2750,"mtime":1786084510034,"results":"10349","hashOfConfig":"9493"},{"size":1916,"mtime":1786084510034,"results":"10350","hashOfConfig":"9493"},{"size":1798,"mtime":1786084510034,"results":"10351","hashOfConfig":"9493"},{"size":1343,"mtime":1786084510035,"results":"10352","hashOfConfig":"9493"},{"size":1137,"mtime":1786084510035,"results":"10353","hashOfConfig":"9493"},{"size":517,"mtime":1786084510035,"results":"10354","hashOfConfig":"9493"},{"size":2546,"mtime":1786084510035,"results":"10355","hashOfConfig":"9493"},{"size":1677,"mtime":1786084510035,"results":"10356","hashOfConfig":"9493"},{"size":874,"mtime":1786084510036,"results":"10357","hashOfConfig":"9493"},{"size":1338,"mtime":1786084510036,"results":"10358","hashOfConfig":"9493"},{"size":1595,"mtime":1786084510036,"results":"10359","hashOfConfig":"9493"},{"size":1793,"mtime":1786084510036,"results":"10360","hashOfConfig":"9493"},{"size":1360,"mtime":1786084510037,"results":"10361","hashOfConfig":"9493"},{"size":1985,"mtime":1786084510036,"results":"10362","hashOfConfig":"9493"},{"size":4647,"mtime":1786084510037,"results":"10363","hashOfConfig":"9493"},{"size":8032,"mtime":1786084510037,"results":"10364","hashOfConfig":"9493"},{"size":6097,"mtime":1786084510037,"results":"10365","hashOfConfig":"9493"},{"size":1999,"mtime":1786084510037,"results":"10366","hashOfConfig":"9493"},{"size":1245,"mtime":1786084510037,"results":"10367","hashOfConfig":"9493"},{"size":1830,"mtime":1786084510038,"results":"10368","hashOfConfig":"9493"},{"size":1184,"mtime":1786084510038,"results":"10369","hashOfConfig":"9493"},{"size":430,"mtime":1786084510038,"results":"10370","hashOfConfig":"9493"},{"size":3655,"mtime":1786084510038,"results":"10371","hashOfConfig":"9493"},{"size":783,"mtime":1786084510038,"results":"10372","hashOfConfig":"9493"},{"size":3406,"mtime":1786084510038,"results":"10373","hashOfConfig":"9493"},{"size":2720,"mtime":1786084510039,"results":"10374","hashOfConfig":"9493"},{"size":1213,"mtime":1786084510039,"results":"10375","hashOfConfig":"9493"},{"size":2321,"mtime":1786084510039,"results":"10376","hashOfConfig":"9493"},{"size":1049,"mtime":1786084510039,"results":"10377","hashOfConfig":"9493"},{"size":665,"mtime":1786084510039,"results":"10378","hashOfConfig":"9493"},{"size":887,"mtime":1786084510039,"results":"10379","hashOfConfig":"9493"},{"size":1797,"mtime":1786084510040,"results":"10380","hashOfConfig":"9493"},{"size":1400,"mtime":1786084510040,"results":"10381","hashOfConfig":"9493"},{"size":654,"mtime":1786084510040,"results":"10382","hashOfConfig":"9493"},{"size":958,"mtime":1786084510040,"results":"10383","hashOfConfig":"9493"},{"size":1106,"mtime":1786084510040,"results":"10384","hashOfConfig":"9493"},{"size":1690,"mtime":1786084510040,"results":"10385","hashOfConfig":"9493"},{"size":1649,"mtime":1786084510041,"results":"10386","hashOfConfig":"9493"},{"size":1333,"mtime":1786084510041,"results":"10387","hashOfConfig":"9493"},{"size":2266,"mtime":1786084510041,"results":"10388","hashOfConfig":"9493"},{"size":1091,"mtime":1786084510041,"results":"10389","hashOfConfig":"9493"},{"size":942,"mtime":1786084510041,"results":"10390","hashOfConfig":"9493"},{"size":1041,"mtime":1786084510041,"results":"10391","hashOfConfig":"9493"},{"size":1012,"mtime":1786084510042,"results":"10392","hashOfConfig":"9493"},{"size":2007,"mtime":1786084510042,"results":"10393","hashOfConfig":"9493"},{"size":2424,"mtime":1786084510042,"results":"10394","hashOfConfig":"9493"},{"size":2071,"mtime":1786084510042,"results":"10395","hashOfConfig":"9493"},{"size":3688,"mtime":1786084510042,"results":"10396","hashOfConfig":"9493"},{"size":1205,"mtime":1786084510042,"results":"10397","hashOfConfig":"9493"},{"size":2118,"mtime":1786084510043,"results":"10398","hashOfConfig":"9493"},{"size":1625,"mtime":1786084510043,"results":"10399","hashOfConfig":"9493"},{"size":929,"mtime":1786084510043,"results":"10400","hashOfConfig":"9493"},{"size":586,"mtime":1786084510043,"results":"10401","hashOfConfig":"9493"},{"size":836,"mtime":1786084510043,"results":"10402","hashOfConfig":"9493"},{"size":1380,"mtime":1786084510044,"results":"10403","hashOfConfig":"9493"},{"size":259,"mtime":1786084510044,"results":"10404","hashOfConfig":"9493"},{"size":2491,"mtime":1786084510044,"results":"10405","hashOfConfig":"9493"},{"size":4916,"mtime":1786084510044,"results":"10406","hashOfConfig":"9493"},{"size":9102,"mtime":1786084510044,"results":"10407","hashOfConfig":"9493"},{"size":4412,"mtime":1786084510045,"results":"10408","hashOfConfig":"9493"},{"size":21492,"mtime":1786084510045,"results":"10409","hashOfConfig":"9493"},{"size":5205,"mtime":1786084510045,"results":"10410","hashOfConfig":"9493"},{"size":1919,"mtime":1786084510045,"results":"10411","hashOfConfig":"9493"},{"size":1085,"mtime":1786084510046,"results":"10412","hashOfConfig":"9493"},{"size":1046,"mtime":1786084510046,"results":"10413","hashOfConfig":"9493"},{"size":7357,"mtime":1786084510046,"results":"10414","hashOfConfig":"9493"},{"size":1772,"mtime":1786084510046,"results":"10415","hashOfConfig":"9493"},{"size":2560,"mtime":1786084510046,"results":"10416","hashOfConfig":"9493"},{"size":2775,"mtime":1786084510046,"results":"10417","hashOfConfig":"9493"},{"size":2450,"mtime":1786084510047,"results":"10418","hashOfConfig":"9493"},{"size":1295,"mtime":1786084510047,"results":"10419","hashOfConfig":"9493"},{"size":5278,"mtime":1786084510047,"results":"10420","hashOfConfig":"9493"},{"size":2332,"mtime":1786084510047,"results":"10421","hashOfConfig":"9493"},{"size":1974,"mtime":1786084510047,"results":"10422","hashOfConfig":"9493"},{"size":2465,"mtime":1786084510048,"results":"10423","hashOfConfig":"9493"},{"size":1530,"mtime":1786084510048,"results":"10424","hashOfConfig":"9493"},{"size":4279,"mtime":1786084510048,"results":"10425","hashOfConfig":"9493"},{"size":4569,"mtime":1786084510048,"results":"10426","hashOfConfig":"9493"},{"size":1871,"mtime":1786084510049,"results":"10427","hashOfConfig":"9493"},{"size":2219,"mtime":1786084510049,"results":"10428","hashOfConfig":"9493"},{"size":1507,"mtime":1786084510049,"results":"10429","hashOfConfig":"9493"},{"size":601,"mtime":1786084510049,"results":"10430","hashOfConfig":"9493"},{"size":1502,"mtime":1786084510049,"results":"10431","hashOfConfig":"9493"},{"size":3145,"mtime":1786084510049,"results":"10432","hashOfConfig":"9493"},{"size":1878,"mtime":1786084510049,"results":"10433","hashOfConfig":"9493"},{"size":923,"mtime":1786084510050,"results":"10434","hashOfConfig":"9493"},{"size":2733,"mtime":1786084510050,"results":"10435","hashOfConfig":"9493"},{"size":714,"mtime":1786084510050,"results":"10436","hashOfConfig":"9493"},{"size":684,"mtime":1786084510050,"results":"10437","hashOfConfig":"9493"},{"size":672,"mtime":1786084510051,"results":"10438","hashOfConfig":"9493"},{"size":1842,"mtime":1786084510051,"results":"10439","hashOfConfig":"9493"},{"size":1834,"mtime":1786084510051,"results":"10440","hashOfConfig":"9493"},{"size":4422,"mtime":1786084510051,"results":"10441","hashOfConfig":"9493"},{"size":1514,"mtime":1786084510051,"results":"10442","hashOfConfig":"9493"},{"size":4808,"mtime":1786084510052,"results":"10443","hashOfConfig":"9493"},{"size":3910,"mtime":1786084510052,"results":"10444","hashOfConfig":"9493"},{"size":4188,"mtime":1786084510052,"results":"10445","hashOfConfig":"9493"},{"size":2795,"mtime":1786084510052,"results":"10446","hashOfConfig":"9493"},{"size":2592,"mtime":1786084510052,"results":"10447","hashOfConfig":"9493"},{"size":6039,"mtime":1786084510052,"results":"10448","hashOfConfig":"9493"},{"size":2803,"mtime":1786084510053,"results":"10449","hashOfConfig":"9493"},{"size":2038,"mtime":1786084510053,"results":"10450","hashOfConfig":"9493"},{"size":5914,"mtime":1786084510053,"results":"10451","hashOfConfig":"9493"},{"size":3548,"mtime":1786084510054,"results":"10452","hashOfConfig":"9493"},{"size":9311,"mtime":1786084510053,"results":"10453","hashOfConfig":"9493"},{"size":8153,"mtime":1786084510054,"results":"10454","hashOfConfig":"9493"},{"size":1141,"mtime":1786084510054,"results":"10455","hashOfConfig":"9493"},{"size":1859,"mtime":1786084510054,"results":"10456","hashOfConfig":"9493"},{"size":1381,"mtime":1786084510055,"results":"10457","hashOfConfig":"9493"},{"size":36056,"mtime":1786084510055,"results":"10458","hashOfConfig":"9493"},{"size":3471,"mtime":1786084510055,"results":"10459","hashOfConfig":"9493"},{"size":2939,"mtime":1786084510056,"results":"10460","hashOfConfig":"9493"},{"size":5835,"mtime":1786084510056,"results":"10461","hashOfConfig":"9493"},{"size":5348,"mtime":1786084510056,"results":"10462","hashOfConfig":"9493"},{"size":12371,"mtime":1786084510057,"results":"10463","hashOfConfig":"9493"},{"size":5052,"mtime":1786084510057,"results":"10464","hashOfConfig":"9493"},{"size":900,"mtime":1786084510057,"results":"10465","hashOfConfig":"9493"},{"size":4393,"mtime":1786084510057,"results":"10466","hashOfConfig":"9493"},{"size":24243,"mtime":1786084510058,"results":"10467","hashOfConfig":"9493"},{"size":10400,"mtime":1786084510058,"results":"10468","hashOfConfig":"9493"},{"size":1896,"mtime":1786084510058,"results":"10469","hashOfConfig":"9493"},{"size":4598,"mtime":1786084510058,"results":"10470","hashOfConfig":"9493"},{"size":4097,"mtime":1786084510059,"results":"10471","hashOfConfig":"9493"},{"size":4462,"mtime":1786084510059,"results":"10472","hashOfConfig":"9493"},{"size":4820,"mtime":1786084510059,"results":"10473","hashOfConfig":"9493"},{"size":7172,"mtime":1786084510060,"results":"10474","hashOfConfig":"9493"},{"size":4595,"mtime":1786084510060,"results":"10475","hashOfConfig":"9493"},{"size":4928,"mtime":1786084510060,"results":"10476","hashOfConfig":"9493"},{"size":6066,"mtime":1786084510061,"results":"10477","hashOfConfig":"9493"},{"size":5292,"mtime":1786084510061,"results":"10478","hashOfConfig":"9493"},{"size":7507,"mtime":1786084510061,"results":"10479","hashOfConfig":"9493"},{"size":1107,"mtime":1786084510062,"results":"10480","hashOfConfig":"9493"},{"size":3464,"mtime":1786084510062,"results":"10481","hashOfConfig":"9493"},{"size":1119,"mtime":1786084510062,"results":"10482","hashOfConfig":"9493"},{"size":2527,"mtime":1786084510062,"results":"10483","hashOfConfig":"9493"},{"size":1027,"mtime":1786084510062,"results":"10484","hashOfConfig":"9493"},{"size":3030,"mtime":1786084510062,"results":"10485","hashOfConfig":"9493"},{"size":1044,"mtime":1786084510063,"results":"10486","hashOfConfig":"9493"},{"size":1586,"mtime":1786084510063,"results":"10487","hashOfConfig":"9493"},{"size":495,"mtime":1786084510063,"results":"10488","hashOfConfig":"9493"},{"size":5378,"mtime":1786084510063,"results":"10489","hashOfConfig":"9493"},{"size":3055,"mtime":1786084510063,"results":"10490","hashOfConfig":"9493"},{"size":2494,"mtime":1786084510064,"results":"10491","hashOfConfig":"9493"},{"size":3202,"mtime":1786084510064,"results":"10492","hashOfConfig":"9493"},{"size":16755,"mtime":1786084510064,"results":"10493","hashOfConfig":"9493"},{"size":5758,"mtime":1786084510064,"results":"10494","hashOfConfig":"9493"},{"size":7551,"mtime":1786084510065,"results":"10495","hashOfConfig":"9493"},{"size":1201,"mtime":1786084510065,"results":"10496","hashOfConfig":"9493"},{"size":13348,"mtime":1786084510065,"results":"10497","hashOfConfig":"9493"},{"size":1941,"mtime":1786084510065,"results":"10498","hashOfConfig":"9493"},{"size":2900,"mtime":1786084510065,"results":"10499","hashOfConfig":"9493"},{"size":2373,"mtime":1786084510066,"results":"10500","hashOfConfig":"9493"},{"size":1395,"mtime":1786084510066,"results":"10501","hashOfConfig":"9493"},{"size":2195,"mtime":1786084510066,"results":"10502","hashOfConfig":"9493"},{"size":1388,"mtime":1786084510066,"results":"10503","hashOfConfig":"9493"},{"size":2768,"mtime":1786084510066,"results":"10504","hashOfConfig":"9493"},{"size":5531,"mtime":1786084510066,"results":"10505","hashOfConfig":"9493"},{"size":16573,"mtime":1786084510067,"results":"10506","hashOfConfig":"9493"},{"size":4152,"mtime":1786084510067,"results":"10507","hashOfConfig":"9493"},{"size":9975,"mtime":1786084510067,"results":"10508","hashOfConfig":"9493"},{"size":27484,"mtime":1786084510067,"results":"10509","hashOfConfig":"9493"},{"size":4377,"mtime":1786084510067,"results":"10510","hashOfConfig":"9493"},{"size":2351,"mtime":1786084510068,"results":"10511","hashOfConfig":"9493"},{"size":1919,"mtime":1786084510068,"results":"10512","hashOfConfig":"9493"},{"size":89395,"mtime":1786084510069,"results":"10513","hashOfConfig":"9493"},{"size":1482,"mtime":1786084510069,"results":"10514","hashOfConfig":"9493"},{"size":2876,"mtime":1786084510069,"results":"10515","hashOfConfig":"9493"},{"size":8761,"mtime":1786084510069,"results":"10516","hashOfConfig":"9493"},{"size":16003,"mtime":1786084510069,"results":"10517","hashOfConfig":"9493"},{"size":975,"mtime":1786084510070,"results":"10518","hashOfConfig":"9493"},{"size":22384,"mtime":1786084510070,"results":"10519","hashOfConfig":"9493"},{"size":606,"mtime":1786084510070,"results":"10520","hashOfConfig":"9493"},{"size":2016,"mtime":1786084510070,"results":"10521","hashOfConfig":"9493"},{"size":6849,"mtime":1786084510071,"results":"10522","hashOfConfig":"9493"},{"size":27942,"mtime":1786084510071,"results":"10523","hashOfConfig":"9493"},{"size":4502,"mtime":1786084510071,"results":"10524","hashOfConfig":"9493"},{"size":3192,"mtime":1786084510072,"results":"10525","hashOfConfig":"9493"},{"size":3629,"mtime":1786084510071,"results":"10526","hashOfConfig":"9493"},{"size":1707,"mtime":1786084510072,"results":"10527","hashOfConfig":"9493"},{"size":8507,"mtime":1786084510072,"results":"10528","hashOfConfig":"9493"},{"size":5932,"mtime":1786084510072,"results":"10529","hashOfConfig":"9493"},{"size":3264,"mtime":1786084510073,"results":"10530","hashOfConfig":"9493"},{"size":3767,"mtime":1786084510072,"results":"10531","hashOfConfig":"9493"},{"size":1725,"mtime":1786084510073,"results":"10532","hashOfConfig":"9493"},{"size":776,"mtime":1786084510073,"results":"10533","hashOfConfig":"9493"},{"size":3123,"mtime":1786084510073,"results":"10534","hashOfConfig":"9493"},{"size":3675,"mtime":1786084510073,"results":"10535","hashOfConfig":"9493"},{"size":1722,"mtime":1786084510073,"results":"10536","hashOfConfig":"9493"},{"size":3566,"mtime":1786084510074,"results":"10537","hashOfConfig":"9493"},{"size":1947,"mtime":1786084510074,"results":"10538","hashOfConfig":"9493"},{"size":4162,"mtime":1786084510074,"results":"10539","hashOfConfig":"9493"},{"size":1005,"mtime":1786084510074,"results":"10540","hashOfConfig":"9493"},{"size":1335,"mtime":1786084510074,"results":"10541","hashOfConfig":"9493"},{"size":515,"mtime":1786084510074,"results":"10542","hashOfConfig":"9493"},{"size":2147,"mtime":1786084510075,"results":"10543","hashOfConfig":"9493"},{"size":1151,"mtime":1786084510075,"results":"10544","hashOfConfig":"9493"},{"size":1732,"mtime":1786084510075,"results":"10545","hashOfConfig":"9493"},{"size":10121,"mtime":1786084510075,"results":"10546","hashOfConfig":"9493"},{"size":1496,"mtime":1786084510075,"results":"10547","hashOfConfig":"9493"},{"size":1556,"mtime":1786084510076,"results":"10548","hashOfConfig":"9493"},{"size":15186,"mtime":1786084510076,"results":"10549","hashOfConfig":"9493"},{"size":9595,"mtime":1786084510076,"results":"10550","hashOfConfig":"9493"},{"size":5205,"mtime":1786084510076,"results":"10551","hashOfConfig":"9493"},{"size":3814,"mtime":1786084510076,"results":"10552","hashOfConfig":"9493"},{"size":7544,"mtime":1786084510077,"results":"10553","hashOfConfig":"9493"},{"size":1872,"mtime":1786084510077,"results":"10554","hashOfConfig":"9493"},{"size":3389,"mtime":1786084510077,"results":"10555","hashOfConfig":"9493"},{"size":3840,"mtime":1786084510078,"results":"10556","hashOfConfig":"9493"},{"size":1952,"mtime":1786084510078,"results":"10557","hashOfConfig":"9493"},{"size":2639,"mtime":1786084510078,"results":"10558","hashOfConfig":"9493"},{"size":4556,"mtime":1786084510078,"results":"10559","hashOfConfig":"9493"},{"size":2419,"mtime":1786084510078,"results":"10560","hashOfConfig":"9493"},{"size":1677,"mtime":1786084510079,"results":"10561","hashOfConfig":"9493"},{"size":5725,"mtime":1786084510079,"results":"10562","hashOfConfig":"9493"},{"size":2476,"mtime":1786084510079,"results":"10563","hashOfConfig":"9493"},{"size":2689,"mtime":1786084510079,"results":"10564","hashOfConfig":"9493"},{"size":2946,"mtime":1786084510079,"results":"10565","hashOfConfig":"9493"},{"size":1491,"mtime":1786084510079,"results":"10566","hashOfConfig":"9493"},{"size":2941,"mtime":1786084510080,"results":"10567","hashOfConfig":"9493"},{"size":1857,"mtime":1786084510080,"results":"10568","hashOfConfig":"9493"},{"size":475,"mtime":1786084510080,"results":"10569","hashOfConfig":"9493"},{"size":3544,"mtime":1786084510080,"results":"10570","hashOfConfig":"9493"},{"size":2779,"mtime":1786084510080,"results":"10571","hashOfConfig":"9493"},{"size":2145,"mtime":1786084510081,"results":"10572","hashOfConfig":"9493"},{"size":2413,"mtime":1786084510081,"results":"10573","hashOfConfig":"9493"},{"size":1402,"mtime":1786084510081,"results":"10574","hashOfConfig":"9493"},{"size":9276,"mtime":1786084510081,"results":"10575","hashOfConfig":"9493"},{"size":492,"mtime":1786084510081,"results":"10576","hashOfConfig":"9493"},{"size":877,"mtime":1786084510082,"results":"10577","hashOfConfig":"9493"},{"size":7086,"mtime":1786084510082,"results":"10578","hashOfConfig":"9493"},{"size":1814,"mtime":1786084510082,"results":"10579","hashOfConfig":"9493"},{"size":2010,"mtime":1786084510082,"results":"10580","hashOfConfig":"9493"},{"size":973,"mtime":1786084510083,"results":"10581","hashOfConfig":"9493"},{"size":964,"mtime":1786084510083,"results":"10582","hashOfConfig":"9493"},{"size":262,"mtime":1786084510083,"results":"10583","hashOfConfig":"9493"},{"size":1914,"mtime":1786084510083,"results":"10584","hashOfConfig":"9493"},{"size":1338,"mtime":1786084510083,"results":"10585","hashOfConfig":"9493"},{"size":810,"mtime":1786084510083,"results":"10586","hashOfConfig":"9493"},{"size":1521,"mtime":1786084510084,"results":"10587","hashOfConfig":"9493"},{"size":809,"mtime":1786084510084,"results":"10588","hashOfConfig":"9493"},{"size":2928,"mtime":1786084510084,"results":"10589","hashOfConfig":"9493"},{"size":643,"mtime":1786084510084,"results":"10590","hashOfConfig":"9493"},{"size":1490,"mtime":1786084510084,"results":"10591","hashOfConfig":"9493"},{"size":4233,"mtime":1786084510084,"results":"10592","hashOfConfig":"9493"},{"size":2227,"mtime":1786084510085,"results":"10593","hashOfConfig":"9493"},{"size":1205,"mtime":1786084510085,"results":"10594","hashOfConfig":"9493"},{"size":973,"mtime":1786084510085,"results":"10595","hashOfConfig":"9493"},{"size":964,"mtime":1786084510085,"results":"10596","hashOfConfig":"9493"},{"size":259,"mtime":1786084510085,"results":"10597","hashOfConfig":"9493"},{"size":810,"mtime":1786084510085,"results":"10598","hashOfConfig":"9493"},{"size":808,"mtime":1786084510085,"results":"10599","hashOfConfig":"9493"},{"size":1591,"mtime":1786084510086,"results":"10600","hashOfConfig":"9493"},{"size":643,"mtime":1786084510086,"results":"10601","hashOfConfig":"9493"},{"size":1497,"mtime":1786084510086,"results":"10602","hashOfConfig":"9493"},{"size":1214,"mtime":1786084510086,"results":"10603","hashOfConfig":"9493"},{"size":974,"mtime":1786084510086,"results":"10604","hashOfConfig":"9493"},{"size":965,"mtime":1786084510086,"results":"10605","hashOfConfig":"9493"},{"size":260,"mtime":1786084510086,"results":"10606","hashOfConfig":"9493"},{"size":1353,"mtime":1786084510086,"results":"10607","hashOfConfig":"9493"},{"size":815,"mtime":1786084510087,"results":"10608","hashOfConfig":"9493"},{"size":813,"mtime":1786084510087,"results":"10609","hashOfConfig":"9493"},{"size":1647,"mtime":1786084510087,"results":"10610","hashOfConfig":"9493"},{"size":644,"mtime":1786084510087,"results":"10611","hashOfConfig":"9493"},{"size":1500,"mtime":1786084510087,"results":"10612","hashOfConfig":"9493"},{"size":1806,"mtime":1786084510087,"results":"10613","hashOfConfig":"9493"},{"size":3625,"mtime":1786084510087,"results":"10614","hashOfConfig":"9493"},{"size":1740,"mtime":1786084510088,"results":"10615","hashOfConfig":"9493"},{"size":7150,"mtime":1786084510088,"results":"10616","hashOfConfig":"9493"},{"size":1216,"mtime":1786084510088,"results":"10617","hashOfConfig":"9493"},{"size":1213,"mtime":1786084510088,"results":"10618","hashOfConfig":"9493"},{"size":971,"mtime":1786084510088,"results":"10619","hashOfConfig":"9493"},{"size":962,"mtime":1786084510088,"results":"10620","hashOfConfig":"9493"},{"size":257,"mtime":1786084510088,"results":"10621","hashOfConfig":"9493"},{"size":806,"mtime":1786084510089,"results":"10622","hashOfConfig":"9493"},{"size":804,"mtime":1786084510089,"results":"10623","hashOfConfig":"9493"},{"size":1583,"mtime":1786084510089,"results":"10624","hashOfConfig":"9493"},{"size":641,"mtime":1786084510089,"results":"10625","hashOfConfig":"9493"},{"size":1491,"mtime":1786084510089,"results":"10626","hashOfConfig":"9493"},{"size":1302,"mtime":1786084510089,"results":"10627","hashOfConfig":"9493"},{"size":969,"mtime":1786084510089,"results":"10628","hashOfConfig":"9493"},{"size":960,"mtime":1786084510090,"results":"10629","hashOfConfig":"9493"},{"size":255,"mtime":1786084510090,"results":"10630","hashOfConfig":"9493"},{"size":802,"mtime":1786084510090,"results":"10631","hashOfConfig":"9493"},{"size":800,"mtime":1786084510090,"results":"10632","hashOfConfig":"9493"},{"size":1575,"mtime":1786084510091,"results":"10633","hashOfConfig":"9493"},{"size":639,"mtime":1786084510091,"results":"10634","hashOfConfig":"9493"},{"size":1485,"mtime":1786084510091,"results":"10635","hashOfConfig":"9493"},{"size":1110,"mtime":1786084510091,"results":"10636","hashOfConfig":"9493"},{"size":741,"mtime":1786084510091,"results":"10637","hashOfConfig":"9493"},{"size":615,"mtime":1786084510092,"results":"10638","hashOfConfig":"9493"},{"size":2992,"mtime":1786084510092,"results":"10639","hashOfConfig":"9493"},{"size":3257,"mtime":1786084510092,"results":"10640","hashOfConfig":"9493"},{"size":5770,"mtime":1786084510092,"results":"10641","hashOfConfig":"9493"},{"size":2193,"mtime":1786084510092,"results":"10642","hashOfConfig":"9493"},{"size":4815,"mtime":1786084510092,"results":"10643","hashOfConfig":"9493"},{"size":4772,"mtime":1786084510093,"results":"10644","hashOfConfig":"9493"},{"size":1009,"mtime":1786084510093,"results":"10645","hashOfConfig":"9493"},{"size":1008,"mtime":1786084510093,"results":"10646","hashOfConfig":"9493"},{"size":4806,"mtime":1786084510093,"results":"10647","hashOfConfig":"9493"},{"size":2285,"mtime":1786084510093,"results":"10648","hashOfConfig":"9493"},{"size":1692,"mtime":1786084510093,"results":"10649","hashOfConfig":"9493"},{"size":57,"mtime":1786084510094,"results":"10650","hashOfConfig":"9493"},{"size":777,"mtime":1786084510094,"results":"10651","hashOfConfig":"9493"},{"size":631,"mtime":1786084510094,"results":"10652","hashOfConfig":"9493"},{"size":1703,"mtime":1786084510094,"results":"10653","hashOfConfig":"9493"},{"size":1772,"mtime":1786084510094,"results":"10654","hashOfConfig":"9493"},{"size":4479,"mtime":1786084510094,"results":"10655","hashOfConfig":"9493"},{"size":3368,"mtime":1786084510095,"results":"10656","hashOfConfig":"9493"},{"size":6472,"mtime":1786084510095,"results":"10657","hashOfConfig":"9493"},{"size":3734,"mtime":1786084510095,"results":"10658","hashOfConfig":"9493"},{"size":3889,"mtime":1786084510095,"results":"10659","hashOfConfig":"9493"},{"size":4094,"mtime":1786084510095,"results":"10660","hashOfConfig":"9493"},{"size":994,"mtime":1786084510096,"results":"10661","hashOfConfig":"9493"},{"size":2066,"mtime":1786084510096,"results":"10662","hashOfConfig":"9493"},{"size":3574,"mtime":1786084510096,"results":"10663","hashOfConfig":"9493"},{"size":2460,"mtime":1786084510096,"results":"10664","hashOfConfig":"9493"},{"size":559,"mtime":1786084510097,"results":"10665","hashOfConfig":"9493"},{"size":2517,"mtime":1786084510097,"results":"10666","hashOfConfig":"9493"},{"size":2062,"mtime":1786084510097,"results":"10667","hashOfConfig":"9493"},{"size":8700,"mtime":1786084510097,"results":"10668","hashOfConfig":"9493"},{"size":5531,"mtime":1786084510098,"results":"10669","hashOfConfig":"9493"},{"size":2586,"mtime":1786084510098,"results":"10670","hashOfConfig":"9493"},{"size":2717,"mtime":1786084510098,"results":"10671","hashOfConfig":"9493"},{"size":3410,"mtime":1786084510098,"results":"10672","hashOfConfig":"9493"},{"size":2449,"mtime":1786084510098,"results":"10673","hashOfConfig":"9493"},{"size":527,"mtime":1786084510099,"results":"10674","hashOfConfig":"9493"},{"size":992,"mtime":1786084510099,"results":"10675","hashOfConfig":"9493"},{"size":1859,"mtime":1786084510099,"results":"10676","hashOfConfig":"9493"},{"size":4086,"mtime":1786084510099,"results":"10677","hashOfConfig":"9493"},{"size":2508,"mtime":1786084510099,"results":"10678","hashOfConfig":"9493"},{"size":5101,"mtime":1786084510099,"results":"10679","hashOfConfig":"9493"},{"size":2558,"mtime":1786084510100,"results":"10680","hashOfConfig":"9493"},{"size":2093,"mtime":1786084510100,"results":"10681","hashOfConfig":"9493"},{"size":1712,"mtime":1786084510100,"results":"10682","hashOfConfig":"9493"},{"size":2187,"mtime":1786084510100,"results":"10683","hashOfConfig":"9493"},{"size":1636,"mtime":1786084510100,"results":"10684","hashOfConfig":"9493"},{"size":706,"mtime":1786084510100,"results":"10685","hashOfConfig":"9493"},{"size":1367,"mtime":1786084510100,"results":"10686","hashOfConfig":"9493"},{"size":5781,"mtime":1786084510101,"results":"10687","hashOfConfig":"9493"},{"size":2643,"mtime":1786084510101,"results":"10688","hashOfConfig":"9493"},{"size":7566,"mtime":1786084510101,"results":"10689","hashOfConfig":"9493"},{"size":14014,"mtime":1786084510101,"results":"10690","hashOfConfig":"9493"},{"size":9648,"mtime":1786084510101,"results":"10691","hashOfConfig":"9493"},{"size":2582,"mtime":1786084510102,"results":"10692","hashOfConfig":"9493"},{"size":9672,"mtime":1786084510102,"results":"10693","hashOfConfig":"9493"},{"size":12589,"mtime":1786084510102,"results":"10694","hashOfConfig":"9493"},{"size":750,"mtime":1786084510102,"results":"10695","hashOfConfig":"9493"},{"size":637,"mtime":1786084510102,"results":"10696","hashOfConfig":"9493"},{"size":869,"mtime":1786084510103,"results":"10697","hashOfConfig":"9493"},{"size":641,"mtime":1786084510103,"results":"10698","hashOfConfig":"9493"},{"size":991,"mtime":1786084510103,"results":"10699","hashOfConfig":"9493"},{"size":2309,"mtime":1786084510103,"results":"10700","hashOfConfig":"9493"},{"size":1014,"mtime":1786084510103,"results":"10701","hashOfConfig":"9493"},{"size":3543,"mtime":1786084510103,"results":"10702","hashOfConfig":"9493"},{"size":708,"mtime":1786084510103,"results":"10703","hashOfConfig":"9493"},{"size":4147,"mtime":1786084510103,"results":"10704","hashOfConfig":"9493"},{"size":1356,"mtime":1786084510104,"results":"10705","hashOfConfig":"9493"},{"size":4356,"mtime":1786084510104,"results":"10706","hashOfConfig":"9493"},{"size":2447,"mtime":1786084510104,"results":"10707","hashOfConfig":"9493"},{"size":1378,"mtime":1786084510104,"results":"10708","hashOfConfig":"9493"},{"size":4076,"mtime":1786084510104,"results":"10709","hashOfConfig":"9493"},{"size":4059,"mtime":1786084510104,"results":"10710","hashOfConfig":"9493"},{"size":20116,"mtime":1786084510104,"results":"10711","hashOfConfig":"9493"},{"size":1823,"mtime":1786084510105,"results":"10712","hashOfConfig":"9493"},{"size":4213,"mtime":1786084510105,"results":"10713","hashOfConfig":"9493"},{"size":1966,"mtime":1786084510105,"results":"10714","hashOfConfig":"9493"},{"size":2239,"mtime":1786084510105,"results":"10715","hashOfConfig":"9493"},{"size":442,"mtime":1786084510105,"results":"10716","hashOfConfig":"9493"},{"size":2789,"mtime":1786084510105,"results":"10717","hashOfConfig":"9493"},{"size":6170,"mtime":1786084510106,"results":"10718","hashOfConfig":"9493"},{"size":5330,"mtime":1786084510106,"results":"10719","hashOfConfig":"9493"},{"size":4791,"mtime":1786084510106,"results":"10720","hashOfConfig":"9493"},{"size":2335,"mtime":1786084510106,"results":"10721","hashOfConfig":"9493"},{"size":1785,"mtime":1786084510106,"results":"10722","hashOfConfig":"9493"},{"size":2115,"mtime":1786084510107,"results":"10723","hashOfConfig":"9493"},{"size":2173,"mtime":1786084510107,"results":"10724","hashOfConfig":"9493"},{"size":2585,"mtime":1786084510107,"results":"10725","hashOfConfig":"9493"},{"size":2247,"mtime":1786084510107,"results":"10726","hashOfConfig":"9493"},{"size":1032,"mtime":1786084510107,"results":"10727","hashOfConfig":"9493"},{"size":2567,"mtime":1786084510107,"results":"10728","hashOfConfig":"9493"},{"size":1585,"mtime":1786084510107,"results":"10729","hashOfConfig":"9493"},{"size":8524,"mtime":1786084510108,"results":"10730","hashOfConfig":"9493"},{"size":1400,"mtime":1786084510108,"results":"10731","hashOfConfig":"9493"},{"size":1717,"mtime":1786084510108,"results":"10732","hashOfConfig":"9493"},{"size":2580,"mtime":1786084510108,"results":"10733","hashOfConfig":"9493"},{"size":1021,"mtime":1786084510108,"results":"10734","hashOfConfig":"9493"},{"size":3031,"mtime":1786084510108,"results":"10735","hashOfConfig":"9493"},{"size":13002,"mtime":1786084510109,"results":"10736","hashOfConfig":"9493"},{"size":383,"mtime":1786084510109,"results":"10737","hashOfConfig":"9493"},{"size":1365,"mtime":1786084510109,"results":"10738","hashOfConfig":"9493"},{"size":1345,"mtime":1786084510109,"results":"10739","hashOfConfig":"9493"},{"size":1139,"mtime":1786084510110,"results":"10740","hashOfConfig":"9493"},{"size":1968,"mtime":1786084510110,"results":"10741","hashOfConfig":"9493"},{"size":2644,"mtime":1786084510110,"results":"10742","hashOfConfig":"9493"},{"size":2002,"mtime":1786084510110,"results":"10743","hashOfConfig":"9493"},{"size":2174,"mtime":1786084510110,"results":"10744","hashOfConfig":"9493"},{"size":871,"mtime":1786084510110,"results":"10745","hashOfConfig":"9493"},{"size":2438,"mtime":1786084510110,"results":"10746","hashOfConfig":"9493"},{"size":1043,"mtime":1786084510111,"results":"10747","hashOfConfig":"9493"},{"size":1011,"mtime":1786084510111,"results":"10748","hashOfConfig":"9493"},{"size":4958,"mtime":1786084510111,"results":"10749","hashOfConfig":"9493"},{"size":1623,"mtime":1786084510111,"results":"10750","hashOfConfig":"9493"},{"size":3285,"mtime":1786084510111,"results":"10751","hashOfConfig":"9493"},{"size":1987,"mtime":1786084510111,"results":"10752","hashOfConfig":"9493"},{"size":5853,"mtime":1786084510112,"results":"10753","hashOfConfig":"9493"},{"size":3375,"mtime":1786084510112,"results":"10754","hashOfConfig":"9493"},{"size":3007,"mtime":1786084510112,"results":"10755","hashOfConfig":"9493"},{"size":3018,"mtime":1786084510112,"results":"10756","hashOfConfig":"9493"},{"size":2211,"mtime":1786084510112,"results":"10757","hashOfConfig":"9493"},{"size":2910,"mtime":1786084510112,"results":"10758","hashOfConfig":"9493"},{"size":1600,"mtime":1786084510113,"results":"10759","hashOfConfig":"9493"},{"size":3043,"mtime":1786084510113,"results":"10760","hashOfConfig":"9493"},{"size":1423,"mtime":1786084510113,"results":"10761","hashOfConfig":"9493"},{"size":2051,"mtime":1786084510113,"results":"10762","hashOfConfig":"9493"},{"size":3339,"mtime":1786084510113,"results":"10763","hashOfConfig":"9493"},{"size":2900,"mtime":1786084510113,"results":"10764","hashOfConfig":"9493"},{"size":5272,"mtime":1786084510114,"results":"10765","hashOfConfig":"9493"},{"size":1851,"mtime":1786084510114,"results":"10766","hashOfConfig":"9493"},{"size":2059,"mtime":1786084510114,"results":"10767","hashOfConfig":"9493"},{"size":710,"mtime":1786084510114,"results":"10768","hashOfConfig":"9493"},{"size":1527,"mtime":1786084510114,"results":"10769","hashOfConfig":"9493"},{"size":1880,"mtime":1786084510114,"results":"10770","hashOfConfig":"9493"},{"size":2178,"mtime":1786084510115,"results":"10771","hashOfConfig":"9493"},{"size":3724,"mtime":1786084510115,"results":"10772","hashOfConfig":"9493"},{"size":1690,"mtime":1786084510115,"results":"10773","hashOfConfig":"9493"},{"size":4239,"mtime":1786084510115,"results":"10774","hashOfConfig":"9493"},{"size":1308,"mtime":1786084510115,"results":"10775","hashOfConfig":"9493"},{"size":1763,"mtime":1786084510115,"results":"10776","hashOfConfig":"9493"},{"size":4722,"mtime":1786084510116,"results":"10777","hashOfConfig":"9493"},{"size":1288,"mtime":1786084510116,"results":"10778","hashOfConfig":"9493"},{"size":6998,"mtime":1786084510116,"results":"10779","hashOfConfig":"9493"},{"size":1883,"mtime":1786084510116,"results":"10780","hashOfConfig":"9493"},{"size":1890,"mtime":1786084510116,"results":"10781","hashOfConfig":"9493"},{"size":635,"mtime":1786084510117,"results":"10782","hashOfConfig":"9493"},{"size":821,"mtime":1786084510117,"results":"10783","hashOfConfig":"9493"},{"size":822,"mtime":1786084510117,"results":"10784","hashOfConfig":"9493"},{"size":1620,"mtime":1786084510117,"results":"10785","hashOfConfig":"9493"},{"size":814,"mtime":1786084510117,"results":"10786","hashOfConfig":"9493"},{"size":636,"mtime":1786084510117,"results":"10787","hashOfConfig":"9493"},{"size":1278,"mtime":1786084510117,"results":"10788","hashOfConfig":"9493"},{"size":900,"mtime":1786084510118,"results":"10789","hashOfConfig":"9493"},{"size":3735,"mtime":1786084510118,"results":"10790","hashOfConfig":"9493"},{"size":1384,"mtime":1786084510118,"results":"10791","hashOfConfig":"9493"},{"size":32641,"mtime":1786084510119,"results":"10792","hashOfConfig":"9493"},{"size":1450,"mtime":1786084510119,"results":"10793","hashOfConfig":"9493"},{"size":2888,"mtime":1786084510119,"results":"10794","hashOfConfig":"9493"},{"size":1142,"mtime":1786084510119,"results":"10795","hashOfConfig":"9493"},{"size":714,"mtime":1786084510119,"results":"10796","hashOfConfig":"9493"},{"size":7038,"mtime":1786084510119,"results":"10797","hashOfConfig":"9493"},{"size":2517,"mtime":1786084510120,"results":"10798","hashOfConfig":"9493"},{"size":1546,"mtime":1786084510120,"results":"10799","hashOfConfig":"9493"},{"size":1261,"mtime":1786084510120,"results":"10800","hashOfConfig":"9493"},{"size":1982,"mtime":1786084510120,"results":"10801","hashOfConfig":"9493"},{"size":1725,"mtime":1786084510120,"results":"10802","hashOfConfig":"9493"},{"size":1705,"mtime":1786084510120,"results":"10803","hashOfConfig":"9493"},{"size":563,"mtime":1786084510121,"results":"10804","hashOfConfig":"9493"},{"size":550,"mtime":1786084510121,"results":"10805","hashOfConfig":"9493"},{"size":1979,"mtime":1786084510121,"results":"10806","hashOfConfig":"9493"},{"size":512,"mtime":1786084510121,"results":"10807","hashOfConfig":"9493"},{"size":1480,"mtime":1786084510121,"results":"10808","hashOfConfig":"9493"},{"size":1092,"mtime":1786084510121,"results":"10809","hashOfConfig":"9493"},{"size":1619,"mtime":1786084510122,"results":"10810","hashOfConfig":"9493"},{"size":5743,"mtime":1786084510122,"results":"10811","hashOfConfig":"9493"},{"size":620,"mtime":1786084510122,"results":"10812","hashOfConfig":"9493"},{"size":4013,"mtime":1786084510122,"results":"10813","hashOfConfig":"9493"},{"size":834,"mtime":1786084510122,"results":"10814","hashOfConfig":"9493"},{"size":3354,"mtime":1786084510122,"results":"10815","hashOfConfig":"9493"},{"size":2139,"mtime":1786084510123,"results":"10816","hashOfConfig":"9493"},{"size":1659,"mtime":1786084510123,"results":"10817","hashOfConfig":"9493"},{"size":910,"mtime":1786084510123,"results":"10818","hashOfConfig":"9493"},{"size":4444,"mtime":1786084510123,"results":"10819","hashOfConfig":"9493"},{"size":4320,"mtime":1786084510123,"results":"10820","hashOfConfig":"9493"},{"size":802,"mtime":1786084510123,"results":"10821","hashOfConfig":"9493"},{"size":1017,"mtime":1786084510123,"results":"10822","hashOfConfig":"9493"},{"size":1966,"mtime":1786084510124,"results":"10823","hashOfConfig":"9493"},{"size":2669,"mtime":1786084510124,"results":"10824","hashOfConfig":"9493"},{"size":2852,"mtime":1786084510124,"results":"10825","hashOfConfig":"9493"},{"size":7247,"mtime":1786084510124,"results":"10826","hashOfConfig":"9493"},{"size":5680,"mtime":1786084510124,"results":"10827","hashOfConfig":"9493"},{"size":1523,"mtime":1786084510125,"results":"10828","hashOfConfig":"9493"},{"size":938,"mtime":1786084510125,"results":"10829","hashOfConfig":"9493"},{"size":4281,"mtime":1786084510125,"results":"10830","hashOfConfig":"9493"},{"size":6375,"mtime":1786084510125,"results":"10831","hashOfConfig":"9493"},{"size":3955,"mtime":1786084510126,"results":"10832","hashOfConfig":"9493"},{"size":1999,"mtime":1786084510126,"results":"10833","hashOfConfig":"9493"},{"size":1562,"mtime":1786084510126,"results":"10834","hashOfConfig":"9493"},{"size":2224,"mtime":1786084510126,"results":"10835","hashOfConfig":"9493"},{"size":986,"mtime":1786084510126,"results":"10836","hashOfConfig":"9493"},{"size":1035,"mtime":1786084510126,"results":"10837","hashOfConfig":"9493"},{"size":1316,"mtime":1786084510127,"results":"10838","hashOfConfig":"9493"},{"size":3466,"mtime":1786084510127,"results":"10839","hashOfConfig":"9493"},{"size":10109,"mtime":1786084510127,"results":"10840","hashOfConfig":"9493"},{"size":1752,"mtime":1786084510127,"results":"10841","hashOfConfig":"9493"},{"size":5031,"mtime":1786084510127,"results":"10842","hashOfConfig":"9493"},{"size":2491,"mtime":1786084510127,"results":"10843","hashOfConfig":"9493"},{"size":4488,"mtime":1786084510128,"results":"10844","hashOfConfig":"9493"},{"size":5588,"mtime":1786084510128,"results":"10845","hashOfConfig":"9493"},{"size":3122,"mtime":1786084510128,"results":"10846","hashOfConfig":"9493"},{"size":1518,"mtime":1786084510128,"results":"10847","hashOfConfig":"9493"},{"size":1978,"mtime":1786084510128,"results":"10848","hashOfConfig":"9493"},{"size":3488,"mtime":1786084510129,"results":"10849","hashOfConfig":"9493"},{"size":20062,"mtime":1786084510129,"results":"10850","hashOfConfig":"9493"},{"size":11571,"mtime":1786084510129,"results":"10851","hashOfConfig":"9493"},{"size":9933,"mtime":1786084510129,"results":"10852","hashOfConfig":"9493"},{"size":4131,"mtime":1786084510130,"results":"10853","hashOfConfig":"9493"},{"size":2870,"mtime":1786084510130,"results":"10854","hashOfConfig":"9493"},{"size":1712,"mtime":1786084510130,"results":"10855","hashOfConfig":"9493"},{"size":706,"mtime":1786084510130,"results":"10856","hashOfConfig":"9493"},{"size":1817,"mtime":1786084510130,"results":"10857","hashOfConfig":"9493"},{"size":1142,"mtime":1786084510130,"results":"10858","hashOfConfig":"9493"},{"size":901,"mtime":1786084510130,"results":"10859","hashOfConfig":"9493"},{"size":2575,"mtime":1786084510131,"results":"10860","hashOfConfig":"9493"},{"size":2095,"mtime":1786084510131,"results":"10861","hashOfConfig":"9493"},{"size":1558,"mtime":1786084510131,"results":"10862","hashOfConfig":"9493"},{"size":6473,"mtime":1786084510131,"results":"10863","hashOfConfig":"9493"},{"size":2862,"mtime":1786084510131,"results":"10864","hashOfConfig":"9493"},{"size":1202,"mtime":1786084510131,"results":"10865","hashOfConfig":"9493"},{"size":1827,"mtime":1786084510131,"results":"10866","hashOfConfig":"9493"},{"size":66949,"mtime":1786084510132,"results":"10867","hashOfConfig":"9493"},{"size":15663,"mtime":1786084510132,"results":"10868","hashOfConfig":"9493"},{"size":2888,"mtime":1786084510132,"results":"10869","hashOfConfig":"9493"},{"size":4454,"mtime":1786084510133,"results":"10870","hashOfConfig":"9493"},{"size":1838,"mtime":1786084510133,"results":"10871","hashOfConfig":"9493"},{"size":4085,"mtime":1786084510133,"results":"10872","hashOfConfig":"9493"},{"size":6606,"mtime":1786084510133,"results":"10873","hashOfConfig":"9493"},{"size":2739,"mtime":1786084510133,"results":"10874","hashOfConfig":"9493"},{"size":10325,"mtime":1786084510133,"results":"10875","hashOfConfig":"9493"},{"size":2613,"mtime":1786084510133,"results":"10876","hashOfConfig":"9493"},{"size":2154,"mtime":1786084510133,"results":"10877","hashOfConfig":"9493"},{"size":3026,"mtime":1786084510133,"results":"10878","hashOfConfig":"9493"},{"size":1676,"mtime":1786084510133,"results":"10879","hashOfConfig":"9493"},{"size":2495,"mtime":1786084510134,"results":"10880","hashOfConfig":"9493"},{"size":965,"mtime":1786084510134,"results":"10881","hashOfConfig":"9493"},{"size":1893,"mtime":1786084510134,"results":"10882","hashOfConfig":"9493"},{"size":2535,"mtime":1786084510134,"results":"10883","hashOfConfig":"9493"},{"size":3968,"mtime":1786084510134,"results":"10884","hashOfConfig":"9493"},{"size":2455,"mtime":1786084510134,"results":"10885","hashOfConfig":"9493"},{"size":6822,"mtime":1786084510134,"results":"10886","hashOfConfig":"9493"},{"size":3434,"mtime":1786084510135,"results":"10887","hashOfConfig":"9493"},{"size":3270,"mtime":1786084510135,"results":"10888","hashOfConfig":"9493"},{"size":4243,"mtime":1786084510135,"results":"10889","hashOfConfig":"9493"},{"size":1926,"mtime":1786084510135,"results":"10890","hashOfConfig":"9493"},{"size":3765,"mtime":1786084510135,"results":"10891","hashOfConfig":"9493"},{"size":4368,"mtime":1786084510135,"results":"10892","hashOfConfig":"9493"},{"size":1230,"mtime":1786084510136,"results":"10893","hashOfConfig":"9493"},{"size":883,"mtime":1786084510136,"results":"10894","hashOfConfig":"9493"},{"size":1561,"mtime":1786084510136,"results":"10895","hashOfConfig":"9493"},{"size":4327,"mtime":1786084510136,"results":"10896","hashOfConfig":"9493"},{"size":12192,"mtime":1786084510136,"results":"10897","hashOfConfig":"9493"},{"size":1244,"mtime":1786084510137,"results":"10898","hashOfConfig":"9493"},{"size":2816,"mtime":1786084510137,"results":"10899","hashOfConfig":"9493"},{"size":13182,"mtime":1786084510137,"results":"10900","hashOfConfig":"9493"},{"size":4121,"mtime":1786084510137,"results":"10901","hashOfConfig":"9493"},{"size":856,"mtime":1786084510137,"results":"10902","hashOfConfig":"9493"},{"size":6309,"mtime":1786084510137,"results":"10903","hashOfConfig":"9493"},{"size":850,"mtime":1786084510137,"results":"10904","hashOfConfig":"9493"},{"size":4648,"mtime":1786084510138,"results":"10905","hashOfConfig":"9493"},{"size":528,"mtime":1786084510138,"results":"10906","hashOfConfig":"9493"},{"size":2096,"mtime":1786084510138,"results":"10907","hashOfConfig":"9493"},{"size":12524,"mtime":1786084510138,"results":"10908","hashOfConfig":"9493"},{"size":5052,"mtime":1786084510138,"results":"10909","hashOfConfig":"9493"},{"size":301,"mtime":1786084510138,"results":"10910","hashOfConfig":"9493"},{"size":10621,"mtime":1786084510139,"results":"10911","hashOfConfig":"9493"},{"size":7988,"mtime":1786084510139,"results":"10912","hashOfConfig":"9493"},{"size":353,"mtime":1786084510139,"results":"10913","hashOfConfig":"9493"},{"size":494,"mtime":1786084510139,"results":"10914","hashOfConfig":"9493"},{"size":1700,"mtime":1786084510140,"results":"10915","hashOfConfig":"9493"},{"size":157,"mtime":1786084510140,"results":"10916","hashOfConfig":"9493"},{"size":138,"mtime":1786084510140,"results":"10917","hashOfConfig":"9493"},{"size":14319,"mtime":1786084510140,"results":"10918","hashOfConfig":"9493"},{"size":376,"mtime":1786084510140,"results":"10919","hashOfConfig":"9493"},{"size":487,"mtime":1786084510140,"results":"10920","hashOfConfig":"9493"},{"size":616,"mtime":1786084510140,"results":"10921","hashOfConfig":"9493"},{"size":419,"mtime":1786084510140,"results":"10922","hashOfConfig":"9493"},{"size":99,"mtime":1786084510140,"results":"10923","hashOfConfig":"9493"},{"size":2152,"mtime":1786084510140,"results":"10924","hashOfConfig":"9493"},{"size":494,"mtime":1786084510141,"results":"10925","hashOfConfig":"9493"},{"size":73,"mtime":1786084510141,"results":"10926","hashOfConfig":"9493"},{"size":14326,"mtime":1786084510141,"results":"10927","hashOfConfig":"9493"},{"size":7770,"mtime":1786084510141,"results":"10928","hashOfConfig":"9493"},{"size":305,"mtime":1786084510141,"results":"10929","hashOfConfig":"9493"},{"size":10589,"mtime":1786084510142,"results":"10930","hashOfConfig":"9493"},{"size":6327,"mtime":1786084510142,"results":"10931","hashOfConfig":"9493"},{"size":353,"mtime":1786084510142,"results":"10932","hashOfConfig":"9493"},{"size":502,"mtime":1786084510142,"results":"10933","hashOfConfig":"9493"},{"size":1708,"mtime":1786084510142,"results":"10934","hashOfConfig":"9493"},{"size":157,"mtime":1786084510142,"results":"10935","hashOfConfig":"9493"},{"size":138,"mtime":1786084510142,"results":"10936","hashOfConfig":"9493"},{"size":1279,"mtime":1786084510142,"results":"10937","hashOfConfig":"9493"},{"size":376,"mtime":1786084510143,"results":"10938","hashOfConfig":"9493"},{"size":495,"mtime":1786084510143,"results":"10939","hashOfConfig":"9493"},{"size":620,"mtime":1786084510143,"results":"10940","hashOfConfig":"9493"},{"size":419,"mtime":1786084510143,"results":"10941","hashOfConfig":"9493"},{"size":128,"mtime":1786084510143,"results":"10942","hashOfConfig":"9493"},{"size":502,"mtime":1786084510143,"results":"10943","hashOfConfig":"9493"},{"size":76,"mtime":1786084510143,"results":"10944","hashOfConfig":"9493"},{"size":10241,"mtime":1786084510143,"results":"10945","hashOfConfig":"9493"},{"size":3234,"mtime":1786084510144,"results":"10946","hashOfConfig":"9493"},{"size":5816,"mtime":1786084510144,"results":"10947","hashOfConfig":"9493"},{"size":4626,"mtime":1786084510144,"results":"10948","hashOfConfig":"9493"},{"size":7764,"mtime":1786084510144,"results":"10949","hashOfConfig":"9493"},{"size":1526,"mtime":1786084510144,"results":"10950","hashOfConfig":"9493"},{"size":1669,"mtime":1786084510144,"results":"10951","hashOfConfig":"9493"},{"size":1537,"mtime":1786084510144,"results":"10952","hashOfConfig":"9493"},{"size":1205,"mtime":1786084510145,"results":"10953","hashOfConfig":"9493"},{"size":1207,"mtime":1786084510145,"results":"10954","hashOfConfig":"9493"},{"size":1409,"mtime":1786084510145,"results":"10955","hashOfConfig":"9493"},{"size":939,"mtime":1786084510145,"results":"10956","hashOfConfig":"9493"},{"size":4935,"mtime":1786084510145,"results":"10957","hashOfConfig":"9493"},{"size":935,"mtime":1786084510145,"results":"10958","hashOfConfig":"9493"},{"size":1155,"mtime":1786084510146,"results":"10959","hashOfConfig":"9493"},{"size":4450,"mtime":1786084510146,"results":"10960","hashOfConfig":"9493"},{"size":5578,"mtime":1786084510146,"results":"10961","hashOfConfig":"9493"},{"size":3447,"mtime":1786084510146,"results":"10962","hashOfConfig":"9493"},{"size":1422,"mtime":1786084510146,"results":"10963","hashOfConfig":"9493"},{"size":504,"mtime":1786084510146,"results":"10964","hashOfConfig":"9493"},{"size":3043,"mtime":1786084510146,"results":"10965","hashOfConfig":"9493"},{"size":3889,"mtime":1786084510147,"results":"10966","hashOfConfig":"9493"},{"size":6587,"mtime":1786084510147,"results":"10967","hashOfConfig":"9493"},{"size":7742,"mtime":1786084510147,"results":"10968","hashOfConfig":"9493"},{"size":596,"mtime":1786084510147,"results":"10969","hashOfConfig":"9493"},{"size":4617,"mtime":1786084510147,"results":"10970","hashOfConfig":"9493"},{"size":153,"mtime":1786084510148,"results":"10971","hashOfConfig":"9493"},{"size":657,"mtime":1786084510148,"results":"10972","hashOfConfig":"9493"},{"size":10698,"mtime":1786084510148,"results":"10973","hashOfConfig":"9493"},{"size":2147,"mtime":1786084510148,"results":"10974","hashOfConfig":"9493"},{"size":1809,"mtime":1786084510148,"results":"10975","hashOfConfig":"9493"},{"size":1546,"mtime":1786084510148,"results":"10976","hashOfConfig":"9493"},{"size":7120,"mtime":1786084510149,"results":"10977","hashOfConfig":"9493"},{"size":4653,"mtime":1786084510149,"results":"10978","hashOfConfig":"9493"},{"size":2810,"mtime":1786084510149,"results":"10979","hashOfConfig":"9493"},{"size":1427,"mtime":1786084510149,"results":"10980","hashOfConfig":"9493"},{"size":8760,"mtime":1786084510149,"results":"10981","hashOfConfig":"9493"},{"size":2786,"mtime":1786084510149,"results":"10982","hashOfConfig":"9493"},{"size":773,"mtime":1786084510150,"results":"10983","hashOfConfig":"9493"},{"size":1904,"mtime":1786084510150,"results":"10984","hashOfConfig":"9493"},{"size":4254,"mtime":1786084510150,"results":"10985","hashOfConfig":"9493"},{"size":6419,"mtime":1786084510150,"results":"10986","hashOfConfig":"9493"},{"size":4751,"mtime":1786084510151,"results":"10987","hashOfConfig":"9493"},{"size":5396,"mtime":1786084510151,"results":"10988","hashOfConfig":"9493"},{"size":2543,"mtime":1786084510151,"results":"10989","hashOfConfig":"9493"},{"size":3330,"mtime":1786084510151,"results":"10990","hashOfConfig":"9493"},{"size":4855,"mtime":1786084510151,"results":"10991","hashOfConfig":"9493"},{"size":4675,"mtime":1786084510151,"results":"10992","hashOfConfig":"9493"},{"size":6657,"mtime":1786084510151,"results":"10993","hashOfConfig":"9493"},{"size":173,"mtime":1786084510151,"results":"10994","hashOfConfig":"9493"},{"size":13903,"mtime":1786084510152,"results":"10995","hashOfConfig":"9493"},{"size":2296,"mtime":1786084510152,"results":"10996","hashOfConfig":"9493"},{"size":1320,"mtime":1786084510152,"results":"10997","hashOfConfig":"9493"},{"size":1692,"mtime":1786084510152,"results":"10998","hashOfConfig":"9493"},{"size":2530,"mtime":1786084510152,"results":"10999","hashOfConfig":"9493"},{"size":110,"mtime":1786084510152,"results":"11000","hashOfConfig":"9493"},{"size":5722,"mtime":1786084510152,"results":"11001","hashOfConfig":"9493"},{"size":6045,"mtime":1786084510153,"results":"11002","hashOfConfig":"9493"},{"size":3264,"mtime":1786084510153,"results":"11003","hashOfConfig":"9493"},{"size":6509,"mtime":1786084510153,"results":"11004","hashOfConfig":"11005"},{"size":4433,"mtime":1786084510153,"results":"11006","hashOfConfig":"11005"},{"size":505,"mtime":1786084510153,"results":"11007","hashOfConfig":"11005"},{"size":3704,"mtime":1786084510153,"results":"11008","hashOfConfig":"11005"},{"size":7630,"mtime":1786084510153,"results":"11009","hashOfConfig":"11005"},{"size":11585,"mtime":1786084510154,"results":"11010","hashOfConfig":"11005"},{"size":3351,"mtime":1786084510154,"results":"11011","hashOfConfig":"11005"},{"size":7713,"mtime":1786084510154,"results":"11012","hashOfConfig":"11005"},{"size":2740,"mtime":1786084510154,"results":"11013","hashOfConfig":"11005"},{"size":19205,"mtime":1786084510154,"results":"11014","hashOfConfig":"11005"},{"size":7745,"mtime":1786084510154,"results":"11015","hashOfConfig":"11005"},{"size":3952,"mtime":1786084510155,"results":"11016","hashOfConfig":"11005"},{"size":5247,"mtime":1786084510155,"results":"11017","hashOfConfig":"11005"},{"size":1210,"mtime":1786084510155,"results":"11018","hashOfConfig":"11005"},{"size":8827,"mtime":1786084510155,"results":"11019","hashOfConfig":"11005"},{"size":1841,"mtime":1786084510155,"results":"11020","hashOfConfig":"11005"},{"size":8958,"mtime":1786084510155,"results":"11021","hashOfConfig":"11005"},{"size":5372,"mtime":1786084510155,"results":"11022","hashOfConfig":"11005"},{"size":3566,"mtime":1786084510155,"results":"11023","hashOfConfig":"11005"},{"size":7186,"mtime":1786084510156,"results":"11024","hashOfConfig":"11005"},{"size":23200,"mtime":1786084510156,"results":"11025","hashOfConfig":"11005"},{"size":3498,"mtime":1786084510156,"results":"11026","hashOfConfig":"11005"},{"size":2056,"mtime":1786084510156,"results":"11027","hashOfConfig":"11005"},{"size":5214,"mtime":1786084510156,"results":"11028","hashOfConfig":"11005"},{"size":3401,"mtime":1786084510157,"results":"11029","hashOfConfig":"11005"},{"size":18016,"mtime":1786084510157,"results":"11030","hashOfConfig":"11005"},{"size":3088,"mtime":1786084510157,"results":"11031","hashOfConfig":"11005"},{"size":3064,"mtime":1786084510157,"results":"11032","hashOfConfig":"11005"},{"size":1618,"mtime":1786084510157,"results":"11033","hashOfConfig":"11005"},{"size":1785,"mtime":1786084510157,"results":"11034","hashOfConfig":"11005"},{"size":5734,"mtime":1786084510656,"results":"11035","hashOfConfig":"11005"},{"size":28861,"mtime":1786084510657,"results":"11036","hashOfConfig":"11005"},{"size":772,"mtime":1786084510657,"results":"11037","hashOfConfig":"11005"},{"size":1758,"mtime":1786084510659,"results":"11038","hashOfConfig":"11005"},{"size":5084,"mtime":1786084510659,"results":"11039","hashOfConfig":"11005"},{"size":5012,"mtime":1786084510659,"results":"11040","hashOfConfig":"11005"},{"size":2058,"mtime":1786084510659,"results":"11041","hashOfConfig":"11005"},{"size":6796,"mtime":1786084510660,"results":"11042","hashOfConfig":"11005"},{"size":4622,"mtime":1786084510660,"results":"11043","hashOfConfig":"11005"},{"size":3292,"mtime":1786084510660,"results":"11044","hashOfConfig":"11005"},{"size":3961,"mtime":1786084510660,"results":"11045","hashOfConfig":"11005"},{"size":2038,"mtime":1786084510660,"results":"11046","hashOfConfig":"11005"},{"size":6618,"mtime":1786084510660,"results":"11047","hashOfConfig":"11005"},{"size":2163,"mtime":1786084510661,"results":"11048","hashOfConfig":"11005"},{"size":336,"mtime":1786084510661,"results":"11049","hashOfConfig":"11005"},{"size":5498,"mtime":1786084510661,"results":"11050","hashOfConfig":"11005"},{"size":9117,"mtime":1786084510661,"results":"11051","hashOfConfig":"11005"},{"size":8186,"mtime":1786084510662,"results":"11052","hashOfConfig":"11005"},{"size":8680,"mtime":1786084510662,"results":"11053","hashOfConfig":"11005"},{"size":13191,"mtime":1786084510662,"results":"11054","hashOfConfig":"11005"},{"size":6375,"mtime":1786084510662,"results":"11055","hashOfConfig":"11005"},{"size":1163,"mtime":1786084510663,"results":"11056","hashOfConfig":"11005"},{"size":2843,"mtime":1786084510663,"results":"11057","hashOfConfig":"11005"},{"size":2872,"mtime":1786084510663,"results":"11058","hashOfConfig":"11005"},{"size":1297,"mtime":1786084510663,"results":"11059","hashOfConfig":"11005"},{"size":1350,"mtime":1786084510663,"results":"11060","hashOfConfig":"11005"},{"size":20841,"mtime":1786084510664,"results":"11061","hashOfConfig":"11005"},{"size":4664,"mtime":1786084510664,"results":"11062","hashOfConfig":"11005"},{"size":205,"mtime":1786084510665,"results":"11063","hashOfConfig":"11005"},{"size":4132,"mtime":1786084510665,"results":"11064","hashOfConfig":"11005"},{"size":1462,"mtime":1786084510665,"results":"11065","hashOfConfig":"11005"},{"size":6647,"mtime":1786084510665,"results":"11066","hashOfConfig":"11005"},{"size":549,"mtime":1786084510665,"results":"11067","hashOfConfig":"11005"},{"size":18113,"mtime":1786084510666,"results":"11068","hashOfConfig":"11005"},{"size":2982,"mtime":1786084510666,"results":"11069","hashOfConfig":"11005"},{"size":1771,"mtime":1786084510666,"results":"11070","hashOfConfig":"11005"},{"size":4058,"mtime":1786084510666,"results":"11071","hashOfConfig":"11005"},{"size":3881,"mtime":1786084510666,"results":"11072","hashOfConfig":"11005"},{"size":4633,"mtime":1786084510667,"results":"11073","hashOfConfig":"11005"},{"size":7787,"mtime":1786084510667,"results":"11074","hashOfConfig":"11005"},{"size":1877,"mtime":1786084510667,"results":"11075","hashOfConfig":"11005"},{"size":2254,"mtime":1786084510667,"results":"11076","hashOfConfig":"11005"},{"size":1442,"mtime":1786084510667,"results":"11077","hashOfConfig":"11005"},{"size":3485,"mtime":1786084510668,"results":"11078","hashOfConfig":"11005"},{"size":4811,"mtime":1786084510668,"results":"11079","hashOfConfig":"11005"},{"size":685,"mtime":1786084510668,"results":"11080","hashOfConfig":"11005"},{"size":918,"mtime":1786084510668,"results":"11081","hashOfConfig":"11005"},{"size":739,"mtime":1786084510668,"results":"11082","hashOfConfig":"11005"},{"size":5807,"mtime":1786084510668,"results":"11083","hashOfConfig":"11005"},{"size":4709,"mtime":1786084510669,"results":"11084","hashOfConfig":"11005"},{"size":11588,"mtime":1786084510669,"results":"11085","hashOfConfig":"11005"},{"size":7945,"mtime":1786084510669,"results":"11086","hashOfConfig":"11005"},{"size":3822,"mtime":1786084510669,"results":"11087","hashOfConfig":"11005"},{"size":15157,"mtime":1786084510670,"results":"11088","hashOfConfig":"11005"},{"size":3490,"mtime":1786084510670,"results":"11089","hashOfConfig":"11005"},{"size":2891,"mtime":1786084510670,"results":"11090","hashOfConfig":"11005"},{"size":682,"mtime":1786084510670,"results":"11091","hashOfConfig":"11005"},{"size":608,"mtime":1786084510671,"results":"11092","hashOfConfig":"11005"},{"size":808,"mtime":1786084510671,"results":"11093","hashOfConfig":"11005"},{"size":861,"mtime":1786084510671,"results":"11094","hashOfConfig":"11005"},{"size":7500,"mtime":1786084510671,"results":"11095","hashOfConfig":"11005"},{"size":1049,"mtime":1786084510671,"results":"11096","hashOfConfig":"11005"},{"size":1377,"mtime":1786084510671,"results":"11097","hashOfConfig":"11005"},{"size":3894,"mtime":1786084510671,"results":"11098","hashOfConfig":"11005"},{"size":601,"mtime":1786084510671,"results":"11099","hashOfConfig":"11005"},{"size":17131,"mtime":1786084510672,"results":"11100","hashOfConfig":"11005"},{"size":1066,"mtime":1786084510672,"results":"11101","hashOfConfig":"11005"},{"size":2114,"mtime":1786084510672,"results":"11102","hashOfConfig":"11005"},{"size":6557,"mtime":1786084510672,"results":"11103","hashOfConfig":"11005"},{"size":1594,"mtime":1786084510673,"results":"11104","hashOfConfig":"11005"},{"size":3817,"mtime":1786084510673,"results":"11105","hashOfConfig":"11005"},{"size":4109,"mtime":1786084510673,"results":"11106","hashOfConfig":"11005"},{"size":7192,"mtime":1786084510673,"results":"11107","hashOfConfig":"11005"},{"size":3759,"mtime":1786084510674,"results":"11108","hashOfConfig":"11005"},{"size":11442,"mtime":1786084510674,"results":"11109","hashOfConfig":"11005"},{"size":3934,"mtime":1786084510674,"results":"11110","hashOfConfig":"11005"},{"size":2637,"mtime":1786084510674,"results":"11111","hashOfConfig":"11005"},{"size":2979,"mtime":1786084510674,"results":"11112","hashOfConfig":"11005"},{"size":3982,"mtime":1786084510674,"results":"11113","hashOfConfig":"11005"},{"size":200,"mtime":1786084510674,"results":"11114","hashOfConfig":"11005"},{"size":315,"mtime":1786084510675,"results":"11115","hashOfConfig":"11005"},{"size":1040,"mtime":1786084510675,"results":"11116","hashOfConfig":"11005"},{"size":2235,"mtime":1786084510675,"results":"11117","hashOfConfig":"11005"},{"size":1102,"mtime":1786084510675,"results":"11118","hashOfConfig":"11005"},{"size":8300,"mtime":1786084510675,"results":"11119","hashOfConfig":"11005"},{"size":25952,"mtime":1786084510676,"results":"11120","hashOfConfig":"11005"},{"size":3704,"mtime":1786084510676,"results":"11121","hashOfConfig":"11005"},{"size":12608,"mtime":1786084510676,"results":"11122","hashOfConfig":"11005"},{"size":27765,"mtime":1786084510677,"results":"11123","hashOfConfig":"11005"},{"size":6084,"mtime":1786084510677,"results":"11124","hashOfConfig":"11005"},{"size":5468,"mtime":1786084510677,"results":"11125","hashOfConfig":"11005"},{"size":9401,"mtime":1786084510677,"results":"11126","hashOfConfig":"11005"},{"size":7413,"mtime":1786084510677,"results":"11127","hashOfConfig":"11005"},{"size":2337,"mtime":1786084510678,"results":"11128","hashOfConfig":"11005"},{"size":3539,"mtime":1786084510678,"results":"11129","hashOfConfig":"11005"},{"size":13647,"mtime":1786084510678,"results":"11130","hashOfConfig":"11005"},{"size":8704,"mtime":1786084510678,"results":"11131","hashOfConfig":"11005"},{"size":18887,"mtime":1786084510679,"results":"11132","hashOfConfig":"11005"},{"size":2352,"mtime":1786084510679,"results":"11133","hashOfConfig":"11005"},{"size":3023,"mtime":1786084510679,"results":"11134","hashOfConfig":"11005"},{"size":1761,"mtime":1786084510679,"results":"11135","hashOfConfig":"11005"},{"size":3405,"mtime":1786084510679,"results":"11136","hashOfConfig":"11005"},{"size":18437,"mtime":1786084510680,"results":"11137","hashOfConfig":"11005"},{"size":10487,"mtime":1786084510680,"results":"11138","hashOfConfig":"11005"},{"size":3086,"mtime":1786084510680,"results":"11139","hashOfConfig":"11005"},{"size":5551,"mtime":1786084510680,"results":"11140","hashOfConfig":"11005"},{"size":6975,"mtime":1786084510681,"results":"11141","hashOfConfig":"11005"},{"size":2337,"mtime":1786084510681,"results":"11142","hashOfConfig":"11005"},{"size":13300,"mtime":1786084510681,"results":"11143","hashOfConfig":"11005"},{"size":7349,"mtime":1786084510682,"results":"11144","hashOfConfig":"11005"},{"size":15790,"mtime":1786084510682,"results":"11145","hashOfConfig":"11005"},{"size":5997,"mtime":1786084510682,"results":"11146","hashOfConfig":"11005"},{"size":10971,"mtime":1786084510683,"results":"11147","hashOfConfig":"11005"},{"size":3691,"mtime":1786084510683,"results":"11148","hashOfConfig":"11005"},{"size":17834,"mtime":1786084510684,"results":"11149","hashOfConfig":"11150"},{"size":1068,"mtime":1786084510684,"results":"11151","hashOfConfig":"11150"},{"size":5906,"mtime":1786084510684,"results":"11152","hashOfConfig":"11150"},{"size":1435,"mtime":1786084510685,"results":"11153","hashOfConfig":"11150"},{"size":4065,"mtime":1786084510685,"results":"11154","hashOfConfig":"11150"},{"size":11637,"mtime":1786084510685,"results":"11155","hashOfConfig":"11150"},{"size":1678,"mtime":1786084510685,"results":"11156","hashOfConfig":"11150"},{"size":4735,"mtime":1786084510685,"results":"11157","hashOfConfig":"11150"},{"size":9614,"mtime":1786084510686,"results":"11158","hashOfConfig":"11150"},{"size":1007,"mtime":1786084510686,"results":"11159","hashOfConfig":"11150"},{"size":2308,"mtime":1786084510686,"results":"11160","hashOfConfig":"11150"},{"size":2569,"mtime":1786084510686,"results":"11161","hashOfConfig":"11150"},{"size":3555,"mtime":1786084510686,"results":"11162","hashOfConfig":"11150"},{"size":2412,"mtime":1786084510687,"results":"11163","hashOfConfig":"11150"},{"size":3113,"mtime":1786084510687,"results":"11164","hashOfConfig":"11150"},{"size":9800,"mtime":1786084510687,"results":"11165","hashOfConfig":"11150"},{"size":2203,"mtime":1786084510687,"results":"11166","hashOfConfig":"11150"},{"size":5556,"mtime":1786084510688,"results":"11167","hashOfConfig":"11150"},{"size":4947,"mtime":1786084510689,"results":"11168","hashOfConfig":"11150"},{"size":584,"mtime":1786084510689,"results":"11169","hashOfConfig":"11150"},{"size":56768,"mtime":1786084510688,"results":"11170","hashOfConfig":"11150"},{"size":3968,"mtime":1786084510689,"results":"11171","hashOfConfig":"11150"},{"size":24364,"mtime":1786084510690,"results":"11172","hashOfConfig":"11150"},{"size":13071,"mtime":1786084510690,"results":"11173","hashOfConfig":"11150"},{"size":7638,"mtime":1786084510690,"results":"11174","hashOfConfig":"11150"},{"size":2783,"mtime":1786084510690,"results":"11175","hashOfConfig":"11150"},{"size":5409,"mtime":1786084510691,"results":"11176","hashOfConfig":"11150"},{"size":4032,"mtime":1786084510691,"results":"11177","hashOfConfig":"11150"},{"size":4260,"mtime":1786084510691,"results":"11178","hashOfConfig":"11150"},{"size":2680,"mtime":1786084510692,"results":"11179","hashOfConfig":"11150"},{"size":25357,"mtime":1786084510692,"results":"11180","hashOfConfig":"11150"},{"size":4931,"mtime":1786084510692,"results":"11181","hashOfConfig":"11150"},{"size":4152,"mtime":1786084510693,"results":"11182","hashOfConfig":"11150"},{"size":4522,"mtime":1786084510693,"results":"11183","hashOfConfig":"11150"},{"size":6487,"mtime":1786084510693,"results":"11184","hashOfConfig":"11150"},{"size":32468,"mtime":1786084510694,"results":"11185","hashOfConfig":"11150"},{"size":23101,"mtime":1786084510694,"results":"11186","hashOfConfig":"11150"},{"size":3541,"mtime":1786084510695,"results":"11187","hashOfConfig":"11150"},{"size":16276,"mtime":1786084510695,"results":"11188","hashOfConfig":"11150"},{"size":3164,"mtime":1786084510695,"results":"11189","hashOfConfig":"11150"},{"size":2794,"mtime":1786084510695,"results":"11190","hashOfConfig":"11150"},{"size":3901,"mtime":1786084510696,"results":"11191","hashOfConfig":"11150"},{"size":9838,"mtime":1786084510696,"results":"11192","hashOfConfig":"11150"},{"size":58948,"mtime":1786084510697,"results":"11193","hashOfConfig":"11150"},{"size":2714,"mtime":1786084510697,"results":"11194","hashOfConfig":"11150"},{"size":10048,"mtime":1786084510698,"results":"11195","hashOfConfig":"11150"},{"size":6244,"mtime":1786084510698,"results":"11196","hashOfConfig":"11150"},{"size":3615,"mtime":1786084510698,"results":"11197","hashOfConfig":"11150"},{"size":5668,"mtime":1786084510698,"results":"11198","hashOfConfig":"11150"},{"size":20149,"mtime":1786084510699,"results":"11199","hashOfConfig":"11150"},{"size":11852,"mtime":1786084510699,"results":"11200","hashOfConfig":"11150"},{"size":23963,"mtime":1786084510700,"results":"11201","hashOfConfig":"11150"},{"size":2467,"mtime":1786084510700,"results":"11202","hashOfConfig":"11150"},{"size":5031,"mtime":1786084510700,"results":"11203","hashOfConfig":"11150"},{"size":14925,"mtime":1786084510700,"results":"11204","hashOfConfig":"11150"},{"size":3971,"mtime":1786084510701,"results":"11205","hashOfConfig":"11150"},{"size":18078,"mtime":1786084510701,"results":"11206","hashOfConfig":"11150"},{"size":17263,"mtime":1786084510702,"results":"11207","hashOfConfig":"11150"},{"size":2710,"mtime":1786084510702,"results":"11208","hashOfConfig":"11150"},{"size":4977,"mtime":1786084510702,"results":"11209","hashOfConfig":"11150"},{"size":8761,"mtime":1786084510702,"results":"11210","hashOfConfig":"11150"},{"size":14230,"mtime":1786084510703,"results":"11211","hashOfConfig":"11150"},{"size":1333,"mtime":1786084510703,"results":"11212","hashOfConfig":"11150"},{"size":4349,"mtime":1786084510703,"results":"11213","hashOfConfig":"11150"},{"size":7227,"mtime":1786084510703,"results":"11214","hashOfConfig":"11150"},{"size":4163,"mtime":1786084510705,"results":"11215","hashOfConfig":"11150"},{"size":6939,"mtime":1786084510705,"results":"11216","hashOfConfig":"11150"},{"size":40729,"mtime":1786084510705,"results":"11217","hashOfConfig":"11150"},{"size":4166,"mtime":1786084510725,"results":"11218","hashOfConfig":"11150"},{"size":1341,"mtime":1786084510725,"results":"11219","hashOfConfig":"11150"},{"size":4752,"mtime":1786084510725,"results":"11220","hashOfConfig":"11150"},{"size":6917,"mtime":1786084510725,"results":"11221","hashOfConfig":"11150"},{"size":5736,"mtime":1786084510726,"results":"11222","hashOfConfig":"11150"},{"size":4366,"mtime":1786084510727,"results":"11223","hashOfConfig":"11150"},{"size":9273,"mtime":1786084510727,"results":"11224","hashOfConfig":"11150"},{"size":1134,"mtime":1786084510727,"results":"11225","hashOfConfig":"11150"},{"size":728,"mtime":1786084510727,"results":"11226","hashOfConfig":"11150"},{"size":3879,"mtime":1786084510727,"results":"11227","hashOfConfig":"11150"},{"size":36914,"mtime":1786084510726,"results":"11228","hashOfConfig":"11150"},{"size":1325,"mtime":1786084510727,"results":"11229","hashOfConfig":"11150"},{"size":8059,"mtime":1786084510728,"results":"11230","hashOfConfig":"11150"},{"size":2552,"mtime":1786084510728,"results":"11231","hashOfConfig":"11150"},{"size":8954,"mtime":1786084510728,"results":"11232","hashOfConfig":"11150"},{"size":10316,"mtime":1786084510729,"results":"11233","hashOfConfig":"11150"},{"size":8627,"mtime":1786084510729,"results":"11234","hashOfConfig":"11150"},{"size":5097,"mtime":1786084510729,"results":"11235","hashOfConfig":"11150"},{"size":2930,"mtime":1786084510729,"results":"11236","hashOfConfig":"11150"},{"size":7746,"mtime":1786084510730,"results":"11237","hashOfConfig":"11150"},{"size":3379,"mtime":1786084510730,"results":"11238","hashOfConfig":"11150"},{"size":8376,"mtime":1786084510730,"results":"11239","hashOfConfig":"11150"},{"size":4767,"mtime":1786084510731,"results":"11240","hashOfConfig":"11150"},{"size":1854,"mtime":1786084510731,"results":"11241","hashOfConfig":"11150"},{"size":4564,"mtime":1786084510731,"results":"11242","hashOfConfig":"11150"},{"size":2026,"mtime":1786084510731,"results":"11243","hashOfConfig":"11150"},{"size":4445,"mtime":1786084510733,"results":"11244","hashOfConfig":"11150"},{"size":5139,"mtime":1786084510733,"results":"11245","hashOfConfig":"11150"},{"size":6899,"mtime":1786084510733,"results":"11246","hashOfConfig":"11150"},{"size":4307,"mtime":1786084510734,"results":"11247","hashOfConfig":"11150"},{"size":6651,"mtime":1786084510734,"results":"11248","hashOfConfig":"11150"},{"size":8108,"mtime":1786084510735,"results":"11249","hashOfConfig":"11150"},{"size":3141,"mtime":1786084510735,"results":"11250","hashOfConfig":"11150"},{"size":35241,"mtime":1786084510733,"results":"11251","hashOfConfig":"11150"},{"size":2810,"mtime":1786084510736,"results":"11252","hashOfConfig":"11150"},{"size":8734,"mtime":1786084510736,"results":"11253","hashOfConfig":"11150"},{"size":398,"mtime":1786084510737,"results":"11254","hashOfConfig":"11150"},{"size":11800,"mtime":1786084510738,"results":"11255","hashOfConfig":"11150"},{"size":2267,"mtime":1786084510738,"results":"11256","hashOfConfig":"11150"},{"size":31401,"mtime":1786084510736,"results":"11257","hashOfConfig":"11150"},{"size":2128,"mtime":1786084510738,"results":"11258","hashOfConfig":"11150"},{"size":1333,"mtime":1786084510738,"results":"11259","hashOfConfig":"11150"},{"size":2417,"mtime":1786084510738,"results":"11260","hashOfConfig":"11150"},{"size":9032,"mtime":1786084510739,"results":"11261","hashOfConfig":"11150"},{"size":4200,"mtime":1786084510739,"results":"11262","hashOfConfig":"11150"},{"size":3833,"mtime":1786084510739,"results":"11263","hashOfConfig":"11150"},{"size":21417,"mtime":1786084510739,"results":"11264","hashOfConfig":"11150"},{"size":10646,"mtime":1786084510740,"results":"11265","hashOfConfig":"11150"},{"size":6324,"mtime":1786084510740,"results":"11266","hashOfConfig":"11150"},{"size":3897,"mtime":1786084510740,"results":"11267","hashOfConfig":"11150"},{"size":10479,"mtime":1786084510740,"results":"11268","hashOfConfig":"11150"},{"size":8419,"mtime":1786084510740,"results":"11269","hashOfConfig":"11150"},{"size":9291,"mtime":1786084510741,"results":"11270","hashOfConfig":"11150"},{"size":1111,"mtime":1786084510741,"results":"11271","hashOfConfig":"11150"},{"size":16675,"mtime":1786084510741,"results":"11272","hashOfConfig":"11150"},{"size":862,"mtime":1786084510741,"results":"11273","hashOfConfig":"11150"},{"size":11341,"mtime":1786084510742,"results":"11274","hashOfConfig":"11150"},{"size":1028,"mtime":1786084510742,"results":"11275","hashOfConfig":"11150"},{"size":10881,"mtime":1786084510742,"results":"11276","hashOfConfig":"11150"},{"size":8023,"mtime":1786084510743,"results":"11277","hashOfConfig":"11150"},{"size":14258,"mtime":1786084510743,"results":"11278","hashOfConfig":"11150"},{"size":797,"mtime":1786084510743,"results":"11279","hashOfConfig":"11150"},{"size":3505,"mtime":1786084510744,"results":"11280","hashOfConfig":"11150"},{"size":2585,"mtime":1786084510744,"results":"11281","hashOfConfig":"11150"},{"size":6840,"mtime":1786084510744,"results":"11282","hashOfConfig":"11150"},{"size":6931,"mtime":1786084510746,"results":"11283","hashOfConfig":"11150"},{"size":1400,"mtime":1786084510746,"results":"11284","hashOfConfig":"11150"},{"size":3015,"mtime":1786084510746,"results":"11285","hashOfConfig":"11150"},{"size":8512,"mtime":1786084510746,"results":"11286","hashOfConfig":"11150"},{"size":288,"mtime":1786084510747,"results":"11287","hashOfConfig":"11150"},{"size":31167,"mtime":1786084510745,"results":"11288","hashOfConfig":"11150"},{"size":2036,"mtime":1786084510747,"results":"11289","hashOfConfig":"11150"},{"size":782,"mtime":1786084510747,"results":"11290","hashOfConfig":"11150"},{"size":2175,"mtime":1786084510747,"results":"11291","hashOfConfig":"11150"},{"size":5039,"mtime":1786084510747,"results":"11292","hashOfConfig":"11150"},{"size":3026,"mtime":1786084510747,"results":"11293","hashOfConfig":"11150"},{"size":11050,"mtime":1786084510748,"results":"11294","hashOfConfig":"11150"},{"size":8766,"mtime":1786084510748,"results":"11295","hashOfConfig":"11150"},{"size":7644,"mtime":1786084510749,"results":"11296","hashOfConfig":"11150"},{"size":27679,"mtime":1786084510748,"results":"11297","hashOfConfig":"11150"},{"size":2473,"mtime":1786084510749,"results":"11298","hashOfConfig":"11150"},{"size":677,"mtime":1786084510749,"results":"11299","hashOfConfig":"11150"},{"size":10719,"mtime":1786084510749,"results":"11300","hashOfConfig":"11150"},{"size":12567,"mtime":1786084510749,"results":"11301","hashOfConfig":"11150"},{"size":1993,"mtime":1786084510750,"results":"11302","hashOfConfig":"11150"},{"size":2511,"mtime":1786084510750,"results":"11303","hashOfConfig":"11150"},{"size":5183,"mtime":1786084510750,"results":"11304","hashOfConfig":"11150"},{"size":3707,"mtime":1786084510750,"results":"11305","hashOfConfig":"11005"},{"size":2552,"mtime":1786084510751,"results":"11306","hashOfConfig":"11005"},{"size":2235,"mtime":1786084510751,"results":"11307","hashOfConfig":"11005"},{"size":1300,"mtime":1786084510751,"results":"11308","hashOfConfig":"11005"},{"size":1544,"mtime":1786084510751,"results":"11309","hashOfConfig":"11005"},{"size":1205,"mtime":1786084510751,"results":"11310","hashOfConfig":"11005"},{"size":13343,"mtime":1786084510752,"results":"11311","hashOfConfig":"11005"},{"size":5259,"mtime":1786084510752,"results":"11312","hashOfConfig":"11005"},{"size":20068,"mtime":1786084510753,"results":"11313","hashOfConfig":"11005"},{"size":8421,"mtime":1786084510753,"results":"11314","hashOfConfig":"11005"},{"size":9306,"mtime":1786084510753,"results":"11315","hashOfConfig":"11005"},{"size":4148,"mtime":1786084510754,"results":"11316","hashOfConfig":"11005"},{"size":5630,"mtime":1786084510754,"results":"11317","hashOfConfig":"11005"},{"size":13641,"mtime":1786084510754,"results":"11318","hashOfConfig":"11005"},{"size":1753,"mtime":1786084510754,"results":"11319","hashOfConfig":"11005"},{"size":747,"mtime":1786084510755,"results":"11320","hashOfConfig":"11005"},{"size":3695,"mtime":1786084510755,"results":"11321","hashOfConfig":"11005"},{"size":4021,"mtime":1786084510755,"results":"11322","hashOfConfig":"11005"},{"size":4719,"mtime":1786084510755,"results":"11323","hashOfConfig":"11005"},{"size":5835,"mtime":1786084510755,"results":"11324","hashOfConfig":"11005"},{"size":2087,"mtime":1786084510755,"results":"11325","hashOfConfig":"11005"},{"size":888,"mtime":1786084510756,"results":"11326","hashOfConfig":"11005"},{"size":5025,"mtime":1786084510756,"results":"11327","hashOfConfig":"11005"},{"size":4982,"mtime":1786084510756,"results":"11328","hashOfConfig":"11005"},{"size":16507,"mtime":1786084510756,"results":"11329","hashOfConfig":"11005"},{"size":5769,"mtime":1786084510757,"results":"11330","hashOfConfig":"11005"},{"size":924,"mtime":1786084510757,"results":"11331","hashOfConfig":"11005"},{"size":3412,"mtime":1786084510757,"results":"11332","hashOfConfig":"11005"},{"size":2176,"mtime":1786084510757,"results":"11333","hashOfConfig":"11005"},{"size":3321,"mtime":1786084510757,"results":"11334","hashOfConfig":"11005"},{"size":5105,"mtime":1786084510758,"results":"11335","hashOfConfig":"11005"},{"size":1734,"mtime":1786084510758,"results":"11336","hashOfConfig":"11005"},{"size":5171,"mtime":1786084510758,"results":"11337","hashOfConfig":"11005"},{"size":4769,"mtime":1786084510758,"results":"11338","hashOfConfig":"11005"},{"size":5170,"mtime":1786084510758,"results":"11339","hashOfConfig":"11005"},{"size":1796,"mtime":1786084510759,"results":"11340","hashOfConfig":"11005"},{"size":10415,"mtime":1786084510759,"results":"11341","hashOfConfig":"11005"},{"size":152,"mtime":1786084510759,"results":"11342","hashOfConfig":"11005"},{"size":7434,"mtime":1786084510759,"results":"11343","hashOfConfig":"11005"},{"size":8495,"mtime":1786084510759,"results":"11344","hashOfConfig":"11005"},{"size":9319,"mtime":1786084510760,"results":"11345","hashOfConfig":"11005"},{"size":14851,"mtime":1786084510760,"results":"11346","hashOfConfig":"11005"},{"size":4042,"mtime":1786084510760,"results":"11347","hashOfConfig":"11005"},{"size":26069,"mtime":1786084529127,"results":"11348","hashOfConfig":"11005"},{"size":11121,"mtime":1786084510761,"results":"11349","hashOfConfig":"11005"},{"size":7275,"mtime":1786084510761,"results":"11350","hashOfConfig":"11005"},{"size":4571,"mtime":1786084510762,"results":"11351","hashOfConfig":"11005"},{"size":2783,"mtime":1786084510762,"results":"11352","hashOfConfig":"11005"},{"size":9681,"mtime":1786084510762,"results":"11353","hashOfConfig":"11005"},{"size":1436,"mtime":1786084510762,"results":"11354","hashOfConfig":"11005"},{"size":3344,"mtime":1786084510762,"results":"11355","hashOfConfig":"11005"},{"size":3095,"mtime":1786084510763,"results":"11356","hashOfConfig":"11005"},{"size":2807,"mtime":1786084510763,"results":"11357","hashOfConfig":"11005"},{"size":5052,"mtime":1786084510763,"results":"11358","hashOfConfig":"11005"},{"size":1587,"mtime":1786084510763,"results":"11359","hashOfConfig":"11005"},{"size":249,"mtime":1786084510763,"results":"11360","hashOfConfig":"11005"},{"size":2333,"mtime":1786084510764,"results":"11361","hashOfConfig":"11005"},{"size":5572,"mtime":1786084510764,"results":"11362","hashOfConfig":"11005"},{"size":1183,"mtime":1786084510764,"results":"11363","hashOfConfig":"11005"},{"size":3661,"mtime":1786084510764,"results":"11364","hashOfConfig":"11005"},{"size":1953,"mtime":1786084510765,"results":"11365","hashOfConfig":"11005"},{"size":3938,"mtime":1786084510765,"results":"11366","hashOfConfig":"11005"},{"size":4786,"mtime":1786084510765,"results":"11367","hashOfConfig":"11005"},{"size":971,"mtime":1786084510766,"results":"11368","hashOfConfig":"11005"},{"size":3362,"mtime":1786084510766,"results":"11369","hashOfConfig":"11005"},{"size":995,"mtime":1786084510766,"results":"11370","hashOfConfig":"11005"},{"size":1208,"mtime":1786084510766,"results":"11371","hashOfConfig":"11005"},{"size":17713,"mtime":1786084510766,"results":"11372","hashOfConfig":"11005"},{"size":19769,"mtime":1786084510767,"results":"11373","hashOfConfig":"11005"},{"size":8972,"mtime":1786084510767,"results":"11374","hashOfConfig":"11005"},{"size":5952,"mtime":1786084510767,"results":"11375","hashOfConfig":"11005"},{"size":3632,"mtime":1786084510768,"results":"11376","hashOfConfig":"11005"},{"size":6712,"mtime":1786084510768,"results":"11377","hashOfConfig":"11005"},{"size":1481,"mtime":1786084510768,"results":"11378","hashOfConfig":"11005"},{"size":22361,"mtime":1786084510769,"results":"11379","hashOfConfig":"11005"},{"size":7465,"mtime":1786084510769,"results":"11380","hashOfConfig":"11005"},{"size":7565,"mtime":1786084510769,"results":"11381","hashOfConfig":"11005"},{"size":12400,"mtime":1786084510769,"results":"11382","hashOfConfig":"11005"},{"size":1656,"mtime":1786084510769,"results":"11383","hashOfConfig":"11005"},{"size":2600,"mtime":1786084510770,"results":"11384","hashOfConfig":"11005"},{"size":1655,"mtime":1786084510770,"results":"11385","hashOfConfig":"11005"},{"size":1854,"mtime":1786084510770,"results":"11386","hashOfConfig":"11005"},{"size":9334,"mtime":1786084510770,"results":"11387","hashOfConfig":"11005"},{"size":2705,"mtime":1786084510771,"results":"11388","hashOfConfig":"11005"},{"size":7626,"mtime":1786084510771,"results":"11389","hashOfConfig":"11005"},{"size":5111,"mtime":1786084510771,"results":"11390","hashOfConfig":"11005"},{"size":1524,"mtime":1786084510771,"results":"11391","hashOfConfig":"11005"},{"size":6266,"mtime":1786084510771,"results":"11392","hashOfConfig":"11005"},{"size":14096,"mtime":1786084510772,"results":"11393","hashOfConfig":"11005"},{"size":1441,"mtime":1786084510772,"results":"11394","hashOfConfig":"11005"},{"size":8055,"mtime":1786084510772,"results":"11395","hashOfConfig":"11005"},{"size":6700,"mtime":1786084510772,"results":"11396","hashOfConfig":"11005"},{"size":10744,"mtime":1786084510772,"results":"11397","hashOfConfig":"11005"},{"size":17763,"mtime":1786084510773,"results":"11398","hashOfConfig":"11005"},{"size":3505,"mtime":1786084510773,"results":"11399","hashOfConfig":"11005"},{"size":3245,"mtime":1786084510774,"results":"11400","hashOfConfig":"11005"},{"size":38618,"mtime":1786084510773,"results":"11401","hashOfConfig":"11005"},{"size":1172,"mtime":1786084510774,"results":"11402","hashOfConfig":"11005"},{"size":8768,"mtime":1786084510774,"results":"11403","hashOfConfig":"11005"},{"size":2850,"mtime":1786084510774,"results":"11404","hashOfConfig":"11005"},{"size":19749,"mtime":1786084510775,"results":"11405","hashOfConfig":"11005"},{"size":6120,"mtime":1786084510775,"results":"11406","hashOfConfig":"11005"},{"size":8876,"mtime":1786084510775,"results":"11407","hashOfConfig":"11005"},{"size":1189,"mtime":1786084510775,"results":"11408","hashOfConfig":"11005"},{"size":17802,"mtime":1786084510776,"results":"11409","hashOfConfig":"11005"},{"size":1578,"mtime":1786084510776,"results":"11410","hashOfConfig":"11005"},{"size":3429,"mtime":1786084510776,"results":"11411","hashOfConfig":"11005"},{"size":12991,"mtime":1786084510777,"results":"11412","hashOfConfig":"11005"},{"size":3465,"mtime":1786084510777,"results":"11413","hashOfConfig":"11005"},{"size":2255,"mtime":1786084510777,"results":"11414","hashOfConfig":"11005"},{"size":3828,"mtime":1786084510777,"results":"11415","hashOfConfig":"11005"},{"size":33386,"mtime":1786084510778,"results":"11416","hashOfConfig":"11005"},{"size":27278,"mtime":1786084510778,"results":"11417","hashOfConfig":"11005"},{"size":10224,"mtime":1786084510780,"results":"11418","hashOfConfig":"11005"},{"size":22664,"mtime":1786084510779,"results":"11419","hashOfConfig":"11005"},{"size":15618,"mtime":1786084510780,"results":"11420","hashOfConfig":"11005"},{"size":12822,"mtime":1786084510780,"results":"11421","hashOfConfig":"11005"},{"size":25725,"mtime":1786084510781,"results":"11422","hashOfConfig":"11005"},{"size":22960,"mtime":1786084510781,"results":"11423","hashOfConfig":"11005"},{"size":3782,"mtime":1786084510781,"results":"11424","hashOfConfig":"11005"},{"size":7116,"mtime":1786084510782,"results":"11425","hashOfConfig":"11005"},{"size":10953,"mtime":1786084510782,"results":"11426","hashOfConfig":"11005"},{"size":887,"mtime":1786084510783,"results":"11427","hashOfConfig":"11005"},{"size":6587,"mtime":1786084510783,"results":"11428","hashOfConfig":"11005"},{"size":25597,"mtime":1786084510784,"results":"11429","hashOfConfig":"11005"},{"size":4305,"mtime":1786084510784,"results":"11430","hashOfConfig":"11005"},{"size":4124,"mtime":1786084510784,"results":"11431","hashOfConfig":"11005"},{"size":3220,"mtime":1786084510785,"results":"11432","hashOfConfig":"11005"},{"size":1982,"mtime":1786084510785,"results":"11433","hashOfConfig":"11005"},{"size":1415,"mtime":1786084510785,"results":"11434","hashOfConfig":"11005"},{"size":2205,"mtime":1786084510785,"results":"11435","hashOfConfig":"11005"},{"size":265,"mtime":1786084510786,"results":"11436","hashOfConfig":"11005"},{"size":7309,"mtime":1786084510786,"results":"11437","hashOfConfig":"11005"},{"size":5880,"mtime":1786084510786,"results":"11438","hashOfConfig":"11005"},{"size":3018,"mtime":1786084510786,"results":"11439","hashOfConfig":"11005"},{"size":4287,"mtime":1786084510787,"results":"11440","hashOfConfig":"11005"},{"size":6751,"mtime":1786084510787,"results":"11441","hashOfConfig":"11005"},{"size":370,"mtime":1786084510787,"results":"11442","hashOfConfig":"11005"},{"size":4137,"mtime":1786084510787,"results":"11443","hashOfConfig":"11005"},{"size":2635,"mtime":1786084510788,"results":"11444","hashOfConfig":"11005"},{"size":3976,"mtime":1786084510789,"results":"11445","hashOfConfig":"11005"},{"size":3984,"mtime":1786084510790,"results":"11446","hashOfConfig":"11005"},{"size":17442,"mtime":1786084510792,"results":"11447","hashOfConfig":"11005"},{"size":2224,"mtime":1786084510793,"results":"11448","hashOfConfig":"11005"},{"size":2110,"mtime":1786084510794,"results":"11449","hashOfConfig":"11005"},{"size":4237,"mtime":1786084510796,"results":"11450","hashOfConfig":"11005"},{"size":6030,"mtime":1786084510799,"results":"11451","hashOfConfig":"11005"},{"size":2718,"mtime":1786084510799,"results":"11452","hashOfConfig":"11005"},{"size":992,"mtime":1786084510800,"results":"11453","hashOfConfig":"11005"},{"size":3282,"mtime":1786084510802,"results":"11454","hashOfConfig":"11005"},{"size":2832,"mtime":1786084510803,"results":"11455","hashOfConfig":"11005"},{"size":3152,"mtime":1786084510804,"results":"11456","hashOfConfig":"11005"},{"size":3300,"mtime":1786084510805,"results":"11457","hashOfConfig":"11005"},{"size":1331,"mtime":1786084510805,"results":"11458","hashOfConfig":"11005"},{"size":10756,"mtime":1786084510785,"results":"11459","hashOfConfig":"11005"},{"size":9824,"mtime":1786084510808,"results":"11460","hashOfConfig":"11005"},{"size":7359,"mtime":1786084510809,"results":"11461","hashOfConfig":"11005"},{"size":20165,"mtime":1786084510811,"results":"11462","hashOfConfig":"11005"},{"size":1945,"mtime":1786084510812,"results":"11463","hashOfConfig":"11005"},{"size":5946,"mtime":1786084510812,"results":"11464","hashOfConfig":"11005"},{"size":9261,"mtime":1786084510814,"results":"11465","hashOfConfig":"11005"},{"size":1492,"mtime":1786084510814,"results":"11466","hashOfConfig":"11005"},{"size":10426,"mtime":1786084510816,"results":"11467","hashOfConfig":"11005"},{"size":9002,"mtime":1786084510817,"results":"11468","hashOfConfig":"11005"},{"size":145,"mtime":1786084510818,"results":"11469","hashOfConfig":"11005"},{"size":4982,"mtime":1786084510819,"results":"11470","hashOfConfig":"11005"},{"size":10783,"mtime":1786084510819,"results":"11471","hashOfConfig":"11005"},{"size":10872,"mtime":1786084510820,"results":"11472","hashOfConfig":"11005"},{"size":144,"mtime":1786084510820,"results":"11473","hashOfConfig":"11005"},{"size":1978,"mtime":1786084510821,"results":"11474","hashOfConfig":"11005"},{"size":5126,"mtime":1786084510821,"results":"11475","hashOfConfig":"11005"},{"size":3092,"mtime":1786084510822,"results":"11476","hashOfConfig":"11005"},{"size":3151,"mtime":1786084510823,"results":"11477","hashOfConfig":"11005"},{"size":2602,"mtime":1786084510824,"results":"11478","hashOfConfig":"11005"},{"size":1849,"mtime":1786084510824,"results":"11479","hashOfConfig":"11005"},{"size":853,"mtime":1786084510825,"results":"11480","hashOfConfig":"11005"},{"size":5089,"mtime":1786084510825,"results":"11481","hashOfConfig":"11005"},{"size":3704,"mtime":1786084510826,"results":"11482","hashOfConfig":"11005"},{"size":1030,"mtime":1786084510827,"results":"11483","hashOfConfig":"11005"},{"size":12476,"mtime":1786084510827,"results":"11484","hashOfConfig":"11005"},{"size":3118,"mtime":1786084510828,"results":"11485","hashOfConfig":"11005"},{"size":632,"mtime":1786084510828,"results":"11486","hashOfConfig":"11005"},{"size":4531,"mtime":1786084510829,"results":"11487","hashOfConfig":"11005"},{"size":13272,"mtime":1786084510829,"results":"11488","hashOfConfig":"11005"},{"size":12176,"mtime":1786084510830,"results":"11489","hashOfConfig":"11005"},{"size":5485,"mtime":1786084510831,"results":"11490","hashOfConfig":"11005"},{"size":1853,"mtime":1786084510831,"results":"11491","hashOfConfig":"11005"},{"size":2983,"mtime":1786084510832,"results":"11492","hashOfConfig":"11005"},{"size":1774,"mtime":1786084510832,"results":"11493","hashOfConfig":"11005"},{"size":4372,"mtime":1786084510832,"results":"11494","hashOfConfig":"11005"},{"size":1086,"mtime":1786084510833,"results":"11495","hashOfConfig":"11005"},{"size":10622,"mtime":1786084510833,"results":"11496","hashOfConfig":"11005"},{"size":2452,"mtime":1786084510833,"results":"11497","hashOfConfig":"11005"},{"size":14213,"mtime":1786084510834,"results":"11498","hashOfConfig":"11005"},{"size":1233,"mtime":1786084510834,"results":"11499","hashOfConfig":"11005"},{"size":20950,"mtime":1786084510835,"results":"11500","hashOfConfig":"11005"},{"size":6967,"mtime":1786084510835,"results":"11501","hashOfConfig":"11005"},{"size":6277,"mtime":1786084510836,"results":"11502","hashOfConfig":"11005"},{"size":3170,"mtime":1786084510836,"results":"11503","hashOfConfig":"11005"},{"size":2284,"mtime":1786084510836,"results":"11504","hashOfConfig":"11005"},{"size":2690,"mtime":1786084510836,"results":"11505","hashOfConfig":"11005"},{"size":2630,"mtime":1786084510837,"results":"11506","hashOfConfig":"11005"},{"size":17193,"mtime":1786084510837,"results":"11507","hashOfConfig":"11005"},{"size":74,"mtime":1786084510837,"results":"11508","hashOfConfig":"11005"},{"size":2101,"mtime":1786084510838,"results":"11509","hashOfConfig":"11005"},{"size":6557,"mtime":1786084510838,"results":"11510","hashOfConfig":"11005"},{"size":3431,"mtime":1786084510838,"results":"11511","hashOfConfig":"11005"},{"size":5100,"mtime":1786084510839,"results":"11512","hashOfConfig":"11005"},{"size":14326,"mtime":1786084510839,"results":"11513","hashOfConfig":"11005"},{"size":12568,"mtime":1786084510840,"results":"11514","hashOfConfig":"11005"},{"size":7780,"mtime":1786084510840,"results":"11515","hashOfConfig":"11005"},{"size":4861,"mtime":1786084510840,"results":"11516","hashOfConfig":"11005"},{"size":2666,"mtime":1786084510840,"results":"11517","hashOfConfig":"11005"},{"size":2742,"mtime":1786084510841,"results":"11518","hashOfConfig":"11005"},{"size":7615,"mtime":1786084510841,"results":"11519","hashOfConfig":"11005"},{"size":4323,"mtime":1786084510843,"results":"11520","hashOfConfig":"11005"},{"size":707,"mtime":1786084510843,"results":"11521","hashOfConfig":"11005"},{"size":1820,"mtime":1786084510844,"results":"11522","hashOfConfig":"11005"},{"size":1232,"mtime":1786084510844,"results":"11523","hashOfConfig":"11005"},{"size":12661,"mtime":1786084510844,"results":"11524","hashOfConfig":"11005"},{"size":1369,"mtime":1786084510844,"results":"11525","hashOfConfig":"11005"},{"size":9375,"mtime":1786084510845,"results":"11526","hashOfConfig":"11005"},{"size":9460,"mtime":1786084510846,"results":"11527","hashOfConfig":"11005"},{"size":20903,"mtime":1786084510847,"results":"11528","hashOfConfig":"11005"},{"size":23181,"mtime":1786084510847,"results":"11529","hashOfConfig":"11005"},{"size":2260,"mtime":1786084510847,"results":"11530","hashOfConfig":"11005"},{"size":1445,"mtime":1786084510847,"results":"11531","hashOfConfig":"11005"},{"size":4521,"mtime":1786084510847,"results":"11532","hashOfConfig":"11005"},{"size":4842,"mtime":1786084510848,"results":"11533","hashOfConfig":"11005"},{"size":2343,"mtime":1786084510848,"results":"11534","hashOfConfig":"11005"},{"size":4217,"mtime":1786084510848,"results":"11535","hashOfConfig":"11005"},{"size":18872,"mtime":1786084510848,"results":"11536","hashOfConfig":"11005"},{"size":7921,"mtime":1786084510848,"results":"11537","hashOfConfig":"11005"},{"size":14572,"mtime":1786084510849,"results":"11538","hashOfConfig":"11005"},{"size":7021,"mtime":1786084510849,"results":"11539","hashOfConfig":"11005"},{"size":4422,"mtime":1786084510849,"results":"11540","hashOfConfig":"11005"},{"size":6335,"mtime":1786084510849,"results":"11541","hashOfConfig":"11005"},{"size":31347,"mtime":1786084510850,"results":"11542","hashOfConfig":"11005"},{"size":23067,"mtime":1786084510850,"results":"11543","hashOfConfig":"11005"},{"size":17223,"mtime":1786084510845,"results":"11544","hashOfConfig":"11005"},{"size":5725,"mtime":1786084510851,"results":"11545","hashOfConfig":"11005"},{"size":4132,"mtime":1786084510851,"results":"11546","hashOfConfig":"11005"},{"size":11076,"mtime":1786084510851,"results":"11547","hashOfConfig":"11005"},{"size":10662,"mtime":1786084510852,"results":"11548","hashOfConfig":"11005"},{"size":10129,"mtime":1786084510852,"results":"11549","hashOfConfig":"11005"},{"size":2537,"mtime":1786084510852,"results":"11550","hashOfConfig":"11005"},{"size":13460,"mtime":1786084510852,"results":"11551","hashOfConfig":"11005"},{"size":3234,"mtime":1786084510853,"results":"11552","hashOfConfig":"11005"},{"size":7436,"mtime":1786084510853,"results":"11553","hashOfConfig":"11005"},{"size":1841,"mtime":1786084510853,"results":"11554","hashOfConfig":"11005"},{"size":5205,"mtime":1786084510852,"results":"11555","hashOfConfig":"11005"},{"size":7819,"mtime":1786084510854,"results":"11556","hashOfConfig":"11005"},{"size":6682,"mtime":1786084510854,"results":"11557","hashOfConfig":"11005"},{"size":1278,"mtime":1786084510854,"results":"11558","hashOfConfig":"11005"},{"size":1125,"mtime":1786084510854,"results":"11559","hashOfConfig":"11005"},{"size":4747,"mtime":1786084510854,"results":"11560","hashOfConfig":"11005"},{"size":1817,"mtime":1786084510855,"results":"11561","hashOfConfig":"11005"},{"size":113,"mtime":1786084510855,"results":"11562","hashOfConfig":"11005"},{"size":1462,"mtime":1786084510855,"results":"11563","hashOfConfig":"11005"},{"size":10032,"mtime":1786084510855,"results":"11564","hashOfConfig":"11005"},{"size":3956,"mtime":1786084510855,"results":"11565","hashOfConfig":"11005"},{"size":1172,"mtime":1786084510855,"results":"11566","hashOfConfig":"11005"},{"size":27232,"mtime":1786084510856,"results":"11567","hashOfConfig":"11005"},{"size":603,"mtime":1786084510856,"results":"11568","hashOfConfig":"11005"},{"size":670,"mtime":1786084510856,"results":"11569","hashOfConfig":"11005"},{"size":8117,"mtime":1786084510856,"results":"11570","hashOfConfig":"11005"},{"size":3658,"mtime":1786084510857,"results":"11571","hashOfConfig":"11005"},{"size":1452,"mtime":1786084510857,"results":"11572","hashOfConfig":"11005"},{"size":11443,"mtime":1786084510857,"results":"11573","hashOfConfig":"11005"},{"size":1914,"mtime":1786084510857,"results":"11574","hashOfConfig":"11005"},{"size":15354,"mtime":1786084510857,"results":"11575","hashOfConfig":"11005"},{"size":7027,"mtime":1786084510858,"results":"11576","hashOfConfig":"11005"},{"size":4857,"mtime":1786084510858,"results":"11577","hashOfConfig":"11005"},{"size":2444,"mtime":1786084510858,"results":"11578","hashOfConfig":"11005"},{"size":14973,"mtime":1786084510859,"results":"11579","hashOfConfig":"11005"},{"size":7837,"mtime":1786084510859,"results":"11580","hashOfConfig":"11005"},{"size":2781,"mtime":1786084510859,"results":"11581","hashOfConfig":"11005"},{"size":11873,"mtime":1786084510859,"results":"11582","hashOfConfig":"11005"},{"size":21176,"mtime":1786084510860,"results":"11583","hashOfConfig":"11005"},{"size":4228,"mtime":1786084510860,"results":"11584","hashOfConfig":"11005"},{"size":9882,"mtime":1786084510860,"results":"11585","hashOfConfig":"11005"},{"size":4102,"mtime":1786084510860,"results":"11586","hashOfConfig":"11005"},{"size":3266,"mtime":1786084510860,"results":"11587","hashOfConfig":"11005"},{"size":9859,"mtime":1786084510861,"results":"11588","hashOfConfig":"11005"},{"size":5296,"mtime":1786084510861,"results":"11589","hashOfConfig":"11005"},{"size":3925,"mtime":1786084510861,"results":"11590","hashOfConfig":"11005"},{"size":1933,"mtime":1786084510861,"results":"11591","hashOfConfig":"11005"},{"size":8391,"mtime":1786084510862,"results":"11592","hashOfConfig":"11005"},{"size":1291,"mtime":1786084510862,"results":"11593","hashOfConfig":"11005"},{"size":2138,"mtime":1786084510862,"results":"11594","hashOfConfig":"11005"},{"size":21300,"mtime":1786084510862,"results":"11595","hashOfConfig":"11005"},{"size":2907,"mtime":1786084510863,"results":"11596","hashOfConfig":"11005"},{"size":14986,"mtime":1786084510863,"results":"11597","hashOfConfig":"11005"},{"size":9048,"mtime":1786084510864,"results":"11598","hashOfConfig":"11005"},{"size":17021,"mtime":1786084510863,"results":"11599","hashOfConfig":"11005"},{"size":12861,"mtime":1786084510864,"results":"11600","hashOfConfig":"11005"},{"size":1064,"mtime":1786084510864,"results":"11601","hashOfConfig":"11005"},{"size":8759,"mtime":1786084510865,"results":"11602","hashOfConfig":"11005"},{"size":4227,"mtime":1786084510865,"results":"11603","hashOfConfig":"11005"},{"size":11822,"mtime":1786084510865,"results":"11604","hashOfConfig":"11005"},{"size":645,"mtime":1786084510866,"results":"11605","hashOfConfig":"11005"},{"size":10739,"mtime":1786084510866,"results":"11606","hashOfConfig":"11005"},{"size":1730,"mtime":1786084510866,"results":"11607","hashOfConfig":"11005"},{"size":5870,"mtime":1786084510866,"results":"11608","hashOfConfig":"11005"},{"size":779,"mtime":1786084510866,"results":"11609","hashOfConfig":"11005"},{"size":9313,"mtime":1786084510867,"results":"11610","hashOfConfig":"11005"},{"size":2042,"mtime":1786084510867,"results":"11611","hashOfConfig":"11005"},{"size":6334,"mtime":1786084510867,"results":"11612","hashOfConfig":"11005"},{"size":5427,"mtime":1786084510867,"results":"11613","hashOfConfig":"11005"},{"size":3716,"mtime":1786084510867,"results":"11614","hashOfConfig":"11005"},{"size":9167,"mtime":1786084510868,"results":"11615","hashOfConfig":"11005"},{"size":5813,"mtime":1786084510868,"results":"11616","hashOfConfig":"11005"},{"size":582,"mtime":1786084510868,"results":"11617","hashOfConfig":"11005"},{"size":4932,"mtime":1786084510868,"results":"11618","hashOfConfig":"11005"},{"size":5809,"mtime":1786084510869,"results":"11619","hashOfConfig":"11005"},{"size":3447,"mtime":1786084510869,"results":"11620","hashOfConfig":"11005"},{"size":5267,"mtime":1786084510869,"results":"11621","hashOfConfig":"11005"},{"size":1642,"mtime":1786084510869,"results":"11622","hashOfConfig":"11005"},{"size":1633,"mtime":1786084510869,"results":"11623","hashOfConfig":"11005"},{"size":15841,"mtime":1786084510870,"results":"11624","hashOfConfig":"11005"},{"size":1555,"mtime":1786084510870,"results":"11625","hashOfConfig":"11005"},{"size":7226,"mtime":1786084510870,"results":"11626","hashOfConfig":"11005"},{"size":2524,"mtime":1786084510870,"results":"11627","hashOfConfig":"11005"},{"size":1738,"mtime":1786084510870,"results":"11628","hashOfConfig":"11005"},{"size":1711,"mtime":1786084510870,"results":"11629","hashOfConfig":"11005"},{"size":4560,"mtime":1786084510871,"results":"11630","hashOfConfig":"11005"},{"size":901,"mtime":1786084510871,"results":"11631","hashOfConfig":"11005"},{"size":678,"mtime":1786084510871,"results":"11632","hashOfConfig":"11005"},{"size":16076,"mtime":1786084510871,"results":"11633","hashOfConfig":"11005"},{"size":14153,"mtime":1786084510871,"results":"11634","hashOfConfig":"11005"},{"size":1244,"mtime":1786084510872,"results":"11635","hashOfConfig":"11005"},{"size":6065,"mtime":1786084510872,"results":"11636","hashOfConfig":"11005"},{"size":14152,"mtime":1786084510872,"results":"11637","hashOfConfig":"11005"},{"size":1962,"mtime":1786084510872,"results":"11638","hashOfConfig":"11005"},{"size":8252,"mtime":1786084510872,"results":"11639","hashOfConfig":"11005"},{"size":11653,"mtime":1786084510873,"results":"11640","hashOfConfig":"11005"},{"size":545,"mtime":1786084510873,"results":"11641","hashOfConfig":"11005"},{"size":13077,"mtime":1786084510873,"results":"11642","hashOfConfig":"11005"},{"size":4923,"mtime":1786084510873,"results":"11643","hashOfConfig":"11005"},{"size":1166,"mtime":1786084510873,"results":"11644","hashOfConfig":"11005"},{"size":2320,"mtime":1786084510873,"results":"11645","hashOfConfig":"11005"},{"size":1462,"mtime":1786084510873,"results":"11646","hashOfConfig":"11005"},{"size":4263,"mtime":1786084510874,"results":"11647","hashOfConfig":"11005"},{"size":183,"mtime":1786084510874,"results":"11648","hashOfConfig":"11005"},{"size":5991,"mtime":1786084510874,"results":"11649","hashOfConfig":"11005"},{"size":11756,"mtime":1786084510874,"results":"11650","hashOfConfig":"11005"},{"size":10549,"mtime":1786084510874,"results":"11651","hashOfConfig":"11005"},{"size":7636,"mtime":1786084510875,"results":"11652","hashOfConfig":"11005"},{"size":3495,"mtime":1786084510875,"results":"11653","hashOfConfig":"11005"},{"size":13475,"mtime":1786084510875,"results":"11654","hashOfConfig":"11005"},{"size":1703,"mtime":1786084510875,"results":"11655","hashOfConfig":"11005"},{"size":8915,"mtime":1786084510875,"results":"11656","hashOfConfig":"11005"},{"size":1952,"mtime":1786084510876,"results":"11657","hashOfConfig":"11005"},{"size":35990,"mtime":1786084510876,"results":"11658","hashOfConfig":"11005"},{"size":42805,"mtime":1786084510877,"results":"11659","hashOfConfig":"11005"},{"size":3409,"mtime":1786084510877,"results":"11660","hashOfConfig":"11005"},{"size":4018,"mtime":1786084510877,"results":"11661","hashOfConfig":"11005"},{"size":794,"mtime":1786084510877,"results":"11662","hashOfConfig":"11005"},{"size":1093,"mtime":1786084510877,"results":"11663","hashOfConfig":"11005"},{"size":4183,"mtime":1786084510878,"results":"11664","hashOfConfig":"11005"},{"size":7920,"mtime":1786084510878,"results":"11665","hashOfConfig":"11005"},{"size":13795,"mtime":1786084510878,"results":"11666","hashOfConfig":"11005"},{"size":19899,"mtime":1786084510878,"results":"11667","hashOfConfig":"11005"},{"size":9968,"mtime":1786084510878,"results":"11668","hashOfConfig":"11005"},{"size":841,"mtime":1786084510878,"results":"11669","hashOfConfig":"11005"},{"size":10268,"mtime":1786084510879,"results":"11670","hashOfConfig":"11005"},{"size":3952,"mtime":1786084510879,"results":"11671","hashOfConfig":"11005"},{"size":33294,"mtime":1786084510879,"results":"11672","hashOfConfig":"11005"},{"size":1881,"mtime":1786084510880,"results":"11673","hashOfConfig":"11005"},{"size":16198,"mtime":1786084510880,"results":"11674","hashOfConfig":"11005"},{"size":15263,"mtime":1786084510880,"results":"11675","hashOfConfig":"11005"},{"size":17658,"mtime":1786084510881,"results":"11676","hashOfConfig":"11005"},{"size":3284,"mtime":1786084510881,"results":"11677","hashOfConfig":"11005"},{"size":18064,"mtime":1786084510881,"results":"11678","hashOfConfig":"11005"},{"size":3744,"mtime":1786084510881,"results":"11679","hashOfConfig":"11005"},{"size":12040,"mtime":1786084510882,"results":"11680","hashOfConfig":"11005"},{"size":15337,"mtime":1786084510882,"results":"11681","hashOfConfig":"11005"},{"size":3124,"mtime":1786084510883,"results":"11682","hashOfConfig":"11005"},{"size":26080,"mtime":1786084510883,"results":"11683","hashOfConfig":"11005"},{"size":20002,"mtime":1786084510883,"results":"11684","hashOfConfig":"11005"},{"size":820,"mtime":1786084510884,"results":"11685","hashOfConfig":"11005"},{"size":3022,"mtime":1786084510884,"results":"11686","hashOfConfig":"11005"},{"size":1299,"mtime":1786084510885,"results":"11687","hashOfConfig":"11005"},{"size":2658,"mtime":1786084510885,"results":"11688","hashOfConfig":"11005"},{"size":36009,"mtime":1786084510885,"results":"11689","hashOfConfig":"11005"},{"size":1787,"mtime":1786084510885,"results":"11690","hashOfConfig":"11005"},{"size":25183,"mtime":1786084510886,"results":"11691","hashOfConfig":"11005"},{"size":15188,"mtime":1786084510886,"results":"11692","hashOfConfig":"11005"},{"size":24965,"mtime":1786084510887,"results":"11693","hashOfConfig":"11005"},{"size":7704,"mtime":1786084510887,"results":"11694","hashOfConfig":"11005"},{"size":3429,"mtime":1786084510887,"results":"11695","hashOfConfig":"11005"},{"size":7440,"mtime":1786084510888,"results":"11696","hashOfConfig":"11005"},{"size":32954,"mtime":1786084510888,"results":"11697","hashOfConfig":"11005"},{"size":19975,"mtime":1786084510888,"results":"11698","hashOfConfig":"11005"},{"size":12127,"mtime":1786084510889,"results":"11699","hashOfConfig":"11005"},{"size":1196,"mtime":1786084510889,"results":"11700","hashOfConfig":"11005"},{"size":8054,"mtime":1786084510889,"results":"11701","hashOfConfig":"11005"},{"size":1910,"mtime":1786084510889,"results":"11702","hashOfConfig":"11005"},{"size":4174,"mtime":1786084510889,"results":"11703","hashOfConfig":"11005"},{"size":4758,"mtime":1786084510890,"results":"11704","hashOfConfig":"11005"},{"size":2950,"mtime":1786084510890,"results":"11705","hashOfConfig":"11005"},{"size":13103,"mtime":1786084510890,"results":"11706","hashOfConfig":"11005"},{"size":3601,"mtime":1786084510890,"results":"11707","hashOfConfig":"11005"},{"size":12899,"mtime":1786084510891,"results":"11708","hashOfConfig":"11005"},{"size":2896,"mtime":1786084510891,"results":"11709","hashOfConfig":"11005"},{"size":4627,"mtime":1786084510891,"results":"11710","hashOfConfig":"11005"},{"size":7505,"mtime":1786084510891,"results":"11711","hashOfConfig":"11005"},{"size":5840,"mtime":1786084510891,"results":"11712","hashOfConfig":"11005"},{"size":2468,"mtime":1786084510892,"results":"11713","hashOfConfig":"11005"},{"size":7884,"mtime":1786084510892,"results":"11714","hashOfConfig":"11005"},{"size":2253,"mtime":1786084510892,"results":"11715","hashOfConfig":"11005"},{"size":1341,"mtime":1786084510892,"results":"11716","hashOfConfig":"11005"},{"size":1180,"mtime":1786084510893,"results":"11717","hashOfConfig":"11005"},{"size":2642,"mtime":1786084510893,"results":"11718","hashOfConfig":"11005"},{"size":3404,"mtime":1786084510893,"results":"11719","hashOfConfig":"11005"},{"size":1353,"mtime":1786084510893,"results":"11720","hashOfConfig":"11005"},{"size":824,"mtime":1786084510893,"results":"11721","hashOfConfig":"11005"},{"size":1342,"mtime":1786084510893,"results":"11722","hashOfConfig":"11005"},{"size":1160,"mtime":1786084510893,"results":"11723","hashOfConfig":"11005"},{"size":791,"mtime":1786084510894,"results":"11724","hashOfConfig":"11005"},{"size":6694,"mtime":1786084510894,"results":"11725","hashOfConfig":"11005"},{"size":3956,"mtime":1786084510894,"results":"11726","hashOfConfig":"11005"},{"size":3027,"mtime":1786084510894,"results":"11727","hashOfConfig":"8808"},{"size":6076,"mtime":1786084510895,"results":"11728","hashOfConfig":"8808"},{"size":1977,"mtime":1786084510895,"results":"11729","hashOfConfig":"8808"},{"size":3581,"mtime":1786084510895,"results":"11730","hashOfConfig":"8808"},{"size":3832,"mtime":1786084510895,"results":"11731","hashOfConfig":"8808"},{"size":1926,"mtime":1786084510895,"results":"11732","hashOfConfig":"8808"},{"size":3510,"mtime":1786084510895,"results":"11733","hashOfConfig":"11005"},{"size":2096,"mtime":1786084510895,"results":"11734","hashOfConfig":"11005"},{"size":864,"mtime":1786084510896,"results":"11735","hashOfConfig":"11005"},{"size":18987,"mtime":1786084510896,"results":"11736","hashOfConfig":"11005"},{"size":1818,"mtime":1786084510896,"results":"11737","hashOfConfig":"11005"},{"size":2576,"mtime":1786084510896,"results":"11738","hashOfConfig":"11005"},{"size":1135,"mtime":1786084510896,"results":"11739","hashOfConfig":"11005"},{"size":891,"mtime":1786084510897,"results":"11740","hashOfConfig":"11005"},{"size":768,"mtime":1786084510897,"results":"11741","hashOfConfig":"11005"},{"size":769,"mtime":1786084510897,"results":"11742","hashOfConfig":"11005"},{"size":1226,"mtime":1786084510897,"results":"11743","hashOfConfig":"11005"},{"size":810,"mtime":1786084510897,"results":"11744","hashOfConfig":"11005"},{"size":1546,"mtime":1786084510897,"results":"11745","hashOfConfig":"11005"},{"size":762,"mtime":1786084510898,"results":"11746","hashOfConfig":"11005"},{"size":868,"mtime":1786084510898,"results":"11747","hashOfConfig":"11005"},{"size":710,"mtime":1786084510898,"results":"11748","hashOfConfig":"11005"},{"size":10421,"mtime":1786084510898,"results":"11749","hashOfConfig":"11005"},{"size":5879,"mtime":1786084510898,"results":"11750","hashOfConfig":"11005"},{"size":6356,"mtime":1786084510899,"results":"11751","hashOfConfig":"11005"},{"size":10811,"mtime":1786084510899,"results":"11752","hashOfConfig":"11005"},{"size":2795,"mtime":1786084510899,"results":"11753","hashOfConfig":"11005"},{"size":1772,"mtime":1786084510899,"results":"11754","hashOfConfig":"11005"},{"size":1810,"mtime":1786084510899,"results":"11755","hashOfConfig":"11005"},{"size":1757,"mtime":1786084510899,"results":"11756","hashOfConfig":"11005"},{"size":1929,"mtime":1786084510900,"results":"11757","hashOfConfig":"11005"},{"size":1780,"mtime":1786084510900,"results":"11758","hashOfConfig":"11005"},{"size":825,"mtime":1786084510900,"results":"11759","hashOfConfig":"11005"},{"size":1748,"mtime":1786084510900,"results":"11760","hashOfConfig":"11005"},{"size":5201,"mtime":1786084510900,"results":"11761","hashOfConfig":"11005"},{"size":6280,"mtime":1786084510900,"results":"11762","hashOfConfig":"11005"},{"size":3020,"mtime":1786084510901,"results":"11763","hashOfConfig":"11005"},{"size":12343,"mtime":1786084510901,"results":"11764","hashOfConfig":"11005"},{"size":2288,"mtime":1786084510901,"results":"11765","hashOfConfig":"11005"},{"size":9176,"mtime":1786084510901,"results":"11766","hashOfConfig":"11005"},{"size":2557,"mtime":1786084510901,"results":"11767","hashOfConfig":"11005"},{"size":6536,"mtime":1786084510901,"results":"11768","hashOfConfig":"11005"},{"size":2312,"mtime":1786084510902,"results":"11769","hashOfConfig":"11005"},{"size":3362,"mtime":1786084510902,"results":"11770","hashOfConfig":"11005"},{"size":10325,"mtime":1786084510902,"results":"11771","hashOfConfig":"11005"},{"size":11435,"mtime":1786084510902,"results":"11772","hashOfConfig":"11005"},{"size":3675,"mtime":1786084510902,"results":"11773","hashOfConfig":"11005"},{"size":297,"mtime":1786084510903,"results":"11774","hashOfConfig":"11005"},{"size":2246,"mtime":1786084510903,"results":"11775","hashOfConfig":"11005"},{"size":29103,"mtime":1786084510903,"results":"11776","hashOfConfig":"11005"},{"size":1424,"mtime":1786084510903,"results":"11777","hashOfConfig":"11005"},{"size":2683,"mtime":1786084510903,"results":"11778","hashOfConfig":"11005"},{"size":492,"mtime":1786084510903,"results":"11779","hashOfConfig":"11005"},{"size":4307,"mtime":1786084510904,"results":"11780","hashOfConfig":"11005"},{"size":2134,"mtime":1786084510904,"results":"11781","hashOfConfig":"11005"},{"size":34357,"mtime":1786084510905,"results":"11782","hashOfConfig":"8808"},{"size":956,"mtime":1786084510905,"results":"11783","hashOfConfig":"11005"},{"size":845,"mtime":1786084510905,"results":"11784","hashOfConfig":"11005"},{"size":1375,"mtime":1786084510905,"results":"11785","hashOfConfig":"11005"},{"size":10778,"mtime":1786084510906,"results":"11786","hashOfConfig":"11005"},{"size":2713,"mtime":1786084510906,"results":"11787","hashOfConfig":"11005"},{"size":1274,"mtime":1786084510906,"results":"11788","hashOfConfig":"11005"},{"size":948,"mtime":1786084510906,"results":"11789","hashOfConfig":"11005"},{"size":1121,"mtime":1786084510906,"results":"11790","hashOfConfig":"11005"},{"size":1016,"mtime":1786084510906,"results":"11791","hashOfConfig":"11005"},{"size":1366,"mtime":1786084510906,"results":"11792","hashOfConfig":"11005"},{"size":2429,"mtime":1786084510906,"results":"11793","hashOfConfig":"11005"},{"size":1984,"mtime":1786084510907,"results":"11794","hashOfConfig":"11005"},{"size":1038,"mtime":1786084510907,"results":"11795","hashOfConfig":"11005"},{"size":1029,"mtime":1786084510907,"results":"11796","hashOfConfig":"11005"},{"size":948,"mtime":1786084510907,"results":"11797","hashOfConfig":"11005"},{"size":4736,"mtime":1786084510907,"results":"11798","hashOfConfig":"11005"},{"size":4360,"mtime":1786084510907,"results":"11799","hashOfConfig":"11005"},{"size":8664,"mtime":1786084510908,"results":"11800","hashOfConfig":"11005"},{"size":5781,"mtime":1786084510908,"results":"11801","hashOfConfig":"11005"},{"size":4561,"mtime":1786084510908,"results":"11802","hashOfConfig":"11005"},{"size":2704,"mtime":1786084510909,"results":"11803","hashOfConfig":"11005"},{"size":13942,"mtime":1786084510909,"results":"11804","hashOfConfig":"11005"},{"size":5444,"mtime":1786084510909,"results":"11805","hashOfConfig":"11005"},{"size":2335,"mtime":1786084510909,"results":"11806","hashOfConfig":"11005"},{"size":1743,"mtime":1786084510910,"results":"11807","hashOfConfig":"11005"},{"size":748,"mtime":1786084510910,"results":"11808","hashOfConfig":"11005"},{"size":529,"mtime":1786084510910,"results":"11809","hashOfConfig":"11005"},{"size":3828,"mtime":1786084510911,"results":"11810","hashOfConfig":"11005"},{"size":3861,"mtime":1786084510911,"results":"11811","hashOfConfig":"11005"},{"size":2717,"mtime":1786084510912,"results":"11812","hashOfConfig":"11005"},{"size":2701,"mtime":1786084510912,"results":"11813","hashOfConfig":"11005"},{"size":2657,"mtime":1786084510912,"results":"11814","hashOfConfig":"11005"},{"size":4069,"mtime":1786084510912,"results":"11815","hashOfConfig":"11005"},{"size":1057,"mtime":1786084510912,"results":"11816","hashOfConfig":"11005"},{"size":2856,"mtime":1786084510913,"results":"11817","hashOfConfig":"11005"},{"size":3607,"mtime":1786084510913,"results":"11818","hashOfConfig":"11005"},{"size":4229,"mtime":1786084510913,"results":"11819","hashOfConfig":"11005"},{"size":15189,"mtime":1786084510913,"results":"11820","hashOfConfig":"11005"},{"size":4044,"mtime":1786084510913,"results":"11821","hashOfConfig":"11005"},{"size":15850,"mtime":1786084510914,"results":"11822","hashOfConfig":"11005"},{"size":307,"mtime":1786084510914,"results":"11823","hashOfConfig":"11005"},{"size":14066,"mtime":1786084510914,"results":"11824","hashOfConfig":"11005"},{"size":2502,"mtime":1786084510914,"results":"11825","hashOfConfig":"11005"},{"size":7888,"mtime":1786084510915,"results":"11826","hashOfConfig":"11005"},{"size":9152,"mtime":1786084510915,"results":"11827","hashOfConfig":"11005"},{"size":22836,"mtime":1786084510915,"results":"11828","hashOfConfig":"11005"},{"size":3588,"mtime":1786084510916,"results":"11829","hashOfConfig":"11005"},{"size":1726,"mtime":1786084510916,"results":"11830","hashOfConfig":"11005"},{"size":6273,"mtime":1786084510911,"results":"11831","hashOfConfig":"11005"},{"size":1873,"mtime":1786084510916,"results":"11832","hashOfConfig":"11833"},{"size":1692,"mtime":1786084510916,"results":"11834","hashOfConfig":"11833"},{"size":491,"mtime":1786084510916,"results":"11835","hashOfConfig":"11833"},{"size":4662,"mtime":1786084510916,"results":"11836","hashOfConfig":"11833"},{"size":2506,"mtime":1786084510916,"results":"11837","hashOfConfig":"11833"},{"size":3464,"mtime":1786084510917,"results":"11838","hashOfConfig":"11833"},{"size":1106,"mtime":1786084510917,"results":"11839","hashOfConfig":"11833"},{"size":3851,"mtime":1786084510917,"results":"11840","hashOfConfig":"11833"},{"size":3228,"mtime":1786084510917,"results":"11841","hashOfConfig":"11833"},{"size":1987,"mtime":1786084510917,"results":"11842","hashOfConfig":"11833"},{"size":2931,"mtime":1786084510917,"results":"11843","hashOfConfig":"11833"},{"size":14110,"mtime":1786084510917,"results":"11844","hashOfConfig":"11833"},{"size":12150,"mtime":1786084510918,"results":"11845","hashOfConfig":"11833"},{"size":6538,"mtime":1786084510918,"results":"11846","hashOfConfig":"11833"},{"size":5460,"mtime":1786084510918,"results":"11847","hashOfConfig":"11833"},{"size":1325,"mtime":1786084510918,"results":"11848","hashOfConfig":"11833"},{"size":7317,"mtime":1786084510918,"results":"11849","hashOfConfig":"11833"},{"size":2382,"mtime":1786084510918,"results":"11850","hashOfConfig":"11833"},{"size":3339,"mtime":1786084510919,"results":"11851","hashOfConfig":"11833"},{"size":3142,"mtime":1786084510919,"results":"11852","hashOfConfig":"11833"},{"size":6116,"mtime":1786084510919,"results":"11853","hashOfConfig":"11833"},{"size":7299,"mtime":1786084510919,"results":"11854","hashOfConfig":"11833"},{"size":10386,"mtime":1786084510919,"results":"11855","hashOfConfig":"11833"},{"size":907,"mtime":1786084510919,"results":"11856","hashOfConfig":"11833"},{"size":4753,"mtime":1786084510919,"results":"11857","hashOfConfig":"11833"},{"size":16059,"mtime":1786084510920,"results":"11858","hashOfConfig":"11833"},{"size":3250,"mtime":1786084510920,"results":"11859","hashOfConfig":"11833"},{"size":8366,"mtime":1786084510920,"results":"11860","hashOfConfig":"11833"},{"size":3668,"mtime":1786084510920,"results":"11861","hashOfConfig":"11833"},{"size":908,"mtime":1786084510920,"results":"11862","hashOfConfig":"11833"},{"size":3085,"mtime":1786084510920,"results":"11863","hashOfConfig":"11833"},{"size":1767,"mtime":1786084510921,"results":"11864","hashOfConfig":"11833"},{"size":3082,"mtime":1786084510921,"results":"11865","hashOfConfig":"11833"},{"size":2055,"mtime":1786084510921,"results":"11866","hashOfConfig":"11833"},{"size":7370,"mtime":1786084510921,"results":"11867","hashOfConfig":"11833"},{"size":13108,"mtime":1786084510921,"results":"11868","hashOfConfig":"11833"},{"size":2953,"mtime":1786084510921,"results":"11869","hashOfConfig":"11833"},{"size":29890,"mtime":1786084510922,"results":"11870","hashOfConfig":"11833"},{"size":756,"mtime":1786084510922,"results":"11871","hashOfConfig":"11833"},{"size":3853,"mtime":1786084510922,"results":"11872","hashOfConfig":"11833"},{"size":24064,"mtime":1786084510922,"results":"11873","hashOfConfig":"11833"},{"size":1556,"mtime":1786084510923,"results":"11874","hashOfConfig":"11833"},{"size":910,"mtime":1786084510923,"results":"11875","hashOfConfig":"11833"},{"size":5553,"mtime":1786084510923,"results":"11876","hashOfConfig":"11833"},{"size":43003,"mtime":1786084510923,"results":"11877","hashOfConfig":"11833"},{"size":13162,"mtime":1786084510924,"results":"11878","hashOfConfig":"11833"},{"size":1992,"mtime":1786084510924,"results":"11879","hashOfConfig":"11833"},{"size":1717,"mtime":1786084510924,"results":"11880","hashOfConfig":"11833"},{"size":7919,"mtime":1786084510924,"results":"11881","hashOfConfig":"11833"},{"size":4451,"mtime":1786084510924,"results":"11882","hashOfConfig":"11833"},{"size":12475,"mtime":1786084510924,"results":"11883","hashOfConfig":"11833"},{"size":19916,"mtime":1786084510925,"results":"11884","hashOfConfig":"11833"},{"size":29696,"mtime":1786084510925,"results":"11885","hashOfConfig":"11833"},{"size":7457,"mtime":1786084510925,"results":"11886","hashOfConfig":"11833"},{"size":23245,"mtime":1786084510926,"results":"11887","hashOfConfig":"11833"},{"size":522,"mtime":1786084510926,"results":"11888","hashOfConfig":"11833"},{"size":7446,"mtime":1786084510926,"results":"11889","hashOfConfig":"11833"},{"size":21289,"mtime":1786084510926,"results":"11890","hashOfConfig":"11833"},{"size":39688,"mtime":1786084510927,"results":"11891","hashOfConfig":"11833"},{"size":69106,"mtime":1786084510927,"results":"11892","hashOfConfig":"11833"},{"size":29434,"mtime":1786084510928,"results":"11893","hashOfConfig":"11833"},{"size":2279,"mtime":1786084510928,"results":"11894","hashOfConfig":"11833"},{"size":1654,"mtime":1786084510928,"results":"11895","hashOfConfig":"11833"},{"size":3439,"mtime":1786084510928,"results":"11896","hashOfConfig":"11833"},{"size":3592,"mtime":1786084510928,"results":"11897","hashOfConfig":"11833"},{"size":28078,"mtime":1786084510929,"results":"11898","hashOfConfig":"11833"},{"size":3386,"mtime":1786084510929,"results":"11899","hashOfConfig":"11833"},{"size":5506,"mtime":1786084510929,"results":"11900","hashOfConfig":"11833"},{"size":1005,"mtime":1786084510929,"results":"11901","hashOfConfig":"11833"},{"size":272,"mtime":1786084510929,"results":"11902","hashOfConfig":"11833"},{"size":1425,"mtime":1786084510929,"results":"11903","hashOfConfig":"11833"},{"size":2514,"mtime":1786084510929,"results":"11904","hashOfConfig":"11833"},{"size":3918,"mtime":1786084510929,"results":"11905","hashOfConfig":"11833"},{"size":6342,"mtime":1786084510930,"results":"11906","hashOfConfig":"11833"},{"size":13413,"mtime":1786084510930,"results":"11907","hashOfConfig":"11833"},{"size":14675,"mtime":1786084510930,"results":"11908","hashOfConfig":"11833"},{"size":27881,"mtime":1786084510930,"results":"11909","hashOfConfig":"11833"},{"size":6978,"mtime":1786084510931,"results":"11910","hashOfConfig":"11833"},{"size":6399,"mtime":1786084510931,"results":"11911","hashOfConfig":"11833"},{"size":6131,"mtime":1786084510931,"results":"11912","hashOfConfig":"11833"},{"size":2814,"mtime":1786084510931,"results":"11913","hashOfConfig":"11833"},{"size":1306,"mtime":1786084510932,"results":"11914","hashOfConfig":"11833"},{"size":3548,"mtime":1786084510932,"results":"11915","hashOfConfig":"11833"},{"size":1465,"mtime":1786084510932,"results":"11916","hashOfConfig":"11833"},{"size":166,"mtime":1786084510932,"results":"11917","hashOfConfig":"11005"},{"size":33359,"mtime":1786084510932,"results":"11918","hashOfConfig":"11833"},{"size":1017,"mtime":1786084510932,"results":"11919","hashOfConfig":"11833"},{"size":2578,"mtime":1786084510932,"results":"11920","hashOfConfig":"11005"},{"size":2150,"mtime":1786084510932,"results":"11921","hashOfConfig":"11833"},{"size":6194,"mtime":1786084510932,"results":"11922","hashOfConfig":"11833"},{"size":10409,"mtime":1786084510933,"results":"11923","hashOfConfig":"11833"},{"size":833,"mtime":1786084510933,"results":"11924","hashOfConfig":"11005"},{"size":1549,"mtime":1786084510933,"results":"11925","hashOfConfig":"11005"},{"size":2905,"mtime":1786084510933,"results":"11926","hashOfConfig":"11833"},{"size":1962,"mtime":1786084510933,"results":"11927","hashOfConfig":"11833"},{"size":5523,"mtime":1786084510933,"results":"11928","hashOfConfig":"11833"},{"size":387,"mtime":1786084510933,"results":"11929","hashOfConfig":"11005"},{"size":3725,"mtime":1786084510934,"results":"11930","hashOfConfig":"11833"},{"size":5642,"mtime":1786084510934,"results":"11931","hashOfConfig":"11833"},{"size":2881,"mtime":1786084510934,"results":"11932","hashOfConfig":"11833"},{"size":19237,"mtime":1786084510934,"results":"11933","hashOfConfig":"11833"},{"size":2917,"mtime":1786084510934,"results":"11934","hashOfConfig":"11005"},{"size":955,"mtime":1786084510935,"results":"11935","hashOfConfig":"11833"},{"size":2841,"mtime":1786084510935,"results":"11936","hashOfConfig":"11833"},{"size":899,"mtime":1786084510935,"results":"11937","hashOfConfig":"11833"},{"size":996,"mtime":1786084510935,"results":"11938","hashOfConfig":"11833"},{"size":536,"mtime":1786084510935,"results":"11939","hashOfConfig":"11833"},{"size":1285,"mtime":1786084510935,"results":"11940","hashOfConfig":"11833"},{"size":459,"mtime":1786084510935,"results":"11941","hashOfConfig":"11833"},{"size":1401,"mtime":1786084510935,"results":"11942","hashOfConfig":"11833"},{"size":732,"mtime":1786084510935,"results":"11943","hashOfConfig":"11833"},{"size":2510,"mtime":1786084510935,"results":"11944","hashOfConfig":"11833"},{"size":476,"mtime":1786084510936,"results":"11945","hashOfConfig":"11833"},{"size":645,"mtime":1786084510936,"results":"11946","hashOfConfig":"11833"},{"size":1356,"mtime":1786084510936,"results":"11947","hashOfConfig":"11833"},{"size":1090,"mtime":1786084510936,"results":"11948","hashOfConfig":"11005"},{"size":4971,"mtime":1786084510936,"results":"11949","hashOfConfig":"11833"},{"size":1597,"mtime":1786084510936,"results":"11950","hashOfConfig":"11833"},{"size":1792,"mtime":1786084510936,"results":"11951","hashOfConfig":"11005"},{"size":2910,"mtime":1786084510936,"results":"11952","hashOfConfig":"11833"},{"size":1106,"mtime":1786084510937,"results":"11953","hashOfConfig":"11833"},{"size":4989,"mtime":1786084510937,"results":"11954","hashOfConfig":"11833"},{"size":152,"mtime":1786084510937,"results":"11955","hashOfConfig":"11833"},{"size":24136,"mtime":1786084510937,"results":"11956","hashOfConfig":"11005"},{"size":510,"mtime":1786084510937,"results":"11957","hashOfConfig":"11005"},{"size":5631,"mtime":1786084510937,"results":"11958","hashOfConfig":"11005"},{"size":1758,"mtime":1786084510937,"results":"11959","hashOfConfig":"11005"},{"size":1423,"mtime":1786084510938,"results":"11960","hashOfConfig":"11833"},{"size":1426,"mtime":1786084510938,"results":"11961","hashOfConfig":"11833"},{"size":1804,"mtime":1786084510938,"results":"11962","hashOfConfig":"11833"},{"size":1121,"mtime":1786084510938,"results":"11963","hashOfConfig":"11833"},{"size":1961,"mtime":1786084510938,"results":"11964","hashOfConfig":"11833"},{"size":1311,"mtime":1786084510938,"results":"11965","hashOfConfig":"11005"},{"size":1563,"mtime":1786084510938,"results":"11966","hashOfConfig":"11005"},{"size":2520,"mtime":1786084510938,"results":"11967","hashOfConfig":"11005"},{"size":17521,"mtime":1786084510939,"results":"11968","hashOfConfig":"11005"},{"size":5947,"mtime":1786084510939,"results":"11969","hashOfConfig":"11005"},{"size":1381,"mtime":1786084510939,"results":"11970","hashOfConfig":"11005"},{"size":275,"mtime":1786084510939,"results":"11971","hashOfConfig":"11005"},{"size":276,"mtime":1786084510939,"results":"11972","hashOfConfig":"11005"},{"size":67,"mtime":1786084510939,"results":"11973","hashOfConfig":"11005"},{"size":300,"mtime":1786084510939,"results":"11974","hashOfConfig":"11005"},{"size":1481,"mtime":1786084510939,"results":"11975","hashOfConfig":"11005"},{"size":784,"mtime":1786084510939,"results":"11976","hashOfConfig":"11005"},{"size":2537,"mtime":1786084510939,"results":"11977","hashOfConfig":"11005"},{"size":29488,"mtime":1786084510940,"results":"11978","hashOfConfig":"11005"},{"size":731,"mtime":1786084510940,"results":"11979","hashOfConfig":"11005"},{"size":3224,"mtime":1786084510940,"results":"11980","hashOfConfig":"11005"},{"size":336,"mtime":1786084510940,"results":"11981","hashOfConfig":"11005"},{"size":6146,"mtime":1786084510940,"results":"11982","hashOfConfig":"11005"},{"size":328,"mtime":1786084510940,"results":"11983","hashOfConfig":"11005"},{"size":2181,"mtime":1786084510940,"results":"11984","hashOfConfig":"11005"},{"size":57,"mtime":1786084510940,"results":"11985","hashOfConfig":"11005"},{"size":3374,"mtime":1786084510940,"results":"11986","hashOfConfig":"11005"},{"size":6068,"mtime":1786084510940,"results":"11987","hashOfConfig":"11005"},{"size":20595,"mtime":1786084510941,"results":"11988","hashOfConfig":"11005"},{"size":902,"mtime":1786084510941,"results":"11989","hashOfConfig":"11005"},{"size":628,"mtime":1786084510941,"results":"11990","hashOfConfig":"11005"},{"size":163,"mtime":1786084510941,"results":"11991","hashOfConfig":"11005"},{"size":114,"mtime":1786084510941,"results":"11992","hashOfConfig":"11005"},{"size":2209,"mtime":1786084510941,"results":"11993","hashOfConfig":"11005"},{"size":3144,"mtime":1786084510941,"results":"11994","hashOfConfig":"11005"},{"size":1546,"mtime":1786084510941,"results":"11995","hashOfConfig":"11005"},{"size":411,"mtime":1786084510942,"results":"11996","hashOfConfig":"11005"},{"size":445,"mtime":1786084510942,"results":"11997","hashOfConfig":"11005"},{"size":30127,"mtime":1786084510942,"results":"11998","hashOfConfig":"11005"},{"size":1326,"mtime":1786084510942,"results":"11999","hashOfConfig":"11005"},{"size":427,"mtime":1786084510942,"results":"12000","hashOfConfig":"11005"},{"size":698,"mtime":1786084510943,"results":"12001","hashOfConfig":"11005"},{"size":9522,"mtime":1786084510943,"results":"12002","hashOfConfig":"11005"},{"size":12881,"mtime":1786084510944,"results":"12003","hashOfConfig":"11005"},{"size":12462,"mtime":1786084510944,"results":"12004","hashOfConfig":"11005"},{"size":3986,"mtime":1786084510944,"results":"12005","hashOfConfig":"11005"},{"size":3379,"mtime":1786084510944,"results":"12006","hashOfConfig":"11005"},{"size":1297,"mtime":1786084510943,"results":"12007","hashOfConfig":"11005"},{"size":7596,"mtime":1786084510945,"results":"12008","hashOfConfig":"11005"},{"size":7931,"mtime":1786084510945,"results":"12009","hashOfConfig":"11005"},{"size":28380,"mtime":1786084510945,"results":"12010","hashOfConfig":"11005"},{"size":960,"mtime":1786084510945,"results":"12011","hashOfConfig":"11005"},{"size":10090,"mtime":1786084510945,"results":"12012","hashOfConfig":"11005"},{"size":16090,"mtime":1786084510946,"results":"12013","hashOfConfig":"11005"},{"size":8609,"mtime":1786084510946,"results":"12014","hashOfConfig":"11005"},{"size":2532,"mtime":1786084510946,"results":"12015","hashOfConfig":"11005"},{"size":964,"mtime":1786084510946,"results":"12016","hashOfConfig":"11005"},{"size":5336,"mtime":1786084510946,"results":"12017","hashOfConfig":"11005"},{"size":6904,"mtime":1786084510946,"results":"12018","hashOfConfig":"11005"},{"size":9487,"mtime":1786084510947,"results":"12019","hashOfConfig":"11005"},{"size":4107,"mtime":1786084510947,"results":"12020","hashOfConfig":"11005"},{"size":470,"mtime":1786084510947,"results":"12021","hashOfConfig":"11005"},{"size":1019,"mtime":1786084510947,"results":"12022","hashOfConfig":"11005"},{"size":19942,"mtime":1786084510947,"results":"12023","hashOfConfig":"11005"},{"size":14548,"mtime":1786084510944,"results":"12024","hashOfConfig":"11005"},{"size":2800,"mtime":1786084510947,"results":"12025","hashOfConfig":"11005"},{"size":2005,"mtime":1786084510947,"results":"12026","hashOfConfig":"11005"},{"size":295,"mtime":1786084510947,"results":"12027","hashOfConfig":"11005"},{"size":5731,"mtime":1786084510948,"results":"12028","hashOfConfig":"11005"},{"size":801,"mtime":1786084510948,"results":"12029","hashOfConfig":"11005"},{"size":659,"mtime":1786084510948,"results":"12030","hashOfConfig":"11005"},{"size":836,"mtime":1786084510948,"results":"12031","hashOfConfig":"11005"},{"size":19877,"mtime":1786084510948,"results":"12032","hashOfConfig":"11005"},{"size":3726,"mtime":1786084510948,"results":"12033","hashOfConfig":"11005"},{"size":8545,"mtime":1786084510948,"results":"12034","hashOfConfig":"11005"},{"size":2917,"mtime":1786084510949,"results":"12035","hashOfConfig":"11005"},{"size":758,"mtime":1786084510949,"results":"12036","hashOfConfig":"11005"},{"size":1508,"mtime":1786084510949,"results":"12037","hashOfConfig":"11005"},{"size":2942,"mtime":1786084510949,"results":"12038","hashOfConfig":"11005"},{"size":2304,"mtime":1786084510949,"results":"12039","hashOfConfig":"11005"},{"size":4237,"mtime":1786084510949,"results":"12040","hashOfConfig":"11005"},{"size":10700,"mtime":1786084510950,"results":"12041","hashOfConfig":"11833"},{"size":1704,"mtime":1786084510950,"results":"12042","hashOfConfig":"11005"},{"size":207,"mtime":1786084510950,"results":"12043","hashOfConfig":"11005"},{"size":1098,"mtime":1786084510950,"results":"12044","hashOfConfig":"11005"},{"size":9518,"mtime":1786084510950,"results":"12045","hashOfConfig":"11005"},{"size":4919,"mtime":1786084510950,"results":"12046","hashOfConfig":"11005"},{"size":1708,"mtime":1786084510950,"results":"12047","hashOfConfig":"11005"},{"size":959,"mtime":1786084510950,"results":"12048","hashOfConfig":"11005"},{"size":725,"mtime":1786084510951,"results":"12049","hashOfConfig":"11005"},{"size":5512,"mtime":1786084510951,"results":"12050","hashOfConfig":"11005"},{"size":18283,"mtime":1786084510951,"results":"12051","hashOfConfig":"11005"},{"size":1224,"mtime":1786084510951,"results":"12052","hashOfConfig":"11005"},{"size":1849,"mtime":1786084510951,"results":"12053","hashOfConfig":"11005"},{"size":6012,"mtime":1786084510952,"results":"12054","hashOfConfig":"11005"},{"size":5197,"mtime":1786084510952,"results":"12055","hashOfConfig":"11005"},{"size":8422,"mtime":1786084510952,"results":"12056","hashOfConfig":"11005"},{"size":10166,"mtime":1786084510953,"results":"12057","hashOfConfig":"11005"},{"size":3176,"mtime":1786084510953,"results":"12058","hashOfConfig":"11005"},{"size":15384,"mtime":1786084510953,"results":"12059","hashOfConfig":"11005"},{"size":6518,"mtime":1786084510953,"results":"12060","hashOfConfig":"11005"},{"size":4417,"mtime":1786084510953,"results":"12061","hashOfConfig":"11005"},{"size":1151,"mtime":1786084510954,"results":"12062","hashOfConfig":"11005"},{"size":2635,"mtime":1786084510954,"results":"12063","hashOfConfig":"11005"},{"size":1519,"mtime":1786084510954,"results":"12064","hashOfConfig":"11005"},{"size":5092,"mtime":1786084510954,"results":"12065","hashOfConfig":"11005"},{"size":2384,"mtime":1786084510954,"results":"12066","hashOfConfig":"11005"},{"size":1283,"mtime":1786084510954,"results":"12067","hashOfConfig":"11005"},{"size":2010,"mtime":1786084510954,"results":"12068","hashOfConfig":"11005"},{"size":1525,"mtime":1786084510954,"results":"12069","hashOfConfig":"11005"},{"size":6035,"mtime":1786084510955,"results":"12070","hashOfConfig":"11005"},{"size":1353,"mtime":1786084510955,"results":"12071","hashOfConfig":"11005"},{"size":6156,"mtime":1786084510955,"results":"12072","hashOfConfig":"11005"},{"size":1934,"mtime":1786084510956,"results":"12073","hashOfConfig":"11005"},{"size":2712,"mtime":1786084510956,"results":"12074","hashOfConfig":"11005"},{"size":35808,"mtime":1786084510956,"results":"12075","hashOfConfig":"11005"},{"size":1040,"mtime":1786084510956,"results":"12076","hashOfConfig":"11005"},{"size":826,"mtime":1786084510956,"results":"12077","hashOfConfig":"11005"},{"size":3055,"mtime":1786084510956,"results":"12078","hashOfConfig":"11005"},{"size":3417,"mtime":1786084510956,"results":"12079","hashOfConfig":"11005"},{"size":12877,"mtime":1786084510957,"results":"12080","hashOfConfig":"11005"},{"size":1090,"mtime":1786084510957,"results":"12081","hashOfConfig":"11005"},{"size":3550,"mtime":1786084510957,"results":"12082","hashOfConfig":"11005"},{"size":941,"mtime":1786084510957,"results":"12083","hashOfConfig":"11005"},{"size":3287,"mtime":1786084510957,"results":"12084","hashOfConfig":"11005"},{"size":10670,"mtime":1786084510957,"results":"12085","hashOfConfig":"11005"},{"size":3964,"mtime":1786084510957,"results":"12086","hashOfConfig":"11005"},{"size":2115,"mtime":1786084510958,"results":"12087","hashOfConfig":"11005"},{"size":8756,"mtime":1786084510958,"results":"12088","hashOfConfig":"11005"},{"size":450,"mtime":1786084510958,"results":"12089","hashOfConfig":"11005"},{"size":95,"mtime":1786084510958,"results":"12090","hashOfConfig":"11005"},{"size":1513,"mtime":1786084510958,"results":"12091","hashOfConfig":"11005"},{"size":10397,"mtime":1786084510958,"results":"12092","hashOfConfig":"11005"},{"size":4277,"mtime":1786084510959,"results":"12093","hashOfConfig":"11005"},{"size":3417,"mtime":1786084510959,"results":"12094","hashOfConfig":"11005"},{"size":11277,"mtime":1786084510959,"results":"12095","hashOfConfig":"11005"},{"size":2637,"mtime":1786084510959,"results":"12096","hashOfConfig":"11005"},{"size":24999,"mtime":1786084510960,"results":"12097","hashOfConfig":"11005"},{"size":2180,"mtime":1786084510960,"results":"12098","hashOfConfig":"11005"},{"size":2469,"mtime":1786084510960,"results":"12099","hashOfConfig":"11005"},{"size":3140,"mtime":1786084510960,"results":"12100","hashOfConfig":"11005"},{"size":5412,"mtime":1786084510960,"results":"12101","hashOfConfig":"11005"},{"size":20818,"mtime":1786084510960,"results":"12102","hashOfConfig":"11005"},{"size":10145,"mtime":1786084510961,"results":"12103","hashOfConfig":"11005"},{"size":194,"mtime":1786084510961,"results":"12104","hashOfConfig":"11005"},{"size":2089,"mtime":1786084510961,"results":"12105","hashOfConfig":"11005"},{"size":6352,"mtime":1786084510961,"results":"12106","hashOfConfig":"11005"},{"size":1560,"mtime":1786084510961,"results":"12107","hashOfConfig":"11005"},{"size":1280,"mtime":1786084510961,"results":"12108","hashOfConfig":"11005"},{"size":501,"mtime":1786084510961,"results":"12109","hashOfConfig":"11005"},{"size":1067,"mtime":1786084510961,"results":"12110","hashOfConfig":"11005"},{"size":1229,"mtime":1786084510961,"results":"12111","hashOfConfig":"11005"},{"size":1495,"mtime":1786084510961,"results":"12112","hashOfConfig":"11005"},{"size":2639,"mtime":1786084510962,"results":"12113","hashOfConfig":"11005"},{"size":1632,"mtime":1786084510962,"results":"12114","hashOfConfig":"11005"},{"size":1090,"mtime":1786084510962,"results":"12115","hashOfConfig":"11005"},{"size":4284,"mtime":1786084510962,"results":"12116","hashOfConfig":"11005"},{"size":5926,"mtime":1786084510962,"results":"12117","hashOfConfig":"11005"},{"size":655,"mtime":1786084510962,"results":"12118","hashOfConfig":"11005"},{"size":3533,"mtime":1786084510962,"results":"12119","hashOfConfig":"11005"},{"size":1171,"mtime":1786084510962,"results":"12120","hashOfConfig":"11005"},{"size":2185,"mtime":1786084510962,"results":"12121","hashOfConfig":"11005"},{"size":6714,"mtime":1786084510962,"results":"12122","hashOfConfig":"11005"},{"size":6522,"mtime":1786084510963,"results":"12123","hashOfConfig":"11005"},{"size":994,"mtime":1786084510963,"results":"12124","hashOfConfig":"11005"},{"size":5393,"mtime":1786084510963,"results":"12125","hashOfConfig":"11005"},{"size":1082,"mtime":1786084510963,"results":"12126","hashOfConfig":"11005"},{"size":1700,"mtime":1786084510963,"results":"12127","hashOfConfig":"11005"},{"size":13757,"mtime":1786084510963,"results":"12128","hashOfConfig":"11005"},{"size":2317,"mtime":1786084510963,"results":"12129","hashOfConfig":"11005"},{"size":4261,"mtime":1786084510963,"results":"12130","hashOfConfig":"11005"},{"size":6997,"mtime":1786084510963,"results":"12131","hashOfConfig":"11005"},{"size":137,"mtime":1786084510964,"results":"12132","hashOfConfig":"11005"},{"size":6058,"mtime":1786084510964,"results":"12133","hashOfConfig":"11005"},{"size":2493,"mtime":1786084510964,"results":"12134","hashOfConfig":"11005"},{"size":2380,"mtime":1786084510964,"results":"12135","hashOfConfig":"11005"},{"size":3237,"mtime":1786084510964,"results":"12136","hashOfConfig":"11005"},{"size":3905,"mtime":1786084510964,"results":"12137","hashOfConfig":"11005"},{"size":3064,"mtime":1786084510964,"results":"12138","hashOfConfig":"12139"},{"size":1337,"mtime":1786084510964,"results":"12140","hashOfConfig":"11005"},{"size":1479,"mtime":1786084510964,"results":"12141","hashOfConfig":"11005"},{"size":5416,"mtime":1786084510965,"results":"12142","hashOfConfig":"11005"},{"size":1960,"mtime":1786084510965,"results":"12143","hashOfConfig":"11005"},{"size":1703,"mtime":1786084510965,"results":"12144","hashOfConfig":"11005"},{"size":2463,"mtime":1786084510965,"results":"12145","hashOfConfig":"11005"},{"size":1800,"mtime":1786084510965,"results":"12146","hashOfConfig":"11005"},{"size":429,"mtime":1786084510965,"results":"12147","hashOfConfig":"11005"},{"size":8890,"mtime":1786084510965,"results":"12148","hashOfConfig":"11005"},{"size":1676,"mtime":1786084510965,"results":"12149","hashOfConfig":"11005"},{"size":2864,"mtime":1786084510965,"results":"12150","hashOfConfig":"11005"},{"size":4747,"mtime":1786084510966,"results":"12151","hashOfConfig":"11005"},{"size":1646,"mtime":1786084510966,"results":"12152","hashOfConfig":"11005"},{"size":657,"mtime":1786084510966,"results":"12153","hashOfConfig":"11005"},{"size":8489,"mtime":1786084510966,"results":"12154","hashOfConfig":"11005"},{"size":4169,"mtime":1786084510966,"results":"12155","hashOfConfig":"11005"},{"size":3228,"mtime":1786084510966,"results":"12156","hashOfConfig":"11005"},{"size":1439,"mtime":1786084510966,"results":"12157","hashOfConfig":"11005"},{"size":5421,"mtime":1786084510966,"results":"12158","hashOfConfig":"11005"},{"size":810,"mtime":1786084510966,"results":"12159","hashOfConfig":"11005"},{"size":986,"mtime":1786084510967,"results":"12160","hashOfConfig":"11005"},{"size":2176,"mtime":1786084510967,"results":"12161","hashOfConfig":"11005"},{"size":4837,"mtime":1786084510967,"results":"12162","hashOfConfig":"11005"},{"size":8256,"mtime":1786084510967,"results":"12163","hashOfConfig":"11005"},{"size":3056,"mtime":1786084510967,"results":"12164","hashOfConfig":"11005"},{"size":2042,"mtime":1786084510967,"results":"12165","hashOfConfig":"11005"},{"size":2838,"mtime":1786084510967,"results":"12166","hashOfConfig":"11005"},{"size":3007,"mtime":1786084510967,"results":"12167","hashOfConfig":"11005"},{"size":1147,"mtime":1786084510967,"results":"12168","hashOfConfig":"11005"},{"size":14304,"mtime":1786084510968,"results":"12169","hashOfConfig":"11005"},{"size":3807,"mtime":1786084510968,"results":"12170","hashOfConfig":"11005"},{"size":3196,"mtime":1786084510968,"results":"12171","hashOfConfig":"11005"},{"size":503,"mtime":1786084510968,"results":"12172","hashOfConfig":"11005"},{"size":2056,"mtime":1786084510968,"results":"12173","hashOfConfig":"11005"},{"size":15771,"mtime":1786084510968,"results":"12174","hashOfConfig":"11005"},{"size":14882,"mtime":1786084510969,"results":"12175","hashOfConfig":"11005"},{"size":8185,"mtime":1786084510969,"results":"12176","hashOfConfig":"11005"},{"size":4066,"mtime":1786084510969,"results":"12177","hashOfConfig":"11005"},{"size":1814,"mtime":1786084510969,"results":"12178","hashOfConfig":"11005"},{"size":18018,"mtime":1786084510969,"results":"12179","hashOfConfig":"11005"},{"size":3251,"mtime":1786084510969,"results":"12180","hashOfConfig":"11005"},{"size":1859,"mtime":1786084510969,"results":"12181","hashOfConfig":"11005"},{"size":6075,"mtime":1786084510970,"results":"12182","hashOfConfig":"11005"},{"size":7663,"mtime":1786084510970,"results":"12183","hashOfConfig":"11005"},{"size":2148,"mtime":1786084510970,"results":"12184","hashOfConfig":"11005"},{"size":1402,"mtime":1786084510970,"results":"12185","hashOfConfig":"11005"},{"size":24577,"mtime":1786084510970,"results":"12186","hashOfConfig":"11005"},{"size":8348,"mtime":1786084510971,"results":"12187","hashOfConfig":"11005"},{"size":4149,"mtime":1786084510971,"results":"12188","hashOfConfig":"11005"},{"size":2721,"mtime":1786084510971,"results":"12189","hashOfConfig":"11005"},{"size":9837,"mtime":1786084510971,"results":"12190","hashOfConfig":"11005"},{"size":1584,"mtime":1786084510971,"results":"12191","hashOfConfig":"11005"},{"size":704,"mtime":1786084510968,"results":"12192","hashOfConfig":"11005"},{"size":19687,"mtime":1786084510971,"results":"12193","hashOfConfig":"11005"},{"size":5112,"mtime":1786084510971,"results":"12194","hashOfConfig":"11005"},{"size":2948,"mtime":1786084510972,"results":"12195","hashOfConfig":"11005"},{"size":79473,"mtime":1786084510972,"results":"12196","hashOfConfig":"11005"},{"size":7819,"mtime":1786084510972,"results":"12197","hashOfConfig":"11005"},{"size":35802,"mtime":1786084510973,"results":"12198","hashOfConfig":"11005"},{"size":2055,"mtime":1786084510973,"results":"12199","hashOfConfig":"11005"},{"size":780,"mtime":1786084510973,"results":"12200","hashOfConfig":"11005"},{"size":7651,"mtime":1786084510973,"results":"12201","hashOfConfig":"11005"},{"size":5276,"mtime":1786084510973,"results":"12202","hashOfConfig":"11005"},{"size":986,"mtime":1786084510973,"results":"12203","hashOfConfig":"11005"},{"size":6818,"mtime":1786084510974,"results":"12204","hashOfConfig":"11005"},{"size":97727,"mtime":1786084510975,"results":"12205","hashOfConfig":"11005"},{"size":5303,"mtime":1786084510975,"results":"12206","hashOfConfig":"11005"},{"size":994,"mtime":1786084510975,"results":"12207","hashOfConfig":"11005"},{"size":1434,"mtime":1786084510975,"results":"12208","hashOfConfig":"11005"},{"size":3807,"mtime":1786084510975,"results":"12209","hashOfConfig":"11005"},{"size":18357,"mtime":1786084510975,"results":"12210","hashOfConfig":"11005"},{"size":612,"mtime":1786084510976,"results":"12211","hashOfConfig":"11005"},{"size":1255,"mtime":1786084510976,"results":"12212","hashOfConfig":"11005"},{"size":4523,"mtime":1786084510976,"results":"12213","hashOfConfig":"11005"},{"size":823,"mtime":1786084510976,"results":"12214","hashOfConfig":"11005"},{"size":10513,"mtime":1786084510976,"results":"12215","hashOfConfig":"11005"},{"size":5575,"mtime":1786084510976,"results":"12216","hashOfConfig":"11005"},{"size":12934,"mtime":1786084510976,"results":"12217","hashOfConfig":"11005"},{"size":2281,"mtime":1786084510976,"results":"12218","hashOfConfig":"11005"},{"size":1246,"mtime":1786084510977,"results":"12219","hashOfConfig":"11005"},{"size":633,"mtime":1786084510977,"results":"12220","hashOfConfig":"11005"},{"size":219,"mtime":1786084510977,"results":"12221","hashOfConfig":"11005"},{"size":2547,"mtime":1786084510977,"results":"12222","hashOfConfig":"11005"},{"size":3557,"mtime":1786084510977,"results":"12223","hashOfConfig":"11005"},{"size":3867,"mtime":1786084510977,"results":"12224","hashOfConfig":"11005"},{"size":3585,"mtime":1786084510977,"results":"12225","hashOfConfig":"11005"},{"size":302,"mtime":1786084510977,"results":"12226","hashOfConfig":"11005"},{"size":249,"mtime":1786084510977,"results":"12227","hashOfConfig":"11005"},{"size":794,"mtime":1786084510977,"results":"12228","hashOfConfig":"11005"},{"size":533,"mtime":1786084510978,"results":"12229","hashOfConfig":"8216"},{"size":1137,"mtime":1786084510978,"results":"12230","hashOfConfig":"8216"},{"size":2489,"mtime":1786084510978,"results":"12231","hashOfConfig":"12232"},{"size":2691,"mtime":1786084510979,"results":"12233","hashOfConfig":"12232"},{"size":4337,"mtime":1786084510979,"results":"12234","hashOfConfig":"12232"},{"size":10284,"mtime":1786084510979,"results":"12235","hashOfConfig":"12232"},{"size":16678,"mtime":1786084510979,"results":"12236","hashOfConfig":"12232"},{"size":4508,"mtime":1786084510979,"results":"12237","hashOfConfig":"12232"},{"size":10728,"mtime":1786084510980,"results":"12238","hashOfConfig":"12232"},{"size":13001,"mtime":1786084510980,"results":"12239","hashOfConfig":"12232"},{"size":22327,"mtime":1786084510980,"results":"12240","hashOfConfig":"12232"},{"size":1637,"mtime":1786084510980,"results":"12241","hashOfConfig":"12232"},{"size":11751,"mtime":1786084510980,"results":"12242","hashOfConfig":"12232"},{"size":6246,"mtime":1786084510980,"results":"12243","hashOfConfig":"12232"},{"size":6142,"mtime":1786084510981,"results":"12244","hashOfConfig":"12232"},{"size":6615,"mtime":1786084510981,"results":"12245","hashOfConfig":"12232"},{"size":10016,"mtime":1786084510981,"results":"12246","hashOfConfig":"12232"},{"size":23177,"mtime":1786084510981,"results":"12247","hashOfConfig":"12232"},{"size":1138,"mtime":1786084510981,"results":"12248","hashOfConfig":"12232"},{"size":1754,"mtime":1786084510981,"results":"12249","hashOfConfig":"12232"},{"size":6479,"mtime":1786084510981,"results":"12250","hashOfConfig":"12232"},{"size":20290,"mtime":1786084510982,"results":"12251","hashOfConfig":"12232"},{"size":2819,"mtime":1786084510982,"results":"12252","hashOfConfig":"12232"},{"size":12117,"mtime":1786084510982,"results":"12253","hashOfConfig":"12232"},{"size":3453,"mtime":1786084510982,"results":"12254","hashOfConfig":"12232"},{"size":4087,"mtime":1786084510982,"results":"12255","hashOfConfig":"12232"},{"size":5866,"mtime":1786084510982,"results":"12256","hashOfConfig":"12232"},{"size":3059,"mtime":1786084510982,"results":"12257","hashOfConfig":"12232"},{"size":2177,"mtime":1786084510982,"results":"12258","hashOfConfig":"12232"},{"size":4997,"mtime":1786084510983,"results":"12259","hashOfConfig":"12232"},{"size":5319,"mtime":1786084510983,"results":"12260","hashOfConfig":"12232"},{"size":19903,"mtime":1786084510983,"results":"12261","hashOfConfig":"12232"},{"size":11514,"mtime":1786084510983,"results":"12262","hashOfConfig":"12232"},{"size":6436,"mtime":1786084510983,"results":"12263","hashOfConfig":"12232"},{"size":1993,"mtime":1786084510983,"results":"12264","hashOfConfig":"12232"},{"size":5776,"mtime":1786084510984,"results":"12265","hashOfConfig":"12232"},{"size":4013,"mtime":1786084510984,"results":"12266","hashOfConfig":"12232"},{"size":7286,"mtime":1786084510984,"results":"12267","hashOfConfig":"12232"},{"size":988,"mtime":1786084510984,"results":"12268","hashOfConfig":"12232"},{"size":8582,"mtime":1786084510984,"results":"12269","hashOfConfig":"12232"},{"size":12162,"mtime":1786084510984,"results":"12270","hashOfConfig":"12232"},{"size":7233,"mtime":1786084510985,"results":"12271","hashOfConfig":"12232"},{"size":11112,"mtime":1786084510985,"results":"12272","hashOfConfig":"12232"},{"size":815,"mtime":1786084510985,"results":"12273","hashOfConfig":"12232"},{"size":2306,"mtime":1786084510985,"results":"12274","hashOfConfig":"12232"},{"size":4644,"mtime":1786084510985,"results":"12275","hashOfConfig":"12232"},{"size":4795,"mtime":1786084510986,"results":"12276","hashOfConfig":"12232"},{"size":7553,"mtime":1786084510986,"results":"12277","hashOfConfig":"12232"},{"size":1206,"mtime":1786084510986,"results":"12278","hashOfConfig":"12232"},{"size":24684,"mtime":1786084510986,"results":"12279","hashOfConfig":"12232"},{"size":7261,"mtime":1786084510986,"results":"12280","hashOfConfig":"12232"},{"size":4087,"mtime":1786084510987,"results":"12281","hashOfConfig":"12232"},{"size":746,"mtime":1786084510987,"results":"12282","hashOfConfig":"12232"},{"size":775,"mtime":1786084510987,"results":"12283","hashOfConfig":"12232"},{"size":233,"mtime":1786084510988,"results":"12284","hashOfConfig":"12285"},{"size":46,"mtime":1786084510988,"results":"12286","hashOfConfig":"8216"},{"size":176,"mtime":1786084510988,"results":"12287","hashOfConfig":"8216"},{"size":2323,"mtime":1786084510989,"results":"12288","hashOfConfig":"12232"},{"size":876,"mtime":1786084510990,"results":"12289","hashOfConfig":"12285"},{"size":3632,"mtime":1786084510990,"results":"12290","hashOfConfig":"12232"},{"size":4765,"mtime":1786084510990,"results":"12291","hashOfConfig":"12232"},{"size":4006,"mtime":1786084510990,"results":"12292","hashOfConfig":"12232"},{"size":5733,"mtime":1786084510990,"results":"12293","hashOfConfig":"12232"},{"size":799,"mtime":1786084510990,"results":"12294","hashOfConfig":"12232"},{"size":2061,"mtime":1786084510991,"results":"12295","hashOfConfig":"12232"},{"size":1988,"mtime":1786084510991,"results":"12296","hashOfConfig":"12232"},{"size":2165,"mtime":1786084510991,"results":"12297","hashOfConfig":"12232"},{"size":8162,"mtime":1786084510991,"results":"12298","hashOfConfig":"12232"},{"size":544,"mtime":1786084510991,"results":"12299","hashOfConfig":"12232"},{"size":883,"mtime":1786084510991,"results":"12300","hashOfConfig":"12232"},{"size":1684,"mtime":1786084510992,"results":"12301","hashOfConfig":"12232"},{"size":672,"mtime":1786084510992,"results":"12302","hashOfConfig":"12232"},{"size":1280,"mtime":1786084510992,"results":"12303","hashOfConfig":"12232"},{"size":2004,"mtime":1786084510992,"results":"12304","hashOfConfig":"12232"},{"size":468,"mtime":1786084510992,"results":"12305","hashOfConfig":"12232"},{"size":11934,"mtime":1786084510992,"results":"12306","hashOfConfig":"12232"},{"size":3863,"mtime":1786084510992,"results":"12307","hashOfConfig":"12232"},{"size":5394,"mtime":1786084510993,"results":"12308","hashOfConfig":"12232"},{"size":6202,"mtime":1786084510993,"results":"12309","hashOfConfig":"12232"},{"size":6335,"mtime":1786084510993,"results":"12310","hashOfConfig":"12232"},{"size":6827,"mtime":1786084510993,"results":"12311","hashOfConfig":"12232"},{"size":12331,"mtime":1786084510993,"results":"12312","hashOfConfig":"12232"},{"size":5574,"mtime":1786084510993,"results":"12313","hashOfConfig":"12232"},{"size":7318,"mtime":1786084510994,"results":"12314","hashOfConfig":"12232"},{"size":10758,"mtime":1786084510994,"results":"12315","hashOfConfig":"12232"},{"size":10785,"mtime":1786084510994,"results":"12316","hashOfConfig":"12232"},{"size":7539,"mtime":1786084510994,"results":"12317","hashOfConfig":"12232"},{"size":18359,"mtime":1786084510994,"results":"12318","hashOfConfig":"12232"},{"size":19835,"mtime":1786084510995,"results":"12319","hashOfConfig":"12232"},{"size":6591,"mtime":1786084510995,"results":"12320","hashOfConfig":"12232"},{"size":13544,"mtime":1786084510995,"results":"12321","hashOfConfig":"12232"},{"size":10002,"mtime":1786084510995,"results":"12322","hashOfConfig":"12232"},{"size":50084,"mtime":1786084510996,"results":"12323","hashOfConfig":"12232"},{"size":35973,"mtime":1786084510996,"results":"12324","hashOfConfig":"12232"},{"size":3667,"mtime":1786084510996,"results":"12325","hashOfConfig":"12232"},{"size":11454,"mtime":1786084510996,"results":"12326","hashOfConfig":"12232"},{"size":7446,"mtime":1786084510997,"results":"12327","hashOfConfig":"12232"},{"size":7728,"mtime":1786084510997,"results":"12328","hashOfConfig":"12232"},{"size":10997,"mtime":1786084510997,"results":"12329","hashOfConfig":"12232"},{"size":7202,"mtime":1786084510997,"results":"12330","hashOfConfig":"12232"},{"size":7150,"mtime":1786084510997,"results":"12331","hashOfConfig":"12232"},{"size":6887,"mtime":1786084510998,"results":"12332","hashOfConfig":"12232"},{"size":7112,"mtime":1786084510998,"results":"12333","hashOfConfig":"12232"},{"size":7202,"mtime":1786084510998,"results":"12334","hashOfConfig":"12232"},{"size":10347,"mtime":1786084510998,"results":"12335","hashOfConfig":"12232"},{"size":6029,"mtime":1786084510998,"results":"12336","hashOfConfig":"12232"},{"size":16161,"mtime":1786084510998,"results":"12337","hashOfConfig":"12232"},{"size":13880,"mtime":1786084510999,"results":"12338","hashOfConfig":"12232"},{"size":18473,"mtime":1786084510999,"results":"12339","hashOfConfig":"12232"},{"size":17857,"mtime":1786084510999,"results":"12340","hashOfConfig":"12232"},{"size":5709,"mtime":1786084510999,"results":"12341","hashOfConfig":"12232"},{"size":15823,"mtime":1786084511000,"results":"12342","hashOfConfig":"12232"},{"size":11159,"mtime":1786084511000,"results":"12343","hashOfConfig":"12232"},{"size":6888,"mtime":1786084511000,"results":"12344","hashOfConfig":"12232"},{"size":2459,"mtime":1786084511000,"results":"12345","hashOfConfig":"12232"},{"size":7343,"mtime":1786084511000,"results":"12346","hashOfConfig":"12232"},{"size":12242,"mtime":1786084511001,"results":"12347","hashOfConfig":"12232"},{"size":8432,"mtime":1786084511001,"results":"12348","hashOfConfig":"12232"},{"size":1894,"mtime":1786084511001,"results":"12349","hashOfConfig":"12232"},{"size":21681,"mtime":1786084511001,"results":"12350","hashOfConfig":"12232"},{"size":13365,"mtime":1786084511002,"results":"12351","hashOfConfig":"12232"},{"size":5022,"mtime":1786084511002,"results":"12352","hashOfConfig":"12232"},{"size":18772,"mtime":1786084511002,"results":"12353","hashOfConfig":"12232"},{"size":7286,"mtime":1786084511002,"results":"12354","hashOfConfig":"12232"},{"size":11487,"mtime":1786084511003,"results":"12355","hashOfConfig":"12232"},{"size":4232,"mtime":1786084511003,"results":"12356","hashOfConfig":"12232"},{"size":3504,"mtime":1786084511003,"results":"12357","hashOfConfig":"12232"},{"size":17821,"mtime":1786084511003,"results":"12358","hashOfConfig":"12232"},{"size":4673,"mtime":1786084511003,"results":"12359","hashOfConfig":"12232"},{"size":2887,"mtime":1786084511003,"results":"12360","hashOfConfig":"12232"},{"size":6239,"mtime":1786084511004,"results":"12361","hashOfConfig":"12232"},{"size":12661,"mtime":1786084511004,"results":"12362","hashOfConfig":"12232"},{"size":13477,"mtime":1786084511004,"results":"12363","hashOfConfig":"12232"},{"size":5760,"mtime":1786084511004,"results":"12364","hashOfConfig":"12232"},{"size":2603,"mtime":1786084511004,"results":"12365","hashOfConfig":"12232"},{"size":7336,"mtime":1786084511004,"results":"12366","hashOfConfig":"12232"},{"size":26079,"mtime":1786084511005,"results":"12367","hashOfConfig":"12232"},{"size":15464,"mtime":1786084511005,"results":"12368","hashOfConfig":"12232"},{"size":8286,"mtime":1786084511005,"results":"12369","hashOfConfig":"12232"},{"size":10049,"mtime":1786084511005,"results":"12370","hashOfConfig":"12232"},{"size":6380,"mtime":1786084511005,"results":"12371","hashOfConfig":"12232"},{"size":5248,"mtime":1786084511006,"results":"12372","hashOfConfig":"12232"},{"size":79093,"mtime":1786084511007,"results":"12373","hashOfConfig":"12232"},{"size":6476,"mtime":1786084511007,"results":"12374","hashOfConfig":"12232"},{"size":2631,"mtime":1786084511007,"results":"12375","hashOfConfig":"12232"},{"size":3352,"mtime":1786084511007,"results":"12376","hashOfConfig":"12232"},{"size":3915,"mtime":1786084511007,"results":"12377","hashOfConfig":"12232"},{"size":19809,"mtime":1786084511007,"results":"12378","hashOfConfig":"12232"},{"size":3777,"mtime":1786084511008,"results":"12379","hashOfConfig":"12232"},{"size":4512,"mtime":1786084511008,"results":"12380","hashOfConfig":"12232"},{"size":4715,"mtime":1786084511008,"results":"12381","hashOfConfig":"12232"},{"size":4995,"mtime":1786084511008,"results":"12382","hashOfConfig":"12232"},{"size":5958,"mtime":1786084511008,"results":"12383","hashOfConfig":"12232"},{"size":7062,"mtime":1786084511008,"results":"12384","hashOfConfig":"12232"},{"size":2962,"mtime":1786084511008,"results":"12385","hashOfConfig":"12232"},{"size":4160,"mtime":1786084511008,"results":"12386","hashOfConfig":"12232"},{"size":24550,"mtime":1786084511009,"results":"12387","hashOfConfig":"12232"},{"size":9667,"mtime":1786084511009,"results":"12388","hashOfConfig":"12232"},{"size":16162,"mtime":1786084511009,"results":"12389","hashOfConfig":"12232"},{"size":11246,"mtime":1786084511009,"results":"12390","hashOfConfig":"12232"},{"size":12469,"mtime":1786084511009,"results":"12391","hashOfConfig":"12232"},{"size":11230,"mtime":1786084511010,"results":"12392","hashOfConfig":"12232"},{"size":13731,"mtime":1786084511010,"results":"12393","hashOfConfig":"12232"},{"size":2343,"mtime":1786084511010,"results":"12394","hashOfConfig":"12232"},{"size":21285,"mtime":1786084511010,"results":"12395","hashOfConfig":"12232"},{"size":6805,"mtime":1786084511010,"results":"12396","hashOfConfig":"12232"},{"size":14586,"mtime":1786084511011,"results":"12397","hashOfConfig":"12232"},{"size":8417,"mtime":1786084511011,"results":"12398","hashOfConfig":"12232"},{"size":14614,"mtime":1786084511011,"results":"12399","hashOfConfig":"12232"},{"size":10891,"mtime":1786084511011,"results":"12400","hashOfConfig":"12232"},{"size":4083,"mtime":1786084511011,"results":"12401","hashOfConfig":"12232"},{"size":11230,"mtime":1786084511011,"results":"12402","hashOfConfig":"12232"},{"size":6348,"mtime":1786084511012,"results":"12403","hashOfConfig":"12232"},{"size":5621,"mtime":1786084511012,"results":"12404","hashOfConfig":"12232"},{"size":9945,"mtime":1786084511012,"results":"12405","hashOfConfig":"12232"},{"size":7461,"mtime":1786084511012,"results":"12406","hashOfConfig":"12232"},{"size":13037,"mtime":1786084511012,"results":"12407","hashOfConfig":"12232"},{"size":2208,"mtime":1786084511012,"results":"12408","hashOfConfig":"12232"},{"size":25438,"mtime":1786084511013,"results":"12409","hashOfConfig":"12232"},{"size":16265,"mtime":1786084511013,"results":"12410","hashOfConfig":"12232"},{"size":13534,"mtime":1786084511013,"results":"12411","hashOfConfig":"12232"},{"size":7418,"mtime":1786084511013,"results":"12412","hashOfConfig":"12232"},{"size":13302,"mtime":1786084511014,"results":"12413","hashOfConfig":"12232"},{"size":8412,"mtime":1786084511014,"results":"12414","hashOfConfig":"12232"},{"size":27589,"mtime":1786084511014,"results":"12415","hashOfConfig":"12232"},{"size":4776,"mtime":1786084511014,"results":"12416","hashOfConfig":"12232"},{"size":5676,"mtime":1786084511014,"results":"12417","hashOfConfig":"12232"},{"size":5927,"mtime":1786084511014,"results":"12418","hashOfConfig":"12232"},{"size":9076,"mtime":1786084511015,"results":"12419","hashOfConfig":"12232"},{"size":7004,"mtime":1786084511015,"results":"12420","hashOfConfig":"12232"},{"size":4965,"mtime":1786084511015,"results":"12421","hashOfConfig":"12232"},{"size":4857,"mtime":1786084511015,"results":"12422","hashOfConfig":"12232"},{"size":4305,"mtime":1786084511015,"results":"12423","hashOfConfig":"12232"},{"size":6599,"mtime":1786084511015,"results":"12424","hashOfConfig":"12232"},{"size":4662,"mtime":1786084511015,"results":"12425","hashOfConfig":"12232"},{"size":7889,"mtime":1786084511016,"results":"12426","hashOfConfig":"12232"},{"size":4596,"mtime":1786084511016,"results":"12427","hashOfConfig":"12232"},{"size":6630,"mtime":1786084511016,"results":"12428","hashOfConfig":"12232"},{"size":2617,"mtime":1786084511016,"results":"12429","hashOfConfig":"12232"},{"size":671,"mtime":1786084511016,"results":"12430","hashOfConfig":"8216"},{"size":4207,"mtime":1786084511016,"results":"12431","hashOfConfig":"12232"},{"size":214,"mtime":1786084511017,"results":"12432","hashOfConfig":"12285"},{"size":7896,"mtime":1786084511022,"results":"12433","hashOfConfig":"12232"},{"size":4273,"mtime":1786084511022,"results":"12434","hashOfConfig":"12232"},{"size":5033,"mtime":1786084511022,"results":"12435","hashOfConfig":"12232"},{"size":3154,"mtime":1786084511023,"results":"12436","hashOfConfig":"12232"},{"size":2492,"mtime":1786084511023,"results":"12437","hashOfConfig":"12232"},{"size":4305,"mtime":1786084511023,"results":"12438","hashOfConfig":"12232"},{"size":2888,"mtime":1786084511023,"results":"12439","hashOfConfig":"12232"},{"size":6507,"mtime":1786084511023,"results":"12440","hashOfConfig":"12232"},{"size":2722,"mtime":1786084511023,"results":"12441","hashOfConfig":"12232"},{"size":1890,"mtime":1786084511024,"results":"12442","hashOfConfig":"12232"},{"size":1476,"mtime":1786084511024,"results":"12443","hashOfConfig":"12232"},{"size":2629,"mtime":1786084511024,"results":"12444","hashOfConfig":"12232"},{"size":4845,"mtime":1786084511024,"results":"12445","hashOfConfig":"12232"},{"size":12866,"mtime":1786084511024,"results":"12446","hashOfConfig":"12232"},{"size":3436,"mtime":1786084511024,"results":"12447","hashOfConfig":"12232"},{"size":5561,"mtime":1786084511024,"results":"12448","hashOfConfig":"12232"},{"size":7283,"mtime":1786084511025,"results":"12449","hashOfConfig":"12232"},{"size":4973,"mtime":1786084511025,"results":"12450","hashOfConfig":"12232"},{"size":2790,"mtime":1786084511025,"results":"12451","hashOfConfig":"12232"},{"size":4440,"mtime":1786084511025,"results":"12452","hashOfConfig":"12232"},{"size":6817,"mtime":1786084511025,"results":"12453","hashOfConfig":"12232"},{"size":3297,"mtime":1786084511025,"results":"12454","hashOfConfig":"12232"},{"size":3654,"mtime":1786084511026,"results":"12455","hashOfConfig":"12232"},{"size":3519,"mtime":1786084511026,"results":"12456","hashOfConfig":"12232"},{"size":3101,"mtime":1786084511026,"results":"12457","hashOfConfig":"12232"},{"size":6675,"mtime":1786084511026,"results":"12458","hashOfConfig":"12232"},{"size":3101,"mtime":1786084511026,"results":"12459","hashOfConfig":"12232"},{"size":4445,"mtime":1786084511026,"results":"12460","hashOfConfig":"12232"},{"size":10285,"mtime":1786084511027,"results":"12461","hashOfConfig":"12232"},{"size":8570,"mtime":1786084511027,"results":"12462","hashOfConfig":"12232"},{"size":6935,"mtime":1786084511027,"results":"12463","hashOfConfig":"12232"},{"size":3745,"mtime":1786084511027,"results":"12464","hashOfConfig":"12232"},{"size":701,"mtime":1786084511027,"results":"12465","hashOfConfig":"12232"},{"size":5412,"mtime":1786084511027,"results":"12466","hashOfConfig":"12232"},{"size":1565,"mtime":1786084511027,"results":"12467","hashOfConfig":"12232"},{"size":4677,"mtime":1786084511027,"results":"12468","hashOfConfig":"12232"},{"size":5123,"mtime":1786084511028,"results":"12469","hashOfConfig":"12232"},{"size":5184,"mtime":1786084511028,"results":"12470","hashOfConfig":"12232"},{"size":1538,"mtime":1786084511028,"results":"12471","hashOfConfig":"12232"},{"size":1793,"mtime":1786084511028,"results":"12472","hashOfConfig":"12232"},{"size":2678,"mtime":1786084511028,"results":"12473","hashOfConfig":"12232"},{"size":4004,"mtime":1786084511028,"results":"12474","hashOfConfig":"12232"},{"size":4213,"mtime":1786084511028,"results":"12475","hashOfConfig":"8189"},{"size":6217,"mtime":1786084511029,"results":"12476","hashOfConfig":"8189"},{"size":1650,"mtime":1786084511029,"results":"12477","hashOfConfig":"12232"},{"size":2883,"mtime":1786084511029,"results":"12478","hashOfConfig":"12232"},{"size":2826,"mtime":1786084511029,"results":"12479","hashOfConfig":"12232"},{"size":3841,"mtime":1786084511030,"results":"12480","hashOfConfig":"12232"},{"size":2600,"mtime":1786084511030,"results":"12481","hashOfConfig":"12232"},{"size":3743,"mtime":1786084511030,"results":"12482","hashOfConfig":"12232"},{"size":893,"mtime":1786084511030,"results":"12483","hashOfConfig":"12232"},{"size":2503,"mtime":1786084511030,"results":"12484","hashOfConfig":"12232"},{"size":2284,"mtime":1786084511030,"results":"12485","hashOfConfig":"12232"},{"size":4291,"mtime":1786084511030,"results":"12486","hashOfConfig":"12232"},{"size":3992,"mtime":1786084511030,"results":"12487","hashOfConfig":"12232"},{"size":5679,"mtime":1786084511031,"results":"12488","hashOfConfig":"12232"},{"size":3607,"mtime":1786084511031,"results":"12489","hashOfConfig":"12232"},{"size":4495,"mtime":1786084511031,"results":"12490","hashOfConfig":"12232"},{"size":1663,"mtime":1786084511031,"results":"12491","hashOfConfig":"12232"},{"size":1960,"mtime":1786084511031,"results":"12492","hashOfConfig":"12232"},{"size":54659,"mtime":1786084511032,"results":"12493","hashOfConfig":"12232"},{"size":4681,"mtime":1786084511032,"results":"12494","hashOfConfig":"12232"},{"size":4836,"mtime":1786084511032,"results":"12495","hashOfConfig":"12232"},{"size":2139,"mtime":1786084511032,"results":"12496","hashOfConfig":"12232"},{"size":3224,"mtime":1786084511032,"results":"12497","hashOfConfig":"12232"},{"size":1728,"mtime":1786084511033,"results":"12498","hashOfConfig":"12232"},{"size":25883,"mtime":1786084511033,"results":"12499","hashOfConfig":"12232"},{"size":34417,"mtime":1786084511033,"results":"12500","hashOfConfig":"12232"},{"size":4807,"mtime":1786084511034,"results":"12501","hashOfConfig":"12232"},{"size":12242,"mtime":1786084511034,"results":"12502","hashOfConfig":"12232"},{"size":9491,"mtime":1786084511034,"results":"12503","hashOfConfig":"12232"},{"size":14662,"mtime":1786084511034,"results":"12504","hashOfConfig":"12232"},{"size":2641,"mtime":1786084511034,"results":"12505","hashOfConfig":"12232"},{"size":15225,"mtime":1786084511035,"results":"12506","hashOfConfig":"12232"},{"size":28590,"mtime":1786084511035,"results":"12507","hashOfConfig":"12232"},{"size":9435,"mtime":1786084511035,"results":"12508","hashOfConfig":"12232"},{"size":3983,"mtime":1786084511035,"results":"12509","hashOfConfig":"12232"},{"size":3262,"mtime":1786084511036,"results":"12510","hashOfConfig":"12232"},{"size":36728,"mtime":1786084511036,"results":"12511","hashOfConfig":"12232"},{"size":9698,"mtime":1786084511037,"results":"12512","hashOfConfig":"12232"},{"size":14142,"mtime":1786084511037,"results":"12513","hashOfConfig":"12232"},{"size":3424,"mtime":1786084511037,"results":"12514","hashOfConfig":"12232"},{"size":1611,"mtime":1786084511037,"results":"12515","hashOfConfig":"12232"},{"size":1749,"mtime":1786084511038,"results":"12516","hashOfConfig":"12232"},{"size":3291,"mtime":1786084511038,"results":"12517","hashOfConfig":"12232"},{"size":4763,"mtime":1786084511038,"results":"12518","hashOfConfig":"12232"},{"size":1674,"mtime":1786084511038,"results":"12519","hashOfConfig":"12232"},{"size":4856,"mtime":1786084511038,"results":"12520","hashOfConfig":"12232"},{"size":2304,"mtime":1786084511038,"results":"12521","hashOfConfig":"12232"},{"size":1758,"mtime":1786084511038,"results":"12522","hashOfConfig":"12232"},{"size":899,"mtime":1786084511039,"results":"12523","hashOfConfig":"12232"},{"size":5217,"mtime":1786084511039,"results":"12524","hashOfConfig":"12232"},{"size":6236,"mtime":1786084511039,"results":"12525","hashOfConfig":"12232"},{"size":1131,"mtime":1786084511039,"results":"12526","hashOfConfig":"12232"},{"size":3861,"mtime":1786084511039,"results":"12527","hashOfConfig":"12232"},{"size":5828,"mtime":1786084511039,"results":"12528","hashOfConfig":"12232"},{"size":8263,"mtime":1786084511040,"results":"12529","hashOfConfig":"12232"},{"size":4402,"mtime":1786084511040,"results":"12530","hashOfConfig":"12232"},{"size":1706,"mtime":1786084511040,"results":"12531","hashOfConfig":"12232"},{"size":2702,"mtime":1786084511040,"results":"12532","hashOfConfig":"12232"},{"size":2784,"mtime":1786084511040,"results":"12533","hashOfConfig":"12232"},{"size":23227,"mtime":1786084511040,"results":"12534","hashOfConfig":"8189"},{"size":8810,"mtime":1786084511040,"results":"12535","hashOfConfig":"12232"},{"size":9783,"mtime":1786084511041,"results":"12536","hashOfConfig":"12232"},{"size":11509,"mtime":1786084511041,"results":"12537","hashOfConfig":"12232"},{"size":19280,"mtime":1786084511041,"results":"12538","hashOfConfig":"12232"},{"size":8360,"mtime":1786084511041,"results":"12539","hashOfConfig":"12232"},{"size":19900,"mtime":1786084511041,"results":"12540","hashOfConfig":"12232"},{"size":8912,"mtime":1786084511042,"results":"12541","hashOfConfig":"12232"},{"size":2428,"mtime":1786084511042,"results":"12542","hashOfConfig":"12232"},{"size":3503,"mtime":1786084511042,"results":"12543","hashOfConfig":"12232"},{"size":4229,"mtime":1786084511042,"results":"12544","hashOfConfig":"12232"},{"size":15586,"mtime":1786084511042,"results":"12545","hashOfConfig":"12232"},{"size":5026,"mtime":1786084511042,"results":"12546","hashOfConfig":"12232"},{"size":864,"mtime":1786084511042,"results":"12547","hashOfConfig":"12232"},{"size":3357,"mtime":1786084511043,"results":"12548","hashOfConfig":"12232"},{"size":4634,"mtime":1786084511043,"results":"12549","hashOfConfig":"12232"},{"size":2933,"mtime":1786084511043,"results":"12550","hashOfConfig":"12232"},{"size":2508,"mtime":1786084511043,"results":"12551","hashOfConfig":"12232"},{"size":1095,"mtime":1786084511043,"results":"12552","hashOfConfig":"12232"},{"size":1858,"mtime":1786084511043,"results":"12553","hashOfConfig":"12232"},{"size":13928,"mtime":1786084511043,"results":"12554","hashOfConfig":"12232"},{"size":1532,"mtime":1786084511044,"results":"12555","hashOfConfig":"12232"},{"size":6564,"mtime":1786084511044,"results":"12556","hashOfConfig":"12232"},{"size":2859,"mtime":1786084511044,"results":"12557","hashOfConfig":"12232"},{"size":2789,"mtime":1786084511044,"results":"12558","hashOfConfig":"12232"},{"size":2859,"mtime":1786084511044,"results":"12559","hashOfConfig":"12232"},{"size":5080,"mtime":1786084511044,"results":"12560","hashOfConfig":"12232"},{"size":12883,"mtime":1786084511045,"results":"12561","hashOfConfig":"12232"},{"size":8302,"mtime":1786084511045,"results":"12562","hashOfConfig":"12232"},{"size":7589,"mtime":1786084511045,"results":"12563","hashOfConfig":"12232"},{"size":409,"mtime":1786084511045,"results":"12564","hashOfConfig":"12232"},{"size":3249,"mtime":1786084511045,"results":"12565","hashOfConfig":"12232"},{"size":3157,"mtime":1786084511045,"results":"12566","hashOfConfig":"12232"},{"size":2582,"mtime":1786084511045,"results":"12567","hashOfConfig":"12232"},{"size":5710,"mtime":1786084511046,"results":"12568","hashOfConfig":"12232"},{"size":9759,"mtime":1786084511046,"results":"12569","hashOfConfig":"12232"},{"size":5491,"mtime":1786084511046,"results":"12570","hashOfConfig":"12232"},{"size":4664,"mtime":1786084511046,"results":"12571","hashOfConfig":"12232"},{"size":3329,"mtime":1786084511046,"results":"12572","hashOfConfig":"12232"},{"size":4288,"mtime":1786084511046,"results":"12573","hashOfConfig":"12232"},{"size":5150,"mtime":1786084511046,"results":"12574","hashOfConfig":"12232"},{"size":4899,"mtime":1786084511047,"results":"12575","hashOfConfig":"12232"},{"size":7357,"mtime":1786084511047,"results":"12576","hashOfConfig":"12232"},{"size":14053,"mtime":1786084511047,"results":"12577","hashOfConfig":"12232"},{"size":2058,"mtime":1786084511047,"results":"12578","hashOfConfig":"12232"},{"size":1096,"mtime":1786084511047,"results":"12579","hashOfConfig":"12232"},{"size":1063,"mtime":1786084511047,"results":"12580","hashOfConfig":"12232"},{"size":4070,"mtime":1786084511047,"results":"12581","hashOfConfig":"12232"},{"size":1524,"mtime":1786084511048,"results":"12582","hashOfConfig":"12232"},{"size":5066,"mtime":1786084511048,"results":"12583","hashOfConfig":"12232"},{"size":3159,"mtime":1786084511048,"results":"12584","hashOfConfig":"12232"},{"size":2411,"mtime":1786084511048,"results":"12585","hashOfConfig":"12232"},{"size":10094,"mtime":1786084511048,"results":"12586","hashOfConfig":"12232"},{"size":3872,"mtime":1786084511048,"results":"12587","hashOfConfig":"12232"},{"size":3527,"mtime":1786084511048,"results":"12588","hashOfConfig":"12232"},{"size":3703,"mtime":1786084511049,"results":"12589","hashOfConfig":"12232"},{"size":8841,"mtime":1786084511049,"results":"12590","hashOfConfig":"12232"},{"size":4421,"mtime":1786084511049,"results":"12591","hashOfConfig":"12232"},{"size":5925,"mtime":1786084511049,"results":"12592","hashOfConfig":"12232"},{"size":2308,"mtime":1786085222301,"results":"12593","hashOfConfig":"12232"},{"size":941,"mtime":1786084511049,"results":"12594","hashOfConfig":"12232"},{"size":3368,"mtime":1786084511049,"results":"12595","hashOfConfig":"12232"},{"size":2952,"mtime":1786084511050,"results":"12596","hashOfConfig":"12232"},{"size":7344,"mtime":1786084511050,"results":"12597","hashOfConfig":"12232"},{"size":5652,"mtime":1786084511050,"results":"12598","hashOfConfig":"12232"},{"size":3591,"mtime":1786084511050,"results":"12599","hashOfConfig":"12232"},{"size":2069,"mtime":1786084511051,"results":"12600","hashOfConfig":"12232"},{"size":2228,"mtime":1786084511051,"results":"12601","hashOfConfig":"12232"},{"size":2782,"mtime":1786084511051,"results":"12602","hashOfConfig":"12232"},{"size":6947,"mtime":1786084511051,"results":"12603","hashOfConfig":"12232"},{"size":3457,"mtime":1786084511051,"results":"12604","hashOfConfig":"12232"},{"size":1865,"mtime":1786084511051,"results":"12605","hashOfConfig":"12232"},{"size":2077,"mtime":1786084511052,"results":"12606","hashOfConfig":"12232"},{"size":1710,"mtime":1786084511052,"results":"12607","hashOfConfig":"12232"},{"size":5137,"mtime":1786084511052,"results":"12608","hashOfConfig":"12232"},{"size":10551,"mtime":1786084511052,"results":"12609","hashOfConfig":"12232"},{"size":9461,"mtime":1786084511052,"results":"12610","hashOfConfig":"12232"},{"size":6939,"mtime":1786084511053,"results":"12611","hashOfConfig":"12232"},{"size":8474,"mtime":1786084511053,"results":"12612","hashOfConfig":"12232"},{"size":2178,"mtime":1786084511057,"results":"12613","hashOfConfig":"12232"},{"size":11106,"mtime":1786084511057,"results":"12614","hashOfConfig":"12232"},{"size":1998,"mtime":1786084511057,"results":"12615","hashOfConfig":"12232"},{"size":2407,"mtime":1786084511058,"results":"12616","hashOfConfig":"12232"},{"size":4340,"mtime":1786084511058,"results":"12617","hashOfConfig":"12232"},{"size":4768,"mtime":1786084511058,"results":"12618","hashOfConfig":"12232"},{"size":8576,"mtime":1786084511059,"results":"12619","hashOfConfig":"12232"},{"size":4921,"mtime":1786084511059,"results":"12620","hashOfConfig":"12232"},{"size":4334,"mtime":1786084511059,"results":"12621","hashOfConfig":"12232"},{"size":5506,"mtime":1786084511058,"results":"12622","hashOfConfig":"12232"},{"size":6146,"mtime":1786084511058,"results":"12623","hashOfConfig":"12232"},{"size":6695,"mtime":1786084511058,"results":"12624","hashOfConfig":"12232"},{"size":5613,"mtime":1786084511059,"results":"12625","hashOfConfig":"12232"},{"size":7523,"mtime":1786084511059,"results":"12626","hashOfConfig":"12232"},{"size":5907,"mtime":1786084511059,"results":"12627","hashOfConfig":"12232"},{"size":4043,"mtime":1786084511059,"results":"12628","hashOfConfig":"12232"},{"size":3925,"mtime":1786084511060,"results":"12629","hashOfConfig":"12232"},{"size":8796,"mtime":1786084511060,"results":"12630","hashOfConfig":"12232"},{"size":4639,"mtime":1786084511060,"results":"12631","hashOfConfig":"12232"},{"size":3735,"mtime":1786084511060,"results":"12632","hashOfConfig":"12232"},{"size":1687,"mtime":1786084511060,"results":"12633","hashOfConfig":"12232"},{"size":4584,"mtime":1786084511060,"results":"12634","hashOfConfig":"12232"},{"size":3375,"mtime":1786084511060,"results":"12635","hashOfConfig":"12232"},{"size":4809,"mtime":1786084511060,"results":"12636","hashOfConfig":"12232"},{"size":3222,"mtime":1786084511061,"results":"12637","hashOfConfig":"12232"},{"size":12488,"mtime":1786084511061,"results":"12638","hashOfConfig":"12232"},{"size":8939,"mtime":1786084511061,"results":"12639","hashOfConfig":"12232"},{"size":1476,"mtime":1786084511061,"results":"12640","hashOfConfig":"12232"},{"size":9779,"mtime":1786084511061,"results":"12641","hashOfConfig":"12232"},{"size":8988,"mtime":1786084511062,"results":"12642","hashOfConfig":"12232"},{"size":7122,"mtime":1786084511062,"results":"12643","hashOfConfig":"12232"},{"size":1457,"mtime":1786084511062,"results":"12644","hashOfConfig":"12232"},{"size":2184,"mtime":1786084511061,"results":"12645","hashOfConfig":"12232"},{"size":1080,"mtime":1786084511061,"results":"12646","hashOfConfig":"12232"},{"size":3947,"mtime":1786084511062,"results":"12647","hashOfConfig":"12232"},{"size":6606,"mtime":1786084511062,"results":"12648","hashOfConfig":"12232"},{"size":17499,"mtime":1786084511053,"results":"12649","hashOfConfig":"12232"},{"size":1096,"mtime":1786084511053,"results":"12650","hashOfConfig":"12232"},{"size":1213,"mtime":1786084511053,"results":"12651","hashOfConfig":"12232"},{"size":5358,"mtime":1786084511053,"results":"12652","hashOfConfig":"12232"},{"size":8127,"mtime":1786084511054,"results":"12653","hashOfConfig":"12285"},{"size":22465,"mtime":1786084511054,"results":"12654","hashOfConfig":"12232"},{"size":1734,"mtime":1786084511054,"results":"12655","hashOfConfig":"12232"},{"size":1920,"mtime":1786084511054,"results":"12656","hashOfConfig":"12232"},{"size":5784,"mtime":1786084511054,"results":"12657","hashOfConfig":"12232"},{"size":23106,"mtime":1786084511054,"results":"12658","hashOfConfig":"12232"},{"size":2440,"mtime":1786084511054,"results":"12659","hashOfConfig":"12232"},{"size":14504,"mtime":1786084511055,"results":"12660","hashOfConfig":"12232"},{"size":12634,"mtime":1786084511055,"results":"12661","hashOfConfig":"12232"},{"size":968,"mtime":1786084511055,"results":"12662","hashOfConfig":"12232"},{"size":4405,"mtime":1786084511055,"results":"12663","hashOfConfig":"12232"},{"size":8262,"mtime":1786084511055,"results":"12664","hashOfConfig":"12232"},{"size":13168,"mtime":1786084511055,"results":"12665","hashOfConfig":"12232"},{"size":1921,"mtime":1786084511056,"results":"12666","hashOfConfig":"12232"},{"size":2218,"mtime":1786084511056,"results":"12667","hashOfConfig":"12232"},{"size":7278,"mtime":1786084511056,"results":"12668","hashOfConfig":"12232"},{"size":2507,"mtime":1786084511056,"results":"12669","hashOfConfig":"12232"},{"size":2643,"mtime":1786084511056,"results":"12670","hashOfConfig":"12232"},{"size":1486,"mtime":1786084511056,"results":"12671","hashOfConfig":"12232"},{"size":2185,"mtime":1786084511057,"results":"12672","hashOfConfig":"12232"},{"size":1712,"mtime":1786084511057,"results":"12673","hashOfConfig":"12232"},{"size":1296,"mtime":1786084511057,"results":"12674","hashOfConfig":"12232"},{"size":8889,"mtime":1786084511062,"results":"12675","hashOfConfig":"12232"},{"size":2924,"mtime":1786084511063,"results":"12676","hashOfConfig":"12232"},{"size":13196,"mtime":1786084511063,"results":"12677","hashOfConfig":"12232"},{"size":12057,"mtime":1786084511063,"results":"12678","hashOfConfig":"12232"},{"size":3859,"mtime":1786084511063,"results":"12679","hashOfConfig":"12232"},{"size":4921,"mtime":1786084511063,"results":"12680","hashOfConfig":"12232"},{"size":2086,"mtime":1786084511063,"results":"12681","hashOfConfig":"12232"},{"size":3836,"mtime":1786084511065,"results":"12682","hashOfConfig":"12232"},{"size":1982,"mtime":1786084511066,"results":"12683","hashOfConfig":"12232"},{"size":3319,"mtime":1786084511066,"results":"12684","hashOfConfig":"12232"},{"size":2013,"mtime":1786084511066,"results":"12685","hashOfConfig":"12232"},{"size":2009,"mtime":1786084511066,"results":"12686","hashOfConfig":"12232"},{"size":1881,"mtime":1786084511066,"results":"12687","hashOfConfig":"12232"},{"size":28939,"mtime":1786084511066,"results":"12688","hashOfConfig":"12232"},{"size":6220,"mtime":1786084511067,"results":"12689","hashOfConfig":"12232"},{"size":2581,"mtime":1786084511067,"results":"12690","hashOfConfig":"12232"},{"size":19718,"mtime":1786084511067,"results":"12691","hashOfConfig":"12232"},{"size":28539,"mtime":1786084511067,"results":"12692","hashOfConfig":"12232"},{"size":6716,"mtime":1786084511067,"results":"12693","hashOfConfig":"12232"},{"size":4091,"mtime":1786084511068,"results":"12694","hashOfConfig":"12232"},{"size":7059,"mtime":1786084511068,"results":"12695","hashOfConfig":"12232"},{"size":2003,"mtime":1786084511068,"results":"12696","hashOfConfig":"12232"},{"size":5186,"mtime":1786084511068,"results":"12697","hashOfConfig":"12232"},{"size":2103,"mtime":1786084511068,"results":"12698","hashOfConfig":"12232"},{"size":2760,"mtime":1786084511068,"results":"12699","hashOfConfig":"12232"},{"size":5793,"mtime":1786084511068,"results":"12700","hashOfConfig":"12232"},{"size":21671,"mtime":1786084511069,"results":"12701","hashOfConfig":"12232"},{"size":2171,"mtime":1786084511069,"results":"12702","hashOfConfig":"12232"},{"size":4265,"mtime":1786084511071,"results":"12703","hashOfConfig":"12232"},{"size":6619,"mtime":1786084511069,"results":"12704","hashOfConfig":"12232"},{"size":4705,"mtime":1786084511069,"results":"12705","hashOfConfig":"12232"},{"size":7230,"mtime":1786084511069,"results":"12706","hashOfConfig":"12232"},{"size":6203,"mtime":1786084511069,"results":"12707","hashOfConfig":"12232"},{"size":7825,"mtime":1786084511069,"results":"12708","hashOfConfig":"12232"},{"size":4575,"mtime":1786084511069,"results":"12709","hashOfConfig":"12232"},{"size":4237,"mtime":1786084511070,"results":"12710","hashOfConfig":"12232"},{"size":4481,"mtime":1786084511070,"results":"12711","hashOfConfig":"12232"},{"size":3225,"mtime":1786084511070,"results":"12712","hashOfConfig":"12232"},{"size":4458,"mtime":1786084511070,"results":"12713","hashOfConfig":"12232"},{"size":1691,"mtime":1786084511070,"results":"12714","hashOfConfig":"12232"},{"size":7893,"mtime":1786084511070,"results":"12715","hashOfConfig":"12232"},{"size":7940,"mtime":1786084511071,"results":"12716","hashOfConfig":"12232"},{"size":10578,"mtime":1786084511071,"results":"12717","hashOfConfig":"12232"},{"size":11052,"mtime":1786084511071,"results":"12718","hashOfConfig":"12232"},{"size":2501,"mtime":1786084511071,"results":"12719","hashOfConfig":"12232"},{"size":986,"mtime":1786084511071,"results":"12720","hashOfConfig":"12232"},{"size":4020,"mtime":1786084511072,"results":"12721","hashOfConfig":"12232"},{"size":17261,"mtime":1786084511072,"results":"12722","hashOfConfig":"12232"},{"size":21756,"mtime":1786084511072,"results":"12723","hashOfConfig":"12232"},{"size":5323,"mtime":1786084511072,"results":"12724","hashOfConfig":"12232"},{"size":3378,"mtime":1786084511072,"results":"12725","hashOfConfig":"12232"},{"size":10987,"mtime":1786084511072,"results":"12726","hashOfConfig":"12232"},{"size":737,"mtime":1786084511072,"results":"12727","hashOfConfig":"12232"},{"size":3473,"mtime":1786084511073,"results":"12728","hashOfConfig":"12232"},{"size":2742,"mtime":1786084511073,"results":"12729","hashOfConfig":"12232"},{"size":4370,"mtime":1786084511073,"results":"12730","hashOfConfig":"12232"},{"size":1372,"mtime":1786084511073,"results":"12731","hashOfConfig":"12232"},{"size":13039,"mtime":1786084511073,"results":"12732","hashOfConfig":"12232"},{"size":3891,"mtime":1786084511073,"results":"12733","hashOfConfig":"12232"},{"size":3514,"mtime":1786084511073,"results":"12734","hashOfConfig":"12232"},{"size":5101,"mtime":1786084511073,"results":"12735","hashOfConfig":"12232"},{"size":2305,"mtime":1786084511074,"results":"12736","hashOfConfig":"12232"},{"size":5006,"mtime":1786084511074,"results":"12737","hashOfConfig":"12232"},{"size":1997,"mtime":1786084511074,"results":"12738","hashOfConfig":"12232"},{"size":9029,"mtime":1786084511074,"results":"12739","hashOfConfig":"12232"},{"size":5760,"mtime":1786084511074,"results":"12740","hashOfConfig":"12232"},{"size":4475,"mtime":1786084511074,"results":"12741","hashOfConfig":"12232"},{"size":3910,"mtime":1786084511074,"results":"12742","hashOfConfig":"12232"},{"size":2757,"mtime":1786084511074,"results":"12743","hashOfConfig":"12232"},{"size":5325,"mtime":1786084511075,"results":"12744","hashOfConfig":"12232"},{"size":2402,"mtime":1786084511075,"results":"12745","hashOfConfig":"12232"},{"size":5796,"mtime":1786084511075,"results":"12746","hashOfConfig":"12232"},{"size":5578,"mtime":1786084511075,"results":"12747","hashOfConfig":"12232"},{"size":2434,"mtime":1786084511075,"results":"12748","hashOfConfig":"12232"},{"size":1390,"mtime":1786084511075,"results":"12749","hashOfConfig":"12232"},{"size":2188,"mtime":1786084511075,"results":"12750","hashOfConfig":"12232"},{"size":1576,"mtime":1786084511075,"results":"12751","hashOfConfig":"12232"},{"size":2227,"mtime":1786084511075,"results":"12752","hashOfConfig":"12232"},{"size":5055,"mtime":1786084511076,"results":"12753","hashOfConfig":"12232"},{"size":15243,"mtime":1786084511076,"results":"12754","hashOfConfig":"12232"},{"size":1027,"mtime":1786084511076,"results":"12755","hashOfConfig":"12232"},{"size":2076,"mtime":1786084511076,"results":"12756","hashOfConfig":"12232"},{"size":1698,"mtime":1786084511076,"results":"12757","hashOfConfig":"12232"},{"size":8796,"mtime":1786084511076,"results":"12758","hashOfConfig":"12232"},{"size":824,"mtime":1786084511077,"results":"12759","hashOfConfig":"12232"},{"size":4492,"mtime":1786084511077,"results":"12760","hashOfConfig":"12232"},{"size":9043,"mtime":1786084511077,"results":"12761","hashOfConfig":"12232"},{"size":3415,"mtime":1786084511077,"results":"12762","hashOfConfig":"12232"},{"size":6509,"mtime":1786084511077,"results":"12763","hashOfConfig":"12232"},{"size":2222,"mtime":1786084511077,"results":"12764","hashOfConfig":"12232"},{"size":2737,"mtime":1786084511077,"results":"12765","hashOfConfig":"12232"},{"size":4132,"mtime":1786084511077,"results":"12766","hashOfConfig":"12232"},{"size":7519,"mtime":1786084511078,"results":"12767","hashOfConfig":"12232"},{"size":5428,"mtime":1786084511078,"results":"12768","hashOfConfig":"12232"},{"size":4352,"mtime":1786084511078,"results":"12769","hashOfConfig":"12232"},{"size":5769,"mtime":1786084511078,"results":"12770","hashOfConfig":"12232"},{"size":1464,"mtime":1786084511078,"results":"12771","hashOfConfig":"12232"},{"size":7666,"mtime":1786084511078,"results":"12772","hashOfConfig":"12232"},{"size":23663,"mtime":1786084511079,"results":"12773","hashOfConfig":"12232"},{"size":17168,"mtime":1786084511079,"results":"12774","hashOfConfig":"12232"},{"size":4464,"mtime":1786084511079,"results":"12775","hashOfConfig":"12232"},{"size":5464,"mtime":1786084511079,"results":"12776","hashOfConfig":"12232"},{"size":3004,"mtime":1786084511079,"results":"12777","hashOfConfig":"12232"},{"size":963,"mtime":1786084511079,"results":"12778","hashOfConfig":"12232"},{"size":1431,"mtime":1786084511080,"results":"12779","hashOfConfig":"12232"},{"size":27195,"mtime":1786084511080,"results":"12780","hashOfConfig":"12232"},{"size":1841,"mtime":1786084511080,"results":"12781","hashOfConfig":"12232"},{"size":2115,"mtime":1786084511080,"results":"12782","hashOfConfig":"12232"},{"size":1518,"mtime":1786084511080,"results":"12783","hashOfConfig":"12232"},{"size":4373,"mtime":1786084511080,"results":"12784","hashOfConfig":"12232"},{"size":7580,"mtime":1786084511081,"results":"12785","hashOfConfig":"12232"},{"size":10327,"mtime":1786084511081,"results":"12786","hashOfConfig":"12232"},{"size":4119,"mtime":1786084511081,"results":"12787","hashOfConfig":"12232"},{"size":7293,"mtime":1786084511081,"results":"12788","hashOfConfig":"12232"},{"size":8736,"mtime":1786084511081,"results":"12789","hashOfConfig":"12232"},{"size":1869,"mtime":1786084511081,"results":"12790","hashOfConfig":"12232"},{"size":5007,"mtime":1786084511081,"results":"12791","hashOfConfig":"12232"},{"size":5538,"mtime":1786084511082,"results":"12792","hashOfConfig":"12232"},{"size":19690,"mtime":1786084511082,"results":"12793","hashOfConfig":"12232"},{"size":4200,"mtime":1786084511082,"results":"12794","hashOfConfig":"12232"},{"size":8700,"mtime":1786084511082,"results":"12795","hashOfConfig":"12285"},{"size":41363,"mtime":1786084511083,"results":"12796","hashOfConfig":"12232"},{"size":4824,"mtime":1786084511083,"results":"12797","hashOfConfig":"12232"},{"size":11502,"mtime":1786084511083,"results":"12798","hashOfConfig":"12232"},{"size":3612,"mtime":1786084511083,"results":"12799","hashOfConfig":"12232"},{"size":2614,"mtime":1786084511083,"results":"12800","hashOfConfig":"12232"},{"size":2326,"mtime":1786084511083,"results":"12801","hashOfConfig":"12232"},{"size":1777,"mtime":1786084511084,"results":"12802","hashOfConfig":"12232"},{"size":5957,"mtime":1786084511084,"results":"12803","hashOfConfig":"12232"},{"size":3806,"mtime":1786084511084,"results":"12804","hashOfConfig":"12232"},{"size":11449,"mtime":1786084511084,"results":"12805","hashOfConfig":"12232"},{"size":1979,"mtime":1786084511085,"results":"12806","hashOfConfig":"12232"},{"size":2216,"mtime":1786084511085,"results":"12807","hashOfConfig":"12232"},{"size":8499,"mtime":1786084511085,"results":"12808","hashOfConfig":"12232"},{"size":5233,"mtime":1786084511085,"results":"12809","hashOfConfig":"12232"},{"size":5073,"mtime":1786084511085,"results":"12810","hashOfConfig":"12232"},{"size":1047,"mtime":1786084511085,"results":"12811","hashOfConfig":"12232"},{"size":1911,"mtime":1786084511085,"results":"12812","hashOfConfig":"12232"},{"size":3427,"mtime":1786084511086,"results":"12813","hashOfConfig":"12232"},{"size":1538,"mtime":1786084511086,"results":"12814","hashOfConfig":"12232"},{"size":1860,"mtime":1786084511086,"results":"12815","hashOfConfig":"12232"},{"size":2996,"mtime":1786084511086,"results":"12816","hashOfConfig":"12232"},{"size":2794,"mtime":1786084511086,"results":"12817","hashOfConfig":"12232"},{"size":4753,"mtime":1786084511086,"results":"12818","hashOfConfig":"12232"},{"size":1688,"mtime":1786084511087,"results":"12819","hashOfConfig":"12232"},{"size":9313,"mtime":1786084511087,"results":"12820","hashOfConfig":"12232"},{"size":3633,"mtime":1786084511087,"results":"12821","hashOfConfig":"12232"},{"size":8523,"mtime":1786084511087,"results":"12822","hashOfConfig":"12232"},{"size":2500,"mtime":1786084511087,"results":"12823","hashOfConfig":"12232"},{"size":12960,"mtime":1786084511087,"results":"12824","hashOfConfig":"12232"},{"size":3145,"mtime":1786084511087,"results":"12825","hashOfConfig":"12232"},{"size":984,"mtime":1786084511087,"results":"12826","hashOfConfig":"12232"},{"size":1246,"mtime":1786084511088,"results":"12827","hashOfConfig":"12232"},{"size":4330,"mtime":1786084511088,"results":"12828","hashOfConfig":"12232"},{"size":5473,"mtime":1786084511088,"results":"12829","hashOfConfig":"12232"},{"size":12990,"mtime":1786084511088,"results":"12830","hashOfConfig":"12232"},{"size":7015,"mtime":1786084511088,"results":"12831","hashOfConfig":"12232"},{"size":5565,"mtime":1786084511088,"results":"12832","hashOfConfig":"12232"},{"size":3000,"mtime":1786084511088,"results":"12833","hashOfConfig":"12232"},{"size":6900,"mtime":1786084511088,"results":"12834","hashOfConfig":"12232"},{"size":6278,"mtime":1786084511089,"results":"12835","hashOfConfig":"12232"},{"size":12241,"mtime":1786084511089,"results":"12836","hashOfConfig":"12232"},{"size":1307,"mtime":1786084511089,"results":"12837","hashOfConfig":"12232"},{"size":2122,"mtime":1786084511089,"results":"12838","hashOfConfig":"12232"},{"size":3080,"mtime":1786084511089,"results":"12839","hashOfConfig":"12232"},{"size":14360,"mtime":1786084511089,"results":"12840","hashOfConfig":"12232"},{"size":16539,"mtime":1786084511089,"results":"12841","hashOfConfig":"12232"},{"size":3554,"mtime":1786084511090,"results":"12842","hashOfConfig":"12232"},{"size":3633,"mtime":1786084511090,"results":"12843","hashOfConfig":"12232"},{"size":2638,"mtime":1786084511090,"results":"12844","hashOfConfig":"12232"},{"size":3400,"mtime":1786084511090,"results":"12845","hashOfConfig":"12232"},{"size":6470,"mtime":1786084511090,"results":"12846","hashOfConfig":"12232"},{"size":3016,"mtime":1786084511091,"results":"12847","hashOfConfig":"12232"},{"size":1685,"mtime":1786084511091,"results":"12848","hashOfConfig":"12232"},{"size":2723,"mtime":1786084511091,"results":"12849","hashOfConfig":"12232"},{"size":5654,"mtime":1786084511091,"results":"12850","hashOfConfig":"12232"},{"size":1861,"mtime":1786084511091,"results":"12851","hashOfConfig":"12232"},{"size":1327,"mtime":1786084511086,"results":"12852","hashOfConfig":"12232"},{"size":3635,"mtime":1786084511086,"results":"12853","hashOfConfig":"12232"},{"size":7347,"mtime":1786084511086,"results":"12854","hashOfConfig":"12232"},{"size":2670,"mtime":1786084511092,"results":"12855","hashOfConfig":"12232"},{"size":7485,"mtime":1786084511092,"results":"12856","hashOfConfig":"12232"},{"size":8270,"mtime":1786084511092,"results":"12857","hashOfConfig":"12232"},{"size":4497,"mtime":1786084511092,"results":"12858","hashOfConfig":"12232"},{"size":7711,"mtime":1786084511092,"results":"12859","hashOfConfig":"12232"},{"size":5764,"mtime":1786084511093,"results":"12860","hashOfConfig":"12232"},{"size":2965,"mtime":1786084511093,"results":"12861","hashOfConfig":"12232"},{"size":2846,"mtime":1786084511093,"results":"12862","hashOfConfig":"12232"},{"size":2080,"mtime":1786084511093,"results":"12863","hashOfConfig":"12232"},{"size":3160,"mtime":1786084511093,"results":"12864","hashOfConfig":"12232"},{"size":5065,"mtime":1786084511093,"results":"12865","hashOfConfig":"12232"},{"size":18441,"mtime":1786084511093,"results":"12866","hashOfConfig":"12232"},{"size":4681,"mtime":1786084511094,"results":"12867","hashOfConfig":"12232"},{"size":14837,"mtime":1786084511094,"results":"12868","hashOfConfig":"12232"},{"size":25807,"mtime":1786084511094,"results":"12869","hashOfConfig":"12232"},{"size":9261,"mtime":1786084511094,"results":"12870","hashOfConfig":"12232"},{"size":10312,"mtime":1786084511094,"results":"12871","hashOfConfig":"12232"},{"size":3868,"mtime":1786084511095,"results":"12872","hashOfConfig":"12232"},{"size":3711,"mtime":1786084511095,"results":"12873","hashOfConfig":"12232"},{"size":1941,"mtime":1786084511095,"results":"12874","hashOfConfig":"12232"},{"size":2950,"mtime":1786084511095,"results":"12875","hashOfConfig":"12232"},{"size":3819,"mtime":1786084511095,"results":"12876","hashOfConfig":"12232"},{"size":3702,"mtime":1786084511095,"results":"12877","hashOfConfig":"12232"},{"size":4924,"mtime":1786084511095,"results":"12878","hashOfConfig":"12232"},{"size":4351,"mtime":1786084511095,"results":"12879","hashOfConfig":"12232"},{"size":5026,"mtime":1786084511095,"results":"12880","hashOfConfig":"12232"},{"size":4428,"mtime":1786084511096,"results":"12881","hashOfConfig":"12232"},{"size":5871,"mtime":1786084511096,"results":"12882","hashOfConfig":"12232"},{"size":3794,"mtime":1786084511096,"results":"12883","hashOfConfig":"12232"},{"size":4741,"mtime":1786084511096,"results":"12884","hashOfConfig":"12232"},{"size":1593,"mtime":1786084511096,"results":"12885","hashOfConfig":"12232"},{"size":3252,"mtime":1786084511096,"results":"12886","hashOfConfig":"12232"},{"size":8420,"mtime":1786084511097,"results":"12887","hashOfConfig":"12232"},{"size":5883,"mtime":1786084511097,"results":"12888","hashOfConfig":"12232"},{"size":6678,"mtime":1786084511097,"results":"12889","hashOfConfig":"12232"},{"size":5303,"mtime":1786084511097,"results":"12890","hashOfConfig":"12232"},{"size":3970,"mtime":1786084511097,"results":"12891","hashOfConfig":"12232"},{"size":1749,"mtime":1786084511097,"results":"12892","hashOfConfig":"12232"},{"size":2241,"mtime":1786084511097,"results":"12893","hashOfConfig":"12232"},{"size":6132,"mtime":1786084511097,"results":"12894","hashOfConfig":"12232"},{"size":9109,"mtime":1786084511098,"results":"12895","hashOfConfig":"12232"},{"size":2629,"mtime":1786084511098,"results":"12896","hashOfConfig":"12232"},{"size":3055,"mtime":1786084511098,"results":"12897","hashOfConfig":"12232"},{"size":7412,"mtime":1786084511098,"results":"12898","hashOfConfig":"12232"},{"size":8307,"mtime":1786084511098,"results":"12899","hashOfConfig":"12232"},{"size":17490,"mtime":1786084511099,"results":"12900","hashOfConfig":"12232"},{"size":2077,"mtime":1786084511099,"results":"12901","hashOfConfig":"12232"},{"size":40206,"mtime":1786084511099,"results":"12902","hashOfConfig":"12232"},{"size":4474,"mtime":1786084511099,"results":"12903","hashOfConfig":"12232"},{"size":4320,"mtime":1786084511100,"results":"12904","hashOfConfig":"12232"},{"size":3750,"mtime":1786084511100,"results":"12905","hashOfConfig":"12232"},{"size":6079,"mtime":1786084511100,"results":"12906","hashOfConfig":"12232"},{"size":3642,"mtime":1786084511100,"results":"12907","hashOfConfig":"12232"},{"size":8894,"mtime":1786084511100,"results":"12908","hashOfConfig":"12232"},{"size":2564,"mtime":1786084511100,"results":"12909","hashOfConfig":"12232"},{"size":7187,"mtime":1786087859395,"results":"12910","hashOfConfig":"12232"},{"size":8444,"mtime":1786084511101,"results":"12911","hashOfConfig":"12232"},{"size":7604,"mtime":1786084511101,"results":"12912","hashOfConfig":"12232"},{"size":12906,"mtime":1786084511101,"results":"12913","hashOfConfig":"12232"},{"size":4472,"mtime":1786084511101,"results":"12914","hashOfConfig":"12232"},{"size":8411,"mtime":1786084511101,"results":"12915","hashOfConfig":"12232"},{"size":1491,"mtime":1786084511101,"results":"12916","hashOfConfig":"12232"},{"size":13889,"mtime":1786084511102,"results":"12917","hashOfConfig":"12232"},{"size":15630,"mtime":1786084511102,"results":"12918","hashOfConfig":"12232"},{"size":1748,"mtime":1786084511102,"results":"12919","hashOfConfig":"12232"},{"size":27000,"mtime":1786084511102,"results":"12920","hashOfConfig":"12232"},{"size":5109,"mtime":1786084511102,"results":"12921","hashOfConfig":"12232"},{"size":9774,"mtime":1786084511102,"results":"12922","hashOfConfig":"12232"},{"size":3953,"mtime":1786084511103,"results":"12923","hashOfConfig":"12232"},{"size":10123,"mtime":1786084511103,"results":"12924","hashOfConfig":"12232"},{"size":3485,"mtime":1786084511103,"results":"12925","hashOfConfig":"12232"},{"size":11260,"mtime":1786084511103,"results":"12926","hashOfConfig":"12232"},{"size":10367,"mtime":1786084511103,"results":"12927","hashOfConfig":"12232"},{"size":4124,"mtime":1786084511104,"results":"12928","hashOfConfig":"12232"},{"size":3854,"mtime":1786084511104,"results":"12929","hashOfConfig":"12232"},{"size":16124,"mtime":1786084511104,"results":"12930","hashOfConfig":"12232"},{"size":6904,"mtime":1786084511104,"results":"12931","hashOfConfig":"12232"},{"size":3994,"mtime":1786084511104,"results":"12932","hashOfConfig":"12232"},{"size":2754,"mtime":1786084511104,"results":"12933","hashOfConfig":"12232"},{"size":2800,"mtime":1786084511104,"results":"12934","hashOfConfig":"12232"},{"size":3448,"mtime":1786084511105,"results":"12935","hashOfConfig":"12232"},{"size":2089,"mtime":1786084511105,"results":"12936","hashOfConfig":"12232"},{"size":16703,"mtime":1786084511105,"results":"12937","hashOfConfig":"12232"},{"size":10123,"mtime":1786084511105,"results":"12938","hashOfConfig":"12232"},{"size":5597,"mtime":1786084511105,"results":"12939","hashOfConfig":"12232"},{"size":4820,"mtime":1786084511105,"results":"12940","hashOfConfig":"12232"},{"size":3153,"mtime":1786084511106,"results":"12941","hashOfConfig":"12232"},{"size":2433,"mtime":1786084511106,"results":"12942","hashOfConfig":"12232"},{"size":2667,"mtime":1786084511106,"results":"12943","hashOfConfig":"12232"},{"size":4418,"mtime":1786084511106,"results":"12944","hashOfConfig":"12232"},{"size":4501,"mtime":1786084511106,"results":"12945","hashOfConfig":"12232"},{"size":6481,"mtime":1786084511106,"results":"12946","hashOfConfig":"12232"},{"size":4653,"mtime":1786084511106,"results":"12947","hashOfConfig":"12232"},{"size":5417,"mtime":1786084511107,"results":"12948","hashOfConfig":"12232"},{"size":5379,"mtime":1786084511107,"results":"12949","hashOfConfig":"12232"},{"size":4673,"mtime":1786084511107,"results":"12950","hashOfConfig":"12232"},{"size":3075,"mtime":1786084511107,"results":"12951","hashOfConfig":"12232"},{"size":2065,"mtime":1786084511107,"results":"12952","hashOfConfig":"12232"},{"size":5179,"mtime":1786084511107,"results":"12953","hashOfConfig":"12232"},{"size":1751,"mtime":1786084511108,"results":"12954","hashOfConfig":"12232"},{"size":2716,"mtime":1786084511108,"results":"12955","hashOfConfig":"12232"},{"size":3275,"mtime":1786084511108,"results":"12956","hashOfConfig":"12232"},{"size":1311,"mtime":1786084511108,"results":"12957","hashOfConfig":"12232"},{"size":6839,"mtime":1786084511108,"results":"12958","hashOfConfig":"12232"},{"size":1933,"mtime":1786084511108,"results":"12959","hashOfConfig":"12232"},{"size":7447,"mtime":1786084511108,"results":"12960","hashOfConfig":"12232"},{"size":5343,"mtime":1786084511109,"results":"12961","hashOfConfig":"12232"},{"size":5154,"mtime":1786084511109,"results":"12962","hashOfConfig":"12232"},{"size":3153,"mtime":1786084511109,"results":"12963","hashOfConfig":"12232"},{"size":2733,"mtime":1786084511109,"results":"12964","hashOfConfig":"12232"},{"size":3131,"mtime":1786084511109,"results":"12965","hashOfConfig":"12232"},{"size":966,"mtime":1786084511109,"results":"12966","hashOfConfig":"12232"},{"size":3257,"mtime":1786084511109,"results":"12967","hashOfConfig":"12232"},{"size":3359,"mtime":1786084511109,"results":"12968","hashOfConfig":"12232"},{"size":9524,"mtime":1786084511110,"results":"12969","hashOfConfig":"12232"},{"size":4882,"mtime":1786084511110,"results":"12970","hashOfConfig":"12232"},{"size":4376,"mtime":1786084511110,"results":"12971","hashOfConfig":"12232"},{"size":5535,"mtime":1786084511110,"results":"12972","hashOfConfig":"12232"},{"size":3971,"mtime":1786084511110,"results":"12973","hashOfConfig":"12232"},{"size":4441,"mtime":1786084511110,"results":"12974","hashOfConfig":"12232"},{"size":5925,"mtime":1786084511111,"results":"12975","hashOfConfig":"12232"},{"size":5387,"mtime":1786084511111,"results":"12976","hashOfConfig":"12232"},{"size":4642,"mtime":1786084511111,"results":"12977","hashOfConfig":"12232"},{"size":809,"mtime":1786084511111,"results":"12978","hashOfConfig":"12232"},{"size":3273,"mtime":1786084511111,"results":"12979","hashOfConfig":"12232"},{"size":3510,"mtime":1786084511111,"results":"12980","hashOfConfig":"12232"},{"size":1688,"mtime":1786084511111,"results":"12981","hashOfConfig":"12232"},{"size":2764,"mtime":1786084511112,"results":"12982","hashOfConfig":"12232"},{"size":3617,"mtime":1786084511112,"results":"12983","hashOfConfig":"12232"},{"size":2719,"mtime":1786084511112,"results":"12984","hashOfConfig":"12232"},{"size":2513,"mtime":1786084511112,"results":"12985","hashOfConfig":"12232"},{"size":5345,"mtime":1786084511112,"results":"12986","hashOfConfig":"12232"},{"size":2106,"mtime":1786084511112,"results":"12987","hashOfConfig":"12232"},{"size":27377,"mtime":1786084511112,"results":"12988","hashOfConfig":"12232"},{"size":4769,"mtime":1786084511113,"results":"12989","hashOfConfig":"12232"},{"size":16398,"mtime":1786084511113,"results":"12990","hashOfConfig":"12232"},{"size":3708,"mtime":1786084511113,"results":"12991","hashOfConfig":"12232"},{"size":1536,"mtime":1786084511113,"results":"12992","hashOfConfig":"12232"},{"size":1873,"mtime":1786084511113,"results":"12993","hashOfConfig":"12232"},{"size":2709,"mtime":1786084511113,"results":"12994","hashOfConfig":"12232"},{"size":1490,"mtime":1786084511113,"results":"12995","hashOfConfig":"12232"},{"size":4666,"mtime":1786084511114,"results":"12996","hashOfConfig":"12232"},{"size":3182,"mtime":1786084511114,"results":"12997","hashOfConfig":"12232"},{"size":7279,"mtime":1786084511114,"results":"12998","hashOfConfig":"12232"},{"size":3125,"mtime":1786084511114,"results":"12999","hashOfConfig":"12232"},{"size":2710,"mtime":1786084511114,"results":"13000","hashOfConfig":"12232"},{"size":3690,"mtime":1786084511114,"results":"13001","hashOfConfig":"12232"},{"size":1837,"mtime":1786084511114,"results":"13002","hashOfConfig":"12232"},{"size":4308,"mtime":1786084511115,"results":"13003","hashOfConfig":"12232"},{"size":6089,"mtime":1786084511115,"results":"13004","hashOfConfig":"12232"},{"size":2302,"mtime":1786084511115,"results":"13005","hashOfConfig":"12232"},{"size":93505,"mtime":1786084511116,"results":"13006","hashOfConfig":"12232"},{"size":4983,"mtime":1786084511116,"results":"13007","hashOfConfig":"12232"},{"size":9214,"mtime":1786084511116,"results":"13008","hashOfConfig":"12232"},{"size":2938,"mtime":1786084511116,"results":"13009","hashOfConfig":"12232"},{"size":1761,"mtime":1786084511116,"results":"13010","hashOfConfig":"12232"},{"size":3136,"mtime":1786084511117,"results":"13011","hashOfConfig":"12232"},{"size":16962,"mtime":1786084511117,"results":"13012","hashOfConfig":"12232"},{"size":2228,"mtime":1786084511117,"results":"13013","hashOfConfig":"12232"},{"size":13117,"mtime":1786084511117,"results":"13014","hashOfConfig":"12232"},{"size":8494,"mtime":1786084511117,"results":"13015","hashOfConfig":"12232"},{"size":3659,"mtime":1786084511117,"results":"13016","hashOfConfig":"12232"},{"size":1525,"mtime":1786084511118,"results":"13017","hashOfConfig":"12232"},{"size":3365,"mtime":1786084511118,"results":"13018","hashOfConfig":"12232"},{"size":9320,"mtime":1786084511118,"results":"13019","hashOfConfig":"12232"},{"size":111602,"mtime":1786084511119,"results":"13020","hashOfConfig":"12232"},{"size":3898,"mtime":1786084511119,"results":"13021","hashOfConfig":"12232"},{"size":2551,"mtime":1786084511119,"results":"13022","hashOfConfig":"12232"},{"size":5502,"mtime":1786084511119,"results":"13023","hashOfConfig":"12232"},{"size":2039,"mtime":1786084511120,"results":"13024","hashOfConfig":"12232"},{"size":2471,"mtime":1786084511120,"results":"13025","hashOfConfig":"12232"},{"size":1635,"mtime":1786084511120,"results":"13026","hashOfConfig":"12232"},{"size":8685,"mtime":1786084511120,"results":"13027","hashOfConfig":"12232"},{"size":9951,"mtime":1786084511120,"results":"13028","hashOfConfig":"12232"},{"size":3017,"mtime":1786084511120,"results":"13029","hashOfConfig":"12232"},{"size":7638,"mtime":1786084511120,"results":"13030","hashOfConfig":"12232"},{"size":7751,"mtime":1786084511121,"results":"13031","hashOfConfig":"12232"},{"size":8648,"mtime":1786084511121,"results":"13032","hashOfConfig":"12232"},{"size":738,"mtime":1786084511121,"results":"13033","hashOfConfig":"12232"},{"size":6067,"mtime":1786084511121,"results":"13034","hashOfConfig":"12232"},{"size":11851,"mtime":1786084511121,"results":"13035","hashOfConfig":"12232"},{"size":14227,"mtime":1786084511121,"results":"13036","hashOfConfig":"12232"},{"size":4714,"mtime":1786084511122,"results":"13037","hashOfConfig":"12232"},{"size":5246,"mtime":1786084511122,"results":"13038","hashOfConfig":"12232"},{"size":3699,"mtime":1786084511122,"results":"13039","hashOfConfig":"12232"},{"size":20134,"mtime":1786084511122,"results":"13040","hashOfConfig":"12232"},{"size":6999,"mtime":1786084511122,"results":"13041","hashOfConfig":"12232"},{"size":7074,"mtime":1786084511122,"results":"13042","hashOfConfig":"12232"},{"size":1761,"mtime":1786084511123,"results":"13043","hashOfConfig":"12232"},{"size":6729,"mtime":1786084511123,"results":"13044","hashOfConfig":"12232"},{"size":1996,"mtime":1786084511123,"results":"13045","hashOfConfig":"12232"},{"size":1897,"mtime":1786084511123,"results":"13046","hashOfConfig":"12232"},{"size":9214,"mtime":1786084511123,"results":"13047","hashOfConfig":"12232"},{"size":7086,"mtime":1786084511123,"results":"13048","hashOfConfig":"12232"},{"size":1790,"mtime":1786084511123,"results":"13049","hashOfConfig":"12232"},{"size":3817,"mtime":1786084511124,"results":"13050","hashOfConfig":"12232"},{"size":3752,"mtime":1786084511124,"results":"13051","hashOfConfig":"12232"},{"size":20297,"mtime":1786084511124,"results":"13052","hashOfConfig":"12232"},{"size":8633,"mtime":1786084511124,"results":"13053","hashOfConfig":"12232"},{"size":2557,"mtime":1786084511124,"results":"13054","hashOfConfig":"12232"},{"size":2345,"mtime":1786084511124,"results":"13055","hashOfConfig":"12232"},{"size":2766,"mtime":1786084511125,"results":"13056","hashOfConfig":"12232"},{"size":489,"mtime":1786084511125,"results":"13057","hashOfConfig":"12232"},{"size":3180,"mtime":1786084511125,"results":"13058","hashOfConfig":"12232"},{"size":3080,"mtime":1786084511125,"results":"13059","hashOfConfig":"12232"},{"size":8176,"mtime":1786084511125,"results":"13060","hashOfConfig":"12232"},{"size":1357,"mtime":1786084511125,"results":"13061","hashOfConfig":"12232"},{"size":2873,"mtime":1786084511126,"results":"13062","hashOfConfig":"12232"},{"size":3780,"mtime":1786084511126,"results":"13063","hashOfConfig":"12232"},{"size":10911,"mtime":1786084511126,"results":"13064","hashOfConfig":"12232"},{"size":3076,"mtime":1786084511126,"results":"13065","hashOfConfig":"12232"},{"size":6554,"mtime":1786084511126,"results":"13066","hashOfConfig":"12232"},{"size":2433,"mtime":1786084511126,"results":"13067","hashOfConfig":"12232"},{"size":3834,"mtime":1786084511126,"results":"13068","hashOfConfig":"12232"},{"size":3262,"mtime":1786084511127,"results":"13069","hashOfConfig":"12232"},{"size":6275,"mtime":1786084511127,"results":"13070","hashOfConfig":"12232"},{"size":8490,"mtime":1786084511127,"results":"13071","hashOfConfig":"12232"},{"size":3670,"mtime":1786084511127,"results":"13072","hashOfConfig":"12232"},{"size":900,"mtime":1786084511127,"results":"13073","hashOfConfig":"12232"},{"size":5510,"mtime":1786084511127,"results":"13074","hashOfConfig":"12232"},{"size":17575,"mtime":1786084511128,"results":"13075","hashOfConfig":"12232"},{"size":2567,"mtime":1786084511128,"results":"13076","hashOfConfig":"12232"},{"size":975,"mtime":1786084511128,"results":"13077","hashOfConfig":"12232"},{"size":17999,"mtime":1786084511128,"results":"13078","hashOfConfig":"12232"},{"size":7845,"mtime":1786084511128,"results":"13079","hashOfConfig":"12232"},{"size":2115,"mtime":1786084511128,"results":"13080","hashOfConfig":"12232"},{"size":3190,"mtime":1786084511129,"results":"13081","hashOfConfig":"12232"},{"size":3004,"mtime":1786084511129,"results":"13082","hashOfConfig":"12232"},{"size":5857,"mtime":1786084511129,"results":"13083","hashOfConfig":"12232"},{"size":3018,"mtime":1786084511129,"results":"13084","hashOfConfig":"12232"},{"size":6020,"mtime":1786084511129,"results":"13085","hashOfConfig":"12232"},{"size":9939,"mtime":1786084511129,"results":"13086","hashOfConfig":"12232"},{"size":3409,"mtime":1786084511130,"results":"13087","hashOfConfig":"12232"},{"size":3835,"mtime":1786084511130,"results":"13088","hashOfConfig":"12232"},{"size":7464,"mtime":1786084511130,"results":"13089","hashOfConfig":"12232"},{"size":4050,"mtime":1786084511130,"results":"13090","hashOfConfig":"12232"},{"size":2150,"mtime":1786084511130,"results":"13091","hashOfConfig":"12232"},{"size":2233,"mtime":1786084511130,"results":"13092","hashOfConfig":"12232"},{"size":9955,"mtime":1786084511131,"results":"13093","hashOfConfig":"12232"},{"size":2505,"mtime":1786084511131,"results":"13094","hashOfConfig":"12232"},{"size":3710,"mtime":1786084511131,"results":"13095","hashOfConfig":"12232"},{"size":18252,"mtime":1786084511131,"results":"13096","hashOfConfig":"12232"},{"size":2309,"mtime":1786084511131,"results":"13097","hashOfConfig":"12232"},{"size":1751,"mtime":1786084511131,"results":"13098","hashOfConfig":"12232"},{"size":3209,"mtime":1786084511131,"results":"13099","hashOfConfig":"12232"},{"size":2692,"mtime":1786084511132,"results":"13100","hashOfConfig":"12232"},{"size":4519,"mtime":1786084511132,"results":"13101","hashOfConfig":"12232"},{"size":3181,"mtime":1786084511132,"results":"13102","hashOfConfig":"12232"},{"size":6189,"mtime":1786084511132,"results":"13103","hashOfConfig":"12232"},{"size":2739,"mtime":1786084511132,"results":"13104","hashOfConfig":"12232"},{"size":3537,"mtime":1786084511132,"results":"13105","hashOfConfig":"12232"},{"size":1311,"mtime":1786084511132,"results":"13106","hashOfConfig":"12232"},{"size":7845,"mtime":1786084511133,"results":"13107","hashOfConfig":"12232"},{"size":3632,"mtime":1786084511133,"results":"13108","hashOfConfig":"12232"},{"size":7854,"mtime":1786084511133,"results":"13109","hashOfConfig":"12232"},{"size":2860,"mtime":1786084511133,"results":"13110","hashOfConfig":"12232"},{"size":4786,"mtime":1786084511133,"results":"13111","hashOfConfig":"12232"},{"size":3388,"mtime":1786084511133,"results":"13112","hashOfConfig":"12232"},{"size":4682,"mtime":1786084511134,"results":"13113","hashOfConfig":"12232"},{"size":17693,"mtime":1786084511134,"results":"13114","hashOfConfig":"12232"},{"size":1693,"mtime":1786084511134,"results":"13115","hashOfConfig":"12232"},{"size":9445,"mtime":1786084511134,"results":"13116","hashOfConfig":"12232"},{"size":4655,"mtime":1786084511134,"results":"13117","hashOfConfig":"12232"},{"size":10505,"mtime":1786084511135,"results":"13118","hashOfConfig":"12232"},{"size":1422,"mtime":1786084511135,"results":"13119","hashOfConfig":"12232"},{"size":950,"mtime":1786084511135,"results":"13120","hashOfConfig":"12232"},{"size":11541,"mtime":1786084511135,"results":"13121","hashOfConfig":"12232"},{"size":14034,"mtime":1786084511135,"results":"13122","hashOfConfig":"12232"},{"size":3239,"mtime":1786084511135,"results":"13123","hashOfConfig":"12232"},{"size":5909,"mtime":1786084511136,"results":"13124","hashOfConfig":"12232"},{"size":12776,"mtime":1786084511136,"results":"13125","hashOfConfig":"12232"},{"size":12934,"mtime":1786084511137,"results":"13126","hashOfConfig":"12232"},{"size":3926,"mtime":1786084511137,"results":"13127","hashOfConfig":"12285"},{"size":13439,"mtime":1786084511160,"results":"13128","hashOfConfig":"12232"},{"size":4191,"mtime":1786084511160,"results":"13129","hashOfConfig":"12232"},{"size":3873,"mtime":1786084511161,"results":"13130","hashOfConfig":"12232"},{"size":3921,"mtime":1786084511161,"results":"13131","hashOfConfig":"12232"},{"size":316,"mtime":1786084511161,"results":"13132","hashOfConfig":"12232"},{"size":3775,"mtime":1786084511161,"results":"13133","hashOfConfig":"12232"},{"size":5307,"mtime":1786084511161,"results":"13134","hashOfConfig":"12232"},{"size":2357,"mtime":1786084511161,"results":"13135","hashOfConfig":"12232"},{"size":1245,"mtime":1786084511161,"results":"13136","hashOfConfig":"12232"},{"size":5496,"mtime":1786084511161,"results":"13137","hashOfConfig":"12232"},{"size":1373,"mtime":1786084511162,"results":"13138","hashOfConfig":"12232"},{"size":9274,"mtime":1786084511162,"results":"13139","hashOfConfig":"12232"},{"size":1888,"mtime":1786084511162,"results":"13140","hashOfConfig":"12232"},{"size":2221,"mtime":1786084511162,"results":"13141","hashOfConfig":"12232"},{"size":2531,"mtime":1786084511162,"results":"13142","hashOfConfig":"12232"},{"size":1321,"mtime":1786084511162,"results":"13143","hashOfConfig":"12232"},{"size":1251,"mtime":1786084511162,"results":"13144","hashOfConfig":"12232"},{"size":1325,"mtime":1786084511163,"results":"13145","hashOfConfig":"12232"},{"size":2068,"mtime":1786084511163,"results":"13146","hashOfConfig":"12232"},{"size":2476,"mtime":1786084511163,"results":"13147","hashOfConfig":"12232"},{"size":2897,"mtime":1786084511163,"results":"13148","hashOfConfig":"12232"},{"size":1536,"mtime":1786084511163,"results":"13149","hashOfConfig":"12232"},{"size":1262,"mtime":1786084511163,"results":"13150","hashOfConfig":"12232"},{"size":5637,"mtime":1786084511137,"results":"13151","hashOfConfig":"12232"},{"size":5856,"mtime":1786084511137,"results":"13152","hashOfConfig":"12232"},{"size":12695,"mtime":1786084511137,"results":"13153","hashOfConfig":"12232"},{"size":3645,"mtime":1786084511138,"results":"13154","hashOfConfig":"12232"},{"size":4547,"mtime":1786084511138,"results":"13155","hashOfConfig":"12232"},{"size":1730,"mtime":1786084511138,"results":"13156","hashOfConfig":"12232"},{"size":3750,"mtime":1786084511138,"results":"13157","hashOfConfig":"12232"},{"size":1314,"mtime":1786084511138,"results":"13158","hashOfConfig":"12232"},{"size":4662,"mtime":1786084511138,"results":"13159","hashOfConfig":"12232"},{"size":1543,"mtime":1786084511138,"results":"13160","hashOfConfig":"12232"},{"size":3015,"mtime":1786084511138,"results":"13161","hashOfConfig":"12232"},{"size":6142,"mtime":1786084511139,"results":"13162","hashOfConfig":"12232"},{"size":1116,"mtime":1786084511139,"results":"13163","hashOfConfig":"12232"},{"size":5333,"mtime":1786084511139,"results":"13164","hashOfConfig":"12232"},{"size":3562,"mtime":1786084511139,"results":"13165","hashOfConfig":"12232"},{"size":4337,"mtime":1786084511139,"results":"13166","hashOfConfig":"12232"},{"size":3458,"mtime":1786084511140,"results":"13167","hashOfConfig":"12232"},{"size":9322,"mtime":1786084511140,"results":"13168","hashOfConfig":"12232"},{"size":1633,"mtime":1786084511140,"results":"13169","hashOfConfig":"12232"},{"size":4738,"mtime":1786084511140,"results":"13170","hashOfConfig":"12232"},{"size":4755,"mtime":1786084511140,"results":"13171","hashOfConfig":"12232"},{"size":6676,"mtime":1786084511140,"results":"13172","hashOfConfig":"12232"},{"size":1458,"mtime":1786084511141,"results":"13173","hashOfConfig":"12232"},{"size":2774,"mtime":1786084511141,"results":"13174","hashOfConfig":"12232"},{"size":4679,"mtime":1786084511141,"results":"13175","hashOfConfig":"12232"},{"size":2442,"mtime":1786084511142,"results":"13176","hashOfConfig":"12232"},{"size":3735,"mtime":1786084511142,"results":"13177","hashOfConfig":"12232"},{"size":2899,"mtime":1786084511142,"results":"13178","hashOfConfig":"12232"},{"size":3281,"mtime":1786084511142,"results":"13179","hashOfConfig":"12232"},{"size":4353,"mtime":1786084511143,"results":"13180","hashOfConfig":"12232"},{"size":487,"mtime":1786084511143,"results":"13181","hashOfConfig":"12232"},{"size":3875,"mtime":1786084511143,"results":"13182","hashOfConfig":"12232"},{"size":4296,"mtime":1786084511144,"results":"13183","hashOfConfig":"12232"},{"size":6972,"mtime":1786084511144,"results":"13184","hashOfConfig":"12232"},{"size":4896,"mtime":1786084511144,"results":"13185","hashOfConfig":"12232"},{"size":13062,"mtime":1786084511144,"results":"13186","hashOfConfig":"12232"},{"size":3810,"mtime":1786084511144,"results":"13187","hashOfConfig":"12232"},{"size":932,"mtime":1786084511145,"results":"13188","hashOfConfig":"12232"},{"size":2696,"mtime":1786084511145,"results":"13189","hashOfConfig":"12232"},{"size":21792,"mtime":1786084511146,"results":"13190","hashOfConfig":"12232"},{"size":3686,"mtime":1786084511146,"results":"13191","hashOfConfig":"12232"},{"size":3455,"mtime":1786084511146,"results":"13192","hashOfConfig":"12232"},{"size":3921,"mtime":1786084511146,"results":"13193","hashOfConfig":"12232"},{"size":2763,"mtime":1786084511145,"results":"13194","hashOfConfig":"12232"},{"size":4377,"mtime":1786084511146,"results":"13195","hashOfConfig":"12232"},{"size":1359,"mtime":1786084511146,"results":"13196","hashOfConfig":"12232"},{"size":2555,"mtime":1786084511146,"results":"13197","hashOfConfig":"12232"},{"size":4603,"mtime":1786084511147,"results":"13198","hashOfConfig":"12232"},{"size":10354,"mtime":1786084511147,"results":"13199","hashOfConfig":"12232"},{"size":3767,"mtime":1786084511147,"results":"13200","hashOfConfig":"12232"},{"size":7665,"mtime":1786084511147,"results":"13201","hashOfConfig":"12232"},{"size":7610,"mtime":1786084511147,"results":"13202","hashOfConfig":"12232"},{"size":4418,"mtime":1786084511147,"results":"13203","hashOfConfig":"12232"},{"size":4851,"mtime":1786084511148,"results":"13204","hashOfConfig":"12232"},{"size":6255,"mtime":1786084511148,"results":"13205","hashOfConfig":"12232"},{"size":9537,"mtime":1786084511148,"results":"13206","hashOfConfig":"12285"},{"size":6037,"mtime":1786084511148,"results":"13207","hashOfConfig":"12232"},{"size":2967,"mtime":1786084511148,"results":"13208","hashOfConfig":"12232"},{"size":1087,"mtime":1786084511149,"results":"13209","hashOfConfig":"12232"},{"size":3392,"mtime":1786084511149,"results":"13210","hashOfConfig":"12232"},{"size":4716,"mtime":1786084511149,"results":"13211","hashOfConfig":"12232"},{"size":6193,"mtime":1786084511149,"results":"13212","hashOfConfig":"12232"},{"size":4680,"mtime":1786084511149,"results":"13213","hashOfConfig":"12232"},{"size":2203,"mtime":1786084511149,"results":"13214","hashOfConfig":"12232"},{"size":4165,"mtime":1786084511150,"results":"13215","hashOfConfig":"12232"},{"size":3017,"mtime":1786084511150,"results":"13216","hashOfConfig":"12232"},{"size":5941,"mtime":1786084511150,"results":"13217","hashOfConfig":"12232"},{"size":2996,"mtime":1786084511150,"results":"13218","hashOfConfig":"12232"},{"size":7473,"mtime":1786084511150,"results":"13219","hashOfConfig":"12232"},{"size":6045,"mtime":1786084511150,"results":"13220","hashOfConfig":"12232"},{"size":4761,"mtime":1786084511151,"results":"13221","hashOfConfig":"12232"},{"size":3624,"mtime":1786084511151,"results":"13222","hashOfConfig":"12232"},{"size":9221,"mtime":1786084511151,"results":"13223","hashOfConfig":"12232"},{"size":5928,"mtime":1786084511151,"results":"13224","hashOfConfig":"12232"},{"size":4789,"mtime":1786084511151,"results":"13225","hashOfConfig":"12232"},{"size":4972,"mtime":1786084511151,"results":"13226","hashOfConfig":"12232"},{"size":6444,"mtime":1786084511152,"results":"13227","hashOfConfig":"12232"},{"size":8871,"mtime":1786084511152,"results":"13228","hashOfConfig":"12232"},{"size":10986,"mtime":1786084511152,"results":"13229","hashOfConfig":"12232"},{"size":6377,"mtime":1786084511152,"results":"13230","hashOfConfig":"12232"},{"size":4324,"mtime":1786084511152,"results":"13231","hashOfConfig":"12232"},{"size":12183,"mtime":1786084511153,"results":"13232","hashOfConfig":"12232"},{"size":14729,"mtime":1786084511153,"results":"13233","hashOfConfig":"12232"},{"size":3438,"mtime":1786084511153,"results":"13234","hashOfConfig":"12232"},{"size":2834,"mtime":1786084511153,"results":"13235","hashOfConfig":"12232"},{"size":5871,"mtime":1786084511153,"results":"13236","hashOfConfig":"12232"},{"size":3097,"mtime":1786084511154,"results":"13237","hashOfConfig":"12232"},{"size":3375,"mtime":1786084511154,"results":"13238","hashOfConfig":"12232"},{"size":2616,"mtime":1786084511154,"results":"13239","hashOfConfig":"12232"},{"size":1549,"mtime":1786084511154,"results":"13240","hashOfConfig":"12232"},{"size":1609,"mtime":1786084511154,"results":"13241","hashOfConfig":"12232"},{"size":1255,"mtime":1786084511154,"results":"13242","hashOfConfig":"12232"},{"size":6433,"mtime":1786084511155,"results":"13243","hashOfConfig":"12232"},{"size":3308,"mtime":1786084511155,"results":"13244","hashOfConfig":"12232"},{"size":8301,"mtime":1786084511155,"results":"13245","hashOfConfig":"12232"},{"size":1645,"mtime":1786084511155,"results":"13246","hashOfConfig":"12232"},{"size":5806,"mtime":1786084511155,"results":"13247","hashOfConfig":"12232"},{"size":6432,"mtime":1786084511155,"results":"13248","hashOfConfig":"12232"},{"size":7092,"mtime":1786084511155,"results":"13249","hashOfConfig":"12232"},{"size":2496,"mtime":1786084511156,"results":"13250","hashOfConfig":"12232"},{"size":1433,"mtime":1786084511156,"results":"13251","hashOfConfig":"12232"},{"size":3442,"mtime":1786084511156,"results":"13252","hashOfConfig":"12232"},{"size":8787,"mtime":1786084511156,"results":"13253","hashOfConfig":"12232"},{"size":3306,"mtime":1786084511156,"results":"13254","hashOfConfig":"12232"},{"size":2192,"mtime":1786084511156,"results":"13255","hashOfConfig":"12232"},{"size":5403,"mtime":1786084511157,"results":"13256","hashOfConfig":"12232"},{"size":4999,"mtime":1786084511157,"results":"13257","hashOfConfig":"12232"},{"size":3963,"mtime":1786084511157,"results":"13258","hashOfConfig":"12232"},{"size":3509,"mtime":1786084511157,"results":"13259","hashOfConfig":"12232"},{"size":1721,"mtime":1786084511157,"results":"13260","hashOfConfig":"12232"},{"size":2669,"mtime":1786084511157,"results":"13261","hashOfConfig":"12232"},{"size":9125,"mtime":1786084511158,"results":"13262","hashOfConfig":"12232"},{"size":1305,"mtime":1786084511158,"results":"13263","hashOfConfig":"12232"},{"size":2744,"mtime":1786084511158,"results":"13264","hashOfConfig":"12232"},{"size":3445,"mtime":1786084511158,"results":"13265","hashOfConfig":"12232"},{"size":4879,"mtime":1786084511158,"results":"13266","hashOfConfig":"12232"},{"size":4431,"mtime":1786084511158,"results":"13267","hashOfConfig":"12232"},{"size":4562,"mtime":1786084511158,"results":"13268","hashOfConfig":"12232"},{"size":3286,"mtime":1786084511159,"results":"13269","hashOfConfig":"12232"},{"size":4210,"mtime":1786084511159,"results":"13270","hashOfConfig":"12232"},{"size":3356,"mtime":1786084511159,"results":"13271","hashOfConfig":"12232"},{"size":3037,"mtime":1786084511159,"results":"13272","hashOfConfig":"12232"},{"size":1379,"mtime":1786084511159,"results":"13273","hashOfConfig":"12232"},{"size":1552,"mtime":1786084511159,"results":"13274","hashOfConfig":"12232"},{"size":1558,"mtime":1786084511159,"results":"13275","hashOfConfig":"12232"},{"size":7397,"mtime":1786084511160,"results":"13276","hashOfConfig":"12232"},{"size":2412,"mtime":1786084511160,"results":"13277","hashOfConfig":"12232"},{"size":3044,"mtime":1786084511160,"results":"13278","hashOfConfig":"12285"},{"size":7088,"mtime":1786084511160,"results":"13279","hashOfConfig":"12232"},{"size":3298,"mtime":1786084511163,"results":"13280","hashOfConfig":"12232"},{"size":2622,"mtime":1786084511163,"results":"13281","hashOfConfig":"12232"},{"size":7140,"mtime":1786084511164,"results":"13282","hashOfConfig":"12232"},{"size":1242,"mtime":1786084511164,"results":"13283","hashOfConfig":"12232"},{"size":2440,"mtime":1786084511164,"results":"13284","hashOfConfig":"12232"},{"size":977,"mtime":1786084511164,"results":"13285","hashOfConfig":"12232"},{"size":4630,"mtime":1786084511164,"results":"13286","hashOfConfig":"12232"},{"size":14670,"mtime":1786084511164,"results":"13287","hashOfConfig":"12232"},{"size":3211,"mtime":1786084511165,"results":"13288","hashOfConfig":"12232"},{"size":4450,"mtime":1786084511165,"results":"13289","hashOfConfig":"12232"},{"size":7238,"mtime":1786084511165,"results":"13290","hashOfConfig":"12232"},{"size":18081,"mtime":1786084511165,"results":"13291","hashOfConfig":"12232"},{"size":11176,"mtime":1786084511165,"results":"13292","hashOfConfig":"12232"},{"size":4398,"mtime":1786084511165,"results":"13293","hashOfConfig":"12232"},{"size":2494,"mtime":1786084511166,"results":"13294","hashOfConfig":"12232"},{"size":3677,"mtime":1786084511166,"results":"13295","hashOfConfig":"12232"},{"size":3334,"mtime":1786084511166,"results":"13296","hashOfConfig":"12232"},{"size":5904,"mtime":1786084511166,"results":"13297","hashOfConfig":"12232"},{"size":2694,"mtime":1786084511166,"results":"13298","hashOfConfig":"12232"},{"size":2749,"mtime":1786084511167,"results":"13299","hashOfConfig":"12232"},{"size":8653,"mtime":1786084511167,"results":"13300","hashOfConfig":"12232"},{"size":7972,"mtime":1786084511167,"results":"13301","hashOfConfig":"12232"},{"size":6019,"mtime":1786084511167,"results":"13302","hashOfConfig":"12232"},{"size":1485,"mtime":1786084511167,"results":"13303","hashOfConfig":"12232"},{"size":1980,"mtime":1786084511167,"results":"13304","hashOfConfig":"12232"},{"size":4317,"mtime":1786084511167,"results":"13305","hashOfConfig":"12232"},{"size":3909,"mtime":1786084511168,"results":"13306","hashOfConfig":"12232"},{"size":4906,"mtime":1786084511168,"results":"13307","hashOfConfig":"12232"},{"size":12838,"mtime":1786084511168,"results":"13308","hashOfConfig":"12232"},{"size":10409,"mtime":1786084511168,"results":"13309","hashOfConfig":"12232"},{"size":1894,"mtime":1786084511168,"results":"13310","hashOfConfig":"12232"},{"size":10708,"mtime":1786084511169,"results":"13311","hashOfConfig":"12232"},{"size":1653,"mtime":1786084511169,"results":"13312","hashOfConfig":"12232"},{"size":3775,"mtime":1786084511169,"results":"13313","hashOfConfig":"12232"},{"size":17790,"mtime":1786084511170,"results":"13314","hashOfConfig":"12232"},{"size":7441,"mtime":1786084511170,"results":"13315","hashOfConfig":"12232"},{"size":1672,"mtime":1786084511170,"results":"13316","hashOfConfig":"12232"},{"size":3648,"mtime":1786084511170,"results":"13317","hashOfConfig":"12232"},{"size":2970,"mtime":1786084511170,"results":"13318","hashOfConfig":"12232"},{"size":3410,"mtime":1786084511170,"results":"13319","hashOfConfig":"12232"},{"size":8218,"mtime":1786084511171,"results":"13320","hashOfConfig":"12232"},{"size":1031,"mtime":1786084511171,"results":"13321","hashOfConfig":"12232"},{"size":1502,"mtime":1786084511171,"results":"13322","hashOfConfig":"12232"},{"size":5755,"mtime":1786084511171,"results":"13323","hashOfConfig":"12232"},{"size":7570,"mtime":1786084511171,"results":"13324","hashOfConfig":"12232"},{"size":1117,"mtime":1786084511171,"results":"13325","hashOfConfig":"12232"},{"size":2519,"mtime":1786084511171,"results":"13326","hashOfConfig":"12232"},{"size":6262,"mtime":1786084511172,"results":"13327","hashOfConfig":"12232"},{"size":2356,"mtime":1786084511172,"results":"13328","hashOfConfig":"12232"},{"size":3882,"mtime":1786084511172,"results":"13329","hashOfConfig":"12232"},{"size":5422,"mtime":1786084511172,"results":"13330","hashOfConfig":"12232"},{"size":1419,"mtime":1786084511172,"results":"13331","hashOfConfig":"12232"},{"size":8467,"mtime":1786084511172,"results":"13332","hashOfConfig":"12232"},{"size":6130,"mtime":1786084511172,"results":"13333","hashOfConfig":"12232"},{"size":2657,"mtime":1786084511173,"results":"13334","hashOfConfig":"12232"},{"size":2232,"mtime":1786084511173,"results":"13335","hashOfConfig":"12232"},{"size":3096,"mtime":1786084511173,"results":"13336","hashOfConfig":"12232"},{"size":4009,"mtime":1786084511173,"results":"13337","hashOfConfig":"12232"},{"size":1805,"mtime":1786084511173,"results":"13338","hashOfConfig":"12232"},{"size":6416,"mtime":1786084511173,"results":"13339","hashOfConfig":"12232"},{"size":3695,"mtime":1786084511173,"results":"13340","hashOfConfig":"12232"},{"size":7010,"mtime":1786084511174,"results":"13341","hashOfConfig":"12232"},{"size":3045,"mtime":1786084511174,"results":"13342","hashOfConfig":"12232"},{"size":6022,"mtime":1786084511174,"results":"13343","hashOfConfig":"12232"},{"size":8647,"mtime":1786084511174,"results":"13344","hashOfConfig":"12232"},{"size":2158,"mtime":1786084511174,"results":"13345","hashOfConfig":"12232"},{"size":4216,"mtime":1786084511174,"results":"13346","hashOfConfig":"12232"},{"size":3228,"mtime":1786084511174,"results":"13347","hashOfConfig":"12232"},{"size":2560,"mtime":1786084511174,"results":"13348","hashOfConfig":"12232"},{"size":3213,"mtime":1786084511175,"results":"13349","hashOfConfig":"12232"},{"size":7966,"mtime":1786084511175,"results":"13350","hashOfConfig":"12232"},{"size":2882,"mtime":1786084511175,"results":"13351","hashOfConfig":"12232"},{"size":4170,"mtime":1786084511175,"results":"13352","hashOfConfig":"12232"},{"size":12415,"mtime":1786084511175,"results":"13353","hashOfConfig":"12232"},{"size":2905,"mtime":1786084511175,"results":"13354","hashOfConfig":"12232"},{"size":2312,"mtime":1786084511176,"results":"13355","hashOfConfig":"12232"},{"size":2634,"mtime":1786084511176,"results":"13356","hashOfConfig":"12232"},{"size":7530,"mtime":1786084511176,"results":"13357","hashOfConfig":"12232"},{"size":4784,"mtime":1786084511176,"results":"13358","hashOfConfig":"12232"},{"size":2354,"mtime":1786084511176,"results":"13359","hashOfConfig":"12232"},{"size":5373,"mtime":1786084511176,"results":"13360","hashOfConfig":"12232"},{"size":5994,"mtime":1786084511176,"results":"13361","hashOfConfig":"12232"},{"size":12242,"mtime":1786084511177,"results":"13362","hashOfConfig":"12232"},{"size":6012,"mtime":1786084511177,"results":"13363","hashOfConfig":"12232"},{"size":2770,"mtime":1786084511177,"results":"13364","hashOfConfig":"12232"},{"size":3642,"mtime":1786084511177,"results":"13365","hashOfConfig":"12232"},{"size":2348,"mtime":1786084511177,"results":"13366","hashOfConfig":"12232"},{"size":1393,"mtime":1786084511177,"results":"13367","hashOfConfig":"12232"},{"size":4843,"mtime":1786084511177,"results":"13368","hashOfConfig":"12232"},{"size":3968,"mtime":1786084511177,"results":"13369","hashOfConfig":"12232"},{"size":1505,"mtime":1786084511177,"results":"13370","hashOfConfig":"12232"},{"size":2904,"mtime":1786084511178,"results":"13371","hashOfConfig":"12232"},{"size":3880,"mtime":1786084511178,"results":"13372","hashOfConfig":"12232"},{"size":9286,"mtime":1786084511178,"results":"13373","hashOfConfig":"12232"},{"size":3631,"mtime":1786084511178,"results":"13374","hashOfConfig":"12232"},{"size":8453,"mtime":1786084511178,"results":"13375","hashOfConfig":"12232"},{"size":6198,"mtime":1786084511178,"results":"13376","hashOfConfig":"12232"},{"size":4899,"mtime":1786084511178,"results":"13377","hashOfConfig":"12232"},{"size":11748,"mtime":1786084511179,"results":"13378","hashOfConfig":"12232"},{"size":6907,"mtime":1786084511179,"results":"13379","hashOfConfig":"12232"},{"size":6765,"mtime":1786084511179,"results":"13380","hashOfConfig":"12232"},{"size":6587,"mtime":1786084511197,"results":"13381","hashOfConfig":"12232"},{"size":3669,"mtime":1786084511197,"results":"13382","hashOfConfig":"12232"},{"size":3002,"mtime":1786084511197,"results":"13383","hashOfConfig":"12232"},{"size":2582,"mtime":1786084511197,"results":"13384","hashOfConfig":"12232"},{"size":4295,"mtime":1786084511198,"results":"13385","hashOfConfig":"12232"},{"size":4708,"mtime":1786084511198,"results":"13386","hashOfConfig":"12232"},{"size":18916,"mtime":1786084511198,"results":"13387","hashOfConfig":"12232"},{"size":10089,"mtime":1786084511198,"results":"13388","hashOfConfig":"12232"},{"size":4615,"mtime":1786084511198,"results":"13389","hashOfConfig":"12232"},{"size":1882,"mtime":1786084511198,"results":"13390","hashOfConfig":"12232"},{"size":4483,"mtime":1786084511209,"results":"13391","hashOfConfig":"12232"},{"size":4336,"mtime":1786084511209,"results":"13392","hashOfConfig":"12232"},{"size":5338,"mtime":1786084511209,"results":"13393","hashOfConfig":"12232"},{"size":5075,"mtime":1786084511209,"results":"13394","hashOfConfig":"12232"},{"size":4804,"mtime":1786084511179,"results":"13395","hashOfConfig":"12232"},{"size":9394,"mtime":1786084511179,"results":"13396","hashOfConfig":"12232"},{"size":4044,"mtime":1786084511179,"results":"13397","hashOfConfig":"12232"},{"size":2575,"mtime":1786084511180,"results":"13398","hashOfConfig":"12232"},{"size":9070,"mtime":1786084511180,"results":"13399","hashOfConfig":"12232"},{"size":7581,"mtime":1786084511180,"results":"13400","hashOfConfig":"12232"},{"size":4130,"mtime":1786084511180,"results":"13401","hashOfConfig":"12232"},{"size":4686,"mtime":1786084511180,"results":"13402","hashOfConfig":"12232"},{"size":3644,"mtime":1786084511180,"results":"13403","hashOfConfig":"12232"},{"size":2851,"mtime":1786084511180,"results":"13404","hashOfConfig":"12232"},{"size":2597,"mtime":1786084511180,"results":"13405","hashOfConfig":"12232"},{"size":8153,"mtime":1786084511181,"results":"13406","hashOfConfig":"12232"},{"size":4191,"mtime":1786084511181,"results":"13407","hashOfConfig":"12232"},{"size":3124,"mtime":1786084511181,"results":"13408","hashOfConfig":"12232"},{"size":3424,"mtime":1786084511181,"results":"13409","hashOfConfig":"12232"},{"size":2198,"mtime":1786084511181,"results":"13410","hashOfConfig":"12232"},{"size":2505,"mtime":1786084511181,"results":"13411","hashOfConfig":"12232"},{"size":8969,"mtime":1786084511181,"results":"13412","hashOfConfig":"12232"},{"size":7571,"mtime":1786084511181,"results":"13413","hashOfConfig":"12232"},{"size":4418,"mtime":1786084511182,"results":"13414","hashOfConfig":"12232"},{"size":31032,"mtime":1786084511182,"results":"13415","hashOfConfig":"12232"},{"size":7952,"mtime":1786084511182,"results":"13416","hashOfConfig":"12232"},{"size":3142,"mtime":1786084511182,"results":"13417","hashOfConfig":"12232"},{"size":21010,"mtime":1786084511183,"results":"13418","hashOfConfig":"12232"},{"size":9386,"mtime":1786084511183,"results":"13419","hashOfConfig":"12232"},{"size":13908,"mtime":1786084511183,"results":"13420","hashOfConfig":"12232"},{"size":4849,"mtime":1786084511183,"results":"13421","hashOfConfig":"12232"},{"size":9733,"mtime":1786084511183,"results":"13422","hashOfConfig":"12232"},{"size":3099,"mtime":1786084511183,"results":"13423","hashOfConfig":"12232"},{"size":8088,"mtime":1786084511183,"results":"13424","hashOfConfig":"12232"},{"size":3297,"mtime":1786084511184,"results":"13425","hashOfConfig":"12232"},{"size":5182,"mtime":1786084511184,"results":"13426","hashOfConfig":"12232"},{"size":8824,"mtime":1786084511184,"results":"13427","hashOfConfig":"12232"},{"size":22299,"mtime":1786084511184,"results":"13428","hashOfConfig":"12232"},{"size":7043,"mtime":1786084511185,"results":"13429","hashOfConfig":"12232"},{"size":961,"mtime":1786084511185,"results":"13430","hashOfConfig":"12232"},{"size":3542,"mtime":1786084511185,"results":"13431","hashOfConfig":"12232"},{"size":10982,"mtime":1786084511185,"results":"13432","hashOfConfig":"12232"},{"size":5077,"mtime":1786084511186,"results":"13433","hashOfConfig":"12232"},{"size":5470,"mtime":1786084511186,"results":"13434","hashOfConfig":"12232"},{"size":6853,"mtime":1786084511186,"results":"13435","hashOfConfig":"12232"},{"size":5050,"mtime":1786084511186,"results":"13436","hashOfConfig":"12232"},{"size":6168,"mtime":1786084511186,"results":"13437","hashOfConfig":"12232"},{"size":11186,"mtime":1786084511187,"results":"13438","hashOfConfig":"12232"},{"size":5032,"mtime":1786084511187,"results":"13439","hashOfConfig":"12232"},{"size":4823,"mtime":1786084511187,"results":"13440","hashOfConfig":"12232"},{"size":6224,"mtime":1786084511187,"results":"13441","hashOfConfig":"12232"},{"size":9454,"mtime":1786084511187,"results":"13442","hashOfConfig":"12232"},{"size":2907,"mtime":1786084511187,"results":"13443","hashOfConfig":"12232"},{"size":10261,"mtime":1786084511187,"results":"13444","hashOfConfig":"12232"},{"size":3388,"mtime":1786084511187,"results":"13445","hashOfConfig":"12232"},{"size":3008,"mtime":1786084511188,"results":"13446","hashOfConfig":"12232"},{"size":3887,"mtime":1786084511188,"results":"13447","hashOfConfig":"12232"},{"size":2674,"mtime":1786084511188,"results":"13448","hashOfConfig":"12232"},{"size":5215,"mtime":1786084511188,"results":"13449","hashOfConfig":"12232"},{"size":2584,"mtime":1786084511188,"results":"13450","hashOfConfig":"12232"},{"size":2872,"mtime":1786084511188,"results":"13451","hashOfConfig":"12232"},{"size":7006,"mtime":1786084511188,"results":"13452","hashOfConfig":"12232"},{"size":5430,"mtime":1786084511188,"results":"13453","hashOfConfig":"12232"},{"size":4391,"mtime":1786084511189,"results":"13454","hashOfConfig":"12232"},{"size":4312,"mtime":1786084511189,"results":"13455","hashOfConfig":"12232"},{"size":3375,"mtime":1786084511189,"results":"13456","hashOfConfig":"12232"},{"size":2875,"mtime":1786084511189,"results":"13457","hashOfConfig":"12232"},{"size":9666,"mtime":1786084511189,"results":"13458","hashOfConfig":"12232"},{"size":6483,"mtime":1786084511189,"results":"13459","hashOfConfig":"12232"},{"size":6693,"mtime":1786084511189,"results":"13460","hashOfConfig":"12232"},{"size":6027,"mtime":1786084511189,"results":"13461","hashOfConfig":"12232"},{"size":3631,"mtime":1786084511190,"results":"13462","hashOfConfig":"12232"},{"size":5228,"mtime":1786084511190,"results":"13463","hashOfConfig":"12232"},{"size":4711,"mtime":1786084511190,"results":"13464","hashOfConfig":"12232"},{"size":2523,"mtime":1786084511190,"results":"13465","hashOfConfig":"12232"},{"size":17683,"mtime":1786084511190,"results":"13466","hashOfConfig":"12232"},{"size":1267,"mtime":1786084511190,"results":"13467","hashOfConfig":"12232"},{"size":6424,"mtime":1786084511190,"results":"13468","hashOfConfig":"12232"},{"size":18483,"mtime":1786084511191,"results":"13469","hashOfConfig":"12232"},{"size":10002,"mtime":1786084511191,"results":"13470","hashOfConfig":"12232"},{"size":10216,"mtime":1786084511191,"results":"13471","hashOfConfig":"12232"},{"size":2619,"mtime":1786084511191,"results":"13472","hashOfConfig":"12232"},{"size":3370,"mtime":1786084511191,"results":"13473","hashOfConfig":"12232"},{"size":4596,"mtime":1786084511191,"results":"13474","hashOfConfig":"12232"},{"size":5373,"mtime":1786084511192,"results":"13475","hashOfConfig":"12232"},{"size":4083,"mtime":1786084511192,"results":"13476","hashOfConfig":"12232"},{"size":5529,"mtime":1786084511192,"results":"13477","hashOfConfig":"12232"},{"size":9543,"mtime":1786084511192,"results":"13478","hashOfConfig":"12232"},{"size":106735,"mtime":1786084511193,"results":"13479","hashOfConfig":"12232"},{"size":4108,"mtime":1786084511193,"results":"13480","hashOfConfig":"12232"},{"size":4885,"mtime":1786084511193,"results":"13481","hashOfConfig":"12232"},{"size":605,"mtime":1786084511193,"results":"13482","hashOfConfig":"12232"},{"size":4440,"mtime":1786084511193,"results":"13483","hashOfConfig":"12232"},{"size":4294,"mtime":1786084511193,"results":"13484","hashOfConfig":"12232"},{"size":3021,"mtime":1786084511193,"results":"13485","hashOfConfig":"12232"},{"size":18425,"mtime":1786084511194,"results":"13486","hashOfConfig":"12232"},{"size":4053,"mtime":1786084511194,"results":"13487","hashOfConfig":"12232"},{"size":11462,"mtime":1786084511194,"results":"13488","hashOfConfig":"12232"},{"size":18414,"mtime":1786084511194,"results":"13489","hashOfConfig":"12232"},{"size":6914,"mtime":1786084511194,"results":"13490","hashOfConfig":"12232"},{"size":2291,"mtime":1786084511194,"results":"13491","hashOfConfig":"12232"},{"size":10098,"mtime":1786084511194,"results":"13492","hashOfConfig":"12232"},{"size":9885,"mtime":1786084511195,"results":"13493","hashOfConfig":"12232"},{"size":22779,"mtime":1786084511195,"results":"13494","hashOfConfig":"12232"},{"size":26444,"mtime":1786084511195,"results":"13495","hashOfConfig":"12232"},{"size":19043,"mtime":1786084511195,"results":"13496","hashOfConfig":"12232"},{"size":11061,"mtime":1786084511195,"results":"13497","hashOfConfig":"12232"},{"size":2431,"mtime":1786084511196,"results":"13498","hashOfConfig":"12232"},{"size":5131,"mtime":1786084511196,"results":"13499","hashOfConfig":"12232"},{"size":2930,"mtime":1786084511196,"results":"13500","hashOfConfig":"12232"},{"size":7261,"mtime":1786084511196,"results":"13501","hashOfConfig":"12232"},{"size":3041,"mtime":1786084511196,"results":"13502","hashOfConfig":"12232"},{"size":3269,"mtime":1786084511196,"results":"13503","hashOfConfig":"12232"},{"size":16195,"mtime":1786084511196,"results":"13504","hashOfConfig":"12232"},{"size":4077,"mtime":1786084511196,"results":"13505","hashOfConfig":"12232"},{"size":14084,"mtime":1786084511197,"results":"13506","hashOfConfig":"12232"},{"size":2953,"mtime":1786084511197,"results":"13507","hashOfConfig":"12232"},{"size":5267,"mtime":1786084511197,"results":"13508","hashOfConfig":"12232"},{"size":5416,"mtime":1786084511209,"results":"13509","hashOfConfig":"12232"},{"size":7350,"mtime":1786084511209,"results":"13510","hashOfConfig":"12232"},{"size":8782,"mtime":1786084511209,"results":"13511","hashOfConfig":"12232"},{"size":14971,"mtime":1786084511209,"results":"13512","hashOfConfig":"12232"},{"size":2971,"mtime":1786084511210,"results":"13513","hashOfConfig":"12232"},{"size":2176,"mtime":1786084511210,"results":"13514","hashOfConfig":"12232"},{"size":3118,"mtime":1786084511210,"results":"13515","hashOfConfig":"12232"},{"size":6062,"mtime":1786084511210,"results":"13516","hashOfConfig":"12232"},{"size":21441,"mtime":1786084511210,"results":"13517","hashOfConfig":"12232"},{"size":3531,"mtime":1786084511210,"results":"13518","hashOfConfig":"12232"},{"size":4145,"mtime":1786084511210,"results":"13519","hashOfConfig":"12232"},{"size":1357,"mtime":1786084511210,"results":"13520","hashOfConfig":"12232"},{"size":6519,"mtime":1786084511211,"results":"13521","hashOfConfig":"12232"},{"size":2376,"mtime":1786084511211,"results":"13522","hashOfConfig":"12232"},{"size":3970,"mtime":1786084511211,"results":"13523","hashOfConfig":"12232"},{"size":2292,"mtime":1786084511211,"results":"13524","hashOfConfig":"12232"},{"size":9493,"mtime":1786084511211,"results":"13525","hashOfConfig":"12232"},{"size":1958,"mtime":1786084511211,"results":"13526","hashOfConfig":"12232"},{"size":1782,"mtime":1786084511211,"results":"13527","hashOfConfig":"12232"},{"size":10098,"mtime":1786084511211,"results":"13528","hashOfConfig":"12232"},{"size":3214,"mtime":1786084511211,"results":"13529","hashOfConfig":"12232"},{"size":2571,"mtime":1786084511213,"results":"13530","hashOfConfig":"12232"},{"size":2040,"mtime":1786084511213,"results":"13531","hashOfConfig":"12232"},{"size":718,"mtime":1786084511213,"results":"13532","hashOfConfig":"12232"},{"size":1629,"mtime":1786084511213,"results":"13533","hashOfConfig":"12232"},{"size":3328,"mtime":1786084511213,"results":"13534","hashOfConfig":"12232"},{"size":1297,"mtime":1786084511213,"results":"13535","hashOfConfig":"12232"},{"size":6698,"mtime":1786084511213,"results":"13536","hashOfConfig":"12232"},{"size":3418,"mtime":1786084511214,"results":"13537","hashOfConfig":"12232"},{"size":10036,"mtime":1786084511214,"results":"13538","hashOfConfig":"12232"},{"size":3239,"mtime":1786084511214,"results":"13539","hashOfConfig":"12232"},{"size":2833,"mtime":1786084511214,"results":"13540","hashOfConfig":"12232"},{"size":11572,"mtime":1786084511214,"results":"13541","hashOfConfig":"12232"},{"size":6750,"mtime":1786084511214,"results":"13542","hashOfConfig":"12232"},{"size":8736,"mtime":1786084511214,"results":"13543","hashOfConfig":"12232"},{"size":3082,"mtime":1786084511214,"results":"13544","hashOfConfig":"12232"},{"size":6137,"mtime":1786084511215,"results":"13545","hashOfConfig":"12232"},{"size":2707,"mtime":1786084511215,"results":"13546","hashOfConfig":"12232"},{"size":3494,"mtime":1786084511215,"results":"13547","hashOfConfig":"12232"},{"size":8339,"mtime":1786084511215,"results":"13548","hashOfConfig":"12232"},{"size":3185,"mtime":1786084511215,"results":"13549","hashOfConfig":"12232"},{"size":2697,"mtime":1786084511215,"results":"13550","hashOfConfig":"12232"},{"size":6227,"mtime":1786084511215,"results":"13551","hashOfConfig":"12232"},{"size":3057,"mtime":1786084511215,"results":"13552","hashOfConfig":"12232"},{"size":6142,"mtime":1786084511215,"results":"13553","hashOfConfig":"12232"},{"size":1588,"mtime":1786084511215,"results":"13554","hashOfConfig":"12232"},{"size":11113,"mtime":1786084511216,"results":"13555","hashOfConfig":"12232"},{"size":2782,"mtime":1786084511216,"results":"13556","hashOfConfig":"12232"},{"size":9807,"mtime":1786084511216,"results":"13557","hashOfConfig":"12232"},{"size":10277,"mtime":1786084511216,"results":"13558","hashOfConfig":"12232"},{"size":5142,"mtime":1786084511216,"results":"13559","hashOfConfig":"12232"},{"size":5980,"mtime":1786084511216,"results":"13560","hashOfConfig":"12232"},{"size":4058,"mtime":1786084511216,"results":"13561","hashOfConfig":"12232"},{"size":8032,"mtime":1786084511216,"results":"13562","hashOfConfig":"12232"},{"size":2827,"mtime":1786084511216,"results":"13563","hashOfConfig":"12232"},{"size":1427,"mtime":1786084511217,"results":"13564","hashOfConfig":"12232"},{"size":3963,"mtime":1786084511217,"results":"13565","hashOfConfig":"12232"},{"size":7268,"mtime":1786084511217,"results":"13566","hashOfConfig":"12232"},{"size":3389,"mtime":1786084511217,"results":"13567","hashOfConfig":"12232"},{"size":1835,"mtime":1786084511217,"results":"13568","hashOfConfig":"12232"},{"size":6381,"mtime":1786084511217,"results":"13569","hashOfConfig":"12232"},{"size":2191,"mtime":1786084511217,"results":"13570","hashOfConfig":"12232"},{"size":2042,"mtime":1786084511217,"results":"13571","hashOfConfig":"12232"},{"size":4309,"mtime":1786084511217,"results":"13572","hashOfConfig":"12232"},{"size":2534,"mtime":1786084511217,"results":"13573","hashOfConfig":"12232"},{"size":7046,"mtime":1786084511217,"results":"13574","hashOfConfig":"12232"},{"size":1988,"mtime":1786084511218,"results":"13575","hashOfConfig":"12232"},{"size":5419,"mtime":1786084511218,"results":"13576","hashOfConfig":"12232"},{"size":1349,"mtime":1786084511218,"results":"13577","hashOfConfig":"12232"},{"size":4785,"mtime":1786084511218,"results":"13578","hashOfConfig":"12232"},{"size":1793,"mtime":1786084511218,"results":"13579","hashOfConfig":"12232"},{"size":14760,"mtime":1786084511218,"results":"13580","hashOfConfig":"12232"},{"size":5315,"mtime":1786084511218,"results":"13581","hashOfConfig":"12232"},{"size":1606,"mtime":1786084511218,"results":"13582","hashOfConfig":"12232"},{"size":7974,"mtime":1786084511218,"results":"13583","hashOfConfig":"12232"},{"size":2398,"mtime":1786084511219,"results":"13584","hashOfConfig":"12232"},{"size":5089,"mtime":1786084511219,"results":"13585","hashOfConfig":"12232"},{"size":3895,"mtime":1786084511219,"results":"13586","hashOfConfig":"12232"},{"size":7132,"mtime":1786084511219,"results":"13587","hashOfConfig":"12232"},{"size":1665,"mtime":1786084511219,"results":"13588","hashOfConfig":"12232"},{"size":5341,"mtime":1786084511219,"results":"13589","hashOfConfig":"12232"},{"size":2048,"mtime":1786084511219,"results":"13590","hashOfConfig":"12232"},{"size":1477,"mtime":1786084511219,"results":"13591","hashOfConfig":"12232"},{"size":2411,"mtime":1786084511219,"results":"13592","hashOfConfig":"12232"},{"size":1527,"mtime":1786084511219,"results":"13593","hashOfConfig":"12232"},{"size":4551,"mtime":1786084511219,"results":"13594","hashOfConfig":"12232"},{"size":2462,"mtime":1786084511219,"results":"13595","hashOfConfig":"12232"},{"size":3736,"mtime":1786084511220,"results":"13596","hashOfConfig":"12232"},{"size":2367,"mtime":1786084511220,"results":"13597","hashOfConfig":"12232"},{"size":1597,"mtime":1786084511220,"results":"13598","hashOfConfig":"12232"},{"size":1035,"mtime":1786084511220,"results":"13599","hashOfConfig":"12232"},{"size":966,"mtime":1786084511220,"results":"13600","hashOfConfig":"12232"},{"size":1185,"mtime":1786084511220,"results":"13601","hashOfConfig":"12232"},{"size":1390,"mtime":1786084511220,"results":"13602","hashOfConfig":"12232"},{"size":4194,"mtime":1786084511220,"results":"13603","hashOfConfig":"12232"},{"size":1209,"mtime":1786084511220,"results":"13604","hashOfConfig":"12232"},{"size":1038,"mtime":1786084511220,"results":"13605","hashOfConfig":"12232"},{"size":1300,"mtime":1786084511220,"results":"13606","hashOfConfig":"12232"},{"size":3014,"mtime":1786084511220,"results":"13607","hashOfConfig":"12232"},{"size":2330,"mtime":1786084511221,"results":"13608","hashOfConfig":"12232"},{"size":4002,"mtime":1786084511221,"results":"13609","hashOfConfig":"12232"},{"size":803,"mtime":1786084511221,"results":"13610","hashOfConfig":"12232"},{"size":2732,"mtime":1786084511224,"results":"13611","hashOfConfig":"12232"},{"size":8230,"mtime":1786084511224,"results":"13612","hashOfConfig":"12232"},{"size":1779,"mtime":1786084511224,"results":"13613","hashOfConfig":"12232"},{"size":4234,"mtime":1786084511224,"results":"13614","hashOfConfig":"12232"},{"size":16495,"mtime":1786084511224,"results":"13615","hashOfConfig":"12232"},{"size":6881,"mtime":1786084511225,"results":"13616","hashOfConfig":"12232"},{"size":4087,"mtime":1786084511225,"results":"13617","hashOfConfig":"12232"},{"size":4748,"mtime":1786084511225,"results":"13618","hashOfConfig":"12232"},{"size":22188,"mtime":1786084511225,"results":"13619","hashOfConfig":"12232"},{"size":4228,"mtime":1786084511225,"results":"13620","hashOfConfig":"12232"},{"size":2754,"mtime":1786084511225,"results":"13621","hashOfConfig":"12232"},{"size":2087,"mtime":1786084511225,"results":"13622","hashOfConfig":"12232"},{"size":1208,"mtime":1786084511225,"results":"13623","hashOfConfig":"12232"},{"size":3236,"mtime":1786084511225,"results":"13624","hashOfConfig":"12232"},{"size":2309,"mtime":1786084511226,"results":"13625","hashOfConfig":"12232"},{"size":4431,"mtime":1786084511226,"results":"13626","hashOfConfig":"12232"},{"size":8171,"mtime":1786084511226,"results":"13627","hashOfConfig":"12232"},{"size":9479,"mtime":1786084511226,"results":"13628","hashOfConfig":"12232"},{"size":4752,"mtime":1786084511226,"results":"13629","hashOfConfig":"12232"},{"size":13943,"mtime":1786084511226,"results":"13630","hashOfConfig":"12232"},{"size":6039,"mtime":1786084511226,"results":"13631","hashOfConfig":"12232"},{"size":5480,"mtime":1786084511226,"results":"13632","hashOfConfig":"12232"},{"size":3806,"mtime":1786084511226,"results":"13633","hashOfConfig":"12232"},{"size":3318,"mtime":1786084511227,"results":"13634","hashOfConfig":"12232"},{"size":5066,"mtime":1786084511227,"results":"13635","hashOfConfig":"12232"},{"size":5430,"mtime":1786084511227,"results":"13636","hashOfConfig":"12232"},{"size":2392,"mtime":1786084511227,"results":"13637","hashOfConfig":"12232"},{"size":2382,"mtime":1786084511227,"results":"13638","hashOfConfig":"12232"},{"size":2390,"mtime":1786084511227,"results":"13639","hashOfConfig":"12232"},{"size":1862,"mtime":1786084511227,"results":"13640","hashOfConfig":"12232"},{"size":2793,"mtime":1786084511227,"results":"13641","hashOfConfig":"12232"},{"size":3056,"mtime":1786084511228,"results":"13642","hashOfConfig":"12232"},{"size":418,"mtime":1786084511228,"results":"13643","hashOfConfig":"12232"},{"size":458,"mtime":1786084511228,"results":"13644","hashOfConfig":"12232"},{"size":2737,"mtime":1786084511228,"results":"13645","hashOfConfig":"12232"},{"size":3414,"mtime":1786084511228,"results":"13646","hashOfConfig":"12232"},{"size":974,"mtime":1786084511228,"results":"13647","hashOfConfig":"12232"},{"size":1291,"mtime":1786084511228,"results":"13648","hashOfConfig":"12232"},{"size":5973,"mtime":1786084511228,"results":"13649","hashOfConfig":"12232"},{"size":2110,"mtime":1786084511228,"results":"13650","hashOfConfig":"12232"},{"size":1903,"mtime":1786084511228,"results":"13651","hashOfConfig":"12232"},{"size":1003,"mtime":1786084511229,"results":"13652","hashOfConfig":"12232"},{"size":1493,"mtime":1786084511229,"results":"13653","hashOfConfig":"12232"},{"size":3964,"mtime":1786084511229,"results":"13654","hashOfConfig":"12232"},{"size":5986,"mtime":1786084511229,"results":"13655","hashOfConfig":"12232"},{"size":3275,"mtime":1786084511229,"results":"13656","hashOfConfig":"12232"},{"size":3177,"mtime":1786084511229,"results":"13657","hashOfConfig":"12232"},{"size":4692,"mtime":1786084511229,"results":"13658","hashOfConfig":"12232"},{"size":2758,"mtime":1786084511229,"results":"13659","hashOfConfig":"12232"},{"size":3889,"mtime":1786084511229,"results":"13660","hashOfConfig":"12232"},{"size":3596,"mtime":1786084511229,"results":"13661","hashOfConfig":"12232"},{"size":2108,"mtime":1786084511230,"results":"13662","hashOfConfig":"12232"},{"size":3283,"mtime":1786084511230,"results":"13663","hashOfConfig":"12232"},{"size":1476,"mtime":1786084511230,"results":"13664","hashOfConfig":"12232"},{"size":1610,"mtime":1786084511230,"results":"13665","hashOfConfig":"12232"},{"size":1744,"mtime":1786084511230,"results":"13666","hashOfConfig":"12232"},{"size":1445,"mtime":1786084511230,"results":"13667","hashOfConfig":"12232"},{"size":2237,"mtime":1786084511230,"results":"13668","hashOfConfig":"12232"},{"size":1569,"mtime":1786084511230,"results":"13669","hashOfConfig":"12232"},{"size":2230,"mtime":1786084511230,"results":"13670","hashOfConfig":"12232"},{"size":6449,"mtime":1786084511230,"results":"13671","hashOfConfig":"12232"},{"size":3917,"mtime":1786084511231,"results":"13672","hashOfConfig":"12232"},{"size":1962,"mtime":1786084511231,"results":"13673","hashOfConfig":"12232"},{"size":5734,"mtime":1786084511231,"results":"13674","hashOfConfig":"12232"},{"size":5672,"mtime":1786084511231,"results":"13675","hashOfConfig":"12232"},{"size":14325,"mtime":1786084511231,"results":"13676","hashOfConfig":"12232"},{"size":2766,"mtime":1786084511231,"results":"13677","hashOfConfig":"12232"},{"size":4471,"mtime":1786084511231,"results":"13678","hashOfConfig":"12232"},{"size":1621,"mtime":1786084511231,"results":"13679","hashOfConfig":"12232"},{"size":1208,"mtime":1786084511232,"results":"13680","hashOfConfig":"12232"},{"size":5320,"mtime":1786084511232,"results":"13681","hashOfConfig":"12232"},{"size":15459,"mtime":1786084511232,"results":"13682","hashOfConfig":"12232"},{"size":1311,"mtime":1786084511232,"results":"13683","hashOfConfig":"12232"},{"size":2513,"mtime":1786084511232,"results":"13684","hashOfConfig":"12232"},{"size":4429,"mtime":1786084511232,"results":"13685","hashOfConfig":"12232"},{"size":3725,"mtime":1786084511232,"results":"13686","hashOfConfig":"12232"},{"size":2836,"mtime":1786084511232,"results":"13687","hashOfConfig":"12232"},{"size":4569,"mtime":1786084511233,"results":"13688","hashOfConfig":"12232"},{"size":4112,"mtime":1786084511233,"results":"13689","hashOfConfig":"12232"},{"size":3927,"mtime":1786084511233,"results":"13690","hashOfConfig":"12232"},{"size":5765,"mtime":1786084511233,"results":"13691","hashOfConfig":"12232"},{"size":4778,"mtime":1786084511233,"results":"13692","hashOfConfig":"12232"},{"size":2715,"mtime":1786084511233,"results":"13693","hashOfConfig":"12232"},{"size":4081,"mtime":1786084511233,"results":"13694","hashOfConfig":"12232"},{"size":818,"mtime":1786084511233,"results":"13695","hashOfConfig":"12232"},{"size":1190,"mtime":1786084511233,"results":"13696","hashOfConfig":"12232"},{"size":3030,"mtime":1786084511234,"results":"13697","hashOfConfig":"12232"},{"size":4250,"mtime":1786084511234,"results":"13698","hashOfConfig":"12232"},{"size":4640,"mtime":1786084511234,"results":"13699","hashOfConfig":"12232"},{"size":3252,"mtime":1786084511234,"results":"13700","hashOfConfig":"12232"},{"size":2330,"mtime":1786084511234,"results":"13701","hashOfConfig":"12232"},{"size":1218,"mtime":1786084511234,"results":"13702","hashOfConfig":"12232"},{"size":2279,"mtime":1786084511234,"results":"13703","hashOfConfig":"12232"},{"size":2542,"mtime":1786084511234,"results":"13704","hashOfConfig":"12232"},{"size":5348,"mtime":1786084511234,"results":"13705","hashOfConfig":"12232"},{"size":2459,"mtime":1786084511235,"results":"13706","hashOfConfig":"12232"},{"size":8052,"mtime":1786084511235,"results":"13707","hashOfConfig":"12232"},{"size":2174,"mtime":1786084511235,"results":"13708","hashOfConfig":"12232"},{"size":1420,"mtime":1786084511235,"results":"13709","hashOfConfig":"12232"},{"size":3761,"mtime":1786084511235,"results":"13710","hashOfConfig":"12232"},{"size":4834,"mtime":1786084511235,"results":"13711","hashOfConfig":"12232"},{"size":5988,"mtime":1786084511235,"results":"13712","hashOfConfig":"12232"},{"size":1093,"mtime":1786084511235,"results":"13713","hashOfConfig":"12232"},{"size":1053,"mtime":1786084511235,"results":"13714","hashOfConfig":"12232"},{"size":1402,"mtime":1786084511235,"results":"13715","hashOfConfig":"12232"},{"size":1555,"mtime":1786084511236,"results":"13716","hashOfConfig":"12232"},{"size":1579,"mtime":1786084511236,"results":"13717","hashOfConfig":"12232"},{"size":1497,"mtime":1786084511236,"results":"13718","hashOfConfig":"12232"},{"size":5289,"mtime":1786084511236,"results":"13719","hashOfConfig":"12232"},{"size":10079,"mtime":1786084511236,"results":"13720","hashOfConfig":"12232"},{"size":3893,"mtime":1786084511236,"results":"13721","hashOfConfig":"12232"},{"size":2250,"mtime":1786084511236,"results":"13722","hashOfConfig":"12232"},{"size":3731,"mtime":1786084511237,"results":"13723","hashOfConfig":"12232"},{"size":2453,"mtime":1786084511237,"results":"13724","hashOfConfig":"12232"},{"size":5189,"mtime":1786084511237,"results":"13725","hashOfConfig":"12232"},{"size":8181,"mtime":1786084511237,"results":"13726","hashOfConfig":"12232"},{"size":2922,"mtime":1786084511237,"results":"13727","hashOfConfig":"12232"},{"size":2273,"mtime":1786084511237,"results":"13728","hashOfConfig":"12232"},{"size":2394,"mtime":1786084511237,"results":"13729","hashOfConfig":"12232"},{"size":6004,"mtime":1786084511237,"results":"13730","hashOfConfig":"12232"},{"size":3114,"mtime":1786084511238,"results":"13731","hashOfConfig":"12232"},{"size":3145,"mtime":1786084511238,"results":"13732","hashOfConfig":"12232"},{"size":2444,"mtime":1786084511238,"results":"13733","hashOfConfig":"12232"},{"size":10621,"mtime":1786084511238,"results":"13734","hashOfConfig":"12232"},{"size":7952,"mtime":1786084511238,"results":"13735","hashOfConfig":"12232"},{"size":9048,"mtime":1786084511238,"results":"13736","hashOfConfig":"12232"},{"size":1613,"mtime":1786084511238,"results":"13737","hashOfConfig":"12232"},{"size":5259,"mtime":1786084511238,"results":"13738","hashOfConfig":"12232"},{"size":1833,"mtime":1786084511239,"results":"13739","hashOfConfig":"12232"},{"size":13164,"mtime":1786084511239,"results":"13740","hashOfConfig":"12232"},{"size":9434,"mtime":1786084511239,"results":"13741","hashOfConfig":"12232"},{"size":5009,"mtime":1786084511239,"results":"13742","hashOfConfig":"12232"},{"size":5670,"mtime":1786084511212,"results":"13743","hashOfConfig":"12232"},{"size":6306,"mtime":1786084511212,"results":"13744","hashOfConfig":"12232"},{"size":5233,"mtime":1786084511212,"results":"13745","hashOfConfig":"12232"},{"size":3568,"mtime":1786084511212,"results":"13746","hashOfConfig":"12232"},{"size":4333,"mtime":1786084511212,"results":"13747","hashOfConfig":"12232"},{"size":4499,"mtime":1786084511212,"results":"13748","hashOfConfig":"12232"},{"size":3781,"mtime":1786084511212,"results":"13749","hashOfConfig":"12232"},{"size":2045,"mtime":1786084511212,"results":"13750","hashOfConfig":"12232"},{"size":4259,"mtime":1786084511212,"results":"13751","hashOfConfig":"12232"},{"size":2673,"mtime":1786084511213,"results":"13752","hashOfConfig":"12232"},{"size":1842,"mtime":1786084511213,"results":"13753","hashOfConfig":"12232"},{"size":1137,"mtime":1786084511239,"results":"13754","hashOfConfig":"12232"},{"size":5857,"mtime":1786084511239,"results":"13755","hashOfConfig":"12232"},{"size":8021,"mtime":1786084511240,"results":"13756","hashOfConfig":"12232"},{"size":5635,"mtime":1786084511240,"results":"13757","hashOfConfig":"12232"},{"size":1767,"mtime":1786084511240,"results":"13758","hashOfConfig":"12232"},{"size":3151,"mtime":1786084511240,"results":"13759","hashOfConfig":"12232"},{"size":1197,"mtime":1786084511240,"results":"13760","hashOfConfig":"12232"},{"size":2523,"mtime":1786084511240,"results":"13761","hashOfConfig":"12232"},{"size":2784,"mtime":1786084511241,"results":"13762","hashOfConfig":"12232"},{"size":4964,"mtime":1786084511241,"results":"13763","hashOfConfig":"12232"},{"size":6781,"mtime":1786084511241,"results":"13764","hashOfConfig":"12232"},{"size":6078,"mtime":1786084511241,"results":"13765","hashOfConfig":"12232"},{"size":4725,"mtime":1786084511241,"results":"13766","hashOfConfig":"12232"},{"size":14202,"mtime":1786084511241,"results":"13767","hashOfConfig":"12232"},{"size":12466,"mtime":1786084511242,"results":"13768","hashOfConfig":"12232"},{"size":4411,"mtime":1786084511242,"results":"13769","hashOfConfig":"12232"},{"size":2174,"mtime":1786084511242,"results":"13770","hashOfConfig":"12232"},{"size":3764,"mtime":1786084511242,"results":"13771","hashOfConfig":"12232"},{"size":3886,"mtime":1786084511242,"results":"13772","hashOfConfig":"12232"},{"size":4627,"mtime":1786084511242,"results":"13773","hashOfConfig":"12232"},{"size":3791,"mtime":1786084511242,"results":"13774","hashOfConfig":"12232"},{"size":962,"mtime":1786084511242,"results":"13775","hashOfConfig":"12232"},{"size":6028,"mtime":1786084511243,"results":"13776","hashOfConfig":"12232"},{"size":4587,"mtime":1786084511243,"results":"13777","hashOfConfig":"12232"},{"size":6328,"mtime":1786084511243,"results":"13778","hashOfConfig":"12232"},{"size":5445,"mtime":1786084511243,"results":"13779","hashOfConfig":"12232"},{"size":6243,"mtime":1786084511243,"results":"13780","hashOfConfig":"12232"},{"size":5087,"mtime":1786084511243,"results":"13781","hashOfConfig":"12232"},{"size":5369,"mtime":1786084511243,"results":"13782","hashOfConfig":"12232"},{"size":3124,"mtime":1786084511244,"results":"13783","hashOfConfig":"12232"},{"size":1299,"mtime":1786084511244,"results":"13784","hashOfConfig":"12232"},{"size":3039,"mtime":1786084511244,"results":"13785","hashOfConfig":"12232"},{"size":4744,"mtime":1786084511244,"results":"13786","hashOfConfig":"12232"},{"size":2561,"mtime":1786084511244,"results":"13787","hashOfConfig":"12232"},{"size":1144,"mtime":1786084511244,"results":"13788","hashOfConfig":"12232"},{"size":672,"mtime":1786084511244,"results":"13789","hashOfConfig":"12232"},{"size":1606,"mtime":1786084511244,"results":"13790","hashOfConfig":"12232"},{"size":1690,"mtime":1786084511244,"results":"13791","hashOfConfig":"12232"},{"size":2712,"mtime":1786084511245,"results":"13792","hashOfConfig":"12232"},{"size":734,"mtime":1786084511245,"results":"13793","hashOfConfig":"12232"},{"size":3193,"mtime":1786084511245,"results":"13794","hashOfConfig":"12232"},{"size":11532,"mtime":1786084511245,"results":"13795","hashOfConfig":"12232"},{"size":2641,"mtime":1786084511245,"results":"13796","hashOfConfig":"12232"},{"size":4017,"mtime":1786084511245,"results":"13797","hashOfConfig":"12232"},{"size":2314,"mtime":1786084511245,"results":"13798","hashOfConfig":"12232"},{"size":1505,"mtime":1786084511245,"results":"13799","hashOfConfig":"12232"},{"size":1863,"mtime":1786084511246,"results":"13800","hashOfConfig":"12232"},{"size":1557,"mtime":1786084511246,"results":"13801","hashOfConfig":"12232"},{"size":3967,"mtime":1786084511246,"results":"13802","hashOfConfig":"12232"},{"size":1858,"mtime":1786084511246,"results":"13803","hashOfConfig":"12232"},{"size":3691,"mtime":1786084511246,"results":"13804","hashOfConfig":"12232"},{"size":4432,"mtime":1786084511246,"results":"13805","hashOfConfig":"12232"},{"size":5370,"mtime":1786084511246,"results":"13806","hashOfConfig":"12232"},{"size":3345,"mtime":1786084511246,"results":"13807","hashOfConfig":"12232"},{"size":5801,"mtime":1786084511246,"results":"13808","hashOfConfig":"12232"},{"size":8839,"mtime":1786084511247,"results":"13809","hashOfConfig":"12232"},{"size":2864,"mtime":1786084511247,"results":"13810","hashOfConfig":"12232"},{"size":29693,"mtime":1786084511247,"results":"13811","hashOfConfig":"12232"},{"size":9702,"mtime":1786084511247,"results":"13812","hashOfConfig":"12232"},{"size":5004,"mtime":1786084511247,"results":"13813","hashOfConfig":"12232"},{"size":20395,"mtime":1786084511248,"results":"13814","hashOfConfig":"12232"},{"size":16170,"mtime":1786084511248,"results":"13815","hashOfConfig":"12232"},{"size":8408,"mtime":1786084511248,"results":"13816","hashOfConfig":"12232"},{"size":2427,"mtime":1786084511248,"results":"13817","hashOfConfig":"12232"},{"size":16457,"mtime":1786084511248,"results":"13818","hashOfConfig":"12232"},{"size":2042,"mtime":1786084511248,"results":"13819","hashOfConfig":"12232"},{"size":3553,"mtime":1786084511249,"results":"13820","hashOfConfig":"12232"},{"size":1672,"mtime":1786084511249,"results":"13821","hashOfConfig":"12232"},{"size":12429,"mtime":1786084511249,"results":"13822","hashOfConfig":"12232"},{"size":7378,"mtime":1786084511249,"results":"13823","hashOfConfig":"12232"},{"size":4165,"mtime":1786084511249,"results":"13824","hashOfConfig":"12285"},{"size":2227,"mtime":1786084511249,"results":"13825","hashOfConfig":"12232"},{"size":5518,"mtime":1786084511249,"results":"13826","hashOfConfig":"12232"},{"size":6499,"mtime":1786084511249,"results":"13827","hashOfConfig":"12232"},{"size":19580,"mtime":1786084511250,"results":"13828","hashOfConfig":"12232"},{"size":3057,"mtime":1786084511250,"results":"13829","hashOfConfig":"12232"},{"size":3946,"mtime":1786084511250,"results":"13830","hashOfConfig":"12232"},{"size":1282,"mtime":1786084511250,"results":"13831","hashOfConfig":"12232"},{"size":1161,"mtime":1786084511250,"results":"13832","hashOfConfig":"12232"},{"size":817,"mtime":1786084511250,"results":"13833","hashOfConfig":"12232"},{"size":1401,"mtime":1786084511250,"results":"13834","hashOfConfig":"12232"},{"size":5165,"mtime":1786084511251,"results":"13835","hashOfConfig":"12232"},{"size":13553,"mtime":1786084511251,"results":"13836","hashOfConfig":"8189"},{"size":6096,"mtime":1786084511251,"results":"13837","hashOfConfig":"8189"},{"size":18849,"mtime":1786084511252,"results":"13838","hashOfConfig":"8189"},{"size":4033,"mtime":1786084511252,"results":"13839","hashOfConfig":"8189"},{"size":12037,"mtime":1786084511252,"results":"13840","hashOfConfig":"8189"},{"size":15020,"mtime":1786084511252,"results":"13841","hashOfConfig":"8189"},{"size":9008,"mtime":1786084511252,"results":"13842","hashOfConfig":"8189"},{"size":17637,"mtime":1786084511253,"results":"13843","hashOfConfig":"8189"},{"size":15511,"mtime":1786084511253,"results":"13844","hashOfConfig":"8189"},{"size":1150,"mtime":1786084511253,"results":"13845","hashOfConfig":"12232"},{"size":2543,"mtime":1786084511253,"results":"13846","hashOfConfig":"12232"},{"size":2959,"mtime":1786084511253,"results":"13847","hashOfConfig":"12232"},{"size":2575,"mtime":1786084511253,"results":"13848","hashOfConfig":"12232"},{"size":9749,"mtime":1786084511253,"results":"13849","hashOfConfig":"12232"},{"size":1123,"mtime":1786084511254,"results":"13850","hashOfConfig":"12232"},{"size":1392,"mtime":1786084511254,"results":"13851","hashOfConfig":"12232"},{"size":6541,"mtime":1786084511254,"results":"13852","hashOfConfig":"12232"},{"size":2443,"mtime":1786084511254,"results":"13853","hashOfConfig":"12232"},{"size":577,"mtime":1786084511254,"results":"13854","hashOfConfig":"12232"},{"size":6743,"mtime":1786084511254,"results":"13855","hashOfConfig":"12232"},{"size":3433,"mtime":1786084511254,"results":"13856","hashOfConfig":"12232"},{"size":8004,"mtime":1786084511250,"results":"13857","hashOfConfig":"12232"},{"size":4568,"mtime":1786084511251,"results":"13858","hashOfConfig":"12232"},{"size":2376,"mtime":1786084511251,"results":"13859","hashOfConfig":"12232"},{"size":7659,"mtime":1786084511255,"results":"13860","hashOfConfig":"12232"},{"size":5620,"mtime":1786084511255,"results":"13861","hashOfConfig":"12232"},{"size":5102,"mtime":1786084511255,"results":"13862","hashOfConfig":"12232"},{"size":4087,"mtime":1786084511255,"results":"13863","hashOfConfig":"12232"},{"size":13009,"mtime":1786084511255,"results":"13864","hashOfConfig":"12232"},{"size":11255,"mtime":1786084511271,"results":"13865","hashOfConfig":"12232"},{"size":2108,"mtime":1786084511271,"results":"13866","hashOfConfig":"12232"},{"size":3771,"mtime":1786084511271,"results":"13867","hashOfConfig":"12232"},{"size":7951,"mtime":1786084511271,"results":"13868","hashOfConfig":"12232"},{"size":4751,"mtime":1786084511271,"results":"13869","hashOfConfig":"12232"},{"size":1920,"mtime":1786084511271,"results":"13870","hashOfConfig":"12285"},{"size":5310,"mtime":1786084511271,"results":"13871","hashOfConfig":"12232"},{"size":2590,"mtime":1786084511271,"results":"13872","hashOfConfig":"12232"},{"size":1046,"mtime":1786084511271,"results":"13873","hashOfConfig":"12285"},{"size":1080,"mtime":1786084511271,"results":"13874","hashOfConfig":"12285"},{"size":4814,"mtime":1786084511272,"results":"13875","hashOfConfig":"12232"},{"size":5711,"mtime":1786084511272,"results":"13876","hashOfConfig":"12232"},{"size":5337,"mtime":1786084511272,"results":"13877","hashOfConfig":"12232"},{"size":6159,"mtime":1786084511272,"results":"13878","hashOfConfig":"12232"},{"size":1726,"mtime":1786084511272,"results":"13879","hashOfConfig":"12232"},{"size":7021,"mtime":1786084511272,"results":"13880","hashOfConfig":"12232"},{"size":2221,"mtime":1786084511272,"results":"13881","hashOfConfig":"12232"},{"size":7761,"mtime":1786084511272,"results":"13882","hashOfConfig":"12232"},{"size":2124,"mtime":1786084511273,"results":"13883","hashOfConfig":"12232"},{"size":2871,"mtime":1786084511255,"results":"13884","hashOfConfig":"12232"},{"size":2835,"mtime":1786084511255,"results":"13885","hashOfConfig":"12232"},{"size":1716,"mtime":1786084511256,"results":"13886","hashOfConfig":"12285"},{"size":16180,"mtime":1786084511256,"results":"13887","hashOfConfig":"12232"},{"size":3899,"mtime":1786084511256,"results":"13888","hashOfConfig":"12232"},{"size":6921,"mtime":1786084511256,"results":"13889","hashOfConfig":"12232"},{"size":4265,"mtime":1786084511256,"results":"13890","hashOfConfig":"12232"},{"size":4103,"mtime":1786084511256,"results":"13891","hashOfConfig":"12232"},{"size":3497,"mtime":1786084511256,"results":"13892","hashOfConfig":"12232"},{"size":3346,"mtime":1786084511256,"results":"13893","hashOfConfig":"12232"},{"size":24757,"mtime":1786084511257,"results":"13894","hashOfConfig":"12232"},{"size":3591,"mtime":1786084511257,"results":"13895","hashOfConfig":"12232"},{"size":12517,"mtime":1786084511257,"results":"13896","hashOfConfig":"12232"},{"size":9525,"mtime":1786084511257,"results":"13897","hashOfConfig":"12232"},{"size":11415,"mtime":1786084511257,"results":"13898","hashOfConfig":"12232"},{"size":3080,"mtime":1786084511258,"results":"13899","hashOfConfig":"12232"},{"size":4164,"mtime":1786084511258,"results":"13900","hashOfConfig":"12232"},{"size":2007,"mtime":1786084511258,"results":"13901","hashOfConfig":"12232"},{"size":2133,"mtime":1786084511258,"results":"13902","hashOfConfig":"12232"},{"size":7068,"mtime":1786084511258,"results":"13903","hashOfConfig":"12232"},{"size":2244,"mtime":1786084511258,"results":"13904","hashOfConfig":"12232"},{"size":1783,"mtime":1786084511258,"results":"13905","hashOfConfig":"12232"},{"size":2306,"mtime":1786084511258,"results":"13906","hashOfConfig":"12232"},{"size":6799,"mtime":1786084511258,"results":"13907","hashOfConfig":"12232"},{"size":26609,"mtime":1786084511259,"results":"13908","hashOfConfig":"12232"},{"size":3510,"mtime":1786084511259,"results":"13909","hashOfConfig":"12232"},{"size":3053,"mtime":1786084511259,"results":"13910","hashOfConfig":"12232"},{"size":852,"mtime":1786084511259,"results":"13911","hashOfConfig":"12232"},{"size":12959,"mtime":1786084511259,"results":"13912","hashOfConfig":"12232"},{"size":2239,"mtime":1786084511260,"results":"13913","hashOfConfig":"12232"},{"size":8002,"mtime":1786084511260,"results":"13914","hashOfConfig":"12232"},{"size":12593,"mtime":1786084511260,"results":"13915","hashOfConfig":"12232"},{"size":2577,"mtime":1786084511260,"results":"13916","hashOfConfig":"12232"},{"size":1952,"mtime":1786084511260,"results":"13917","hashOfConfig":"12232"},{"size":5273,"mtime":1786084511261,"results":"13918","hashOfConfig":"12232"},{"size":2989,"mtime":1786084511261,"results":"13919","hashOfConfig":"12232"},{"size":13589,"mtime":1786084511261,"results":"13920","hashOfConfig":"12232"},{"size":3917,"mtime":1786084511261,"results":"13921","hashOfConfig":"12232"},{"size":1708,"mtime":1786084511261,"results":"13922","hashOfConfig":"12232"},{"size":1495,"mtime":1786084511262,"results":"13923","hashOfConfig":"12232"},{"size":3387,"mtime":1786084511262,"results":"13924","hashOfConfig":"12232"},{"size":4123,"mtime":1786084511262,"results":"13925","hashOfConfig":"12232"},{"size":6386,"mtime":1786084511262,"results":"13926","hashOfConfig":"12232"},{"size":12577,"mtime":1786084511262,"results":"13927","hashOfConfig":"12232"},{"size":2327,"mtime":1786084511263,"results":"13928","hashOfConfig":"12232"},{"size":17135,"mtime":1786084511263,"results":"13929","hashOfConfig":"12232"},{"size":11209,"mtime":1786084511263,"results":"13930","hashOfConfig":"12232"},{"size":47245,"mtime":1786084511264,"results":"13931","hashOfConfig":"12232"},{"size":2772,"mtime":1786084511264,"results":"13932","hashOfConfig":"12232"},{"size":4445,"mtime":1786084511264,"results":"13933","hashOfConfig":"12232"},{"size":3403,"mtime":1786084511264,"results":"13934","hashOfConfig":"12232"},{"size":3805,"mtime":1786084511264,"results":"13935","hashOfConfig":"12232"},{"size":10649,"mtime":1786084511264,"results":"13936","hashOfConfig":"12232"},{"size":4922,"mtime":1786084511264,"results":"13937","hashOfConfig":"12232"},{"size":4693,"mtime":1786084511264,"results":"13938","hashOfConfig":"12232"},{"size":13103,"mtime":1786084511265,"results":"13939","hashOfConfig":"12232"},{"size":4454,"mtime":1786084511265,"results":"13940","hashOfConfig":"12232"},{"size":5437,"mtime":1786084511265,"results":"13941","hashOfConfig":"12232"},{"size":3439,"mtime":1786084511265,"results":"13942","hashOfConfig":"12232"},{"size":6824,"mtime":1786084511265,"results":"13943","hashOfConfig":"12232"},{"size":4038,"mtime":1786084511265,"results":"13944","hashOfConfig":"12232"},{"size":4083,"mtime":1786084511265,"results":"13945","hashOfConfig":"12232"},{"size":5600,"mtime":1786084511265,"results":"13946","hashOfConfig":"12232"},{"size":17963,"mtime":1786084511266,"results":"13947","hashOfConfig":"12232"},{"size":6608,"mtime":1786084511266,"results":"13948","hashOfConfig":"12232"},{"size":11090,"mtime":1786084511266,"results":"13949","hashOfConfig":"12232"},{"size":1291,"mtime":1786084511266,"results":"13950","hashOfConfig":"12232"},{"size":5985,"mtime":1786084511266,"results":"13951","hashOfConfig":"12232"},{"size":7177,"mtime":1786084511266,"results":"13952","hashOfConfig":"12232"},{"size":6303,"mtime":1786084511267,"results":"13953","hashOfConfig":"12232"},{"size":11192,"mtime":1786084511267,"results":"13954","hashOfConfig":"12232"},{"size":3783,"mtime":1786084511267,"results":"13955","hashOfConfig":"12232"},{"size":9653,"mtime":1786084511267,"results":"13956","hashOfConfig":"12232"},{"size":2881,"mtime":1786084511267,"results":"13957","hashOfConfig":"12232"},{"size":3311,"mtime":1786084511267,"results":"13958","hashOfConfig":"12232"},{"size":11944,"mtime":1786084511267,"results":"13959","hashOfConfig":"12232"},{"size":2269,"mtime":1786084511268,"results":"13960","hashOfConfig":"12232"},{"size":4316,"mtime":1786084511268,"results":"13961","hashOfConfig":"12232"},{"size":2077,"mtime":1786084511268,"results":"13962","hashOfConfig":"12232"},{"size":2667,"mtime":1786084511268,"results":"13963","hashOfConfig":"12232"},{"size":28429,"mtime":1786084511268,"results":"13964","hashOfConfig":"12232"},{"size":6440,"mtime":1786084511268,"results":"13965","hashOfConfig":"12232"},{"size":2795,"mtime":1786084511269,"results":"13966","hashOfConfig":"12232"},{"size":5008,"mtime":1786084511269,"results":"13967","hashOfConfig":"12232"},{"size":9118,"mtime":1786084511269,"results":"13968","hashOfConfig":"12232"},{"size":1587,"mtime":1786084511269,"results":"13969","hashOfConfig":"12232"},{"size":2619,"mtime":1786084511269,"results":"13970","hashOfConfig":"12232"},{"size":5082,"mtime":1786084511269,"results":"13971","hashOfConfig":"12232"},{"size":14955,"mtime":1786084511270,"results":"13972","hashOfConfig":"12232"},{"size":24451,"mtime":1786084511270,"results":"13973","hashOfConfig":"12232"},{"size":7393,"mtime":1786084511270,"results":"13974","hashOfConfig":"12232"},{"size":16198,"mtime":1786084511270,"results":"13975","hashOfConfig":"12232"},{"size":2962,"mtime":1786084511270,"results":"13976","hashOfConfig":"12232"},{"size":9594,"mtime":1786084511273,"results":"13977","hashOfConfig":"12232"},{"size":3685,"mtime":1786084511273,"results":"13978","hashOfConfig":"12232"},{"size":902,"mtime":1786084511273,"results":"13979","hashOfConfig":"12232"},{"size":9574,"mtime":1786084511273,"results":"13980","hashOfConfig":"12232"},{"size":4870,"mtime":1786084511273,"results":"13981","hashOfConfig":"12232"},{"size":1582,"mtime":1786084511273,"results":"13982","hashOfConfig":"12232"},{"size":2801,"mtime":1786084511273,"results":"13983","hashOfConfig":"12232"},{"size":6880,"mtime":1786084511274,"results":"13984","hashOfConfig":"12232"},{"size":2524,"mtime":1786084511274,"results":"13985","hashOfConfig":"12232"},{"size":7867,"mtime":1786084511274,"results":"13986","hashOfConfig":"12232"},{"size":6832,"mtime":1786084511274,"results":"13987","hashOfConfig":"12232"},{"size":5949,"mtime":1786084511274,"results":"13988","hashOfConfig":"12232"},{"size":10845,"mtime":1786084511274,"results":"13989","hashOfConfig":"12232"},{"size":38974,"mtime":1786084511275,"results":"13990","hashOfConfig":"12232"},{"size":9584,"mtime":1786084511275,"results":"13991","hashOfConfig":"12232"},{"size":1470,"mtime":1786084511275,"results":"13992","hashOfConfig":"12232"},{"size":3944,"mtime":1786084511275,"results":"13993","hashOfConfig":"12232"},{"size":4441,"mtime":1786084511275,"results":"13994","hashOfConfig":"12232"},{"size":1676,"mtime":1786084511275,"results":"13995","hashOfConfig":"12232"},{"size":14295,"mtime":1786084511276,"results":"13996","hashOfConfig":"12232"},{"size":2569,"mtime":1786084511276,"results":"13997","hashOfConfig":"12232"},{"size":3622,"mtime":1786084511276,"results":"13998","hashOfConfig":"12232"},{"size":328,"mtime":1786084511276,"results":"13999","hashOfConfig":"12232"},{"size":1564,"mtime":1786084511276,"results":"14000","hashOfConfig":"12232"},{"size":7827,"mtime":1786084511276,"results":"14001","hashOfConfig":"12232"},{"size":13552,"mtime":1786084511276,"results":"14002","hashOfConfig":"12232"},{"size":7615,"mtime":1786084511277,"results":"14003","hashOfConfig":"12232"},{"size":1285,"mtime":1786084511277,"results":"14004","hashOfConfig":"12232"},{"size":2874,"mtime":1786084511277,"results":"14005","hashOfConfig":"12232"},{"size":5970,"mtime":1786084511277,"results":"14006","hashOfConfig":"12232"},{"size":2759,"mtime":1786084511277,"results":"14007","hashOfConfig":"12232"},{"size":12438,"mtime":1786084511277,"results":"14008","hashOfConfig":"12232"},{"size":2047,"mtime":1786084511277,"results":"14009","hashOfConfig":"12232"},{"size":3999,"mtime":1786084511277,"results":"14010","hashOfConfig":"12232"},{"size":3204,"mtime":1786084511278,"results":"14011","hashOfConfig":"12232"},{"size":8564,"mtime":1786084511278,"results":"14012","hashOfConfig":"12232"},{"size":11662,"mtime":1786084511278,"results":"14013","hashOfConfig":"12232"},{"size":2436,"mtime":1786084511278,"results":"14014","hashOfConfig":"12232"},{"size":1881,"mtime":1786084511278,"results":"14015","hashOfConfig":"12232"},{"size":3213,"mtime":1786084511279,"results":"14016","hashOfConfig":"12232"},{"size":622,"mtime":1786084511279,"results":"14017","hashOfConfig":"12232"},{"size":6852,"mtime":1786084511279,"results":"14018","hashOfConfig":"12232"},{"size":2110,"mtime":1786084511279,"results":"14019","hashOfConfig":"12232"},{"size":4195,"mtime":1786084511279,"results":"14020","hashOfConfig":"12232"},{"size":3877,"mtime":1786084511280,"results":"14021","hashOfConfig":"12232"},{"size":5803,"mtime":1786084511280,"results":"14022","hashOfConfig":"12232"},{"size":3440,"mtime":1786084511280,"results":"14023","hashOfConfig":"12232"},{"size":15602,"mtime":1786084511280,"results":"14024","hashOfConfig":"12232"},{"size":9771,"mtime":1786084511281,"results":"14025","hashOfConfig":"12232"},{"size":7153,"mtime":1786084511281,"results":"14026","hashOfConfig":"12232"},{"size":3079,"mtime":1786084511281,"results":"14027","hashOfConfig":"12232"},{"size":4331,"mtime":1786084511281,"results":"14028","hashOfConfig":"12232"},{"size":11474,"mtime":1786084511281,"results":"14029","hashOfConfig":"12232"},{"size":4575,"mtime":1786084511281,"results":"14030","hashOfConfig":"12232"},{"size":1661,"mtime":1786084511281,"results":"14031","hashOfConfig":"12232"},{"size":3959,"mtime":1786084511281,"results":"14032","hashOfConfig":"12232"},{"size":3327,"mtime":1786084511282,"results":"14033","hashOfConfig":"12232"},{"size":8224,"mtime":1786084511282,"results":"14034","hashOfConfig":"12232"},{"size":2798,"mtime":1786084511282,"results":"14035","hashOfConfig":"12232"},{"size":15450,"mtime":1786084511282,"results":"14036","hashOfConfig":"12232"},{"size":6177,"mtime":1786084511282,"results":"14037","hashOfConfig":"12232"},{"size":13086,"mtime":1786084511283,"results":"14038","hashOfConfig":"12232"},{"size":7516,"mtime":1786084511283,"results":"14039","hashOfConfig":"12232"},{"size":18563,"mtime":1786084511283,"results":"14040","hashOfConfig":"12232"},{"size":1319,"mtime":1786084511283,"results":"14041","hashOfConfig":"12232"},{"size":10171,"mtime":1786084511283,"results":"14042","hashOfConfig":"12232"},{"size":4035,"mtime":1786084511283,"results":"14043","hashOfConfig":"12232"},{"size":1045,"mtime":1786084511284,"results":"14044","hashOfConfig":"12232"},{"size":5817,"mtime":1786084511284,"results":"14045","hashOfConfig":"12232"},{"size":10166,"mtime":1786084511284,"results":"14046","hashOfConfig":"12232"},{"size":2722,"mtime":1786084511284,"results":"14047","hashOfConfig":"12232"},{"size":2892,"mtime":1786084511284,"results":"14048","hashOfConfig":"12232"},{"size":1585,"mtime":1786084511284,"results":"14049","hashOfConfig":"12232"},{"size":4459,"mtime":1786084511284,"results":"14050","hashOfConfig":"12232"},{"size":4047,"mtime":1786084511284,"results":"14051","hashOfConfig":"12232"},{"size":5338,"mtime":1786084511285,"results":"14052","hashOfConfig":"12232"},{"size":5031,"mtime":1786084511285,"results":"14053","hashOfConfig":"12232"},{"size":4692,"mtime":1786084511285,"results":"14054","hashOfConfig":"12232"},{"size":3485,"mtime":1786084511285,"results":"14055","hashOfConfig":"12232"},{"size":2728,"mtime":1786084511285,"results":"14056","hashOfConfig":"12232"},{"size":3540,"mtime":1786084511285,"results":"14057","hashOfConfig":"12232"},{"size":5565,"mtime":1786084511285,"results":"14058","hashOfConfig":"12232"},{"size":8759,"mtime":1786084511286,"results":"14059","hashOfConfig":"12232"},{"size":4449,"mtime":1786084511286,"results":"14060","hashOfConfig":"12232"},{"size":11009,"mtime":1786084511286,"results":"14061","hashOfConfig":"12232"},{"size":3621,"mtime":1786084511286,"results":"14062","hashOfConfig":"12232"},{"size":4278,"mtime":1786084511287,"results":"14063","hashOfConfig":"12232"},{"size":5177,"mtime":1786084511287,"results":"14064","hashOfConfig":"12232"},{"size":3834,"mtime":1786084511287,"results":"14065","hashOfConfig":"12232"},{"size":3388,"mtime":1786084511287,"results":"14066","hashOfConfig":"12232"},{"size":3107,"mtime":1786084511287,"results":"14067","hashOfConfig":"12232"},{"size":3428,"mtime":1786084511287,"results":"14068","hashOfConfig":"12232"},{"size":7200,"mtime":1786084511287,"results":"14069","hashOfConfig":"12232"},{"size":7026,"mtime":1786084511287,"results":"14070","hashOfConfig":"12232"},{"size":1340,"mtime":1786084511288,"results":"14071","hashOfConfig":"12232"},{"size":12505,"mtime":1786084511288,"results":"14072","hashOfConfig":"12232"},{"size":4436,"mtime":1786084511288,"results":"14073","hashOfConfig":"12232"},{"size":7693,"mtime":1786084511288,"results":"14074","hashOfConfig":"12232"},{"size":2359,"mtime":1786084511288,"results":"14075","hashOfConfig":"12232"},{"size":405,"mtime":1786084511288,"results":"14076","hashOfConfig":"12232"},{"size":11574,"mtime":1786084511289,"results":"14077","hashOfConfig":"12232"},{"size":6745,"mtime":1786084511289,"results":"14078","hashOfConfig":"12232"},{"size":2316,"mtime":1786084511289,"results":"14079","hashOfConfig":"12232"},{"size":20396,"mtime":1786084511289,"results":"14080","hashOfConfig":"12232"},{"size":1620,"mtime":1786084511289,"results":"14081","hashOfConfig":"12232"},{"size":1642,"mtime":1786084511289,"results":"14082","hashOfConfig":"12232"},{"size":1860,"mtime":1786084511290,"results":"14083","hashOfConfig":"12232"},{"size":2590,"mtime":1786084511290,"results":"14084","hashOfConfig":"12232"},{"size":7002,"mtime":1786084511290,"results":"14085","hashOfConfig":"12232"},{"size":3385,"mtime":1786084511290,"results":"14086","hashOfConfig":"12232"},{"size":6838,"mtime":1786084511290,"results":"14087","hashOfConfig":"12232"},{"size":7168,"mtime":1786084511290,"results":"14088","hashOfConfig":"12232"},{"size":1773,"mtime":1786084511290,"results":"14089","hashOfConfig":"12232"},{"size":3206,"mtime":1786084511290,"results":"14090","hashOfConfig":"12232"},{"size":2012,"mtime":1786084511290,"results":"14091","hashOfConfig":"12232"},{"size":8347,"mtime":1786084511291,"results":"14092","hashOfConfig":"12232"},{"size":1979,"mtime":1786084511291,"results":"14093","hashOfConfig":"12232"},{"size":5782,"mtime":1786084511291,"results":"14094","hashOfConfig":"12232"},{"size":11544,"mtime":1786084511291,"results":"14095","hashOfConfig":"12232"},{"size":1019,"mtime":1786084511291,"results":"14096","hashOfConfig":"12232"},{"size":36065,"mtime":1786084511292,"results":"14097","hashOfConfig":"12232"},{"size":3060,"mtime":1786084511292,"results":"14098","hashOfConfig":"12232"},{"size":5918,"mtime":1786084511292,"results":"14099","hashOfConfig":"12232"},{"size":12901,"mtime":1786084511292,"results":"14100","hashOfConfig":"12232"},{"size":7534,"mtime":1786084511292,"results":"14101","hashOfConfig":"12232"},{"size":5402,"mtime":1786084511292,"results":"14102","hashOfConfig":"12232"},{"size":3492,"mtime":1786084511292,"results":"14103","hashOfConfig":"12232"},{"size":5403,"mtime":1786084511293,"results":"14104","hashOfConfig":"12232"},{"size":43260,"mtime":1786084511293,"results":"14105","hashOfConfig":"12232"},{"size":1878,"mtime":1786084511293,"results":"14106","hashOfConfig":"12232"},{"size":1468,"mtime":1786084511293,"results":"14107","hashOfConfig":"12232"},{"size":6684,"mtime":1786084511293,"results":"14108","hashOfConfig":"12232"},{"size":2598,"mtime":1786084511294,"results":"14109","hashOfConfig":"12232"},{"size":54446,"mtime":1786084511294,"results":"14110","hashOfConfig":"12232"},{"size":2632,"mtime":1786084511294,"results":"14111","hashOfConfig":"12232"},{"size":3814,"mtime":1786084511295,"results":"14112","hashOfConfig":"12232"},{"size":23783,"mtime":1786084511295,"results":"14113","hashOfConfig":"12232"},{"size":5738,"mtime":1786084511295,"results":"14114","hashOfConfig":"12232"},{"size":785,"mtime":1786084511295,"results":"14115","hashOfConfig":"12232"},{"size":8202,"mtime":1786084511295,"results":"14116","hashOfConfig":"12232"},{"size":4928,"mtime":1786084511296,"results":"14117","hashOfConfig":"12232"},{"size":4735,"mtime":1786084511296,"results":"14118","hashOfConfig":"12232"},{"size":20007,"mtime":1786084511296,"results":"14119","hashOfConfig":"12232"},{"size":8762,"mtime":1786084511297,"results":"14120","hashOfConfig":"12232"},{"size":9639,"mtime":1786084511297,"results":"14121","hashOfConfig":"12232"},{"size":4060,"mtime":1786084511297,"results":"14122","hashOfConfig":"12232"},{"size":12413,"mtime":1786084511297,"results":"14123","hashOfConfig":"12232"},{"size":2726,"mtime":1786084511297,"results":"14124","hashOfConfig":"12232"},{"size":7694,"mtime":1786084511297,"results":"14125","hashOfConfig":"12232"},{"size":9001,"mtime":1786084511298,"results":"14126","hashOfConfig":"12232"},{"size":8906,"mtime":1786084511298,"results":"14127","hashOfConfig":"12232"},{"size":24121,"mtime":1786084511298,"results":"14128","hashOfConfig":"12232"},{"size":4702,"mtime":1786084511298,"results":"14129","hashOfConfig":"12232"},{"size":17335,"mtime":1786084511298,"results":"14130","hashOfConfig":"12232"},{"size":26263,"mtime":1786084511299,"results":"14131","hashOfConfig":"12232"},{"size":1215,"mtime":1786084511299,"results":"14132","hashOfConfig":"12232"},{"size":1136,"mtime":1786084511299,"results":"14133","hashOfConfig":"12232"},{"size":3795,"mtime":1786084511299,"results":"14134","hashOfConfig":"12232"},{"size":24550,"mtime":1786084511299,"results":"14135","hashOfConfig":"12232"},{"size":2741,"mtime":1786084511299,"results":"14136","hashOfConfig":"12232"},{"size":15113,"mtime":1786084511300,"results":"14137","hashOfConfig":"12232"},{"size":3057,"mtime":1786084511300,"results":"14138","hashOfConfig":"12232"},{"size":7815,"mtime":1786084511300,"results":"14139","hashOfConfig":"12232"},{"size":833,"mtime":1786084511300,"results":"14140","hashOfConfig":"12232"},{"size":880,"mtime":1786084511300,"results":"14141","hashOfConfig":"12232"},{"size":8575,"mtime":1786084511300,"results":"14142","hashOfConfig":"12232"},{"size":8516,"mtime":1786084511300,"results":"14143","hashOfConfig":"12232"},{"size":4918,"mtime":1786084511300,"results":"14144","hashOfConfig":"12232"},{"size":7932,"mtime":1786084511301,"results":"14145","hashOfConfig":"12232"},{"size":9492,"mtime":1786084511301,"results":"14146","hashOfConfig":"12232"},{"size":1380,"mtime":1786084511301,"results":"14147","hashOfConfig":"12232"},{"size":1656,"mtime":1786084511301,"results":"14148","hashOfConfig":"12232"},{"size":1754,"mtime":1786084511301,"results":"14149","hashOfConfig":"12232"},{"size":19056,"mtime":1786084511301,"results":"14150","hashOfConfig":"12232"},{"size":1880,"mtime":1786084511302,"results":"14151","hashOfConfig":"12285"},{"size":4761,"mtime":1786084511302,"results":"14152","hashOfConfig":"12285"},{"size":4350,"mtime":1786084511302,"results":"14153","hashOfConfig":"12285"},{"size":2012,"mtime":1786084511302,"results":"14154","hashOfConfig":"12285"},{"size":4458,"mtime":1786084511302,"results":"14155","hashOfConfig":"12285"},{"size":3797,"mtime":1786084511302,"results":"14156","hashOfConfig":"12285"},{"size":2846,"mtime":1786084511302,"results":"14157","hashOfConfig":"12285"},{"size":2831,"mtime":1786084511302,"results":"14158","hashOfConfig":"12232"},{"size":12231,"mtime":1786084511302,"results":"14159","hashOfConfig":"12232"},{"size":1911,"mtime":1786084511303,"results":"14160","hashOfConfig":"12232"},{"size":3478,"mtime":1786084511303,"results":"14161","hashOfConfig":"12232"},{"size":5745,"mtime":1786084511303,"results":"14162","hashOfConfig":"12232"},{"size":5462,"mtime":1786084511303,"results":"14163","hashOfConfig":"12232"},{"size":4673,"mtime":1786084511303,"results":"14164","hashOfConfig":"12232"},{"size":3259,"mtime":1786084511303,"results":"14165","hashOfConfig":"12232"},{"size":7319,"mtime":1786084511303,"results":"14166","hashOfConfig":"12232"},{"size":6014,"mtime":1786084511303,"results":"14167","hashOfConfig":"12232"},{"size":10368,"mtime":1786084511304,"results":"14168","hashOfConfig":"12232"},{"size":5558,"mtime":1786084511304,"results":"14169","hashOfConfig":"12232"},{"size":3091,"mtime":1786084511304,"results":"14170","hashOfConfig":"12232"},{"size":3457,"mtime":1786084511304,"results":"14171","hashOfConfig":"12232"},{"size":4009,"mtime":1786084511304,"results":"14172","hashOfConfig":"12232"},{"size":3610,"mtime":1786084511304,"results":"14173","hashOfConfig":"12232"},{"size":2662,"mtime":1786084511304,"results":"14174","hashOfConfig":"12232"},{"size":3854,"mtime":1786084511304,"results":"14175","hashOfConfig":"12232"},{"size":4432,"mtime":1786084511305,"results":"14176","hashOfConfig":"12232"},{"size":5301,"mtime":1786084511305,"results":"14177","hashOfConfig":"12232"},{"size":20711,"mtime":1786084511305,"results":"14178","hashOfConfig":"12232"},{"size":3120,"mtime":1786084511305,"results":"14179","hashOfConfig":"12232"},{"size":2097,"mtime":1786084511305,"results":"14180","hashOfConfig":"12232"},{"size":1523,"mtime":1786084511305,"results":"14181","hashOfConfig":"12232"},{"size":1160,"mtime":1786084511305,"results":"14182","hashOfConfig":"12232"},{"size":1327,"mtime":1786084511305,"results":"14183","hashOfConfig":"12232"},{"size":3726,"mtime":1786084511305,"results":"14184","hashOfConfig":"12232"},{"size":4211,"mtime":1786084511306,"results":"14185","hashOfConfig":"12232"},{"size":5112,"mtime":1786084511306,"results":"14186","hashOfConfig":"12232"},{"size":700,"mtime":1786084511306,"results":"14187","hashOfConfig":"12232"},{"size":4887,"mtime":1786084511306,"results":"14188","hashOfConfig":"12232"},{"size":2802,"mtime":1786084511306,"results":"14189","hashOfConfig":"12232"},{"size":10249,"mtime":1786084511306,"results":"14190","hashOfConfig":"12232"},{"size":7571,"mtime":1786084511306,"results":"14191","hashOfConfig":"12232"},{"size":3517,"mtime":1786084511307,"results":"14192","hashOfConfig":"12232"},{"size":7877,"mtime":1786084511307,"results":"14193","hashOfConfig":"12232"},{"size":10341,"mtime":1786084511307,"results":"14194","hashOfConfig":"12232"},{"size":4730,"mtime":1786084511307,"results":"14195","hashOfConfig":"12232"},{"size":1765,"mtime":1786084511307,"results":"14196","hashOfConfig":"12232"},{"size":1753,"mtime":1786084511307,"results":"14197","hashOfConfig":"12232"},{"size":1705,"mtime":1786084511307,"results":"14198","hashOfConfig":"12232"},{"size":3364,"mtime":1786084511307,"results":"14199","hashOfConfig":"12232"},{"size":1558,"mtime":1786084511308,"results":"14200","hashOfConfig":"12232"},{"size":6245,"mtime":1786084511308,"results":"14201","hashOfConfig":"12232"},{"size":3966,"mtime":1786084511308,"results":"14202","hashOfConfig":"12232"},{"size":5408,"mtime":1786084511308,"results":"14203","hashOfConfig":"12232"},{"size":4363,"mtime":1786084511308,"results":"14204","hashOfConfig":"12232"},{"size":3379,"mtime":1786084511308,"results":"14205","hashOfConfig":"12232"},{"size":6048,"mtime":1786084511308,"results":"14206","hashOfConfig":"12232"},{"size":3011,"mtime":1786084511308,"results":"14207","hashOfConfig":"12232"},{"size":1873,"mtime":1786084511309,"results":"14208","hashOfConfig":"12232"},{"size":1652,"mtime":1786084511309,"results":"14209","hashOfConfig":"12232"},{"size":5626,"mtime":1786084511309,"results":"14210","hashOfConfig":"12232"},{"size":1321,"mtime":1786084511309,"results":"14211","hashOfConfig":"12232"},{"size":4892,"mtime":1786084511309,"results":"14212","hashOfConfig":"12232"},{"size":2981,"mtime":1786084511309,"results":"14213","hashOfConfig":"12232"},{"size":4123,"mtime":1786084511309,"results":"14214","hashOfConfig":"12232"},{"size":5225,"mtime":1786084511309,"results":"14215","hashOfConfig":"12232"},{"size":12661,"mtime":1786084511310,"results":"14216","hashOfConfig":"12232"},{"size":4058,"mtime":1786084511310,"results":"14217","hashOfConfig":"12232"},{"size":2930,"mtime":1786084511310,"results":"14218","hashOfConfig":"12232"},{"size":1092,"mtime":1786084511310,"results":"14219","hashOfConfig":"12232"},{"size":2292,"mtime":1786084511310,"results":"14220","hashOfConfig":"12232"},{"size":3494,"mtime":1786084511310,"results":"14221","hashOfConfig":"12232"},{"size":1251,"mtime":1786084511310,"results":"14222","hashOfConfig":"12232"},{"size":1596,"mtime":1786084511310,"results":"14223","hashOfConfig":"12232"},{"size":1012,"mtime":1786084511311,"results":"14224","hashOfConfig":"12232"},{"size":2108,"mtime":1786084511311,"results":"14225","hashOfConfig":"12232"},{"size":3205,"mtime":1786084511311,"results":"14226","hashOfConfig":"12232"},{"size":1531,"mtime":1786084511311,"results":"14227","hashOfConfig":"12232"},{"size":1267,"mtime":1786084511311,"results":"14228","hashOfConfig":"12232"},{"size":4511,"mtime":1786084511311,"results":"14229","hashOfConfig":"12232"},{"size":2387,"mtime":1786084511310,"results":"14230","hashOfConfig":"12232"},{"size":1843,"mtime":1786084511311,"results":"14231","hashOfConfig":"12232"},{"size":9655,"mtime":1786084511311,"results":"14232","hashOfConfig":"12232"},{"size":2034,"mtime":1786084511312,"results":"14233","hashOfConfig":"12232"},{"size":5044,"mtime":1786084511312,"results":"14234","hashOfConfig":"12232"},{"size":6063,"mtime":1786084511312,"results":"14235","hashOfConfig":"12232"},{"size":1551,"mtime":1786084511312,"results":"14236","hashOfConfig":"12232"},{"size":2264,"mtime":1786084511312,"results":"14237","hashOfConfig":"12232"},{"size":3309,"mtime":1786084511312,"results":"14238","hashOfConfig":"12232"},{"size":5941,"mtime":1786084511312,"results":"14239","hashOfConfig":"12232"},{"size":3866,"mtime":1786084511312,"results":"14240","hashOfConfig":"12232"},{"size":12501,"mtime":1786084511313,"results":"14241","hashOfConfig":"12232"},{"size":3541,"mtime":1786084511313,"results":"14242","hashOfConfig":"12232"},{"size":4411,"mtime":1786084511313,"results":"14243","hashOfConfig":"12232"},{"size":4938,"mtime":1786084511313,"results":"14244","hashOfConfig":"12232"},{"size":4416,"mtime":1786084511313,"results":"14245","hashOfConfig":"12232"},{"size":1701,"mtime":1786084511313,"results":"14246","hashOfConfig":"12232"},{"size":3276,"mtime":1786084511313,"results":"14247","hashOfConfig":"12232"},{"size":2519,"mtime":1786084511314,"results":"14248","hashOfConfig":"12232"},{"size":11138,"mtime":1786084511314,"results":"14249","hashOfConfig":"12232"},{"size":2000,"mtime":1786084511314,"results":"14250","hashOfConfig":"12232"},{"size":4167,"mtime":1786084511314,"results":"14251","hashOfConfig":"12232"},{"size":4509,"mtime":1786084511314,"results":"14252","hashOfConfig":"12232"},{"size":2888,"mtime":1786084511314,"results":"14253","hashOfConfig":"12232"},{"size":3857,"mtime":1786084511314,"results":"14254","hashOfConfig":"12232"},{"size":1813,"mtime":1786084511314,"results":"14255","hashOfConfig":"12232"},{"size":3545,"mtime":1786084511314,"results":"14256","hashOfConfig":"12232"},{"size":10768,"mtime":1786084511315,"results":"14257","hashOfConfig":"12232"},{"size":11858,"mtime":1786084511315,"results":"14258","hashOfConfig":"12232"},{"size":4116,"mtime":1786084511315,"results":"14259","hashOfConfig":"12232"},{"size":5043,"mtime":1786084511315,"results":"14260","hashOfConfig":"12232"},{"size":2574,"mtime":1786084511315,"results":"14261","hashOfConfig":"12232"},{"size":6431,"mtime":1786084511315,"results":"14262","hashOfConfig":"12232"},{"size":4767,"mtime":1786084511315,"results":"14263","hashOfConfig":"12232"},{"size":10723,"mtime":1786084511316,"results":"14264","hashOfConfig":"12232"},{"size":6006,"mtime":1786084511316,"results":"14265","hashOfConfig":"12232"},{"size":2157,"mtime":1786084511316,"results":"14266","hashOfConfig":"12232"},{"size":6758,"mtime":1786084511316,"results":"14267","hashOfConfig":"12232"},{"size":3505,"mtime":1786084511316,"results":"14268","hashOfConfig":"12232"},{"size":4411,"mtime":1786084511316,"results":"14269","hashOfConfig":"12232"},{"size":1469,"mtime":1786084511316,"results":"14270","hashOfConfig":"12232"},{"size":4309,"mtime":1786084511316,"results":"14271","hashOfConfig":"12232"},{"size":1551,"mtime":1786084511316,"results":"14272","hashOfConfig":"12232"},{"size":4150,"mtime":1786084511317,"results":"14273","hashOfConfig":"12232"},{"size":4845,"mtime":1786084511317,"results":"14274","hashOfConfig":"12232"},{"size":4007,"mtime":1786084511317,"results":"14275","hashOfConfig":"12232"},{"size":3428,"mtime":1786084511317,"results":"14276","hashOfConfig":"12232"},{"size":4837,"mtime":1786084511317,"results":"14277","hashOfConfig":"12232"},{"size":1693,"mtime":1786084511317,"results":"14278","hashOfConfig":"12232"},{"size":23274,"mtime":1786084511317,"results":"14279","hashOfConfig":"12232"},{"size":14712,"mtime":1786084511318,"results":"14280","hashOfConfig":"12232"},{"size":9912,"mtime":1786084511318,"results":"14281","hashOfConfig":"12232"},{"size":5828,"mtime":1786084511319,"results":"14282","hashOfConfig":"12232"},{"size":1238,"mtime":1786084511319,"results":"14283","hashOfConfig":"12232"},{"size":1556,"mtime":1786084511319,"results":"14284","hashOfConfig":"12232"},{"size":8541,"mtime":1786084511319,"results":"14285","hashOfConfig":"12232"},{"size":2543,"mtime":1786084511319,"results":"14286","hashOfConfig":"12232"},{"size":4046,"mtime":1786084511319,"results":"14287","hashOfConfig":"12232"},{"size":7570,"mtime":1786084511320,"results":"14288","hashOfConfig":"12232"},{"size":2233,"mtime":1786084511320,"results":"14289","hashOfConfig":"12232"},{"size":1205,"mtime":1786084511320,"results":"14290","hashOfConfig":"12232"},{"size":4050,"mtime":1786084511320,"results":"14291","hashOfConfig":"12232"},{"size":1916,"mtime":1786084511320,"results":"14292","hashOfConfig":"12232"},{"size":3008,"mtime":1786084511320,"results":"14293","hashOfConfig":"12232"},{"size":1118,"mtime":1786084511320,"results":"14294","hashOfConfig":"12232"},{"size":14023,"mtime":1786084511321,"results":"14295","hashOfConfig":"12232"},{"size":2409,"mtime":1786084511321,"results":"14296","hashOfConfig":"12232"},{"size":9281,"mtime":1786084511321,"results":"14297","hashOfConfig":"12232"},{"size":16818,"mtime":1786084511321,"results":"14298","hashOfConfig":"12232"},{"size":804,"mtime":1786084511321,"results":"14299","hashOfConfig":"12232"},{"size":8850,"mtime":1786084511321,"results":"14300","hashOfConfig":"12232"},{"size":10655,"mtime":1786084511321,"results":"14301","hashOfConfig":"12232"},{"size":3254,"mtime":1786084511322,"results":"14302","hashOfConfig":"12232"},{"size":6161,"mtime":1786084511322,"results":"14303","hashOfConfig":"12232"},{"size":3444,"mtime":1786084511322,"results":"14304","hashOfConfig":"12232"},{"size":9607,"mtime":1786084511322,"results":"14305","hashOfConfig":"12232"},{"size":12397,"mtime":1786084511322,"results":"14306","hashOfConfig":"12232"},{"size":1832,"mtime":1786084511323,"results":"14307","hashOfConfig":"12232"},{"size":82336,"mtime":1786084511323,"results":"14308","hashOfConfig":"12232"},{"size":4839,"mtime":1786084511324,"results":"14309","hashOfConfig":"12232"},{"size":4705,"mtime":1786084511324,"results":"14310","hashOfConfig":"12232"},{"size":1703,"mtime":1786084511324,"results":"14311","hashOfConfig":"12232"},{"size":7926,"mtime":1786084511324,"results":"14312","hashOfConfig":"12232"},{"size":1551,"mtime":1786084511325,"results":"14313","hashOfConfig":"12232"},{"size":1547,"mtime":1786084511325,"results":"14314","hashOfConfig":"12232"},{"size":4813,"mtime":1786084511326,"results":"14315","hashOfConfig":"12232"},{"size":8540,"mtime":1786084529128,"results":"14316","hashOfConfig":"12232"},{"size":27448,"mtime":1786084511326,"results":"14317","hashOfConfig":"12232"},{"size":10605,"mtime":1786084511327,"results":"14318","hashOfConfig":"12232"},{"size":6948,"mtime":1786084511327,"results":"14319","hashOfConfig":"12232"},{"size":7800,"mtime":1786084511327,"results":"14320","hashOfConfig":"12232"},{"size":2265,"mtime":1786084511327,"results":"14321","hashOfConfig":"12232"},{"size":5418,"mtime":1786084511327,"results":"14322","hashOfConfig":"12232"},{"size":5249,"mtime":1786084511325,"results":"14323","hashOfConfig":"12232"},{"size":8245,"mtime":1786084511325,"results":"14324","hashOfConfig":"12232"},{"size":4250,"mtime":1786084511325,"results":"14325","hashOfConfig":"12232"},{"size":1750,"mtime":1786084511327,"results":"14326","hashOfConfig":"12232"},{"size":7351,"mtime":1786084511328,"results":"14327","hashOfConfig":"12232"},{"size":1896,"mtime":1786084511328,"results":"14328","hashOfConfig":"12232"},{"size":9273,"mtime":1786084511328,"results":"14329","hashOfConfig":"12232"},{"size":1918,"mtime":1786084511328,"results":"14330","hashOfConfig":"12232"},{"size":2447,"mtime":1786084511329,"results":"14331","hashOfConfig":"12232"},{"size":5387,"mtime":1786084511329,"results":"14332","hashOfConfig":"12232"},{"size":2591,"mtime":1786084511329,"results":"14333","hashOfConfig":"12232"},{"size":5174,"mtime":1786084511329,"results":"14334","hashOfConfig":"12232"},{"size":6032,"mtime":1786084511329,"results":"14335","hashOfConfig":"12232"},{"size":2035,"mtime":1786084511330,"results":"14336","hashOfConfig":"12232"},{"size":4813,"mtime":1786084511330,"results":"14337","hashOfConfig":"12232"},{"size":4015,"mtime":1786084511330,"results":"14338","hashOfConfig":"12232"},{"size":2287,"mtime":1786084511330,"results":"14339","hashOfConfig":"12232"},{"size":3185,"mtime":1786084511330,"results":"14340","hashOfConfig":"12232"},{"size":3665,"mtime":1786084511330,"results":"14341","hashOfConfig":"12232"},{"size":3115,"mtime":1786084511331,"results":"14342","hashOfConfig":"12232"},{"size":992,"mtime":1786084511331,"results":"14343","hashOfConfig":"12232"},{"size":1116,"mtime":1786084511331,"results":"14344","hashOfConfig":"12232"},{"size":2422,"mtime":1786084511331,"results":"14345","hashOfConfig":"12232"},{"size":1321,"mtime":1786084511331,"results":"14346","hashOfConfig":"12232"},{"size":1687,"mtime":1786084511331,"results":"14347","hashOfConfig":"12232"},{"size":680,"mtime":1786084511332,"results":"14348","hashOfConfig":"12232"},{"size":938,"mtime":1786084511332,"results":"14349","hashOfConfig":"12232"},{"size":697,"mtime":1786084511332,"results":"14350","hashOfConfig":"12232"},{"size":839,"mtime":1786084511332,"results":"14351","hashOfConfig":"12232"},{"size":1376,"mtime":1786084511332,"results":"14352","hashOfConfig":"12232"},{"size":1485,"mtime":1786084511332,"results":"14353","hashOfConfig":"12232"},{"size":4511,"mtime":1786084511332,"results":"14354","hashOfConfig":"12232"},{"size":2425,"mtime":1786084511333,"results":"14355","hashOfConfig":"12232"},{"size":5078,"mtime":1786084511333,"results":"14356","hashOfConfig":"12232"},{"size":1092,"mtime":1786084511333,"results":"14357","hashOfConfig":"12232"},{"size":1580,"mtime":1786084511333,"results":"14358","hashOfConfig":"12232"},{"size":12392,"mtime":1786084511333,"results":"14359","hashOfConfig":"12232"},{"size":8000,"mtime":1786084511334,"results":"14360","hashOfConfig":"12232"},{"size":1621,"mtime":1786084511334,"results":"14361","hashOfConfig":"12232"},{"size":4679,"mtime":1786084511334,"results":"14362","hashOfConfig":"12232"},{"size":1943,"mtime":1786084511334,"results":"14363","hashOfConfig":"12232"},{"size":2294,"mtime":1786084511335,"results":"14364","hashOfConfig":"12232"},{"size":2292,"mtime":1786084511335,"results":"14365","hashOfConfig":"12232"},{"size":2381,"mtime":1786084511335,"results":"14366","hashOfConfig":"12232"},{"size":1188,"mtime":1786084511335,"results":"14367","hashOfConfig":"12232"},{"size":6006,"mtime":1786084511336,"results":"14368","hashOfConfig":"12232"},{"size":3393,"mtime":1786084511336,"results":"14369","hashOfConfig":"12232"},{"size":3453,"mtime":1786084511336,"results":"14370","hashOfConfig":"12232"},{"size":2599,"mtime":1786084511336,"results":"14371","hashOfConfig":"12232"},{"size":2832,"mtime":1786084511336,"results":"14372","hashOfConfig":"12232"},{"size":2994,"mtime":1786084511337,"results":"14373","hashOfConfig":"12232"},{"size":2593,"mtime":1786084511337,"results":"14374","hashOfConfig":"12232"},{"size":2437,"mtime":1786084511337,"results":"14375","hashOfConfig":"12232"},{"size":61357,"mtime":1786084511337,"results":"14376","hashOfConfig":"12232"},{"size":11826,"mtime":1786084511337,"results":"14377","hashOfConfig":"12232"},{"size":28857,"mtime":1786084529049,"results":"14378","hashOfConfig":"12232"},{"size":5472,"mtime":1786084511338,"results":"14379","hashOfConfig":"12232"},{"size":1016,"mtime":1786084511339,"results":"14380","hashOfConfig":"12232"},{"size":8055,"mtime":1786084511339,"results":"14381","hashOfConfig":"12232"},{"size":6281,"mtime":1786084511339,"results":"14382","hashOfConfig":"12232"},{"size":28050,"mtime":1786084511340,"results":"14383","hashOfConfig":"12232"},{"size":783,"mtime":1786084511340,"results":"14384","hashOfConfig":"12232"},{"size":3783,"mtime":1786084511340,"results":"14385","hashOfConfig":"12232"},{"size":1770,"mtime":1786084511340,"results":"14386","hashOfConfig":"12232"},{"size":1747,"mtime":1786084511340,"results":"14387","hashOfConfig":"12232"},{"size":2621,"mtime":1786084511341,"results":"14388","hashOfConfig":"12232"},{"size":3134,"mtime":1786084511341,"results":"14389","hashOfConfig":"12232"},{"size":6404,"mtime":1786084511341,"results":"14390","hashOfConfig":"12232"},{"size":3635,"mtime":1786084511341,"results":"14391","hashOfConfig":"12232"},{"size":5937,"mtime":1786084511341,"results":"14392","hashOfConfig":"12232"},{"size":4473,"mtime":1786084511341,"results":"14393","hashOfConfig":"12232"},{"size":4686,"mtime":1786084511342,"results":"14394","hashOfConfig":"12232"},{"size":3385,"mtime":1786084511342,"results":"14395","hashOfConfig":"12232"},{"size":6172,"mtime":1786084511342,"results":"14396","hashOfConfig":"12232"},{"size":2011,"mtime":1786084511342,"results":"14397","hashOfConfig":"12232"},{"size":2178,"mtime":1786084511342,"results":"14398","hashOfConfig":"12232"},{"size":7993,"mtime":1786084511342,"results":"14399","hashOfConfig":"12232"},{"size":7489,"mtime":1786084511342,"results":"14400","hashOfConfig":"12232"},{"size":3303,"mtime":1786084511343,"results":"14401","hashOfConfig":"12232"},{"size":4118,"mtime":1786084511343,"results":"14402","hashOfConfig":"12232"},{"size":454,"mtime":1786084511343,"results":"14403","hashOfConfig":"12232"},{"size":4235,"mtime":1786084511343,"results":"14404","hashOfConfig":"12232"},{"size":1338,"mtime":1786084511343,"results":"14405","hashOfConfig":"12232"},{"size":6146,"mtime":1786084511343,"results":"14406","hashOfConfig":"12232"},{"size":7894,"mtime":1786084511343,"results":"14407","hashOfConfig":"12232"},{"size":2559,"mtime":1786084511344,"results":"14408","hashOfConfig":"12232"},{"size":3728,"mtime":1786084511344,"results":"14409","hashOfConfig":"12232"},{"size":2833,"mtime":1786084511344,"results":"14410","hashOfConfig":"12232"},{"size":16476,"mtime":1786084511344,"results":"14411","hashOfConfig":"12232"},{"size":3616,"mtime":1786084511344,"results":"14412","hashOfConfig":"12232"},{"size":7343,"mtime":1786084511344,"results":"14413","hashOfConfig":"12232"},{"size":3351,"mtime":1786084511344,"results":"14414","hashOfConfig":"12232"},{"size":2629,"mtime":1786084511345,"results":"14415","hashOfConfig":"12232"},{"size":1726,"mtime":1786084511345,"results":"14416","hashOfConfig":"12232"},{"size":4233,"mtime":1786084511345,"results":"14417","hashOfConfig":"12232"},{"size":1734,"mtime":1786084511345,"results":"14418","hashOfConfig":"12232"},{"size":1034,"mtime":1786084511345,"results":"14419","hashOfConfig":"12232"},{"size":5765,"mtime":1786084511345,"results":"14420","hashOfConfig":"12232"},{"size":5808,"mtime":1786084511345,"results":"14421","hashOfConfig":"12232"},{"size":4808,"mtime":1786084511345,"results":"14422","hashOfConfig":"12232"},{"size":1625,"mtime":1786084511346,"results":"14423","hashOfConfig":"12232"},{"size":2293,"mtime":1786084511346,"results":"14424","hashOfConfig":"12232"},{"size":930,"mtime":1786084511346,"results":"14425","hashOfConfig":"12232"},{"size":2059,"mtime":1786084511346,"results":"14426","hashOfConfig":"12232"},{"size":3719,"mtime":1786084511346,"results":"14427","hashOfConfig":"12232"},{"size":4117,"mtime":1786084511346,"results":"14428","hashOfConfig":"12232"},{"size":1278,"mtime":1786084511346,"results":"14429","hashOfConfig":"12232"},{"size":2502,"mtime":1786084511347,"results":"14430","hashOfConfig":"12232"},{"size":1872,"mtime":1786084511347,"results":"14431","hashOfConfig":"12232"},{"size":5410,"mtime":1786084511347,"results":"14432","hashOfConfig":"12232"},{"size":2448,"mtime":1786084511347,"results":"14433","hashOfConfig":"12232"},{"size":11035,"mtime":1786084511347,"results":"14434","hashOfConfig":"12232"},{"size":4408,"mtime":1786084511348,"results":"14435","hashOfConfig":"12232"},{"size":5302,"mtime":1786084511348,"results":"14436","hashOfConfig":"12232"},{"size":5495,"mtime":1786084511348,"results":"14437","hashOfConfig":"12232"},{"size":6412,"mtime":1786084511348,"results":"14438","hashOfConfig":"12232"},{"size":6338,"mtime":1786084511349,"results":"14439","hashOfConfig":"12232"},{"size":3486,"mtime":1786084511349,"results":"14440","hashOfConfig":"12232"},{"size":2810,"mtime":1786084511349,"results":"14441","hashOfConfig":"12232"},{"size":1748,"mtime":1786084511349,"results":"14442","hashOfConfig":"12232"},{"size":3825,"mtime":1786084511349,"results":"14443","hashOfConfig":"12232"},{"size":2410,"mtime":1786084511350,"results":"14444","hashOfConfig":"12232"},{"size":557,"mtime":1786084511350,"results":"14445","hashOfConfig":"12232"},{"size":3433,"mtime":1786084511350,"results":"14446","hashOfConfig":"12232"},{"size":2857,"mtime":1786084511350,"results":"14447","hashOfConfig":"12232"},{"size":2527,"mtime":1786084511350,"results":"14448","hashOfConfig":"12232"},{"size":4182,"mtime":1786084511350,"results":"14449","hashOfConfig":"12232"},{"size":4800,"mtime":1786084511351,"results":"14450","hashOfConfig":"12232"},{"size":2179,"mtime":1786084511351,"results":"14451","hashOfConfig":"12232"},{"size":2198,"mtime":1786084511351,"results":"14452","hashOfConfig":"12232"},{"size":3932,"mtime":1786084511351,"results":"14453","hashOfConfig":"12232"},{"size":2469,"mtime":1786084511351,"results":"14454","hashOfConfig":"12232"},{"size":3978,"mtime":1786084511351,"results":"14455","hashOfConfig":"12232"},{"size":2285,"mtime":1786084511352,"results":"14456","hashOfConfig":"12232"},{"size":2113,"mtime":1786084511352,"results":"14457","hashOfConfig":"12232"},{"size":2092,"mtime":1786084511352,"results":"14458","hashOfConfig":"12232"},{"size":1641,"mtime":1786084511352,"results":"14459","hashOfConfig":"12232"},{"size":2442,"mtime":1786084511352,"results":"14460","hashOfConfig":"12232"},{"size":16075,"mtime":1786084511353,"results":"14461","hashOfConfig":"12232"},{"size":5473,"mtime":1786084511353,"results":"14462","hashOfConfig":"12232"},{"size":9438,"mtime":1786084511353,"results":"14463","hashOfConfig":"12232"},{"size":7403,"mtime":1786084511353,"results":"14464","hashOfConfig":"12232"},{"size":2690,"mtime":1786084511353,"results":"14465","hashOfConfig":"12232"},{"size":2053,"mtime":1786084511353,"results":"14466","hashOfConfig":"12232"},{"size":2351,"mtime":1786084511354,"results":"14467","hashOfConfig":"12232"},{"size":2373,"mtime":1786084511354,"results":"14468","hashOfConfig":"12232"},{"size":1497,"mtime":1786084511354,"results":"14469","hashOfConfig":"12232"},{"size":6574,"mtime":1786084511354,"results":"14470","hashOfConfig":"12232"},{"size":1685,"mtime":1786084511354,"results":"14471","hashOfConfig":"12232"},{"size":10099,"mtime":1786084511354,"results":"14472","hashOfConfig":"12232"},{"size":5590,"mtime":1786084511355,"results":"14473","hashOfConfig":"12232"},{"size":11932,"mtime":1786084511355,"results":"14474","hashOfConfig":"12232"},{"size":2364,"mtime":1786084511355,"results":"14475","hashOfConfig":"12232"},{"size":3810,"mtime":1786084511355,"results":"14476","hashOfConfig":"12232"},{"size":6599,"mtime":1786084511355,"results":"14477","hashOfConfig":"12232"},{"size":674,"mtime":1786084511355,"results":"14478","hashOfConfig":"12232"},{"size":6085,"mtime":1786084511355,"results":"14479","hashOfConfig":"12232"},{"size":2307,"mtime":1786084511356,"results":"14480","hashOfConfig":"12232"},{"size":2997,"mtime":1786084511356,"results":"14481","hashOfConfig":"12232"},{"size":1640,"mtime":1786084511356,"results":"14482","hashOfConfig":"12232"},{"size":8534,"mtime":1786084511356,"results":"14483","hashOfConfig":"12232"},{"size":2183,"mtime":1786084511356,"results":"14484","hashOfConfig":"12232"},{"size":1670,"mtime":1786084511356,"results":"14485","hashOfConfig":"12232"},{"size":5951,"mtime":1786084511357,"results":"14486","hashOfConfig":"12232"},{"size":8827,"mtime":1786084511357,"results":"14487","hashOfConfig":"12232"},{"size":4395,"mtime":1786084511357,"results":"14488","hashOfConfig":"12232"},{"size":8994,"mtime":1786084511357,"results":"14489","hashOfConfig":"12232"},{"size":2370,"mtime":1786084511357,"results":"14490","hashOfConfig":"12232"},{"size":7842,"mtime":1786084511357,"results":"14491","hashOfConfig":"12232"},{"size":5726,"mtime":1786084511358,"results":"14492","hashOfConfig":"12232"},{"size":3069,"mtime":1786084511358,"results":"14493","hashOfConfig":"12232"},{"size":4821,"mtime":1786084511358,"results":"14494","hashOfConfig":"12232"},{"size":1353,"mtime":1786084511358,"results":"14495","hashOfConfig":"12232"},{"size":4938,"mtime":1786084511358,"results":"14496","hashOfConfig":"12232"},{"size":9520,"mtime":1786084511359,"results":"14497","hashOfConfig":"12232"},{"size":10824,"mtime":1786084511359,"results":"14498","hashOfConfig":"12232"},{"size":8051,"mtime":1786084511359,"results":"14499","hashOfConfig":"12232"},{"size":4536,"mtime":1786084511359,"results":"14500","hashOfConfig":"12232"},{"size":10686,"mtime":1786084511359,"results":"14501","hashOfConfig":"12232"},{"size":3561,"mtime":1786084511359,"results":"14502","hashOfConfig":"12232"},{"size":11201,"mtime":1786084511360,"results":"14503","hashOfConfig":"12232"},{"size":7335,"mtime":1786084511360,"results":"14504","hashOfConfig":"12232"},{"size":3583,"mtime":1786084511360,"results":"14505","hashOfConfig":"12232"},{"size":2779,"mtime":1786084511360,"results":"14506","hashOfConfig":"12232"},{"size":1246,"mtime":1786084511360,"results":"14507","hashOfConfig":"12232"},{"size":3529,"mtime":1786084511360,"results":"14508","hashOfConfig":"12232"},{"size":5579,"mtime":1786084511360,"results":"14509","hashOfConfig":"12232"},{"size":7871,"mtime":1786084511361,"results":"14510","hashOfConfig":"12232"},{"size":5292,"mtime":1786084511361,"results":"14511","hashOfConfig":"12232"},{"size":3594,"mtime":1786084511361,"results":"14512","hashOfConfig":"12232"},{"size":7091,"mtime":1786084511361,"results":"14513","hashOfConfig":"12232"},{"size":1790,"mtime":1786084511361,"results":"14514","hashOfConfig":"12232"},{"size":1883,"mtime":1786084511361,"results":"14515","hashOfConfig":"12232"},{"size":5040,"mtime":1786084511362,"results":"14516","hashOfConfig":"12232"},{"size":1723,"mtime":1786084511362,"results":"14517","hashOfConfig":"12232"},{"size":3011,"mtime":1786084511362,"results":"14518","hashOfConfig":"12232"},{"size":2295,"mtime":1786084511362,"results":"14519","hashOfConfig":"12232"},{"size":4482,"mtime":1786084511362,"results":"14520","hashOfConfig":"12232"},{"size":3628,"mtime":1786084511362,"results":"14521","hashOfConfig":"12232"},{"size":5606,"mtime":1786084511362,"results":"14522","hashOfConfig":"12232"},{"size":22976,"mtime":1786084511363,"results":"14523","hashOfConfig":"12232"},{"size":6070,"mtime":1786084511363,"results":"14524","hashOfConfig":"12232"},{"size":1884,"mtime":1786084511363,"results":"14525","hashOfConfig":"12232"},{"size":3073,"mtime":1786084511363,"results":"14526","hashOfConfig":"12232"},{"size":4098,"mtime":1786084511363,"results":"14527","hashOfConfig":"12232"},{"size":1674,"mtime":1786084511363,"results":"14528","hashOfConfig":"12232"},{"size":2913,"mtime":1786084511363,"results":"14529","hashOfConfig":"12232"},{"size":3097,"mtime":1786084511364,"results":"14530","hashOfConfig":"12285"},{"size":4388,"mtime":1786084511364,"results":"14531","hashOfConfig":"12232"},{"size":9071,"mtime":1786084511364,"results":"14532","hashOfConfig":"12232"},{"size":6137,"mtime":1786084511364,"results":"14533","hashOfConfig":"12232"},{"size":2842,"mtime":1786084511364,"results":"14534","hashOfConfig":"12232"},{"size":2242,"mtime":1786084511364,"results":"14535","hashOfConfig":"12232"},{"size":4818,"mtime":1786084511364,"results":"14536","hashOfConfig":"12232"},{"size":7344,"mtime":1786084511365,"results":"14537","hashOfConfig":"12232"},{"size":3220,"mtime":1786084511365,"results":"14538","hashOfConfig":"12232"},{"size":8483,"mtime":1786084511365,"results":"14539","hashOfConfig":"12232"},{"size":5403,"mtime":1786084511365,"results":"14540","hashOfConfig":"12232"},{"size":2811,"mtime":1786084511365,"results":"14541","hashOfConfig":"12232"},{"size":2713,"mtime":1786084511365,"results":"14542","hashOfConfig":"12232"},{"size":2043,"mtime":1786084511365,"results":"14543","hashOfConfig":"12232"},{"size":5935,"mtime":1786084511366,"results":"14544","hashOfConfig":"12232"},{"size":5223,"mtime":1786084511366,"results":"14545","hashOfConfig":"12232"},{"size":8208,"mtime":1786084511366,"results":"14546","hashOfConfig":"12232"},{"size":1760,"mtime":1786084511366,"results":"14547","hashOfConfig":"12232"},{"size":5155,"mtime":1786084511366,"results":"14548","hashOfConfig":"12232"},{"size":6211,"mtime":1786084511366,"results":"14549","hashOfConfig":"12232"},{"size":912,"mtime":1786084511366,"results":"14550","hashOfConfig":"12232"},{"size":12807,"mtime":1786084511367,"results":"14551","hashOfConfig":"12232"},{"size":1991,"mtime":1786084511367,"results":"14552","hashOfConfig":"12232"},{"size":4716,"mtime":1786084511367,"results":"14553","hashOfConfig":"12232"},{"size":2239,"mtime":1786084511367,"results":"14554","hashOfConfig":"12232"},{"size":518,"mtime":1786084511367,"results":"14555","hashOfConfig":"12232"},{"size":3550,"mtime":1786084511367,"results":"14556","hashOfConfig":"12232"},{"size":2642,"mtime":1786084511367,"results":"14557","hashOfConfig":"12232"},{"size":8386,"mtime":1786084511368,"results":"14558","hashOfConfig":"12232"},{"size":8166,"mtime":1786084511368,"results":"14559","hashOfConfig":"12232"},{"size":1609,"mtime":1786084511370,"results":"14560","hashOfConfig":"12232"},{"size":12207,"mtime":1786084511370,"results":"14561","hashOfConfig":"12232"},{"size":1211,"mtime":1786084511370,"results":"14562","hashOfConfig":"12232"},{"size":10620,"mtime":1786084511368,"results":"14563","hashOfConfig":"12232"},{"size":3462,"mtime":1786084511368,"results":"14564","hashOfConfig":"12232"},{"size":7982,"mtime":1786084511368,"results":"14565","hashOfConfig":"12232"},{"size":4390,"mtime":1786084511368,"results":"14566","hashOfConfig":"12232"},{"size":8246,"mtime":1786084511368,"results":"14567","hashOfConfig":"12232"},{"size":6105,"mtime":1786084511369,"results":"14568","hashOfConfig":"12232"},{"size":3136,"mtime":1786084511369,"results":"14569","hashOfConfig":"12232"},{"size":6560,"mtime":1786084511369,"results":"14570","hashOfConfig":"12232"},{"size":15584,"mtime":1786084511369,"results":"14571","hashOfConfig":"12232"},{"size":1783,"mtime":1786084511369,"results":"14572","hashOfConfig":"12232"},{"size":3973,"mtime":1786084511369,"results":"14573","hashOfConfig":"12232"},{"size":4612,"mtime":1786084511370,"results":"14574","hashOfConfig":"12232"},{"size":4866,"mtime":1786084511370,"results":"14575","hashOfConfig":"12232"},{"size":3659,"mtime":1786084511370,"results":"14576","hashOfConfig":"12232"},{"size":9721,"mtime":1786084511371,"results":"14577","hashOfConfig":"12232"},{"size":6164,"mtime":1786084511371,"results":"14578","hashOfConfig":"12232"},{"size":1816,"mtime":1786084511371,"results":"14579","hashOfConfig":"12232"},{"size":9832,"mtime":1786084511377,"results":"14580","hashOfConfig":"12232"},{"size":4890,"mtime":1786084511371,"results":"14581","hashOfConfig":"12232"},{"size":2545,"mtime":1786084511371,"results":"14582","hashOfConfig":"12232"},{"size":4708,"mtime":1786084511371,"results":"14583","hashOfConfig":"12232"},{"size":4203,"mtime":1786084511371,"results":"14584","hashOfConfig":"12232"},{"size":5057,"mtime":1786084511372,"results":"14585","hashOfConfig":"12232"},{"size":7367,"mtime":1786084511372,"results":"14586","hashOfConfig":"12232"},{"size":6677,"mtime":1786084511372,"results":"14587","hashOfConfig":"12232"},{"size":5491,"mtime":1786084511372,"results":"14588","hashOfConfig":"12232"},{"size":7608,"mtime":1786084511372,"results":"14589","hashOfConfig":"12232"},{"size":7942,"mtime":1786084511372,"results":"14590","hashOfConfig":"12232"},{"size":7277,"mtime":1786084511373,"results":"14591","hashOfConfig":"12232"},{"size":8926,"mtime":1786084511373,"results":"14592","hashOfConfig":"12232"},{"size":6828,"mtime":1786084511373,"results":"14593","hashOfConfig":"12232"},{"size":6916,"mtime":1786084511373,"results":"14594","hashOfConfig":"12232"},{"size":6127,"mtime":1786084511373,"results":"14595","hashOfConfig":"12232"},{"size":7099,"mtime":1786084511373,"results":"14596","hashOfConfig":"12232"},{"size":7640,"mtime":1786084511374,"results":"14597","hashOfConfig":"12232"},{"size":2621,"mtime":1786084511374,"results":"14598","hashOfConfig":"12232"},{"size":16278,"mtime":1786084511374,"results":"14599","hashOfConfig":"12232"},{"size":981,"mtime":1786084511374,"results":"14600","hashOfConfig":"12232"},{"size":5332,"mtime":1786084511374,"results":"14601","hashOfConfig":"12232"},{"size":2579,"mtime":1786084511374,"results":"14602","hashOfConfig":"12232"},{"size":3311,"mtime":1786084511374,"results":"14603","hashOfConfig":"12232"},{"size":8585,"mtime":1786084511375,"results":"14604","hashOfConfig":"12232"},{"size":11798,"mtime":1786084511375,"results":"14605","hashOfConfig":"12232"},{"size":8076,"mtime":1786084511375,"results":"14606","hashOfConfig":"12232"},{"size":5198,"mtime":1786084511375,"results":"14607","hashOfConfig":"12232"},{"size":4693,"mtime":1786084511375,"results":"14608","hashOfConfig":"12232"},{"size":6438,"mtime":1786084511375,"results":"14609","hashOfConfig":"12232"},{"size":5980,"mtime":1786084511376,"results":"14610","hashOfConfig":"12232"},{"size":8902,"mtime":1786084511376,"results":"14611","hashOfConfig":"12232"},{"size":6286,"mtime":1786084511376,"results":"14612","hashOfConfig":"12232"},{"size":5766,"mtime":1786084511376,"results":"14613","hashOfConfig":"12232"},{"size":4365,"mtime":1786084511376,"results":"14614","hashOfConfig":"12232"},{"size":8868,"mtime":1786084511376,"results":"14615","hashOfConfig":"12232"},{"size":6091,"mtime":1786084511377,"results":"14616","hashOfConfig":"12232"},{"size":5674,"mtime":1786084511377,"results":"14617","hashOfConfig":"12232"},{"size":4720,"mtime":1786084511377,"results":"14618","hashOfConfig":"12232"},{"size":7551,"mtime":1786084511377,"results":"14619","hashOfConfig":"12232"},{"size":9234,"mtime":1786084511378,"results":"14620","hashOfConfig":"12232"},{"size":6369,"mtime":1786084511378,"results":"14621","hashOfConfig":"12232"},{"size":4975,"mtime":1786084511378,"results":"14622","hashOfConfig":"12232"},{"size":1461,"mtime":1786084511378,"results":"14623","hashOfConfig":"12232"},{"size":4578,"mtime":1786084511378,"results":"14624","hashOfConfig":"12232"},{"size":7049,"mtime":1786084511378,"results":"14625","hashOfConfig":"12232"},{"size":4042,"mtime":1786084511378,"results":"14626","hashOfConfig":"12232"},{"size":23009,"mtime":1786084511378,"results":"14627","hashOfConfig":"12232"},{"size":5419,"mtime":1786084511379,"results":"14628","hashOfConfig":"12232"},{"size":4137,"mtime":1786084511379,"results":"14629","hashOfConfig":"12232"},{"size":2998,"mtime":1786084511379,"results":"14630","hashOfConfig":"12232"},{"size":3595,"mtime":1786084511379,"results":"14631","hashOfConfig":"12232"},{"size":4691,"mtime":1786084511379,"results":"14632","hashOfConfig":"12232"},{"size":3526,"mtime":1786084511379,"results":"14633","hashOfConfig":"12232"},{"size":3765,"mtime":1786084511379,"results":"14634","hashOfConfig":"12232"},{"size":2395,"mtime":1786084511379,"results":"14635","hashOfConfig":"12232"},{"size":3679,"mtime":1786084511380,"results":"14636","hashOfConfig":"12232"},{"size":3147,"mtime":1786084511380,"results":"14637","hashOfConfig":"12232"},{"size":5671,"mtime":1786084511380,"results":"14638","hashOfConfig":"12232"},{"size":7508,"mtime":1786084511380,"results":"14639","hashOfConfig":"12232"},{"size":1826,"mtime":1786084511380,"results":"14640","hashOfConfig":"12232"},{"size":2570,"mtime":1786084511380,"results":"14641","hashOfConfig":"12232"},{"size":1205,"mtime":1786084511380,"results":"14642","hashOfConfig":"12232"},{"size":2260,"mtime":1786084511380,"results":"14643","hashOfConfig":"12232"},{"size":2302,"mtime":1786084511380,"results":"14644","hashOfConfig":"12232"},{"size":8974,"mtime":1786084511381,"results":"14645","hashOfConfig":"12232"},{"size":8213,"mtime":1786084511381,"results":"14646","hashOfConfig":"12232"},{"size":1819,"mtime":1786084511381,"results":"14647","hashOfConfig":"12232"},{"size":6088,"mtime":1786084511381,"results":"14648","hashOfConfig":"12232"},{"size":5551,"mtime":1786084511381,"results":"14649","hashOfConfig":"12232"},{"size":1726,"mtime":1786084511381,"results":"14650","hashOfConfig":"12232"},{"size":602,"mtime":1786084511382,"results":"14651","hashOfConfig":"12232"},{"size":859,"mtime":1786084511382,"results":"14652","hashOfConfig":"12232"},{"size":532,"mtime":1786084511382,"results":"14653","hashOfConfig":"12232"},{"size":822,"mtime":1786084511382,"results":"14654","hashOfConfig":"12232"},{"size":564,"mtime":1786084511382,"results":"14655","hashOfConfig":"12232"},{"size":704,"mtime":1786084511382,"results":"14656","hashOfConfig":"12232"},{"size":543,"mtime":1786084511382,"results":"14657","hashOfConfig":"12232"},{"size":4671,"mtime":1786084511382,"results":"14658","hashOfConfig":"12232"},{"size":2924,"mtime":1786084511382,"results":"14659","hashOfConfig":"12232"},{"size":4011,"mtime":1786084511383,"results":"14660","hashOfConfig":"12232"},{"size":3753,"mtime":1786084511383,"results":"14661","hashOfConfig":"12232"},{"size":2793,"mtime":1786084511383,"results":"14662","hashOfConfig":"12232"},{"size":2489,"mtime":1786084511383,"results":"14663","hashOfConfig":"12232"},{"size":1565,"mtime":1786084511383,"results":"14664","hashOfConfig":"12232"},{"size":3716,"mtime":1786084511383,"results":"14665","hashOfConfig":"12232"},{"size":2025,"mtime":1786084511383,"results":"14666","hashOfConfig":"12232"},{"size":2507,"mtime":1786084511383,"results":"14667","hashOfConfig":"12232"},{"size":3619,"mtime":1786084511383,"results":"14668","hashOfConfig":"12232"},{"size":2368,"mtime":1786084511383,"results":"14669","hashOfConfig":"12232"},{"size":1884,"mtime":1786084511384,"results":"14670","hashOfConfig":"12232"},{"size":3670,"mtime":1786084511384,"results":"14671","hashOfConfig":"12232"},{"size":11628,"mtime":1786084511384,"results":"14672","hashOfConfig":"12232"},{"size":2086,"mtime":1786084511384,"results":"14673","hashOfConfig":"12232"},{"size":1450,"mtime":1786084511384,"results":"14674","hashOfConfig":"12232"},{"size":7441,"mtime":1786084511384,"results":"14675","hashOfConfig":"12232"},{"size":2205,"mtime":1786084511384,"results":"14676","hashOfConfig":"12232"},{"size":3196,"mtime":1786084511385,"results":"14677","hashOfConfig":"12232"},{"size":1899,"mtime":1786084511385,"results":"14678","hashOfConfig":"12285"},{"size":3370,"mtime":1786084511385,"results":"14679","hashOfConfig":"12232"},{"size":3646,"mtime":1786084511385,"results":"14680","hashOfConfig":"12232"},{"size":2201,"mtime":1786084511385,"results":"14681","hashOfConfig":"12232"},{"size":5408,"mtime":1786084511385,"results":"14682","hashOfConfig":"12232"},{"size":1871,"mtime":1786084511385,"results":"14683","hashOfConfig":"12232"},{"size":1488,"mtime":1786084511385,"results":"14684","hashOfConfig":"12232"},{"size":1389,"mtime":1786084511385,"results":"14685","hashOfConfig":"12232"},{"size":9060,"mtime":1786084511386,"results":"14686","hashOfConfig":"12232"},{"size":1500,"mtime":1786084511386,"results":"14687","hashOfConfig":"12232"},{"size":2046,"mtime":1786084511386,"results":"14688","hashOfConfig":"12232"},{"size":1452,"mtime":1786084511386,"results":"14689","hashOfConfig":"12232"},{"size":1039,"mtime":1786084511386,"results":"14690","hashOfConfig":"12232"},{"size":1478,"mtime":1786084511386,"results":"14691","hashOfConfig":"12232"},{"size":6146,"mtime":1786084511386,"results":"14692","hashOfConfig":"12232"},{"size":4833,"mtime":1786084511387,"results":"14693","hashOfConfig":"12232"},{"size":5449,"mtime":1786084511387,"results":"14694","hashOfConfig":"12232"},{"size":3231,"mtime":1786084511387,"results":"14695","hashOfConfig":"12232"},{"size":4938,"mtime":1786084511387,"results":"14696","hashOfConfig":"12232"},{"size":2435,"mtime":1786084511387,"results":"14697","hashOfConfig":"12232"},{"size":7202,"mtime":1786084511387,"results":"14698","hashOfConfig":"12232"},{"size":5456,"mtime":1786084511387,"results":"14699","hashOfConfig":"12232"},{"size":5899,"mtime":1786084511387,"results":"14700","hashOfConfig":"12232"},{"size":5358,"mtime":1786084511388,"results":"14701","hashOfConfig":"12232"},{"size":2376,"mtime":1786084511388,"results":"14702","hashOfConfig":"12232"},{"size":11275,"mtime":1786084511388,"results":"14703","hashOfConfig":"12232"},{"size":1751,"mtime":1786084511388,"results":"14704","hashOfConfig":"12232"},{"size":9412,"mtime":1786084511388,"results":"14705","hashOfConfig":"12232"},{"size":3710,"mtime":1786084511388,"results":"14706","hashOfConfig":"12232"},{"size":1701,"mtime":1786084511388,"results":"14707","hashOfConfig":"12232"},{"size":638,"mtime":1786084511388,"results":"14708","hashOfConfig":"12232"},{"size":6955,"mtime":1786084511389,"results":"14709","hashOfConfig":"12232"},{"size":5358,"mtime":1786084511389,"results":"14710","hashOfConfig":"12232"},{"size":3602,"mtime":1786084511389,"results":"14711","hashOfConfig":"12232"},{"size":4312,"mtime":1786084511389,"results":"14712","hashOfConfig":"12232"},{"size":3203,"mtime":1786084511389,"results":"14713","hashOfConfig":"12232"},{"size":2305,"mtime":1786084511389,"results":"14714","hashOfConfig":"12232"},{"size":2621,"mtime":1786084511389,"results":"14715","hashOfConfig":"12232"},{"size":4705,"mtime":1786084511390,"results":"14716","hashOfConfig":"12232"},{"size":5045,"mtime":1786084511390,"results":"14717","hashOfConfig":"12232"},{"size":2305,"mtime":1786084511390,"results":"14718","hashOfConfig":"12232"},{"size":14799,"mtime":1786084511390,"results":"14719","hashOfConfig":"12232"},{"size":7381,"mtime":1786084511390,"results":"14720","hashOfConfig":"12232"},{"size":1965,"mtime":1786084511390,"results":"14721","hashOfConfig":"12232"},{"size":3687,"mtime":1786084511390,"results":"14722","hashOfConfig":"12232"},{"size":4467,"mtime":1786084511390,"results":"14723","hashOfConfig":"12232"},{"size":6023,"mtime":1786084511391,"results":"14724","hashOfConfig":"12232"},{"size":3208,"mtime":1786084511391,"results":"14725","hashOfConfig":"12232"},{"size":4990,"mtime":1786084511391,"results":"14726","hashOfConfig":"12232"},{"size":2438,"mtime":1786084511391,"results":"14727","hashOfConfig":"12232"},{"size":2833,"mtime":1786084511391,"results":"14728","hashOfConfig":"12232"},{"size":8599,"mtime":1786084511391,"results":"14729","hashOfConfig":"12232"},{"size":1454,"mtime":1786084511391,"results":"14730","hashOfConfig":"12232"},{"size":2907,"mtime":1786084511392,"results":"14731","hashOfConfig":"12232"},{"size":2012,"mtime":1786084511392,"results":"14732","hashOfConfig":"12232"},{"size":2144,"mtime":1786084511392,"results":"14733","hashOfConfig":"12232"},{"size":2200,"mtime":1786084511392,"results":"14734","hashOfConfig":"12232"},{"size":1213,"mtime":1786084511392,"results":"14735","hashOfConfig":"12232"},{"size":2790,"mtime":1786084511392,"results":"14736","hashOfConfig":"12232"},{"size":34625,"mtime":1786084511392,"results":"14737","hashOfConfig":"12232"},{"size":14923,"mtime":1786084511393,"results":"14738","hashOfConfig":"12232"},{"size":4514,"mtime":1786084511393,"results":"14739","hashOfConfig":"12232"},{"size":1132,"mtime":1786084511393,"results":"14740","hashOfConfig":"12232"},{"size":15307,"mtime":1786084511393,"results":"14741","hashOfConfig":"12232"},{"size":5648,"mtime":1786084511393,"results":"14742","hashOfConfig":"12232"},{"size":5289,"mtime":1786084511394,"results":"14743","hashOfConfig":"12232"},{"size":3058,"mtime":1786084511394,"results":"14744","hashOfConfig":"12232"},{"size":4139,"mtime":1786084511394,"results":"14745","hashOfConfig":"12232"},{"size":4503,"mtime":1786084511394,"results":"14746","hashOfConfig":"12232"},{"size":4224,"mtime":1786084511394,"results":"14747","hashOfConfig":"12232"},{"size":2146,"mtime":1786084511394,"results":"14748","hashOfConfig":"12232"},{"size":6251,"mtime":1786084511394,"results":"14749","hashOfConfig":"12232"},{"size":3805,"mtime":1786084511394,"results":"14750","hashOfConfig":"12232"},{"size":4635,"mtime":1786084511395,"results":"14751","hashOfConfig":"12232"},{"size":57297,"mtime":1786084511395,"results":"14752","hashOfConfig":"12232"},{"size":1813,"mtime":1786084511395,"results":"14753","hashOfConfig":"12232"},{"size":2485,"mtime":1786084511395,"results":"14754","hashOfConfig":"12232"},{"size":18722,"mtime":1786084511395,"results":"14755","hashOfConfig":"12232"},{"size":15142,"mtime":1786084511396,"results":"14756","hashOfConfig":"12232"},{"size":2713,"mtime":1786084511396,"results":"14757","hashOfConfig":"12232"},{"size":3042,"mtime":1786084511396,"results":"14758","hashOfConfig":"12232"},{"size":3649,"mtime":1786084511396,"results":"14759","hashOfConfig":"12232"},{"size":3975,"mtime":1786084511396,"results":"14760","hashOfConfig":"12232"},{"size":5339,"mtime":1786084511396,"results":"14761","hashOfConfig":"12232"},{"size":1227,"mtime":1786084511396,"results":"14762","hashOfConfig":"12232"},{"size":1886,"mtime":1786084511396,"results":"14763","hashOfConfig":"12232"},{"size":11490,"mtime":1786084511397,"results":"14764","hashOfConfig":"12232"},{"size":2395,"mtime":1786084511397,"results":"14765","hashOfConfig":"12232"},{"size":2821,"mtime":1786084511397,"results":"14766","hashOfConfig":"12232"},{"size":1806,"mtime":1786084511397,"results":"14767","hashOfConfig":"12232"},{"size":1437,"mtime":1786084511397,"results":"14768","hashOfConfig":"12232"},{"size":19553,"mtime":1786084511397,"results":"14769","hashOfConfig":"12232"},{"size":2949,"mtime":1786084511397,"results":"14770","hashOfConfig":"12232"},{"size":9040,"mtime":1786084511398,"results":"14771","hashOfConfig":"12232"},{"size":5277,"mtime":1786084511398,"results":"14772","hashOfConfig":"12232"},{"size":4204,"mtime":1786084511398,"results":"14773","hashOfConfig":"12232"},{"size":4501,"mtime":1786084511398,"results":"14774","hashOfConfig":"12232"},{"size":3739,"mtime":1786084511398,"results":"14775","hashOfConfig":"12232"},{"size":5792,"mtime":1786084511398,"results":"14776","hashOfConfig":"12232"},{"size":4452,"mtime":1786084511398,"results":"14777","hashOfConfig":"12232"},{"size":8790,"mtime":1786084511399,"results":"14778","hashOfConfig":"12232"},{"size":14055,"mtime":1786084511399,"results":"14779","hashOfConfig":"12232"},{"size":2839,"mtime":1786084511399,"results":"14780","hashOfConfig":"12232"},{"size":4543,"mtime":1786084511399,"results":"14781","hashOfConfig":"12232"},{"size":19232,"mtime":1786084511399,"results":"14782","hashOfConfig":"12232"},{"size":1764,"mtime":1786084511399,"results":"14783","hashOfConfig":"12232"},{"size":2007,"mtime":1786084511399,"results":"14784","hashOfConfig":"12232"},{"size":7258,"mtime":1786084511400,"results":"14785","hashOfConfig":"12232"},{"size":1743,"mtime":1786084511400,"results":"14786","hashOfConfig":"12232"},{"size":4224,"mtime":1786084511400,"results":"14787","hashOfConfig":"12232"},{"size":3692,"mtime":1786084511400,"results":"14788","hashOfConfig":"12232"},{"size":2959,"mtime":1786084511400,"results":"14789","hashOfConfig":"12232"},{"size":3818,"mtime":1786084511400,"results":"14790","hashOfConfig":"12232"},{"size":2828,"mtime":1786084511400,"results":"14791","hashOfConfig":"12232"},{"size":4595,"mtime":1786084511400,"results":"14792","hashOfConfig":"12232"},{"size":1803,"mtime":1786084511401,"results":"14793","hashOfConfig":"12232"},{"size":3773,"mtime":1786084511401,"results":"14794","hashOfConfig":"12232"},{"size":3666,"mtime":1786084511401,"results":"14795","hashOfConfig":"12232"},{"size":2602,"mtime":1786084511401,"results":"14796","hashOfConfig":"12232"},{"size":2849,"mtime":1786084511401,"results":"14797","hashOfConfig":"12232"},{"size":5418,"mtime":1786084511401,"results":"14798","hashOfConfig":"12232"},{"size":1011,"mtime":1786084511401,"results":"14799","hashOfConfig":"12232"},{"size":1321,"mtime":1786084511401,"results":"14800","hashOfConfig":"12232"},{"size":7164,"mtime":1786084511402,"results":"14801","hashOfConfig":"12232"},{"size":2024,"mtime":1786084511402,"results":"14802","hashOfConfig":"12232"},{"size":2420,"mtime":1786084511402,"results":"14803","hashOfConfig":"12232"},{"size":2728,"mtime":1786084511402,"results":"14804","hashOfConfig":"12232"},{"size":12693,"mtime":1786084511402,"results":"14805","hashOfConfig":"12232"},{"size":4859,"mtime":1786084511402,"results":"14806","hashOfConfig":"12232"},{"size":2185,"mtime":1786084511402,"results":"14807","hashOfConfig":"12232"},{"size":1588,"mtime":1786084511403,"results":"14808","hashOfConfig":"12232"},{"size":3346,"mtime":1786084511403,"results":"14809","hashOfConfig":"12232"},{"size":1053,"mtime":1786084511403,"results":"14810","hashOfConfig":"12232"},{"size":1097,"mtime":1786084511403,"results":"14811","hashOfConfig":"12232"},{"size":2853,"mtime":1786084511403,"results":"14812","hashOfConfig":"12232"},{"size":3552,"mtime":1786084511403,"results":"14813","hashOfConfig":"12232"},{"size":10064,"mtime":1786084511403,"results":"14814","hashOfConfig":"12232"},{"size":1057,"mtime":1786084511403,"results":"14815","hashOfConfig":"12232"},{"size":5430,"mtime":1786084511403,"results":"14816","hashOfConfig":"12232"},{"size":3303,"mtime":1786084511404,"results":"14817","hashOfConfig":"12232"},{"size":9912,"mtime":1786084511404,"results":"14818","hashOfConfig":"12232"},{"size":1433,"mtime":1786084511404,"results":"14819","hashOfConfig":"12232"},{"size":10522,"mtime":1786084511404,"results":"14820","hashOfConfig":"12232"},{"size":2149,"mtime":1786084511404,"results":"14821","hashOfConfig":"12232"},{"size":1376,"mtime":1786084511404,"results":"14822","hashOfConfig":"12232"},{"size":1971,"mtime":1786084511404,"results":"14823","hashOfConfig":"12232"},{"size":3466,"mtime":1786084511404,"results":"14824","hashOfConfig":"12232"},{"size":5473,"mtime":1786084511404,"results":"14825","hashOfConfig":"12232"},{"size":3236,"mtime":1786084511405,"results":"14826","hashOfConfig":"12232"},{"size":1805,"mtime":1786084511405,"results":"14827","hashOfConfig":"12232"},{"size":3431,"mtime":1786084511405,"results":"14828","hashOfConfig":"12232"},{"size":7275,"mtime":1786084511405,"results":"14829","hashOfConfig":"12232"},{"size":1198,"mtime":1786084511405,"results":"14830","hashOfConfig":"12232"},{"size":1440,"mtime":1786084511405,"results":"14831","hashOfConfig":"12232"},{"size":2619,"mtime":1786084511405,"results":"14832","hashOfConfig":"12232"},{"size":6629,"mtime":1786084511405,"results":"14833","hashOfConfig":"12232"},{"size":9550,"mtime":1786084511406,"results":"14834","hashOfConfig":"12232"},{"size":3038,"mtime":1786084511406,"results":"14835","hashOfConfig":"12232"},{"size":1595,"mtime":1786084511406,"results":"14836","hashOfConfig":"12232"},{"size":4304,"mtime":1786084511406,"results":"14837","hashOfConfig":"12232"},{"size":3578,"mtime":1786084511406,"results":"14838","hashOfConfig":"12232"},{"size":6596,"mtime":1786084511406,"results":"14839","hashOfConfig":"12232"},{"size":2552,"mtime":1786084511406,"results":"14840","hashOfConfig":"12232"},{"size":3565,"mtime":1786084511406,"results":"14841","hashOfConfig":"12232"},{"size":1860,"mtime":1786084511407,"results":"14842","hashOfConfig":"12232"},{"size":1245,"mtime":1786084511407,"results":"14843","hashOfConfig":"12232"},{"size":947,"mtime":1786084511407,"results":"14844","hashOfConfig":"12232"},{"size":3423,"mtime":1786084511407,"results":"14845","hashOfConfig":"12232"},{"size":2478,"mtime":1786084511407,"results":"14846","hashOfConfig":"12232"},{"size":28925,"mtime":1786084511407,"results":"14847","hashOfConfig":"12232"},{"size":14337,"mtime":1786084511408,"results":"14848","hashOfConfig":"12232"},{"size":14763,"mtime":1786084511408,"results":"14849","hashOfConfig":"12232"},{"size":4117,"mtime":1786084511408,"results":"14850","hashOfConfig":"12232"},{"size":8070,"mtime":1786084511408,"results":"14851","hashOfConfig":"12232"},{"size":1909,"mtime":1786084511408,"results":"14852","hashOfConfig":"12232"},{"size":5560,"mtime":1786084511408,"results":"14853","hashOfConfig":"12232"},{"size":7088,"mtime":1786084511408,"results":"14854","hashOfConfig":"12232"},{"size":7971,"mtime":1786084511409,"results":"14855","hashOfConfig":"12232"},{"size":2856,"mtime":1786084511409,"results":"14856","hashOfConfig":"12232"},{"size":6191,"mtime":1786084511409,"results":"14857","hashOfConfig":"12232"},{"size":18123,"mtime":1786084511409,"results":"14858","hashOfConfig":"12232"},{"size":3671,"mtime":1786084511409,"results":"14859","hashOfConfig":"12232"},{"size":11755,"mtime":1786084511409,"results":"14860","hashOfConfig":"12232"},{"size":7170,"mtime":1786084511410,"results":"14861","hashOfConfig":"12232"},{"size":16805,"mtime":1786084511410,"results":"14862","hashOfConfig":"12232"},{"size":7854,"mtime":1786084511410,"results":"14863","hashOfConfig":"12232"},{"size":4828,"mtime":1786084511410,"results":"14864","hashOfConfig":"12232"},{"size":7132,"mtime":1786084511410,"results":"14865","hashOfConfig":"12232"},{"size":2276,"mtime":1786084511410,"results":"14866","hashOfConfig":"12232"},{"size":9833,"mtime":1786084511410,"results":"14867","hashOfConfig":"12232"},{"size":12013,"mtime":1786084511411,"results":"14868","hashOfConfig":"8189"},{"size":2844,"mtime":1786084511411,"results":"14869","hashOfConfig":"12232"},{"size":1066,"mtime":1786084511411,"results":"14870","hashOfConfig":"12232"},{"size":7721,"mtime":1786084511411,"results":"14871","hashOfConfig":"12232"},{"size":1371,"mtime":1786084511411,"results":"14872","hashOfConfig":"12232"},{"size":1821,"mtime":1786084511411,"results":"14873","hashOfConfig":"12232"},{"size":1453,"mtime":1786084511411,"results":"14874","hashOfConfig":"12232"},{"size":1218,"mtime":1786084511411,"results":"14875","hashOfConfig":"12232"},{"size":2402,"mtime":1786084511412,"results":"14876","hashOfConfig":"12232"},{"size":1986,"mtime":1786084511412,"results":"14877","hashOfConfig":"12232"},{"size":3766,"mtime":1786084511412,"results":"14878","hashOfConfig":"12232"},{"size":4211,"mtime":1786084511412,"results":"14879","hashOfConfig":"12232"},{"size":5384,"mtime":1786084511412,"results":"14880","hashOfConfig":"12232"},{"size":4205,"mtime":1786084511412,"results":"14881","hashOfConfig":"12232"},{"size":2557,"mtime":1786084511412,"results":"14882","hashOfConfig":"12232"},{"size":2386,"mtime":1786084511412,"results":"14883","hashOfConfig":"12232"},{"size":8535,"mtime":1786084511413,"results":"14884","hashOfConfig":"12232"},{"size":2441,"mtime":1786084511413,"results":"14885","hashOfConfig":"12232"},{"size":2505,"mtime":1786084511413,"results":"14886","hashOfConfig":"12232"},{"size":2926,"mtime":1786084511413,"results":"14887","hashOfConfig":"12232"},{"size":4174,"mtime":1786084511413,"results":"14888","hashOfConfig":"12232"},{"size":7486,"mtime":1786084511413,"results":"14889","hashOfConfig":"12232"},{"size":6829,"mtime":1786084511413,"results":"14890","hashOfConfig":"12232"},{"size":3143,"mtime":1786084511413,"results":"14891","hashOfConfig":"12232"},{"size":2992,"mtime":1786084511414,"results":"14892","hashOfConfig":"12232"},{"size":1772,"mtime":1786084511414,"results":"14893","hashOfConfig":"12232"},{"size":2358,"mtime":1786084511414,"results":"14894","hashOfConfig":"12232"},{"size":4464,"mtime":1786084511414,"results":"14895","hashOfConfig":"12232"},{"size":1981,"mtime":1786084511414,"results":"14896","hashOfConfig":"12232"},{"size":2754,"mtime":1786084511414,"results":"14897","hashOfConfig":"12232"},{"size":3312,"mtime":1786084511414,"results":"14898","hashOfConfig":"12232"},{"size":4477,"mtime":1786084511414,"results":"14899","hashOfConfig":"12232"},{"size":4348,"mtime":1786084511415,"results":"14900","hashOfConfig":"12232"},{"size":557,"mtime":1786084511415,"results":"14901","hashOfConfig":"12232"},{"size":4703,"mtime":1786084511415,"results":"14902","hashOfConfig":"12232"},{"size":1625,"mtime":1786084511415,"results":"14903","hashOfConfig":"12232"},{"size":5420,"mtime":1786084511415,"results":"14904","hashOfConfig":"12232"},{"size":3484,"mtime":1786084511415,"results":"14905","hashOfConfig":"12232"},{"size":25849,"mtime":1786084511415,"results":"14906","hashOfConfig":"12232"},{"size":1161,"mtime":1786084511416,"results":"14907","hashOfConfig":"12232"},{"size":2454,"mtime":1786084511416,"results":"14908","hashOfConfig":"12232"},{"size":7045,"mtime":1786084511416,"results":"14909","hashOfConfig":"12232"},{"size":7829,"mtime":1786084511416,"results":"14910","hashOfConfig":"12232"},{"size":1287,"mtime":1786084511416,"results":"14911","hashOfConfig":"12232"},{"size":14506,"mtime":1786084511416,"results":"14912","hashOfConfig":"12232"},{"size":6805,"mtime":1786084511416,"results":"14913","hashOfConfig":"12232"},{"size":9248,"mtime":1786084511416,"results":"14914","hashOfConfig":"12232"},{"size":14281,"mtime":1786084511417,"results":"14915","hashOfConfig":"12232"},{"size":1843,"mtime":1786084511417,"results":"14916","hashOfConfig":"12232"},{"size":7969,"mtime":1786084511417,"results":"14917","hashOfConfig":"12232"},{"size":3999,"mtime":1786084511417,"results":"14918","hashOfConfig":"12232"},{"size":2103,"mtime":1786084511417,"results":"14919","hashOfConfig":"12232"},{"size":5256,"mtime":1786084511417,"results":"14920","hashOfConfig":"12232"},{"size":8613,"mtime":1786084511417,"results":"14921","hashOfConfig":"12232"},{"size":3522,"mtime":1786084511418,"results":"14922","hashOfConfig":"12232"},{"size":7858,"mtime":1786084511418,"results":"14923","hashOfConfig":"12232"},{"size":13384,"mtime":1786084511418,"results":"14924","hashOfConfig":"12232"},{"size":3509,"mtime":1786084511418,"results":"14925","hashOfConfig":"12232"},{"size":4816,"mtime":1786084511418,"results":"14926","hashOfConfig":"12232"},{"size":4963,"mtime":1786084511418,"results":"14927","hashOfConfig":"12232"},{"size":7218,"mtime":1786084511418,"results":"14928","hashOfConfig":"12232"},{"size":6603,"mtime":1786084511419,"results":"14929","hashOfConfig":"12232"},{"size":2834,"mtime":1786084511419,"results":"14930","hashOfConfig":"12232"},{"size":6478,"mtime":1786084511419,"results":"14931","hashOfConfig":"12232"},{"size":2058,"mtime":1786084511419,"results":"14932","hashOfConfig":"12232"},{"size":6898,"mtime":1786084511419,"results":"14933","hashOfConfig":"12232"},{"size":6546,"mtime":1786084511419,"results":"14934","hashOfConfig":"12232"},{"size":1951,"mtime":1786084511419,"results":"14935","hashOfConfig":"12232"},{"size":7147,"mtime":1786084511419,"results":"14936","hashOfConfig":"12232"},{"size":1849,"mtime":1786084511419,"results":"14937","hashOfConfig":"12232"},{"size":6722,"mtime":1786084511420,"results":"14938","hashOfConfig":"12232"},{"size":2294,"mtime":1786084511420,"results":"14939","hashOfConfig":"12232"},{"size":2864,"mtime":1786084511420,"results":"14940","hashOfConfig":"12232"},{"size":10387,"mtime":1786084511420,"results":"14941","hashOfConfig":"12232"},{"size":1420,"mtime":1786084511420,"results":"14942","hashOfConfig":"12232"},{"size":4640,"mtime":1786084511420,"results":"14943","hashOfConfig":"12232"},{"size":1904,"mtime":1786084511420,"results":"14944","hashOfConfig":"12232"},{"size":2887,"mtime":1786084511420,"results":"14945","hashOfConfig":"12232"},{"size":6065,"mtime":1786084511420,"results":"14946","hashOfConfig":"12232"},{"size":4091,"mtime":1786084511420,"results":"14947","hashOfConfig":"12232"},{"size":6110,"mtime":1786084511421,"results":"14948","hashOfConfig":"12232"},{"size":1517,"mtime":1786084511421,"results":"14949","hashOfConfig":"12232"},{"size":1603,"mtime":1786084511421,"results":"14950","hashOfConfig":"12232"},{"size":1903,"mtime":1786084511421,"results":"14951","hashOfConfig":"12232"},{"size":1612,"mtime":1786084511421,"results":"14952","hashOfConfig":"12232"},{"size":1837,"mtime":1786084511421,"results":"14953","hashOfConfig":"12232"},{"size":5762,"mtime":1786084511421,"results":"14954","hashOfConfig":"12232"},{"size":42635,"mtime":1786084511421,"results":"14955","hashOfConfig":"12232"},{"size":7857,"mtime":1786084511422,"results":"14956","hashOfConfig":"12232"},{"size":2166,"mtime":1786084511422,"results":"14957","hashOfConfig":"12232"},{"size":3723,"mtime":1786084511422,"results":"14958","hashOfConfig":"12232"},{"size":7151,"mtime":1786084511422,"results":"14959","hashOfConfig":"12232"},{"size":6987,"mtime":1786084511422,"results":"14960","hashOfConfig":"12232"},{"size":8946,"mtime":1786084511422,"results":"14961","hashOfConfig":"12232"},{"size":3515,"mtime":1786084511422,"results":"14962","hashOfConfig":"12232"},{"size":13487,"mtime":1786084511422,"results":"14963","hashOfConfig":"12232"},{"size":14667,"mtime":1786084511423,"results":"14964","hashOfConfig":"12232"},{"size":19943,"mtime":1786084511423,"results":"14965","hashOfConfig":"12232"},{"size":27726,"mtime":1786084511423,"results":"14966","hashOfConfig":"12232"},{"size":3097,"mtime":1786084511423,"results":"14967","hashOfConfig":"12232"},{"size":1770,"mtime":1786084511423,"results":"14968","hashOfConfig":"12232"},{"size":1759,"mtime":1786084511423,"results":"14969","hashOfConfig":"12232"},{"size":3383,"mtime":1786084511423,"results":"14970","hashOfConfig":"12232"},{"size":9622,"mtime":1786084511424,"results":"14971","hashOfConfig":"12232"},{"size":3745,"mtime":1786084511424,"results":"14972","hashOfConfig":"12232"},{"size":10733,"mtime":1786084511424,"results":"14973","hashOfConfig":"12232"},{"size":6963,"mtime":1786084511424,"results":"14974","hashOfConfig":"12232"},{"size":2763,"mtime":1786084511425,"results":"14975","hashOfConfig":"12232"},{"size":1602,"mtime":1786084511425,"results":"14976","hashOfConfig":"12232"},{"size":8307,"mtime":1786084511425,"results":"14977","hashOfConfig":"12232"},{"size":2803,"mtime":1786084511425,"results":"14978","hashOfConfig":"12232"},{"size":3689,"mtime":1786084511425,"results":"14979","hashOfConfig":"12232"},{"size":4073,"mtime":1786084511425,"results":"14980","hashOfConfig":"12232"},{"size":1238,"mtime":1786084511425,"results":"14981","hashOfConfig":"12232"},{"size":2915,"mtime":1786084511425,"results":"14982","hashOfConfig":"12232"},{"size":16415,"mtime":1786084511426,"results":"14983","hashOfConfig":"12232"},{"size":1595,"mtime":1786084511426,"results":"14984","hashOfConfig":"12232"},{"size":21249,"mtime":1786084511426,"results":"14985","hashOfConfig":"12232"},{"size":2489,"mtime":1786084511426,"results":"14986","hashOfConfig":"12232"},{"size":2804,"mtime":1786084511426,"results":"14987","hashOfConfig":"12232"},{"size":6458,"mtime":1786084511426,"results":"14988","hashOfConfig":"12232"},{"size":6203,"mtime":1786084511427,"results":"14989","hashOfConfig":"12232"},{"size":2288,"mtime":1786084511427,"results":"14990","hashOfConfig":"12232"},{"size":8844,"mtime":1786084511427,"results":"14991","hashOfConfig":"12232"},{"size":1678,"mtime":1786084511427,"results":"14992","hashOfConfig":"12232"},{"size":4906,"mtime":1786084511427,"results":"14993","hashOfConfig":"12232"},{"size":5624,"mtime":1786084511427,"results":"14994","hashOfConfig":"12232"},{"size":1835,"mtime":1786084511427,"results":"14995","hashOfConfig":"12232"},{"size":6044,"mtime":1786084511427,"results":"14996","hashOfConfig":"12232"},{"size":5946,"mtime":1786084511427,"results":"14997","hashOfConfig":"12232"},{"size":3058,"mtime":1786084511428,"results":"14998","hashOfConfig":"12232"},{"size":2057,"mtime":1786084511428,"results":"14999","hashOfConfig":"12232"},{"size":5051,"mtime":1786084511428,"results":"15000","hashOfConfig":"12232"},{"size":3061,"mtime":1786084511428,"results":"15001","hashOfConfig":"12232"},{"size":1698,"mtime":1786084511428,"results":"15002","hashOfConfig":"12232"},{"size":4244,"mtime":1786084511428,"results":"15003","hashOfConfig":"12232"},{"size":13598,"mtime":1786084511428,"results":"15004","hashOfConfig":"12232"},{"size":8125,"mtime":1786084511428,"results":"15005","hashOfConfig":"12232"},{"size":14102,"mtime":1786084511429,"results":"15006","hashOfConfig":"12232"},{"size":5896,"mtime":1786084511429,"results":"15007","hashOfConfig":"12232"},{"size":12415,"mtime":1786084511429,"results":"15008","hashOfConfig":"12232"},{"size":3018,"mtime":1786084511429,"results":"15009","hashOfConfig":"12232"},{"size":3415,"mtime":1786084511429,"results":"15010","hashOfConfig":"12232"},{"size":2639,"mtime":1786084511429,"results":"15011","hashOfConfig":"12232"},{"size":1617,"mtime":1786084511429,"results":"15012","hashOfConfig":"12232"},{"size":1652,"mtime":1786084511430,"results":"15013","hashOfConfig":"12232"},{"size":3276,"mtime":1786084511430,"results":"15014","hashOfConfig":"12232"},{"size":2579,"mtime":1786084511430,"results":"15015","hashOfConfig":"12232"},{"size":3350,"mtime":1786084511430,"results":"15016","hashOfConfig":"12232"},{"size":2252,"mtime":1786084511430,"results":"15017","hashOfConfig":"12232"},{"size":2765,"mtime":1786084511430,"results":"15018","hashOfConfig":"12232"},{"size":3709,"mtime":1786084511430,"results":"15019","hashOfConfig":"12232"},{"size":5218,"mtime":1786084511430,"results":"15020","hashOfConfig":"12232"},{"size":819,"mtime":1786084511430,"results":"15021","hashOfConfig":"12232"},{"size":8063,"mtime":1786084511431,"results":"15022","hashOfConfig":"12232"},{"size":1687,"mtime":1786084511431,"results":"15023","hashOfConfig":"12232"},{"size":2390,"mtime":1786084511431,"results":"15024","hashOfConfig":"12232"},{"size":2423,"mtime":1786084511431,"results":"15025","hashOfConfig":"12232"},{"size":1203,"mtime":1786084511431,"results":"15026","hashOfConfig":"12232"},{"size":2021,"mtime":1786084511431,"results":"15027","hashOfConfig":"12232"},{"size":3708,"mtime":1786084511431,"results":"15028","hashOfConfig":"12232"},{"size":4530,"mtime":1786084511431,"results":"15029","hashOfConfig":"12232"},{"size":2788,"mtime":1786084511431,"results":"15030","hashOfConfig":"12232"},{"size":8636,"mtime":1786084511432,"results":"15031","hashOfConfig":"12232"},{"size":5067,"mtime":1786084511432,"results":"15032","hashOfConfig":"12232"},{"size":4906,"mtime":1786084511432,"results":"15033","hashOfConfig":"12232"},{"size":1553,"mtime":1786084511432,"results":"15034","hashOfConfig":"12232"},{"size":3284,"mtime":1786084511432,"results":"15035","hashOfConfig":"12232"},{"size":4860,"mtime":1786084511432,"results":"15036","hashOfConfig":"12232"},{"size":1060,"mtime":1786084511432,"results":"15037","hashOfConfig":"12232"},{"size":3002,"mtime":1786084511433,"results":"15038","hashOfConfig":"12232"},{"size":10717,"mtime":1786084511433,"results":"15039","hashOfConfig":"12232"},{"size":2682,"mtime":1786084511433,"results":"15040","hashOfConfig":"12232"},{"size":2824,"mtime":1786084511433,"results":"15041","hashOfConfig":"12232"},{"size":2901,"mtime":1786084511433,"results":"15042","hashOfConfig":"12232"},{"size":4174,"mtime":1786084511433,"results":"15043","hashOfConfig":"12232"},{"size":3070,"mtime":1786084511433,"results":"15044","hashOfConfig":"12232"},{"size":742,"mtime":1786084511433,"results":"15045","hashOfConfig":"12232"},{"size":6630,"mtime":1786084511434,"results":"15046","hashOfConfig":"12232"},{"size":2872,"mtime":1786084511434,"results":"15047","hashOfConfig":"12232"},{"size":4266,"mtime":1786084511434,"results":"15048","hashOfConfig":"12232"},{"size":2120,"mtime":1786084511434,"results":"15049","hashOfConfig":"12232"},{"size":636,"mtime":1786084511434,"results":"15050","hashOfConfig":"12232"},{"size":2538,"mtime":1786084511434,"results":"15051","hashOfConfig":"12232"},{"size":7065,"mtime":1786084511434,"results":"15052","hashOfConfig":"12232"},{"size":2960,"mtime":1786084511434,"results":"15053","hashOfConfig":"12232"},{"size":4126,"mtime":1786084511435,"results":"15054","hashOfConfig":"12232"},{"size":4699,"mtime":1786084511435,"results":"15055","hashOfConfig":"12232"},{"size":2944,"mtime":1786084511435,"results":"15056","hashOfConfig":"12232"},{"size":4787,"mtime":1786084511435,"results":"15057","hashOfConfig":"12232"},{"size":6032,"mtime":1786084511435,"results":"15058","hashOfConfig":"12232"},{"size":2039,"mtime":1786084511435,"results":"15059","hashOfConfig":"12232"},{"size":4913,"mtime":1786084511435,"results":"15060","hashOfConfig":"12232"},{"size":3812,"mtime":1786084511435,"results":"15061","hashOfConfig":"12232"},{"size":7528,"mtime":1786084511436,"results":"15062","hashOfConfig":"12232"},{"size":2397,"mtime":1786084511436,"results":"15063","hashOfConfig":"12232"},{"size":1225,"mtime":1786084511436,"results":"15064","hashOfConfig":"12232"},{"size":944,"mtime":1786084511436,"results":"15065","hashOfConfig":"12232"},{"size":1318,"mtime":1786084511436,"results":"15066","hashOfConfig":"12232"},{"size":3258,"mtime":1786084511436,"results":"15067","hashOfConfig":"12232"},{"size":2546,"mtime":1786084511436,"results":"15068","hashOfConfig":"12232"},{"size":3103,"mtime":1786084511436,"results":"15069","hashOfConfig":"12232"},{"size":3612,"mtime":1786084511436,"results":"15070","hashOfConfig":"12232"},{"size":4007,"mtime":1786084511436,"results":"15071","hashOfConfig":"12232"},{"size":5261,"mtime":1786084511437,"results":"15072","hashOfConfig":"12232"},{"size":4155,"mtime":1786084511437,"results":"15073","hashOfConfig":"12232"},{"size":7520,"mtime":1786084529049,"results":"15074","hashOfConfig":"12232"},{"size":13128,"mtime":1786084511437,"results":"15075","hashOfConfig":"12232"},{"size":3669,"mtime":1786084511437,"results":"15076","hashOfConfig":"12232"},{"size":4638,"mtime":1786084511437,"results":"15077","hashOfConfig":"12232"},{"size":884,"mtime":1786084511437,"results":"15078","hashOfConfig":"12232"},{"size":14448,"mtime":1786084511437,"results":"15079","hashOfConfig":"12232"},{"size":2639,"mtime":1786084511438,"results":"15080","hashOfConfig":"12232"},{"size":5238,"mtime":1786084511438,"results":"15081","hashOfConfig":"12232"},{"size":3915,"mtime":1786084511438,"results":"15082","hashOfConfig":"12232"},{"size":10275,"mtime":1786084511438,"results":"15083","hashOfConfig":"12232"},{"size":5402,"mtime":1786084511438,"results":"15084","hashOfConfig":"12232"},{"size":4932,"mtime":1786084511438,"results":"15085","hashOfConfig":"12232"},{"size":21649,"mtime":1786084511439,"results":"15086","hashOfConfig":"12232"},{"size":7250,"mtime":1786084511439,"results":"15087","hashOfConfig":"12232"},{"size":3949,"mtime":1786084511439,"results":"15088","hashOfConfig":"12232"},{"size":15649,"mtime":1786084511439,"results":"15089","hashOfConfig":"12232"},{"size":6312,"mtime":1786084511439,"results":"15090","hashOfConfig":"12232"},{"size":62729,"mtime":1786086084025,"results":"15091","hashOfConfig":"12232"},{"size":2779,"mtime":1786084511439,"results":"15092","hashOfConfig":"12232"},{"size":4559,"mtime":1786084511439,"results":"15093","hashOfConfig":"12232"},{"size":5934,"mtime":1786084511440,"results":"15094","hashOfConfig":"12232"},{"size":1758,"mtime":1786084511440,"results":"15095","hashOfConfig":"12232"},{"size":9373,"mtime":1786084511440,"results":"15096","hashOfConfig":"12232"},{"size":2548,"mtime":1786084511440,"results":"15097","hashOfConfig":"12232"},{"size":11946,"mtime":1786084511440,"results":"15098","hashOfConfig":"12232"},{"size":2946,"mtime":1786084511440,"results":"15099","hashOfConfig":"12232"},{"size":8705,"mtime":1786084511440,"results":"15100","hashOfConfig":"12232"},{"size":4586,"mtime":1786084511440,"results":"15101","hashOfConfig":"12232"},{"size":1611,"mtime":1786084511441,"results":"15102","hashOfConfig":"12232"},{"size":10567,"mtime":1786084511441,"results":"15103","hashOfConfig":"12232"},{"size":11114,"mtime":1786084511441,"results":"15104","hashOfConfig":"12232"},{"size":1283,"mtime":1786084511441,"results":"15105","hashOfConfig":"12232"},{"size":4323,"mtime":1786084511441,"results":"15106","hashOfConfig":"12232"},{"size":6284,"mtime":1786084511441,"results":"15107","hashOfConfig":"12232"},{"size":680,"mtime":1786084511441,"results":"15108","hashOfConfig":"12232"},{"size":930,"mtime":1786084511441,"results":"15109","hashOfConfig":"12232"},{"size":2403,"mtime":1786084511442,"results":"15110","hashOfConfig":"12232"},{"size":2867,"mtime":1786084511442,"results":"15111","hashOfConfig":"12232"},{"size":2517,"mtime":1786084511442,"results":"15112","hashOfConfig":"12232"},{"size":1810,"mtime":1786084511442,"results":"15113","hashOfConfig":"12232"},{"size":3380,"mtime":1786084511442,"results":"15114","hashOfConfig":"12232"},{"size":1347,"mtime":1786084511442,"results":"15115","hashOfConfig":"12232"},{"size":2202,"mtime":1786084511442,"results":"15116","hashOfConfig":"12232"},{"size":1255,"mtime":1786084511442,"results":"15117","hashOfConfig":"12232"},{"size":2800,"mtime":1786084511442,"results":"15118","hashOfConfig":"12232"},{"size":4890,"mtime":1786084511443,"results":"15119","hashOfConfig":"12232"},{"size":2258,"mtime":1786084511443,"results":"15120","hashOfConfig":"12232"},{"size":6373,"mtime":1786084511443,"results":"15121","hashOfConfig":"12232"},{"size":16702,"mtime":1786084511443,"results":"15122","hashOfConfig":"12232"},{"size":3985,"mtime":1786084511443,"results":"15123","hashOfConfig":"12232"},{"size":859,"mtime":1786084511443,"results":"15124","hashOfConfig":"12232"},{"size":1871,"mtime":1786084511443,"results":"15125","hashOfConfig":"12232"},{"size":3760,"mtime":1786084511444,"results":"15126","hashOfConfig":"12232"},{"size":7280,"mtime":1786084511444,"results":"15127","hashOfConfig":"12232"},{"size":784,"mtime":1786084511444,"results":"15128","hashOfConfig":"12232"},{"size":3232,"mtime":1786084511444,"results":"15129","hashOfConfig":"12232"},{"size":4989,"mtime":1786084511444,"results":"15130","hashOfConfig":"12232"},{"size":1369,"mtime":1786084511444,"results":"15131","hashOfConfig":"12232"},{"size":2912,"mtime":1786084511444,"results":"15132","hashOfConfig":"12232"},{"size":9331,"mtime":1786084511445,"results":"15133","hashOfConfig":"12232"},{"size":6723,"mtime":1786084511445,"results":"15134","hashOfConfig":"12232"},{"size":1476,"mtime":1786084511445,"results":"15135","hashOfConfig":"12232"},{"size":1153,"mtime":1786084511445,"results":"15136","hashOfConfig":"12232"},{"size":973,"mtime":1786084511445,"results":"15137","hashOfConfig":"12232"},{"size":3515,"mtime":1786084511445,"results":"15138","hashOfConfig":"12232"},{"size":7795,"mtime":1786084511445,"results":"15139","hashOfConfig":"12232"},{"size":2332,"mtime":1786084511446,"results":"15140","hashOfConfig":"12232"},{"size":12393,"mtime":1786084511446,"results":"15141","hashOfConfig":"12232"},{"size":2449,"mtime":1786084511446,"results":"15142","hashOfConfig":"12232"},{"size":7909,"mtime":1786084511446,"results":"15143","hashOfConfig":"12232"},{"size":3438,"mtime":1786084511446,"results":"15144","hashOfConfig":"12232"},{"size":3785,"mtime":1786084511446,"results":"15145","hashOfConfig":"12232"},{"size":111240,"mtime":1786084511447,"results":"15146","hashOfConfig":"12232"},{"size":2281,"mtime":1786084511447,"results":"15147","hashOfConfig":"12232"},{"size":1904,"mtime":1786084511447,"results":"15148","hashOfConfig":"12232"},{"size":4144,"mtime":1786084511447,"results":"15149","hashOfConfig":"12232"},{"size":2922,"mtime":1786084511448,"results":"15150","hashOfConfig":"12232"},{"size":603,"mtime":1786084511448,"results":"15151","hashOfConfig":"12232"},{"size":14488,"mtime":1786084511448,"results":"15152","hashOfConfig":"12232"},{"size":4159,"mtime":1786084511448,"results":"15153","hashOfConfig":"12232"},{"size":3520,"mtime":1786084511448,"results":"15154","hashOfConfig":"12232"},{"size":6069,"mtime":1786084511448,"results":"15155","hashOfConfig":"12232"},{"size":4840,"mtime":1786084511448,"results":"15156","hashOfConfig":"12232"},{"size":5188,"mtime":1786084511449,"results":"15157","hashOfConfig":"12232"},{"size":6428,"mtime":1786084511449,"results":"15158","hashOfConfig":"12232"},{"size":3509,"mtime":1786084511449,"results":"15159","hashOfConfig":"12232"},{"size":9040,"mtime":1786084511449,"results":"15160","hashOfConfig":"12232"},{"size":42111,"mtime":1786084511450,"results":"15161","hashOfConfig":"12232"},{"size":13081,"mtime":1786084511450,"results":"15162","hashOfConfig":"12232"},{"size":1234,"mtime":1786084511450,"results":"15163","hashOfConfig":"12232"},{"size":10220,"mtime":1786084511450,"results":"15164","hashOfConfig":"12232"},{"size":8148,"mtime":1786084511450,"results":"15165","hashOfConfig":"12232"},{"size":5217,"mtime":1786084511450,"results":"15166","hashOfConfig":"12232"},{"size":2219,"mtime":1786084511451,"results":"15167","hashOfConfig":"12232"},{"size":3794,"mtime":1786084511451,"results":"15168","hashOfConfig":"12232"},{"size":4553,"mtime":1786084511451,"results":"15169","hashOfConfig":"12232"},{"size":2973,"mtime":1786084511451,"results":"15170","hashOfConfig":"12232"},{"size":8086,"mtime":1786084511451,"results":"15171","hashOfConfig":"12232"},{"size":13541,"mtime":1786084511451,"results":"15172","hashOfConfig":"12232"},{"size":989,"mtime":1786084511451,"results":"15173","hashOfConfig":"12232"},{"size":6524,"mtime":1786084511452,"results":"15174","hashOfConfig":"12232"},{"size":1780,"mtime":1786084511452,"results":"15175","hashOfConfig":"12232"},{"size":2577,"mtime":1786084511452,"results":"15176","hashOfConfig":"12232"},{"size":8257,"mtime":1786084511452,"results":"15177","hashOfConfig":"12232"},{"size":1187,"mtime":1786084511452,"results":"15178","hashOfConfig":"12232"},{"size":1753,"mtime":1786084511452,"results":"15179","hashOfConfig":"12232"},{"size":2906,"mtime":1786084511452,"results":"15180","hashOfConfig":"12232"},{"size":861,"mtime":1786084511452,"results":"15181","hashOfConfig":"12232"},{"size":2696,"mtime":1786084511452,"results":"15182","hashOfConfig":"12232"},{"size":1130,"mtime":1786084511453,"results":"15183","hashOfConfig":"12232"},{"size":1271,"mtime":1786084511453,"results":"15184","hashOfConfig":"12232"},{"size":7564,"mtime":1786084511453,"results":"15185","hashOfConfig":"12232"},{"size":6976,"mtime":1786084511453,"results":"15186","hashOfConfig":"12232"},{"size":3646,"mtime":1786084511453,"results":"15187","hashOfConfig":"12232"},{"size":1179,"mtime":1786084511453,"results":"15188","hashOfConfig":"12232"},{"size":2648,"mtime":1786084511453,"results":"15189","hashOfConfig":"12232"},{"size":1408,"mtime":1786084511453,"results":"15190","hashOfConfig":"12232"},{"size":3176,"mtime":1786084511454,"results":"15191","hashOfConfig":"12232"},{"size":2421,"mtime":1786084511454,"results":"15192","hashOfConfig":"12232"},{"size":25839,"mtime":1786084511454,"results":"15193","hashOfConfig":"12232"},{"size":1217,"mtime":1786084511454,"results":"15194","hashOfConfig":"12232"},{"size":3649,"mtime":1786084511454,"results":"15195","hashOfConfig":"12232"},{"size":8814,"mtime":1786084511454,"results":"15196","hashOfConfig":"12232"},{"size":4604,"mtime":1786084511455,"results":"15197","hashOfConfig":"12232"},{"size":7909,"mtime":1786084511455,"results":"15198","hashOfConfig":"12232"},{"size":6328,"mtime":1786084511455,"results":"15199","hashOfConfig":"12232"},{"size":6739,"mtime":1786084511455,"results":"15200","hashOfConfig":"12232"},{"size":13522,"mtime":1786084511455,"results":"15201","hashOfConfig":"12232"},{"size":3247,"mtime":1786084511455,"results":"15202","hashOfConfig":"12232"},{"size":20643,"mtime":1786084511455,"results":"15203","hashOfConfig":"12232"},{"size":3361,"mtime":1786084511456,"results":"15204","hashOfConfig":"12232"},{"size":1608,"mtime":1786084511456,"results":"15205","hashOfConfig":"12232"},{"size":3471,"mtime":1786084511456,"results":"15206","hashOfConfig":"12232"},{"size":5654,"mtime":1786084511456,"results":"15207","hashOfConfig":"12232"},{"size":14701,"mtime":1786084511456,"results":"15208","hashOfConfig":"12232"},{"size":1252,"mtime":1786084511456,"results":"15209","hashOfConfig":"12232"},{"size":1324,"mtime":1786084511456,"results":"15210","hashOfConfig":"12232"},{"size":2580,"mtime":1786084511456,"results":"15211","hashOfConfig":"12232"},{"size":3224,"mtime":1786084511457,"results":"15212","hashOfConfig":"12232"},{"size":1863,"mtime":1786084511457,"results":"15213","hashOfConfig":"12232"},{"size":1908,"mtime":1786084511457,"results":"15214","hashOfConfig":"12232"},{"size":3852,"mtime":1786084511457,"results":"15215","hashOfConfig":"12232"},{"size":975,"mtime":1786084511457,"results":"15216","hashOfConfig":"12232"},{"size":8029,"mtime":1786084511457,"results":"15217","hashOfConfig":"12232"},{"size":1038,"mtime":1786084511457,"results":"15218","hashOfConfig":"12232"},{"size":3782,"mtime":1786084511457,"results":"15219","hashOfConfig":"12232"},{"size":3188,"mtime":1786084511457,"results":"15220","hashOfConfig":"12232"},{"size":10950,"mtime":1786084511458,"results":"15221","hashOfConfig":"12232"},{"size":9141,"mtime":1786084511458,"results":"15222","hashOfConfig":"12232"},{"size":3089,"mtime":1786084511458,"results":"15223","hashOfConfig":"12232"},{"size":2087,"mtime":1786084511458,"results":"15224","hashOfConfig":"12232"},{"size":5146,"mtime":1786084511458,"results":"15225","hashOfConfig":"12232"},{"size":1264,"mtime":1786084511458,"results":"15226","hashOfConfig":"12232"},{"size":1084,"mtime":1786084511458,"results":"15227","hashOfConfig":"12232"},{"size":3191,"mtime":1786084511459,"results":"15228","hashOfConfig":"12232"},{"size":5393,"mtime":1786084511459,"results":"15229","hashOfConfig":"12232"},{"size":20738,"mtime":1786084511459,"results":"15230","hashOfConfig":"12232"},{"size":615,"mtime":1786084511459,"results":"15231","hashOfConfig":"12232"},{"size":15361,"mtime":1786084511459,"results":"15232","hashOfConfig":"12232"},{"size":8208,"mtime":1786084511460,"results":"15233","hashOfConfig":"12232"},{"size":1556,"mtime":1786084511460,"results":"15234","hashOfConfig":"12232"},{"size":2848,"mtime":1786084511460,"results":"15235","hashOfConfig":"12232"},{"size":3495,"mtime":1786084511460,"results":"15236","hashOfConfig":"12232"},{"size":6027,"mtime":1786084511460,"results":"15237","hashOfConfig":"12232"},{"size":5163,"mtime":1786084511460,"results":"15238","hashOfConfig":"12232"},{"size":4298,"mtime":1786084511460,"results":"15239","hashOfConfig":"12232"},{"size":7622,"mtime":1786084511460,"results":"15240","hashOfConfig":"12232"},{"size":9400,"mtime":1786084511461,"results":"15241","hashOfConfig":"12232"},{"size":5347,"mtime":1786084511461,"results":"15242","hashOfConfig":"12232"},{"size":12210,"mtime":1786084511461,"results":"15243","hashOfConfig":"12232"},{"size":4117,"mtime":1786084511461,"results":"15244","hashOfConfig":"12232"},{"size":3245,"mtime":1786084511461,"results":"15245","hashOfConfig":"12232"},{"size":2491,"mtime":1786084511461,"results":"15246","hashOfConfig":"12232"},{"size":1734,"mtime":1786084511461,"results":"15247","hashOfConfig":"12232"},{"size":2724,"mtime":1786084511461,"results":"15248","hashOfConfig":"12232"},{"size":1334,"mtime":1786084511462,"results":"15249","hashOfConfig":"12232"},{"size":1764,"mtime":1786084511462,"results":"15250","hashOfConfig":"12232"},{"size":8185,"mtime":1786084511462,"results":"15251","hashOfConfig":"12232"},{"size":5300,"mtime":1786084511462,"results":"15252","hashOfConfig":"12232"},{"size":5591,"mtime":1786084511462,"results":"15253","hashOfConfig":"12232"},{"size":2315,"mtime":1786084511462,"results":"15254","hashOfConfig":"12232"},{"size":14758,"mtime":1786084511462,"results":"15255","hashOfConfig":"12232"},{"size":3405,"mtime":1786084511463,"results":"15256","hashOfConfig":"12232"},{"size":10704,"mtime":1786084511463,"results":"15257","hashOfConfig":"12232"},{"size":16293,"mtime":1786084511463,"results":"15258","hashOfConfig":"12232"},{"size":577,"mtime":1786084511463,"results":"15259","hashOfConfig":"12232"},{"size":8025,"mtime":1786084511463,"results":"15260","hashOfConfig":"12232"},{"size":1409,"mtime":1786084511463,"results":"15261","hashOfConfig":"12232"},{"size":3799,"mtime":1786084511463,"results":"15262","hashOfConfig":"12232"},{"size":6226,"mtime":1786084511463,"results":"15263","hashOfConfig":"12232"},{"size":5780,"mtime":1786084511464,"results":"15264","hashOfConfig":"12232"},{"size":4671,"mtime":1786084511464,"results":"15265","hashOfConfig":"12232"},{"size":9029,"mtime":1786084511464,"results":"15266","hashOfConfig":"12232"},{"size":6446,"mtime":1786084511464,"results":"15267","hashOfConfig":"12232"},{"size":1291,"mtime":1786084511464,"results":"15268","hashOfConfig":"12232"},{"size":11685,"mtime":1786084511464,"results":"15269","hashOfConfig":"12232"},{"size":3453,"mtime":1786084511465,"results":"15270","hashOfConfig":"12232"},{"size":9184,"mtime":1786084511465,"results":"15271","hashOfConfig":"12232"},{"size":6946,"mtime":1786084511465,"results":"15272","hashOfConfig":"12232"},{"size":7312,"mtime":1786084511465,"results":"15273","hashOfConfig":"12232"},{"size":8636,"mtime":1786084511465,"results":"15274","hashOfConfig":"12232"},{"size":11662,"mtime":1786084511465,"results":"15275","hashOfConfig":"12232"},{"size":3306,"mtime":1786084511465,"results":"15276","hashOfConfig":"12232"},{"size":6442,"mtime":1786084511465,"results":"15277","hashOfConfig":"12232"},{"size":16685,"mtime":1786084511466,"results":"15278","hashOfConfig":"12232"},{"size":10685,"mtime":1786084511466,"results":"15279","hashOfConfig":"12232"},{"size":7174,"mtime":1786084511466,"results":"15280","hashOfConfig":"12232"},{"size":8105,"mtime":1786084511466,"results":"15281","hashOfConfig":"12232"},{"size":16375,"mtime":1786084511466,"results":"15282","hashOfConfig":"12232"},{"size":11801,"mtime":1786084511467,"results":"15283","hashOfConfig":"12232"},{"size":4206,"mtime":1786084511467,"results":"15284","hashOfConfig":"12232"},{"size":8862,"mtime":1786084511467,"results":"15285","hashOfConfig":"12232"},{"size":7722,"mtime":1786084511467,"results":"15286","hashOfConfig":"12232"},{"size":6320,"mtime":1786084511467,"results":"15287","hashOfConfig":"12232"},{"size":10066,"mtime":1786084511467,"results":"15288","hashOfConfig":"12232"},{"size":21777,"mtime":1786084511468,"results":"15289","hashOfConfig":"12232"},{"size":3242,"mtime":1786084511468,"results":"15290","hashOfConfig":"12232"},{"size":6933,"mtime":1786084511468,"results":"15291","hashOfConfig":"12232"},{"size":7945,"mtime":1786084511468,"results":"15292","hashOfConfig":"12232"},{"size":2891,"mtime":1786084511468,"results":"15293","hashOfConfig":"12232"},{"size":5127,"mtime":1786084511468,"results":"15294","hashOfConfig":"12232"},{"size":1819,"mtime":1786084511468,"results":"15295","hashOfConfig":"12232"},{"size":3829,"mtime":1786084511468,"results":"15296","hashOfConfig":"12232"},{"size":7900,"mtime":1786084511469,"results":"15297","hashOfConfig":"12232"},{"size":8143,"mtime":1786084511469,"results":"15298","hashOfConfig":"12232"},{"size":9677,"mtime":1786084511469,"results":"15299","hashOfConfig":"12232"},{"size":5502,"mtime":1786084511469,"results":"15300","hashOfConfig":"12232"},{"size":11385,"mtime":1786084511469,"results":"15301","hashOfConfig":"12232"},{"size":1949,"mtime":1786084511469,"results":"15302","hashOfConfig":"12232"},{"size":6695,"mtime":1786084511470,"results":"15303","hashOfConfig":"12232"},{"size":8407,"mtime":1786084511470,"results":"15304","hashOfConfig":"12232"},{"size":7015,"mtime":1786084511470,"results":"15305","hashOfConfig":"12232"},{"size":8702,"mtime":1786084511470,"results":"15306","hashOfConfig":"12232"},{"size":10103,"mtime":1786084511470,"results":"15307","hashOfConfig":"12232"},{"size":7425,"mtime":1786084511470,"results":"15308","hashOfConfig":"12232"},{"size":4168,"mtime":1786084511470,"results":"15309","hashOfConfig":"12232"},{"size":12678,"mtime":1786084511471,"results":"15310","hashOfConfig":"12232"},{"size":5154,"mtime":1786084511471,"results":"15311","hashOfConfig":"12232"},{"size":9669,"mtime":1786084511471,"results":"15312","hashOfConfig":"12232"},{"size":775,"mtime":1786084511471,"results":"15313","hashOfConfig":"12232"},{"size":6099,"mtime":1786084511471,"results":"15314","hashOfConfig":"12232"},{"size":20776,"mtime":1786084511472,"results":"15315","hashOfConfig":"12232"},{"size":9716,"mtime":1786084511472,"results":"15316","hashOfConfig":"12232"},{"size":6510,"mtime":1786084511472,"results":"15317","hashOfConfig":"12232"},{"size":11406,"mtime":1786084511472,"results":"15318","hashOfConfig":"12232"},{"size":6179,"mtime":1786084511473,"results":"15319","hashOfConfig":"12232"},{"size":4630,"mtime":1786084511473,"results":"15320","hashOfConfig":"12232"},{"size":6181,"mtime":1786084511473,"results":"15321","hashOfConfig":"12232"},{"size":9706,"mtime":1786084511473,"results":"15322","hashOfConfig":"12232"},{"size":2056,"mtime":1786084511473,"results":"15323","hashOfConfig":"12232"},{"size":3622,"mtime":1786084511473,"results":"15324","hashOfConfig":"12232"},{"size":8028,"mtime":1786084511473,"results":"15325","hashOfConfig":"12232"},{"size":9235,"mtime":1786084511473,"results":"15326","hashOfConfig":"12232"},{"size":9325,"mtime":1786084511474,"results":"15327","hashOfConfig":"12232"},{"size":4909,"mtime":1786084511474,"results":"15328","hashOfConfig":"12232"},{"size":3120,"mtime":1786084511474,"results":"15329","hashOfConfig":"12232"},{"size":3079,"mtime":1786084511474,"results":"15330","hashOfConfig":"12232"},{"size":4643,"mtime":1786084511474,"results":"15331","hashOfConfig":"12232"},{"size":9949,"mtime":1786084511474,"results":"15332","hashOfConfig":"12232"},{"size":21489,"mtime":1786084511475,"results":"15333","hashOfConfig":"12232"},{"size":7461,"mtime":1786084511475,"results":"15334","hashOfConfig":"12232"},{"size":2231,"mtime":1786084511475,"results":"15335","hashOfConfig":"12232"},{"size":9230,"mtime":1786084511475,"results":"15336","hashOfConfig":"12232"},{"size":2694,"mtime":1786084511475,"results":"15337","hashOfConfig":"12232"},{"size":28780,"mtime":1786084511475,"results":"15338","hashOfConfig":"12232"},{"size":12006,"mtime":1786084511476,"results":"15339","hashOfConfig":"12232"},{"size":26510,"mtime":1786084511476,"results":"15340","hashOfConfig":"12232"},{"size":1645,"mtime":1786084511476,"results":"15341","hashOfConfig":"12232"},{"size":4406,"mtime":1786084511476,"results":"15342","hashOfConfig":"12232"},{"size":4369,"mtime":1786084511476,"results":"15343","hashOfConfig":"12232"},{"size":5414,"mtime":1786084511476,"results":"15344","hashOfConfig":"12232"},{"size":4151,"mtime":1786084511477,"results":"15345","hashOfConfig":"12232"},{"size":1680,"mtime":1786084511477,"results":"15346","hashOfConfig":"12232"},{"size":1692,"mtime":1786084511477,"results":"15347","hashOfConfig":"12232"},{"size":3181,"mtime":1786084511477,"results":"15348","hashOfConfig":"12232"},{"size":3390,"mtime":1786084511477,"results":"15349","hashOfConfig":"12232"},{"size":7025,"mtime":1786084511477,"results":"15350","hashOfConfig":"12232"},{"size":5934,"mtime":1786084511478,"results":"15351","hashOfConfig":"12232"},{"size":4331,"mtime":1786084511478,"results":"15352","hashOfConfig":"12232"},{"size":2714,"mtime":1786084511478,"results":"15353","hashOfConfig":"12232"},{"size":612,"mtime":1786084511478,"results":"15354","hashOfConfig":"12232"},{"size":685,"mtime":1786084511478,"results":"15355","hashOfConfig":"12285"},{"size":3244,"mtime":1786084511478,"results":"15356","hashOfConfig":"12232"},{"size":31983,"mtime":1786084511478,"results":"15357","hashOfConfig":"12232"},{"size":2357,"mtime":1786084511478,"results":"15358","hashOfConfig":"12232"},{"size":2969,"mtime":1786084511479,"results":"15359","hashOfConfig":"12232"},{"size":3346,"mtime":1786084511479,"results":"15360","hashOfConfig":"12232"},{"size":5016,"mtime":1786084511479,"results":"15361","hashOfConfig":"12232"},{"size":3414,"mtime":1786084511479,"results":"15362","hashOfConfig":"12232"},{"size":8667,"mtime":1786084511479,"results":"15363","hashOfConfig":"12232"},{"size":5396,"mtime":1786084511479,"results":"15364","hashOfConfig":"12232"},{"size":1640,"mtime":1786084511479,"results":"15365","hashOfConfig":"12232"},{"size":5798,"mtime":1786084511480,"results":"15366","hashOfConfig":"12232"},{"size":1689,"mtime":1786084511480,"results":"15367","hashOfConfig":"12232"},{"size":2247,"mtime":1786084511480,"results":"15368","hashOfConfig":"12232"},{"size":6002,"mtime":1786084511480,"results":"15369","hashOfConfig":"12232"},{"size":8758,"mtime":1786084511480,"results":"15370","hashOfConfig":"12232"},{"size":4791,"mtime":1786084511480,"results":"15371","hashOfConfig":"12232"},{"size":5134,"mtime":1786084511480,"results":"15372","hashOfConfig":"12232"},{"size":10826,"mtime":1786084511480,"results":"15373","hashOfConfig":"12232"},{"size":3873,"mtime":1786084511480,"results":"15374","hashOfConfig":"12232"},{"size":3240,"mtime":1786084511481,"results":"15375","hashOfConfig":"12232"},{"size":2646,"mtime":1786084511481,"results":"15376","hashOfConfig":"12232"},{"size":3082,"mtime":1786084511481,"results":"15377","hashOfConfig":"12232"},{"size":4562,"mtime":1786084511481,"results":"15378","hashOfConfig":"12232"},{"size":2091,"mtime":1786084511481,"results":"15379","hashOfConfig":"12232"},{"size":3050,"mtime":1786084511481,"results":"15380","hashOfConfig":"12232"},{"size":11552,"mtime":1786084511481,"results":"15381","hashOfConfig":"12232"},{"size":1010,"mtime":1786084511481,"results":"15382","hashOfConfig":"12232"},{"size":2137,"mtime":1786084511482,"results":"15383","hashOfConfig":"12232"},{"size":8513,"mtime":1786084511482,"results":"15384","hashOfConfig":"12232"},{"size":4405,"mtime":1786084511482,"results":"15385","hashOfConfig":"12232"},{"size":11552,"mtime":1786084511482,"results":"15386","hashOfConfig":"12232"},{"size":5931,"mtime":1786084511482,"results":"15387","hashOfConfig":"12232"},{"size":971,"mtime":1786084511482,"results":"15388","hashOfConfig":"12232"},{"size":2087,"mtime":1786084511482,"results":"15389","hashOfConfig":"12232"},{"size":4874,"mtime":1786084511483,"results":"15390","hashOfConfig":"12232"},{"size":1996,"mtime":1786084511483,"results":"15391","hashOfConfig":"12232"},{"size":1675,"mtime":1786084511483,"results":"15392","hashOfConfig":"12232"},{"size":6239,"mtime":1786084511483,"results":"15393","hashOfConfig":"12232"},{"size":4913,"mtime":1786084511483,"results":"15394","hashOfConfig":"12232"},{"size":4281,"mtime":1786084511483,"results":"15395","hashOfConfig":"12232"},{"size":4931,"mtime":1786084511483,"results":"15396","hashOfConfig":"12232"},{"size":1847,"mtime":1786084511483,"results":"15397","hashOfConfig":"12232"},{"size":2651,"mtime":1786084511484,"results":"15398","hashOfConfig":"12232"},{"size":1155,"mtime":1786084511484,"results":"15399","hashOfConfig":"12232"},{"size":3507,"mtime":1786084511484,"results":"15400","hashOfConfig":"12232"},{"size":4452,"mtime":1786084511484,"results":"15401","hashOfConfig":"12232"},{"size":4215,"mtime":1786084511484,"results":"15402","hashOfConfig":"12232"},{"size":2818,"mtime":1786084511484,"results":"15403","hashOfConfig":"12232"},{"size":2391,"mtime":1786084511484,"results":"15404","hashOfConfig":"12232"},{"size":7485,"mtime":1786084511484,"results":"15405","hashOfConfig":"12232"},{"size":3464,"mtime":1786084511484,"results":"15406","hashOfConfig":"12232"},{"size":5934,"mtime":1786084511485,"results":"15407","hashOfConfig":"12232"},{"size":5438,"mtime":1786084511485,"results":"15408","hashOfConfig":"12232"},{"size":8049,"mtime":1786084511485,"results":"15409","hashOfConfig":"12232"},{"size":1247,"mtime":1786084511485,"results":"15410","hashOfConfig":"12232"},{"size":6375,"mtime":1786084511485,"results":"15411","hashOfConfig":"12232"},{"size":1526,"mtime":1786084511485,"results":"15412","hashOfConfig":"12232"},{"size":8217,"mtime":1786084511485,"results":"15413","hashOfConfig":"12232"},{"size":2183,"mtime":1786084511485,"results":"15414","hashOfConfig":"12232"},{"size":4207,"mtime":1786084511486,"results":"15415","hashOfConfig":"12232"},{"size":2651,"mtime":1786084511486,"results":"15416","hashOfConfig":"12232"},{"size":1979,"mtime":1786084511486,"results":"15417","hashOfConfig":"12232"},{"size":674,"mtime":1786084511486,"results":"15418","hashOfConfig":"12232"},{"size":5146,"mtime":1786084511486,"results":"15419","hashOfConfig":"12232"},{"size":1693,"mtime":1786084511486,"results":"15420","hashOfConfig":"12232"},{"size":1682,"mtime":1786084511486,"results":"15421","hashOfConfig":"12232"},{"size":2893,"mtime":1786084511487,"results":"15422","hashOfConfig":"12232"},{"size":3184,"mtime":1786084511487,"results":"15423","hashOfConfig":"12232"},{"size":2342,"mtime":1786084511487,"results":"15424","hashOfConfig":"12232"},{"size":2834,"mtime":1786084511487,"results":"15425","hashOfConfig":"12232"},{"size":4137,"mtime":1786084511487,"results":"15426","hashOfConfig":"12232"},{"size":3453,"mtime":1786084511487,"results":"15427","hashOfConfig":"12232"},{"size":1435,"mtime":1786084511487,"results":"15428","hashOfConfig":"12232"},{"size":1890,"mtime":1786084511487,"results":"15429","hashOfConfig":"12232"},{"size":4331,"mtime":1786084511488,"results":"15430","hashOfConfig":"12232"},{"size":7615,"mtime":1786084511488,"results":"15431","hashOfConfig":"12232"},{"size":6753,"mtime":1786084511488,"results":"15432","hashOfConfig":"12232"},{"size":3614,"mtime":1786084511488,"results":"15433","hashOfConfig":"12232"},{"size":6845,"mtime":1786084511488,"results":"15434","hashOfConfig":"12232"},{"size":2267,"mtime":1786084511488,"results":"15435","hashOfConfig":"12232"},{"size":4609,"mtime":1786084511488,"results":"15436","hashOfConfig":"12232"},{"size":27693,"mtime":1786084511489,"results":"15437","hashOfConfig":"12232"},{"size":2541,"mtime":1786084511489,"results":"15438","hashOfConfig":"12232"},{"size":4748,"mtime":1786084511489,"results":"15439","hashOfConfig":"12232"},{"size":2069,"mtime":1786084511489,"results":"15440","hashOfConfig":"12232"},{"size":4545,"mtime":1786084511489,"results":"15441","hashOfConfig":"12232"},{"size":3589,"mtime":1786084511489,"results":"15442","hashOfConfig":"12232"},{"size":1421,"mtime":1786084511489,"results":"15443","hashOfConfig":"12232"},{"size":2806,"mtime":1786084511489,"results":"15444","hashOfConfig":"12232"},{"size":5362,"mtime":1786084511490,"results":"15445","hashOfConfig":"12232"},{"size":8253,"mtime":1786084511490,"results":"15446","hashOfConfig":"12232"},{"size":1505,"mtime":1786084511490,"results":"15447","hashOfConfig":"12232"},{"size":4003,"mtime":1786084511490,"results":"15448","hashOfConfig":"12232"},{"size":6241,"mtime":1786084511490,"results":"15449","hashOfConfig":"12232"},{"size":2984,"mtime":1786084511490,"results":"15450","hashOfConfig":"12232"},{"size":3654,"mtime":1786084511490,"results":"15451","hashOfConfig":"12232"},{"size":5830,"mtime":1786084511490,"results":"15452","hashOfConfig":"12232"},{"size":3352,"mtime":1786084511490,"results":"15453","hashOfConfig":"12232"},{"size":6525,"mtime":1786084511491,"results":"15454","hashOfConfig":"12232"},{"size":2400,"mtime":1786084511491,"results":"15455","hashOfConfig":"12232"},{"size":2672,"mtime":1786084511491,"results":"15456","hashOfConfig":"12232"},{"size":3976,"mtime":1786084511491,"results":"15457","hashOfConfig":"12232"},{"size":1583,"mtime":1786084511491,"results":"15458","hashOfConfig":"12232"},{"size":1991,"mtime":1786084511491,"results":"15459","hashOfConfig":"12232"},{"size":1972,"mtime":1786084511491,"results":"15460","hashOfConfig":"12232"},{"size":1851,"mtime":1786084511491,"results":"15461","hashOfConfig":"12232"},{"size":1443,"mtime":1786084511491,"results":"15462","hashOfConfig":"12232"},{"size":5042,"mtime":1786084511491,"results":"15463","hashOfConfig":"12232"},{"size":2661,"mtime":1786084511492,"results":"15464","hashOfConfig":"12232"},{"size":2954,"mtime":1786084511492,"results":"15465","hashOfConfig":"12232"},{"size":2150,"mtime":1786084511492,"results":"15466","hashOfConfig":"12232"},{"size":884,"mtime":1786084511492,"results":"15467","hashOfConfig":"12232"},{"size":6874,"mtime":1786084511492,"results":"15468","hashOfConfig":"12232"},{"size":10243,"mtime":1786084511492,"results":"15469","hashOfConfig":"12232"},{"size":5940,"mtime":1786084511492,"results":"15470","hashOfConfig":"12232"},{"size":4177,"mtime":1786084511492,"results":"15471","hashOfConfig":"12232"},{"size":3096,"mtime":1786084511492,"results":"15472","hashOfConfig":"12232"},{"size":2413,"mtime":1786084511492,"results":"15473","hashOfConfig":"12232"},{"size":34450,"mtime":1786084511493,"results":"15474","hashOfConfig":"12232"},{"size":1802,"mtime":1786084511493,"results":"15475","hashOfConfig":"12232"},{"size":9788,"mtime":1786084511493,"results":"15476","hashOfConfig":"12232"},{"size":2471,"mtime":1786084511493,"results":"15477","hashOfConfig":"12232"},{"size":2822,"mtime":1786084511493,"results":"15478","hashOfConfig":"12232"},{"size":5902,"mtime":1786084511493,"results":"15479","hashOfConfig":"12232"},{"size":7188,"mtime":1786084511494,"results":"15480","hashOfConfig":"12232"},{"size":2235,"mtime":1786084511494,"results":"15481","hashOfConfig":"12232"},{"size":5789,"mtime":1786084511494,"results":"15482","hashOfConfig":"12232"},{"size":11829,"mtime":1786084529050,"results":"15483","hashOfConfig":"12232"},{"size":2862,"mtime":1786084511494,"results":"15484","hashOfConfig":"12232"},{"size":15544,"mtime":1786084511494,"results":"15485","hashOfConfig":"12232"},{"size":2164,"mtime":1786084511495,"results":"15486","hashOfConfig":"12232"},{"size":7158,"mtime":1786084511495,"results":"15487","hashOfConfig":"12232"},{"size":2735,"mtime":1786084511495,"results":"15488","hashOfConfig":"12232"},{"size":2809,"mtime":1786084511495,"results":"15489","hashOfConfig":"12232"},{"size":7571,"mtime":1786084511495,"results":"15490","hashOfConfig":"12232"},{"size":5674,"mtime":1786084511495,"results":"15491","hashOfConfig":"12232"},{"size":2437,"mtime":1786084511495,"results":"15492","hashOfConfig":"12232"},{"size":1628,"mtime":1786084511495,"results":"15493","hashOfConfig":"12232"},{"size":4792,"mtime":1786084511496,"results":"15494","hashOfConfig":"12232"},{"size":4115,"mtime":1786084511496,"results":"15495","hashOfConfig":"12232"},{"size":3382,"mtime":1786084511496,"results":"15496","hashOfConfig":"12232"},{"size":5598,"mtime":1786084511496,"results":"15497","hashOfConfig":"12232"},{"size":22882,"mtime":1786084511496,"results":"15498","hashOfConfig":"12232"},{"size":27257,"mtime":1786084511496,"results":"15499","hashOfConfig":"12232"},{"size":4987,"mtime":1786084511497,"results":"15500","hashOfConfig":"12232"},{"size":7715,"mtime":1786084511497,"results":"15501","hashOfConfig":"12232"},{"size":3180,"mtime":1786084511497,"results":"15502","hashOfConfig":"12285"},{"size":8964,"mtime":1786084511497,"results":"15503","hashOfConfig":"12232"},{"size":13939,"mtime":1786084511497,"results":"15504","hashOfConfig":"12285"},{"size":8720,"mtime":1786084511497,"results":"15505","hashOfConfig":"12232"},{"size":4233,"mtime":1786084511497,"results":"15506","hashOfConfig":"12232"},{"size":2332,"mtime":1786084511498,"results":"15507","hashOfConfig":"12232"},{"size":8840,"mtime":1786084511498,"results":"15508","hashOfConfig":"12232"},{"size":2237,"mtime":1786084511498,"results":"15509","hashOfConfig":"12232"},{"size":2493,"mtime":1786084511498,"results":"15510","hashOfConfig":"12232"},{"size":7140,"mtime":1786084511498,"results":"15511","hashOfConfig":"12232"},{"size":7664,"mtime":1786084511498,"results":"15512","hashOfConfig":"12232"},{"size":43309,"mtime":1786084511499,"results":"15513","hashOfConfig":"12232"},{"size":3874,"mtime":1786084511499,"results":"15514","hashOfConfig":"12232"},{"size":10721,"mtime":1786084511499,"results":"15515","hashOfConfig":"12232"},{"size":1565,"mtime":1786084511499,"results":"15516","hashOfConfig":"12232"},{"size":2353,"mtime":1786084511499,"results":"15517","hashOfConfig":"12232"},{"size":1987,"mtime":1786084511499,"results":"15518","hashOfConfig":"12232"},{"size":4823,"mtime":1786084511499,"results":"15519","hashOfConfig":"12232"},{"size":1401,"mtime":1786084511499,"results":"15520","hashOfConfig":"12232"},{"size":2538,"mtime":1786084511500,"results":"15521","hashOfConfig":"12232"},{"size":5556,"mtime":1786084511500,"results":"15522","hashOfConfig":"12232"},{"size":2092,"mtime":1786084511500,"results":"15523","hashOfConfig":"12232"},{"size":880,"mtime":1786084511500,"results":"15524","hashOfConfig":"12232"},{"size":13098,"mtime":1786084511500,"results":"15525","hashOfConfig":"12232"},{"size":7831,"mtime":1786084511500,"results":"15526","hashOfConfig":"12232"},{"size":2230,"mtime":1786084511500,"results":"15527","hashOfConfig":"12232"},{"size":3791,"mtime":1786084511500,"results":"15528","hashOfConfig":"12232"},{"size":9236,"mtime":1786084511501,"results":"15529","hashOfConfig":"12232"},{"size":8366,"mtime":1786084511501,"results":"15530","hashOfConfig":"12232"},{"size":3695,"mtime":1786084511501,"results":"15531","hashOfConfig":"12232"},{"size":3422,"mtime":1786084511501,"results":"15532","hashOfConfig":"12232"},{"size":7994,"mtime":1786084511501,"results":"15533","hashOfConfig":"12232"},{"size":2579,"mtime":1786084511501,"results":"15534","hashOfConfig":"12232"},{"size":1962,"mtime":1786084511501,"results":"15535","hashOfConfig":"12232"},{"size":1831,"mtime":1786084511501,"results":"15536","hashOfConfig":"12232"},{"size":4393,"mtime":1786084511501,"results":"15537","hashOfConfig":"12232"},{"size":6235,"mtime":1786084511502,"results":"15538","hashOfConfig":"12232"},{"size":2119,"mtime":1786084511502,"results":"15539","hashOfConfig":"12232"},{"size":3678,"mtime":1786084511502,"results":"15540","hashOfConfig":"12232"},{"size":1938,"mtime":1786084511503,"results":"15541","hashOfConfig":"12232"},{"size":2106,"mtime":1786084511503,"results":"15542","hashOfConfig":"12232"},{"size":1639,"mtime":1786084511503,"results":"15543","hashOfConfig":"12232"},{"size":1836,"mtime":1786084511503,"results":"15544","hashOfConfig":"12232"},{"size":3204,"mtime":1786084511502,"results":"15545","hashOfConfig":"12232"},{"size":3886,"mtime":1786084511502,"results":"15546","hashOfConfig":"12232"},{"size":1631,"mtime":1786084511502,"results":"15547","hashOfConfig":"12232"},{"size":3261,"mtime":1786084511503,"results":"15548","hashOfConfig":"12232"},{"size":3234,"mtime":1786084511503,"results":"15549","hashOfConfig":"12232"},{"size":5768,"mtime":1786084511503,"results":"15550","hashOfConfig":"12232"},{"size":3011,"mtime":1786084511503,"results":"15551","hashOfConfig":"12232"},{"size":612,"mtime":1786084511503,"results":"15552","hashOfConfig":"12232"},{"size":6827,"mtime":1786084511504,"results":"15553","hashOfConfig":"12232"},{"size":5616,"mtime":1786084511504,"results":"15554","hashOfConfig":"12232"},{"size":8842,"mtime":1786084511504,"results":"15555","hashOfConfig":"12232"},{"size":5496,"mtime":1786084511504,"results":"15556","hashOfConfig":"12232"},{"size":3557,"mtime":1786084511504,"results":"15557","hashOfConfig":"12232"},{"size":32536,"mtime":1786084511504,"results":"15558","hashOfConfig":"12232"},{"size":3253,"mtime":1786084511504,"results":"15559","hashOfConfig":"12232"},{"size":4686,"mtime":1786084511505,"results":"15560","hashOfConfig":"12232"},{"size":2191,"mtime":1786084511505,"results":"15561","hashOfConfig":"12232"},{"size":17448,"mtime":1786084511505,"results":"15562","hashOfConfig":"12232"},{"size":14087,"mtime":1786084511505,"results":"15563","hashOfConfig":"12232"},{"size":978,"mtime":1786084511505,"results":"15564","hashOfConfig":"12232"},{"size":8487,"mtime":1786084511505,"results":"15565","hashOfConfig":"12232"},{"size":3612,"mtime":1786084511505,"results":"15566","hashOfConfig":"12232"},{"size":2453,"mtime":1786084511506,"results":"15567","hashOfConfig":"12232"},{"size":2679,"mtime":1786084511506,"results":"15568","hashOfConfig":"12232"},{"size":2035,"mtime":1786084511506,"results":"15569","hashOfConfig":"12232"},{"size":1584,"mtime":1786084511506,"results":"15570","hashOfConfig":"12232"},{"size":3509,"mtime":1786084511507,"results":"15571","hashOfConfig":"12232"},{"size":6614,"mtime":1786084511507,"results":"15572","hashOfConfig":"12232"},{"size":7534,"mtime":1786084511507,"results":"15573","hashOfConfig":"12232"},{"size":1614,"mtime":1786084511507,"results":"15574","hashOfConfig":"12232"},{"size":3874,"mtime":1786084511507,"results":"15575","hashOfConfig":"12232"},{"size":3642,"mtime":1786084511506,"results":"15576","hashOfConfig":"12232"},{"size":9684,"mtime":1786084511506,"results":"15577","hashOfConfig":"12232"},{"size":951,"mtime":1786084511506,"results":"15578","hashOfConfig":"12232"},{"size":9623,"mtime":1786084511507,"results":"15579","hashOfConfig":"12232"},{"size":4680,"mtime":1786084511507,"results":"15580","hashOfConfig":"12232"},{"size":1323,"mtime":1786084511507,"results":"15581","hashOfConfig":"12232"},{"size":6838,"mtime":1786084511508,"results":"15582","hashOfConfig":"12232"},{"size":2362,"mtime":1786084511508,"results":"15583","hashOfConfig":"12232"},{"size":878,"mtime":1786084511508,"results":"15584","hashOfConfig":"12232"},{"size":6527,"mtime":1786084511508,"results":"15585","hashOfConfig":"12232"},{"size":10385,"mtime":1786084511508,"results":"15586","hashOfConfig":"12232"},{"size":5973,"mtime":1786084511508,"results":"15587","hashOfConfig":"12232"},{"size":1493,"mtime":1786084511509,"results":"15588","hashOfConfig":"12232"},{"size":11038,"mtime":1786084511509,"results":"15589","hashOfConfig":"12232"},{"size":7041,"mtime":1786084511509,"results":"15590","hashOfConfig":"12232"},{"size":3483,"mtime":1786084511509,"results":"15591","hashOfConfig":"12232"},{"size":702,"mtime":1786084511509,"results":"15592","hashOfConfig":"12232"},{"size":3842,"mtime":1786084511509,"results":"15593","hashOfConfig":"12232"},{"size":3510,"mtime":1786084511509,"results":"15594","hashOfConfig":"12232"},{"size":3436,"mtime":1786084511509,"results":"15595","hashOfConfig":"12232"},{"size":3499,"mtime":1786084511510,"results":"15596","hashOfConfig":"12232"},{"size":4093,"mtime":1786084511510,"results":"15597","hashOfConfig":"12232"},{"size":3028,"mtime":1786084511510,"results":"15598","hashOfConfig":"12232"},{"size":3358,"mtime":1786084511510,"results":"15599","hashOfConfig":"12232"},{"size":2970,"mtime":1786084511510,"results":"15600","hashOfConfig":"12232"},{"size":2142,"mtime":1786084511510,"results":"15601","hashOfConfig":"12232"},{"size":5118,"mtime":1786084511510,"results":"15602","hashOfConfig":"12232"},{"size":4682,"mtime":1786084511510,"results":"15603","hashOfConfig":"12232"},{"size":3426,"mtime":1786084511510,"results":"15604","hashOfConfig":"12232"},{"size":5143,"mtime":1786084511511,"results":"15605","hashOfConfig":"12232"},{"size":1821,"mtime":1786084511511,"results":"15606","hashOfConfig":"12232"},{"size":763,"mtime":1786084511511,"results":"15607","hashOfConfig":"12232"},{"size":5121,"mtime":1786084511511,"results":"15608","hashOfConfig":"12232"},{"size":3880,"mtime":1786084511511,"results":"15609","hashOfConfig":"12232"},{"size":9729,"mtime":1786084511512,"results":"15610","hashOfConfig":"12232"},{"size":1058,"mtime":1786084511512,"results":"15611","hashOfConfig":"12232"},{"size":3152,"mtime":1786084511512,"results":"15612","hashOfConfig":"12232"},{"size":13180,"mtime":1786084511512,"results":"15613","hashOfConfig":"12232"},{"size":14474,"mtime":1786084511512,"results":"15614","hashOfConfig":"12232"},{"size":8979,"mtime":1786084511512,"results":"15615","hashOfConfig":"12232"},{"size":6275,"mtime":1786084511512,"results":"15616","hashOfConfig":"12232"},{"size":22311,"mtime":1786084511513,"results":"15617","hashOfConfig":"12232"},{"size":4075,"mtime":1786084511513,"results":"15618","hashOfConfig":"12232"},{"size":12898,"mtime":1786084511513,"results":"15619","hashOfConfig":"12232"},{"size":9941,"mtime":1786084511513,"results":"15620","hashOfConfig":"12232"},{"size":4117,"mtime":1786084511513,"results":"15621","hashOfConfig":"12232"},{"size":4353,"mtime":1786084511513,"results":"15622","hashOfConfig":"12232"},{"size":5690,"mtime":1786084511514,"results":"15623","hashOfConfig":"12232"},{"size":3995,"mtime":1786084511514,"results":"15624","hashOfConfig":"12232"},{"size":4956,"mtime":1786084511514,"results":"15625","hashOfConfig":"12232"},{"size":4644,"mtime":1786084511514,"results":"15626","hashOfConfig":"12232"},{"size":7099,"mtime":1786084511514,"results":"15627","hashOfConfig":"12232"},{"size":3535,"mtime":1786084511514,"results":"15628","hashOfConfig":"12232"},{"size":7837,"mtime":1786084511514,"results":"15629","hashOfConfig":"12232"},{"size":9670,"mtime":1786084511515,"results":"15630","hashOfConfig":"12232"},{"size":7024,"mtime":1786084511515,"results":"15631","hashOfConfig":"12232"},{"size":6967,"mtime":1786084511515,"results":"15632","hashOfConfig":"12232"},{"size":3127,"mtime":1786084511515,"results":"15633","hashOfConfig":"12232"},{"size":18647,"mtime":1786084511511,"results":"15634","hashOfConfig":"12232"},{"size":12449,"mtime":1786084511515,"results":"15635","hashOfConfig":"12232"},{"size":18941,"mtime":1786084511516,"results":"15636","hashOfConfig":"12232"},{"size":5794,"mtime":1786084511516,"results":"15637","hashOfConfig":"12232"},{"size":12763,"mtime":1786084511516,"results":"15638","hashOfConfig":"12232"},{"size":8187,"mtime":1786084511516,"results":"15639","hashOfConfig":"12232"},{"size":14157,"mtime":1786084511516,"results":"15640","hashOfConfig":"12232"},{"size":12809,"mtime":1786084511518,"results":"15641","hashOfConfig":"12232"},{"size":3311,"mtime":1786084511518,"results":"15642","hashOfConfig":"12232"},{"size":9211,"mtime":1786084511517,"results":"15643","hashOfConfig":"12232"},{"size":5983,"mtime":1786084511517,"results":"15644","hashOfConfig":"12232"},{"size":11906,"mtime":1786084511517,"results":"15645","hashOfConfig":"12232"},{"size":2835,"mtime":1786084511517,"results":"15646","hashOfConfig":"12232"},{"size":5959,"mtime":1786084511517,"results":"15647","hashOfConfig":"12232"},{"size":2235,"mtime":1786084511517,"results":"15648","hashOfConfig":"12232"},{"size":4410,"mtime":1786084511517,"results":"15649","hashOfConfig":"12232"},{"size":1940,"mtime":1786084511518,"results":"15650","hashOfConfig":"12285"},{"size":1175,"mtime":1786084511519,"results":"15651","hashOfConfig":"12232"},{"size":2313,"mtime":1786084511519,"results":"15652","hashOfConfig":"12232"},{"size":2911,"mtime":1786084511519,"results":"15653","hashOfConfig":"12232"},{"size":3934,"mtime":1786084511519,"results":"15654","hashOfConfig":"8189"},{"size":7135,"mtime":1786084511519,"results":"15655","hashOfConfig":"8189"},{"size":14366,"mtime":1786084511519,"results":"15656","hashOfConfig":"8189"},{"size":8074,"mtime":1786084511519,"results":"15657","hashOfConfig":"12232"},{"size":4529,"mtime":1786084511520,"results":"15658","hashOfConfig":"12232"},{"size":3674,"mtime":1786084511518,"results":"15659","hashOfConfig":"12232"},{"size":2061,"mtime":1786084511518,"results":"15660","hashOfConfig":"8189"},{"size":5081,"mtime":1786084511518,"results":"15661","hashOfConfig":"12232"},{"size":2568,"mtime":1786084511520,"results":"15662","hashOfConfig":"12232"},{"size":1536,"mtime":1786084511520,"results":"15663","hashOfConfig":"12232"},{"size":1456,"mtime":1786084511520,"results":"15664","hashOfConfig":"12232"},{"size":3515,"mtime":1786084511520,"results":"15665","hashOfConfig":"12232"},{"size":6315,"mtime":1786084511520,"results":"15666","hashOfConfig":"12232"},{"size":1490,"mtime":1786084511521,"results":"15667","hashOfConfig":"12232"},{"size":4018,"mtime":1786084511521,"results":"15668","hashOfConfig":"12232"},{"size":1661,"mtime":1786084511521,"results":"15669","hashOfConfig":"12232"},{"size":3595,"mtime":1786084511521,"results":"15670","hashOfConfig":"12232"},{"size":1181,"mtime":1786084511521,"results":"15671","hashOfConfig":"12232"},{"size":3020,"mtime":1786084511521,"results":"15672","hashOfConfig":"12232"},{"size":3092,"mtime":1786084511521,"results":"15673","hashOfConfig":"12232"},{"size":6363,"mtime":1786084511521,"results":"15674","hashOfConfig":"12232"},{"size":4056,"mtime":1786084511522,"results":"15675","hashOfConfig":"12232"},{"size":5263,"mtime":1786084511522,"results":"15676","hashOfConfig":"12232"},{"size":6506,"mtime":1786084511522,"results":"15677","hashOfConfig":"12232"},{"size":4187,"mtime":1786084511522,"results":"15678","hashOfConfig":"12232"},{"size":2026,"mtime":1786084511522,"results":"15679","hashOfConfig":"12232"},{"size":18859,"mtime":1786084511522,"results":"15680","hashOfConfig":"12232"},{"size":11498,"mtime":1786084511523,"results":"15681","hashOfConfig":"12232"},{"size":4973,"mtime":1786084511523,"results":"15682","hashOfConfig":"12232"},{"size":8207,"mtime":1786084511523,"results":"15683","hashOfConfig":"12232"},{"size":9765,"mtime":1786084511523,"results":"15684","hashOfConfig":"12232"},{"size":759,"mtime":1786084511523,"results":"15685","hashOfConfig":"12232"},{"size":13015,"mtime":1786084511523,"results":"15686","hashOfConfig":"12232"},{"size":3026,"mtime":1786084511523,"results":"15687","hashOfConfig":"12232"},{"size":5899,"mtime":1786084511524,"results":"15688","hashOfConfig":"12232"},{"size":1396,"mtime":1786084511524,"results":"15689","hashOfConfig":"12232"},{"size":9784,"mtime":1786084511524,"results":"15690","hashOfConfig":"12232"},{"size":8856,"mtime":1786084511524,"results":"15691","hashOfConfig":"12232"},{"size":5938,"mtime":1786084511524,"results":"15692","hashOfConfig":"12232"},{"size":794,"mtime":1786084511524,"results":"15693","hashOfConfig":"12232"},{"size":696,"mtime":1786084511524,"results":"15694","hashOfConfig":"12232"},{"size":1499,"mtime":1786084511524,"results":"15695","hashOfConfig":"12232"},{"size":1664,"mtime":1786084511524,"results":"15696","hashOfConfig":"12232"},{"size":2664,"mtime":1786084511525,"results":"15697","hashOfConfig":"12232"},{"size":15464,"mtime":1786084511525,"results":"15698","hashOfConfig":"12232"},{"size":2413,"mtime":1786084511525,"results":"15699","hashOfConfig":"12232"},{"size":5298,"mtime":1786084511525,"results":"15700","hashOfConfig":"12232"},{"size":13156,"mtime":1786084511525,"results":"15701","hashOfConfig":"12232"},{"size":5560,"mtime":1786084511525,"results":"15702","hashOfConfig":"12232"},{"size":4895,"mtime":1786084511525,"results":"15703","hashOfConfig":"12232"},{"size":3862,"mtime":1786084511526,"results":"15704","hashOfConfig":"12232"},{"size":1755,"mtime":1786084511526,"results":"15705","hashOfConfig":"12232"},{"size":10062,"mtime":1786084511526,"results":"15706","hashOfConfig":"12232"},{"size":11833,"mtime":1786084511526,"results":"15707","hashOfConfig":"12232"},{"size":9259,"mtime":1786084511526,"results":"15708","hashOfConfig":"12232"},{"size":2757,"mtime":1786084511526,"results":"15709","hashOfConfig":"12232"},{"size":1606,"mtime":1786084511526,"results":"15710","hashOfConfig":"12232"},{"size":55158,"mtime":1786084511527,"results":"15711","hashOfConfig":"12232"},{"size":6406,"mtime":1786084511527,"results":"15712","hashOfConfig":"12232"},{"size":5539,"mtime":1786084511527,"results":"15713","hashOfConfig":"12232"},{"size":4260,"mtime":1786084511527,"results":"15714","hashOfConfig":"12232"},{"size":8371,"mtime":1786084511528,"results":"15715","hashOfConfig":"12232"},{"size":3344,"mtime":1786084511528,"results":"15716","hashOfConfig":"12232"},{"size":7703,"mtime":1786084511528,"results":"15717","hashOfConfig":"12232"},{"size":17102,"mtime":1786084511528,"results":"15718","hashOfConfig":"12232"},{"size":2699,"mtime":1786084511528,"results":"15719","hashOfConfig":"12232"},{"size":2850,"mtime":1786084511528,"results":"15720","hashOfConfig":"12232"},{"size":8567,"mtime":1786084511528,"results":"15721","hashOfConfig":"12232"},{"size":3974,"mtime":1786084511529,"results":"15722","hashOfConfig":"12232"},{"size":2042,"mtime":1786084511529,"results":"15723","hashOfConfig":"12285"},{"size":9906,"mtime":1786084511529,"results":"15724","hashOfConfig":"12232"},{"size":1274,"mtime":1786084511529,"results":"15725","hashOfConfig":"12232"},{"size":1110,"mtime":1786084511529,"results":"15726","hashOfConfig":"12232"},{"size":2690,"mtime":1786084511529,"results":"15727","hashOfConfig":"12232"},{"size":4216,"mtime":1786084511529,"results":"15728","hashOfConfig":"12232"},{"size":2071,"mtime":1786084511530,"results":"15729","hashOfConfig":"12232"},{"size":4490,"mtime":1786084511530,"results":"15730","hashOfConfig":"12232"},{"size":4157,"mtime":1786084511530,"results":"15731","hashOfConfig":"12232"},{"size":2651,"mtime":1786084511530,"results":"15732","hashOfConfig":"12232"},{"size":5577,"mtime":1786084511530,"results":"15733","hashOfConfig":"12232"},{"size":4886,"mtime":1786084511530,"results":"15734","hashOfConfig":"12232"},{"size":1918,"mtime":1786084511530,"results":"15735","hashOfConfig":"12232"},{"size":2058,"mtime":1786084511530,"results":"15736","hashOfConfig":"12232"},{"size":1780,"mtime":1786084511531,"results":"15737","hashOfConfig":"12232"},{"size":24511,"mtime":1786084511531,"results":"15738","hashOfConfig":"12232"},{"size":2149,"mtime":1786084511531,"results":"15739","hashOfConfig":"12232"},{"size":4036,"mtime":1786084511531,"results":"15740","hashOfConfig":"12232"},{"size":15407,"mtime":1786084511532,"results":"15741","hashOfConfig":"12232"},{"size":4252,"mtime":1786084511532,"results":"15742","hashOfConfig":"12232"},{"size":2763,"mtime":1786084511532,"results":"15743","hashOfConfig":"12232"},{"size":7308,"mtime":1786084511532,"results":"15744","hashOfConfig":"12232"},{"size":3761,"mtime":1786084511533,"results":"15745","hashOfConfig":"12232"},{"size":8803,"mtime":1786084511533,"results":"15746","hashOfConfig":"12232"},{"size":21933,"mtime":1786084511533,"results":"15747","hashOfConfig":"12232"},{"size":10202,"mtime":1786084511534,"results":"15748","hashOfConfig":"12232"},{"size":4069,"mtime":1786084511534,"results":"15749","hashOfConfig":"12232"},{"size":8515,"mtime":1786084511534,"results":"15750","hashOfConfig":"12232"},{"size":15917,"mtime":1786084511534,"results":"15751","hashOfConfig":"12232"},{"size":77813,"mtime":1786084511536,"results":"15752","hashOfConfig":"12232"},{"size":9094,"mtime":1786084511536,"results":"15753","hashOfConfig":"12232"},{"size":4933,"mtime":1786084511536,"results":"15754","hashOfConfig":"12232"},{"size":11950,"mtime":1786084511536,"results":"15755","hashOfConfig":"12232"},{"size":1269,"mtime":1786084511537,"results":"15756","hashOfConfig":"12232"},{"size":21182,"mtime":1786084511537,"results":"15757","hashOfConfig":"12232"},{"size":6165,"mtime":1786084511537,"results":"15758","hashOfConfig":"12232"},{"size":3038,"mtime":1786084511537,"results":"15759","hashOfConfig":"12232"},{"size":5022,"mtime":1786084511538,"results":"15760","hashOfConfig":"12232"},{"size":1717,"mtime":1786084511538,"results":"15761","hashOfConfig":"12232"},{"size":6092,"mtime":1786084511538,"results":"15762","hashOfConfig":"12232"},{"size":3112,"mtime":1786084511538,"results":"15763","hashOfConfig":"12232"},{"size":2234,"mtime":1786084511538,"results":"15764","hashOfConfig":"12232"},{"size":6195,"mtime":1786084511539,"results":"15765","hashOfConfig":"12232"},{"size":4395,"mtime":1786084511539,"results":"15766","hashOfConfig":"12232"},{"size":4804,"mtime":1786084511539,"results":"15767","hashOfConfig":"12232"},{"size":6989,"mtime":1786084511539,"results":"15768","hashOfConfig":"12232"},{"size":2222,"mtime":1786084511540,"results":"15769","hashOfConfig":"12232"},{"size":6450,"mtime":1786084511540,"results":"15770","hashOfConfig":"12232"},{"size":15803,"mtime":1786084511540,"results":"15771","hashOfConfig":"12232"},{"size":6087,"mtime":1786084511540,"results":"15772","hashOfConfig":"12232"},{"size":387,"mtime":1786084511541,"results":"15773","hashOfConfig":"12232"},{"size":3398,"mtime":1786084511541,"results":"15774","hashOfConfig":"12232"},{"size":1453,"mtime":1786084511541,"results":"15775","hashOfConfig":"12232"},{"size":3372,"mtime":1786084511541,"results":"15776","hashOfConfig":"12232"},{"size":5902,"mtime":1786084511542,"results":"15777","hashOfConfig":"12232"},{"size":3539,"mtime":1786084511542,"results":"15778","hashOfConfig":"12232"},{"size":5719,"mtime":1786084511542,"results":"15779","hashOfConfig":"12232"},{"size":4435,"mtime":1786084511542,"results":"15780","hashOfConfig":"12232"},{"size":24304,"mtime":1786084511543,"results":"15781","hashOfConfig":"12232"},{"size":2038,"mtime":1786084511543,"results":"15782","hashOfConfig":"12232"},{"size":3833,"mtime":1786084511543,"results":"15783","hashOfConfig":"12232"},{"size":5535,"mtime":1786084511543,"results":"15784","hashOfConfig":"12232"},{"size":6622,"mtime":1786084511544,"results":"15785","hashOfConfig":"12232"},{"size":5399,"mtime":1786084511544,"results":"15786","hashOfConfig":"12232"},{"size":6449,"mtime":1786084511544,"results":"15787","hashOfConfig":"12232"},{"size":2387,"mtime":1786084511544,"results":"15788","hashOfConfig":"12232"},{"size":2549,"mtime":1786084511545,"results":"15789","hashOfConfig":"12232"},{"size":4072,"mtime":1786084511545,"results":"15790","hashOfConfig":"12232"},{"size":1035,"mtime":1786084511545,"results":"15791","hashOfConfig":"12232"},{"size":3487,"mtime":1786084511545,"results":"15792","hashOfConfig":"12232"},{"size":1416,"mtime":1786084511545,"results":"15793","hashOfConfig":"12232"},{"size":1782,"mtime":1786084511545,"results":"15794","hashOfConfig":"12232"},{"size":6707,"mtime":1786084511545,"results":"15795","hashOfConfig":"12232"},{"size":5393,"mtime":1786084511546,"results":"15796","hashOfConfig":"12232"},{"size":7615,"mtime":1786084511546,"results":"15797","hashOfConfig":"12232"},{"size":7555,"mtime":1786084511546,"results":"15798","hashOfConfig":"12232"},{"size":7177,"mtime":1786084511546,"results":"15799","hashOfConfig":"12232"},{"size":3249,"mtime":1786084511546,"results":"15800","hashOfConfig":"12232"},{"size":3396,"mtime":1786084511546,"results":"15801","hashOfConfig":"12232"},{"size":13254,"mtime":1786084511547,"results":"15802","hashOfConfig":"12232"},{"size":1664,"mtime":1786084511547,"results":"15803","hashOfConfig":"12232"},{"size":8784,"mtime":1786084511547,"results":"15804","hashOfConfig":"12232"},{"size":4175,"mtime":1786084511547,"results":"15805","hashOfConfig":"12232"},{"size":7722,"mtime":1786084511547,"results":"15806","hashOfConfig":"12232"},{"size":3262,"mtime":1786084511547,"results":"15807","hashOfConfig":"12232"},{"size":5593,"mtime":1786084511548,"results":"15808","hashOfConfig":"12232"},{"size":3146,"mtime":1786084511548,"results":"15809","hashOfConfig":"12232"},{"size":5137,"mtime":1786084511548,"results":"15810","hashOfConfig":"12232"},{"size":1413,"mtime":1786084511548,"results":"15811","hashOfConfig":"12232"},{"size":8529,"mtime":1786084511548,"results":"15812","hashOfConfig":"12232"},{"size":464,"mtime":1786084511548,"results":"15813","hashOfConfig":"12232"},{"size":3796,"mtime":1786084511548,"results":"15814","hashOfConfig":"12232"},{"size":4458,"mtime":1786084511548,"results":"15815","hashOfConfig":"12232"},{"size":8059,"mtime":1786084511549,"results":"15816","hashOfConfig":"12232"},{"size":1320,"mtime":1786084511549,"results":"15817","hashOfConfig":"12232"},{"size":8178,"mtime":1786084511549,"results":"15818","hashOfConfig":"12232"},{"size":2255,"mtime":1786084511549,"results":"15819","hashOfConfig":"12232"},{"size":4386,"mtime":1786084511549,"results":"15820","hashOfConfig":"12232"},{"size":2900,"mtime":1786084511549,"results":"15821","hashOfConfig":"12232"},{"size":3281,"mtime":1786084511550,"results":"15822","hashOfConfig":"12232"},{"size":2959,"mtime":1786084511550,"results":"15823","hashOfConfig":"12232"},{"size":2854,"mtime":1786084511550,"results":"15824","hashOfConfig":"12232"},{"size":3571,"mtime":1786084511550,"results":"15825","hashOfConfig":"12232"},{"size":4150,"mtime":1786084511550,"results":"15826","hashOfConfig":"12232"},{"size":1966,"mtime":1786084511550,"results":"15827","hashOfConfig":"12232"},{"size":2682,"mtime":1786084511551,"results":"15828","hashOfConfig":"12232"},{"size":3738,"mtime":1786084511551,"results":"15829","hashOfConfig":"12232"},{"size":1788,"mtime":1786084511551,"results":"15830","hashOfConfig":"12232"},{"size":1442,"mtime":1786084511551,"results":"15831","hashOfConfig":"12232"},{"size":2169,"mtime":1786084511551,"results":"15832","hashOfConfig":"12232"},{"size":7982,"mtime":1786084511551,"results":"15833","hashOfConfig":"12232"},{"size":2845,"mtime":1786084511551,"results":"15834","hashOfConfig":"12232"},{"size":1861,"mtime":1786084511551,"results":"15835","hashOfConfig":"12232"},{"size":2451,"mtime":1786084511552,"results":"15836","hashOfConfig":"12232"},{"size":2800,"mtime":1786084511552,"results":"15837","hashOfConfig":"12232"},{"size":3022,"mtime":1786084511552,"results":"15838","hashOfConfig":"12232"},{"size":13390,"mtime":1786084511552,"results":"15839","hashOfConfig":"12232"},{"size":5257,"mtime":1786084511552,"results":"15840","hashOfConfig":"12232"},{"size":5201,"mtime":1786084511552,"results":"15841","hashOfConfig":"12232"},{"size":1645,"mtime":1786084511552,"results":"15842","hashOfConfig":"12232"},{"size":3517,"mtime":1786084511553,"results":"15843","hashOfConfig":"12232"},{"size":1786,"mtime":1786084511553,"results":"15844","hashOfConfig":"12232"},{"size":2391,"mtime":1786084511553,"results":"15845","hashOfConfig":"12232"},{"size":1999,"mtime":1786084511553,"results":"15846","hashOfConfig":"12232"},{"size":1252,"mtime":1786084511553,"results":"15847","hashOfConfig":"12232"},{"size":5770,"mtime":1786084511553,"results":"15848","hashOfConfig":"12232"},{"size":2274,"mtime":1786084511553,"results":"15849","hashOfConfig":"12285"},{"size":6317,"mtime":1786084511554,"results":"15850","hashOfConfig":"12232"},{"size":3853,"mtime":1786084511554,"results":"15851","hashOfConfig":"12232"},{"size":3993,"mtime":1786084511554,"results":"15852","hashOfConfig":"12232"},{"size":2520,"mtime":1786084511554,"results":"15853","hashOfConfig":"12232"},{"size":6316,"mtime":1786084511554,"results":"15854","hashOfConfig":"12232"},{"size":2853,"mtime":1786084511554,"results":"15855","hashOfConfig":"12232"},{"size":20161,"mtime":1786084511554,"results":"15856","hashOfConfig":"12232"},{"size":8205,"mtime":1786084511555,"results":"15857","hashOfConfig":"12232"},{"size":13593,"mtime":1786084511555,"results":"15858","hashOfConfig":"12232"},{"size":3950,"mtime":1786084511555,"results":"15859","hashOfConfig":"12232"},{"size":4910,"mtime":1786084511555,"results":"15860","hashOfConfig":"12232"},{"size":5771,"mtime":1786084511555,"results":"15861","hashOfConfig":"12232"},{"size":8131,"mtime":1786084511555,"results":"15862","hashOfConfig":"12232"},{"size":3857,"mtime":1786084511556,"results":"15863","hashOfConfig":"12232"},{"size":20105,"mtime":1786084511556,"results":"15864","hashOfConfig":"12232"},{"size":44296,"mtime":1786084511556,"results":"15865","hashOfConfig":"12232"},{"size":6034,"mtime":1786084511556,"results":"15866","hashOfConfig":"12232"},{"size":5088,"mtime":1786084511557,"results":"15867","hashOfConfig":"12232"},{"size":6424,"mtime":1786084511557,"results":"15868","hashOfConfig":"12232"},{"size":2325,"mtime":1786084511557,"results":"15869","hashOfConfig":"12232"},{"size":2218,"mtime":1786084511557,"results":"15870","hashOfConfig":"12232"},{"size":4904,"mtime":1786084511557,"results":"15871","hashOfConfig":"12232"},{"size":4344,"mtime":1786084511557,"results":"15872","hashOfConfig":"12232"},{"size":6685,"mtime":1786084511557,"results":"15873","hashOfConfig":"12232"},{"size":15529,"mtime":1786084511558,"results":"15874","hashOfConfig":"12285"},{"size":3561,"mtime":1786084511558,"results":"15875","hashOfConfig":"12232"},{"size":2629,"mtime":1786084511558,"results":"15876","hashOfConfig":"12232"},{"size":5650,"mtime":1786084511558,"results":"15877","hashOfConfig":"12232"},{"size":2833,"mtime":1786084511558,"results":"15878","hashOfConfig":"12232"},{"size":2977,"mtime":1786084511558,"results":"15879","hashOfConfig":"12232"},{"size":3721,"mtime":1786084511558,"results":"15880","hashOfConfig":"12232"},{"size":1715,"mtime":1786084511558,"results":"15881","hashOfConfig":"12232"},{"size":1134,"mtime":1786084511559,"results":"15882","hashOfConfig":"12232"},{"size":3924,"mtime":1786084511559,"results":"15883","hashOfConfig":"12232"},{"size":2666,"mtime":1786084511559,"results":"15884","hashOfConfig":"12232"},{"size":3685,"mtime":1786084511559,"results":"15885","hashOfConfig":"12232"},{"size":3451,"mtime":1786084511559,"results":"15886","hashOfConfig":"12232"},{"size":4348,"mtime":1786084511559,"results":"15887","hashOfConfig":"12232"},{"size":8496,"mtime":1786084511559,"results":"15888","hashOfConfig":"12232"},{"size":4806,"mtime":1786084511560,"results":"15889","hashOfConfig":"12232"},{"size":3334,"mtime":1786084511560,"results":"15890","hashOfConfig":"12232"},{"size":2578,"mtime":1786084511560,"results":"15891","hashOfConfig":"12232"},{"size":3336,"mtime":1786084511560,"results":"15892","hashOfConfig":"12232"},{"size":9890,"mtime":1786084511560,"results":"15893","hashOfConfig":"12232"},{"size":5116,"mtime":1786084511560,"results":"15894","hashOfConfig":"12232"},{"size":16863,"mtime":1786084511561,"results":"15895","hashOfConfig":"12232"},{"size":1413,"mtime":1786084511561,"results":"15896","hashOfConfig":"12232"},{"size":4292,"mtime":1786084511561,"results":"15897","hashOfConfig":"12232"},{"size":9427,"mtime":1786084511561,"results":"15898","hashOfConfig":"12232"},{"size":2357,"mtime":1786084511561,"results":"15899","hashOfConfig":"12232"},{"size":11540,"mtime":1786084511561,"results":"15900","hashOfConfig":"12232"},{"size":13235,"mtime":1786084511561,"results":"15901","hashOfConfig":"12232"},{"size":15961,"mtime":1786084511562,"results":"15902","hashOfConfig":"12232"},{"size":7942,"mtime":1786084511562,"results":"15903","hashOfConfig":"12232"},{"size":2760,"mtime":1786084511562,"results":"15904","hashOfConfig":"12232"},{"size":13197,"mtime":1786084511562,"results":"15905","hashOfConfig":"12232"},{"size":658,"mtime":1786084511563,"results":"15906","hashOfConfig":"12232"},{"size":5879,"mtime":1786084511563,"results":"15907","hashOfConfig":"8189"},{"size":19684,"mtime":1786084511563,"results":"15908","hashOfConfig":"8189"},{"size":11249,"mtime":1786084511563,"results":"15909","hashOfConfig":"8189"},{"size":7462,"mtime":1786084511563,"results":"15910","hashOfConfig":"12232"},{"size":7401,"mtime":1786084511563,"results":"15911","hashOfConfig":"12232"},{"size":11967,"mtime":1786084511564,"results":"15912","hashOfConfig":"8189"},{"size":17295,"mtime":1786084511564,"results":"15913","hashOfConfig":"8189"},{"size":11105,"mtime":1786084511564,"results":"15914","hashOfConfig":"8189"},{"size":12939,"mtime":1786084511564,"results":"15915","hashOfConfig":"8189"},{"size":12077,"mtime":1786084511564,"results":"15916","hashOfConfig":"8189"},{"size":12120,"mtime":1786084511565,"results":"15917","hashOfConfig":"8189"},{"size":15685,"mtime":1786084511565,"results":"15918","hashOfConfig":"12232"},{"size":13002,"mtime":1786084511565,"results":"15919","hashOfConfig":"8189"},{"size":15788,"mtime":1786084511565,"results":"15920","hashOfConfig":"8189"},{"size":31326,"mtime":1786084511565,"results":"15921","hashOfConfig":"8189"},{"size":10241,"mtime":1786084511566,"results":"15922","hashOfConfig":"8189"},{"size":3598,"mtime":1786084511566,"results":"15923","hashOfConfig":"12232"},{"size":4760,"mtime":1786084511566,"results":"15924","hashOfConfig":"12232"},{"size":2716,"mtime":1786084511566,"results":"15925","hashOfConfig":"12232"},{"size":3113,"mtime":1786084511566,"results":"15926","hashOfConfig":"12232"},{"size":4684,"mtime":1786084511566,"results":"15927","hashOfConfig":"12232"},{"size":29575,"mtime":1786084511567,"results":"15928","hashOfConfig":"12232"},{"size":2188,"mtime":1786084511567,"results":"15929","hashOfConfig":"12232"},{"size":2074,"mtime":1786084511567,"results":"15930","hashOfConfig":"12232"},{"size":1986,"mtime":1786084511567,"results":"15931","hashOfConfig":"12232"},{"size":8443,"mtime":1786084511567,"results":"15932","hashOfConfig":"12232"},{"size":1866,"mtime":1786084511567,"results":"15933","hashOfConfig":"12232"},{"size":5893,"mtime":1786084511567,"results":"15934","hashOfConfig":"12232"},{"size":38310,"mtime":1786084511568,"results":"15935","hashOfConfig":"12232"},{"size":787,"mtime":1786084511568,"results":"15936","hashOfConfig":"12232"},{"size":24959,"mtime":1786084511568,"results":"15937","hashOfConfig":"12232"},{"size":5494,"mtime":1786084511568,"results":"15938","hashOfConfig":"12232"},{"size":1657,"mtime":1786084511568,"results":"15939","hashOfConfig":"12232"},{"size":8635,"mtime":1786084511569,"results":"15940","hashOfConfig":"12232"},{"size":57546,"mtime":1786084511569,"results":"15941","hashOfConfig":"12232"},{"size":41991,"mtime":1786084511569,"results":"15942","hashOfConfig":"12232"},{"size":3227,"mtime":1786084511569,"results":"15943","hashOfConfig":"12232"},{"size":3291,"mtime":1786084511569,"results":"15944","hashOfConfig":"12232"},{"size":2134,"mtime":1786084511569,"results":"15945","hashOfConfig":"12232"},{"size":12968,"mtime":1786084511570,"results":"15946","hashOfConfig":"12232"},{"size":1071,"mtime":1786084511570,"results":"15947","hashOfConfig":"12232"},{"size":7912,"mtime":1786084511570,"results":"15948","hashOfConfig":"12232"},{"size":4655,"mtime":1786084511570,"results":"15949","hashOfConfig":"12232"},{"size":37767,"mtime":1786084511570,"results":"15950","hashOfConfig":"12232"},{"size":2927,"mtime":1786084511571,"results":"15951","hashOfConfig":"12232"},{"size":9479,"mtime":1786084511571,"results":"15952","hashOfConfig":"12232"},{"size":8230,"mtime":1786084511571,"results":"15953","hashOfConfig":"12232"},{"size":15255,"mtime":1786084511571,"results":"15954","hashOfConfig":"12232"},{"size":22451,"mtime":1786084511571,"results":"15955","hashOfConfig":"12232"},{"size":4118,"mtime":1786084511572,"results":"15956","hashOfConfig":"12232"},{"size":18479,"mtime":1786084511572,"results":"15957","hashOfConfig":"12232"},{"size":4349,"mtime":1786084511572,"results":"15958","hashOfConfig":"12232"},{"size":961,"mtime":1786084511572,"results":"15959","hashOfConfig":"12232"},{"size":1302,"mtime":1786084511572,"results":"15960","hashOfConfig":"12232"},{"size":1120,"mtime":1786084511572,"results":"15961","hashOfConfig":"12232"},{"size":7290,"mtime":1786084511572,"results":"15962","hashOfConfig":"12232"},{"size":13834,"mtime":1786084511572,"results":"15963","hashOfConfig":"12232"},{"size":5283,"mtime":1786084511573,"results":"15964","hashOfConfig":"12232"},{"size":4695,"mtime":1786084511573,"results":"15965","hashOfConfig":"12232"},{"size":1802,"mtime":1786084511573,"results":"15966","hashOfConfig":"12232"},{"size":2787,"mtime":1786084511573,"results":"15967","hashOfConfig":"12232"},{"size":3252,"mtime":1786084511573,"results":"15968","hashOfConfig":"12232"},{"size":4443,"mtime":1786084511573,"results":"15969","hashOfConfig":"12232"},{"size":8375,"mtime":1786084511573,"results":"15970","hashOfConfig":"12232"},{"size":4060,"mtime":1786084511573,"results":"15971","hashOfConfig":"12232"},{"size":3379,"mtime":1786084511574,"results":"15972","hashOfConfig":"12232"},{"size":5195,"mtime":1786084511574,"results":"15973","hashOfConfig":"12232"},{"size":5883,"mtime":1786084511574,"results":"15974","hashOfConfig":"12232"},{"size":5354,"mtime":1786084511574,"results":"15975","hashOfConfig":"12232"},{"size":3832,"mtime":1786084511574,"results":"15976","hashOfConfig":"12232"},{"size":2956,"mtime":1786084511574,"results":"15977","hashOfConfig":"12232"},{"size":5645,"mtime":1786084511574,"results":"15978","hashOfConfig":"12232"},{"size":2667,"mtime":1786084511574,"results":"15979","hashOfConfig":"12232"},{"size":6516,"mtime":1786084511575,"results":"15980","hashOfConfig":"8189"},{"size":1535,"mtime":1786084511575,"results":"15981","hashOfConfig":"8189"},{"size":2959,"mtime":1786084511575,"results":"15982","hashOfConfig":"8189"},{"size":6595,"mtime":1786084511575,"results":"15983","hashOfConfig":"8189"},{"size":9705,"mtime":1786084511575,"results":"15984","hashOfConfig":"8189"},{"size":16726,"mtime":1786084511575,"results":"15985","hashOfConfig":"8189"},{"size":4782,"mtime":1786084511576,"results":"15986","hashOfConfig":"8189"},{"size":4554,"mtime":1786084511576,"results":"15987","hashOfConfig":"8189"},{"size":7649,"mtime":1786084511576,"results":"15988","hashOfConfig":"8189"},{"size":6136,"mtime":1786084511576,"results":"15989","hashOfConfig":"8189"},{"size":3387,"mtime":1786084511576,"results":"15990","hashOfConfig":"8189"},{"size":2181,"mtime":1786084511576,"results":"15991","hashOfConfig":"8189"},{"size":2154,"mtime":1786084511576,"results":"15992","hashOfConfig":"8189"},{"size":6110,"mtime":1786084511576,"results":"15993","hashOfConfig":"8189"},{"size":5340,"mtime":1786084511576,"results":"15994","hashOfConfig":"8189"},{"size":1348,"mtime":1786084511577,"results":"15995","hashOfConfig":"8189"},{"size":9877,"mtime":1786084511577,"results":"15996","hashOfConfig":"8189"},{"size":3419,"mtime":1786084511577,"results":"15997","hashOfConfig":"12232"},{"size":6041,"mtime":1786084511577,"results":"15998","hashOfConfig":"8189"},{"size":4597,"mtime":1786084511577,"results":"15999","hashOfConfig":"8189"},{"size":4136,"mtime":1786084511577,"results":"16000","hashOfConfig":"8189"},{"size":6613,"mtime":1786084511577,"results":"16001","hashOfConfig":"8189"},{"size":2949,"mtime":1786084511577,"results":"16002","hashOfConfig":"8189"},{"size":11821,"mtime":1786084511578,"results":"16003","hashOfConfig":"8189"},{"size":6652,"mtime":1786084511578,"results":"16004","hashOfConfig":"8189"},{"size":3522,"mtime":1786084511578,"results":"16005","hashOfConfig":"8189"},{"size":3716,"mtime":1786084511578,"results":"16006","hashOfConfig":"8189"},{"size":4158,"mtime":1786084511578,"results":"16007","hashOfConfig":"8189"},{"size":3783,"mtime":1786084511578,"results":"16008","hashOfConfig":"8189"},{"size":5842,"mtime":1786084511578,"results":"16009","hashOfConfig":"8189"},{"size":4312,"mtime":1786084511578,"results":"16010","hashOfConfig":"8189"},{"size":4391,"mtime":1786084511578,"results":"16011","hashOfConfig":"8189"},{"size":1531,"mtime":1786084511579,"results":"16012","hashOfConfig":"8189"},{"size":5665,"mtime":1786084511579,"results":"16013","hashOfConfig":"8189"},{"size":2977,"mtime":1786084511579,"results":"16014","hashOfConfig":"8189"},{"size":2887,"mtime":1786084511579,"results":"16015","hashOfConfig":"8189"},{"size":3488,"mtime":1786084511579,"results":"16016","hashOfConfig":"8189"},{"size":2927,"mtime":1786084511579,"results":"16017","hashOfConfig":"8189"},{"size":4161,"mtime":1786084511579,"results":"16018","hashOfConfig":"12232"},{"size":4951,"mtime":1786084511580,"results":"16019","hashOfConfig":"12232"},{"size":12938,"mtime":1786084511580,"results":"16020","hashOfConfig":"12232"},{"size":8393,"mtime":1786084511580,"results":"16021","hashOfConfig":"8189"},{"size":2194,"mtime":1786084511580,"results":"16022","hashOfConfig":"8189"},{"size":373,"mtime":1786084511580,"results":"16023","hashOfConfig":"8189"},{"size":3806,"mtime":1786084511581,"results":"16024","hashOfConfig":"8189"},{"size":4394,"mtime":1786084511581,"results":"16025","hashOfConfig":"8189"},{"size":5676,"mtime":1786084511581,"results":"16026","hashOfConfig":"8189"},{"size":5848,"mtime":1786084511581,"results":"16027","hashOfConfig":"8189"},{"size":4808,"mtime":1786084511581,"results":"16028","hashOfConfig":"8189"},{"size":4912,"mtime":1786084511581,"results":"16029","hashOfConfig":"8189"},{"size":4052,"mtime":1786084511582,"results":"16030","hashOfConfig":"8189"},{"size":4645,"mtime":1786084511582,"results":"16031","hashOfConfig":"8189"},{"size":3602,"mtime":1786084511582,"results":"16032","hashOfConfig":"12232"},{"size":3500,"mtime":1786084511582,"results":"16033","hashOfConfig":"8189"},{"size":4887,"mtime":1786084511582,"results":"16034","hashOfConfig":"8189"},{"size":5180,"mtime":1786084511583,"results":"16035","hashOfConfig":"8189"},{"size":2033,"mtime":1786084511583,"results":"16036","hashOfConfig":"8189"},{"size":7341,"mtime":1786084511583,"results":"16037","hashOfConfig":"8189"},{"size":7968,"mtime":1786084511583,"results":"16038","hashOfConfig":"12232"},{"size":5668,"mtime":1786084511583,"results":"16039","hashOfConfig":"8189"},{"size":6605,"mtime":1786084511584,"results":"16040","hashOfConfig":"8189"},{"size":7136,"mtime":1786084511584,"results":"16041","hashOfConfig":"8189"},{"size":7280,"mtime":1786084511584,"results":"16042","hashOfConfig":"8189"},{"size":5631,"mtime":1786084511584,"results":"16043","hashOfConfig":"8189"},{"size":2167,"mtime":1786084511584,"results":"16044","hashOfConfig":"8189"},{"size":5653,"mtime":1786084511584,"results":"16045","hashOfConfig":"8189"},{"size":5854,"mtime":1786084511585,"results":"16046","hashOfConfig":"8189"},{"size":3665,"mtime":1786084511585,"results":"16047","hashOfConfig":"8189"},{"size":2814,"mtime":1786084511585,"results":"16048","hashOfConfig":"8189"},{"size":7308,"mtime":1786084511585,"results":"16049","hashOfConfig":"8189"},{"size":5763,"mtime":1786084511585,"results":"16050","hashOfConfig":"8189"},{"size":4115,"mtime":1786084511586,"results":"16051","hashOfConfig":"8189"},{"size":2815,"mtime":1786084511586,"results":"16052","hashOfConfig":"8189"},{"size":4456,"mtime":1786084511586,"results":"16053","hashOfConfig":"8189"},{"size":1076,"mtime":1786084511586,"results":"16054","hashOfConfig":"8189"},{"size":2372,"mtime":1786084511586,"results":"16055","hashOfConfig":"12232"},{"size":7910,"mtime":1786084511586,"results":"16056","hashOfConfig":"8189"},{"size":9943,"mtime":1786084511587,"results":"16057","hashOfConfig":"8189"},{"size":6358,"mtime":1786084511587,"results":"16058","hashOfConfig":"8189"},{"size":7050,"mtime":1786084511587,"results":"16059","hashOfConfig":"8189"},{"size":7175,"mtime":1786084511587,"results":"16060","hashOfConfig":"8189"},{"size":8346,"mtime":1786084511587,"results":"16061","hashOfConfig":"8189"},{"size":17447,"mtime":1786084511588,"results":"16062","hashOfConfig":"8189"},{"size":4771,"mtime":1786084511588,"results":"16063","hashOfConfig":"8189"},{"size":386,"mtime":1786084511588,"results":"16064","hashOfConfig":"8189"},{"size":1069,"mtime":1786084511588,"results":"16065","hashOfConfig":"8189"},{"size":6745,"mtime":1786084511588,"results":"16066","hashOfConfig":"12232"},{"size":2672,"mtime":1786084511588,"results":"16067","hashOfConfig":"8189"},{"size":11131,"mtime":1786084511589,"results":"16068","hashOfConfig":"8189"},{"size":11993,"mtime":1786084511589,"results":"16069","hashOfConfig":"8189"},{"size":8551,"mtime":1786084511589,"results":"16070","hashOfConfig":"8189"},{"size":1095,"mtime":1786084511589,"results":"16071","hashOfConfig":"8189"},{"size":15878,"mtime":1786084511590,"results":"16072","hashOfConfig":"8189"},{"size":3953,"mtime":1786084511590,"results":"16073","hashOfConfig":"8189"},{"size":2107,"mtime":1786084511590,"results":"16074","hashOfConfig":"8189"},{"size":5040,"mtime":1786084511590,"results":"16075","hashOfConfig":"8189"},{"size":2867,"mtime":1786084511590,"results":"16076","hashOfConfig":"8189"},{"size":4195,"mtime":1786084511590,"results":"16077","hashOfConfig":"8189"},{"size":2532,"mtime":1786084511591,"results":"16078","hashOfConfig":"8189"},{"size":2627,"mtime":1786084511591,"results":"16079","hashOfConfig":"8189"},{"size":4936,"mtime":1786084511591,"results":"16080","hashOfConfig":"8189"},{"size":2140,"mtime":1786084511591,"results":"16081","hashOfConfig":"12232"},{"size":1853,"mtime":1786084511592,"results":"16082","hashOfConfig":"12232"},{"size":384,"mtime":1786084511592,"results":"16083","hashOfConfig":"8189"},{"size":3523,"mtime":1786084511592,"results":"16084","hashOfConfig":"8189"},{"size":2520,"mtime":1786084511592,"results":"16085","hashOfConfig":"8189"},{"size":4087,"mtime":1786084511592,"results":"16086","hashOfConfig":"8189"},{"size":2572,"mtime":1786084511592,"results":"16087","hashOfConfig":"12232"},{"size":1341,"mtime":1786084511592,"results":"16088","hashOfConfig":"8189"},{"size":501,"mtime":1786084511593,"results":"16089","hashOfConfig":"8189"},{"size":6662,"mtime":1786084511593,"results":"16090","hashOfConfig":"8189"},{"size":5376,"mtime":1786084511593,"results":"16091","hashOfConfig":"8189"},{"size":10553,"mtime":1786084511593,"results":"16092","hashOfConfig":"8189"},{"size":4985,"mtime":1786084511593,"results":"16093","hashOfConfig":"8189"},{"size":2235,"mtime":1786084511593,"results":"16094","hashOfConfig":"8189"},{"size":3725,"mtime":1786084511594,"results":"16095","hashOfConfig":"8189"},{"size":8780,"mtime":1786084511594,"results":"16096","hashOfConfig":"8189"},{"size":3624,"mtime":1786084511594,"results":"16097","hashOfConfig":"8189"},{"size":6853,"mtime":1786084511594,"results":"16098","hashOfConfig":"8189"},{"size":7092,"mtime":1786084511594,"results":"16099","hashOfConfig":"8189"},{"size":9712,"mtime":1786084511595,"results":"16100","hashOfConfig":"8189"},{"size":3983,"mtime":1786084511595,"results":"16101","hashOfConfig":"8189"},{"size":7553,"mtime":1786084511595,"results":"16102","hashOfConfig":"8189"},{"size":2659,"mtime":1786084511595,"results":"16103","hashOfConfig":"8189"},{"size":2993,"mtime":1786084511595,"results":"16104","hashOfConfig":"8189"},{"size":3222,"mtime":1786084511596,"results":"16105","hashOfConfig":"8189"},{"size":10162,"mtime":1786084511596,"results":"16106","hashOfConfig":"8189"},{"size":3751,"mtime":1786084511596,"results":"16107","hashOfConfig":"8189"},{"size":5297,"mtime":1786084511596,"results":"16108","hashOfConfig":"8189"},{"size":2941,"mtime":1786084511596,"results":"16109","hashOfConfig":"8189"},{"size":1204,"mtime":1786084511597,"results":"16110","hashOfConfig":"8189"},{"size":1848,"mtime":1786084511597,"results":"16111","hashOfConfig":"8189"},{"size":10653,"mtime":1786084511597,"results":"16112","hashOfConfig":"8189"},{"size":10204,"mtime":1786084511597,"results":"16113","hashOfConfig":"8189"},{"size":10254,"mtime":1786084511597,"results":"16114","hashOfConfig":"8189"},{"size":4831,"mtime":1786084511598,"results":"16115","hashOfConfig":"8189"},{"size":9050,"mtime":1786084511598,"results":"16116","hashOfConfig":"8189"},{"size":7296,"mtime":1786084511598,"results":"16117","hashOfConfig":"8189"},{"size":5754,"mtime":1786084511598,"results":"16118","hashOfConfig":"8189"},{"size":5674,"mtime":1786084511598,"results":"16119","hashOfConfig":"8189"},{"size":5426,"mtime":1786084511599,"results":"16120","hashOfConfig":"8189"},{"size":6817,"mtime":1786084511599,"results":"16121","hashOfConfig":"8189"},{"size":5776,"mtime":1786084511599,"results":"16122","hashOfConfig":"8189"},{"size":10125,"mtime":1786084511599,"results":"16123","hashOfConfig":"8189"},{"size":7730,"mtime":1786084511599,"results":"16124","hashOfConfig":"8189"},{"size":3442,"mtime":1786084511600,"results":"16125","hashOfConfig":"8189"},{"size":5800,"mtime":1786084511600,"results":"16126","hashOfConfig":"8189"},{"size":4783,"mtime":1786084511600,"results":"16127","hashOfConfig":"8189"},{"size":1235,"mtime":1786084511600,"results":"16128","hashOfConfig":"8189"},{"size":3377,"mtime":1786084511600,"results":"16129","hashOfConfig":"8189"},{"size":2118,"mtime":1786084511600,"results":"16130","hashOfConfig":"8189"},{"size":4281,"mtime":1786084511601,"results":"16131","hashOfConfig":"8189"},{"size":4188,"mtime":1786084511601,"results":"16132","hashOfConfig":"8189"},{"size":10955,"mtime":1786084511601,"results":"16133","hashOfConfig":"8189"},{"size":3435,"mtime":1786084511601,"results":"16134","hashOfConfig":"8189"},{"size":3078,"mtime":1786084511601,"results":"16135","hashOfConfig":"8189"},{"size":4422,"mtime":1786084511601,"results":"16136","hashOfConfig":"8189"},{"size":5819,"mtime":1786084511602,"results":"16137","hashOfConfig":"8189"},{"size":11232,"mtime":1786084511602,"results":"16138","hashOfConfig":"8189"},{"size":1422,"mtime":1786084511602,"results":"16139","hashOfConfig":"8189"},{"size":2045,"mtime":1786084511602,"results":"16140","hashOfConfig":"12232"},{"size":2832,"mtime":1786084511602,"results":"16141","hashOfConfig":"8189"},{"size":6707,"mtime":1786084511603,"results":"16142","hashOfConfig":"8189"},{"size":9162,"mtime":1786084511603,"results":"16143","hashOfConfig":"8189"},{"size":11785,"mtime":1786084511603,"results":"16144","hashOfConfig":"8189"},{"size":9460,"mtime":1786084511603,"results":"16145","hashOfConfig":"8189"},{"size":1574,"mtime":1786084511603,"results":"16146","hashOfConfig":"8189"},{"size":4114,"mtime":1786084511604,"results":"16147","hashOfConfig":"8189"},{"size":6087,"mtime":1786084511604,"results":"16148","hashOfConfig":"8189"},{"size":4720,"mtime":1786084511604,"results":"16149","hashOfConfig":"8189"},{"size":6857,"mtime":1786084511604,"results":"16150","hashOfConfig":"8189"},{"size":3572,"mtime":1786084511604,"results":"16151","hashOfConfig":"8189"},{"size":5261,"mtime":1786084511604,"results":"16152","hashOfConfig":"8189"},{"size":11235,"mtime":1786084511604,"results":"16153","hashOfConfig":"8189"},{"size":4857,"mtime":1786084511605,"results":"16154","hashOfConfig":"8189"},{"size":7917,"mtime":1786084511605,"results":"16155","hashOfConfig":"8189"},{"size":8638,"mtime":1786084511605,"results":"16156","hashOfConfig":"8189"},{"size":10856,"mtime":1786084511605,"results":"16157","hashOfConfig":"8189"},{"size":9973,"mtime":1786084511605,"results":"16158","hashOfConfig":"8189"},{"size":9538,"mtime":1786084511605,"results":"16159","hashOfConfig":"8189"},{"size":2943,"mtime":1786084511606,"results":"16160","hashOfConfig":"8189"},{"size":5523,"mtime":1786084511606,"results":"16161","hashOfConfig":"8189"},{"size":3859,"mtime":1786084511606,"results":"16162","hashOfConfig":"12232"},{"size":1874,"mtime":1786084511606,"results":"16163","hashOfConfig":"8189"},{"size":5188,"mtime":1786084511606,"results":"16164","hashOfConfig":"8189"},{"size":3069,"mtime":1786084511606,"results":"16165","hashOfConfig":"8189"},{"size":2476,"mtime":1786084511606,"results":"16166","hashOfConfig":"8189"},{"size":1872,"mtime":1786084511606,"results":"16167","hashOfConfig":"8189"},{"size":1381,"mtime":1786084511606,"results":"16168","hashOfConfig":"8189"},{"size":3319,"mtime":1786084511606,"results":"16169","hashOfConfig":"8189"},{"size":4343,"mtime":1786084511607,"results":"16170","hashOfConfig":"8189"},{"size":2934,"mtime":1786084511607,"results":"16171","hashOfConfig":"8189"},{"size":2076,"mtime":1786084511607,"results":"16172","hashOfConfig":"8189"},{"size":3450,"mtime":1786084511607,"results":"16173","hashOfConfig":"8189"},{"size":6875,"mtime":1786084511607,"results":"16174","hashOfConfig":"8189"},{"size":5521,"mtime":1786084511607,"results":"16175","hashOfConfig":"8189"},{"size":4819,"mtime":1786084511607,"results":"16176","hashOfConfig":"8189"},{"size":7618,"mtime":1786084511608,"results":"16177","hashOfConfig":"8189"},{"size":9240,"mtime":1786084511608,"results":"16178","hashOfConfig":"8189"},{"size":3081,"mtime":1786084511608,"results":"16179","hashOfConfig":"8189"},{"size":4534,"mtime":1786084511608,"results":"16180","hashOfConfig":"8189"},{"size":8959,"mtime":1786084511608,"results":"16181","hashOfConfig":"8189"},{"size":9238,"mtime":1786084511608,"results":"16182","hashOfConfig":"8189"},{"size":5785,"mtime":1786084511608,"results":"16183","hashOfConfig":"8189"},{"size":9495,"mtime":1786084511608,"results":"16184","hashOfConfig":"8189"},{"size":6334,"mtime":1786084511609,"results":"16185","hashOfConfig":"8189"},{"size":4111,"mtime":1786084511609,"results":"16186","hashOfConfig":"8189"},{"size":2310,"mtime":1786084511609,"results":"16187","hashOfConfig":"8189"},{"size":6925,"mtime":1786084511609,"results":"16188","hashOfConfig":"8189"},{"size":5222,"mtime":1786084511609,"results":"16189","hashOfConfig":"8189"},{"size":3473,"mtime":1786084511609,"results":"16190","hashOfConfig":"8189"},{"size":4882,"mtime":1786084511574,"results":"16191","hashOfConfig":"12232"},{"size":8202,"mtime":1786084511609,"results":"16192","hashOfConfig":"12232"},{"size":1749,"mtime":1786084511609,"results":"16193","hashOfConfig":"12232"},{"size":4918,"mtime":1786084511609,"results":"16194","hashOfConfig":"12232"},{"size":4596,"mtime":1786084511610,"results":"16195","hashOfConfig":"12232"},{"size":887,"mtime":1786084511610,"results":"16196","hashOfConfig":"12232"},{"size":4131,"mtime":1786084511610,"results":"16197","hashOfConfig":"12232"},{"size":1650,"mtime":1786084511610,"results":"16198","hashOfConfig":"12232"},{"size":2329,"mtime":1786084511610,"results":"16199","hashOfConfig":"12232"},{"size":1682,"mtime":1786084511610,"results":"16200","hashOfConfig":"12232"},{"size":4844,"mtime":1786084511615,"results":"16201","hashOfConfig":"12232"},{"size":12872,"mtime":1786084511610,"results":"16202","hashOfConfig":"12232"},{"size":1221,"mtime":1786084511610,"results":"16203","hashOfConfig":"12232"},{"size":2967,"mtime":1786084511610,"results":"16204","hashOfConfig":"12232"},{"size":3181,"mtime":1786084511611,"results":"16205","hashOfConfig":"12232"},{"size":23562,"mtime":1786084511611,"results":"16206","hashOfConfig":"12232"},{"size":19396,"mtime":1786084511611,"results":"16207","hashOfConfig":"12232"},{"size":2412,"mtime":1786084511611,"results":"16208","hashOfConfig":"12232"},{"size":2236,"mtime":1786084511611,"results":"16209","hashOfConfig":"12232"},{"size":5005,"mtime":1786084511611,"results":"16210","hashOfConfig":"12232"},{"size":5396,"mtime":1786084511611,"results":"16211","hashOfConfig":"12232"},{"size":2771,"mtime":1786084511611,"results":"16212","hashOfConfig":"12232"},{"size":2781,"mtime":1786084511612,"results":"16213","hashOfConfig":"12232"},{"size":4163,"mtime":1786084511612,"results":"16214","hashOfConfig":"12232"},{"size":1539,"mtime":1786084511612,"results":"16215","hashOfConfig":"12232"},{"size":12235,"mtime":1786084511612,"results":"16216","hashOfConfig":"12232"},{"size":3347,"mtime":1786084511612,"results":"16217","hashOfConfig":"12232"},{"size":2546,"mtime":1786084511612,"results":"16218","hashOfConfig":"12232"},{"size":1548,"mtime":1786084511612,"results":"16219","hashOfConfig":"12232"},{"size":5240,"mtime":1786084511612,"results":"16220","hashOfConfig":"12232"},{"size":11906,"mtime":1786084511613,"results":"16221","hashOfConfig":"12232"},{"size":5173,"mtime":1786084511613,"results":"16222","hashOfConfig":"12232"},{"size":13149,"mtime":1786084511613,"results":"16223","hashOfConfig":"12232"},{"size":2263,"mtime":1786084511613,"results":"16224","hashOfConfig":"12232"},{"size":2811,"mtime":1786084511613,"results":"16225","hashOfConfig":"12232"},{"size":929,"mtime":1786084511613,"results":"16226","hashOfConfig":"12232"},{"size":4036,"mtime":1786084511613,"results":"16227","hashOfConfig":"12232"},{"size":5858,"mtime":1786084511613,"results":"16228","hashOfConfig":"12232"},{"size":2423,"mtime":1786084511613,"results":"16229","hashOfConfig":"12232"},{"size":2385,"mtime":1786084511614,"results":"16230","hashOfConfig":"12232"},{"size":2256,"mtime":1786084511614,"results":"16231","hashOfConfig":"12232"},{"size":2693,"mtime":1786084511614,"results":"16232","hashOfConfig":"12232"},{"size":3236,"mtime":1786084511614,"results":"16233","hashOfConfig":"12232"},{"size":5194,"mtime":1786084511614,"results":"16234","hashOfConfig":"12232"},{"size":49189,"mtime":1786084511614,"results":"16235","hashOfConfig":"12232"},{"size":7479,"mtime":1786084511614,"results":"16236","hashOfConfig":"12232"},{"size":13147,"mtime":1786084511615,"results":"16237","hashOfConfig":"12232"},{"size":2944,"mtime":1786084511615,"results":"16238","hashOfConfig":"12232"},{"size":2594,"mtime":1786084511615,"results":"16239","hashOfConfig":"12232"},{"size":2790,"mtime":1786084511615,"results":"16240","hashOfConfig":"12232"},{"size":5102,"mtime":1786084511615,"results":"16241","hashOfConfig":"12232"},{"size":3071,"mtime":1786084511615,"results":"16242","hashOfConfig":"12232"},{"size":5064,"mtime":1786084511616,"results":"16243","hashOfConfig":"12232"},{"size":2984,"mtime":1786084511616,"results":"16244","hashOfConfig":"12232"},{"size":3646,"mtime":1786084511616,"results":"16245","hashOfConfig":"12232"},{"size":2527,"mtime":1786084511616,"results":"16246","hashOfConfig":"12232"},{"size":3037,"mtime":1786084511616,"results":"16247","hashOfConfig":"12232"},{"size":3448,"mtime":1786084511616,"results":"16248","hashOfConfig":"12232"},{"size":4195,"mtime":1786084511616,"results":"16249","hashOfConfig":"12232"},{"size":5910,"mtime":1786084511616,"results":"16250","hashOfConfig":"12232"},{"size":6329,"mtime":1786084511616,"results":"16251","hashOfConfig":"12232"},{"size":3884,"mtime":1786084511616,"results":"16252","hashOfConfig":"12232"},{"size":8535,"mtime":1786084511617,"results":"16253","hashOfConfig":"12232"},{"size":4988,"mtime":1786084511617,"results":"16254","hashOfConfig":"12232"},{"size":3417,"mtime":1786084511617,"results":"16255","hashOfConfig":"12232"},{"size":10054,"mtime":1786084511617,"results":"16256","hashOfConfig":"12232"},{"size":3579,"mtime":1786084511617,"results":"16257","hashOfConfig":"12232"},{"size":2459,"mtime":1786084511617,"results":"16258","hashOfConfig":"12232"},{"size":1855,"mtime":1786084511617,"results":"16259","hashOfConfig":"12232"},{"size":3123,"mtime":1786084511617,"results":"16260","hashOfConfig":"12232"},{"size":1292,"mtime":1786084511617,"results":"16261","hashOfConfig":"12232"},{"size":14494,"mtime":1786084511618,"results":"16262","hashOfConfig":"12232"},{"size":6431,"mtime":1786084511618,"results":"16263","hashOfConfig":"12232"},{"size":1481,"mtime":1786084511618,"results":"16264","hashOfConfig":"12232"},{"size":1341,"mtime":1786084511618,"results":"16265","hashOfConfig":"12232"},{"size":1861,"mtime":1786084511618,"results":"16266","hashOfConfig":"12232"},{"size":2330,"mtime":1786084511618,"results":"16267","hashOfConfig":"12232"},{"size":3139,"mtime":1786084511618,"results":"16268","hashOfConfig":"12232"},{"size":3809,"mtime":1786084511618,"results":"16269","hashOfConfig":"12232"},{"size":1757,"mtime":1786084511618,"results":"16270","hashOfConfig":"12232"},{"size":2964,"mtime":1786084511618,"results":"16271","hashOfConfig":"12232"},{"size":2190,"mtime":1786084511619,"results":"16272","hashOfConfig":"12232"},{"size":3025,"mtime":1786084511619,"results":"16273","hashOfConfig":"12232"},{"size":5508,"mtime":1786084511619,"results":"16274","hashOfConfig":"12232"},{"size":11310,"mtime":1786084511619,"results":"16275","hashOfConfig":"12232"},{"size":4297,"mtime":1786084511619,"results":"16276","hashOfConfig":"12232"},{"size":2182,"mtime":1786084511619,"results":"16277","hashOfConfig":"12232"},{"size":3602,"mtime":1786084511619,"results":"16278","hashOfConfig":"12232"},{"size":3517,"mtime":1786084511619,"results":"16279","hashOfConfig":"12232"},{"size":5042,"mtime":1786084511619,"results":"16280","hashOfConfig":"12232"},{"size":1895,"mtime":1786084511620,"results":"16281","hashOfConfig":"12232"},{"size":7789,"mtime":1786084511620,"results":"16282","hashOfConfig":"12232"},{"size":3027,"mtime":1786084511620,"results":"16283","hashOfConfig":"12232"},{"size":1499,"mtime":1786084511620,"results":"16284","hashOfConfig":"12232"},{"size":12584,"mtime":1786084511620,"results":"16285","hashOfConfig":"12232"},{"size":2461,"mtime":1786084511620,"results":"16286","hashOfConfig":"12232"},{"size":4144,"mtime":1786084511620,"results":"16287","hashOfConfig":"12232"},{"size":6415,"mtime":1786088242944,"results":"16288","hashOfConfig":"12232"},{"size":6945,"mtime":1786084511620,"results":"16289","hashOfConfig":"12232"},{"size":1374,"mtime":1786084511620,"results":"16290","hashOfConfig":"12232"},{"size":4613,"mtime":1786084511621,"results":"16291","hashOfConfig":"12232"},{"size":1834,"mtime":1786084511621,"results":"16292","hashOfConfig":"12232"},{"size":6967,"mtime":1786084511621,"results":"16293","hashOfConfig":"12232"},{"size":17591,"mtime":1786084511621,"results":"16294","hashOfConfig":"12232"},{"size":11104,"mtime":1786084511621,"results":"16295","hashOfConfig":"12232"},{"size":7458,"mtime":1786084511621,"results":"16296","hashOfConfig":"12232"},{"size":9463,"mtime":1786084511621,"results":"16297","hashOfConfig":"12232"},{"size":7869,"mtime":1786084511622,"results":"16298","hashOfConfig":"12232"},{"size":6821,"mtime":1786084511622,"results":"16299","hashOfConfig":"12232"},{"size":8024,"mtime":1786084511622,"results":"16300","hashOfConfig":"12232"},{"size":3955,"mtime":1786084511622,"results":"16301","hashOfConfig":"12232"},{"size":790,"mtime":1786084511622,"results":"16302","hashOfConfig":"12232"},{"size":4840,"mtime":1786084529051,"results":"16303","hashOfConfig":"12232"},{"size":3265,"mtime":1786084511622,"results":"16304","hashOfConfig":"12232"},{"size":2701,"mtime":1786084511622,"results":"16305","hashOfConfig":"12232"},{"size":3931,"mtime":1786084511623,"results":"16306","hashOfConfig":"12232"},{"size":3801,"mtime":1786084511623,"results":"16307","hashOfConfig":"12232"},{"size":3937,"mtime":1786084511623,"results":"16308","hashOfConfig":"12232"},{"size":5674,"mtime":1786084511623,"results":"16309","hashOfConfig":"12232"},{"size":3689,"mtime":1786084511623,"results":"16310","hashOfConfig":"12232"},{"size":4158,"mtime":1786084511623,"results":"16311","hashOfConfig":"12232"},{"size":2071,"mtime":1786084511623,"results":"16312","hashOfConfig":"12232"},{"size":6797,"mtime":1786084511623,"results":"16313","hashOfConfig":"12232"},{"size":6000,"mtime":1786084511623,"results":"16314","hashOfConfig":"12232"},{"size":46093,"mtime":1786084511624,"results":"16315","hashOfConfig":"12232"},{"size":1947,"mtime":1786084511624,"results":"16316","hashOfConfig":"12232"},{"size":3002,"mtime":1786084511624,"results":"16317","hashOfConfig":"12232"},{"size":2827,"mtime":1786084511624,"results":"16318","hashOfConfig":"12285"},{"size":5862,"mtime":1786084511624,"results":"16319","hashOfConfig":"12232"},{"size":31230,"mtime":1786084511624,"results":"16320","hashOfConfig":"12232"},{"size":4998,"mtime":1786084511625,"results":"16321","hashOfConfig":"12232"},{"size":1724,"mtime":1786084511625,"results":"16322","hashOfConfig":"12232"},{"size":4408,"mtime":1786084511625,"results":"16323","hashOfConfig":"12232"},{"size":5155,"mtime":1786084511625,"results":"16324","hashOfConfig":"12232"},{"size":5222,"mtime":1786084511625,"results":"16325","hashOfConfig":"12232"},{"size":5187,"mtime":1786084511625,"results":"16326","hashOfConfig":"12232"},{"size":9204,"mtime":1786084511625,"results":"16327","hashOfConfig":"12232"},{"size":2593,"mtime":1786084511625,"results":"16328","hashOfConfig":"12232"},{"size":11526,"mtime":1786084511625,"results":"16329","hashOfConfig":"12232"},{"size":6396,"mtime":1786084511626,"results":"16330","hashOfConfig":"12232"},{"size":5390,"mtime":1786084511626,"results":"16331","hashOfConfig":"12232"},{"size":1779,"mtime":1786084511626,"results":"16332","hashOfConfig":"12232"},{"size":13321,"mtime":1786084511626,"results":"16333","hashOfConfig":"12232"},{"size":1134,"mtime":1786084511626,"results":"16334","hashOfConfig":"12232"},{"size":6047,"mtime":1786084511626,"results":"16335","hashOfConfig":"12232"},{"size":2440,"mtime":1786084511626,"results":"16336","hashOfConfig":"12232"},{"size":9258,"mtime":1786084511626,"results":"16337","hashOfConfig":"12232"},{"size":32061,"mtime":1786084511626,"results":"16338","hashOfConfig":"12232"},{"size":2365,"mtime":1786084511627,"results":"16339","hashOfConfig":"12232"},{"size":3591,"mtime":1786084511627,"results":"16340","hashOfConfig":"12232"},{"size":1569,"mtime":1786084511627,"results":"16341","hashOfConfig":"12232"},{"size":1169,"mtime":1786084511627,"results":"16342","hashOfConfig":"12232"},{"size":1694,"mtime":1786084511627,"results":"16343","hashOfConfig":"12232"},{"size":583,"mtime":1786084511627,"results":"16344","hashOfConfig":"12232"},{"size":2720,"mtime":1786084511627,"results":"16345","hashOfConfig":"12232"},{"size":2663,"mtime":1786084511627,"results":"16346","hashOfConfig":"12232"},{"size":2127,"mtime":1786084511627,"results":"16347","hashOfConfig":"12232"},{"size":4649,"mtime":1786084511627,"results":"16348","hashOfConfig":"12232"},{"size":3278,"mtime":1786084511627,"results":"16349","hashOfConfig":"12232"},{"size":13596,"mtime":1786084511628,"results":"16350","hashOfConfig":"12232"},{"size":2464,"mtime":1786084511628,"results":"16351","hashOfConfig":"12232"},{"size":4174,"mtime":1786084511628,"results":"16352","hashOfConfig":"12232"},{"size":6661,"mtime":1786084511628,"results":"16353","hashOfConfig":"12232"},{"size":2063,"mtime":1786084511628,"results":"16354","hashOfConfig":"12232"},{"size":3109,"mtime":1786084511628,"results":"16355","hashOfConfig":"12232"},{"size":13631,"mtime":1786084511628,"results":"16356","hashOfConfig":"12232"},{"size":3917,"mtime":1786084511628,"results":"16357","hashOfConfig":"12232"},{"size":13110,"mtime":1786084511628,"results":"16358","hashOfConfig":"12232"},{"size":6459,"mtime":1786084511629,"results":"16359","hashOfConfig":"12232"},{"size":4859,"mtime":1786084511629,"results":"16360","hashOfConfig":"12232"},{"size":5026,"mtime":1786084511629,"results":"16361","hashOfConfig":"12232"},{"size":2038,"mtime":1786084511629,"results":"16362","hashOfConfig":"12232"},{"size":8772,"mtime":1786084511629,"results":"16363","hashOfConfig":"12232"},{"size":19985,"mtime":1786084511629,"results":"16364","hashOfConfig":"12232"},{"size":4974,"mtime":1786084511629,"results":"16365","hashOfConfig":"12232"},{"size":3963,"mtime":1786084511629,"results":"16366","hashOfConfig":"12232"},{"size":4076,"mtime":1786084511629,"results":"16367","hashOfConfig":"12232"},{"size":9975,"mtime":1786084511630,"results":"16368","hashOfConfig":"12232"},{"size":2366,"mtime":1786084511630,"results":"16369","hashOfConfig":"12232"},{"size":2138,"mtime":1786084511630,"results":"16370","hashOfConfig":"12232"},{"size":2195,"mtime":1786084511630,"results":"16371","hashOfConfig":"12232"},{"size":2173,"mtime":1786084511630,"results":"16372","hashOfConfig":"12232"},{"size":7759,"mtime":1786084511630,"results":"16373","hashOfConfig":"12232"},{"size":1414,"mtime":1786084511630,"results":"16374","hashOfConfig":"12232"},{"size":8720,"mtime":1786084511630,"results":"16375","hashOfConfig":"12232"},{"size":1407,"mtime":1786084511631,"results":"16376","hashOfConfig":"12232"},{"size":2791,"mtime":1786084511631,"results":"16377","hashOfConfig":"12232"},{"size":1808,"mtime":1786084511631,"results":"16378","hashOfConfig":"12232"},{"size":2801,"mtime":1786084511631,"results":"16379","hashOfConfig":"12232"},{"size":17117,"mtime":1786084511631,"results":"16380","hashOfConfig":"12232"},{"size":9082,"mtime":1786084511631,"results":"16381","hashOfConfig":"12232"},{"size":4911,"mtime":1786084511631,"results":"16382","hashOfConfig":"12232"},{"size":2560,"mtime":1786084511631,"results":"16383","hashOfConfig":"12232"},{"size":1697,"mtime":1786084511632,"results":"16384","hashOfConfig":"8189"},{"size":1300,"mtime":1786084511632,"results":"16385","hashOfConfig":"8189"},{"filePath":"16386","messages":"16387","suppressedMessages":"16388","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"pvwjgk",{"filePath":"16389","messages":"16390","suppressedMessages":"16391","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16392","messages":"16393","suppressedMessages":"16394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16395","messages":"16396","suppressedMessages":"16397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16398","messages":"16399","suppressedMessages":"16400","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16401","messages":"16402","suppressedMessages":"16403","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16404","messages":"16405","suppressedMessages":"16406","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16407","messages":"16408","suppressedMessages":"16409","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16410","messages":"16411","suppressedMessages":"16412","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16413","messages":"16414","suppressedMessages":"16415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16416","messages":"16417","suppressedMessages":"16418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16419","messages":"16420","suppressedMessages":"16421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16422","messages":"16423","suppressedMessages":"16424","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16425","messages":"16426","suppressedMessages":"16427","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16428","messages":"16429","suppressedMessages":"16430","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16431","messages":"16432","suppressedMessages":"16433","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16434","messages":"16435","suppressedMessages":"16436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16437","messages":"16438","suppressedMessages":"16439","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16440","messages":"16441","suppressedMessages":"16442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16443","messages":"16444","suppressedMessages":"16445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16446","messages":"16447","suppressedMessages":"16448","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16449","messages":"16450","suppressedMessages":"16451","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16452","messages":"16453","suppressedMessages":"16454","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16455","messages":"16456","suppressedMessages":"16457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16458","messages":"16459","suppressedMessages":"16460","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16461","messages":"16462","suppressedMessages":"16463","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16464","messages":"16465","suppressedMessages":"16466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"jf3292",{"filePath":"16467","messages":"16468","suppressedMessages":"16469","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16470","messages":"16471","suppressedMessages":"16472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16473","messages":"16474","suppressedMessages":"16475","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16476","messages":"16477","suppressedMessages":"16478","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16479","messages":"16480","suppressedMessages":"16481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16482","messages":"16483","suppressedMessages":"16484","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16485","messages":"16486","suppressedMessages":"16487","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16488","messages":"16489","suppressedMessages":"16490","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16491","messages":"16492","suppressedMessages":"16493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16494","messages":"16495","suppressedMessages":"16496","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16497","messages":"16498","suppressedMessages":"16499","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16500","messages":"16501","suppressedMessages":"16502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16503","messages":"16504","suppressedMessages":"16505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16506","messages":"16507","suppressedMessages":"16508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"wjq4sy",{"filePath":"16509","messages":"16510","suppressedMessages":"16511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16512","messages":"16513","suppressedMessages":"16514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16515","messages":"16516","suppressedMessages":"16517","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16518","messages":"16519","suppressedMessages":"16520","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16521","messages":"16522","suppressedMessages":"16523","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16524","messages":"16525","suppressedMessages":"16526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16527","messages":"16528","suppressedMessages":"16529","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16530","messages":"16531","suppressedMessages":"16532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16533","messages":"16534","suppressedMessages":"16535","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16536","messages":"16537","suppressedMessages":"16538","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16539","messages":"16540","suppressedMessages":"16541","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16542","messages":"16543","suppressedMessages":"16544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16545","messages":"16546","suppressedMessages":"16547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16548","messages":"16549","suppressedMessages":"16550","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16551","messages":"16552","suppressedMessages":"16553","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16554","messages":"16555","suppressedMessages":"16556","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16557","messages":"16558","suppressedMessages":"16559","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16560","messages":"16561","suppressedMessages":"16562","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16563","messages":"16564","suppressedMessages":"16565","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16566","messages":"16567","suppressedMessages":"16568","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16569","messages":"16570","suppressedMessages":"16571","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16572","messages":"16573","suppressedMessages":"16574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16575","messages":"16576","suppressedMessages":"16577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16578","messages":"16579","suppressedMessages":"16580","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16581","messages":"16582","suppressedMessages":"16583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16584","messages":"16585","suppressedMessages":"16586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16587","messages":"16588","suppressedMessages":"16589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16590","messages":"16591","suppressedMessages":"16592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16593","messages":"16594","suppressedMessages":"16595","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16596","messages":"16597","suppressedMessages":"16598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16599","messages":"16600","suppressedMessages":"16601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16602","messages":"16603","suppressedMessages":"16604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16605","messages":"16606","suppressedMessages":"16607","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16608","messages":"16609","suppressedMessages":"16610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16611","messages":"16612","suppressedMessages":"16613","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16614","messages":"16615","suppressedMessages":"16616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16617","messages":"16618","suppressedMessages":"16619","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16620","messages":"16621","suppressedMessages":"16622","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16623","messages":"16624","suppressedMessages":"16625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16626","messages":"16627","suppressedMessages":"16628","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16629","messages":"16630","suppressedMessages":"16631","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16632","messages":"16633","suppressedMessages":"16634","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16635","messages":"16636","suppressedMessages":"16637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16638","messages":"16639","suppressedMessages":"16640","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16641","messages":"16642","suppressedMessages":"16643","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16644","messages":"16645","suppressedMessages":"16646","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16647","messages":"16648","suppressedMessages":"16649","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16650","messages":"16651","suppressedMessages":"16652","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16653","messages":"16654","suppressedMessages":"16655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16656","messages":"16657","suppressedMessages":"16658","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16659","messages":"16660","suppressedMessages":"16661","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16662","messages":"16663","suppressedMessages":"16664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16665","messages":"16666","suppressedMessages":"16667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16668","messages":"16669","suppressedMessages":"16670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16671","messages":"16672","suppressedMessages":"16673","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16674","messages":"16675","suppressedMessages":"16676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16677","messages":"16678","suppressedMessages":"16679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16680","messages":"16681","suppressedMessages":"16682","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16683","messages":"16684","suppressedMessages":"16685","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16686","messages":"16687","suppressedMessages":"16688","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16689","messages":"16690","suppressedMessages":"16691","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16692","messages":"16693","suppressedMessages":"16694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16695","messages":"16696","suppressedMessages":"16697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16698","messages":"16699","suppressedMessages":"16700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16701","messages":"16702","suppressedMessages":"16703","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16704","messages":"16705","suppressedMessages":"16706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16707","messages":"16708","suppressedMessages":"16709","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16710","messages":"16711","suppressedMessages":"16712","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16713","messages":"16714","suppressedMessages":"16715","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16716","messages":"16717","suppressedMessages":"16718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16719","messages":"16720","suppressedMessages":"16721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16722","messages":"16723","suppressedMessages":"16724","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16725","messages":"16726","suppressedMessages":"16727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16728","messages":"16729","suppressedMessages":"16730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16731","messages":"16732","suppressedMessages":"16733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16734","messages":"16735","suppressedMessages":"16736","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16737","messages":"16738","suppressedMessages":"16739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16740","messages":"16741","suppressedMessages":"16742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16743","messages":"16744","suppressedMessages":"16745","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16746","messages":"16747","suppressedMessages":"16748","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16749","messages":"16750","suppressedMessages":"16751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16752","messages":"16753","suppressedMessages":"16754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16755","messages":"16756","suppressedMessages":"16757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16758","messages":"16759","suppressedMessages":"16760","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16761","messages":"16762","suppressedMessages":"16763","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16764","messages":"16765","suppressedMessages":"16766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16767","messages":"16768","suppressedMessages":"16769","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16770","messages":"16771","suppressedMessages":"16772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16773","messages":"16774","suppressedMessages":"16775","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16776","messages":"16777","suppressedMessages":"16778","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16779","messages":"16780","suppressedMessages":"16781","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16782","messages":"16783","suppressedMessages":"16784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16785","messages":"16786","suppressedMessages":"16787","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16788","messages":"16789","suppressedMessages":"16790","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16791","messages":"16792","suppressedMessages":"16793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16794","messages":"16795","suppressedMessages":"16796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16797","messages":"16798","suppressedMessages":"16799","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16800","messages":"16801","suppressedMessages":"16802","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16803","messages":"16804","suppressedMessages":"16805","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16806","messages":"16807","suppressedMessages":"16808","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16809","messages":"16810","suppressedMessages":"16811","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16812","messages":"16813","suppressedMessages":"16814","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16815","messages":"16816","suppressedMessages":"16817","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16818","messages":"16819","suppressedMessages":"16820","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16821","messages":"16822","suppressedMessages":"16823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16824","messages":"16825","suppressedMessages":"16826","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16827","messages":"16828","suppressedMessages":"16829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16830","messages":"16831","suppressedMessages":"16832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16833","messages":"16834","suppressedMessages":"16835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16836","messages":"16837","suppressedMessages":"16838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16839","messages":"16840","suppressedMessages":"16841","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16842","messages":"16843","suppressedMessages":"16844","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16845","messages":"16846","suppressedMessages":"16847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16848","messages":"16849","suppressedMessages":"16850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16851","messages":"16852","suppressedMessages":"16853","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16854","messages":"16855","suppressedMessages":"16856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16857","messages":"16858","suppressedMessages":"16859","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16860","messages":"16861","suppressedMessages":"16862","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16863","messages":"16864","suppressedMessages":"16865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16866","messages":"16867","suppressedMessages":"16868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16869","messages":"16870","suppressedMessages":"16871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16872","messages":"16873","suppressedMessages":"16874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16875","messages":"16876","suppressedMessages":"16877","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16878","messages":"16879","suppressedMessages":"16880","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16881","messages":"16882","suppressedMessages":"16883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16884","messages":"16885","suppressedMessages":"16886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16887","messages":"16888","suppressedMessages":"16889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16890","messages":"16891","suppressedMessages":"16892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16893","messages":"16894","suppressedMessages":"16895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16896","messages":"16897","suppressedMessages":"16898","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16899","messages":"16900","suppressedMessages":"16901","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16902","messages":"16903","suppressedMessages":"16904","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16905","messages":"16906","suppressedMessages":"16907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16908","messages":"16909","suppressedMessages":"16910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16911","messages":"16912","suppressedMessages":"16913","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16914","messages":"16915","suppressedMessages":"16916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16917","messages":"16918","suppressedMessages":"16919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16920","messages":"16921","suppressedMessages":"16922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16923","messages":"16924","suppressedMessages":"16925","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16926","messages":"16927","suppressedMessages":"16928","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16929","messages":"16930","suppressedMessages":"16931","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16932","messages":"16933","suppressedMessages":"16934","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16935","messages":"16936","suppressedMessages":"16937","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16938","messages":"16939","suppressedMessages":"16940","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16941","messages":"16942","suppressedMessages":"16943","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16944","messages":"16945","suppressedMessages":"16946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16947","messages":"16948","suppressedMessages":"16949","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16950","messages":"16951","suppressedMessages":"16952","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16953","messages":"16954","suppressedMessages":"16955","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16956","messages":"16957","suppressedMessages":"16958","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16959","messages":"16960","suppressedMessages":"16961","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16962","messages":"16963","suppressedMessages":"16964","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16965","messages":"16966","suppressedMessages":"16967","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16968","messages":"16969","suppressedMessages":"16970","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16971","messages":"16972","suppressedMessages":"16973","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16974","messages":"16975","suppressedMessages":"16976","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16977","messages":"16978","suppressedMessages":"16979","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16980","messages":"16981","suppressedMessages":"16982","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16983","messages":"16984","suppressedMessages":"16985","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16986","messages":"16987","suppressedMessages":"16988","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16989","messages":"16990","suppressedMessages":"16991","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16992","messages":"16993","suppressedMessages":"16994","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16995","messages":"16996","suppressedMessages":"16997","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"16998","messages":"16999","suppressedMessages":"17000","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17001","messages":"17002","suppressedMessages":"17003","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17004","messages":"17005","suppressedMessages":"17006","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17007","messages":"17008","suppressedMessages":"17009","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17010","messages":"17011","suppressedMessages":"17012","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17013","messages":"17014","suppressedMessages":"17015","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17016","messages":"17017","suppressedMessages":"17018","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17019","messages":"17020","suppressedMessages":"17021","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17022","messages":"17023","suppressedMessages":"17024","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17025","messages":"17026","suppressedMessages":"17027","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17028","messages":"17029","suppressedMessages":"17030","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17031","messages":"17032","suppressedMessages":"17033","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17034","messages":"17035","suppressedMessages":"17036","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17037","messages":"17038","suppressedMessages":"17039","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17040","messages":"17041","suppressedMessages":"17042","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17043","messages":"17044","suppressedMessages":"17045","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17046","messages":"17047","suppressedMessages":"17048","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17049","messages":"17050","suppressedMessages":"17051","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17052","messages":"17053","suppressedMessages":"17054","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17055","messages":"17056","suppressedMessages":"17057","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17058","messages":"17059","suppressedMessages":"17060","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17061","messages":"17062","suppressedMessages":"17063","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17064","messages":"17065","suppressedMessages":"17066","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17067","messages":"17068","suppressedMessages":"17069","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17070","messages":"17071","suppressedMessages":"17072","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17073","messages":"17074","suppressedMessages":"17075","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17076","messages":"17077","suppressedMessages":"17078","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17079","messages":"17080","suppressedMessages":"17081","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17082","messages":"17083","suppressedMessages":"17084","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17085","messages":"17086","suppressedMessages":"17087","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17088","messages":"17089","suppressedMessages":"17090","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17091","messages":"17092","suppressedMessages":"17093","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17094","messages":"17095","suppressedMessages":"17096","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17097","messages":"17098","suppressedMessages":"17099","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17100","messages":"17101","suppressedMessages":"17102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17103","messages":"17104","suppressedMessages":"17105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17106","messages":"17107","suppressedMessages":"17108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17109","messages":"17110","suppressedMessages":"17111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17112","messages":"17113","suppressedMessages":"17114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17115","messages":"17116","suppressedMessages":"17117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17118","messages":"17119","suppressedMessages":"17120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17121","messages":"17122","suppressedMessages":"17123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17124","messages":"17125","suppressedMessages":"17126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17127","messages":"17128","suppressedMessages":"17129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17130","messages":"17131","suppressedMessages":"17132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17133","messages":"17134","suppressedMessages":"17135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17136","messages":"17137","suppressedMessages":"17138","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17139","messages":"17140","suppressedMessages":"17141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17142","messages":"17143","suppressedMessages":"17144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17145","messages":"17146","suppressedMessages":"17147","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17148","messages":"17149","suppressedMessages":"17150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17151","messages":"17152","suppressedMessages":"17153","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17154","messages":"17155","suppressedMessages":"17156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17157","messages":"17158","suppressedMessages":"17159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17160","messages":"17161","suppressedMessages":"17162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17163","messages":"17164","suppressedMessages":"17165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17166","messages":"17167","suppressedMessages":"17168","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17169","messages":"17170","suppressedMessages":"17171","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17172","messages":"17173","suppressedMessages":"17174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17175","messages":"17176","suppressedMessages":"17177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17178","messages":"17179","suppressedMessages":"17180","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17181","messages":"17182","suppressedMessages":"17183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17184","messages":"17185","suppressedMessages":"17186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17187","messages":"17188","suppressedMessages":"17189","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17190","messages":"17191","suppressedMessages":"17192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17193","messages":"17194","suppressedMessages":"17195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17196","messages":"17197","suppressedMessages":"17198","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17199","messages":"17200","suppressedMessages":"17201","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17202","messages":"17203","suppressedMessages":"17204","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17205","messages":"17206","suppressedMessages":"17207","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17208","messages":"17209","suppressedMessages":"17210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17211","messages":"17212","suppressedMessages":"17213","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17214","messages":"17215","suppressedMessages":"17216","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17217","messages":"17218","suppressedMessages":"17219","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17220","messages":"17221","suppressedMessages":"17222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17223","messages":"17224","suppressedMessages":"17225","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17226","messages":"17227","suppressedMessages":"17228","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17229","messages":"17230","suppressedMessages":"17231","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17232","messages":"17233","suppressedMessages":"17234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17235","messages":"17236","suppressedMessages":"17237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17238","messages":"17239","suppressedMessages":"17240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17241","messages":"17242","suppressedMessages":"17243","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17244","messages":"17245","suppressedMessages":"17246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17247","messages":"17248","suppressedMessages":"17249","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17250","messages":"17251","suppressedMessages":"17252","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17253","messages":"17254","suppressedMessages":"17255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17256","messages":"17257","suppressedMessages":"17258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17259","messages":"17260","suppressedMessages":"17261","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17262","messages":"17263","suppressedMessages":"17264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17265","messages":"17266","suppressedMessages":"17267","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17268","messages":"17269","suppressedMessages":"17270","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17271","messages":"17272","suppressedMessages":"17273","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17274","messages":"17275","suppressedMessages":"17276","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17277","messages":"17278","suppressedMessages":"17279","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17280","messages":"17281","suppressedMessages":"17282","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17283","messages":"17284","suppressedMessages":"17285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17286","messages":"17287","suppressedMessages":"17288","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17289","messages":"17290","suppressedMessages":"17291","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17292","messages":"17293","suppressedMessages":"17294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17295","messages":"17296","suppressedMessages":"17297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17298","messages":"17299","suppressedMessages":"17300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17301","messages":"17302","suppressedMessages":"17303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17304","messages":"17305","suppressedMessages":"17306","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17307","messages":"17308","suppressedMessages":"17309","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17310","messages":"17311","suppressedMessages":"17312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17313","messages":"17314","suppressedMessages":"17315","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17316","messages":"17317","suppressedMessages":"17318","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17319","messages":"17320","suppressedMessages":"17321","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17322","messages":"17323","suppressedMessages":"17324","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17325","messages":"17326","suppressedMessages":"17327","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17328","messages":"17329","suppressedMessages":"17330","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17331","messages":"17332","suppressedMessages":"17333","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17334","messages":"17335","suppressedMessages":"17336","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17337","messages":"17338","suppressedMessages":"17339","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17340","messages":"17341","suppressedMessages":"17342","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17343","messages":"17344","suppressedMessages":"17345","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17346","messages":"17347","suppressedMessages":"17348","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17349","messages":"17350","suppressedMessages":"17351","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17352","messages":"17353","suppressedMessages":"17354","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17355","messages":"17356","suppressedMessages":"17357","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17358","messages":"17359","suppressedMessages":"17360","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17361","messages":"17362","suppressedMessages":"17363","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17364","messages":"17365","suppressedMessages":"17366","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17367","messages":"17368","suppressedMessages":"17369","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17370","messages":"17371","suppressedMessages":"17372","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17373","messages":"17374","suppressedMessages":"17375","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17376","messages":"17377","suppressedMessages":"17378","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17379","messages":"17380","suppressedMessages":"17381","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17382","messages":"17383","suppressedMessages":"17384","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17385","messages":"17386","suppressedMessages":"17387","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17388","messages":"17389","suppressedMessages":"17390","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17391","messages":"17392","suppressedMessages":"17393","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17394","messages":"17395","suppressedMessages":"17396","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17397","messages":"17398","suppressedMessages":"17399","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17400","messages":"17401","suppressedMessages":"17402","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17403","messages":"17404","suppressedMessages":"17405","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17406","messages":"17407","suppressedMessages":"17408","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17409","messages":"17410","suppressedMessages":"17411","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17412","messages":"17413","suppressedMessages":"17414","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17415","messages":"17416","suppressedMessages":"17417","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17418","messages":"17419","suppressedMessages":"17420","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17421","messages":"17422","suppressedMessages":"17423","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17424","messages":"17425","suppressedMessages":"17426","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17427","messages":"17428","suppressedMessages":"17429","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17430","messages":"17431","suppressedMessages":"17432","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17433","messages":"17434","suppressedMessages":"17435","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17436","messages":"17437","suppressedMessages":"17438","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17439","messages":"17440","suppressedMessages":"17441","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17442","messages":"17443","suppressedMessages":"17444","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17445","messages":"17446","suppressedMessages":"17447","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17448","messages":"17449","suppressedMessages":"17450","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17451","messages":"17452","suppressedMessages":"17453","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17454","messages":"17455","suppressedMessages":"17456","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17457","messages":"17458","suppressedMessages":"17459","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17460","messages":"17461","suppressedMessages":"17462","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17463","messages":"17464","suppressedMessages":"17465","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17466","messages":"17467","suppressedMessages":"17468","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17469","messages":"17470","suppressedMessages":"17471","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17472","messages":"17473","suppressedMessages":"17474","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17475","messages":"17476","suppressedMessages":"17477","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17478","messages":"17479","suppressedMessages":"17480","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17481","messages":"17482","suppressedMessages":"17483","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17484","messages":"17485","suppressedMessages":"17486","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17487","messages":"17488","suppressedMessages":"17489","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17490","messages":"17491","suppressedMessages":"17492","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17493","messages":"17494","suppressedMessages":"17495","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17496","messages":"17497","suppressedMessages":"17498","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17499","messages":"17500","suppressedMessages":"17501","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17502","messages":"17503","suppressedMessages":"17504","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17505","messages":"17506","suppressedMessages":"17507","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17508","messages":"17509","suppressedMessages":"17510","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17511","messages":"17512","suppressedMessages":"17513","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17514","messages":"17515","suppressedMessages":"17516","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17517","messages":"17518","suppressedMessages":"17519","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17520","messages":"17521","suppressedMessages":"17522","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17523","messages":"17524","suppressedMessages":"17525","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17526","messages":"17527","suppressedMessages":"17528","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17529","messages":"17530","suppressedMessages":"17531","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17532","messages":"17533","suppressedMessages":"17534","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17535","messages":"17536","suppressedMessages":"17537","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17538","messages":"17539","suppressedMessages":"17540","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17541","messages":"17542","suppressedMessages":"17543","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17544","messages":"17545","suppressedMessages":"17546","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17547","messages":"17548","suppressedMessages":"17549","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17550","messages":"17551","suppressedMessages":"17552","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17553","messages":"17554","suppressedMessages":"17555","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17556","messages":"17557","suppressedMessages":"17558","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17559","messages":"17560","suppressedMessages":"17561","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17562","messages":"17563","suppressedMessages":"17564","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17565","messages":"17566","suppressedMessages":"17567","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17568","messages":"17569","suppressedMessages":"17570","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17571","messages":"17572","suppressedMessages":"17573","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17574","messages":"17575","suppressedMessages":"17576","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17577","messages":"17578","suppressedMessages":"17579","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17580","messages":"17581","suppressedMessages":"17582","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17583","messages":"17584","suppressedMessages":"17585","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17586","messages":"17587","suppressedMessages":"17588","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17589","messages":"17590","suppressedMessages":"17591","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17592","messages":"17593","suppressedMessages":"17594","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17595","messages":"17596","suppressedMessages":"17597","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17598","messages":"17599","suppressedMessages":"17600","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17601","messages":"17602","suppressedMessages":"17603","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17604","messages":"17605","suppressedMessages":"17606","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17607","messages":"17608","suppressedMessages":"17609","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17610","messages":"17611","suppressedMessages":"17612","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17613","messages":"17614","suppressedMessages":"17615","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17616","messages":"17617","suppressedMessages":"17618","errorCount":14,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17619","messages":"17620","suppressedMessages":"17621","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17622","messages":"17623","suppressedMessages":"17624","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17625","messages":"17626","suppressedMessages":"17627","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17628","messages":"17629","suppressedMessages":"17630","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17631","messages":"17632","suppressedMessages":"17633","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17634","messages":"17635","suppressedMessages":"17636","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17637","messages":"17638","suppressedMessages":"17639","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17640","messages":"17641","suppressedMessages":"17642","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17643","messages":"17644","suppressedMessages":"17645","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17646","messages":"17647","suppressedMessages":"17648","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17649","messages":"17650","suppressedMessages":"17651","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17652","messages":"17653","suppressedMessages":"17654","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17655","messages":"17656","suppressedMessages":"17657","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17658","messages":"17659","suppressedMessages":"17660","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17661","messages":"17662","suppressedMessages":"17663","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17664","messages":"17665","suppressedMessages":"17666","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17667","messages":"17668","suppressedMessages":"17669","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17670","messages":"17671","suppressedMessages":"17672","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17673","messages":"17674","suppressedMessages":"17675","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17676","messages":"17677","suppressedMessages":"17678","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17679","messages":"17680","suppressedMessages":"17681","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17682","messages":"17683","suppressedMessages":"17684","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17685","messages":"17686","suppressedMessages":"17687","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17688","messages":"17689","suppressedMessages":"17690","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17691","messages":"17692","suppressedMessages":"17693","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17694","messages":"17695","suppressedMessages":"17696","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17697","messages":"17698","suppressedMessages":"17699","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17700","messages":"17701","suppressedMessages":"17702","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17703","messages":"17704","suppressedMessages":"17705","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17706","messages":"17707","suppressedMessages":"17708","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17709","messages":"17710","suppressedMessages":"17711","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17712","messages":"17713","suppressedMessages":"17714","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17715","messages":"17716","suppressedMessages":"17717","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17718","messages":"17719","suppressedMessages":"17720","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17721","messages":"17722","suppressedMessages":"17723","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17724","messages":"17725","suppressedMessages":"17726","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17727","messages":"17728","suppressedMessages":"17729","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17730","messages":"17731","suppressedMessages":"17732","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17733","messages":"17734","suppressedMessages":"17735","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17736","messages":"17737","suppressedMessages":"17738","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17739","messages":"17740","suppressedMessages":"17741","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17742","messages":"17743","suppressedMessages":"17744","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17745","messages":"17746","suppressedMessages":"17747","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17748","messages":"17749","suppressedMessages":"17750","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17751","messages":"17752","suppressedMessages":"17753","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17754","messages":"17755","suppressedMessages":"17756","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17757","messages":"17758","suppressedMessages":"17759","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17760","messages":"17761","suppressedMessages":"17762","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17763","messages":"17764","suppressedMessages":"17765","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17766","messages":"17767","suppressedMessages":"17768","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17769","messages":"17770","suppressedMessages":"17771","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17772","messages":"17773","suppressedMessages":"17774","errorCount":11,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17775","messages":"17776","suppressedMessages":"17777","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17778","messages":"17779","suppressedMessages":"17780","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17781","messages":"17782","suppressedMessages":"17783","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17784","messages":"17785","suppressedMessages":"17786","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17787","messages":"17788","suppressedMessages":"17789","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17790","messages":"17791","suppressedMessages":"17792","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17793","messages":"17794","suppressedMessages":"17795","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17796","messages":"17797","suppressedMessages":"17798","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17799","messages":"17800","suppressedMessages":"17801","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17802","messages":"17803","suppressedMessages":"17804","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17805","messages":"17806","suppressedMessages":"17807","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17808","messages":"17809","suppressedMessages":"17810","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17811","messages":"17812","suppressedMessages":"17813","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17814","messages":"17815","suppressedMessages":"17816","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17817","messages":"17818","suppressedMessages":"17819","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17820","messages":"17821","suppressedMessages":"17822","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17823","messages":"17824","suppressedMessages":"17825","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17826","messages":"17827","suppressedMessages":"17828","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17829","messages":"17830","suppressedMessages":"17831","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17832","messages":"17833","suppressedMessages":"17834","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17835","messages":"17836","suppressedMessages":"17837","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17838","messages":"17839","suppressedMessages":"17840","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17841","messages":"17842","suppressedMessages":"17843","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17844","messages":"17845","suppressedMessages":"17846","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17847","messages":"17848","suppressedMessages":"17849","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17850","messages":"17851","suppressedMessages":"17852","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17853","messages":"17854","suppressedMessages":"17855","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17856","messages":"17857","suppressedMessages":"17858","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17859","messages":"17860","suppressedMessages":"17861","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17862","messages":"17863","suppressedMessages":"17864","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17865","messages":"17866","suppressedMessages":"17867","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17868","messages":"17869","suppressedMessages":"17870","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17871","messages":"17872","suppressedMessages":"17873","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17874","messages":"17875","suppressedMessages":"17876","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17877","messages":"17878","suppressedMessages":"17879","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17880","messages":"17881","suppressedMessages":"17882","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17883","messages":"17884","suppressedMessages":"17885","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17886","messages":"17887","suppressedMessages":"17888","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"17889","messages":"17890","suppressedMessages":"17891","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17892","messages":"17893","suppressedMessages":"17894","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17895","messages":"17896","suppressedMessages":"17897","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17898","messages":"17899","suppressedMessages":"17900","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17901","messages":"17902","suppressedMessages":"17903","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17904","messages":"17905","suppressedMessages":"17906","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17907","messages":"17908","suppressedMessages":"17909","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17910","messages":"17911","suppressedMessages":"17912","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17913","messages":"17914","suppressedMessages":"17915","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17916","messages":"17917","suppressedMessages":"17918","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17919","messages":"17920","suppressedMessages":"17921","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17922","messages":"17923","suppressedMessages":"17924","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17925","messages":"17926","suppressedMessages":"17927","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17928","messages":"17929","suppressedMessages":"17930","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17931","messages":"17932","suppressedMessages":"17933","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17934","messages":"17935","suppressedMessages":"17936","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17937","messages":"17938","suppressedMessages":"17939","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17940","messages":"17941","suppressedMessages":"17942","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17943","messages":"17944","suppressedMessages":"17945","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17946","messages":"17947","suppressedMessages":"17948","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17949","messages":"17950","suppressedMessages":"17951","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17952","messages":"17953","suppressedMessages":"17954","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17955","messages":"17956","suppressedMessages":"17957","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17958","messages":"17959","suppressedMessages":"17960","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17961","messages":"17962","suppressedMessages":"17963","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17964","messages":"17965","suppressedMessages":"17966","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17967","messages":"17968","suppressedMessages":"17969","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17970","messages":"17971","suppressedMessages":"17972","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17973","messages":"17974","suppressedMessages":"17975","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17976","messages":"17977","suppressedMessages":"17978","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17979","messages":"17980","suppressedMessages":"17981","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17982","messages":"17983","suppressedMessages":"17984","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17985","messages":"17986","suppressedMessages":"17987","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17988","messages":"17989","suppressedMessages":"17990","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17991","messages":"17992","suppressedMessages":"17993","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17994","messages":"17995","suppressedMessages":"17996","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"17997","messages":"17998","suppressedMessages":"17999","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18000","messages":"18001","suppressedMessages":"18002","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18003","messages":"18004","suppressedMessages":"18005","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18006","messages":"18007","suppressedMessages":"18008","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18009","messages":"18010","suppressedMessages":"18011","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18012","messages":"18013","suppressedMessages":"18014","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18015","messages":"18016","suppressedMessages":"18017","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18018","messages":"18019","suppressedMessages":"18020","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18021","messages":"18022","suppressedMessages":"18023","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18024","messages":"18025","suppressedMessages":"18026","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18027","messages":"18028","suppressedMessages":"18029","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18030","messages":"18031","suppressedMessages":"18032","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18033","messages":"18034","suppressedMessages":"18035","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18036","messages":"18037","suppressedMessages":"18038","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18039","messages":"18040","suppressedMessages":"18041","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18042","messages":"18043","suppressedMessages":"18044","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18045","messages":"18046","suppressedMessages":"18047","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18048","messages":"18049","suppressedMessages":"18050","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18051","messages":"18052","suppressedMessages":"18053","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18054","messages":"18055","suppressedMessages":"18056","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18057","messages":"18058","suppressedMessages":"18059","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18060","messages":"18061","suppressedMessages":"18062","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18063","messages":"18064","suppressedMessages":"18065","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18066","messages":"18067","suppressedMessages":"18068","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18069","messages":"18070","suppressedMessages":"18071","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18072","messages":"18073","suppressedMessages":"18074","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18075","messages":"18076","suppressedMessages":"18077","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18078","messages":"18079","suppressedMessages":"18080","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18081","messages":"18082","suppressedMessages":"18083","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18084","messages":"18085","suppressedMessages":"18086","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18087","messages":"18088","suppressedMessages":"18089","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18090","messages":"18091","suppressedMessages":"18092","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18093","messages":"18094","suppressedMessages":"18095","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18096","messages":"18097","suppressedMessages":"18098","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18099","messages":"18100","suppressedMessages":"18101","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18102","messages":"18103","suppressedMessages":"18104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18105","messages":"18106","suppressedMessages":"18107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18108","messages":"18109","suppressedMessages":"18110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18111","messages":"18112","suppressedMessages":"18113","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18114","messages":"18115","suppressedMessages":"18116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18117","messages":"18118","suppressedMessages":"18119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18120","messages":"18121","suppressedMessages":"18122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18123","messages":"18124","suppressedMessages":"18125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18126","messages":"18127","suppressedMessages":"18128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18129","messages":"18130","suppressedMessages":"18131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18132","messages":"18133","suppressedMessages":"18134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18135","messages":"18136","suppressedMessages":"18137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18138","messages":"18139","suppressedMessages":"18140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18141","messages":"18142","suppressedMessages":"18143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18144","messages":"18145","suppressedMessages":"18146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18147","messages":"18148","suppressedMessages":"18149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18150","messages":"18151","suppressedMessages":"18152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18153","messages":"18154","suppressedMessages":"18155","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18156","messages":"18157","suppressedMessages":"18158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18159","messages":"18160","suppressedMessages":"18161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18162","messages":"18163","suppressedMessages":"18164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18165","messages":"18166","suppressedMessages":"18167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18168","messages":"18169","suppressedMessages":"18170","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18171","messages":"18172","suppressedMessages":"18173","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18174","messages":"18175","suppressedMessages":"18176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18177","messages":"18178","suppressedMessages":"18179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18180","messages":"18181","suppressedMessages":"18182","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18183","messages":"18184","suppressedMessages":"18185","errorCount":34,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18186","messages":"18187","suppressedMessages":"18188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18189","messages":"18190","suppressedMessages":"18191","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18192","messages":"18193","suppressedMessages":"18194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18195","messages":"18196","suppressedMessages":"18197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18198","messages":"18199","suppressedMessages":"18200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18201","messages":"18202","suppressedMessages":"18203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18204","messages":"18205","suppressedMessages":"18206","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18207","messages":"18208","suppressedMessages":"18209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18210","messages":"18211","suppressedMessages":"18212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18213","messages":"18214","suppressedMessages":"18215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18216","messages":"18217","suppressedMessages":"18218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18219","messages":"18220","suppressedMessages":"18221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18222","messages":"18223","suppressedMessages":"18224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18225","messages":"18226","suppressedMessages":"18227","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18228","messages":"18229","suppressedMessages":"18230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18231","messages":"18232","suppressedMessages":"18233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18234","messages":"18235","suppressedMessages":"18236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1invka3",{"filePath":"18237","messages":"18238","suppressedMessages":"18239","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18240","messages":"18241","suppressedMessages":"18242","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18243","messages":"18244","suppressedMessages":"18245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18246","messages":"18247","suppressedMessages":"18248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18249","messages":"18250","suppressedMessages":"18251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18252","messages":"18253","suppressedMessages":"18254","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18255","messages":"18256","suppressedMessages":"18257","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18258","messages":"18259","suppressedMessages":"18260","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18261","messages":"18262","suppressedMessages":"18263","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18264","messages":"18265","suppressedMessages":"18266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18267","messages":"18268","suppressedMessages":"18269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18270","messages":"18271","suppressedMessages":"18272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18273","messages":"18274","suppressedMessages":"18275","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18276","messages":"18277","suppressedMessages":"18278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18279","messages":"18280","suppressedMessages":"18281","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18282","messages":"18283","suppressedMessages":"18284","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18285","messages":"18286","suppressedMessages":"18287","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18288","messages":"18289","suppressedMessages":"18290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18291","messages":"18292","suppressedMessages":"18293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18294","messages":"18295","suppressedMessages":"18296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18297","messages":"18298","suppressedMessages":"18299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18300","messages":"18301","suppressedMessages":"18302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18303","messages":"18304","suppressedMessages":"18305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18306","messages":"18307","suppressedMessages":"18308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18309","messages":"18310","suppressedMessages":"18311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18312","messages":"18313","suppressedMessages":"18314","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18315","messages":"18316","suppressedMessages":"18317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18318","messages":"18319","suppressedMessages":"18320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18321","messages":"18322","suppressedMessages":"18323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18324","messages":"18325","suppressedMessages":"18326","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18327","messages":"18328","suppressedMessages":"18329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18330","messages":"18331","suppressedMessages":"18332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18333","messages":"18334","suppressedMessages":"18335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18336","messages":"18337","suppressedMessages":"18338","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18339","messages":"18340","suppressedMessages":"18341","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18342","messages":"18343","suppressedMessages":"18344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18345","messages":"18346","suppressedMessages":"18347","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18348","messages":"18349","suppressedMessages":"18350","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18351","messages":"18352","suppressedMessages":"18353","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18354","messages":"18355","suppressedMessages":"18356","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18357","messages":"18358","suppressedMessages":"18359","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18360","messages":"18361","suppressedMessages":"18362","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18363","messages":"18364","suppressedMessages":"18365","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18366","messages":"18367","suppressedMessages":"18368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18369","messages":"18370","suppressedMessages":"18371","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18372","messages":"18373","suppressedMessages":"18374","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18375","messages":"18376","suppressedMessages":"18377","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18378","messages":"18379","suppressedMessages":"18380","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18381","messages":"18382","suppressedMessages":"18383","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18384","messages":"18385","suppressedMessages":"18386","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18387","messages":"18388","suppressedMessages":"18389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18390","messages":"18391","suppressedMessages":"18392","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18393","messages":"18394","suppressedMessages":"18395","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18396","messages":"18397","suppressedMessages":"18398","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18399","messages":"18400","suppressedMessages":"18401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18402","messages":"18403","suppressedMessages":"18404","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18405","messages":"18406","suppressedMessages":"18407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18408","messages":"18409","suppressedMessages":"18410","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18411","messages":"18412","suppressedMessages":"18413","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18414","messages":"18415","suppressedMessages":"18416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18417","messages":"18418","suppressedMessages":"18419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18420","messages":"18421","suppressedMessages":"18422","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18423","messages":"18424","suppressedMessages":"18425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18426","messages":"18427","suppressedMessages":"18428","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18429","messages":"18430","suppressedMessages":"18431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18432","messages":"18433","suppressedMessages":"18434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18435","messages":"18436","suppressedMessages":"18437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18438","messages":"18439","suppressedMessages":"18440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18441","messages":"18442","suppressedMessages":"18443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18444","messages":"18445","suppressedMessages":"18446","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18447","messages":"18448","suppressedMessages":"18449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18450","messages":"18451","suppressedMessages":"18452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18453","messages":"18454","suppressedMessages":"18455","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18456","messages":"18457","suppressedMessages":"18458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18459","messages":"18460","suppressedMessages":"18461","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18462","messages":"18463","suppressedMessages":"18464","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18465","messages":"18466","suppressedMessages":"18467","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18468","messages":"18469","suppressedMessages":"18470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18471","messages":"18472","suppressedMessages":"18473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18474","messages":"18475","suppressedMessages":"18476","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18477","messages":"18478","suppressedMessages":"18479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18480","messages":"18481","suppressedMessages":"18482","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18483","messages":"18484","suppressedMessages":"18485","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18486","messages":"18487","suppressedMessages":"18488","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18489","messages":"18490","suppressedMessages":"18491","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18492","messages":"18493","suppressedMessages":"18494","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18495","messages":"18496","suppressedMessages":"18497","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18498","messages":"18499","suppressedMessages":"18500","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18501","messages":"18502","suppressedMessages":"18503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18504","messages":"18505","suppressedMessages":"18506","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18507","messages":"18508","suppressedMessages":"18509","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18510","messages":"18511","suppressedMessages":"18512","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18513","messages":"18514","suppressedMessages":"18515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18516","messages":"18517","suppressedMessages":"18518","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18519","messages":"18520","suppressedMessages":"18521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18522","messages":"18523","suppressedMessages":"18524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18525","messages":"18526","suppressedMessages":"18527","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18528","messages":"18529","suppressedMessages":"18530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18531","messages":"18532","suppressedMessages":"18533","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18534","messages":"18535","suppressedMessages":"18536","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18537","messages":"18538","suppressedMessages":"18539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18540","messages":"18541","suppressedMessages":"18542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18543","messages":"18544","suppressedMessages":"18545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18546","messages":"18547","suppressedMessages":"18548","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18549","messages":"18550","suppressedMessages":"18551","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18552","messages":"18553","suppressedMessages":"18554","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18555","messages":"18556","suppressedMessages":"18557","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18558","messages":"18559","suppressedMessages":"18560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18561","messages":"18562","suppressedMessages":"18563","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18564","messages":"18565","suppressedMessages":"18566","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18567","messages":"18568","suppressedMessages":"18569","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18570","messages":"18571","suppressedMessages":"18572","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18573","messages":"18574","suppressedMessages":"18575","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18576","messages":"18577","suppressedMessages":"18578","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18579","messages":"18580","suppressedMessages":"18581","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18582","messages":"18583","suppressedMessages":"18584","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18585","messages":"18586","suppressedMessages":"18587","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18588","messages":"18589","suppressedMessages":"18590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18591","messages":"18592","suppressedMessages":"18593","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18594","messages":"18595","suppressedMessages":"18596","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18597","messages":"18598","suppressedMessages":"18599","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18600","messages":"18601","suppressedMessages":"18602","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18603","messages":"18604","suppressedMessages":"18605","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18606","messages":"18607","suppressedMessages":"18608","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18609","messages":"18610","suppressedMessages":"18611","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18612","messages":"18613","suppressedMessages":"18614","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18615","messages":"18616","suppressedMessages":"18617","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18618","messages":"18619","suppressedMessages":"18620","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18621","messages":"18622","suppressedMessages":"18623","errorCount":20,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18624","messages":"18625","suppressedMessages":"18626","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18627","messages":"18628","suppressedMessages":"18629","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18630","messages":"18631","suppressedMessages":"18632","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18633","messages":"18634","suppressedMessages":"18635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18636","messages":"18637","suppressedMessages":"18638","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18639","messages":"18640","suppressedMessages":"18641","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18642","messages":"18643","suppressedMessages":"18644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18645","messages":"18646","suppressedMessages":"18647","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18648","messages":"18649","suppressedMessages":"18650","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18651","messages":"18652","suppressedMessages":"18653","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18654","messages":"18655","suppressedMessages":"18656","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18657","messages":"18658","suppressedMessages":"18659","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18660","messages":"18661","suppressedMessages":"18662","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18663","messages":"18664","suppressedMessages":"18665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18666","messages":"18667","suppressedMessages":"18668","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18669","messages":"18670","suppressedMessages":"18671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18672","messages":"18673","suppressedMessages":"18674","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18675","messages":"18676","suppressedMessages":"18677","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18678","messages":"18679","suppressedMessages":"18680","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18681","messages":"18682","suppressedMessages":"18683","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18684","messages":"18685","suppressedMessages":"18686","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18687","messages":"18688","suppressedMessages":"18689","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18690","messages":"18691","suppressedMessages":"18692","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18693","messages":"18694","suppressedMessages":"18695","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18696","messages":"18697","suppressedMessages":"18698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18699","messages":"18700","suppressedMessages":"18701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18702","messages":"18703","suppressedMessages":"18704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18705","messages":"18706","suppressedMessages":"18707","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18708","messages":"18709","suppressedMessages":"18710","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18711","messages":"18712","suppressedMessages":"18713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18714","messages":"18715","suppressedMessages":"18716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18717","messages":"18718","suppressedMessages":"18719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18720","messages":"18721","suppressedMessages":"18722","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18723","messages":"18724","suppressedMessages":"18725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18726","messages":"18727","suppressedMessages":"18728","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18729","messages":"18730","suppressedMessages":"18731","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18732","messages":"18733","suppressedMessages":"18734","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18735","messages":"18736","suppressedMessages":"18737","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18738","messages":"18739","suppressedMessages":"18740","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18741","messages":"18742","suppressedMessages":"18743","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18744","messages":"18745","suppressedMessages":"18746","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18747","messages":"18748","suppressedMessages":"18749","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18750","messages":"18751","suppressedMessages":"18752","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18753","messages":"18754","suppressedMessages":"18755","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18756","messages":"18757","suppressedMessages":"18758","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18759","messages":"18760","suppressedMessages":"18761","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18762","messages":"18763","suppressedMessages":"18764","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18765","messages":"18766","suppressedMessages":"18767","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18768","messages":"18769","suppressedMessages":"18770","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18771","messages":"18772","suppressedMessages":"18773","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18774","messages":"18775","suppressedMessages":"18776","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18777","messages":"18778","suppressedMessages":"18779","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18780","messages":"18781","suppressedMessages":"18782","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18783","messages":"18784","suppressedMessages":"18785","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18786","messages":"18787","suppressedMessages":"18788","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18789","messages":"18790","suppressedMessages":"18791","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18792","messages":"18793","suppressedMessages":"18794","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18795","messages":"18796","suppressedMessages":"18797","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18798","messages":"18799","suppressedMessages":"18800","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18801","messages":"18802","suppressedMessages":"18803","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18804","messages":"18805","suppressedMessages":"18806","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18807","messages":"18808","suppressedMessages":"18809","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18810","messages":"18811","suppressedMessages":"18812","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18813","messages":"18814","suppressedMessages":"18815","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18816","messages":"18817","suppressedMessages":"18818","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18819","messages":"18820","suppressedMessages":"18821","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18822","messages":"18823","suppressedMessages":"18824","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18825","messages":"18826","suppressedMessages":"18827","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18828","messages":"18829","suppressedMessages":"18830","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18831","messages":"18832","suppressedMessages":"18833","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18834","messages":"18835","suppressedMessages":"18836","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18837","messages":"18838","suppressedMessages":"18839","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18840","messages":"18841","suppressedMessages":"18842","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18843","messages":"18844","suppressedMessages":"18845","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18846","messages":"18847","suppressedMessages":"18848","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18849","messages":"18850","suppressedMessages":"18851","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18852","messages":"18853","suppressedMessages":"18854","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18855","messages":"18856","suppressedMessages":"18857","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18858","messages":"18859","suppressedMessages":"18860","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18861","messages":"18862","suppressedMessages":"18863","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18864","messages":"18865","suppressedMessages":"18866","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18867","messages":"18868","suppressedMessages":"18869","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18870","messages":"18871","suppressedMessages":"18872","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18873","messages":"18874","suppressedMessages":"18875","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18876","messages":"18877","suppressedMessages":"18878","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18879","messages":"18880","suppressedMessages":"18881","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18882","messages":"18883","suppressedMessages":"18884","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18885","messages":"18886","suppressedMessages":"18887","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18888","messages":"18889","suppressedMessages":"18890","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18891","messages":"18892","suppressedMessages":"18893","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18894","messages":"18895","suppressedMessages":"18896","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18897","messages":"18898","suppressedMessages":"18899","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18900","messages":"18901","suppressedMessages":"18902","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18903","messages":"18904","suppressedMessages":"18905","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18906","messages":"18907","suppressedMessages":"18908","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18909","messages":"18910","suppressedMessages":"18911","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18912","messages":"18913","suppressedMessages":"18914","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18915","messages":"18916","suppressedMessages":"18917","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18918","messages":"18919","suppressedMessages":"18920","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18921","messages":"18922","suppressedMessages":"18923","errorCount":22,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18924","messages":"18925","suppressedMessages":"18926","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18927","messages":"18928","suppressedMessages":"18929","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18930","messages":"18931","suppressedMessages":"18932","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"18933","messages":"18934","suppressedMessages":"18935","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18936","messages":"18937","suppressedMessages":"18938","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18939","messages":"18940","suppressedMessages":"18941","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18942","messages":"18943","suppressedMessages":"18944","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18945","messages":"18946","suppressedMessages":"18947","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18948","messages":"18949","suppressedMessages":"18950","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18951","messages":"18952","suppressedMessages":"18953","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18954","messages":"18955","suppressedMessages":"18956","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18957","messages":"18958","suppressedMessages":"18959","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18960","messages":"18961","suppressedMessages":"18962","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18963","messages":"18964","suppressedMessages":"18965","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18966","messages":"18967","suppressedMessages":"18968","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18969","messages":"18970","suppressedMessages":"18971","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18972","messages":"18973","suppressedMessages":"18974","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18975","messages":"18976","suppressedMessages":"18977","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18978","messages":"18979","suppressedMessages":"18980","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18981","messages":"18982","suppressedMessages":"18983","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18984","messages":"18985","suppressedMessages":"18986","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18987","messages":"18988","suppressedMessages":"18989","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18990","messages":"18991","suppressedMessages":"18992","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18993","messages":"18994","suppressedMessages":"18995","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18996","messages":"18997","suppressedMessages":"18998","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"18999","messages":"19000","suppressedMessages":"19001","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19002","messages":"19003","suppressedMessages":"19004","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19005","messages":"19006","suppressedMessages":"19007","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19008","messages":"19009","suppressedMessages":"19010","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19011","messages":"19012","suppressedMessages":"19013","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19014","messages":"19015","suppressedMessages":"19016","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19017","messages":"19018","suppressedMessages":"19019","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19020","messages":"19021","suppressedMessages":"19022","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19023","messages":"19024","suppressedMessages":"19025","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19026","messages":"19027","suppressedMessages":"19028","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19029","messages":"19030","suppressedMessages":"19031","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19032","messages":"19033","suppressedMessages":"19034","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19035","messages":"19036","suppressedMessages":"19037","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19038","messages":"19039","suppressedMessages":"19040","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19041","messages":"19042","suppressedMessages":"19043","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19044","messages":"19045","suppressedMessages":"19046","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19047","messages":"19048","suppressedMessages":"19049","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19050","messages":"19051","suppressedMessages":"19052","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19053","messages":"19054","suppressedMessages":"19055","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19056","messages":"19057","suppressedMessages":"19058","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19059","messages":"19060","suppressedMessages":"19061","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19062","messages":"19063","suppressedMessages":"19064","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19065","messages":"19066","suppressedMessages":"19067","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19068","messages":"19069","suppressedMessages":"19070","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19071","messages":"19072","suppressedMessages":"19073","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19074","messages":"19075","suppressedMessages":"19076","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19077","messages":"19078","suppressedMessages":"19079","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19080","messages":"19081","suppressedMessages":"19082","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19083","messages":"19084","suppressedMessages":"19085","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19086","messages":"19087","suppressedMessages":"19088","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19089","messages":"19090","suppressedMessages":"19091","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19092","messages":"19093","suppressedMessages":"19094","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19095","messages":"19096","suppressedMessages":"19097","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19098","messages":"19099","suppressedMessages":"19100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19101","messages":"19102","suppressedMessages":"19103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19104","messages":"19105","suppressedMessages":"19106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19107","messages":"19108","suppressedMessages":"19109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19110","messages":"19111","suppressedMessages":"19112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19113","messages":"19114","suppressedMessages":"19115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19116","messages":"19117","suppressedMessages":"19118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19119","messages":"19120","suppressedMessages":"19121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19122","messages":"19123","suppressedMessages":"19124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19125","messages":"19126","suppressedMessages":"19127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19128","messages":"19129","suppressedMessages":"19130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19131","messages":"19132","suppressedMessages":"19133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19134","messages":"19135","suppressedMessages":"19136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19137","messages":"19138","suppressedMessages":"19139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19140","messages":"19141","suppressedMessages":"19142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19143","messages":"19144","suppressedMessages":"19145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19146","messages":"19147","suppressedMessages":"19148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19149","messages":"19150","suppressedMessages":"19151","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19152","messages":"19153","suppressedMessages":"19154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19155","messages":"19156","suppressedMessages":"19157","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19158","messages":"19159","suppressedMessages":"19160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19161","messages":"19162","suppressedMessages":"19163","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19164","messages":"19165","suppressedMessages":"19166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19167","messages":"19168","suppressedMessages":"19169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19170","messages":"19171","suppressedMessages":"19172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19173","messages":"19174","suppressedMessages":"19175","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19176","messages":"19177","suppressedMessages":"19178","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19179","messages":"19180","suppressedMessages":"19181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19182","messages":"19183","suppressedMessages":"19184","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19185","messages":"19186","suppressedMessages":"19187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19188","messages":"19189","suppressedMessages":"19190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19191","messages":"19192","suppressedMessages":"19193","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19194","messages":"19195","suppressedMessages":"19196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19197","messages":"19198","suppressedMessages":"19199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19200","messages":"19201","suppressedMessages":"19202","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19203","messages":"19204","suppressedMessages":"19205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19206","messages":"19207","suppressedMessages":"19208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19209","messages":"19210","suppressedMessages":"19211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19212","messages":"19213","suppressedMessages":"19214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19215","messages":"19216","suppressedMessages":"19217","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19218","messages":"19219","suppressedMessages":"19220","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19221","messages":"19222","suppressedMessages":"19223","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19224","messages":"19225","suppressedMessages":"19226","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19227","messages":"19228","suppressedMessages":"19229","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19230","messages":"19231","suppressedMessages":"19232","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19233","messages":"19234","suppressedMessages":"19235","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19236","messages":"19237","suppressedMessages":"19238","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19239","messages":"19240","suppressedMessages":"19241","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19242","messages":"19243","suppressedMessages":"19244","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19245","messages":"19246","suppressedMessages":"19247","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19248","messages":"19249","suppressedMessages":"19250","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19251","messages":"19252","suppressedMessages":"19253","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19254","messages":"19255","suppressedMessages":"19256","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19257","messages":"19258","suppressedMessages":"19259","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19260","messages":"19261","suppressedMessages":"19262","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19263","messages":"19264","suppressedMessages":"19265","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19266","messages":"19267","suppressedMessages":"19268","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19269","messages":"19270","suppressedMessages":"19271","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19272","messages":"19273","suppressedMessages":"19274","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19275","messages":"19276","suppressedMessages":"19277","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19278","messages":"19279","suppressedMessages":"19280","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19281","messages":"19282","suppressedMessages":"19283","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19284","messages":"19285","suppressedMessages":"19286","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19287","messages":"19288","suppressedMessages":"19289","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19290","messages":"19291","suppressedMessages":"19292","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19293","messages":"19294","suppressedMessages":"19295","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19296","messages":"19297","suppressedMessages":"19298","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19299","messages":"19300","suppressedMessages":"19301","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19302","messages":"19303","suppressedMessages":"19304","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19305","messages":"19306","suppressedMessages":"19307","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19308","messages":"19309","suppressedMessages":"19310","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19311","messages":"19312","suppressedMessages":"19313","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19314","messages":"19315","suppressedMessages":"19316","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19317","messages":"19318","suppressedMessages":"19319","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19320","messages":"19321","suppressedMessages":"19322","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19323","messages":"19324","suppressedMessages":"19325","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19326","messages":"19327","suppressedMessages":"19328","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19329","messages":"19330","suppressedMessages":"19331","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19332","messages":"19333","suppressedMessages":"19334","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19335","messages":"19336","suppressedMessages":"19337","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19338","messages":"19339","suppressedMessages":"19340","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19341","messages":"19342","suppressedMessages":"19343","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19344","messages":"19345","suppressedMessages":"19346","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19347","messages":"19348","suppressedMessages":"19349","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19350","messages":"19351","suppressedMessages":"19352","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19353","messages":"19354","suppressedMessages":"19355","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19356","messages":"19357","suppressedMessages":"19358","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19359","messages":"19360","suppressedMessages":"19361","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19362","messages":"19363","suppressedMessages":"19364","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19365","messages":"19366","suppressedMessages":"19367","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19368","messages":"19369","suppressedMessages":"19370","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19371","messages":"19372","suppressedMessages":"19373","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19374","messages":"19375","suppressedMessages":"19376","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19377","messages":"19378","suppressedMessages":"19379","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19380","messages":"19381","suppressedMessages":"19382","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19383","messages":"19384","suppressedMessages":"19385","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19386","messages":"19387","suppressedMessages":"19388","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19389","messages":"19390","suppressedMessages":"19391","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19392","messages":"19393","suppressedMessages":"19394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19395","messages":"19396","suppressedMessages":"19397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19398","messages":"19399","suppressedMessages":"19400","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19401","messages":"19402","suppressedMessages":"19403","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19404","messages":"19405","suppressedMessages":"19406","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19407","messages":"19408","suppressedMessages":"19409","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19410","messages":"19411","suppressedMessages":"19412","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19413","messages":"19414","suppressedMessages":"19415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19416","messages":"19417","suppressedMessages":"19418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19419","messages":"19420","suppressedMessages":"19421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19422","messages":"19423","suppressedMessages":"19424","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19425","messages":"19426","suppressedMessages":"19427","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19428","messages":"19429","suppressedMessages":"19430","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19431","messages":"19432","suppressedMessages":"19433","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19434","messages":"19435","suppressedMessages":"19436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19437","messages":"19438","suppressedMessages":"19439","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19440","messages":"19441","suppressedMessages":"19442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19443","messages":"19444","suppressedMessages":"19445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19446","messages":"19447","suppressedMessages":"19448","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19449","messages":"19450","suppressedMessages":"19451","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19452","messages":"19453","suppressedMessages":"19454","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19455","messages":"19456","suppressedMessages":"19457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19458","messages":"19459","suppressedMessages":"19460","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19461","messages":"19462","suppressedMessages":"19463","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19464","messages":"19465","suppressedMessages":"19466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19467","messages":"19468","suppressedMessages":"19469","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19470","messages":"19471","suppressedMessages":"19472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19473","messages":"19474","suppressedMessages":"19475","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19476","messages":"19477","suppressedMessages":"19478","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19479","messages":"19480","suppressedMessages":"19481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19482","messages":"19483","suppressedMessages":"19484","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19485","messages":"19486","suppressedMessages":"19487","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19488","messages":"19489","suppressedMessages":"19490","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19491","messages":"19492","suppressedMessages":"19493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19494","messages":"19495","suppressedMessages":"19496","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19497","messages":"19498","suppressedMessages":"19499","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19500","messages":"19501","suppressedMessages":"19502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19503","messages":"19504","suppressedMessages":"19505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19506","messages":"19507","suppressedMessages":"19508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19509","messages":"19510","suppressedMessages":"19511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19512","messages":"19513","suppressedMessages":"19514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19515","messages":"19516","suppressedMessages":"19517","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19518","messages":"19519","suppressedMessages":"19520","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19521","messages":"19522","suppressedMessages":"19523","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19524","messages":"19525","suppressedMessages":"19526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19527","messages":"19528","suppressedMessages":"19529","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19530","messages":"19531","suppressedMessages":"19532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19533","messages":"19534","suppressedMessages":"19535","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19536","messages":"19537","suppressedMessages":"19538","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19539","messages":"19540","suppressedMessages":"19541","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19542","messages":"19543","suppressedMessages":"19544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19545","messages":"19546","suppressedMessages":"19547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19548","messages":"19549","suppressedMessages":"19550","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19551","messages":"19552","suppressedMessages":"19553","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19554","messages":"19555","suppressedMessages":"19556","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19557","messages":"19558","suppressedMessages":"19559","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19560","messages":"19561","suppressedMessages":"19562","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19563","messages":"19564","suppressedMessages":"19565","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19566","messages":"19567","suppressedMessages":"19568","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19569","messages":"19570","suppressedMessages":"19571","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19572","messages":"19573","suppressedMessages":"19574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19575","messages":"19576","suppressedMessages":"19577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19578","messages":"19579","suppressedMessages":"19580","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19581","messages":"19582","suppressedMessages":"19583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19584","messages":"19585","suppressedMessages":"19586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19587","messages":"19588","suppressedMessages":"19589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19590","messages":"19591","suppressedMessages":"19592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19593","messages":"19594","suppressedMessages":"19595","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19596","messages":"19597","suppressedMessages":"19598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19599","messages":"19600","suppressedMessages":"19601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19602","messages":"19603","suppressedMessages":"19604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19605","messages":"19606","suppressedMessages":"19607","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19608","messages":"19609","suppressedMessages":"19610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19611","messages":"19612","suppressedMessages":"19613","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19614","messages":"19615","suppressedMessages":"19616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19617","messages":"19618","suppressedMessages":"19619","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19620","messages":"19621","suppressedMessages":"19622","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19623","messages":"19624","suppressedMessages":"19625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19626","messages":"19627","suppressedMessages":"19628","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19629","messages":"19630","suppressedMessages":"19631","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19632","messages":"19633","suppressedMessages":"19634","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19635","messages":"19636","suppressedMessages":"19637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19638","messages":"19639","suppressedMessages":"19640","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19641","messages":"19642","suppressedMessages":"19643","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19644","messages":"19645","suppressedMessages":"19646","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19647","messages":"19648","suppressedMessages":"19649","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19650","messages":"19651","suppressedMessages":"19652","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19653","messages":"19654","suppressedMessages":"19655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19656","messages":"19657","suppressedMessages":"19658","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19659","messages":"19660","suppressedMessages":"19661","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19662","messages":"19663","suppressedMessages":"19664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19665","messages":"19666","suppressedMessages":"19667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19668","messages":"19669","suppressedMessages":"19670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19671","messages":"19672","suppressedMessages":"19673","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19674","messages":"19675","suppressedMessages":"19676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19677","messages":"19678","suppressedMessages":"19679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19680","messages":"19681","suppressedMessages":"19682","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19683","messages":"19684","suppressedMessages":"19685","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19686","messages":"19687","suppressedMessages":"19688","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19689","messages":"19690","suppressedMessages":"19691","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19692","messages":"19693","suppressedMessages":"19694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19695","messages":"19696","suppressedMessages":"19697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19698","messages":"19699","suppressedMessages":"19700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19701","messages":"19702","suppressedMessages":"19703","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19704","messages":"19705","suppressedMessages":"19706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19707","messages":"19708","suppressedMessages":"19709","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19710","messages":"19711","suppressedMessages":"19712","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19713","messages":"19714","suppressedMessages":"19715","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19716","messages":"19717","suppressedMessages":"19718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19719","messages":"19720","suppressedMessages":"19721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19722","messages":"19723","suppressedMessages":"19724","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19725","messages":"19726","suppressedMessages":"19727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19728","messages":"19729","suppressedMessages":"19730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19731","messages":"19732","suppressedMessages":"19733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19734","messages":"19735","suppressedMessages":"19736","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19737","messages":"19738","suppressedMessages":"19739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19740","messages":"19741","suppressedMessages":"19742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19743","messages":"19744","suppressedMessages":"19745","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19746","messages":"19747","suppressedMessages":"19748","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19749","messages":"19750","suppressedMessages":"19751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19752","messages":"19753","suppressedMessages":"19754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19755","messages":"19756","suppressedMessages":"19757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19758","messages":"19759","suppressedMessages":"19760","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19761","messages":"19762","suppressedMessages":"19763","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19764","messages":"19765","suppressedMessages":"19766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19767","messages":"19768","suppressedMessages":"19769","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19770","messages":"19771","suppressedMessages":"19772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19773","messages":"19774","suppressedMessages":"19775","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19776","messages":"19777","suppressedMessages":"19778","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19779","messages":"19780","suppressedMessages":"19781","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19782","messages":"19783","suppressedMessages":"19784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19785","messages":"19786","suppressedMessages":"19787","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"19788","messages":"19789","suppressedMessages":"19790","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19791","messages":"19792","suppressedMessages":"19793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19794","messages":"19795","suppressedMessages":"19796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19797","messages":"19798","suppressedMessages":"19799","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19800","messages":"19801","suppressedMessages":"19802","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19803","messages":"19804","suppressedMessages":"19805","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19806","messages":"19807","suppressedMessages":"19808","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19809","messages":"19810","suppressedMessages":"19811","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19812","messages":"19813","suppressedMessages":"19814","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19815","messages":"19816","suppressedMessages":"19817","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19818","messages":"19819","suppressedMessages":"19820","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19821","messages":"19822","suppressedMessages":"19823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19824","messages":"19825","suppressedMessages":"19826","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19827","messages":"19828","suppressedMessages":"19829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19830","messages":"19831","suppressedMessages":"19832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19833","messages":"19834","suppressedMessages":"19835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19836","messages":"19837","suppressedMessages":"19838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19839","messages":"19840","suppressedMessages":"19841","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19842","messages":"19843","suppressedMessages":"19844","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19845","messages":"19846","suppressedMessages":"19847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19848","messages":"19849","suppressedMessages":"19850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19851","messages":"19852","suppressedMessages":"19853","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19854","messages":"19855","suppressedMessages":"19856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19857","messages":"19858","suppressedMessages":"19859","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19860","messages":"19861","suppressedMessages":"19862","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19863","messages":"19864","suppressedMessages":"19865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19866","messages":"19867","suppressedMessages":"19868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19869","messages":"19870","suppressedMessages":"19871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19872","messages":"19873","suppressedMessages":"19874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19875","messages":"19876","suppressedMessages":"19877","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19878","messages":"19879","suppressedMessages":"19880","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19881","messages":"19882","suppressedMessages":"19883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19884","messages":"19885","suppressedMessages":"19886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19887","messages":"19888","suppressedMessages":"19889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19890","messages":"19891","suppressedMessages":"19892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19893","messages":"19894","suppressedMessages":"19895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19896","messages":"19897","suppressedMessages":"19898","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19899","messages":"19900","suppressedMessages":"19901","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19902","messages":"19903","suppressedMessages":"19904","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19905","messages":"19906","suppressedMessages":"19907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19908","messages":"19909","suppressedMessages":"19910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19911","messages":"19912","suppressedMessages":"19913","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19914","messages":"19915","suppressedMessages":"19916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19917","messages":"19918","suppressedMessages":"19919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19920","messages":"19921","suppressedMessages":"19922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19923","messages":"19924","suppressedMessages":"19925","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19926","messages":"19927","suppressedMessages":"19928","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19929","messages":"19930","suppressedMessages":"19931","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19932","messages":"19933","suppressedMessages":"19934","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19935","messages":"19936","suppressedMessages":"19937","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19938","messages":"19939","suppressedMessages":"19940","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19941","messages":"19942","suppressedMessages":"19943","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19944","messages":"19945","suppressedMessages":"19946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19947","messages":"19948","suppressedMessages":"19949","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19950","messages":"19951","suppressedMessages":"19952","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19953","messages":"19954","suppressedMessages":"19955","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19956","messages":"19957","suppressedMessages":"19958","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19959","messages":"19960","suppressedMessages":"19961","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19962","messages":"19963","suppressedMessages":"19964","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19965","messages":"19966","suppressedMessages":"19967","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19968","messages":"19969","suppressedMessages":"19970","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19971","messages":"19972","suppressedMessages":"19973","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19974","messages":"19975","suppressedMessages":"19976","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19977","messages":"19978","suppressedMessages":"19979","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19980","messages":"19981","suppressedMessages":"19982","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19983","messages":"19984","suppressedMessages":"19985","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19986","messages":"19987","suppressedMessages":"19988","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19989","messages":"19990","suppressedMessages":"19991","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19992","messages":"19993","suppressedMessages":"19994","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19995","messages":"19996","suppressedMessages":"19997","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"19998","messages":"19999","suppressedMessages":"20000","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20001","messages":"20002","suppressedMessages":"20003","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20004","messages":"20005","suppressedMessages":"20006","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20007","messages":"20008","suppressedMessages":"20009","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20010","messages":"20011","suppressedMessages":"20012","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20013","messages":"20014","suppressedMessages":"20015","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20016","messages":"20017","suppressedMessages":"20018","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20019","messages":"20020","suppressedMessages":"20021","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20022","messages":"20023","suppressedMessages":"20024","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20025","messages":"20026","suppressedMessages":"20027","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20028","messages":"20029","suppressedMessages":"20030","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20031","messages":"20032","suppressedMessages":"20033","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20034","messages":"20035","suppressedMessages":"20036","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20037","messages":"20038","suppressedMessages":"20039","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20040","messages":"20041","suppressedMessages":"20042","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20043","messages":"20044","suppressedMessages":"20045","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20046","messages":"20047","suppressedMessages":"20048","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20049","messages":"20050","suppressedMessages":"20051","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20052","messages":"20053","suppressedMessages":"20054","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20055","messages":"20056","suppressedMessages":"20057","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20058","messages":"20059","suppressedMessages":"20060","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20061","messages":"20062","suppressedMessages":"20063","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20064","messages":"20065","suppressedMessages":"20066","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20067","messages":"20068","suppressedMessages":"20069","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20070","messages":"20071","suppressedMessages":"20072","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20073","messages":"20074","suppressedMessages":"20075","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20076","messages":"20077","suppressedMessages":"20078","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20079","messages":"20080","suppressedMessages":"20081","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20082","messages":"20083","suppressedMessages":"20084","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20085","messages":"20086","suppressedMessages":"20087","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20088","messages":"20089","suppressedMessages":"20090","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20091","messages":"20092","suppressedMessages":"20093","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20094","messages":"20095","suppressedMessages":"20096","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20097","messages":"20098","suppressedMessages":"20099","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20100","messages":"20101","suppressedMessages":"20102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20103","messages":"20104","suppressedMessages":"20105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20106","messages":"20107","suppressedMessages":"20108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20109","messages":"20110","suppressedMessages":"20111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20112","messages":"20113","suppressedMessages":"20114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20115","messages":"20116","suppressedMessages":"20117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20118","messages":"20119","suppressedMessages":"20120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20121","messages":"20122","suppressedMessages":"20123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20124","messages":"20125","suppressedMessages":"20126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20127","messages":"20128","suppressedMessages":"20129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20130","messages":"20131","suppressedMessages":"20132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20133","messages":"20134","suppressedMessages":"20135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20136","messages":"20137","suppressedMessages":"20138","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20139","messages":"20140","suppressedMessages":"20141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20142","messages":"20143","suppressedMessages":"20144","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"20145","messages":"20146","suppressedMessages":"20147","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20148","messages":"20149","suppressedMessages":"20150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20151","messages":"20152","suppressedMessages":"20153","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20154","messages":"20155","suppressedMessages":"20156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20157","messages":"20158","suppressedMessages":"20159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20160","messages":"20161","suppressedMessages":"20162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20163","messages":"20164","suppressedMessages":"20165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20166","messages":"20167","suppressedMessages":"20168","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20169","messages":"20170","suppressedMessages":"20171","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20172","messages":"20173","suppressedMessages":"20174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20175","messages":"20176","suppressedMessages":"20177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20178","messages":"20179","suppressedMessages":"20180","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20181","messages":"20182","suppressedMessages":"20183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20184","messages":"20185","suppressedMessages":"20186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20187","messages":"20188","suppressedMessages":"20189","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20190","messages":"20191","suppressedMessages":"20192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20193","messages":"20194","suppressedMessages":"20195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20196","messages":"20197","suppressedMessages":"20198","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20199","messages":"20200","suppressedMessages":"20201","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"20202","messages":"20203","suppressedMessages":"20204","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20205","messages":"20206","suppressedMessages":"20207","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20208","messages":"20209","suppressedMessages":"20210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20211","messages":"20212","suppressedMessages":"20213","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20214","messages":"20215","suppressedMessages":"20216","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20217","messages":"20218","suppressedMessages":"20219","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20220","messages":"20221","suppressedMessages":"20222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20223","messages":"20224","suppressedMessages":"20225","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20226","messages":"20227","suppressedMessages":"20228","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20229","messages":"20230","suppressedMessages":"20231","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"20232","messages":"20233","suppressedMessages":"20234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20235","messages":"20236","suppressedMessages":"20237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20238","messages":"20239","suppressedMessages":"20240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20241","messages":"20242","suppressedMessages":"20243","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20244","messages":"20245","suppressedMessages":"20246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20247","messages":"20248","suppressedMessages":"20249","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20250","messages":"20251","suppressedMessages":"20252","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20253","messages":"20254","suppressedMessages":"20255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20256","messages":"20257","suppressedMessages":"20258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20259","messages":"20260","suppressedMessages":"20261","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20262","messages":"20263","suppressedMessages":"20264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20265","messages":"20266","suppressedMessages":"20267","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20268","messages":"20269","suppressedMessages":"20270","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20271","messages":"20272","suppressedMessages":"20273","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20274","messages":"20275","suppressedMessages":"20276","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20277","messages":"20278","suppressedMessages":"20279","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20280","messages":"20281","suppressedMessages":"20282","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20283","messages":"20284","suppressedMessages":"20285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20286","messages":"20287","suppressedMessages":"20288","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"z7bfz5",{"filePath":"20289","messages":"20290","suppressedMessages":"20291","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"20292","messages":"20293","suppressedMessages":"20294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20295","messages":"20296","suppressedMessages":"20297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20298","messages":"20299","suppressedMessages":"20300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20301","messages":"20302","suppressedMessages":"20303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20304","messages":"20305","suppressedMessages":"20306","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20307","messages":"20308","suppressedMessages":"20309","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20310","messages":"20311","suppressedMessages":"20312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20313","messages":"20314","suppressedMessages":"20315","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20316","messages":"20317","suppressedMessages":"20318","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20319","messages":"20320","suppressedMessages":"20321","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20322","messages":"20323","suppressedMessages":"20324","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20325","messages":"20326","suppressedMessages":"20327","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20328","messages":"20329","suppressedMessages":"20330","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20331","messages":"20332","suppressedMessages":"20333","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20334","messages":"20335","suppressedMessages":"20336","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20337","messages":"20338","suppressedMessages":"20339","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20340","messages":"20341","suppressedMessages":"20342","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20343","messages":"20344","suppressedMessages":"20345","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20346","messages":"20347","suppressedMessages":"20348","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20349","messages":"20350","suppressedMessages":"20351","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20352","messages":"20353","suppressedMessages":"20354","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20355","messages":"20356","suppressedMessages":"20357","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20358","messages":"20359","suppressedMessages":"20360","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20361","messages":"20362","suppressedMessages":"20363","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20364","messages":"20365","suppressedMessages":"20366","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20367","messages":"20368","suppressedMessages":"20369","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20370","messages":"20371","suppressedMessages":"20372","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20373","messages":"20374","suppressedMessages":"20375","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20376","messages":"20377","suppressedMessages":"20378","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20379","messages":"20380","suppressedMessages":"20381","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20382","messages":"20383","suppressedMessages":"20384","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20385","messages":"20386","suppressedMessages":"20387","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20388","messages":"20389","suppressedMessages":"20390","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20391","messages":"20392","suppressedMessages":"20393","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20394","messages":"20395","suppressedMessages":"20396","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20397","messages":"20398","suppressedMessages":"20399","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20400","messages":"20401","suppressedMessages":"20402","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20403","messages":"20404","suppressedMessages":"20405","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20406","messages":"20407","suppressedMessages":"20408","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20409","messages":"20410","suppressedMessages":"20411","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20412","messages":"20413","suppressedMessages":"20414","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20415","messages":"20416","suppressedMessages":"20417","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20418","messages":"20419","suppressedMessages":"20420","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20421","messages":"20422","suppressedMessages":"20423","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20424","messages":"20425","suppressedMessages":"20426","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20427","messages":"20428","suppressedMessages":"20429","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20430","messages":"20431","suppressedMessages":"20432","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20433","messages":"20434","suppressedMessages":"20435","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20436","messages":"20437","suppressedMessages":"20438","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20439","messages":"20440","suppressedMessages":"20441","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20442","messages":"20443","suppressedMessages":"20444","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20445","messages":"20446","suppressedMessages":"20447","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20448","messages":"20449","suppressedMessages":"20450","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20451","messages":"20452","suppressedMessages":"20453","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20454","messages":"20455","suppressedMessages":"20456","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20457","messages":"20458","suppressedMessages":"20459","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20460","messages":"20461","suppressedMessages":"20462","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20463","messages":"20464","suppressedMessages":"20465","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20466","messages":"20467","suppressedMessages":"20468","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20469","messages":"20470","suppressedMessages":"20471","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20472","messages":"20473","suppressedMessages":"20474","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20475","messages":"20476","suppressedMessages":"20477","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20478","messages":"20479","suppressedMessages":"20480","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20481","messages":"20482","suppressedMessages":"20483","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20484","messages":"20485","suppressedMessages":"20486","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20487","messages":"20488","suppressedMessages":"20489","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20490","messages":"20491","suppressedMessages":"20492","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20493","messages":"20494","suppressedMessages":"20495","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20496","messages":"20497","suppressedMessages":"20498","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20499","messages":"20500","suppressedMessages":"20501","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20502","messages":"20503","suppressedMessages":"20504","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20505","messages":"20506","suppressedMessages":"20507","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20508","messages":"20509","suppressedMessages":"20510","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20511","messages":"20512","suppressedMessages":"20513","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20514","messages":"20515","suppressedMessages":"20516","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20517","messages":"20518","suppressedMessages":"20519","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20520","messages":"20521","suppressedMessages":"20522","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20523","messages":"20524","suppressedMessages":"20525","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20526","messages":"20527","suppressedMessages":"20528","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20529","messages":"20530","suppressedMessages":"20531","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20532","messages":"20533","suppressedMessages":"20534","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20535","messages":"20536","suppressedMessages":"20537","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20538","messages":"20539","suppressedMessages":"20540","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20541","messages":"20542","suppressedMessages":"20543","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20544","messages":"20545","suppressedMessages":"20546","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20547","messages":"20548","suppressedMessages":"20549","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20550","messages":"20551","suppressedMessages":"20552","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20553","messages":"20554","suppressedMessages":"20555","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20556","messages":"20557","suppressedMessages":"20558","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20559","messages":"20560","suppressedMessages":"20561","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20562","messages":"20563","suppressedMessages":"20564","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20565","messages":"20566","suppressedMessages":"20567","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20568","messages":"20569","suppressedMessages":"20570","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20571","messages":"20572","suppressedMessages":"20573","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20574","messages":"20575","suppressedMessages":"20576","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20577","messages":"20578","suppressedMessages":"20579","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20580","messages":"20581","suppressedMessages":"20582","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20583","messages":"20584","suppressedMessages":"20585","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20586","messages":"20587","suppressedMessages":"20588","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20589","messages":"20590","suppressedMessages":"20591","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20592","messages":"20593","suppressedMessages":"20594","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20595","messages":"20596","suppressedMessages":"20597","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"20598","messages":"20599","suppressedMessages":"20600","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20601","messages":"20602","suppressedMessages":"20603","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20604","messages":"20605","suppressedMessages":"20606","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20607","messages":"20608","suppressedMessages":"20609","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20610","messages":"20611","suppressedMessages":"20612","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"20613","messages":"20614","suppressedMessages":"20615","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20616","messages":"20617","suppressedMessages":"20618","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20619","messages":"20620","suppressedMessages":"20621","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20622","messages":"20623","suppressedMessages":"20624","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20625","messages":"20626","suppressedMessages":"20627","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20628","messages":"20629","suppressedMessages":"20630","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20631","messages":"20632","suppressedMessages":"20633","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20634","messages":"20635","suppressedMessages":"20636","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20637","messages":"20638","suppressedMessages":"20639","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20640","messages":"20641","suppressedMessages":"20642","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20643","messages":"20644","suppressedMessages":"20645","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20646","messages":"20647","suppressedMessages":"20648","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20649","messages":"20650","suppressedMessages":"20651","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20652","messages":"20653","suppressedMessages":"20654","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20655","messages":"20656","suppressedMessages":"20657","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20658","messages":"20659","suppressedMessages":"20660","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20661","messages":"20662","suppressedMessages":"20663","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20664","messages":"20665","suppressedMessages":"20666","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20667","messages":"20668","suppressedMessages":"20669","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20670","messages":"20671","suppressedMessages":"20672","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20673","messages":"20674","suppressedMessages":"20675","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20676","messages":"20677","suppressedMessages":"20678","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20679","messages":"20680","suppressedMessages":"20681","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20682","messages":"20683","suppressedMessages":"20684","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20685","messages":"20686","suppressedMessages":"20687","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20688","messages":"20689","suppressedMessages":"20690","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20691","messages":"20692","suppressedMessages":"20693","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20694","messages":"20695","suppressedMessages":"20696","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20697","messages":"20698","suppressedMessages":"20699","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20700","messages":"20701","suppressedMessages":"20702","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20703","messages":"20704","suppressedMessages":"20705","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20706","messages":"20707","suppressedMessages":"20708","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20709","messages":"20710","suppressedMessages":"20711","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20712","messages":"20713","suppressedMessages":"20714","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20715","messages":"20716","suppressedMessages":"20717","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20718","messages":"20719","suppressedMessages":"20720","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20721","messages":"20722","suppressedMessages":"20723","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20724","messages":"20725","suppressedMessages":"20726","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20727","messages":"20728","suppressedMessages":"20729","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20730","messages":"20731","suppressedMessages":"20732","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20733","messages":"20734","suppressedMessages":"20735","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20736","messages":"20737","suppressedMessages":"20738","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20739","messages":"20740","suppressedMessages":"20741","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20742","messages":"20743","suppressedMessages":"20744","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20745","messages":"20746","suppressedMessages":"20747","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20748","messages":"20749","suppressedMessages":"20750","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20751","messages":"20752","suppressedMessages":"20753","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20754","messages":"20755","suppressedMessages":"20756","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20757","messages":"20758","suppressedMessages":"20759","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20760","messages":"20761","suppressedMessages":"20762","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20763","messages":"20764","suppressedMessages":"20765","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20766","messages":"20767","suppressedMessages":"20768","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20769","messages":"20770","suppressedMessages":"20771","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20772","messages":"20773","suppressedMessages":"20774","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20775","messages":"20776","suppressedMessages":"20777","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20778","messages":"20779","suppressedMessages":"20780","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20781","messages":"20782","suppressedMessages":"20783","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20784","messages":"20785","suppressedMessages":"20786","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20787","messages":"20788","suppressedMessages":"20789","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20790","messages":"20791","suppressedMessages":"20792","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20793","messages":"20794","suppressedMessages":"20795","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20796","messages":"20797","suppressedMessages":"20798","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20799","messages":"20800","suppressedMessages":"20801","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20802","messages":"20803","suppressedMessages":"20804","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20805","messages":"20806","suppressedMessages":"20807","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20808","messages":"20809","suppressedMessages":"20810","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20811","messages":"20812","suppressedMessages":"20813","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20814","messages":"20815","suppressedMessages":"20816","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20817","messages":"20818","suppressedMessages":"20819","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20820","messages":"20821","suppressedMessages":"20822","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20823","messages":"20824","suppressedMessages":"20825","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20826","messages":"20827","suppressedMessages":"20828","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20829","messages":"20830","suppressedMessages":"20831","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20832","messages":"20833","suppressedMessages":"20834","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20835","messages":"20836","suppressedMessages":"20837","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20838","messages":"20839","suppressedMessages":"20840","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20841","messages":"20842","suppressedMessages":"20843","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20844","messages":"20845","suppressedMessages":"20846","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20847","messages":"20848","suppressedMessages":"20849","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20850","messages":"20851","suppressedMessages":"20852","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20853","messages":"20854","suppressedMessages":"20855","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20856","messages":"20857","suppressedMessages":"20858","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20859","messages":"20860","suppressedMessages":"20861","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20862","messages":"20863","suppressedMessages":"20864","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20865","messages":"20866","suppressedMessages":"20867","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20868","messages":"20869","suppressedMessages":"20870","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20871","messages":"20872","suppressedMessages":"20873","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20874","messages":"20875","suppressedMessages":"20876","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20877","messages":"20878","suppressedMessages":"20879","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20880","messages":"20881","suppressedMessages":"20882","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20883","messages":"20884","suppressedMessages":"20885","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20886","messages":"20887","suppressedMessages":"20888","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20889","messages":"20890","suppressedMessages":"20891","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20892","messages":"20893","suppressedMessages":"20894","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20895","messages":"20896","suppressedMessages":"20897","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20898","messages":"20899","suppressedMessages":"20900","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20901","messages":"20902","suppressedMessages":"20903","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20904","messages":"20905","suppressedMessages":"20906","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20907","messages":"20908","suppressedMessages":"20909","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20910","messages":"20911","suppressedMessages":"20912","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20913","messages":"20914","suppressedMessages":"20915","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20916","messages":"20917","suppressedMessages":"20918","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20919","messages":"20920","suppressedMessages":"20921","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"20922","messages":"20923","suppressedMessages":"20924","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20925","messages":"20926","suppressedMessages":"20927","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20928","messages":"20929","suppressedMessages":"20930","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20931","messages":"20932","suppressedMessages":"20933","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20934","messages":"20935","suppressedMessages":"20936","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20937","messages":"20938","suppressedMessages":"20939","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20940","messages":"20941","suppressedMessages":"20942","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20943","messages":"20944","suppressedMessages":"20945","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20946","messages":"20947","suppressedMessages":"20948","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20949","messages":"20950","suppressedMessages":"20951","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20952","messages":"20953","suppressedMessages":"20954","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20955","messages":"20956","suppressedMessages":"20957","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20958","messages":"20959","suppressedMessages":"20960","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20961","messages":"20962","suppressedMessages":"20963","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20964","messages":"20965","suppressedMessages":"20966","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20967","messages":"20968","suppressedMessages":"20969","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20970","messages":"20971","suppressedMessages":"20972","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20973","messages":"20974","suppressedMessages":"20975","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20976","messages":"20977","suppressedMessages":"20978","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20979","messages":"20980","suppressedMessages":"20981","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20982","messages":"20983","suppressedMessages":"20984","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20985","messages":"20986","suppressedMessages":"20987","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20988","messages":"20989","suppressedMessages":"20990","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20991","messages":"20992","suppressedMessages":"20993","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20994","messages":"20995","suppressedMessages":"20996","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"20997","messages":"20998","suppressedMessages":"20999","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21000","messages":"21001","suppressedMessages":"21002","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21003","messages":"21004","suppressedMessages":"21005","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21006","messages":"21007","suppressedMessages":"21008","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21009","messages":"21010","suppressedMessages":"21011","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21012","messages":"21013","suppressedMessages":"21014","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21015","messages":"21016","suppressedMessages":"21017","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21018","messages":"21019","suppressedMessages":"21020","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21021","messages":"21022","suppressedMessages":"21023","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21024","messages":"21025","suppressedMessages":"21026","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21027","messages":"21028","suppressedMessages":"21029","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21030","messages":"21031","suppressedMessages":"21032","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21033","messages":"21034","suppressedMessages":"21035","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21036","messages":"21037","suppressedMessages":"21038","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21039","messages":"21040","suppressedMessages":"21041","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21042","messages":"21043","suppressedMessages":"21044","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21045","messages":"21046","suppressedMessages":"21047","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21048","messages":"21049","suppressedMessages":"21050","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21051","messages":"21052","suppressedMessages":"21053","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21054","messages":"21055","suppressedMessages":"21056","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21057","messages":"21058","suppressedMessages":"21059","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21060","messages":"21061","suppressedMessages":"21062","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21063","messages":"21064","suppressedMessages":"21065","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21066","messages":"21067","suppressedMessages":"21068","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21069","messages":"21070","suppressedMessages":"21071","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21072","messages":"21073","suppressedMessages":"21074","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21075","messages":"21076","suppressedMessages":"21077","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21078","messages":"21079","suppressedMessages":"21080","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21081","messages":"21082","suppressedMessages":"21083","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21084","messages":"21085","suppressedMessages":"21086","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21087","messages":"21088","suppressedMessages":"21089","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21090","messages":"21091","suppressedMessages":"21092","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21093","messages":"21094","suppressedMessages":"21095","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21096","messages":"21097","suppressedMessages":"21098","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21099","messages":"21100","suppressedMessages":"21101","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21102","messages":"21103","suppressedMessages":"21104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21105","messages":"21106","suppressedMessages":"21107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21108","messages":"21109","suppressedMessages":"21110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21111","messages":"21112","suppressedMessages":"21113","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21114","messages":"21115","suppressedMessages":"21116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21117","messages":"21118","suppressedMessages":"21119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21120","messages":"21121","suppressedMessages":"21122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21123","messages":"21124","suppressedMessages":"21125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21126","messages":"21127","suppressedMessages":"21128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21129","messages":"21130","suppressedMessages":"21131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21132","messages":"21133","suppressedMessages":"21134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21135","messages":"21136","suppressedMessages":"21137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21138","messages":"21139","suppressedMessages":"21140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21141","messages":"21142","suppressedMessages":"21143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21144","messages":"21145","suppressedMessages":"21146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21147","messages":"21148","suppressedMessages":"21149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21150","messages":"21151","suppressedMessages":"21152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21153","messages":"21154","suppressedMessages":"21155","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21156","messages":"21157","suppressedMessages":"21158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21159","messages":"21160","suppressedMessages":"21161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21162","messages":"21163","suppressedMessages":"21164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21165","messages":"21166","suppressedMessages":"21167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21168","messages":"21169","suppressedMessages":"21170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21171","messages":"21172","suppressedMessages":"21173","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21174","messages":"21175","suppressedMessages":"21176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21177","messages":"21178","suppressedMessages":"21179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21180","messages":"21181","suppressedMessages":"21182","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21183","messages":"21184","suppressedMessages":"21185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21186","messages":"21187","suppressedMessages":"21188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21189","messages":"21190","suppressedMessages":"21191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21192","messages":"21193","suppressedMessages":"21194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21195","messages":"21196","suppressedMessages":"21197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21198","messages":"21199","suppressedMessages":"21200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21201","messages":"21202","suppressedMessages":"21203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21204","messages":"21205","suppressedMessages":"21206","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21207","messages":"21208","suppressedMessages":"21209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21210","messages":"21211","suppressedMessages":"21212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21213","messages":"21214","suppressedMessages":"21215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21216","messages":"21217","suppressedMessages":"21218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21219","messages":"21220","suppressedMessages":"21221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21222","messages":"21223","suppressedMessages":"21224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21225","messages":"21226","suppressedMessages":"21227","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21228","messages":"21229","suppressedMessages":"21230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21231","messages":"21232","suppressedMessages":"21233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21234","messages":"21235","suppressedMessages":"21236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21237","messages":"21238","suppressedMessages":"21239","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21240","messages":"21241","suppressedMessages":"21242","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21243","messages":"21244","suppressedMessages":"21245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21246","messages":"21247","suppressedMessages":"21248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21249","messages":"21250","suppressedMessages":"21251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21252","messages":"21253","suppressedMessages":"21254","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21255","messages":"21256","suppressedMessages":"21257","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21258","messages":"21259","suppressedMessages":"21260","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"21261","messages":"21262","suppressedMessages":"21263","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21264","messages":"21265","suppressedMessages":"21266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21267","messages":"21268","suppressedMessages":"21269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21270","messages":"21271","suppressedMessages":"21272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21273","messages":"21274","suppressedMessages":"21275","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21276","messages":"21277","suppressedMessages":"21278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21279","messages":"21280","suppressedMessages":"21281","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21282","messages":"21283","suppressedMessages":"21284","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21285","messages":"21286","suppressedMessages":"21287","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21288","messages":"21289","suppressedMessages":"21290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21291","messages":"21292","suppressedMessages":"21293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21294","messages":"21295","suppressedMessages":"21296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21297","messages":"21298","suppressedMessages":"21299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21300","messages":"21301","suppressedMessages":"21302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21303","messages":"21304","suppressedMessages":"21305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21306","messages":"21307","suppressedMessages":"21308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21309","messages":"21310","suppressedMessages":"21311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21312","messages":"21313","suppressedMessages":"21314","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21315","messages":"21316","suppressedMessages":"21317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21318","messages":"21319","suppressedMessages":"21320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21321","messages":"21322","suppressedMessages":"21323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21324","messages":"21325","suppressedMessages":"21326","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21327","messages":"21328","suppressedMessages":"21329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21330","messages":"21331","suppressedMessages":"21332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21333","messages":"21334","suppressedMessages":"21335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21336","messages":"21337","suppressedMessages":"21338","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21339","messages":"21340","suppressedMessages":"21341","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21342","messages":"21343","suppressedMessages":"21344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21345","messages":"21346","suppressedMessages":"21347","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21348","messages":"21349","suppressedMessages":"21350","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21351","messages":"21352","suppressedMessages":"21353","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21354","messages":"21355","suppressedMessages":"21356","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21357","messages":"21358","suppressedMessages":"21359","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21360","messages":"21361","suppressedMessages":"21362","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21363","messages":"21364","suppressedMessages":"21365","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21366","messages":"21367","suppressedMessages":"21368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21369","messages":"21370","suppressedMessages":"21371","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21372","messages":"21373","suppressedMessages":"21374","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21375","messages":"21376","suppressedMessages":"21377","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21378","messages":"21379","suppressedMessages":"21380","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21381","messages":"21382","suppressedMessages":"21383","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21384","messages":"21385","suppressedMessages":"21386","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21387","messages":"21388","suppressedMessages":"21389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21390","messages":"21391","suppressedMessages":"21392","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21393","messages":"21394","suppressedMessages":"21395","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21396","messages":"21397","suppressedMessages":"21398","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21399","messages":"21400","suppressedMessages":"21401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21402","messages":"21403","suppressedMessages":"21404","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21405","messages":"21406","suppressedMessages":"21407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21408","messages":"21409","suppressedMessages":"21410","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21411","messages":"21412","suppressedMessages":"21413","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21414","messages":"21415","suppressedMessages":"21416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21417","messages":"21418","suppressedMessages":"21419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21420","messages":"21421","suppressedMessages":"21422","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21423","messages":"21424","suppressedMessages":"21425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21426","messages":"21427","suppressedMessages":"21428","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21429","messages":"21430","suppressedMessages":"21431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21432","messages":"21433","suppressedMessages":"21434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21435","messages":"21436","suppressedMessages":"21437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21438","messages":"21439","suppressedMessages":"21440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21441","messages":"21442","suppressedMessages":"21443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21444","messages":"21445","suppressedMessages":"21446","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21447","messages":"21448","suppressedMessages":"21449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21450","messages":"21451","suppressedMessages":"21452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21453","messages":"21454","suppressedMessages":"21455","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21456","messages":"21457","suppressedMessages":"21458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21459","messages":"21460","suppressedMessages":"21461","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21462","messages":"21463","suppressedMessages":"21464","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21465","messages":"21466","suppressedMessages":"21467","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21468","messages":"21469","suppressedMessages":"21470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21471","messages":"21472","suppressedMessages":"21473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21474","messages":"21475","suppressedMessages":"21476","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21477","messages":"21478","suppressedMessages":"21479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21480","messages":"21481","suppressedMessages":"21482","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21483","messages":"21484","suppressedMessages":"21485","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21486","messages":"21487","suppressedMessages":"21488","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21489","messages":"21490","suppressedMessages":"21491","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21492","messages":"21493","suppressedMessages":"21494","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21495","messages":"21496","suppressedMessages":"21497","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21498","messages":"21499","suppressedMessages":"21500","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21501","messages":"21502","suppressedMessages":"21503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21504","messages":"21505","suppressedMessages":"21506","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21507","messages":"21508","suppressedMessages":"21509","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21510","messages":"21511","suppressedMessages":"21512","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21513","messages":"21514","suppressedMessages":"21515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21516","messages":"21517","suppressedMessages":"21518","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21519","messages":"21520","suppressedMessages":"21521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21522","messages":"21523","suppressedMessages":"21524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21525","messages":"21526","suppressedMessages":"21527","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21528","messages":"21529","suppressedMessages":"21530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21531","messages":"21532","suppressedMessages":"21533","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21534","messages":"21535","suppressedMessages":"21536","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21537","messages":"21538","suppressedMessages":"21539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21540","messages":"21541","suppressedMessages":"21542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21543","messages":"21544","suppressedMessages":"21545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21546","messages":"21547","suppressedMessages":"21548","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21549","messages":"21550","suppressedMessages":"21551","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21552","messages":"21553","suppressedMessages":"21554","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21555","messages":"21556","suppressedMessages":"21557","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21558","messages":"21559","suppressedMessages":"21560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21561","messages":"21562","suppressedMessages":"21563","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21564","messages":"21565","suppressedMessages":"21566","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21567","messages":"21568","suppressedMessages":"21569","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21570","messages":"21571","suppressedMessages":"21572","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21573","messages":"21574","suppressedMessages":"21575","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21576","messages":"21577","suppressedMessages":"21578","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21579","messages":"21580","suppressedMessages":"21581","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21582","messages":"21583","suppressedMessages":"21584","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21585","messages":"21586","suppressedMessages":"21587","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21588","messages":"21589","suppressedMessages":"21590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21591","messages":"21592","suppressedMessages":"21593","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21594","messages":"21595","suppressedMessages":"21596","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21597","messages":"21598","suppressedMessages":"21599","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21600","messages":"21601","suppressedMessages":"21602","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21603","messages":"21604","suppressedMessages":"21605","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21606","messages":"21607","suppressedMessages":"21608","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21609","messages":"21610","suppressedMessages":"21611","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21612","messages":"21613","suppressedMessages":"21614","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21615","messages":"21616","suppressedMessages":"21617","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21618","messages":"21619","suppressedMessages":"21620","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21621","messages":"21622","suppressedMessages":"21623","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21624","messages":"21625","suppressedMessages":"21626","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21627","messages":"21628","suppressedMessages":"21629","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21630","messages":"21631","suppressedMessages":"21632","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21633","messages":"21634","suppressedMessages":"21635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21636","messages":"21637","suppressedMessages":"21638","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21639","messages":"21640","suppressedMessages":"21641","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21642","messages":"21643","suppressedMessages":"21644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21645","messages":"21646","suppressedMessages":"21647","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21648","messages":"21649","suppressedMessages":"21650","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21651","messages":"21652","suppressedMessages":"21653","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21654","messages":"21655","suppressedMessages":"21656","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21657","messages":"21658","suppressedMessages":"21659","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21660","messages":"21661","suppressedMessages":"21662","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21663","messages":"21664","suppressedMessages":"21665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21666","messages":"21667","suppressedMessages":"21668","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21669","messages":"21670","suppressedMessages":"21671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21672","messages":"21673","suppressedMessages":"21674","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21675","messages":"21676","suppressedMessages":"21677","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21678","messages":"21679","suppressedMessages":"21680","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21681","messages":"21682","suppressedMessages":"21683","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21684","messages":"21685","suppressedMessages":"21686","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21687","messages":"21688","suppressedMessages":"21689","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21690","messages":"21691","suppressedMessages":"21692","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21693","messages":"21694","suppressedMessages":"21695","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21696","messages":"21697","suppressedMessages":"21698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21699","messages":"21700","suppressedMessages":"21701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21702","messages":"21703","suppressedMessages":"21704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21705","messages":"21706","suppressedMessages":"21707","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21708","messages":"21709","suppressedMessages":"21710","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21711","messages":"21712","suppressedMessages":"21713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21714","messages":"21715","suppressedMessages":"21716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21717","messages":"21718","suppressedMessages":"21719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21720","messages":"21721","suppressedMessages":"21722","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21723","messages":"21724","suppressedMessages":"21725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21726","messages":"21727","suppressedMessages":"21728","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21729","messages":"21730","suppressedMessages":"21731","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21732","messages":"21733","suppressedMessages":"21734","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21735","messages":"21736","suppressedMessages":"21737","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21738","messages":"21739","suppressedMessages":"21740","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21741","messages":"21742","suppressedMessages":"21743","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21744","messages":"21745","suppressedMessages":"21746","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21747","messages":"21748","suppressedMessages":"21749","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21750","messages":"21751","suppressedMessages":"21752","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21753","messages":"21754","suppressedMessages":"21755","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21756","messages":"21757","suppressedMessages":"21758","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21759","messages":"21760","suppressedMessages":"21761","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21762","messages":"21763","suppressedMessages":"21764","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21765","messages":"21766","suppressedMessages":"21767","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21768","messages":"21769","suppressedMessages":"21770","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21771","messages":"21772","suppressedMessages":"21773","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21774","messages":"21775","suppressedMessages":"21776","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21777","messages":"21778","suppressedMessages":"21779","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21780","messages":"21781","suppressedMessages":"21782","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21783","messages":"21784","suppressedMessages":"21785","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21786","messages":"21787","suppressedMessages":"21788","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21789","messages":"21790","suppressedMessages":"21791","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21792","messages":"21793","suppressedMessages":"21794","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21795","messages":"21796","suppressedMessages":"21797","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21798","messages":"21799","suppressedMessages":"21800","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21801","messages":"21802","suppressedMessages":"21803","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21804","messages":"21805","suppressedMessages":"21806","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21807","messages":"21808","suppressedMessages":"21809","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21810","messages":"21811","suppressedMessages":"21812","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21813","messages":"21814","suppressedMessages":"21815","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21816","messages":"21817","suppressedMessages":"21818","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21819","messages":"21820","suppressedMessages":"21821","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21822","messages":"21823","suppressedMessages":"21824","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21825","messages":"21826","suppressedMessages":"21827","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21828","messages":"21829","suppressedMessages":"21830","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21831","messages":"21832","suppressedMessages":"21833","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21834","messages":"21835","suppressedMessages":"21836","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21837","messages":"21838","suppressedMessages":"21839","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21840","messages":"21841","suppressedMessages":"21842","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21843","messages":"21844","suppressedMessages":"21845","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21846","messages":"21847","suppressedMessages":"21848","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21849","messages":"21850","suppressedMessages":"21851","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21852","messages":"21853","suppressedMessages":"21854","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21855","messages":"21856","suppressedMessages":"21857","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"21858","messages":"21859","suppressedMessages":"21860","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"21861","messages":"21862","suppressedMessages":"21863","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21864","messages":"21865","suppressedMessages":"21866","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21867","messages":"21868","suppressedMessages":"21869","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21870","messages":"21871","suppressedMessages":"21872","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21873","messages":"21874","suppressedMessages":"21875","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21876","messages":"21877","suppressedMessages":"21878","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21879","messages":"21880","suppressedMessages":"21881","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21882","messages":"21883","suppressedMessages":"21884","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21885","messages":"21886","suppressedMessages":"21887","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21888","messages":"21889","suppressedMessages":"21890","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21891","messages":"21892","suppressedMessages":"21893","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21894","messages":"21895","suppressedMessages":"21896","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21897","messages":"21898","suppressedMessages":"21899","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21900","messages":"21901","suppressedMessages":"21902","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21903","messages":"21904","suppressedMessages":"21905","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21906","messages":"21907","suppressedMessages":"21908","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21909","messages":"21910","suppressedMessages":"21911","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21912","messages":"21913","suppressedMessages":"21914","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21915","messages":"21916","suppressedMessages":"21917","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21918","messages":"21919","suppressedMessages":"21920","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21921","messages":"21922","suppressedMessages":"21923","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21924","messages":"21925","suppressedMessages":"21926","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"21927","messages":"21928","suppressedMessages":"21929","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21930","messages":"21931","suppressedMessages":"21932","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21933","messages":"21934","suppressedMessages":"21935","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21936","messages":"21937","suppressedMessages":"21938","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21939","messages":"21940","suppressedMessages":"21941","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21942","messages":"21943","suppressedMessages":"21944","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21945","messages":"21946","suppressedMessages":"21947","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21948","messages":"21949","suppressedMessages":"21950","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21951","messages":"21952","suppressedMessages":"21953","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21954","messages":"21955","suppressedMessages":"21956","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"21957","messages":"21958","suppressedMessages":"21959","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21960","messages":"21961","suppressedMessages":"21962","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21963","messages":"21964","suppressedMessages":"21965","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21966","messages":"21967","suppressedMessages":"21968","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21969","messages":"21970","suppressedMessages":"21971","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21972","messages":"21973","suppressedMessages":"21974","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21975","messages":"21976","suppressedMessages":"21977","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21978","messages":"21979","suppressedMessages":"21980","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21981","messages":"21982","suppressedMessages":"21983","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21984","messages":"21985","suppressedMessages":"21986","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21987","messages":"21988","suppressedMessages":"21989","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21990","messages":"21991","suppressedMessages":"21992","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21993","messages":"21994","suppressedMessages":"21995","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21996","messages":"21997","suppressedMessages":"21998","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"21999","messages":"22000","suppressedMessages":"22001","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22002","messages":"22003","suppressedMessages":"22004","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22005","messages":"22006","suppressedMessages":"22007","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22008","messages":"22009","suppressedMessages":"22010","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22011","messages":"22012","suppressedMessages":"22013","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22014","messages":"22015","suppressedMessages":"22016","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22017","messages":"22018","suppressedMessages":"22019","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22020","messages":"22021","suppressedMessages":"22022","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22023","messages":"22024","suppressedMessages":"22025","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22026","messages":"22027","suppressedMessages":"22028","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22029","messages":"22030","suppressedMessages":"22031","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22032","messages":"22033","suppressedMessages":"22034","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22035","messages":"22036","suppressedMessages":"22037","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22038","messages":"22039","suppressedMessages":"22040","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22041","messages":"22042","suppressedMessages":"22043","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22044","messages":"22045","suppressedMessages":"22046","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22047","messages":"22048","suppressedMessages":"22049","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22050","messages":"22051","suppressedMessages":"22052","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22053","messages":"22054","suppressedMessages":"22055","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22056","messages":"22057","suppressedMessages":"22058","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22059","messages":"22060","suppressedMessages":"22061","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22062","messages":"22063","suppressedMessages":"22064","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22065","messages":"22066","suppressedMessages":"22067","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22068","messages":"22069","suppressedMessages":"22070","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22071","messages":"22072","suppressedMessages":"22073","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22074","messages":"22075","suppressedMessages":"22076","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22077","messages":"22078","suppressedMessages":"22079","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22080","messages":"22081","suppressedMessages":"22082","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22083","messages":"22084","suppressedMessages":"22085","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22086","messages":"22087","suppressedMessages":"22088","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22089","messages":"22090","suppressedMessages":"22091","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22092","messages":"22093","suppressedMessages":"22094","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22095","messages":"22096","suppressedMessages":"22097","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22098","messages":"22099","suppressedMessages":"22100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22101","messages":"22102","suppressedMessages":"22103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22104","messages":"22105","suppressedMessages":"22106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22107","messages":"22108","suppressedMessages":"22109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22110","messages":"22111","suppressedMessages":"22112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22113","messages":"22114","suppressedMessages":"22115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22116","messages":"22117","suppressedMessages":"22118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22119","messages":"22120","suppressedMessages":"22121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22122","messages":"22123","suppressedMessages":"22124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22125","messages":"22126","suppressedMessages":"22127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22128","messages":"22129","suppressedMessages":"22130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22131","messages":"22132","suppressedMessages":"22133","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22134","messages":"22135","suppressedMessages":"22136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22137","messages":"22138","suppressedMessages":"22139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22140","messages":"22141","suppressedMessages":"22142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22143","messages":"22144","suppressedMessages":"22145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22146","messages":"22147","suppressedMessages":"22148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22149","messages":"22150","suppressedMessages":"22151","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22152","messages":"22153","suppressedMessages":"22154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22155","messages":"22156","suppressedMessages":"22157","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22158","messages":"22159","suppressedMessages":"22160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22161","messages":"22162","suppressedMessages":"22163","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22164","messages":"22165","suppressedMessages":"22166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22167","messages":"22168","suppressedMessages":"22169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22170","messages":"22171","suppressedMessages":"22172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22173","messages":"22174","suppressedMessages":"22175","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22176","messages":"22177","suppressedMessages":"22178","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22179","messages":"22180","suppressedMessages":"22181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22182","messages":"22183","suppressedMessages":"22184","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22185","messages":"22186","suppressedMessages":"22187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22188","messages":"22189","suppressedMessages":"22190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22191","messages":"22192","suppressedMessages":"22193","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22194","messages":"22195","suppressedMessages":"22196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22197","messages":"22198","suppressedMessages":"22199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22200","messages":"22201","suppressedMessages":"22202","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22203","messages":"22204","suppressedMessages":"22205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22206","messages":"22207","suppressedMessages":"22208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22209","messages":"22210","suppressedMessages":"22211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22212","messages":"22213","suppressedMessages":"22214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22215","messages":"22216","suppressedMessages":"22217","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22218","messages":"22219","suppressedMessages":"22220","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22221","messages":"22222","suppressedMessages":"22223","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22224","messages":"22225","suppressedMessages":"22226","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22227","messages":"22228","suppressedMessages":"22229","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22230","messages":"22231","suppressedMessages":"22232","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22233","messages":"22234","suppressedMessages":"22235","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22236","messages":"22237","suppressedMessages":"22238","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22239","messages":"22240","suppressedMessages":"22241","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22242","messages":"22243","suppressedMessages":"22244","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22245","messages":"22246","suppressedMessages":"22247","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22248","messages":"22249","suppressedMessages":"22250","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22251","messages":"22252","suppressedMessages":"22253","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22254","messages":"22255","suppressedMessages":"22256","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22257","messages":"22258","suppressedMessages":"22259","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22260","messages":"22261","suppressedMessages":"22262","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22263","messages":"22264","suppressedMessages":"22265","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22266","messages":"22267","suppressedMessages":"22268","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22269","messages":"22270","suppressedMessages":"22271","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22272","messages":"22273","suppressedMessages":"22274","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22275","messages":"22276","suppressedMessages":"22277","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22278","messages":"22279","suppressedMessages":"22280","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22281","messages":"22282","suppressedMessages":"22283","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22284","messages":"22285","suppressedMessages":"22286","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22287","messages":"22288","suppressedMessages":"22289","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22290","messages":"22291","suppressedMessages":"22292","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22293","messages":"22294","suppressedMessages":"22295","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22296","messages":"22297","suppressedMessages":"22298","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22299","messages":"22300","suppressedMessages":"22301","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22302","messages":"22303","suppressedMessages":"22304","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22305","messages":"22306","suppressedMessages":"22307","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22308","messages":"22309","suppressedMessages":"22310","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22311","messages":"22312","suppressedMessages":"22313","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22314","messages":"22315","suppressedMessages":"22316","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22317","messages":"22318","suppressedMessages":"22319","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22320","messages":"22321","suppressedMessages":"22322","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22323","messages":"22324","suppressedMessages":"22325","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22326","messages":"22327","suppressedMessages":"22328","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22329","messages":"22330","suppressedMessages":"22331","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22332","messages":"22333","suppressedMessages":"22334","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22335","messages":"22336","suppressedMessages":"22337","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22338","messages":"22339","suppressedMessages":"22340","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22341","messages":"22342","suppressedMessages":"22343","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22344","messages":"22345","suppressedMessages":"22346","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22347","messages":"22348","suppressedMessages":"22349","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22350","messages":"22351","suppressedMessages":"22352","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22353","messages":"22354","suppressedMessages":"22355","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22356","messages":"22357","suppressedMessages":"22358","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22359","messages":"22360","suppressedMessages":"22361","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22362","messages":"22363","suppressedMessages":"22364","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22365","messages":"22366","suppressedMessages":"22367","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22368","messages":"22369","suppressedMessages":"22370","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22371","messages":"22372","suppressedMessages":"22373","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22374","messages":"22375","suppressedMessages":"22376","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22377","messages":"22378","suppressedMessages":"22379","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22380","messages":"22381","suppressedMessages":"22382","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22383","messages":"22384","suppressedMessages":"22385","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22386","messages":"22387","suppressedMessages":"22388","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22389","messages":"22390","suppressedMessages":"22391","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22392","messages":"22393","suppressedMessages":"22394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22395","messages":"22396","suppressedMessages":"22397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22398","messages":"22399","suppressedMessages":"22400","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22401","messages":"22402","suppressedMessages":"22403","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22404","messages":"22405","suppressedMessages":"22406","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22407","messages":"22408","suppressedMessages":"22409","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22410","messages":"22411","suppressedMessages":"22412","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22413","messages":"22414","suppressedMessages":"22415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22416","messages":"22417","suppressedMessages":"22418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22419","messages":"22420","suppressedMessages":"22421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22422","messages":"22423","suppressedMessages":"22424","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22425","messages":"22426","suppressedMessages":"22427","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22428","messages":"22429","suppressedMessages":"22430","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22431","messages":"22432","suppressedMessages":"22433","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22434","messages":"22435","suppressedMessages":"22436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22437","messages":"22438","suppressedMessages":"22439","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22440","messages":"22441","suppressedMessages":"22442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22443","messages":"22444","suppressedMessages":"22445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22446","messages":"22447","suppressedMessages":"22448","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22449","messages":"22450","suppressedMessages":"22451","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22452","messages":"22453","suppressedMessages":"22454","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22455","messages":"22456","suppressedMessages":"22457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22458","messages":"22459","suppressedMessages":"22460","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22461","messages":"22462","suppressedMessages":"22463","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22464","messages":"22465","suppressedMessages":"22466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22467","messages":"22468","suppressedMessages":"22469","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22470","messages":"22471","suppressedMessages":"22472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22473","messages":"22474","suppressedMessages":"22475","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22476","messages":"22477","suppressedMessages":"22478","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22479","messages":"22480","suppressedMessages":"22481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22482","messages":"22483","suppressedMessages":"22484","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22485","messages":"22486","suppressedMessages":"22487","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22488","messages":"22489","suppressedMessages":"22490","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22491","messages":"22492","suppressedMessages":"22493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22494","messages":"22495","suppressedMessages":"22496","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22497","messages":"22498","suppressedMessages":"22499","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22500","messages":"22501","suppressedMessages":"22502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22503","messages":"22504","suppressedMessages":"22505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22506","messages":"22507","suppressedMessages":"22508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22509","messages":"22510","suppressedMessages":"22511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22512","messages":"22513","suppressedMessages":"22514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22515","messages":"22516","suppressedMessages":"22517","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22518","messages":"22519","suppressedMessages":"22520","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22521","messages":"22522","suppressedMessages":"22523","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22524","messages":"22525","suppressedMessages":"22526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22527","messages":"22528","suppressedMessages":"22529","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22530","messages":"22531","suppressedMessages":"22532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22533","messages":"22534","suppressedMessages":"22535","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22536","messages":"22537","suppressedMessages":"22538","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22539","messages":"22540","suppressedMessages":"22541","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22542","messages":"22543","suppressedMessages":"22544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22545","messages":"22546","suppressedMessages":"22547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22548","messages":"22549","suppressedMessages":"22550","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22551","messages":"22552","suppressedMessages":"22553","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22554","messages":"22555","suppressedMessages":"22556","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22557","messages":"22558","suppressedMessages":"22559","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22560","messages":"22561","suppressedMessages":"22562","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22563","messages":"22564","suppressedMessages":"22565","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22566","messages":"22567","suppressedMessages":"22568","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22569","messages":"22570","suppressedMessages":"22571","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22572","messages":"22573","suppressedMessages":"22574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22575","messages":"22576","suppressedMessages":"22577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22578","messages":"22579","suppressedMessages":"22580","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22581","messages":"22582","suppressedMessages":"22583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22584","messages":"22585","suppressedMessages":"22586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22587","messages":"22588","suppressedMessages":"22589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22590","messages":"22591","suppressedMessages":"22592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22593","messages":"22594","suppressedMessages":"22595","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22596","messages":"22597","suppressedMessages":"22598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22599","messages":"22600","suppressedMessages":"22601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22602","messages":"22603","suppressedMessages":"22604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22605","messages":"22606","suppressedMessages":"22607","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22608","messages":"22609","suppressedMessages":"22610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22611","messages":"22612","suppressedMessages":"22613","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22614","messages":"22615","suppressedMessages":"22616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22617","messages":"22618","suppressedMessages":"22619","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22620","messages":"22621","suppressedMessages":"22622","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22623","messages":"22624","suppressedMessages":"22625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22626","messages":"22627","suppressedMessages":"22628","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22629","messages":"22630","suppressedMessages":"22631","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22632","messages":"22633","suppressedMessages":"22634","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22635","messages":"22636","suppressedMessages":"22637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22638","messages":"22639","suppressedMessages":"22640","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22641","messages":"22642","suppressedMessages":"22643","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22644","messages":"22645","suppressedMessages":"22646","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22647","messages":"22648","suppressedMessages":"22649","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22650","messages":"22651","suppressedMessages":"22652","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22653","messages":"22654","suppressedMessages":"22655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22656","messages":"22657","suppressedMessages":"22658","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22659","messages":"22660","suppressedMessages":"22661","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22662","messages":"22663","suppressedMessages":"22664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22665","messages":"22666","suppressedMessages":"22667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22668","messages":"22669","suppressedMessages":"22670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22671","messages":"22672","suppressedMessages":"22673","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22674","messages":"22675","suppressedMessages":"22676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22677","messages":"22678","suppressedMessages":"22679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22680","messages":"22681","suppressedMessages":"22682","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22683","messages":"22684","suppressedMessages":"22685","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22686","messages":"22687","suppressedMessages":"22688","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22689","messages":"22690","suppressedMessages":"22691","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22692","messages":"22693","suppressedMessages":"22694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22695","messages":"22696","suppressedMessages":"22697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22698","messages":"22699","suppressedMessages":"22700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22701","messages":"22702","suppressedMessages":"22703","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22704","messages":"22705","suppressedMessages":"22706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22707","messages":"22708","suppressedMessages":"22709","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22710","messages":"22711","suppressedMessages":"22712","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22713","messages":"22714","suppressedMessages":"22715","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22716","messages":"22717","suppressedMessages":"22718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22719","messages":"22720","suppressedMessages":"22721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22722","messages":"22723","suppressedMessages":"22724","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22725","messages":"22726","suppressedMessages":"22727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22728","messages":"22729","suppressedMessages":"22730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22731","messages":"22732","suppressedMessages":"22733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22734","messages":"22735","suppressedMessages":"22736","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22737","messages":"22738","suppressedMessages":"22739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22740","messages":"22741","suppressedMessages":"22742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22743","messages":"22744","suppressedMessages":"22745","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22746","messages":"22747","suppressedMessages":"22748","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22749","messages":"22750","suppressedMessages":"22751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22752","messages":"22753","suppressedMessages":"22754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22755","messages":"22756","suppressedMessages":"22757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22758","messages":"22759","suppressedMessages":"22760","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22761","messages":"22762","suppressedMessages":"22763","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22764","messages":"22765","suppressedMessages":"22766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22767","messages":"22768","suppressedMessages":"22769","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22770","messages":"22771","suppressedMessages":"22772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22773","messages":"22774","suppressedMessages":"22775","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22776","messages":"22777","suppressedMessages":"22778","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22779","messages":"22780","suppressedMessages":"22781","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22782","messages":"22783","suppressedMessages":"22784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22785","messages":"22786","suppressedMessages":"22787","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22788","messages":"22789","suppressedMessages":"22790","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22791","messages":"22792","suppressedMessages":"22793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22794","messages":"22795","suppressedMessages":"22796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22797","messages":"22798","suppressedMessages":"22799","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22800","messages":"22801","suppressedMessages":"22802","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22803","messages":"22804","suppressedMessages":"22805","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22806","messages":"22807","suppressedMessages":"22808","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22809","messages":"22810","suppressedMessages":"22811","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22812","messages":"22813","suppressedMessages":"22814","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22815","messages":"22816","suppressedMessages":"22817","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22818","messages":"22819","suppressedMessages":"22820","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22821","messages":"22822","suppressedMessages":"22823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22824","messages":"22825","suppressedMessages":"22826","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22827","messages":"22828","suppressedMessages":"22829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22830","messages":"22831","suppressedMessages":"22832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22833","messages":"22834","suppressedMessages":"22835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22836","messages":"22837","suppressedMessages":"22838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22839","messages":"22840","suppressedMessages":"22841","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22842","messages":"22843","suppressedMessages":"22844","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22845","messages":"22846","suppressedMessages":"22847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22848","messages":"22849","suppressedMessages":"22850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22851","messages":"22852","suppressedMessages":"22853","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22854","messages":"22855","suppressedMessages":"22856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22857","messages":"22858","suppressedMessages":"22859","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22860","messages":"22861","suppressedMessages":"22862","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22863","messages":"22864","suppressedMessages":"22865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22866","messages":"22867","suppressedMessages":"22868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22869","messages":"22870","suppressedMessages":"22871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22872","messages":"22873","suppressedMessages":"22874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22875","messages":"22876","suppressedMessages":"22877","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22878","messages":"22879","suppressedMessages":"22880","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22881","messages":"22882","suppressedMessages":"22883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22884","messages":"22885","suppressedMessages":"22886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22887","messages":"22888","suppressedMessages":"22889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22890","messages":"22891","suppressedMessages":"22892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22893","messages":"22894","suppressedMessages":"22895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22896","messages":"22897","suppressedMessages":"22898","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22899","messages":"22900","suppressedMessages":"22901","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22902","messages":"22903","suppressedMessages":"22904","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22905","messages":"22906","suppressedMessages":"22907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22908","messages":"22909","suppressedMessages":"22910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22911","messages":"22912","suppressedMessages":"22913","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22914","messages":"22915","suppressedMessages":"22916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22917","messages":"22918","suppressedMessages":"22919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22920","messages":"22921","suppressedMessages":"22922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22923","messages":"22924","suppressedMessages":"22925","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22926","messages":"22927","suppressedMessages":"22928","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22929","messages":"22930","suppressedMessages":"22931","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22932","messages":"22933","suppressedMessages":"22934","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22935","messages":"22936","suppressedMessages":"22937","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22938","messages":"22939","suppressedMessages":"22940","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22941","messages":"22942","suppressedMessages":"22943","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"22944","messages":"22945","suppressedMessages":"22946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22947","messages":"22948","suppressedMessages":"22949","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22950","messages":"22951","suppressedMessages":"22952","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22953","messages":"22954","suppressedMessages":"22955","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22956","messages":"22957","suppressedMessages":"22958","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22959","messages":"22960","suppressedMessages":"22961","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22962","messages":"22963","suppressedMessages":"22964","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22965","messages":"22966","suppressedMessages":"22967","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22968","messages":"22969","suppressedMessages":"22970","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22971","messages":"22972","suppressedMessages":"22973","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22974","messages":"22975","suppressedMessages":"22976","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22977","messages":"22978","suppressedMessages":"22979","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22980","messages":"22981","suppressedMessages":"22982","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22983","messages":"22984","suppressedMessages":"22985","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22986","messages":"22987","suppressedMessages":"22988","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22989","messages":"22990","suppressedMessages":"22991","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22992","messages":"22993","suppressedMessages":"22994","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22995","messages":"22996","suppressedMessages":"22997","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"22998","messages":"22999","suppressedMessages":"23000","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23001","messages":"23002","suppressedMessages":"23003","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23004","messages":"23005","suppressedMessages":"23006","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23007","messages":"23008","suppressedMessages":"23009","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23010","messages":"23011","suppressedMessages":"23012","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23013","messages":"23014","suppressedMessages":"23015","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23016","messages":"23017","suppressedMessages":"23018","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23019","messages":"23020","suppressedMessages":"23021","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23022","messages":"23023","suppressedMessages":"23024","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23025","messages":"23026","suppressedMessages":"23027","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23028","messages":"23029","suppressedMessages":"23030","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23031","messages":"23032","suppressedMessages":"23033","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23034","messages":"23035","suppressedMessages":"23036","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23037","messages":"23038","suppressedMessages":"23039","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23040","messages":"23041","suppressedMessages":"23042","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23043","messages":"23044","suppressedMessages":"23045","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23046","messages":"23047","suppressedMessages":"23048","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23049","messages":"23050","suppressedMessages":"23051","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23052","messages":"23053","suppressedMessages":"23054","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23055","messages":"23056","suppressedMessages":"23057","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23058","messages":"23059","suppressedMessages":"23060","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23061","messages":"23062","suppressedMessages":"23063","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23064","messages":"23065","suppressedMessages":"23066","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23067","messages":"23068","suppressedMessages":"23069","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23070","messages":"23071","suppressedMessages":"23072","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23073","messages":"23074","suppressedMessages":"23075","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23076","messages":"23077","suppressedMessages":"23078","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23079","messages":"23080","suppressedMessages":"23081","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23082","messages":"23083","suppressedMessages":"23084","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23085","messages":"23086","suppressedMessages":"23087","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23088","messages":"23089","suppressedMessages":"23090","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23091","messages":"23092","suppressedMessages":"23093","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23094","messages":"23095","suppressedMessages":"23096","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23097","messages":"23098","suppressedMessages":"23099","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23100","messages":"23101","suppressedMessages":"23102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23103","messages":"23104","suppressedMessages":"23105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23106","messages":"23107","suppressedMessages":"23108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23109","messages":"23110","suppressedMessages":"23111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23112","messages":"23113","suppressedMessages":"23114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23115","messages":"23116","suppressedMessages":"23117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23118","messages":"23119","suppressedMessages":"23120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23121","messages":"23122","suppressedMessages":"23123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23124","messages":"23125","suppressedMessages":"23126","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23127","messages":"23128","suppressedMessages":"23129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23130","messages":"23131","suppressedMessages":"23132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23133","messages":"23134","suppressedMessages":"23135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23136","messages":"23137","suppressedMessages":"23138","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23139","messages":"23140","suppressedMessages":"23141","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23142","messages":"23143","suppressedMessages":"23144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23145","messages":"23146","suppressedMessages":"23147","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23148","messages":"23149","suppressedMessages":"23150","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23151","messages":"23152","suppressedMessages":"23153","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23154","messages":"23155","suppressedMessages":"23156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23157","messages":"23158","suppressedMessages":"23159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23160","messages":"23161","suppressedMessages":"23162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23163","messages":"23164","suppressedMessages":"23165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23166","messages":"23167","suppressedMessages":"23168","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23169","messages":"23170","suppressedMessages":"23171","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23172","messages":"23173","suppressedMessages":"23174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23175","messages":"23176","suppressedMessages":"23177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23178","messages":"23179","suppressedMessages":"23180","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23181","messages":"23182","suppressedMessages":"23183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23184","messages":"23185","suppressedMessages":"23186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23187","messages":"23188","suppressedMessages":"23189","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23190","messages":"23191","suppressedMessages":"23192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23193","messages":"23194","suppressedMessages":"23195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23196","messages":"23197","suppressedMessages":"23198","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23199","messages":"23200","suppressedMessages":"23201","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23202","messages":"23203","suppressedMessages":"23204","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23205","messages":"23206","suppressedMessages":"23207","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23208","messages":"23209","suppressedMessages":"23210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23211","messages":"23212","suppressedMessages":"23213","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23214","messages":"23215","suppressedMessages":"23216","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23217","messages":"23218","suppressedMessages":"23219","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23220","messages":"23221","suppressedMessages":"23222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23223","messages":"23224","suppressedMessages":"23225","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23226","messages":"23227","suppressedMessages":"23228","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23229","messages":"23230","suppressedMessages":"23231","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23232","messages":"23233","suppressedMessages":"23234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23235","messages":"23236","suppressedMessages":"23237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23238","messages":"23239","suppressedMessages":"23240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23241","messages":"23242","suppressedMessages":"23243","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23244","messages":"23245","suppressedMessages":"23246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23247","messages":"23248","suppressedMessages":"23249","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23250","messages":"23251","suppressedMessages":"23252","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23253","messages":"23254","suppressedMessages":"23255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23256","messages":"23257","suppressedMessages":"23258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23259","messages":"23260","suppressedMessages":"23261","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23262","messages":"23263","suppressedMessages":"23264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23265","messages":"23266","suppressedMessages":"23267","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23268","messages":"23269","suppressedMessages":"23270","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23271","messages":"23272","suppressedMessages":"23273","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23274","messages":"23275","suppressedMessages":"23276","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23277","messages":"23278","suppressedMessages":"23279","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23280","messages":"23281","suppressedMessages":"23282","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23283","messages":"23284","suppressedMessages":"23285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23286","messages":"23287","suppressedMessages":"23288","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23289","messages":"23290","suppressedMessages":"23291","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23292","messages":"23293","suppressedMessages":"23294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23295","messages":"23296","suppressedMessages":"23297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23298","messages":"23299","suppressedMessages":"23300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23301","messages":"23302","suppressedMessages":"23303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23304","messages":"23305","suppressedMessages":"23306","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23307","messages":"23308","suppressedMessages":"23309","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23310","messages":"23311","suppressedMessages":"23312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23313","messages":"23314","suppressedMessages":"23315","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23316","messages":"23317","suppressedMessages":"23318","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23319","messages":"23320","suppressedMessages":"23321","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23322","messages":"23323","suppressedMessages":"23324","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23325","messages":"23326","suppressedMessages":"23327","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23328","messages":"23329","suppressedMessages":"23330","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23331","messages":"23332","suppressedMessages":"23333","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23334","messages":"23335","suppressedMessages":"23336","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23337","messages":"23338","suppressedMessages":"23339","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23340","messages":"23341","suppressedMessages":"23342","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23343","messages":"23344","suppressedMessages":"23345","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23346","messages":"23347","suppressedMessages":"23348","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23349","messages":"23350","suppressedMessages":"23351","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23352","messages":"23353","suppressedMessages":"23354","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23355","messages":"23356","suppressedMessages":"23357","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23358","messages":"23359","suppressedMessages":"23360","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23361","messages":"23362","suppressedMessages":"23363","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23364","messages":"23365","suppressedMessages":"23366","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23367","messages":"23368","suppressedMessages":"23369","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23370","messages":"23371","suppressedMessages":"23372","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23373","messages":"23374","suppressedMessages":"23375","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23376","messages":"23377","suppressedMessages":"23378","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23379","messages":"23380","suppressedMessages":"23381","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23382","messages":"23383","suppressedMessages":"23384","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23385","messages":"23386","suppressedMessages":"23387","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23388","messages":"23389","suppressedMessages":"23390","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23391","messages":"23392","suppressedMessages":"23393","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23394","messages":"23395","suppressedMessages":"23396","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23397","messages":"23398","suppressedMessages":"23399","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23400","messages":"23401","suppressedMessages":"23402","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23403","messages":"23404","suppressedMessages":"23405","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23406","messages":"23407","suppressedMessages":"23408","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23409","messages":"23410","suppressedMessages":"23411","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23412","messages":"23413","suppressedMessages":"23414","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23415","messages":"23416","suppressedMessages":"23417","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23418","messages":"23419","suppressedMessages":"23420","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23421","messages":"23422","suppressedMessages":"23423","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23424","messages":"23425","suppressedMessages":"23426","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23427","messages":"23428","suppressedMessages":"23429","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23430","messages":"23431","suppressedMessages":"23432","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23433","messages":"23434","suppressedMessages":"23435","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23436","messages":"23437","suppressedMessages":"23438","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23439","messages":"23440","suppressedMessages":"23441","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23442","messages":"23443","suppressedMessages":"23444","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23445","messages":"23446","suppressedMessages":"23447","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23448","messages":"23449","suppressedMessages":"23450","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23451","messages":"23452","suppressedMessages":"23453","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23454","messages":"23455","suppressedMessages":"23456","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23457","messages":"23458","suppressedMessages":"23459","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23460","messages":"23461","suppressedMessages":"23462","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23463","messages":"23464","suppressedMessages":"23465","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23466","messages":"23467","suppressedMessages":"23468","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23469","messages":"23470","suppressedMessages":"23471","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23472","messages":"23473","suppressedMessages":"23474","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23475","messages":"23476","suppressedMessages":"23477","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23478","messages":"23479","suppressedMessages":"23480","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23481","messages":"23482","suppressedMessages":"23483","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23484","messages":"23485","suppressedMessages":"23486","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23487","messages":"23488","suppressedMessages":"23489","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23490","messages":"23491","suppressedMessages":"23492","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23493","messages":"23494","suppressedMessages":"23495","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23496","messages":"23497","suppressedMessages":"23498","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23499","messages":"23500","suppressedMessages":"23501","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23502","messages":"23503","suppressedMessages":"23504","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23505","messages":"23506","suppressedMessages":"23507","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23508","messages":"23509","suppressedMessages":"23510","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23511","messages":"23512","suppressedMessages":"23513","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23514","messages":"23515","suppressedMessages":"23516","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23517","messages":"23518","suppressedMessages":"23519","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23520","messages":"23521","suppressedMessages":"23522","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23523","messages":"23524","suppressedMessages":"23525","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23526","messages":"23527","suppressedMessages":"23528","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23529","messages":"23530","suppressedMessages":"23531","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23532","messages":"23533","suppressedMessages":"23534","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23535","messages":"23536","suppressedMessages":"23537","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23538","messages":"23539","suppressedMessages":"23540","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23541","messages":"23542","suppressedMessages":"23543","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23544","messages":"23545","suppressedMessages":"23546","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23547","messages":"23548","suppressedMessages":"23549","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23550","messages":"23551","suppressedMessages":"23552","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23553","messages":"23554","suppressedMessages":"23555","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23556","messages":"23557","suppressedMessages":"23558","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23559","messages":"23560","suppressedMessages":"23561","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23562","messages":"23563","suppressedMessages":"23564","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23565","messages":"23566","suppressedMessages":"23567","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23568","messages":"23569","suppressedMessages":"23570","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23571","messages":"23572","suppressedMessages":"23573","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23574","messages":"23575","suppressedMessages":"23576","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23577","messages":"23578","suppressedMessages":"23579","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23580","messages":"23581","suppressedMessages":"23582","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23583","messages":"23584","suppressedMessages":"23585","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23586","messages":"23587","suppressedMessages":"23588","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23589","messages":"23590","suppressedMessages":"23591","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23592","messages":"23593","suppressedMessages":"23594","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23595","messages":"23596","suppressedMessages":"23597","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23598","messages":"23599","suppressedMessages":"23600","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23601","messages":"23602","suppressedMessages":"23603","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23604","messages":"23605","suppressedMessages":"23606","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23607","messages":"23608","suppressedMessages":"23609","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23610","messages":"23611","suppressedMessages":"23612","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23613","messages":"23614","suppressedMessages":"23615","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23616","messages":"23617","suppressedMessages":"23618","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23619","messages":"23620","suppressedMessages":"23621","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23622","messages":"23623","suppressedMessages":"23624","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23625","messages":"23626","suppressedMessages":"23627","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23628","messages":"23629","suppressedMessages":"23630","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23631","messages":"23632","suppressedMessages":"23633","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23634","messages":"23635","suppressedMessages":"23636","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23637","messages":"23638","suppressedMessages":"23639","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23640","messages":"23641","suppressedMessages":"23642","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23643","messages":"23644","suppressedMessages":"23645","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23646","messages":"23647","suppressedMessages":"23648","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23649","messages":"23650","suppressedMessages":"23651","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23652","messages":"23653","suppressedMessages":"23654","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23655","messages":"23656","suppressedMessages":"23657","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23658","messages":"23659","suppressedMessages":"23660","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23661","messages":"23662","suppressedMessages":"23663","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23664","messages":"23665","suppressedMessages":"23666","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23667","messages":"23668","suppressedMessages":"23669","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23670","messages":"23671","suppressedMessages":"23672","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23673","messages":"23674","suppressedMessages":"23675","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23676","messages":"23677","suppressedMessages":"23678","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23679","messages":"23680","suppressedMessages":"23681","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23682","messages":"23683","suppressedMessages":"23684","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23685","messages":"23686","suppressedMessages":"23687","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23688","messages":"23689","suppressedMessages":"23690","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23691","messages":"23692","suppressedMessages":"23693","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23694","messages":"23695","suppressedMessages":"23696","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23697","messages":"23698","suppressedMessages":"23699","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23700","messages":"23701","suppressedMessages":"23702","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23703","messages":"23704","suppressedMessages":"23705","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23706","messages":"23707","suppressedMessages":"23708","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23709","messages":"23710","suppressedMessages":"23711","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23712","messages":"23713","suppressedMessages":"23714","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23715","messages":"23716","suppressedMessages":"23717","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23718","messages":"23719","suppressedMessages":"23720","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23721","messages":"23722","suppressedMessages":"23723","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23724","messages":"23725","suppressedMessages":"23726","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23727","messages":"23728","suppressedMessages":"23729","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23730","messages":"23731","suppressedMessages":"23732","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23733","messages":"23734","suppressedMessages":"23735","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23736","messages":"23737","suppressedMessages":"23738","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23739","messages":"23740","suppressedMessages":"23741","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23742","messages":"23743","suppressedMessages":"23744","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23745","messages":"23746","suppressedMessages":"23747","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23748","messages":"23749","suppressedMessages":"23750","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23751","messages":"23752","suppressedMessages":"23753","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23754","messages":"23755","suppressedMessages":"23756","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23757","messages":"23758","suppressedMessages":"23759","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23760","messages":"23761","suppressedMessages":"23762","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23763","messages":"23764","suppressedMessages":"23765","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23766","messages":"23767","suppressedMessages":"23768","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23769","messages":"23770","suppressedMessages":"23771","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23772","messages":"23773","suppressedMessages":"23774","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23775","messages":"23776","suppressedMessages":"23777","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23778","messages":"23779","suppressedMessages":"23780","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23781","messages":"23782","suppressedMessages":"23783","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23784","messages":"23785","suppressedMessages":"23786","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23787","messages":"23788","suppressedMessages":"23789","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23790","messages":"23791","suppressedMessages":"23792","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23793","messages":"23794","suppressedMessages":"23795","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23796","messages":"23797","suppressedMessages":"23798","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23799","messages":"23800","suppressedMessages":"23801","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23802","messages":"23803","suppressedMessages":"23804","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23805","messages":"23806","suppressedMessages":"23807","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23808","messages":"23809","suppressedMessages":"23810","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23811","messages":"23812","suppressedMessages":"23813","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23814","messages":"23815","suppressedMessages":"23816","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23817","messages":"23818","suppressedMessages":"23819","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23820","messages":"23821","suppressedMessages":"23822","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23823","messages":"23824","suppressedMessages":"23825","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23826","messages":"23827","suppressedMessages":"23828","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23829","messages":"23830","suppressedMessages":"23831","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23832","messages":"23833","suppressedMessages":"23834","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23835","messages":"23836","suppressedMessages":"23837","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23838","messages":"23839","suppressedMessages":"23840","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23841","messages":"23842","suppressedMessages":"23843","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23844","messages":"23845","suppressedMessages":"23846","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23847","messages":"23848","suppressedMessages":"23849","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23850","messages":"23851","suppressedMessages":"23852","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23853","messages":"23854","suppressedMessages":"23855","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23856","messages":"23857","suppressedMessages":"23858","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23859","messages":"23860","suppressedMessages":"23861","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23862","messages":"23863","suppressedMessages":"23864","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23865","messages":"23866","suppressedMessages":"23867","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23868","messages":"23869","suppressedMessages":"23870","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23871","messages":"23872","suppressedMessages":"23873","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23874","messages":"23875","suppressedMessages":"23876","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23877","messages":"23878","suppressedMessages":"23879","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23880","messages":"23881","suppressedMessages":"23882","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23883","messages":"23884","suppressedMessages":"23885","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23886","messages":"23887","suppressedMessages":"23888","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23889","messages":"23890","suppressedMessages":"23891","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23892","messages":"23893","suppressedMessages":"23894","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23895","messages":"23896","suppressedMessages":"23897","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23898","messages":"23899","suppressedMessages":"23900","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23901","messages":"23902","suppressedMessages":"23903","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23904","messages":"23905","suppressedMessages":"23906","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23907","messages":"23908","suppressedMessages":"23909","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23910","messages":"23911","suppressedMessages":"23912","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23913","messages":"23914","suppressedMessages":"23915","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23916","messages":"23917","suppressedMessages":"23918","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23919","messages":"23920","suppressedMessages":"23921","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23922","messages":"23923","suppressedMessages":"23924","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23925","messages":"23926","suppressedMessages":"23927","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23928","messages":"23929","suppressedMessages":"23930","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23931","messages":"23932","suppressedMessages":"23933","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23934","messages":"23935","suppressedMessages":"23936","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23937","messages":"23938","suppressedMessages":"23939","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23940","messages":"23941","suppressedMessages":"23942","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23943","messages":"23944","suppressedMessages":"23945","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23946","messages":"23947","suppressedMessages":"23948","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23949","messages":"23950","suppressedMessages":"23951","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23952","messages":"23953","suppressedMessages":"23954","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23955","messages":"23956","suppressedMessages":"23957","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23958","messages":"23959","suppressedMessages":"23960","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23961","messages":"23962","suppressedMessages":"23963","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"23964","messages":"23965","suppressedMessages":"23966","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23967","messages":"23968","suppressedMessages":"23969","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23970","messages":"23971","suppressedMessages":"23972","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23973","messages":"23974","suppressedMessages":"23975","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23976","messages":"23977","suppressedMessages":"23978","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23979","messages":"23980","suppressedMessages":"23981","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23982","messages":"23983","suppressedMessages":"23984","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23985","messages":"23986","suppressedMessages":"23987","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23988","messages":"23989","suppressedMessages":"23990","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23991","messages":"23992","suppressedMessages":"23993","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23994","messages":"23995","suppressedMessages":"23996","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"23997","messages":"23998","suppressedMessages":"23999","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24000","messages":"24001","suppressedMessages":"24002","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24003","messages":"24004","suppressedMessages":"24005","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24006","messages":"24007","suppressedMessages":"24008","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24009","messages":"24010","suppressedMessages":"24011","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24012","messages":"24013","suppressedMessages":"24014","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24015","messages":"24016","suppressedMessages":"24017","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24018","messages":"24019","suppressedMessages":"24020","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24021","messages":"24022","suppressedMessages":"24023","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24024","messages":"24025","suppressedMessages":"24026","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24027","messages":"24028","suppressedMessages":"24029","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24030","messages":"24031","suppressedMessages":"24032","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24033","messages":"24034","suppressedMessages":"24035","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24036","messages":"24037","suppressedMessages":"24038","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24039","messages":"24040","suppressedMessages":"24041","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24042","messages":"24043","suppressedMessages":"24044","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24045","messages":"24046","suppressedMessages":"24047","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24048","messages":"24049","suppressedMessages":"24050","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24051","messages":"24052","suppressedMessages":"24053","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24054","messages":"24055","suppressedMessages":"24056","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24057","messages":"24058","suppressedMessages":"24059","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24060","messages":"24061","suppressedMessages":"24062","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24063","messages":"24064","suppressedMessages":"24065","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24066","messages":"24067","suppressedMessages":"24068","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24069","messages":"24070","suppressedMessages":"24071","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24072","messages":"24073","suppressedMessages":"24074","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24075","messages":"24076","suppressedMessages":"24077","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24078","messages":"24079","suppressedMessages":"24080","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24081","messages":"24082","suppressedMessages":"24083","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24084","messages":"24085","suppressedMessages":"24086","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24087","messages":"24088","suppressedMessages":"24089","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24090","messages":"24091","suppressedMessages":"24092","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24093","messages":"24094","suppressedMessages":"24095","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24096","messages":"24097","suppressedMessages":"24098","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24099","messages":"24100","suppressedMessages":"24101","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24102","messages":"24103","suppressedMessages":"24104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24105","messages":"24106","suppressedMessages":"24107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24108","messages":"24109","suppressedMessages":"24110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24111","messages":"24112","suppressedMessages":"24113","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24114","messages":"24115","suppressedMessages":"24116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24117","messages":"24118","suppressedMessages":"24119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24120","messages":"24121","suppressedMessages":"24122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24123","messages":"24124","suppressedMessages":"24125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24126","messages":"24127","suppressedMessages":"24128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24129","messages":"24130","suppressedMessages":"24131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24132","messages":"24133","suppressedMessages":"24134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24135","messages":"24136","suppressedMessages":"24137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24138","messages":"24139","suppressedMessages":"24140","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24141","messages":"24142","suppressedMessages":"24143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24144","messages":"24145","suppressedMessages":"24146","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24147","messages":"24148","suppressedMessages":"24149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24150","messages":"24151","suppressedMessages":"24152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24153","messages":"24154","suppressedMessages":"24155","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24156","messages":"24157","suppressedMessages":"24158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24159","messages":"24160","suppressedMessages":"24161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24162","messages":"24163","suppressedMessages":"24164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24165","messages":"24166","suppressedMessages":"24167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24168","messages":"24169","suppressedMessages":"24170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24171","messages":"24172","suppressedMessages":"24173","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24174","messages":"24175","suppressedMessages":"24176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24177","messages":"24178","suppressedMessages":"24179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24180","messages":"24181","suppressedMessages":"24182","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24183","messages":"24184","suppressedMessages":"24185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24186","messages":"24187","suppressedMessages":"24188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24189","messages":"24190","suppressedMessages":"24191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24192","messages":"24193","suppressedMessages":"24194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24195","messages":"24196","suppressedMessages":"24197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24198","messages":"24199","suppressedMessages":"24200","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24201","messages":"24202","suppressedMessages":"24203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24204","messages":"24205","suppressedMessages":"24206","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24207","messages":"24208","suppressedMessages":"24209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24210","messages":"24211","suppressedMessages":"24212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24213","messages":"24214","suppressedMessages":"24215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24216","messages":"24217","suppressedMessages":"24218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24219","messages":"24220","suppressedMessages":"24221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24222","messages":"24223","suppressedMessages":"24224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24225","messages":"24226","suppressedMessages":"24227","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24228","messages":"24229","suppressedMessages":"24230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24231","messages":"24232","suppressedMessages":"24233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24234","messages":"24235","suppressedMessages":"24236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24237","messages":"24238","suppressedMessages":"24239","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24240","messages":"24241","suppressedMessages":"24242","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24243","messages":"24244","suppressedMessages":"24245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24246","messages":"24247","suppressedMessages":"24248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24249","messages":"24250","suppressedMessages":"24251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24252","messages":"24253","suppressedMessages":"24254","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24255","messages":"24256","suppressedMessages":"24257","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24258","messages":"24259","suppressedMessages":"24260","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24261","messages":"24262","suppressedMessages":"24263","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24264","messages":"24265","suppressedMessages":"24266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24267","messages":"24268","suppressedMessages":"24269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24270","messages":"24271","suppressedMessages":"24272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24273","messages":"24274","suppressedMessages":"24275","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24276","messages":"24277","suppressedMessages":"24278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24279","messages":"24280","suppressedMessages":"24281","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24282","messages":"24283","suppressedMessages":"24284","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24285","messages":"24286","suppressedMessages":"24287","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24288","messages":"24289","suppressedMessages":"24290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24291","messages":"24292","suppressedMessages":"24293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24294","messages":"24295","suppressedMessages":"24296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24297","messages":"24298","suppressedMessages":"24299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24300","messages":"24301","suppressedMessages":"24302","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24303","messages":"24304","suppressedMessages":"24305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24306","messages":"24307","suppressedMessages":"24308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24309","messages":"24310","suppressedMessages":"24311","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24312","messages":"24313","suppressedMessages":"24314","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24315","messages":"24316","suppressedMessages":"24317","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24318","messages":"24319","suppressedMessages":"24320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24321","messages":"24322","suppressedMessages":"24323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24324","messages":"24325","suppressedMessages":"24326","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24327","messages":"24328","suppressedMessages":"24329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24330","messages":"24331","suppressedMessages":"24332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24333","messages":"24334","suppressedMessages":"24335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24336","messages":"24337","suppressedMessages":"24338","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24339","messages":"24340","suppressedMessages":"24341","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24342","messages":"24343","suppressedMessages":"24344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24345","messages":"24346","suppressedMessages":"24347","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24348","messages":"24349","suppressedMessages":"24350","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24351","messages":"24352","suppressedMessages":"24353","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24354","messages":"24355","suppressedMessages":"24356","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24357","messages":"24358","suppressedMessages":"24359","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24360","messages":"24361","suppressedMessages":"24362","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24363","messages":"24364","suppressedMessages":"24365","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24366","messages":"24367","suppressedMessages":"24368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24369","messages":"24370","suppressedMessages":"24371","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24372","messages":"24373","suppressedMessages":"24374","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24375","messages":"24376","suppressedMessages":"24377","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24378","messages":"24379","suppressedMessages":"24380","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24381","messages":"24382","suppressedMessages":"24383","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24384","messages":"24385","suppressedMessages":"24386","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24387","messages":"24388","suppressedMessages":"24389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24390","messages":"24391","suppressedMessages":"24392","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24393","messages":"24394","suppressedMessages":"24395","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24396","messages":"24397","suppressedMessages":"24398","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24399","messages":"24400","suppressedMessages":"24401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24402","messages":"24403","suppressedMessages":"24404","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24405","messages":"24406","suppressedMessages":"24407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24408","messages":"24409","suppressedMessages":"24410","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24411","messages":"24412","suppressedMessages":"24413","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24414","messages":"24415","suppressedMessages":"24416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24417","messages":"24418","suppressedMessages":"24419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24420","messages":"24421","suppressedMessages":"24422","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24423","messages":"24424","suppressedMessages":"24425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24426","messages":"24427","suppressedMessages":"24428","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24429","messages":"24430","suppressedMessages":"24431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24432","messages":"24433","suppressedMessages":"24434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24435","messages":"24436","suppressedMessages":"24437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24438","messages":"24439","suppressedMessages":"24440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24441","messages":"24442","suppressedMessages":"24443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24444","messages":"24445","suppressedMessages":"24446","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24447","messages":"24448","suppressedMessages":"24449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24450","messages":"24451","suppressedMessages":"24452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24453","messages":"24454","suppressedMessages":"24455","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24456","messages":"24457","suppressedMessages":"24458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24459","messages":"24460","suppressedMessages":"24461","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24462","messages":"24463","suppressedMessages":"24464","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24465","messages":"24466","suppressedMessages":"24467","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24468","messages":"24469","suppressedMessages":"24470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24471","messages":"24472","suppressedMessages":"24473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24474","messages":"24475","suppressedMessages":"24476","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24477","messages":"24478","suppressedMessages":"24479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24480","messages":"24481","suppressedMessages":"24482","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24483","messages":"24484","suppressedMessages":"24485","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24486","messages":"24487","suppressedMessages":"24488","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24489","messages":"24490","suppressedMessages":"24491","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24492","messages":"24493","suppressedMessages":"24494","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24495","messages":"24496","suppressedMessages":"24497","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24498","messages":"24499","suppressedMessages":"24500","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24501","messages":"24502","suppressedMessages":"24503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24504","messages":"24505","suppressedMessages":"24506","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24507","messages":"24508","suppressedMessages":"24509","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24510","messages":"24511","suppressedMessages":"24512","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24513","messages":"24514","suppressedMessages":"24515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24516","messages":"24517","suppressedMessages":"24518","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24519","messages":"24520","suppressedMessages":"24521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24522","messages":"24523","suppressedMessages":"24524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24525","messages":"24526","suppressedMessages":"24527","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24528","messages":"24529","suppressedMessages":"24530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24531","messages":"24532","suppressedMessages":"24533","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24534","messages":"24535","suppressedMessages":"24536","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24537","messages":"24538","suppressedMessages":"24539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24540","messages":"24541","suppressedMessages":"24542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24543","messages":"24544","suppressedMessages":"24545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24546","messages":"24547","suppressedMessages":"24548","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24549","messages":"24550","suppressedMessages":"24551","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24552","messages":"24553","suppressedMessages":"24554","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24555","messages":"24556","suppressedMessages":"24557","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24558","messages":"24559","suppressedMessages":"24560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24561","messages":"24562","suppressedMessages":"24563","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24564","messages":"24565","suppressedMessages":"24566","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24567","messages":"24568","suppressedMessages":"24569","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24570","messages":"24571","suppressedMessages":"24572","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24573","messages":"24574","suppressedMessages":"24575","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24576","messages":"24577","suppressedMessages":"24578","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24579","messages":"24580","suppressedMessages":"24581","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24582","messages":"24583","suppressedMessages":"24584","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24585","messages":"24586","suppressedMessages":"24587","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24588","messages":"24589","suppressedMessages":"24590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24591","messages":"24592","suppressedMessages":"24593","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24594","messages":"24595","suppressedMessages":"24596","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24597","messages":"24598","suppressedMessages":"24599","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24600","messages":"24601","suppressedMessages":"24602","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24603","messages":"24604","suppressedMessages":"24605","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24606","messages":"24607","suppressedMessages":"24608","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24609","messages":"24610","suppressedMessages":"24611","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24612","messages":"24613","suppressedMessages":"24614","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24615","messages":"24616","suppressedMessages":"24617","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24618","messages":"24619","suppressedMessages":"24620","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24621","messages":"24622","suppressedMessages":"24623","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24624","messages":"24625","suppressedMessages":"24626","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24627","messages":"24628","suppressedMessages":"24629","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24630","messages":"24631","suppressedMessages":"24632","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24633","messages":"24634","suppressedMessages":"24635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24636","messages":"24637","suppressedMessages":"24638","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24639","messages":"24640","suppressedMessages":"24641","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24642","messages":"24643","suppressedMessages":"24644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24645","messages":"24646","suppressedMessages":"24647","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24648","messages":"24649","suppressedMessages":"24650","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24651","messages":"24652","suppressedMessages":"24653","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24654","messages":"24655","suppressedMessages":"24656","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24657","messages":"24658","suppressedMessages":"24659","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24660","messages":"24661","suppressedMessages":"24662","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24663","messages":"24664","suppressedMessages":"24665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24666","messages":"24667","suppressedMessages":"24668","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24669","messages":"24670","suppressedMessages":"24671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24672","messages":"24673","suppressedMessages":"24674","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24675","messages":"24676","suppressedMessages":"24677","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24678","messages":"24679","suppressedMessages":"24680","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24681","messages":"24682","suppressedMessages":"24683","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24684","messages":"24685","suppressedMessages":"24686","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24687","messages":"24688","suppressedMessages":"24689","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24690","messages":"24691","suppressedMessages":"24692","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24693","messages":"24694","suppressedMessages":"24695","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24696","messages":"24697","suppressedMessages":"24698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24699","messages":"24700","suppressedMessages":"24701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24702","messages":"24703","suppressedMessages":"24704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24705","messages":"24706","suppressedMessages":"24707","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24708","messages":"24709","suppressedMessages":"24710","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24711","messages":"24712","suppressedMessages":"24713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24714","messages":"24715","suppressedMessages":"24716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24717","messages":"24718","suppressedMessages":"24719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24720","messages":"24721","suppressedMessages":"24722","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24723","messages":"24724","suppressedMessages":"24725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24726","messages":"24727","suppressedMessages":"24728","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24729","messages":"24730","suppressedMessages":"24731","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24732","messages":"24733","suppressedMessages":"24734","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24735","messages":"24736","suppressedMessages":"24737","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24738","messages":"24739","suppressedMessages":"24740","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24741","messages":"24742","suppressedMessages":"24743","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24744","messages":"24745","suppressedMessages":"24746","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24747","messages":"24748","suppressedMessages":"24749","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24750","messages":"24751","suppressedMessages":"24752","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24753","messages":"24754","suppressedMessages":"24755","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24756","messages":"24757","suppressedMessages":"24758","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24759","messages":"24760","suppressedMessages":"24761","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24762","messages":"24763","suppressedMessages":"24764","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24765","messages":"24766","suppressedMessages":"24767","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24768","messages":"24769","suppressedMessages":"24770","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24771","messages":"24772","suppressedMessages":"24773","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24774","messages":"24775","suppressedMessages":"24776","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24777","messages":"24778","suppressedMessages":"24779","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24780","messages":"24781","suppressedMessages":"24782","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24783","messages":"24784","suppressedMessages":"24785","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24786","messages":"24787","suppressedMessages":"24788","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24789","messages":"24790","suppressedMessages":"24791","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24792","messages":"24793","suppressedMessages":"24794","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24795","messages":"24796","suppressedMessages":"24797","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24798","messages":"24799","suppressedMessages":"24800","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24801","messages":"24802","suppressedMessages":"24803","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24804","messages":"24805","suppressedMessages":"24806","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24807","messages":"24808","suppressedMessages":"24809","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24810","messages":"24811","suppressedMessages":"24812","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24813","messages":"24814","suppressedMessages":"24815","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24816","messages":"24817","suppressedMessages":"24818","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24819","messages":"24820","suppressedMessages":"24821","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"11lzzz9",{"filePath":"24822","messages":"24823","suppressedMessages":"24824","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24825","messages":"24826","suppressedMessages":"24827","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24828","messages":"24829","suppressedMessages":"24830","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24831","messages":"24832","suppressedMessages":"24833","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24834","messages":"24835","suppressedMessages":"24836","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24837","messages":"24838","suppressedMessages":"24839","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24840","messages":"24841","suppressedMessages":"24842","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24843","messages":"24844","suppressedMessages":"24845","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24846","messages":"24847","suppressedMessages":"24848","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24849","messages":"24850","suppressedMessages":"24851","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24852","messages":"24853","suppressedMessages":"24854","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24855","messages":"24856","suppressedMessages":"24857","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24858","messages":"24859","suppressedMessages":"24860","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24861","messages":"24862","suppressedMessages":"24863","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24864","messages":"24865","suppressedMessages":"24866","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24867","messages":"24868","suppressedMessages":"24869","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24870","messages":"24871","suppressedMessages":"24872","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24873","messages":"24874","suppressedMessages":"24875","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24876","messages":"24877","suppressedMessages":"24878","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24879","messages":"24880","suppressedMessages":"24881","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24882","messages":"24883","suppressedMessages":"24884","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24885","messages":"24886","suppressedMessages":"24887","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24888","messages":"24889","suppressedMessages":"24890","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24891","messages":"24892","suppressedMessages":"24893","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24894","messages":"24895","suppressedMessages":"24896","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24897","messages":"24898","suppressedMessages":"24899","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24900","messages":"24901","suppressedMessages":"24902","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24903","messages":"24904","suppressedMessages":"24905","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24906","messages":"24907","suppressedMessages":"24908","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24909","messages":"24910","suppressedMessages":"24911","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24912","messages":"24913","suppressedMessages":"24914","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24915","messages":"24916","suppressedMessages":"24917","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24918","messages":"24919","suppressedMessages":"24920","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24921","messages":"24922","suppressedMessages":"24923","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24924","messages":"24925","suppressedMessages":"24926","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24927","messages":"24928","suppressedMessages":"24929","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24930","messages":"24931","suppressedMessages":"24932","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24933","messages":"24934","suppressedMessages":"24935","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24936","messages":"24937","suppressedMessages":"24938","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24939","messages":"24940","suppressedMessages":"24941","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24942","messages":"24943","suppressedMessages":"24944","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24945","messages":"24946","suppressedMessages":"24947","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24948","messages":"24949","suppressedMessages":"24950","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24951","messages":"24952","suppressedMessages":"24953","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24954","messages":"24955","suppressedMessages":"24956","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24957","messages":"24958","suppressedMessages":"24959","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24960","messages":"24961","suppressedMessages":"24962","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24963","messages":"24964","suppressedMessages":"24965","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24966","messages":"24967","suppressedMessages":"24968","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24969","messages":"24970","suppressedMessages":"24971","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24972","messages":"24973","suppressedMessages":"24974","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24975","messages":"24976","suppressedMessages":"24977","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24978","messages":"24979","suppressedMessages":"24980","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24981","messages":"24982","suppressedMessages":"24983","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24984","messages":"24985","suppressedMessages":"24986","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24987","messages":"24988","suppressedMessages":"24989","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24990","messages":"24991","suppressedMessages":"24992","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"24993","messages":"24994","suppressedMessages":"24995","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24996","messages":"24997","suppressedMessages":"24998","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"24999","messages":"25000","suppressedMessages":"25001","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25002","messages":"25003","suppressedMessages":"25004","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25005","messages":"25006","suppressedMessages":"25007","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25008","messages":"25009","suppressedMessages":"25010","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25011","messages":"25012","suppressedMessages":"25013","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25014","messages":"25015","suppressedMessages":"25016","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25017","messages":"25018","suppressedMessages":"25019","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25020","messages":"25021","suppressedMessages":"25022","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25023","messages":"25024","suppressedMessages":"25025","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25026","messages":"25027","suppressedMessages":"25028","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25029","messages":"25030","suppressedMessages":"25031","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25032","messages":"25033","suppressedMessages":"25034","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25035","messages":"25036","suppressedMessages":"25037","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25038","messages":"25039","suppressedMessages":"25040","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25041","messages":"25042","suppressedMessages":"25043","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25044","messages":"25045","suppressedMessages":"25046","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25047","messages":"25048","suppressedMessages":"25049","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25050","messages":"25051","suppressedMessages":"25052","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25053","messages":"25054","suppressedMessages":"25055","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25056","messages":"25057","suppressedMessages":"25058","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25059","messages":"25060","suppressedMessages":"25061","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25062","messages":"25063","suppressedMessages":"25064","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25065","messages":"25066","suppressedMessages":"25067","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25068","messages":"25069","suppressedMessages":"25070","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25071","messages":"25072","suppressedMessages":"25073","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25074","messages":"25075","suppressedMessages":"25076","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25077","messages":"25078","suppressedMessages":"25079","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25080","messages":"25081","suppressedMessages":"25082","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25083","messages":"25084","suppressedMessages":"25085","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25086","messages":"25087","suppressedMessages":"25088","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25089","messages":"25090","suppressedMessages":"25091","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25092","messages":"25093","suppressedMessages":"25094","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25095","messages":"25096","suppressedMessages":"25097","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25098","messages":"25099","suppressedMessages":"25100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25101","messages":"25102","suppressedMessages":"25103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25104","messages":"25105","suppressedMessages":"25106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25107","messages":"25108","suppressedMessages":"25109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25110","messages":"25111","suppressedMessages":"25112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25113","messages":"25114","suppressedMessages":"25115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25116","messages":"25117","suppressedMessages":"25118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25119","messages":"25120","suppressedMessages":"25121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25122","messages":"25123","suppressedMessages":"25124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25125","messages":"25126","suppressedMessages":"25127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25128","messages":"25129","suppressedMessages":"25130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25131","messages":"25132","suppressedMessages":"25133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25134","messages":"25135","suppressedMessages":"25136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25137","messages":"25138","suppressedMessages":"25139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25140","messages":"25141","suppressedMessages":"25142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25143","messages":"25144","suppressedMessages":"25145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25146","messages":"25147","suppressedMessages":"25148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25149","messages":"25150","suppressedMessages":"25151","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25152","messages":"25153","suppressedMessages":"25154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25155","messages":"25156","suppressedMessages":"25157","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25158","messages":"25159","suppressedMessages":"25160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25161","messages":"25162","suppressedMessages":"25163","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25164","messages":"25165","suppressedMessages":"25166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25167","messages":"25168","suppressedMessages":"25169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25170","messages":"25171","suppressedMessages":"25172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25173","messages":"25174","suppressedMessages":"25175","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25176","messages":"25177","suppressedMessages":"25178","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25179","messages":"25180","suppressedMessages":"25181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25182","messages":"25183","suppressedMessages":"25184","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25185","messages":"25186","suppressedMessages":"25187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25188","messages":"25189","suppressedMessages":"25190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25191","messages":"25192","suppressedMessages":"25193","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25194","messages":"25195","suppressedMessages":"25196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25197","messages":"25198","suppressedMessages":"25199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25200","messages":"25201","suppressedMessages":"25202","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25203","messages":"25204","suppressedMessages":"25205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25206","messages":"25207","suppressedMessages":"25208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25209","messages":"25210","suppressedMessages":"25211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25212","messages":"25213","suppressedMessages":"25214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25215","messages":"25216","suppressedMessages":"25217","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25218","messages":"25219","suppressedMessages":"25220","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25221","messages":"25222","suppressedMessages":"25223","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25224","messages":"25225","suppressedMessages":"25226","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25227","messages":"25228","suppressedMessages":"25229","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25230","messages":"25231","suppressedMessages":"25232","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25233","messages":"25234","suppressedMessages":"25235","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25236","messages":"25237","suppressedMessages":"25238","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25239","messages":"25240","suppressedMessages":"25241","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25242","messages":"25243","suppressedMessages":"25244","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25245","messages":"25246","suppressedMessages":"25247","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25248","messages":"25249","suppressedMessages":"25250","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25251","messages":"25252","suppressedMessages":"25253","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1h4i9bm",{"filePath":"25254","messages":"25255","suppressedMessages":"25256","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25257","messages":"25258","suppressedMessages":"25259","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25260","messages":"25261","suppressedMessages":"25262","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25263","messages":"25264","suppressedMessages":"25265","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25266","messages":"25267","suppressedMessages":"25268","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25269","messages":"25270","suppressedMessages":"25271","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25272","messages":"25273","suppressedMessages":"25274","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25275","messages":"25276","suppressedMessages":"25277","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25278","messages":"25279","suppressedMessages":"25280","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25281","messages":"25282","suppressedMessages":"25283","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25284","messages":"25285","suppressedMessages":"25286","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25287","messages":"25288","suppressedMessages":"25289","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25290","messages":"25291","suppressedMessages":"25292","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25293","messages":"25294","suppressedMessages":"25295","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25296","messages":"25297","suppressedMessages":"25298","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25299","messages":"25300","suppressedMessages":"25301","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25302","messages":"25303","suppressedMessages":"25304","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25305","messages":"25306","suppressedMessages":"25307","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25308","messages":"25309","suppressedMessages":"25310","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25311","messages":"25312","suppressedMessages":"25313","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25314","messages":"25315","suppressedMessages":"25316","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25317","messages":"25318","suppressedMessages":"25319","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25320","messages":"25321","suppressedMessages":"25322","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25323","messages":"25324","suppressedMessages":"25325","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25326","messages":"25327","suppressedMessages":"25328","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25329","messages":"25330","suppressedMessages":"25331","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25332","messages":"25333","suppressedMessages":"25334","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25335","messages":"25336","suppressedMessages":"25337","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25338","messages":"25339","suppressedMessages":"25340","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25341","messages":"25342","suppressedMessages":"25343","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25344","messages":"25345","suppressedMessages":"25346","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25347","messages":"25348","suppressedMessages":"25349","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25350","messages":"25351","suppressedMessages":"25352","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25353","messages":"25354","suppressedMessages":"25355","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25356","messages":"25357","suppressedMessages":"25358","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25359","messages":"25360","suppressedMessages":"25361","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25362","messages":"25363","suppressedMessages":"25364","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25365","messages":"25366","suppressedMessages":"25367","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25368","messages":"25369","suppressedMessages":"25370","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25371","messages":"25372","suppressedMessages":"25373","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25374","messages":"25375","suppressedMessages":"25376","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25377","messages":"25378","suppressedMessages":"25379","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25380","messages":"25381","suppressedMessages":"25382","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25383","messages":"25384","suppressedMessages":"25385","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25386","messages":"25387","suppressedMessages":"25388","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25389","messages":"25390","suppressedMessages":"25391","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25392","messages":"25393","suppressedMessages":"25394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25395","messages":"25396","suppressedMessages":"25397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25398","messages":"25399","suppressedMessages":"25400","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25401","messages":"25402","suppressedMessages":"25403","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25404","messages":"25405","suppressedMessages":"25406","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25407","messages":"25408","suppressedMessages":"25409","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25410","messages":"25411","suppressedMessages":"25412","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25413","messages":"25414","suppressedMessages":"25415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25416","messages":"25417","suppressedMessages":"25418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25419","messages":"25420","suppressedMessages":"25421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25422","messages":"25423","suppressedMessages":"25424","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25425","messages":"25426","suppressedMessages":"25427","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25428","messages":"25429","suppressedMessages":"25430","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25431","messages":"25432","suppressedMessages":"25433","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25434","messages":"25435","suppressedMessages":"25436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25437","messages":"25438","suppressedMessages":"25439","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25440","messages":"25441","suppressedMessages":"25442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25443","messages":"25444","suppressedMessages":"25445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25446","messages":"25447","suppressedMessages":"25448","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25449","messages":"25450","suppressedMessages":"25451","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25452","messages":"25453","suppressedMessages":"25454","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25455","messages":"25456","suppressedMessages":"25457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25458","messages":"25459","suppressedMessages":"25460","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25461","messages":"25462","suppressedMessages":"25463","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25464","messages":"25465","suppressedMessages":"25466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25467","messages":"25468","suppressedMessages":"25469","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25470","messages":"25471","suppressedMessages":"25472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25473","messages":"25474","suppressedMessages":"25475","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25476","messages":"25477","suppressedMessages":"25478","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25479","messages":"25480","suppressedMessages":"25481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25482","messages":"25483","suppressedMessages":"25484","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25485","messages":"25486","suppressedMessages":"25487","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25488","messages":"25489","suppressedMessages":"25490","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25491","messages":"25492","suppressedMessages":"25493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25494","messages":"25495","suppressedMessages":"25496","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25497","messages":"25498","suppressedMessages":"25499","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25500","messages":"25501","suppressedMessages":"25502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25503","messages":"25504","suppressedMessages":"25505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25506","messages":"25507","suppressedMessages":"25508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25509","messages":"25510","suppressedMessages":"25511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25512","messages":"25513","suppressedMessages":"25514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25515","messages":"25516","suppressedMessages":"25517","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25518","messages":"25519","suppressedMessages":"25520","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25521","messages":"25522","suppressedMessages":"25523","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25524","messages":"25525","suppressedMessages":"25526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25527","messages":"25528","suppressedMessages":"25529","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25530","messages":"25531","suppressedMessages":"25532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25533","messages":"25534","suppressedMessages":"25535","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25536","messages":"25537","suppressedMessages":"25538","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25539","messages":"25540","suppressedMessages":"25541","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25542","messages":"25543","suppressedMessages":"25544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25545","messages":"25546","suppressedMessages":"25547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25548","messages":"25549","suppressedMessages":"25550","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25551","messages":"25552","suppressedMessages":"25553","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25554","messages":"25555","suppressedMessages":"25556","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25557","messages":"25558","suppressedMessages":"25559","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25560","messages":"25561","suppressedMessages":"25562","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25563","messages":"25564","suppressedMessages":"25565","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25566","messages":"25567","suppressedMessages":"25568","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25569","messages":"25570","suppressedMessages":"25571","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25572","messages":"25573","suppressedMessages":"25574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25575","messages":"25576","suppressedMessages":"25577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25578","messages":"25579","suppressedMessages":"25580","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25581","messages":"25582","suppressedMessages":"25583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25584","messages":"25585","suppressedMessages":"25586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25587","messages":"25588","suppressedMessages":"25589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25590","messages":"25591","suppressedMessages":"25592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25593","messages":"25594","suppressedMessages":"25595","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25596","messages":"25597","suppressedMessages":"25598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25599","messages":"25600","suppressedMessages":"25601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25602","messages":"25603","suppressedMessages":"25604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25605","messages":"25606","suppressedMessages":"25607","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25608","messages":"25609","suppressedMessages":"25610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25611","messages":"25612","suppressedMessages":"25613","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25614","messages":"25615","suppressedMessages":"25616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25617","messages":"25618","suppressedMessages":"25619","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25620","messages":"25621","suppressedMessages":"25622","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25623","messages":"25624","suppressedMessages":"25625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25626","messages":"25627","suppressedMessages":"25628","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25629","messages":"25630","suppressedMessages":"25631","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25632","messages":"25633","suppressedMessages":"25634","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25635","messages":"25636","suppressedMessages":"25637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25638","messages":"25639","suppressedMessages":"25640","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25641","messages":"25642","suppressedMessages":"25643","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25644","messages":"25645","suppressedMessages":"25646","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25647","messages":"25648","suppressedMessages":"25649","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25650","messages":"25651","suppressedMessages":"25652","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25653","messages":"25654","suppressedMessages":"25655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25656","messages":"25657","suppressedMessages":"25658","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25659","messages":"25660","suppressedMessages":"25661","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25662","messages":"25663","suppressedMessages":"25664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25665","messages":"25666","suppressedMessages":"25667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25668","messages":"25669","suppressedMessages":"25670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25671","messages":"25672","suppressedMessages":"25673","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25674","messages":"25675","suppressedMessages":"25676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25677","messages":"25678","suppressedMessages":"25679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25680","messages":"25681","suppressedMessages":"25682","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25683","messages":"25684","suppressedMessages":"25685","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25686","messages":"25687","suppressedMessages":"25688","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25689","messages":"25690","suppressedMessages":"25691","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25692","messages":"25693","suppressedMessages":"25694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25695","messages":"25696","suppressedMessages":"25697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25698","messages":"25699","suppressedMessages":"25700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25701","messages":"25702","suppressedMessages":"25703","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25704","messages":"25705","suppressedMessages":"25706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25707","messages":"25708","suppressedMessages":"25709","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25710","messages":"25711","suppressedMessages":"25712","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25713","messages":"25714","suppressedMessages":"25715","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25716","messages":"25717","suppressedMessages":"25718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25719","messages":"25720","suppressedMessages":"25721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25722","messages":"25723","suppressedMessages":"25724","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25725","messages":"25726","suppressedMessages":"25727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25728","messages":"25729","suppressedMessages":"25730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25731","messages":"25732","suppressedMessages":"25733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25734","messages":"25735","suppressedMessages":"25736","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25737","messages":"25738","suppressedMessages":"25739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25740","messages":"25741","suppressedMessages":"25742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25743","messages":"25744","suppressedMessages":"25745","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25746","messages":"25747","suppressedMessages":"25748","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25749","messages":"25750","suppressedMessages":"25751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25752","messages":"25753","suppressedMessages":"25754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25755","messages":"25756","suppressedMessages":"25757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25758","messages":"25759","suppressedMessages":"25760","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25761","messages":"25762","suppressedMessages":"25763","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25764","messages":"25765","suppressedMessages":"25766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25767","messages":"25768","suppressedMessages":"25769","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25770","messages":"25771","suppressedMessages":"25772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25773","messages":"25774","suppressedMessages":"25775","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25776","messages":"25777","suppressedMessages":"25778","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25779","messages":"25780","suppressedMessages":"25781","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25782","messages":"25783","suppressedMessages":"25784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25785","messages":"25786","suppressedMessages":"25787","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25788","messages":"25789","suppressedMessages":"25790","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25791","messages":"25792","suppressedMessages":"25793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25794","messages":"25795","suppressedMessages":"25796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25797","messages":"25798","suppressedMessages":"25799","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25800","messages":"25801","suppressedMessages":"25802","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25803","messages":"25804","suppressedMessages":"25805","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25806","messages":"25807","suppressedMessages":"25808","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25809","messages":"25810","suppressedMessages":"25811","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25812","messages":"25813","suppressedMessages":"25814","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25815","messages":"25816","suppressedMessages":"25817","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25818","messages":"25819","suppressedMessages":"25820","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25821","messages":"25822","suppressedMessages":"25823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25824","messages":"25825","suppressedMessages":"25826","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25827","messages":"25828","suppressedMessages":"25829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25830","messages":"25831","suppressedMessages":"25832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25833","messages":"25834","suppressedMessages":"25835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25836","messages":"25837","suppressedMessages":"25838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25839","messages":"25840","suppressedMessages":"25841","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25842","messages":"25843","suppressedMessages":"25844","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25845","messages":"25846","suppressedMessages":"25847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25848","messages":"25849","suppressedMessages":"25850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25851","messages":"25852","suppressedMessages":"25853","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25854","messages":"25855","suppressedMessages":"25856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25857","messages":"25858","suppressedMessages":"25859","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25860","messages":"25861","suppressedMessages":"25862","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25863","messages":"25864","suppressedMessages":"25865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25866","messages":"25867","suppressedMessages":"25868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25869","messages":"25870","suppressedMessages":"25871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25872","messages":"25873","suppressedMessages":"25874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25875","messages":"25876","suppressedMessages":"25877","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25878","messages":"25879","suppressedMessages":"25880","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25881","messages":"25882","suppressedMessages":"25883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25884","messages":"25885","suppressedMessages":"25886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25887","messages":"25888","suppressedMessages":"25889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25890","messages":"25891","suppressedMessages":"25892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25893","messages":"25894","suppressedMessages":"25895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25896","messages":"25897","suppressedMessages":"25898","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25899","messages":"25900","suppressedMessages":"25901","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25902","messages":"25903","suppressedMessages":"25904","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25905","messages":"25906","suppressedMessages":"25907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25908","messages":"25909","suppressedMessages":"25910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25911","messages":"25912","suppressedMessages":"25913","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25914","messages":"25915","suppressedMessages":"25916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25917","messages":"25918","suppressedMessages":"25919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25920","messages":"25921","suppressedMessages":"25922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25923","messages":"25924","suppressedMessages":"25925","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25926","messages":"25927","suppressedMessages":"25928","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25929","messages":"25930","suppressedMessages":"25931","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25932","messages":"25933","suppressedMessages":"25934","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25935","messages":"25936","suppressedMessages":"25937","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25938","messages":"25939","suppressedMessages":"25940","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25941","messages":"25942","suppressedMessages":"25943","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25944","messages":"25945","suppressedMessages":"25946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25947","messages":"25948","suppressedMessages":"25949","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25950","messages":"25951","suppressedMessages":"25952","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25953","messages":"25954","suppressedMessages":"25955","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25956","messages":"25957","suppressedMessages":"25958","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25959","messages":"25960","suppressedMessages":"25961","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25962","messages":"25963","suppressedMessages":"25964","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"25965","messages":"25966","suppressedMessages":"25967","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25968","messages":"25969","suppressedMessages":"25970","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25971","messages":"25972","suppressedMessages":"25973","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25974","messages":"25975","suppressedMessages":"25976","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25977","messages":"25978","suppressedMessages":"25979","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25980","messages":"25981","suppressedMessages":"25982","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25983","messages":"25984","suppressedMessages":"25985","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25986","messages":"25987","suppressedMessages":"25988","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25989","messages":"25990","suppressedMessages":"25991","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25992","messages":"25993","suppressedMessages":"25994","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25995","messages":"25996","suppressedMessages":"25997","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"25998","messages":"25999","suppressedMessages":"26000","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26001","messages":"26002","suppressedMessages":"26003","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26004","messages":"26005","suppressedMessages":"26006","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26007","messages":"26008","suppressedMessages":"26009","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26010","messages":"26011","suppressedMessages":"26012","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26013","messages":"26014","suppressedMessages":"26015","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26016","messages":"26017","suppressedMessages":"26018","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26019","messages":"26020","suppressedMessages":"26021","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26022","messages":"26023","suppressedMessages":"26024","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26025","messages":"26026","suppressedMessages":"26027","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26028","messages":"26029","suppressedMessages":"26030","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26031","messages":"26032","suppressedMessages":"26033","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26034","messages":"26035","suppressedMessages":"26036","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26037","messages":"26038","suppressedMessages":"26039","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26040","messages":"26041","suppressedMessages":"26042","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26043","messages":"26044","suppressedMessages":"26045","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26046","messages":"26047","suppressedMessages":"26048","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26049","messages":"26050","suppressedMessages":"26051","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26052","messages":"26053","suppressedMessages":"26054","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26055","messages":"26056","suppressedMessages":"26057","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26058","messages":"26059","suppressedMessages":"26060","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26061","messages":"26062","suppressedMessages":"26063","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26064","messages":"26065","suppressedMessages":"26066","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26067","messages":"26068","suppressedMessages":"26069","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26070","messages":"26071","suppressedMessages":"26072","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26073","messages":"26074","suppressedMessages":"26075","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26076","messages":"26077","suppressedMessages":"26078","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26079","messages":"26080","suppressedMessages":"26081","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26082","messages":"26083","suppressedMessages":"26084","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26085","messages":"26086","suppressedMessages":"26087","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26088","messages":"26089","suppressedMessages":"26090","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26091","messages":"26092","suppressedMessages":"26093","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26094","messages":"26095","suppressedMessages":"26096","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26097","messages":"26098","suppressedMessages":"26099","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26100","messages":"26101","suppressedMessages":"26102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26103","messages":"26104","suppressedMessages":"26105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26106","messages":"26107","suppressedMessages":"26108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26109","messages":"26110","suppressedMessages":"26111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26112","messages":"26113","suppressedMessages":"26114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26115","messages":"26116","suppressedMessages":"26117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26118","messages":"26119","suppressedMessages":"26120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26121","messages":"26122","suppressedMessages":"26123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26124","messages":"26125","suppressedMessages":"26126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26127","messages":"26128","suppressedMessages":"26129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26130","messages":"26131","suppressedMessages":"26132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26133","messages":"26134","suppressedMessages":"26135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26136","messages":"26137","suppressedMessages":"26138","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26139","messages":"26140","suppressedMessages":"26141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26142","messages":"26143","suppressedMessages":"26144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26145","messages":"26146","suppressedMessages":"26147","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26148","messages":"26149","suppressedMessages":"26150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26151","messages":"26152","suppressedMessages":"26153","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26154","messages":"26155","suppressedMessages":"26156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26157","messages":"26158","suppressedMessages":"26159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26160","messages":"26161","suppressedMessages":"26162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26163","messages":"26164","suppressedMessages":"26165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26166","messages":"26167","suppressedMessages":"26168","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26169","messages":"26170","suppressedMessages":"26171","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26172","messages":"26173","suppressedMessages":"26174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26175","messages":"26176","suppressedMessages":"26177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26178","messages":"26179","suppressedMessages":"26180","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26181","messages":"26182","suppressedMessages":"26183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26184","messages":"26185","suppressedMessages":"26186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26187","messages":"26188","suppressedMessages":"26189","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26190","messages":"26191","suppressedMessages":"26192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26193","messages":"26194","suppressedMessages":"26195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26196","messages":"26197","suppressedMessages":"26198","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26199","messages":"26200","suppressedMessages":"26201","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26202","messages":"26203","suppressedMessages":"26204","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26205","messages":"26206","suppressedMessages":"26207","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26208","messages":"26209","suppressedMessages":"26210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26211","messages":"26212","suppressedMessages":"26213","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26214","messages":"26215","suppressedMessages":"26216","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26217","messages":"26218","suppressedMessages":"26219","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26220","messages":"26221","suppressedMessages":"26222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26223","messages":"26224","suppressedMessages":"26225","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26226","messages":"26227","suppressedMessages":"26228","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26229","messages":"26230","suppressedMessages":"26231","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26232","messages":"26233","suppressedMessages":"26234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26235","messages":"26236","suppressedMessages":"26237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26238","messages":"26239","suppressedMessages":"26240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26241","messages":"26242","suppressedMessages":"26243","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26244","messages":"26245","suppressedMessages":"26246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26247","messages":"26248","suppressedMessages":"26249","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26250","messages":"26251","suppressedMessages":"26252","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26253","messages":"26254","suppressedMessages":"26255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26256","messages":"26257","suppressedMessages":"26258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26259","messages":"26260","suppressedMessages":"26261","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26262","messages":"26263","suppressedMessages":"26264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26265","messages":"26266","suppressedMessages":"26267","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26268","messages":"26269","suppressedMessages":"26270","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26271","messages":"26272","suppressedMessages":"26273","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26274","messages":"26275","suppressedMessages":"26276","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26277","messages":"26278","suppressedMessages":"26279","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26280","messages":"26281","suppressedMessages":"26282","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26283","messages":"26284","suppressedMessages":"26285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26286","messages":"26287","suppressedMessages":"26288","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26289","messages":"26290","suppressedMessages":"26291","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26292","messages":"26293","suppressedMessages":"26294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26295","messages":"26296","suppressedMessages":"26297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26298","messages":"26299","suppressedMessages":"26300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26301","messages":"26302","suppressedMessages":"26303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26304","messages":"26305","suppressedMessages":"26306","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26307","messages":"26308","suppressedMessages":"26309","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26310","messages":"26311","suppressedMessages":"26312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26313","messages":"26314","suppressedMessages":"26315","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26316","messages":"26317","suppressedMessages":"26318","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26319","messages":"26320","suppressedMessages":"26321","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26322","messages":"26323","suppressedMessages":"26324","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26325","messages":"26326","suppressedMessages":"26327","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26328","messages":"26329","suppressedMessages":"26330","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26331","messages":"26332","suppressedMessages":"26333","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26334","messages":"26335","suppressedMessages":"26336","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26337","messages":"26338","suppressedMessages":"26339","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26340","messages":"26341","suppressedMessages":"26342","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26343","messages":"26344","suppressedMessages":"26345","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26346","messages":"26347","suppressedMessages":"26348","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26349","messages":"26350","suppressedMessages":"26351","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26352","messages":"26353","suppressedMessages":"26354","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26355","messages":"26356","suppressedMessages":"26357","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26358","messages":"26359","suppressedMessages":"26360","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26361","messages":"26362","suppressedMessages":"26363","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26364","messages":"26365","suppressedMessages":"26366","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26367","messages":"26368","suppressedMessages":"26369","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26370","messages":"26371","suppressedMessages":"26372","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26373","messages":"26374","suppressedMessages":"26375","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26376","messages":"26377","suppressedMessages":"26378","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26379","messages":"26380","suppressedMessages":"26381","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26382","messages":"26383","suppressedMessages":"26384","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26385","messages":"26386","suppressedMessages":"26387","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26388","messages":"26389","suppressedMessages":"26390","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26391","messages":"26392","suppressedMessages":"26393","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26394","messages":"26395","suppressedMessages":"26396","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26397","messages":"26398","suppressedMessages":"26399","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26400","messages":"26401","suppressedMessages":"26402","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26403","messages":"26404","suppressedMessages":"26405","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26406","messages":"26407","suppressedMessages":"26408","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26409","messages":"26410","suppressedMessages":"26411","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26412","messages":"26413","suppressedMessages":"26414","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26415","messages":"26416","suppressedMessages":"26417","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26418","messages":"26419","suppressedMessages":"26420","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26421","messages":"26422","suppressedMessages":"26423","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26424","messages":"26425","suppressedMessages":"26426","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26427","messages":"26428","suppressedMessages":"26429","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26430","messages":"26431","suppressedMessages":"26432","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26433","messages":"26434","suppressedMessages":"26435","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26436","messages":"26437","suppressedMessages":"26438","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26439","messages":"26440","suppressedMessages":"26441","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26442","messages":"26443","suppressedMessages":"26444","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26445","messages":"26446","suppressedMessages":"26447","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26448","messages":"26449","suppressedMessages":"26450","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26451","messages":"26452","suppressedMessages":"26453","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26454","messages":"26455","suppressedMessages":"26456","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26457","messages":"26458","suppressedMessages":"26459","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26460","messages":"26461","suppressedMessages":"26462","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26463","messages":"26464","suppressedMessages":"26465","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26466","messages":"26467","suppressedMessages":"26468","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26469","messages":"26470","suppressedMessages":"26471","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26472","messages":"26473","suppressedMessages":"26474","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26475","messages":"26476","suppressedMessages":"26477","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26478","messages":"26479","suppressedMessages":"26480","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26481","messages":"26482","suppressedMessages":"26483","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26484","messages":"26485","suppressedMessages":"26486","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26487","messages":"26488","suppressedMessages":"26489","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26490","messages":"26491","suppressedMessages":"26492","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26493","messages":"26494","suppressedMessages":"26495","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26496","messages":"26497","suppressedMessages":"26498","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26499","messages":"26500","suppressedMessages":"26501","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26502","messages":"26503","suppressedMessages":"26504","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26505","messages":"26506","suppressedMessages":"26507","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26508","messages":"26509","suppressedMessages":"26510","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26511","messages":"26512","suppressedMessages":"26513","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26514","messages":"26515","suppressedMessages":"26516","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26517","messages":"26518","suppressedMessages":"26519","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26520","messages":"26521","suppressedMessages":"26522","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26523","messages":"26524","suppressedMessages":"26525","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26526","messages":"26527","suppressedMessages":"26528","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26529","messages":"26530","suppressedMessages":"26531","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26532","messages":"26533","suppressedMessages":"26534","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26535","messages":"26536","suppressedMessages":"26537","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26538","messages":"26539","suppressedMessages":"26540","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26541","messages":"26542","suppressedMessages":"26543","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26544","messages":"26545","suppressedMessages":"26546","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26547","messages":"26548","suppressedMessages":"26549","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26550","messages":"26551","suppressedMessages":"26552","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26553","messages":"26554","suppressedMessages":"26555","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26556","messages":"26557","suppressedMessages":"26558","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26559","messages":"26560","suppressedMessages":"26561","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26562","messages":"26563","suppressedMessages":"26564","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26565","messages":"26566","suppressedMessages":"26567","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26568","messages":"26569","suppressedMessages":"26570","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26571","messages":"26572","suppressedMessages":"26573","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26574","messages":"26575","suppressedMessages":"26576","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26577","messages":"26578","suppressedMessages":"26579","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26580","messages":"26581","suppressedMessages":"26582","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26583","messages":"26584","suppressedMessages":"26585","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26586","messages":"26587","suppressedMessages":"26588","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26589","messages":"26590","suppressedMessages":"26591","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26592","messages":"26593","suppressedMessages":"26594","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26595","messages":"26596","suppressedMessages":"26597","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26598","messages":"26599","suppressedMessages":"26600","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26601","messages":"26602","suppressedMessages":"26603","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26604","messages":"26605","suppressedMessages":"26606","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26607","messages":"26608","suppressedMessages":"26609","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26610","messages":"26611","suppressedMessages":"26612","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26613","messages":"26614","suppressedMessages":"26615","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26616","messages":"26617","suppressedMessages":"26618","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26619","messages":"26620","suppressedMessages":"26621","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26622","messages":"26623","suppressedMessages":"26624","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26625","messages":"26626","suppressedMessages":"26627","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26628","messages":"26629","suppressedMessages":"26630","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26631","messages":"26632","suppressedMessages":"26633","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26634","messages":"26635","suppressedMessages":"26636","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26637","messages":"26638","suppressedMessages":"26639","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26640","messages":"26641","suppressedMessages":"26642","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26643","messages":"26644","suppressedMessages":"26645","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26646","messages":"26647","suppressedMessages":"26648","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26649","messages":"26650","suppressedMessages":"26651","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26652","messages":"26653","suppressedMessages":"26654","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26655","messages":"26656","suppressedMessages":"26657","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26658","messages":"26659","suppressedMessages":"26660","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26661","messages":"26662","suppressedMessages":"26663","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26664","messages":"26665","suppressedMessages":"26666","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26667","messages":"26668","suppressedMessages":"26669","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26670","messages":"26671","suppressedMessages":"26672","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26673","messages":"26674","suppressedMessages":"26675","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26676","messages":"26677","suppressedMessages":"26678","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26679","messages":"26680","suppressedMessages":"26681","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26682","messages":"26683","suppressedMessages":"26684","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26685","messages":"26686","suppressedMessages":"26687","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26688","messages":"26689","suppressedMessages":"26690","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26691","messages":"26692","suppressedMessages":"26693","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26694","messages":"26695","suppressedMessages":"26696","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26697","messages":"26698","suppressedMessages":"26699","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26700","messages":"26701","suppressedMessages":"26702","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26703","messages":"26704","suppressedMessages":"26705","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26706","messages":"26707","suppressedMessages":"26708","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26709","messages":"26710","suppressedMessages":"26711","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26712","messages":"26713","suppressedMessages":"26714","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26715","messages":"26716","suppressedMessages":"26717","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26718","messages":"26719","suppressedMessages":"26720","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26721","messages":"26722","suppressedMessages":"26723","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26724","messages":"26725","suppressedMessages":"26726","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26727","messages":"26728","suppressedMessages":"26729","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26730","messages":"26731","suppressedMessages":"26732","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26733","messages":"26734","suppressedMessages":"26735","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26736","messages":"26737","suppressedMessages":"26738","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26739","messages":"26740","suppressedMessages":"26741","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26742","messages":"26743","suppressedMessages":"26744","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26745","messages":"26746","suppressedMessages":"26747","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26748","messages":"26749","suppressedMessages":"26750","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26751","messages":"26752","suppressedMessages":"26753","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26754","messages":"26755","suppressedMessages":"26756","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26757","messages":"26758","suppressedMessages":"26759","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26760","messages":"26761","suppressedMessages":"26762","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26763","messages":"26764","suppressedMessages":"26765","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26766","messages":"26767","suppressedMessages":"26768","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26769","messages":"26770","suppressedMessages":"26771","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26772","messages":"26773","suppressedMessages":"26774","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26775","messages":"26776","suppressedMessages":"26777","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26778","messages":"26779","suppressedMessages":"26780","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26781","messages":"26782","suppressedMessages":"26783","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26784","messages":"26785","suppressedMessages":"26786","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26787","messages":"26788","suppressedMessages":"26789","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26790","messages":"26791","suppressedMessages":"26792","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26793","messages":"26794","suppressedMessages":"26795","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26796","messages":"26797","suppressedMessages":"26798","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26799","messages":"26800","suppressedMessages":"26801","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26802","messages":"26803","suppressedMessages":"26804","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26805","messages":"26806","suppressedMessages":"26807","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26808","messages":"26809","suppressedMessages":"26810","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26811","messages":"26812","suppressedMessages":"26813","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26814","messages":"26815","suppressedMessages":"26816","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26817","messages":"26818","suppressedMessages":"26819","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26820","messages":"26821","suppressedMessages":"26822","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26823","messages":"26824","suppressedMessages":"26825","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26826","messages":"26827","suppressedMessages":"26828","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26829","messages":"26830","suppressedMessages":"26831","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26832","messages":"26833","suppressedMessages":"26834","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26835","messages":"26836","suppressedMessages":"26837","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26838","messages":"26839","suppressedMessages":"26840","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26841","messages":"26842","suppressedMessages":"26843","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26844","messages":"26845","suppressedMessages":"26846","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26847","messages":"26848","suppressedMessages":"26849","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26850","messages":"26851","suppressedMessages":"26852","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26853","messages":"26854","suppressedMessages":"26855","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26856","messages":"26857","suppressedMessages":"26858","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26859","messages":"26860","suppressedMessages":"26861","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26862","messages":"26863","suppressedMessages":"26864","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26865","messages":"26866","suppressedMessages":"26867","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26868","messages":"26869","suppressedMessages":"26870","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26871","messages":"26872","suppressedMessages":"26873","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26874","messages":"26875","suppressedMessages":"26876","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26877","messages":"26878","suppressedMessages":"26879","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26880","messages":"26881","suppressedMessages":"26882","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26883","messages":"26884","suppressedMessages":"26885","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26886","messages":"26887","suppressedMessages":"26888","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26889","messages":"26890","suppressedMessages":"26891","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26892","messages":"26893","suppressedMessages":"26894","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26895","messages":"26896","suppressedMessages":"26897","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26898","messages":"26899","suppressedMessages":"26900","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26901","messages":"26902","suppressedMessages":"26903","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26904","messages":"26905","suppressedMessages":"26906","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26907","messages":"26908","suppressedMessages":"26909","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26910","messages":"26911","suppressedMessages":"26912","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26913","messages":"26914","suppressedMessages":"26915","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26916","messages":"26917","suppressedMessages":"26918","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26919","messages":"26920","suppressedMessages":"26921","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26922","messages":"26923","suppressedMessages":"26924","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26925","messages":"26926","suppressedMessages":"26927","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26928","messages":"26929","suppressedMessages":"26930","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26931","messages":"26932","suppressedMessages":"26933","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26934","messages":"26935","suppressedMessages":"26936","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26937","messages":"26938","suppressedMessages":"26939","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26940","messages":"26941","suppressedMessages":"26942","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26943","messages":"26944","suppressedMessages":"26945","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26946","messages":"26947","suppressedMessages":"26948","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26949","messages":"26950","suppressedMessages":"26951","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26952","messages":"26953","suppressedMessages":"26954","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26955","messages":"26956","suppressedMessages":"26957","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26958","messages":"26959","suppressedMessages":"26960","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"26961","messages":"26962","suppressedMessages":"26963","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26964","messages":"26965","suppressedMessages":"26966","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26967","messages":"26968","suppressedMessages":"26969","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26970","messages":"26971","suppressedMessages":"26972","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26973","messages":"26974","suppressedMessages":"26975","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26976","messages":"26977","suppressedMessages":"26978","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26979","messages":"26980","suppressedMessages":"26981","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26982","messages":"26983","suppressedMessages":"26984","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26985","messages":"26986","suppressedMessages":"26987","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26988","messages":"26989","suppressedMessages":"26990","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26991","messages":"26992","suppressedMessages":"26993","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26994","messages":"26995","suppressedMessages":"26996","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"26997","messages":"26998","suppressedMessages":"26999","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27000","messages":"27001","suppressedMessages":"27002","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27003","messages":"27004","suppressedMessages":"27005","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27006","messages":"27007","suppressedMessages":"27008","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27009","messages":"27010","suppressedMessages":"27011","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27012","messages":"27013","suppressedMessages":"27014","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27015","messages":"27016","suppressedMessages":"27017","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27018","messages":"27019","suppressedMessages":"27020","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27021","messages":"27022","suppressedMessages":"27023","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27024","messages":"27025","suppressedMessages":"27026","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27027","messages":"27028","suppressedMessages":"27029","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27030","messages":"27031","suppressedMessages":"27032","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27033","messages":"27034","suppressedMessages":"27035","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27036","messages":"27037","suppressedMessages":"27038","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27039","messages":"27040","suppressedMessages":"27041","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27042","messages":"27043","suppressedMessages":"27044","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27045","messages":"27046","suppressedMessages":"27047","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27048","messages":"27049","suppressedMessages":"27050","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27051","messages":"27052","suppressedMessages":"27053","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27054","messages":"27055","suppressedMessages":"27056","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27057","messages":"27058","suppressedMessages":"27059","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27060","messages":"27061","suppressedMessages":"27062","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27063","messages":"27064","suppressedMessages":"27065","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27066","messages":"27067","suppressedMessages":"27068","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27069","messages":"27070","suppressedMessages":"27071","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27072","messages":"27073","suppressedMessages":"27074","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27075","messages":"27076","suppressedMessages":"27077","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27078","messages":"27079","suppressedMessages":"27080","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27081","messages":"27082","suppressedMessages":"27083","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27084","messages":"27085","suppressedMessages":"27086","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27087","messages":"27088","suppressedMessages":"27089","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27090","messages":"27091","suppressedMessages":"27092","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27093","messages":"27094","suppressedMessages":"27095","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27096","messages":"27097","suppressedMessages":"27098","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27099","messages":"27100","suppressedMessages":"27101","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27102","messages":"27103","suppressedMessages":"27104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27105","messages":"27106","suppressedMessages":"27107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27108","messages":"27109","suppressedMessages":"27110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27111","messages":"27112","suppressedMessages":"27113","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27114","messages":"27115","suppressedMessages":"27116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27117","messages":"27118","suppressedMessages":"27119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27120","messages":"27121","suppressedMessages":"27122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27123","messages":"27124","suppressedMessages":"27125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27126","messages":"27127","suppressedMessages":"27128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27129","messages":"27130","suppressedMessages":"27131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27132","messages":"27133","suppressedMessages":"27134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27135","messages":"27136","suppressedMessages":"27137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27138","messages":"27139","suppressedMessages":"27140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27141","messages":"27142","suppressedMessages":"27143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27144","messages":"27145","suppressedMessages":"27146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27147","messages":"27148","suppressedMessages":"27149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27150","messages":"27151","suppressedMessages":"27152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27153","messages":"27154","suppressedMessages":"27155","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27156","messages":"27157","suppressedMessages":"27158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27159","messages":"27160","suppressedMessages":"27161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27162","messages":"27163","suppressedMessages":"27164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27165","messages":"27166","suppressedMessages":"27167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27168","messages":"27169","suppressedMessages":"27170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27171","messages":"27172","suppressedMessages":"27173","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27174","messages":"27175","suppressedMessages":"27176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27177","messages":"27178","suppressedMessages":"27179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27180","messages":"27181","suppressedMessages":"27182","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27183","messages":"27184","suppressedMessages":"27185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27186","messages":"27187","suppressedMessages":"27188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27189","messages":"27190","suppressedMessages":"27191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27192","messages":"27193","suppressedMessages":"27194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27195","messages":"27196","suppressedMessages":"27197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27198","messages":"27199","suppressedMessages":"27200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27201","messages":"27202","suppressedMessages":"27203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27204","messages":"27205","suppressedMessages":"27206","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27207","messages":"27208","suppressedMessages":"27209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27210","messages":"27211","suppressedMessages":"27212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27213","messages":"27214","suppressedMessages":"27215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27216","messages":"27217","suppressedMessages":"27218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27219","messages":"27220","suppressedMessages":"27221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27222","messages":"27223","suppressedMessages":"27224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27225","messages":"27226","suppressedMessages":"27227","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"27228","messages":"27229","suppressedMessages":"27230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27231","messages":"27232","suppressedMessages":"27233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27234","messages":"27235","suppressedMessages":"27236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27237","messages":"27238","suppressedMessages":"27239","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27240","messages":"27241","suppressedMessages":"27242","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27243","messages":"27244","suppressedMessages":"27245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27246","messages":"27247","suppressedMessages":"27248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27249","messages":"27250","suppressedMessages":"27251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27252","messages":"27253","suppressedMessages":"27254","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27255","messages":"27256","suppressedMessages":"27257","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27258","messages":"27259","suppressedMessages":"27260","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27261","messages":"27262","suppressedMessages":"27263","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27264","messages":"27265","suppressedMessages":"27266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27267","messages":"27268","suppressedMessages":"27269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27270","messages":"27271","suppressedMessages":"27272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27273","messages":"27274","suppressedMessages":"27275","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27276","messages":"27277","suppressedMessages":"27278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27279","messages":"27280","suppressedMessages":"27281","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27282","messages":"27283","suppressedMessages":"27284","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27285","messages":"27286","suppressedMessages":"27287","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27288","messages":"27289","suppressedMessages":"27290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27291","messages":"27292","suppressedMessages":"27293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27294","messages":"27295","suppressedMessages":"27296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27297","messages":"27298","suppressedMessages":"27299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"4cfoa2",{"filePath":"27300","messages":"27301","suppressedMessages":"27302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27303","messages":"27304","suppressedMessages":"27305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27306","messages":"27307","suppressedMessages":"27308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27309","messages":"27310","suppressedMessages":"27311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27312","messages":"27313","suppressedMessages":"27314","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27315","messages":"27316","suppressedMessages":"27317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27318","messages":"27319","suppressedMessages":"27320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27321","messages":"27322","suppressedMessages":"27323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27324","messages":"27325","suppressedMessages":"27326","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27327","messages":"27328","suppressedMessages":"27329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27330","messages":"27331","suppressedMessages":"27332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27333","messages":"27334","suppressedMessages":"27335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27336","messages":"27337","suppressedMessages":"27338","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"27339","messages":"27340","suppressedMessages":"27341","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27342","messages":"27343","suppressedMessages":"27344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27345","messages":"27346","suppressedMessages":"27347","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27348","messages":"27349","suppressedMessages":"27350","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27351","messages":"27352","suppressedMessages":"27353","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27354","messages":"27355","suppressedMessages":"27356","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27357","messages":"27358","suppressedMessages":"27359","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27360","messages":"27361","suppressedMessages":"27362","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27363","messages":"27364","suppressedMessages":"27365","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27366","messages":"27367","suppressedMessages":"27368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27369","messages":"27370","suppressedMessages":"27371","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27372","messages":"27373","suppressedMessages":"27374","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27375","messages":"27376","suppressedMessages":"27377","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27378","messages":"27379","suppressedMessages":"27380","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27381","messages":"27382","suppressedMessages":"27383","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"27384","messages":"27385","suppressedMessages":"27386","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27387","messages":"27388","suppressedMessages":"27389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27390","messages":"27391","suppressedMessages":"27392","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27393","messages":"27394","suppressedMessages":"27395","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27396","messages":"27397","suppressedMessages":"27398","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27399","messages":"27400","suppressedMessages":"27401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27402","messages":"27403","suppressedMessages":"27404","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27405","messages":"27406","suppressedMessages":"27407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27408","messages":"27409","suppressedMessages":"27410","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27411","messages":"27412","suppressedMessages":"27413","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27414","messages":"27415","suppressedMessages":"27416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27417","messages":"27418","suppressedMessages":"27419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27420","messages":"27421","suppressedMessages":"27422","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27423","messages":"27424","suppressedMessages":"27425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27426","messages":"27427","suppressedMessages":"27428","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27429","messages":"27430","suppressedMessages":"27431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27432","messages":"27433","suppressedMessages":"27434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27435","messages":"27436","suppressedMessages":"27437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27438","messages":"27439","suppressedMessages":"27440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27441","messages":"27442","suppressedMessages":"27443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27444","messages":"27445","suppressedMessages":"27446","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27447","messages":"27448","suppressedMessages":"27449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27450","messages":"27451","suppressedMessages":"27452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27453","messages":"27454","suppressedMessages":"27455","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"27456","messages":"27457","suppressedMessages":"27458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27459","messages":"27460","suppressedMessages":"27461","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27462","messages":"27463","suppressedMessages":"27464","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27465","messages":"27466","suppressedMessages":"27467","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27468","messages":"27469","suppressedMessages":"27470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27471","messages":"27472","suppressedMessages":"27473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27474","messages":"27475","suppressedMessages":"27476","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"27477","messages":"27478","suppressedMessages":"27479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27480","messages":"27481","suppressedMessages":"27482","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27483","messages":"27484","suppressedMessages":"27485","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27486","messages":"27487","suppressedMessages":"27488","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27489","messages":"27490","suppressedMessages":"27491","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27492","messages":"27493","suppressedMessages":"27494","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"27495","messages":"27496","suppressedMessages":"27497","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27498","messages":"27499","suppressedMessages":"27500","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27501","messages":"27502","suppressedMessages":"27503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27504","messages":"27505","suppressedMessages":"27506","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27507","messages":"27508","suppressedMessages":"27509","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27510","messages":"27511","suppressedMessages":"27512","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27513","messages":"27514","suppressedMessages":"27515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27516","messages":"27517","suppressedMessages":"27518","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27519","messages":"27520","suppressedMessages":"27521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27522","messages":"27523","suppressedMessages":"27524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27525","messages":"27526","suppressedMessages":"27527","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27528","messages":"27529","suppressedMessages":"27530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27531","messages":"27532","suppressedMessages":"27533","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27534","messages":"27535","suppressedMessages":"27536","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27537","messages":"27538","suppressedMessages":"27539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27540","messages":"27541","suppressedMessages":"27542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27543","messages":"27544","suppressedMessages":"27545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27546","messages":"27547","suppressedMessages":"27548","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27549","messages":"27550","suppressedMessages":"27551","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27552","messages":"27553","suppressedMessages":"27554","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27555","messages":"27556","suppressedMessages":"27557","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27558","messages":"27559","suppressedMessages":"27560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27561","messages":"27562","suppressedMessages":"27563","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27564","messages":"27565","suppressedMessages":"27566","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27567","messages":"27568","suppressedMessages":"27569","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27570","messages":"27571","suppressedMessages":"27572","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27573","messages":"27574","suppressedMessages":"27575","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27576","messages":"27577","suppressedMessages":"27578","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27579","messages":"27580","suppressedMessages":"27581","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27582","messages":"27583","suppressedMessages":"27584","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27585","messages":"27586","suppressedMessages":"27587","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27588","messages":"27589","suppressedMessages":"27590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27591","messages":"27592","suppressedMessages":"27593","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27594","messages":"27595","suppressedMessages":"27596","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27597","messages":"27598","suppressedMessages":"27599","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27600","messages":"27601","suppressedMessages":"27602","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27603","messages":"27604","suppressedMessages":"27605","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27606","messages":"27607","suppressedMessages":"27608","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27609","messages":"27610","suppressedMessages":"27611","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27612","messages":"27613","suppressedMessages":"27614","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27615","messages":"27616","suppressedMessages":"27617","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27618","messages":"27619","suppressedMessages":"27620","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27621","messages":"27622","suppressedMessages":"27623","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27624","messages":"27625","suppressedMessages":"27626","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27627","messages":"27628","suppressedMessages":"27629","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27630","messages":"27631","suppressedMessages":"27632","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27633","messages":"27634","suppressedMessages":"27635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27636","messages":"27637","suppressedMessages":"27638","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27639","messages":"27640","suppressedMessages":"27641","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27642","messages":"27643","suppressedMessages":"27644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27645","messages":"27646","suppressedMessages":"27647","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27648","messages":"27649","suppressedMessages":"27650","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27651","messages":"27652","suppressedMessages":"27653","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27654","messages":"27655","suppressedMessages":"27656","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27657","messages":"27658","suppressedMessages":"27659","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27660","messages":"27661","suppressedMessages":"27662","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27663","messages":"27664","suppressedMessages":"27665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27666","messages":"27667","suppressedMessages":"27668","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27669","messages":"27670","suppressedMessages":"27671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27672","messages":"27673","suppressedMessages":"27674","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27675","messages":"27676","suppressedMessages":"27677","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27678","messages":"27679","suppressedMessages":"27680","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27681","messages":"27682","suppressedMessages":"27683","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27684","messages":"27685","suppressedMessages":"27686","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27687","messages":"27688","suppressedMessages":"27689","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27690","messages":"27691","suppressedMessages":"27692","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27693","messages":"27694","suppressedMessages":"27695","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27696","messages":"27697","suppressedMessages":"27698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27699","messages":"27700","suppressedMessages":"27701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27702","messages":"27703","suppressedMessages":"27704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27705","messages":"27706","suppressedMessages":"27707","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27708","messages":"27709","suppressedMessages":"27710","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27711","messages":"27712","suppressedMessages":"27713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27714","messages":"27715","suppressedMessages":"27716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27717","messages":"27718","suppressedMessages":"27719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27720","messages":"27721","suppressedMessages":"27722","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27723","messages":"27724","suppressedMessages":"27725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27726","messages":"27727","suppressedMessages":"27728","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27729","messages":"27730","suppressedMessages":"27731","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27732","messages":"27733","suppressedMessages":"27734","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27735","messages":"27736","suppressedMessages":"27737","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27738","messages":"27739","suppressedMessages":"27740","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27741","messages":"27742","suppressedMessages":"27743","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27744","messages":"27745","suppressedMessages":"27746","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27747","messages":"27748","suppressedMessages":"27749","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27750","messages":"27751","suppressedMessages":"27752","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27753","messages":"27754","suppressedMessages":"27755","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27756","messages":"27757","suppressedMessages":"27758","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27759","messages":"27760","suppressedMessages":"27761","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27762","messages":"27763","suppressedMessages":"27764","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27765","messages":"27766","suppressedMessages":"27767","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27768","messages":"27769","suppressedMessages":"27770","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27771","messages":"27772","suppressedMessages":"27773","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27774","messages":"27775","suppressedMessages":"27776","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27777","messages":"27778","suppressedMessages":"27779","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27780","messages":"27781","suppressedMessages":"27782","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27783","messages":"27784","suppressedMessages":"27785","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27786","messages":"27787","suppressedMessages":"27788","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27789","messages":"27790","suppressedMessages":"27791","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27792","messages":"27793","suppressedMessages":"27794","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27795","messages":"27796","suppressedMessages":"27797","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27798","messages":"27799","suppressedMessages":"27800","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27801","messages":"27802","suppressedMessages":"27803","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27804","messages":"27805","suppressedMessages":"27806","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27807","messages":"27808","suppressedMessages":"27809","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27810","messages":"27811","suppressedMessages":"27812","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27813","messages":"27814","suppressedMessages":"27815","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27816","messages":"27817","suppressedMessages":"27818","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27819","messages":"27820","suppressedMessages":"27821","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27822","messages":"27823","suppressedMessages":"27824","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27825","messages":"27826","suppressedMessages":"27827","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27828","messages":"27829","suppressedMessages":"27830","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27831","messages":"27832","suppressedMessages":"27833","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27834","messages":"27835","suppressedMessages":"27836","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27837","messages":"27838","suppressedMessages":"27839","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27840","messages":"27841","suppressedMessages":"27842","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27843","messages":"27844","suppressedMessages":"27845","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27846","messages":"27847","suppressedMessages":"27848","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27849","messages":"27850","suppressedMessages":"27851","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27852","messages":"27853","suppressedMessages":"27854","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27855","messages":"27856","suppressedMessages":"27857","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27858","messages":"27859","suppressedMessages":"27860","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27861","messages":"27862","suppressedMessages":"27863","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27864","messages":"27865","suppressedMessages":"27866","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27867","messages":"27868","suppressedMessages":"27869","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27870","messages":"27871","suppressedMessages":"27872","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27873","messages":"27874","suppressedMessages":"27875","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27876","messages":"27877","suppressedMessages":"27878","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27879","messages":"27880","suppressedMessages":"27881","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27882","messages":"27883","suppressedMessages":"27884","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27885","messages":"27886","suppressedMessages":"27887","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27888","messages":"27889","suppressedMessages":"27890","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27891","messages":"27892","suppressedMessages":"27893","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27894","messages":"27895","suppressedMessages":"27896","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27897","messages":"27898","suppressedMessages":"27899","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27900","messages":"27901","suppressedMessages":"27902","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27903","messages":"27904","suppressedMessages":"27905","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27906","messages":"27907","suppressedMessages":"27908","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27909","messages":"27910","suppressedMessages":"27911","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27912","messages":"27913","suppressedMessages":"27914","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27915","messages":"27916","suppressedMessages":"27917","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27918","messages":"27919","suppressedMessages":"27920","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"27921","messages":"27922","suppressedMessages":"27923","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27924","messages":"27925","suppressedMessages":"27926","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27927","messages":"27928","suppressedMessages":"27929","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27930","messages":"27931","suppressedMessages":"27932","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27933","messages":"27934","suppressedMessages":"27935","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27936","messages":"27937","suppressedMessages":"27938","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27939","messages":"27940","suppressedMessages":"27941","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27942","messages":"27943","suppressedMessages":"27944","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27945","messages":"27946","suppressedMessages":"27947","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27948","messages":"27949","suppressedMessages":"27950","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27951","messages":"27952","suppressedMessages":"27953","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27954","messages":"27955","suppressedMessages":"27956","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27957","messages":"27958","suppressedMessages":"27959","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27960","messages":"27961","suppressedMessages":"27962","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27963","messages":"27964","suppressedMessages":"27965","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27966","messages":"27967","suppressedMessages":"27968","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27969","messages":"27970","suppressedMessages":"27971","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27972","messages":"27973","suppressedMessages":"27974","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27975","messages":"27976","suppressedMessages":"27977","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27978","messages":"27979","suppressedMessages":"27980","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27981","messages":"27982","suppressedMessages":"27983","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27984","messages":"27985","suppressedMessages":"27986","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27987","messages":"27988","suppressedMessages":"27989","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27990","messages":"27991","suppressedMessages":"27992","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27993","messages":"27994","suppressedMessages":"27995","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27996","messages":"27997","suppressedMessages":"27998","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"27999","messages":"28000","suppressedMessages":"28001","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28002","messages":"28003","suppressedMessages":"28004","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28005","messages":"28006","suppressedMessages":"28007","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28008","messages":"28009","suppressedMessages":"28010","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28011","messages":"28012","suppressedMessages":"28013","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28014","messages":"28015","suppressedMessages":"28016","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28017","messages":"28018","suppressedMessages":"28019","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28020","messages":"28021","suppressedMessages":"28022","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28023","messages":"28024","suppressedMessages":"28025","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28026","messages":"28027","suppressedMessages":"28028","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28029","messages":"28030","suppressedMessages":"28031","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28032","messages":"28033","suppressedMessages":"28034","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28035","messages":"28036","suppressedMessages":"28037","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28038","messages":"28039","suppressedMessages":"28040","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28041","messages":"28042","suppressedMessages":"28043","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28044","messages":"28045","suppressedMessages":"28046","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28047","messages":"28048","suppressedMessages":"28049","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28050","messages":"28051","suppressedMessages":"28052","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28053","messages":"28054","suppressedMessages":"28055","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28056","messages":"28057","suppressedMessages":"28058","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28059","messages":"28060","suppressedMessages":"28061","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28062","messages":"28063","suppressedMessages":"28064","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28065","messages":"28066","suppressedMessages":"28067","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28068","messages":"28069","suppressedMessages":"28070","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28071","messages":"28072","suppressedMessages":"28073","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28074","messages":"28075","suppressedMessages":"28076","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28077","messages":"28078","suppressedMessages":"28079","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28080","messages":"28081","suppressedMessages":"28082","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28083","messages":"28084","suppressedMessages":"28085","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28086","messages":"28087","suppressedMessages":"28088","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28089","messages":"28090","suppressedMessages":"28091","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28092","messages":"28093","suppressedMessages":"28094","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28095","messages":"28096","suppressedMessages":"28097","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28098","messages":"28099","suppressedMessages":"28100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28101","messages":"28102","suppressedMessages":"28103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28104","messages":"28105","suppressedMessages":"28106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28107","messages":"28108","suppressedMessages":"28109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28110","messages":"28111","suppressedMessages":"28112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28113","messages":"28114","suppressedMessages":"28115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28116","messages":"28117","suppressedMessages":"28118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28119","messages":"28120","suppressedMessages":"28121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28122","messages":"28123","suppressedMessages":"28124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28125","messages":"28126","suppressedMessages":"28127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28128","messages":"28129","suppressedMessages":"28130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28131","messages":"28132","suppressedMessages":"28133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28134","messages":"28135","suppressedMessages":"28136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28137","messages":"28138","suppressedMessages":"28139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28140","messages":"28141","suppressedMessages":"28142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28143","messages":"28144","suppressedMessages":"28145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28146","messages":"28147","suppressedMessages":"28148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28149","messages":"28150","suppressedMessages":"28151","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28152","messages":"28153","suppressedMessages":"28154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28155","messages":"28156","suppressedMessages":"28157","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28158","messages":"28159","suppressedMessages":"28160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28161","messages":"28162","suppressedMessages":"28163","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28164","messages":"28165","suppressedMessages":"28166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28167","messages":"28168","suppressedMessages":"28169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28170","messages":"28171","suppressedMessages":"28172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28173","messages":"28174","suppressedMessages":"28175","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28176","messages":"28177","suppressedMessages":"28178","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28179","messages":"28180","suppressedMessages":"28181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28182","messages":"28183","suppressedMessages":"28184","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28185","messages":"28186","suppressedMessages":"28187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28188","messages":"28189","suppressedMessages":"28190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28191","messages":"28192","suppressedMessages":"28193","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28194","messages":"28195","suppressedMessages":"28196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28197","messages":"28198","suppressedMessages":"28199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28200","messages":"28201","suppressedMessages":"28202","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28203","messages":"28204","suppressedMessages":"28205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28206","messages":"28207","suppressedMessages":"28208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28209","messages":"28210","suppressedMessages":"28211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28212","messages":"28213","suppressedMessages":"28214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"13oux51",{"filePath":"28215","messages":"28216","suppressedMessages":"28217","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28218","messages":"28219","suppressedMessages":"28220","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28221","messages":"28222","suppressedMessages":"28223","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28224","messages":"28225","suppressedMessages":"28226","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28227","messages":"28228","suppressedMessages":"28229","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28230","messages":"28231","suppressedMessages":"28232","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28233","messages":"28234","suppressedMessages":"28235","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28236","messages":"28237","suppressedMessages":"28238","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28239","messages":"28240","suppressedMessages":"28241","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28242","messages":"28243","suppressedMessages":"28244","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28245","messages":"28246","suppressedMessages":"28247","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28248","messages":"28249","suppressedMessages":"28250","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28251","messages":"28252","suppressedMessages":"28253","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28254","messages":"28255","suppressedMessages":"28256","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28257","messages":"28258","suppressedMessages":"28259","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28260","messages":"28261","suppressedMessages":"28262","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28263","messages":"28264","suppressedMessages":"28265","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28266","messages":"28267","suppressedMessages":"28268","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28269","messages":"28270","suppressedMessages":"28271","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28272","messages":"28273","suppressedMessages":"28274","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28275","messages":"28276","suppressedMessages":"28277","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28278","messages":"28279","suppressedMessages":"28280","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28281","messages":"28282","suppressedMessages":"28283","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28284","messages":"28285","suppressedMessages":"28286","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28287","messages":"28288","suppressedMessages":"28289","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28290","messages":"28291","suppressedMessages":"28292","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28293","messages":"28294","suppressedMessages":"28295","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28296","messages":"28297","suppressedMessages":"28298","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28299","messages":"28300","suppressedMessages":"28301","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28302","messages":"28303","suppressedMessages":"28304","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28305","messages":"28306","suppressedMessages":"28307","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28308","messages":"28309","suppressedMessages":"28310","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28311","messages":"28312","suppressedMessages":"28313","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28314","messages":"28315","suppressedMessages":"28316","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28317","messages":"28318","suppressedMessages":"28319","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28320","messages":"28321","suppressedMessages":"28322","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28323","messages":"28324","suppressedMessages":"28325","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28326","messages":"28327","suppressedMessages":"28328","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28329","messages":"28330","suppressedMessages":"28331","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28332","messages":"28333","suppressedMessages":"28334","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28335","messages":"28336","suppressedMessages":"28337","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28338","messages":"28339","suppressedMessages":"28340","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28341","messages":"28342","suppressedMessages":"28343","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28344","messages":"28345","suppressedMessages":"28346","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28347","messages":"28348","suppressedMessages":"28349","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28350","messages":"28351","suppressedMessages":"28352","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28353","messages":"28354","suppressedMessages":"28355","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28356","messages":"28357","suppressedMessages":"28358","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28359","messages":"28360","suppressedMessages":"28361","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28362","messages":"28363","suppressedMessages":"28364","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28365","messages":"28366","suppressedMessages":"28367","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28368","messages":"28369","suppressedMessages":"28370","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28371","messages":"28372","suppressedMessages":"28373","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28374","messages":"28375","suppressedMessages":"28376","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28377","messages":"28378","suppressedMessages":"28379","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28380","messages":"28381","suppressedMessages":"28382","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28383","messages":"28384","suppressedMessages":"28385","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28386","messages":"28387","suppressedMessages":"28388","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28389","messages":"28390","suppressedMessages":"28391","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28392","messages":"28393","suppressedMessages":"28394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28395","messages":"28396","suppressedMessages":"28397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28398","messages":"28399","suppressedMessages":"28400","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28401","messages":"28402","suppressedMessages":"28403","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28404","messages":"28405","suppressedMessages":"28406","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28407","messages":"28408","suppressedMessages":"28409","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28410","messages":"28411","suppressedMessages":"28412","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28413","messages":"28414","suppressedMessages":"28415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28416","messages":"28417","suppressedMessages":"28418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28419","messages":"28420","suppressedMessages":"28421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28422","messages":"28423","suppressedMessages":"28424","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28425","messages":"28426","suppressedMessages":"28427","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28428","messages":"28429","suppressedMessages":"28430","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28431","messages":"28432","suppressedMessages":"28433","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28434","messages":"28435","suppressedMessages":"28436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28437","messages":"28438","suppressedMessages":"28439","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28440","messages":"28441","suppressedMessages":"28442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28443","messages":"28444","suppressedMessages":"28445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28446","messages":"28447","suppressedMessages":"28448","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28449","messages":"28450","suppressedMessages":"28451","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28452","messages":"28453","suppressedMessages":"28454","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28455","messages":"28456","suppressedMessages":"28457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28458","messages":"28459","suppressedMessages":"28460","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28461","messages":"28462","suppressedMessages":"28463","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28464","messages":"28465","suppressedMessages":"28466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28467","messages":"28468","suppressedMessages":"28469","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28470","messages":"28471","suppressedMessages":"28472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28473","messages":"28474","suppressedMessages":"28475","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28476","messages":"28477","suppressedMessages":"28478","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28479","messages":"28480","suppressedMessages":"28481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28482","messages":"28483","suppressedMessages":"28484","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28485","messages":"28486","suppressedMessages":"28487","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28488","messages":"28489","suppressedMessages":"28490","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"cz7bqe",{"filePath":"28491","messages":"28492","suppressedMessages":"28493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28494","messages":"28495","suppressedMessages":"28496","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28497","messages":"28498","suppressedMessages":"28499","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28500","messages":"28501","suppressedMessages":"28502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28503","messages":"28504","suppressedMessages":"28505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28506","messages":"28507","suppressedMessages":"28508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28509","messages":"28510","suppressedMessages":"28511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28512","messages":"28513","suppressedMessages":"28514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28515","messages":"28516","suppressedMessages":"28517","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28518","messages":"28519","suppressedMessages":"28520","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28521","messages":"28522","suppressedMessages":"28523","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28524","messages":"28525","suppressedMessages":"28526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28527","messages":"28528","suppressedMessages":"28529","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28530","messages":"28531","suppressedMessages":"28532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28533","messages":"28534","suppressedMessages":"28535","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28536","messages":"28537","suppressedMessages":"28538","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28539","messages":"28540","suppressedMessages":"28541","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28542","messages":"28543","suppressedMessages":"28544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28545","messages":"28546","suppressedMessages":"28547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28548","messages":"28549","suppressedMessages":"28550","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28551","messages":"28552","suppressedMessages":"28553","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28554","messages":"28555","suppressedMessages":"28556","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28557","messages":"28558","suppressedMessages":"28559","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28560","messages":"28561","suppressedMessages":"28562","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28563","messages":"28564","suppressedMessages":"28565","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28566","messages":"28567","suppressedMessages":"28568","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28569","messages":"28570","suppressedMessages":"28571","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28572","messages":"28573","suppressedMessages":"28574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28575","messages":"28576","suppressedMessages":"28577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28578","messages":"28579","suppressedMessages":"28580","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28581","messages":"28582","suppressedMessages":"28583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28584","messages":"28585","suppressedMessages":"28586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28587","messages":"28588","suppressedMessages":"28589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28590","messages":"28591","suppressedMessages":"28592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28593","messages":"28594","suppressedMessages":"28595","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28596","messages":"28597","suppressedMessages":"28598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28599","messages":"28600","suppressedMessages":"28601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28602","messages":"28603","suppressedMessages":"28604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28605","messages":"28606","suppressedMessages":"28607","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28608","messages":"28609","suppressedMessages":"28610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28611","messages":"28612","suppressedMessages":"28613","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28614","messages":"28615","suppressedMessages":"28616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28617","messages":"28618","suppressedMessages":"28619","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28620","messages":"28621","suppressedMessages":"28622","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28623","messages":"28624","suppressedMessages":"28625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28626","messages":"28627","suppressedMessages":"28628","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28629","messages":"28630","suppressedMessages":"28631","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28632","messages":"28633","suppressedMessages":"28634","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28635","messages":"28636","suppressedMessages":"28637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28638","messages":"28639","suppressedMessages":"28640","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28641","messages":"28642","suppressedMessages":"28643","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28644","messages":"28645","suppressedMessages":"28646","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"1q4d2bs",{"filePath":"28647","messages":"28648","suppressedMessages":"28649","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28650","messages":"28651","suppressedMessages":"28652","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28653","messages":"28654","suppressedMessages":"28655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28656","messages":"28657","suppressedMessages":"28658","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28659","messages":"28660","suppressedMessages":"28661","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28662","messages":"28663","suppressedMessages":"28664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28665","messages":"28666","suppressedMessages":"28667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28668","messages":"28669","suppressedMessages":"28670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28671","messages":"28672","suppressedMessages":"28673","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28674","messages":"28675","suppressedMessages":"28676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28677","messages":"28678","suppressedMessages":"28679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28680","messages":"28681","suppressedMessages":"28682","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28683","messages":"28684","suppressedMessages":"28685","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28686","messages":"28687","suppressedMessages":"28688","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28689","messages":"28690","suppressedMessages":"28691","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28692","messages":"28693","suppressedMessages":"28694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28695","messages":"28696","suppressedMessages":"28697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28698","messages":"28699","suppressedMessages":"28700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28701","messages":"28702","suppressedMessages":"28703","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28704","messages":"28705","suppressedMessages":"28706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28707","messages":"28708","suppressedMessages":"28709","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28710","messages":"28711","suppressedMessages":"28712","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28713","messages":"28714","suppressedMessages":"28715","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28716","messages":"28717","suppressedMessages":"28718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28719","messages":"28720","suppressedMessages":"28721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28722","messages":"28723","suppressedMessages":"28724","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28725","messages":"28726","suppressedMessages":"28727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28728","messages":"28729","suppressedMessages":"28730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28731","messages":"28732","suppressedMessages":"28733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28734","messages":"28735","suppressedMessages":"28736","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28737","messages":"28738","suppressedMessages":"28739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28740","messages":"28741","suppressedMessages":"28742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28743","messages":"28744","suppressedMessages":"28745","errorCount":23,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28746","messages":"28747","suppressedMessages":"28748","errorCount":39,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28749","messages":"28750","suppressedMessages":"28751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28752","messages":"28753","suppressedMessages":"28754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28755","messages":"28756","suppressedMessages":"28757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28758","messages":"28759","suppressedMessages":"28760","errorCount":20,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28761","messages":"28762","suppressedMessages":"28763","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28764","messages":"28765","suppressedMessages":"28766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28767","messages":"28768","suppressedMessages":"28769","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28770","messages":"28771","suppressedMessages":"28772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28773","messages":"28774","suppressedMessages":"28775","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28776","messages":"28777","suppressedMessages":"28778","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28779","messages":"28780","suppressedMessages":"28781","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28782","messages":"28783","suppressedMessages":"28784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28785","messages":"28786","suppressedMessages":"28787","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28788","messages":"28789","suppressedMessages":"28790","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28791","messages":"28792","suppressedMessages":"28793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28794","messages":"28795","suppressedMessages":"28796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28797","messages":"28798","suppressedMessages":"28799","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28800","messages":"28801","suppressedMessages":"28802","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28803","messages":"28804","suppressedMessages":"28805","errorCount":22,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28806","messages":"28807","suppressedMessages":"28808","errorCount":29,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28809","messages":"28810","suppressedMessages":"28811","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28812","messages":"28813","suppressedMessages":"28814","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28815","messages":"28816","suppressedMessages":"28817","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28818","messages":"28819","suppressedMessages":"28820","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28821","messages":"28822","suppressedMessages":"28823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28824","messages":"28825","suppressedMessages":"28826","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28827","messages":"28828","suppressedMessages":"28829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28830","messages":"28831","suppressedMessages":"28832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28833","messages":"28834","suppressedMessages":"28835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28836","messages":"28837","suppressedMessages":"28838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28839","messages":"28840","suppressedMessages":"28841","errorCount":19,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28842","messages":"28843","suppressedMessages":"28844","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28845","messages":"28846","suppressedMessages":"28847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28848","messages":"28849","suppressedMessages":"28850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28851","messages":"28852","suppressedMessages":"28853","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28854","messages":"28855","suppressedMessages":"28856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28857","messages":"28858","suppressedMessages":"28859","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28860","messages":"28861","suppressedMessages":"28862","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28863","messages":"28864","suppressedMessages":"28865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28866","messages":"28867","suppressedMessages":"28868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28869","messages":"28870","suppressedMessages":"28871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28872","messages":"28873","suppressedMessages":"28874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28875","messages":"28876","suppressedMessages":"28877","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28878","messages":"28879","suppressedMessages":"28880","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28881","messages":"28882","suppressedMessages":"28883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28884","messages":"28885","suppressedMessages":"28886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28887","messages":"28888","suppressedMessages":"28889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28890","messages":"28891","suppressedMessages":"28892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28893","messages":"28894","suppressedMessages":"28895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28896","messages":"28897","suppressedMessages":"28898","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28899","messages":"28900","suppressedMessages":"28901","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28902","messages":"28903","suppressedMessages":"28904","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28905","messages":"28906","suppressedMessages":"28907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28908","messages":"28909","suppressedMessages":"28910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28911","messages":"28912","suppressedMessages":"28913","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28914","messages":"28915","suppressedMessages":"28916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28917","messages":"28918","suppressedMessages":"28919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28920","messages":"28921","suppressedMessages":"28922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28923","messages":"28924","suppressedMessages":"28925","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28926","messages":"28927","suppressedMessages":"28928","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28929","messages":"28930","suppressedMessages":"28931","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28932","messages":"28933","suppressedMessages":"28934","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28935","messages":"28936","suppressedMessages":"28937","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28938","messages":"28939","suppressedMessages":"28940","errorCount":13,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28941","messages":"28942","suppressedMessages":"28943","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28944","messages":"28945","suppressedMessages":"28946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28947","messages":"28948","suppressedMessages":"28949","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28950","messages":"28951","suppressedMessages":"28952","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28953","messages":"28954","suppressedMessages":"28955","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28956","messages":"28957","suppressedMessages":"28958","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28959","messages":"28960","suppressedMessages":"28961","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28962","messages":"28963","suppressedMessages":"28964","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28965","messages":"28966","suppressedMessages":"28967","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28968","messages":"28969","suppressedMessages":"28970","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28971","messages":"28972","suppressedMessages":"28973","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28974","messages":"28975","suppressedMessages":"28976","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28977","messages":"28978","suppressedMessages":"28979","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28980","messages":"28981","suppressedMessages":"28982","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28983","messages":"28984","suppressedMessages":"28985","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28986","messages":"28987","suppressedMessages":"28988","errorCount":19,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"28989","messages":"28990","suppressedMessages":"28991","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28992","messages":"28993","suppressedMessages":"28994","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28995","messages":"28996","suppressedMessages":"28997","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28998","messages":"28999","suppressedMessages":"29000","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29001","messages":"29002","suppressedMessages":"29003","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29004","messages":"29005","suppressedMessages":"29006","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29007","messages":"29008","suppressedMessages":"29009","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29010","messages":"29011","suppressedMessages":"29012","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29013","messages":"29014","suppressedMessages":"29015","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29016","messages":"29017","suppressedMessages":"29018","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29019","messages":"29020","suppressedMessages":"29021","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29022","messages":"29023","suppressedMessages":"29024","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29025","messages":"29026","suppressedMessages":"29027","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29028","messages":"29029","suppressedMessages":"29030","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29031","messages":"29032","suppressedMessages":"29033","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29034","messages":"29035","suppressedMessages":"29036","errorCount":14,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29037","messages":"29038","suppressedMessages":"29039","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29040","messages":"29041","suppressedMessages":"29042","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29043","messages":"29044","suppressedMessages":"29045","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29046","messages":"29047","suppressedMessages":"29048","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29049","messages":"29050","suppressedMessages":"29051","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29052","messages":"29053","suppressedMessages":"29054","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29055","messages":"29056","suppressedMessages":"29057","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29058","messages":"29059","suppressedMessages":"29060","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29061","messages":"29062","suppressedMessages":"29063","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29064","messages":"29065","suppressedMessages":"29066","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29067","messages":"29068","suppressedMessages":"29069","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29070","messages":"29071","suppressedMessages":"29072","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29073","messages":"29074","suppressedMessages":"29075","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29076","messages":"29077","suppressedMessages":"29078","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29079","messages":"29080","suppressedMessages":"29081","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29082","messages":"29083","suppressedMessages":"29084","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29085","messages":"29086","suppressedMessages":"29087","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29088","messages":"29089","suppressedMessages":"29090","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29091","messages":"29092","suppressedMessages":"29093","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29094","messages":"29095","suppressedMessages":"29096","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29097","messages":"29098","suppressedMessages":"29099","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29100","messages":"29101","suppressedMessages":"29102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29103","messages":"29104","suppressedMessages":"29105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29106","messages":"29107","suppressedMessages":"29108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29109","messages":"29110","suppressedMessages":"29111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29112","messages":"29113","suppressedMessages":"29114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29115","messages":"29116","suppressedMessages":"29117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29118","messages":"29119","suppressedMessages":"29120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29121","messages":"29122","suppressedMessages":"29123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29124","messages":"29125","suppressedMessages":"29126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29127","messages":"29128","suppressedMessages":"29129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29130","messages":"29131","suppressedMessages":"29132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29133","messages":"29134","suppressedMessages":"29135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29136","messages":"29137","suppressedMessages":"29138","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29139","messages":"29140","suppressedMessages":"29141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29142","messages":"29143","suppressedMessages":"29144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29145","messages":"29146","suppressedMessages":"29147","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29148","messages":"29149","suppressedMessages":"29150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29151","messages":"29152","suppressedMessages":"29153","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29154","messages":"29155","suppressedMessages":"29156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29157","messages":"29158","suppressedMessages":"29159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29160","messages":"29161","suppressedMessages":"29162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29163","messages":"29164","suppressedMessages":"29165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29166","messages":"29167","suppressedMessages":"29168","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29169","messages":"29170","suppressedMessages":"29171","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29172","messages":"29173","suppressedMessages":"29174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29175","messages":"29176","suppressedMessages":"29177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29178","messages":"29179","suppressedMessages":"29180","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29181","messages":"29182","suppressedMessages":"29183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29184","messages":"29185","suppressedMessages":"29186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29187","messages":"29188","suppressedMessages":"29189","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29190","messages":"29191","suppressedMessages":"29192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29193","messages":"29194","suppressedMessages":"29195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29196","messages":"29197","suppressedMessages":"29198","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29199","messages":"29200","suppressedMessages":"29201","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29202","messages":"29203","suppressedMessages":"29204","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29205","messages":"29206","suppressedMessages":"29207","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29208","messages":"29209","suppressedMessages":"29210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29211","messages":"29212","suppressedMessages":"29213","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29214","messages":"29215","suppressedMessages":"29216","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29217","messages":"29218","suppressedMessages":"29219","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29220","messages":"29221","suppressedMessages":"29222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29223","messages":"29224","suppressedMessages":"29225","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29226","messages":"29227","suppressedMessages":"29228","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29229","messages":"29230","suppressedMessages":"29231","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29232","messages":"29233","suppressedMessages":"29234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29235","messages":"29236","suppressedMessages":"29237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29238","messages":"29239","suppressedMessages":"29240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29241","messages":"29242","suppressedMessages":"29243","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29244","messages":"29245","suppressedMessages":"29246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29247","messages":"29248","suppressedMessages":"29249","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29250","messages":"29251","suppressedMessages":"29252","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29253","messages":"29254","suppressedMessages":"29255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29256","messages":"29257","suppressedMessages":"29258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29259","messages":"29260","suppressedMessages":"29261","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29262","messages":"29263","suppressedMessages":"29264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29265","messages":"29266","suppressedMessages":"29267","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29268","messages":"29269","suppressedMessages":"29270","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29271","messages":"29272","suppressedMessages":"29273","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29274","messages":"29275","suppressedMessages":"29276","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29277","messages":"29278","suppressedMessages":"29279","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29280","messages":"29281","suppressedMessages":"29282","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29283","messages":"29284","suppressedMessages":"29285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29286","messages":"29287","suppressedMessages":"29288","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29289","messages":"29290","suppressedMessages":"29291","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29292","messages":"29293","suppressedMessages":"29294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29295","messages":"29296","suppressedMessages":"29297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29298","messages":"29299","suppressedMessages":"29300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29301","messages":"29302","suppressedMessages":"29303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29304","messages":"29305","suppressedMessages":"29306","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29307","messages":"29308","suppressedMessages":"29309","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29310","messages":"29311","suppressedMessages":"29312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29313","messages":"29314","suppressedMessages":"29315","errorCount":11,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29316","messages":"29317","suppressedMessages":"29318","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29319","messages":"29320","suppressedMessages":"29321","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29322","messages":"29323","suppressedMessages":"29324","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29325","messages":"29326","suppressedMessages":"29327","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29328","messages":"29329","suppressedMessages":"29330","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29331","messages":"29332","suppressedMessages":"29333","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29334","messages":"29335","suppressedMessages":"29336","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29337","messages":"29338","suppressedMessages":"29339","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29340","messages":"29341","suppressedMessages":"29342","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29343","messages":"29344","suppressedMessages":"29345","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29346","messages":"29347","suppressedMessages":"29348","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29349","messages":"29350","suppressedMessages":"29351","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29352","messages":"29353","suppressedMessages":"29354","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29355","messages":"29356","suppressedMessages":"29357","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29358","messages":"29359","suppressedMessages":"29360","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29361","messages":"29362","suppressedMessages":"29363","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29364","messages":"29365","suppressedMessages":"29366","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29367","messages":"29368","suppressedMessages":"29369","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29370","messages":"29371","suppressedMessages":"29372","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29373","messages":"29374","suppressedMessages":"29375","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29376","messages":"29377","suppressedMessages":"29378","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29379","messages":"29380","suppressedMessages":"29381","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29382","messages":"29383","suppressedMessages":"29384","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29385","messages":"29386","suppressedMessages":"29387","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29388","messages":"29389","suppressedMessages":"29390","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29391","messages":"29392","suppressedMessages":"29393","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29394","messages":"29395","suppressedMessages":"29396","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29397","messages":"29398","suppressedMessages":"29399","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29400","messages":"29401","suppressedMessages":"29402","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29403","messages":"29404","suppressedMessages":"29405","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29406","messages":"29407","suppressedMessages":"29408","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29409","messages":"29410","suppressedMessages":"29411","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29412","messages":"29413","suppressedMessages":"29414","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29415","messages":"29416","suppressedMessages":"29417","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29418","messages":"29419","suppressedMessages":"29420","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29421","messages":"29422","suppressedMessages":"29423","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29424","messages":"29425","suppressedMessages":"29426","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29427","messages":"29428","suppressedMessages":"29429","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29430","messages":"29431","suppressedMessages":"29432","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29433","messages":"29434","suppressedMessages":"29435","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29436","messages":"29437","suppressedMessages":"29438","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29439","messages":"29440","suppressedMessages":"29441","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29442","messages":"29443","suppressedMessages":"29444","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29445","messages":"29446","suppressedMessages":"29447","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29448","messages":"29449","suppressedMessages":"29450","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29451","messages":"29452","suppressedMessages":"29453","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29454","messages":"29455","suppressedMessages":"29456","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29457","messages":"29458","suppressedMessages":"29459","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29460","messages":"29461","suppressedMessages":"29462","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29463","messages":"29464","suppressedMessages":"29465","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29466","messages":"29467","suppressedMessages":"29468","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29469","messages":"29470","suppressedMessages":"29471","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29472","messages":"29473","suppressedMessages":"29474","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29475","messages":"29476","suppressedMessages":"29477","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29478","messages":"29479","suppressedMessages":"29480","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29481","messages":"29482","suppressedMessages":"29483","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29484","messages":"29485","suppressedMessages":"29486","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29487","messages":"29488","suppressedMessages":"29489","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29490","messages":"29491","suppressedMessages":"29492","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29493","messages":"29494","suppressedMessages":"29495","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29496","messages":"29497","suppressedMessages":"29498","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29499","messages":"29500","suppressedMessages":"29501","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29502","messages":"29503","suppressedMessages":"29504","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29505","messages":"29506","suppressedMessages":"29507","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29508","messages":"29509","suppressedMessages":"29510","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29511","messages":"29512","suppressedMessages":"29513","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29514","messages":"29515","suppressedMessages":"29516","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29517","messages":"29518","suppressedMessages":"29519","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29520","messages":"29521","suppressedMessages":"29522","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29523","messages":"29524","suppressedMessages":"29525","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29526","messages":"29527","suppressedMessages":"29528","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29529","messages":"29530","suppressedMessages":"29531","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29532","messages":"29533","suppressedMessages":"29534","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29535","messages":"29536","suppressedMessages":"29537","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29538","messages":"29539","suppressedMessages":"29540","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29541","messages":"29542","suppressedMessages":"29543","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29544","messages":"29545","suppressedMessages":"29546","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29547","messages":"29548","suppressedMessages":"29549","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29550","messages":"29551","suppressedMessages":"29552","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29553","messages":"29554","suppressedMessages":"29555","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29556","messages":"29557","suppressedMessages":"29558","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29559","messages":"29560","suppressedMessages":"29561","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29562","messages":"29563","suppressedMessages":"29564","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29565","messages":"29566","suppressedMessages":"29567","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29568","messages":"29569","suppressedMessages":"29570","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29571","messages":"29572","suppressedMessages":"29573","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29574","messages":"29575","suppressedMessages":"29576","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29577","messages":"29578","suppressedMessages":"29579","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29580","messages":"29581","suppressedMessages":"29582","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29583","messages":"29584","suppressedMessages":"29585","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29586","messages":"29587","suppressedMessages":"29588","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29589","messages":"29590","suppressedMessages":"29591","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29592","messages":"29593","suppressedMessages":"29594","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29595","messages":"29596","suppressedMessages":"29597","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29598","messages":"29599","suppressedMessages":"29600","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29601","messages":"29602","suppressedMessages":"29603","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29604","messages":"29605","suppressedMessages":"29606","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29607","messages":"29608","suppressedMessages":"29609","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29610","messages":"29611","suppressedMessages":"29612","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29613","messages":"29614","suppressedMessages":"29615","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29616","messages":"29617","suppressedMessages":"29618","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29619","messages":"29620","suppressedMessages":"29621","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29622","messages":"29623","suppressedMessages":"29624","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29625","messages":"29626","suppressedMessages":"29627","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29628","messages":"29629","suppressedMessages":"29630","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29631","messages":"29632","suppressedMessages":"29633","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29634","messages":"29635","suppressedMessages":"29636","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29637","messages":"29638","suppressedMessages":"29639","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29640","messages":"29641","suppressedMessages":"29642","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29643","messages":"29644","suppressedMessages":"29645","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29646","messages":"29647","suppressedMessages":"29648","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29649","messages":"29650","suppressedMessages":"29651","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29652","messages":"29653","suppressedMessages":"29654","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29655","messages":"29656","suppressedMessages":"29657","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29658","messages":"29659","suppressedMessages":"29660","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29661","messages":"29662","suppressedMessages":"29663","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29664","messages":"29665","suppressedMessages":"29666","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29667","messages":"29668","suppressedMessages":"29669","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29670","messages":"29671","suppressedMessages":"29672","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29673","messages":"29674","suppressedMessages":"29675","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29676","messages":"29677","suppressedMessages":"29678","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29679","messages":"29680","suppressedMessages":"29681","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29682","messages":"29683","suppressedMessages":"29684","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29685","messages":"29686","suppressedMessages":"29687","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29688","messages":"29689","suppressedMessages":"29690","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29691","messages":"29692","suppressedMessages":"29693","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29694","messages":"29695","suppressedMessages":"29696","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29697","messages":"29698","suppressedMessages":"29699","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29700","messages":"29701","suppressedMessages":"29702","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29703","messages":"29704","suppressedMessages":"29705","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29706","messages":"29707","suppressedMessages":"29708","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29709","messages":"29710","suppressedMessages":"29711","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29712","messages":"29713","suppressedMessages":"29714","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29715","messages":"29716","suppressedMessages":"29717","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29718","messages":"29719","suppressedMessages":"29720","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29721","messages":"29722","suppressedMessages":"29723","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29724","messages":"29725","suppressedMessages":"29726","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29727","messages":"29728","suppressedMessages":"29729","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29730","messages":"29731","suppressedMessages":"29732","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29733","messages":"29734","suppressedMessages":"29735","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29736","messages":"29737","suppressedMessages":"29738","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29739","messages":"29740","suppressedMessages":"29741","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29742","messages":"29743","suppressedMessages":"29744","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29745","messages":"29746","suppressedMessages":"29747","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29748","messages":"29749","suppressedMessages":"29750","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29751","messages":"29752","suppressedMessages":"29753","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29754","messages":"29755","suppressedMessages":"29756","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29757","messages":"29758","suppressedMessages":"29759","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29760","messages":"29761","suppressedMessages":"29762","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29763","messages":"29764","suppressedMessages":"29765","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29766","messages":"29767","suppressedMessages":"29768","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29769","messages":"29770","suppressedMessages":"29771","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29772","messages":"29773","suppressedMessages":"29774","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29775","messages":"29776","suppressedMessages":"29777","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29778","messages":"29779","suppressedMessages":"29780","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29781","messages":"29782","suppressedMessages":"29783","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29784","messages":"29785","suppressedMessages":"29786","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29787","messages":"29788","suppressedMessages":"29789","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29790","messages":"29791","suppressedMessages":"29792","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29793","messages":"29794","suppressedMessages":"29795","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29796","messages":"29797","suppressedMessages":"29798","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29799","messages":"29800","suppressedMessages":"29801","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29802","messages":"29803","suppressedMessages":"29804","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29805","messages":"29806","suppressedMessages":"29807","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29808","messages":"29809","suppressedMessages":"29810","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29811","messages":"29812","suppressedMessages":"29813","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29814","messages":"29815","suppressedMessages":"29816","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29817","messages":"29818","suppressedMessages":"29819","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29820","messages":"29821","suppressedMessages":"29822","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29823","messages":"29824","suppressedMessages":"29825","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29826","messages":"29827","suppressedMessages":"29828","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29829","messages":"29830","suppressedMessages":"29831","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29832","messages":"29833","suppressedMessages":"29834","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29835","messages":"29836","suppressedMessages":"29837","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29838","messages":"29839","suppressedMessages":"29840","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29841","messages":"29842","suppressedMessages":"29843","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29844","messages":"29845","suppressedMessages":"29846","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29847","messages":"29848","suppressedMessages":"29849","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29850","messages":"29851","suppressedMessages":"29852","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29853","messages":"29854","suppressedMessages":"29855","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29856","messages":"29857","suppressedMessages":"29858","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29859","messages":"29860","suppressedMessages":"29861","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29862","messages":"29863","suppressedMessages":"29864","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29865","messages":"29866","suppressedMessages":"29867","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29868","messages":"29869","suppressedMessages":"29870","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29871","messages":"29872","suppressedMessages":"29873","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29874","messages":"29875","suppressedMessages":"29876","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29877","messages":"29878","suppressedMessages":"29879","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29880","messages":"29881","suppressedMessages":"29882","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29883","messages":"29884","suppressedMessages":"29885","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29886","messages":"29887","suppressedMessages":"29888","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29889","messages":"29890","suppressedMessages":"29891","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29892","messages":"29893","suppressedMessages":"29894","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29895","messages":"29896","suppressedMessages":"29897","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29898","messages":"29899","suppressedMessages":"29900","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29901","messages":"29902","suppressedMessages":"29903","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29904","messages":"29905","suppressedMessages":"29906","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29907","messages":"29908","suppressedMessages":"29909","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29910","messages":"29911","suppressedMessages":"29912","errorCount":11,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29913","messages":"29914","suppressedMessages":"29915","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29916","messages":"29917","suppressedMessages":"29918","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29919","messages":"29920","suppressedMessages":"29921","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29922","messages":"29923","suppressedMessages":"29924","errorCount":11,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29925","messages":"29926","suppressedMessages":"29927","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29928","messages":"29929","suppressedMessages":"29930","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29931","messages":"29932","suppressedMessages":"29933","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29934","messages":"29935","suppressedMessages":"29936","errorCount":15,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"29937","messages":"29938","suppressedMessages":"29939","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29940","messages":"29941","suppressedMessages":"29942","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29943","messages":"29944","suppressedMessages":"29945","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29946","messages":"29947","suppressedMessages":"29948","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29949","messages":"29950","suppressedMessages":"29951","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29952","messages":"29953","suppressedMessages":"29954","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29955","messages":"29956","suppressedMessages":"29957","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29958","messages":"29959","suppressedMessages":"29960","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29961","messages":"29962","suppressedMessages":"29963","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29964","messages":"29965","suppressedMessages":"29966","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29967","messages":"29968","suppressedMessages":"29969","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29970","messages":"29971","suppressedMessages":"29972","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29973","messages":"29974","suppressedMessages":"29975","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29976","messages":"29977","suppressedMessages":"29978","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29979","messages":"29980","suppressedMessages":"29981","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29982","messages":"29983","suppressedMessages":"29984","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29985","messages":"29986","suppressedMessages":"29987","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29988","messages":"29989","suppressedMessages":"29990","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29991","messages":"29992","suppressedMessages":"29993","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29994","messages":"29995","suppressedMessages":"29996","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"29997","messages":"29998","suppressedMessages":"29999","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30000","messages":"30001","suppressedMessages":"30002","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30003","messages":"30004","suppressedMessages":"30005","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30006","messages":"30007","suppressedMessages":"30008","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30009","messages":"30010","suppressedMessages":"30011","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30012","messages":"30013","suppressedMessages":"30014","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30015","messages":"30016","suppressedMessages":"30017","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30018","messages":"30019","suppressedMessages":"30020","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30021","messages":"30022","suppressedMessages":"30023","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30024","messages":"30025","suppressedMessages":"30026","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30027","messages":"30028","suppressedMessages":"30029","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30030","messages":"30031","suppressedMessages":"30032","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30033","messages":"30034","suppressedMessages":"30035","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30036","messages":"30037","suppressedMessages":"30038","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30039","messages":"30040","suppressedMessages":"30041","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30042","messages":"30043","suppressedMessages":"30044","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30045","messages":"30046","suppressedMessages":"30047","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30048","messages":"30049","suppressedMessages":"30050","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30051","messages":"30052","suppressedMessages":"30053","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30054","messages":"30055","suppressedMessages":"30056","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30057","messages":"30058","suppressedMessages":"30059","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30060","messages":"30061","suppressedMessages":"30062","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30063","messages":"30064","suppressedMessages":"30065","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30066","messages":"30067","suppressedMessages":"30068","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30069","messages":"30070","suppressedMessages":"30071","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30072","messages":"30073","suppressedMessages":"30074","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30075","messages":"30076","suppressedMessages":"30077","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30078","messages":"30079","suppressedMessages":"30080","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30081","messages":"30082","suppressedMessages":"30083","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30084","messages":"30085","suppressedMessages":"30086","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30087","messages":"30088","suppressedMessages":"30089","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30090","messages":"30091","suppressedMessages":"30092","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30093","messages":"30094","suppressedMessages":"30095","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30096","messages":"30097","suppressedMessages":"30098","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30099","messages":"30100","suppressedMessages":"30101","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30102","messages":"30103","suppressedMessages":"30104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30105","messages":"30106","suppressedMessages":"30107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30108","messages":"30109","suppressedMessages":"30110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30111","messages":"30112","suppressedMessages":"30113","errorCount":21,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30114","messages":"30115","suppressedMessages":"30116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30117","messages":"30118","suppressedMessages":"30119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30120","messages":"30121","suppressedMessages":"30122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30123","messages":"30124","suppressedMessages":"30125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30126","messages":"30127","suppressedMessages":"30128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30129","messages":"30130","suppressedMessages":"30131","errorCount":48,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30132","messages":"30133","suppressedMessages":"30134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30135","messages":"30136","suppressedMessages":"30137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30138","messages":"30139","suppressedMessages":"30140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30141","messages":"30142","suppressedMessages":"30143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30144","messages":"30145","suppressedMessages":"30146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30147","messages":"30148","suppressedMessages":"30149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30150","messages":"30151","suppressedMessages":"30152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30153","messages":"30154","suppressedMessages":"30155","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30156","messages":"30157","suppressedMessages":"30158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30159","messages":"30160","suppressedMessages":"30161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30162","messages":"30163","suppressedMessages":"30164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30165","messages":"30166","suppressedMessages":"30167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30168","messages":"30169","suppressedMessages":"30170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30171","messages":"30172","suppressedMessages":"30173","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30174","messages":"30175","suppressedMessages":"30176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30177","messages":"30178","suppressedMessages":"30179","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30180","messages":"30181","suppressedMessages":"30182","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30183","messages":"30184","suppressedMessages":"30185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30186","messages":"30187","suppressedMessages":"30188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30189","messages":"30190","suppressedMessages":"30191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30192","messages":"30193","suppressedMessages":"30194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30195","messages":"30196","suppressedMessages":"30197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30198","messages":"30199","suppressedMessages":"30200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30201","messages":"30202","suppressedMessages":"30203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30204","messages":"30205","suppressedMessages":"30206","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30207","messages":"30208","suppressedMessages":"30209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30210","messages":"30211","suppressedMessages":"30212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30213","messages":"30214","suppressedMessages":"30215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30216","messages":"30217","suppressedMessages":"30218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30219","messages":"30220","suppressedMessages":"30221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30222","messages":"30223","suppressedMessages":"30224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30225","messages":"30226","suppressedMessages":"30227","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30228","messages":"30229","suppressedMessages":"30230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30231","messages":"30232","suppressedMessages":"30233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30234","messages":"30235","suppressedMessages":"30236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30237","messages":"30238","suppressedMessages":"30239","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30240","messages":"30241","suppressedMessages":"30242","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30243","messages":"30244","suppressedMessages":"30245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30246","messages":"30247","suppressedMessages":"30248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30249","messages":"30250","suppressedMessages":"30251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30252","messages":"30253","suppressedMessages":"30254","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30255","messages":"30256","suppressedMessages":"30257","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30258","messages":"30259","suppressedMessages":"30260","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30261","messages":"30262","suppressedMessages":"30263","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30264","messages":"30265","suppressedMessages":"30266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30267","messages":"30268","suppressedMessages":"30269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30270","messages":"30271","suppressedMessages":"30272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30273","messages":"30274","suppressedMessages":"30275","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30276","messages":"30277","suppressedMessages":"30278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30279","messages":"30280","suppressedMessages":"30281","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30282","messages":"30283","suppressedMessages":"30284","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30285","messages":"30286","suppressedMessages":"30287","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30288","messages":"30289","suppressedMessages":"30290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30291","messages":"30292","suppressedMessages":"30293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30294","messages":"30295","suppressedMessages":"30296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30297","messages":"30298","suppressedMessages":"30299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30300","messages":"30301","suppressedMessages":"30302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30303","messages":"30304","suppressedMessages":"30305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30306","messages":"30307","suppressedMessages":"30308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30309","messages":"30310","suppressedMessages":"30311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30312","messages":"30313","suppressedMessages":"30314","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30315","messages":"30316","suppressedMessages":"30317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30318","messages":"30319","suppressedMessages":"30320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30321","messages":"30322","suppressedMessages":"30323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30324","messages":"30325","suppressedMessages":"30326","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30327","messages":"30328","suppressedMessages":"30329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30330","messages":"30331","suppressedMessages":"30332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30333","messages":"30334","suppressedMessages":"30335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30336","messages":"30337","suppressedMessages":"30338","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30339","messages":"30340","suppressedMessages":"30341","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30342","messages":"30343","suppressedMessages":"30344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30345","messages":"30346","suppressedMessages":"30347","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30348","messages":"30349","suppressedMessages":"30350","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30351","messages":"30352","suppressedMessages":"30353","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30354","messages":"30355","suppressedMessages":"30356","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30357","messages":"30358","suppressedMessages":"30359","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30360","messages":"30361","suppressedMessages":"30362","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30363","messages":"30364","suppressedMessages":"30365","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30366","messages":"30367","suppressedMessages":"30368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30369","messages":"30370","suppressedMessages":"30371","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30372","messages":"30373","suppressedMessages":"30374","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30375","messages":"30376","suppressedMessages":"30377","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30378","messages":"30379","suppressedMessages":"30380","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30381","messages":"30382","suppressedMessages":"30383","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30384","messages":"30385","suppressedMessages":"30386","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30387","messages":"30388","suppressedMessages":"30389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30390","messages":"30391","suppressedMessages":"30392","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30393","messages":"30394","suppressedMessages":"30395","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30396","messages":"30397","suppressedMessages":"30398","errorCount":43,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30399","messages":"30400","suppressedMessages":"30401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30402","messages":"30403","suppressedMessages":"30404","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30405","messages":"30406","suppressedMessages":"30407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30408","messages":"30409","suppressedMessages":"30410","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30411","messages":"30412","suppressedMessages":"30413","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30414","messages":"30415","suppressedMessages":"30416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30417","messages":"30418","suppressedMessages":"30419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30420","messages":"30421","suppressedMessages":"30422","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30423","messages":"30424","suppressedMessages":"30425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30426","messages":"30427","suppressedMessages":"30428","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30429","messages":"30430","suppressedMessages":"30431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30432","messages":"30433","suppressedMessages":"30434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30435","messages":"30436","suppressedMessages":"30437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30438","messages":"30439","suppressedMessages":"30440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30441","messages":"30442","suppressedMessages":"30443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30444","messages":"30445","suppressedMessages":"30446","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30447","messages":"30448","suppressedMessages":"30449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30450","messages":"30451","suppressedMessages":"30452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30453","messages":"30454","suppressedMessages":"30455","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30456","messages":"30457","suppressedMessages":"30458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30459","messages":"30460","suppressedMessages":"30461","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30462","messages":"30463","suppressedMessages":"30464","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30465","messages":"30466","suppressedMessages":"30467","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30468","messages":"30469","suppressedMessages":"30470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30471","messages":"30472","suppressedMessages":"30473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30474","messages":"30475","suppressedMessages":"30476","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30477","messages":"30478","suppressedMessages":"30479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30480","messages":"30481","suppressedMessages":"30482","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30483","messages":"30484","suppressedMessages":"30485","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30486","messages":"30487","suppressedMessages":"30488","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30489","messages":"30490","suppressedMessages":"30491","errorCount":31,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30492","messages":"30493","suppressedMessages":"30494","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30495","messages":"30496","suppressedMessages":"30497","errorCount":37,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30498","messages":"30499","suppressedMessages":"30500","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30501","messages":"30502","suppressedMessages":"30503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30504","messages":"30505","suppressedMessages":"30506","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30507","messages":"30508","suppressedMessages":"30509","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30510","messages":"30511","suppressedMessages":"30512","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30513","messages":"30514","suppressedMessages":"30515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30516","messages":"30517","suppressedMessages":"30518","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30519","messages":"30520","suppressedMessages":"30521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30522","messages":"30523","suppressedMessages":"30524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30525","messages":"30526","suppressedMessages":"30527","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30528","messages":"30529","suppressedMessages":"30530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30531","messages":"30532","suppressedMessages":"30533","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30534","messages":"30535","suppressedMessages":"30536","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30537","messages":"30538","suppressedMessages":"30539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30540","messages":"30541","suppressedMessages":"30542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30543","messages":"30544","suppressedMessages":"30545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30546","messages":"30547","suppressedMessages":"30548","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30549","messages":"30550","suppressedMessages":"30551","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30552","messages":"30553","suppressedMessages":"30554","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30555","messages":"30556","suppressedMessages":"30557","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30558","messages":"30559","suppressedMessages":"30560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30561","messages":"30562","suppressedMessages":"30563","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30564","messages":"30565","suppressedMessages":"30566","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30567","messages":"30568","suppressedMessages":"30569","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30570","messages":"30571","suppressedMessages":"30572","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30573","messages":"30574","suppressedMessages":"30575","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30576","messages":"30577","suppressedMessages":"30578","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30579","messages":"30580","suppressedMessages":"30581","errorCount":13,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30582","messages":"30583","suppressedMessages":"30584","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30585","messages":"30586","suppressedMessages":"30587","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30588","messages":"30589","suppressedMessages":"30590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30591","messages":"30592","suppressedMessages":"30593","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30594","messages":"30595","suppressedMessages":"30596","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30597","messages":"30598","suppressedMessages":"30599","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30600","messages":"30601","suppressedMessages":"30602","errorCount":15,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30603","messages":"30604","suppressedMessages":"30605","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30606","messages":"30607","suppressedMessages":"30608","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30609","messages":"30610","suppressedMessages":"30611","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30612","messages":"30613","suppressedMessages":"30614","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30615","messages":"30616","suppressedMessages":"30617","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30618","messages":"30619","suppressedMessages":"30620","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30621","messages":"30622","suppressedMessages":"30623","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30624","messages":"30625","suppressedMessages":"30626","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30627","messages":"30628","suppressedMessages":"30629","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30630","messages":"30631","suppressedMessages":"30632","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30633","messages":"30634","suppressedMessages":"30635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30636","messages":"30637","suppressedMessages":"30638","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30639","messages":"30640","suppressedMessages":"30641","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30642","messages":"30643","suppressedMessages":"30644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30645","messages":"30646","suppressedMessages":"30647","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30648","messages":"30649","suppressedMessages":"30650","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30651","messages":"30652","suppressedMessages":"30653","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30654","messages":"30655","suppressedMessages":"30656","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30657","messages":"30658","suppressedMessages":"30659","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30660","messages":"30661","suppressedMessages":"30662","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30663","messages":"30664","suppressedMessages":"30665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30666","messages":"30667","suppressedMessages":"30668","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30669","messages":"30670","suppressedMessages":"30671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30672","messages":"30673","suppressedMessages":"30674","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30675","messages":"30676","suppressedMessages":"30677","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30678","messages":"30679","suppressedMessages":"30680","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30681","messages":"30682","suppressedMessages":"30683","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30684","messages":"30685","suppressedMessages":"30686","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30687","messages":"30688","suppressedMessages":"30689","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30690","messages":"30691","suppressedMessages":"30692","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30693","messages":"30694","suppressedMessages":"30695","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30696","messages":"30697","suppressedMessages":"30698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30699","messages":"30700","suppressedMessages":"30701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30702","messages":"30703","suppressedMessages":"30704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30705","messages":"30706","suppressedMessages":"30707","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30708","messages":"30709","suppressedMessages":"30710","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30711","messages":"30712","suppressedMessages":"30713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30714","messages":"30715","suppressedMessages":"30716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30717","messages":"30718","suppressedMessages":"30719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30720","messages":"30721","suppressedMessages":"30722","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30723","messages":"30724","suppressedMessages":"30725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30726","messages":"30727","suppressedMessages":"30728","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30729","messages":"30730","suppressedMessages":"30731","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30732","messages":"30733","suppressedMessages":"30734","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30735","messages":"30736","suppressedMessages":"30737","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30738","messages":"30739","suppressedMessages":"30740","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30741","messages":"30742","suppressedMessages":"30743","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30744","messages":"30745","suppressedMessages":"30746","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30747","messages":"30748","suppressedMessages":"30749","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30750","messages":"30751","suppressedMessages":"30752","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30753","messages":"30754","suppressedMessages":"30755","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30756","messages":"30757","suppressedMessages":"30758","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30759","messages":"30760","suppressedMessages":"30761","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30762","messages":"30763","suppressedMessages":"30764","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30765","messages":"30766","suppressedMessages":"30767","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30768","messages":"30769","suppressedMessages":"30770","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30771","messages":"30772","suppressedMessages":"30773","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30774","messages":"30775","suppressedMessages":"30776","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30777","messages":"30778","suppressedMessages":"30779","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30780","messages":"30781","suppressedMessages":"30782","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30783","messages":"30784","suppressedMessages":"30785","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30786","messages":"30787","suppressedMessages":"30788","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30789","messages":"30790","suppressedMessages":"30791","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30792","messages":"30793","suppressedMessages":"30794","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30795","messages":"30796","suppressedMessages":"30797","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30798","messages":"30799","suppressedMessages":"30800","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30801","messages":"30802","suppressedMessages":"30803","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30804","messages":"30805","suppressedMessages":"30806","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30807","messages":"30808","suppressedMessages":"30809","errorCount":34,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30810","messages":"30811","suppressedMessages":"30812","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30813","messages":"30814","suppressedMessages":"30815","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30816","messages":"30817","suppressedMessages":"30818","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30819","messages":"30820","suppressedMessages":"30821","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30822","messages":"30823","suppressedMessages":"30824","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30825","messages":"30826","suppressedMessages":"30827","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30828","messages":"30829","suppressedMessages":"30830","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30831","messages":"30832","suppressedMessages":"30833","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30834","messages":"30835","suppressedMessages":"30836","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30837","messages":"30838","suppressedMessages":"30839","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30840","messages":"30841","suppressedMessages":"30842","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30843","messages":"30844","suppressedMessages":"30845","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30846","messages":"30847","suppressedMessages":"30848","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30849","messages":"30850","suppressedMessages":"30851","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30852","messages":"30853","suppressedMessages":"30854","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30855","messages":"30856","suppressedMessages":"30857","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30858","messages":"30859","suppressedMessages":"30860","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30861","messages":"30862","suppressedMessages":"30863","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30864","messages":"30865","suppressedMessages":"30866","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30867","messages":"30868","suppressedMessages":"30869","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30870","messages":"30871","suppressedMessages":"30872","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30873","messages":"30874","suppressedMessages":"30875","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30876","messages":"30877","suppressedMessages":"30878","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30879","messages":"30880","suppressedMessages":"30881","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30882","messages":"30883","suppressedMessages":"30884","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30885","messages":"30886","suppressedMessages":"30887","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30888","messages":"30889","suppressedMessages":"30890","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30891","messages":"30892","suppressedMessages":"30893","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30894","messages":"30895","suppressedMessages":"30896","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30897","messages":"30898","suppressedMessages":"30899","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30900","messages":"30901","suppressedMessages":"30902","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30903","messages":"30904","suppressedMessages":"30905","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30906","messages":"30907","suppressedMessages":"30908","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30909","messages":"30910","suppressedMessages":"30911","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30912","messages":"30913","suppressedMessages":"30914","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30915","messages":"30916","suppressedMessages":"30917","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30918","messages":"30919","suppressedMessages":"30920","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30921","messages":"30922","suppressedMessages":"30923","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30924","messages":"30925","suppressedMessages":"30926","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30927","messages":"30928","suppressedMessages":"30929","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30930","messages":"30931","suppressedMessages":"30932","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30933","messages":"30934","suppressedMessages":"30935","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30936","messages":"30937","suppressedMessages":"30938","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30939","messages":"30940","suppressedMessages":"30941","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30942","messages":"30943","suppressedMessages":"30944","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30945","messages":"30946","suppressedMessages":"30947","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30948","messages":"30949","suppressedMessages":"30950","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30951","messages":"30952","suppressedMessages":"30953","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30954","messages":"30955","suppressedMessages":"30956","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30957","messages":"30958","suppressedMessages":"30959","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"30960","messages":"30961","suppressedMessages":"30962","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30963","messages":"30964","suppressedMessages":"30965","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30966","messages":"30967","suppressedMessages":"30968","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30969","messages":"30970","suppressedMessages":"30971","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30972","messages":"30973","suppressedMessages":"30974","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30975","messages":"30976","suppressedMessages":"30977","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30978","messages":"30979","suppressedMessages":"30980","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30981","messages":"30982","suppressedMessages":"30983","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30984","messages":"30985","suppressedMessages":"30986","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30987","messages":"30988","suppressedMessages":"30989","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30990","messages":"30991","suppressedMessages":"30992","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30993","messages":"30994","suppressedMessages":"30995","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30996","messages":"30997","suppressedMessages":"30998","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30999","messages":"31000","suppressedMessages":"31001","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31002","messages":"31003","suppressedMessages":"31004","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31005","messages":"31006","suppressedMessages":"31007","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31008","messages":"31009","suppressedMessages":"31010","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31011","messages":"31012","suppressedMessages":"31013","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31014","messages":"31015","suppressedMessages":"31016","errorCount":27,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31017","messages":"31018","suppressedMessages":"31019","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31020","messages":"31021","suppressedMessages":"31022","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31023","messages":"31024","suppressedMessages":"31025","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31026","messages":"31027","suppressedMessages":"31028","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31029","messages":"31030","suppressedMessages":"31031","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31032","messages":"31033","suppressedMessages":"31034","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31035","messages":"31036","suppressedMessages":"31037","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31038","messages":"31039","suppressedMessages":"31040","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31041","messages":"31042","suppressedMessages":"31043","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31044","messages":"31045","suppressedMessages":"31046","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31047","messages":"31048","suppressedMessages":"31049","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31050","messages":"31051","suppressedMessages":"31052","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31053","messages":"31054","suppressedMessages":"31055","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31056","messages":"31057","suppressedMessages":"31058","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31059","messages":"31060","suppressedMessages":"31061","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31062","messages":"31063","suppressedMessages":"31064","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31065","messages":"31066","suppressedMessages":"31067","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31068","messages":"31069","suppressedMessages":"31070","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31071","messages":"31072","suppressedMessages":"31073","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31074","messages":"31075","suppressedMessages":"31076","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31077","messages":"31078","suppressedMessages":"31079","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31080","messages":"31081","suppressedMessages":"31082","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31083","messages":"31084","suppressedMessages":"31085","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31086","messages":"31087","suppressedMessages":"31088","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31089","messages":"31090","suppressedMessages":"31091","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31092","messages":"31093","suppressedMessages":"31094","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31095","messages":"31096","suppressedMessages":"31097","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31098","messages":"31099","suppressedMessages":"31100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31101","messages":"31102","suppressedMessages":"31103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31104","messages":"31105","suppressedMessages":"31106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31107","messages":"31108","suppressedMessages":"31109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31110","messages":"31111","suppressedMessages":"31112","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31113","messages":"31114","suppressedMessages":"31115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31116","messages":"31117","suppressedMessages":"31118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31119","messages":"31120","suppressedMessages":"31121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31122","messages":"31123","suppressedMessages":"31124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31125","messages":"31126","suppressedMessages":"31127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31128","messages":"31129","suppressedMessages":"31130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31131","messages":"31132","suppressedMessages":"31133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31134","messages":"31135","suppressedMessages":"31136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31137","messages":"31138","suppressedMessages":"31139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31140","messages":"31141","suppressedMessages":"31142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31143","messages":"31144","suppressedMessages":"31145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31146","messages":"31147","suppressedMessages":"31148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31149","messages":"31150","suppressedMessages":"31151","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31152","messages":"31153","suppressedMessages":"31154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31155","messages":"31156","suppressedMessages":"31157","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31158","messages":"31159","suppressedMessages":"31160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31161","messages":"31162","suppressedMessages":"31163","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31164","messages":"31165","suppressedMessages":"31166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31167","messages":"31168","suppressedMessages":"31169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31170","messages":"31171","suppressedMessages":"31172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31173","messages":"31174","suppressedMessages":"31175","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31176","messages":"31177","suppressedMessages":"31178","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31179","messages":"31180","suppressedMessages":"31181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31182","messages":"31183","suppressedMessages":"31184","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31185","messages":"31186","suppressedMessages":"31187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31188","messages":"31189","suppressedMessages":"31190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31191","messages":"31192","suppressedMessages":"31193","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31194","messages":"31195","suppressedMessages":"31196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31197","messages":"31198","suppressedMessages":"31199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31200","messages":"31201","suppressedMessages":"31202","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31203","messages":"31204","suppressedMessages":"31205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31206","messages":"31207","suppressedMessages":"31208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31209","messages":"31210","suppressedMessages":"31211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31212","messages":"31213","suppressedMessages":"31214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31215","messages":"31216","suppressedMessages":"31217","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31218","messages":"31219","suppressedMessages":"31220","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31221","messages":"31222","suppressedMessages":"31223","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31224","messages":"31225","suppressedMessages":"31226","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31227","messages":"31228","suppressedMessages":"31229","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31230","messages":"31231","suppressedMessages":"31232","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31233","messages":"31234","suppressedMessages":"31235","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31236","messages":"31237","suppressedMessages":"31238","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31239","messages":"31240","suppressedMessages":"31241","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31242","messages":"31243","suppressedMessages":"31244","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31245","messages":"31246","suppressedMessages":"31247","errorCount":15,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31248","messages":"31249","suppressedMessages":"31250","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31251","messages":"31252","suppressedMessages":"31253","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31254","messages":"31255","suppressedMessages":"31256","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31257","messages":"31258","suppressedMessages":"31259","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31260","messages":"31261","suppressedMessages":"31262","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31263","messages":"31264","suppressedMessages":"31265","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31266","messages":"31267","suppressedMessages":"31268","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31269","messages":"31270","suppressedMessages":"31271","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31272","messages":"31273","suppressedMessages":"31274","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31275","messages":"31276","suppressedMessages":"31277","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31278","messages":"31279","suppressedMessages":"31280","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31281","messages":"31282","suppressedMessages":"31283","errorCount":18,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31284","messages":"31285","suppressedMessages":"31286","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31287","messages":"31288","suppressedMessages":"31289","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31290","messages":"31291","suppressedMessages":"31292","errorCount":11,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31293","messages":"31294","suppressedMessages":"31295","errorCount":32,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31296","messages":"31297","suppressedMessages":"31298","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31299","messages":"31300","suppressedMessages":"31301","errorCount":19,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31302","messages":"31303","suppressedMessages":"31304","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31305","messages":"31306","suppressedMessages":"31307","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31308","messages":"31309","suppressedMessages":"31310","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31311","messages":"31312","suppressedMessages":"31313","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31314","messages":"31315","suppressedMessages":"31316","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31317","messages":"31318","suppressedMessages":"31319","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31320","messages":"31321","suppressedMessages":"31322","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31323","messages":"31324","suppressedMessages":"31325","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31326","messages":"31327","suppressedMessages":"31328","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31329","messages":"31330","suppressedMessages":"31331","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31332","messages":"31333","suppressedMessages":"31334","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31335","messages":"31336","suppressedMessages":"31337","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31338","messages":"31339","suppressedMessages":"31340","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31341","messages":"31342","suppressedMessages":"31343","errorCount":22,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31344","messages":"31345","suppressedMessages":"31346","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31347","messages":"31348","suppressedMessages":"31349","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31350","messages":"31351","suppressedMessages":"31352","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31353","messages":"31354","suppressedMessages":"31355","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31356","messages":"31357","suppressedMessages":"31358","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31359","messages":"31360","suppressedMessages":"31361","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31362","messages":"31363","suppressedMessages":"31364","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31365","messages":"31366","suppressedMessages":"31367","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31368","messages":"31369","suppressedMessages":"31370","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31371","messages":"31372","suppressedMessages":"31373","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31374","messages":"31375","suppressedMessages":"31376","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31377","messages":"31378","suppressedMessages":"31379","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31380","messages":"31381","suppressedMessages":"31382","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31383","messages":"31384","suppressedMessages":"31385","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31386","messages":"31387","suppressedMessages":"31388","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31389","messages":"31390","suppressedMessages":"31391","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31392","messages":"31393","suppressedMessages":"31394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31395","messages":"31396","suppressedMessages":"31397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31398","messages":"31399","suppressedMessages":"31400","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31401","messages":"31402","suppressedMessages":"31403","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31404","messages":"31405","suppressedMessages":"31406","errorCount":18,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31407","messages":"31408","suppressedMessages":"31409","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31410","messages":"31411","suppressedMessages":"31412","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31413","messages":"31414","suppressedMessages":"31415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31416","messages":"31417","suppressedMessages":"31418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31419","messages":"31420","suppressedMessages":"31421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31422","messages":"31423","suppressedMessages":"31424","errorCount":19,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31425","messages":"31426","suppressedMessages":"31427","errorCount":18,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31428","messages":"31429","suppressedMessages":"31430","errorCount":22,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31431","messages":"31432","suppressedMessages":"31433","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31434","messages":"31435","suppressedMessages":"31436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31437","messages":"31438","suppressedMessages":"31439","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31440","messages":"31441","suppressedMessages":"31442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31443","messages":"31444","suppressedMessages":"31445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31446","messages":"31447","suppressedMessages":"31448","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31449","messages":"31450","suppressedMessages":"31451","errorCount":20,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31452","messages":"31453","suppressedMessages":"31454","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31455","messages":"31456","suppressedMessages":"31457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31458","messages":"31459","suppressedMessages":"31460","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31461","messages":"31462","suppressedMessages":"31463","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31464","messages":"31465","suppressedMessages":"31466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31467","messages":"31468","suppressedMessages":"31469","errorCount":15,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31470","messages":"31471","suppressedMessages":"31472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31473","messages":"31474","suppressedMessages":"31475","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31476","messages":"31477","suppressedMessages":"31478","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31479","messages":"31480","suppressedMessages":"31481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31482","messages":"31483","suppressedMessages":"31484","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31485","messages":"31486","suppressedMessages":"31487","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31488","messages":"31489","suppressedMessages":"31490","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31491","messages":"31492","suppressedMessages":"31493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31494","messages":"31495","suppressedMessages":"31496","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31497","messages":"31498","suppressedMessages":"31499","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31500","messages":"31501","suppressedMessages":"31502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31503","messages":"31504","suppressedMessages":"31505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31506","messages":"31507","suppressedMessages":"31508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31509","messages":"31510","suppressedMessages":"31511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31512","messages":"31513","suppressedMessages":"31514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31515","messages":"31516","suppressedMessages":"31517","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31518","messages":"31519","suppressedMessages":"31520","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31521","messages":"31522","suppressedMessages":"31523","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31524","messages":"31525","suppressedMessages":"31526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31527","messages":"31528","suppressedMessages":"31529","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31530","messages":"31531","suppressedMessages":"31532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31533","messages":"31534","suppressedMessages":"31535","errorCount":13,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31536","messages":"31537","suppressedMessages":"31538","errorCount":22,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31539","messages":"31540","suppressedMessages":"31541","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31542","messages":"31543","suppressedMessages":"31544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31545","messages":"31546","suppressedMessages":"31547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31548","messages":"31549","suppressedMessages":"31550","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31551","messages":"31552","suppressedMessages":"31553","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31554","messages":"31555","suppressedMessages":"31556","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31557","messages":"31558","suppressedMessages":"31559","errorCount":13,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31560","messages":"31561","suppressedMessages":"31562","errorCount":21,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31563","messages":"31564","suppressedMessages":"31565","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31566","messages":"31567","suppressedMessages":"31568","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31569","messages":"31570","suppressedMessages":"31571","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31572","messages":"31573","suppressedMessages":"31574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31575","messages":"31576","suppressedMessages":"31577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31578","messages":"31579","suppressedMessages":"31580","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31581","messages":"31582","suppressedMessages":"31583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31584","messages":"31585","suppressedMessages":"31586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31587","messages":"31588","suppressedMessages":"31589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31590","messages":"31591","suppressedMessages":"31592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31593","messages":"31594","suppressedMessages":"31595","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31596","messages":"31597","suppressedMessages":"31598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31599","messages":"31600","suppressedMessages":"31601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31602","messages":"31603","suppressedMessages":"31604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31605","messages":"31606","suppressedMessages":"31607","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31608","messages":"31609","suppressedMessages":"31610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31611","messages":"31612","suppressedMessages":"31613","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31614","messages":"31615","suppressedMessages":"31616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31617","messages":"31618","suppressedMessages":"31619","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31620","messages":"31621","suppressedMessages":"31622","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31623","messages":"31624","suppressedMessages":"31625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31626","messages":"31627","suppressedMessages":"31628","errorCount":23,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31629","messages":"31630","suppressedMessages":"31631","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31632","messages":"31633","suppressedMessages":"31634","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31635","messages":"31636","suppressedMessages":"31637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31638","messages":"31639","suppressedMessages":"31640","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31641","messages":"31642","suppressedMessages":"31643","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31644","messages":"31645","suppressedMessages":"31646","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31647","messages":"31648","suppressedMessages":"31649","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31650","messages":"31651","suppressedMessages":"31652","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31653","messages":"31654","suppressedMessages":"31655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31656","messages":"31657","suppressedMessages":"31658","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31659","messages":"31660","suppressedMessages":"31661","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31662","messages":"31663","suppressedMessages":"31664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31665","messages":"31666","suppressedMessages":"31667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31668","messages":"31669","suppressedMessages":"31670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31671","messages":"31672","suppressedMessages":"31673","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31674","messages":"31675","suppressedMessages":"31676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31677","messages":"31678","suppressedMessages":"31679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31680","messages":"31681","suppressedMessages":"31682","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31683","messages":"31684","suppressedMessages":"31685","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31686","messages":"31687","suppressedMessages":"31688","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31689","messages":"31690","suppressedMessages":"31691","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31692","messages":"31693","suppressedMessages":"31694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31695","messages":"31696","suppressedMessages":"31697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31698","messages":"31699","suppressedMessages":"31700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31701","messages":"31702","suppressedMessages":"31703","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31704","messages":"31705","suppressedMessages":"31706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31707","messages":"31708","suppressedMessages":"31709","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31710","messages":"31711","suppressedMessages":"31712","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31713","messages":"31714","suppressedMessages":"31715","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31716","messages":"31717","suppressedMessages":"31718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31719","messages":"31720","suppressedMessages":"31721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31722","messages":"31723","suppressedMessages":"31724","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31725","messages":"31726","suppressedMessages":"31727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31728","messages":"31729","suppressedMessages":"31730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31731","messages":"31732","suppressedMessages":"31733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31734","messages":"31735","suppressedMessages":"31736","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31737","messages":"31738","suppressedMessages":"31739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31740","messages":"31741","suppressedMessages":"31742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31743","messages":"31744","suppressedMessages":"31745","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31746","messages":"31747","suppressedMessages":"31748","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31749","messages":"31750","suppressedMessages":"31751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31752","messages":"31753","suppressedMessages":"31754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31755","messages":"31756","suppressedMessages":"31757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31758","messages":"31759","suppressedMessages":"31760","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31761","messages":"31762","suppressedMessages":"31763","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31764","messages":"31765","suppressedMessages":"31766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31767","messages":"31768","suppressedMessages":"31769","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31770","messages":"31771","suppressedMessages":"31772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31773","messages":"31774","suppressedMessages":"31775","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31776","messages":"31777","suppressedMessages":"31778","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31779","messages":"31780","suppressedMessages":"31781","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31782","messages":"31783","suppressedMessages":"31784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31785","messages":"31786","suppressedMessages":"31787","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31788","messages":"31789","suppressedMessages":"31790","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31791","messages":"31792","suppressedMessages":"31793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31794","messages":"31795","suppressedMessages":"31796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31797","messages":"31798","suppressedMessages":"31799","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31800","messages":"31801","suppressedMessages":"31802","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31803","messages":"31804","suppressedMessages":"31805","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31806","messages":"31807","suppressedMessages":"31808","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31809","messages":"31810","suppressedMessages":"31811","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31812","messages":"31813","suppressedMessages":"31814","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31815","messages":"31816","suppressedMessages":"31817","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31818","messages":"31819","suppressedMessages":"31820","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31821","messages":"31822","suppressedMessages":"31823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31824","messages":"31825","suppressedMessages":"31826","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31827","messages":"31828","suppressedMessages":"31829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31830","messages":"31831","suppressedMessages":"31832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31833","messages":"31834","suppressedMessages":"31835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31836","messages":"31837","suppressedMessages":"31838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31839","messages":"31840","suppressedMessages":"31841","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31842","messages":"31843","suppressedMessages":"31844","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31845","messages":"31846","suppressedMessages":"31847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31848","messages":"31849","suppressedMessages":"31850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31851","messages":"31852","suppressedMessages":"31853","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31854","messages":"31855","suppressedMessages":"31856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31857","messages":"31858","suppressedMessages":"31859","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31860","messages":"31861","suppressedMessages":"31862","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31863","messages":"31864","suppressedMessages":"31865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31866","messages":"31867","suppressedMessages":"31868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31869","messages":"31870","suppressedMessages":"31871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31872","messages":"31873","suppressedMessages":"31874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31875","messages":"31876","suppressedMessages":"31877","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"31878","messages":"31879","suppressedMessages":"31880","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31881","messages":"31882","suppressedMessages":"31883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31884","messages":"31885","suppressedMessages":"31886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31887","messages":"31888","suppressedMessages":"31889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31890","messages":"31891","suppressedMessages":"31892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31893","messages":"31894","suppressedMessages":"31895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31896","messages":"31897","suppressedMessages":"31898","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31899","messages":"31900","suppressedMessages":"31901","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31902","messages":"31903","suppressedMessages":"31904","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31905","messages":"31906","suppressedMessages":"31907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31908","messages":"31909","suppressedMessages":"31910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31911","messages":"31912","suppressedMessages":"31913","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31914","messages":"31915","suppressedMessages":"31916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31917","messages":"31918","suppressedMessages":"31919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31920","messages":"31921","suppressedMessages":"31922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31923","messages":"31924","suppressedMessages":"31925","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31926","messages":"31927","suppressedMessages":"31928","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31929","messages":"31930","suppressedMessages":"31931","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31932","messages":"31933","suppressedMessages":"31934","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31935","messages":"31936","suppressedMessages":"31937","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31938","messages":"31939","suppressedMessages":"31940","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31941","messages":"31942","suppressedMessages":"31943","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31944","messages":"31945","suppressedMessages":"31946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31947","messages":"31948","suppressedMessages":"31949","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31950","messages":"31951","suppressedMessages":"31952","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31953","messages":"31954","suppressedMessages":"31955","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31956","messages":"31957","suppressedMessages":"31958","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31959","messages":"31960","suppressedMessages":"31961","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31962","messages":"31963","suppressedMessages":"31964","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31965","messages":"31966","suppressedMessages":"31967","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31968","messages":"31969","suppressedMessages":"31970","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31971","messages":"31972","suppressedMessages":"31973","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31974","messages":"31975","suppressedMessages":"31976","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31977","messages":"31978","suppressedMessages":"31979","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31980","messages":"31981","suppressedMessages":"31982","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31983","messages":"31984","suppressedMessages":"31985","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31986","messages":"31987","suppressedMessages":"31988","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31989","messages":"31990","suppressedMessages":"31991","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31992","messages":"31993","suppressedMessages":"31994","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31995","messages":"31996","suppressedMessages":"31997","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"31998","messages":"31999","suppressedMessages":"32000","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32001","messages":"32002","suppressedMessages":"32003","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32004","messages":"32005","suppressedMessages":"32006","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32007","messages":"32008","suppressedMessages":"32009","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32010","messages":"32011","suppressedMessages":"32012","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32013","messages":"32014","suppressedMessages":"32015","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32016","messages":"32017","suppressedMessages":"32018","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32019","messages":"32020","suppressedMessages":"32021","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32022","messages":"32023","suppressedMessages":"32024","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32025","messages":"32026","suppressedMessages":"32027","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32028","messages":"32029","suppressedMessages":"32030","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32031","messages":"32032","suppressedMessages":"32033","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32034","messages":"32035","suppressedMessages":"32036","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32037","messages":"32038","suppressedMessages":"32039","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32040","messages":"32041","suppressedMessages":"32042","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32043","messages":"32044","suppressedMessages":"32045","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32046","messages":"32047","suppressedMessages":"32048","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32049","messages":"32050","suppressedMessages":"32051","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32052","messages":"32053","suppressedMessages":"32054","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32055","messages":"32056","suppressedMessages":"32057","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32058","messages":"32059","suppressedMessages":"32060","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32061","messages":"32062","suppressedMessages":"32063","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32064","messages":"32065","suppressedMessages":"32066","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32067","messages":"32068","suppressedMessages":"32069","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32070","messages":"32071","suppressedMessages":"32072","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32073","messages":"32074","suppressedMessages":"32075","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32076","messages":"32077","suppressedMessages":"32078","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32079","messages":"32080","suppressedMessages":"32081","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32082","messages":"32083","suppressedMessages":"32084","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32085","messages":"32086","suppressedMessages":"32087","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32088","messages":"32089","suppressedMessages":"32090","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32091","messages":"32092","suppressedMessages":"32093","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32094","messages":"32095","suppressedMessages":"32096","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32097","messages":"32098","suppressedMessages":"32099","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32100","messages":"32101","suppressedMessages":"32102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32103","messages":"32104","suppressedMessages":"32105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32106","messages":"32107","suppressedMessages":"32108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32109","messages":"32110","suppressedMessages":"32111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32112","messages":"32113","suppressedMessages":"32114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32115","messages":"32116","suppressedMessages":"32117","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32118","messages":"32119","suppressedMessages":"32120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32121","messages":"32122","suppressedMessages":"32123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32124","messages":"32125","suppressedMessages":"32126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32127","messages":"32128","suppressedMessages":"32129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32130","messages":"32131","suppressedMessages":"32132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32133","messages":"32134","suppressedMessages":"32135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32136","messages":"32137","suppressedMessages":"32138","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32139","messages":"32140","suppressedMessages":"32141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32142","messages":"32143","suppressedMessages":"32144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32145","messages":"32146","suppressedMessages":"32147","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32148","messages":"32149","suppressedMessages":"32150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32151","messages":"32152","suppressedMessages":"32153","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32154","messages":"32155","suppressedMessages":"32156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32157","messages":"32158","suppressedMessages":"32159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32160","messages":"32161","suppressedMessages":"32162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32163","messages":"32164","suppressedMessages":"32165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32166","messages":"32167","suppressedMessages":"32168","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32169","messages":"32170","suppressedMessages":"32171","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32172","messages":"32173","suppressedMessages":"32174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32175","messages":"32176","suppressedMessages":"32177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32178","messages":"32179","suppressedMessages":"32180","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32181","messages":"32182","suppressedMessages":"32183","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32184","messages":"32185","suppressedMessages":"32186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32187","messages":"32188","suppressedMessages":"32189","errorCount":18,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32190","messages":"32191","suppressedMessages":"32192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32193","messages":"32194","suppressedMessages":"32195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32196","messages":"32197","suppressedMessages":"32198","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32199","messages":"32200","suppressedMessages":"32201","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32202","messages":"32203","suppressedMessages":"32204","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32205","messages":"32206","suppressedMessages":"32207","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32208","messages":"32209","suppressedMessages":"32210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32211","messages":"32212","suppressedMessages":"32213","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32214","messages":"32215","suppressedMessages":"32216","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32217","messages":"32218","suppressedMessages":"32219","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32220","messages":"32221","suppressedMessages":"32222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32223","messages":"32224","suppressedMessages":"32225","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32226","messages":"32227","suppressedMessages":"32228","errorCount":267,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32229","messages":"32230","suppressedMessages":"32231","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32232","messages":"32233","suppressedMessages":"32234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32235","messages":"32236","suppressedMessages":"32237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32238","messages":"32239","suppressedMessages":"32240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32241","messages":"32242","suppressedMessages":"32243","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32244","messages":"32245","suppressedMessages":"32246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32247","messages":"32248","suppressedMessages":"32249","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32250","messages":"32251","suppressedMessages":"32252","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32253","messages":"32254","suppressedMessages":"32255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32256","messages":"32257","suppressedMessages":"32258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32259","messages":"32260","suppressedMessages":"32261","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32262","messages":"32263","suppressedMessages":"32264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32265","messages":"32266","suppressedMessages":"32267","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32268","messages":"32269","suppressedMessages":"32270","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32271","messages":"32272","suppressedMessages":"32273","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32274","messages":"32275","suppressedMessages":"32276","errorCount":33,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32277","messages":"32278","suppressedMessages":"32279","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32280","messages":"32281","suppressedMessages":"32282","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32283","messages":"32284","suppressedMessages":"32285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32286","messages":"32287","suppressedMessages":"32288","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32289","messages":"32290","suppressedMessages":"32291","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32292","messages":"32293","suppressedMessages":"32294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32295","messages":"32296","suppressedMessages":"32297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32298","messages":"32299","suppressedMessages":"32300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32301","messages":"32302","suppressedMessages":"32303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32304","messages":"32305","suppressedMessages":"32306","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32307","messages":"32308","suppressedMessages":"32309","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32310","messages":"32311","suppressedMessages":"32312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32313","messages":"32314","suppressedMessages":"32315","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32316","messages":"32317","suppressedMessages":"32318","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32319","messages":"32320","suppressedMessages":"32321","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32322","messages":"32323","suppressedMessages":"32324","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32325","messages":"32326","suppressedMessages":"32327","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32328","messages":"32329","suppressedMessages":"32330","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32331","messages":"32332","suppressedMessages":"32333","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32334","messages":"32335","suppressedMessages":"32336","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32337","messages":"32338","suppressedMessages":"32339","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32340","messages":"32341","suppressedMessages":"32342","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32343","messages":"32344","suppressedMessages":"32345","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32346","messages":"32347","suppressedMessages":"32348","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32349","messages":"32350","suppressedMessages":"32351","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32352","messages":"32353","suppressedMessages":"32354","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32355","messages":"32356","suppressedMessages":"32357","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32358","messages":"32359","suppressedMessages":"32360","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32361","messages":"32362","suppressedMessages":"32363","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32364","messages":"32365","suppressedMessages":"32366","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32367","messages":"32368","suppressedMessages":"32369","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32370","messages":"32371","suppressedMessages":"32372","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32373","messages":"32374","suppressedMessages":"32375","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32376","messages":"32377","suppressedMessages":"32378","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32379","messages":"32380","suppressedMessages":"32381","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32382","messages":"32383","suppressedMessages":"32384","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32385","messages":"32386","suppressedMessages":"32387","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32388","messages":"32389","suppressedMessages":"32390","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32391","messages":"32392","suppressedMessages":"32393","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32394","messages":"32395","suppressedMessages":"32396","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32397","messages":"32398","suppressedMessages":"32399","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32400","messages":"32401","suppressedMessages":"32402","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32403","messages":"32404","suppressedMessages":"32405","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32406","messages":"32407","suppressedMessages":"32408","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32409","messages":"32410","suppressedMessages":"32411","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32412","messages":"32413","suppressedMessages":"32414","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32415","messages":"32416","suppressedMessages":"32417","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32418","messages":"32419","suppressedMessages":"32420","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32421","messages":"32422","suppressedMessages":"32423","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32424","messages":"32425","suppressedMessages":"32426","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32427","messages":"32428","suppressedMessages":"32429","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32430","messages":"32431","suppressedMessages":"32432","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32433","messages":"32434","suppressedMessages":"32435","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32436","messages":"32437","suppressedMessages":"32438","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32439","messages":"32440","suppressedMessages":"32441","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32442","messages":"32443","suppressedMessages":"32444","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32445","messages":"32446","suppressedMessages":"32447","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32448","messages":"32449","suppressedMessages":"32450","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32451","messages":"32452","suppressedMessages":"32453","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32454","messages":"32455","suppressedMessages":"32456","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32457","messages":"32458","suppressedMessages":"32459","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32460","messages":"32461","suppressedMessages":"32462","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32463","messages":"32464","suppressedMessages":"32465","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32466","messages":"32467","suppressedMessages":"32468","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32469","messages":"32470","suppressedMessages":"32471","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32472","messages":"32473","suppressedMessages":"32474","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32475","messages":"32476","suppressedMessages":"32477","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32478","messages":"32479","suppressedMessages":"32480","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32481","messages":"32482","suppressedMessages":"32483","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32484","messages":"32485","suppressedMessages":"32486","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32487","messages":"32488","suppressedMessages":"32489","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32490","messages":"32491","suppressedMessages":"32492","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32493","messages":"32494","suppressedMessages":"32495","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32496","messages":"32497","suppressedMessages":"32498","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32499","messages":"32500","suppressedMessages":"32501","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32502","messages":"32503","suppressedMessages":"32504","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32505","messages":"32506","suppressedMessages":"32507","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32508","messages":"32509","suppressedMessages":"32510","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32511","messages":"32512","suppressedMessages":"32513","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32514","messages":"32515","suppressedMessages":"32516","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32517","messages":"32518","suppressedMessages":"32519","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32520","messages":"32521","suppressedMessages":"32522","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32523","messages":"32524","suppressedMessages":"32525","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32526","messages":"32527","suppressedMessages":"32528","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32529","messages":"32530","suppressedMessages":"32531","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32532","messages":"32533","suppressedMessages":"32534","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32535","messages":"32536","suppressedMessages":"32537","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32538","messages":"32539","suppressedMessages":"32540","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32541","messages":"32542","suppressedMessages":"32543","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32544","messages":"32545","suppressedMessages":"32546","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32547","messages":"32548","suppressedMessages":"32549","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32550","messages":"32551","suppressedMessages":"32552","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32553","messages":"32554","suppressedMessages":"32555","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32556","messages":"32557","suppressedMessages":"32558","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32559","messages":"32560","suppressedMessages":"32561","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32562","messages":"32563","suppressedMessages":"32564","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32565","messages":"32566","suppressedMessages":"32567","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32568","messages":"32569","suppressedMessages":"32570","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32571","messages":"32572","suppressedMessages":"32573","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32574","messages":"32575","suppressedMessages":"32576","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32577","messages":"32578","suppressedMessages":"32579","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32580","messages":"32581","suppressedMessages":"32582","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32583","messages":"32584","suppressedMessages":"32585","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32586","messages":"32587","suppressedMessages":"32588","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32589","messages":"32590","suppressedMessages":"32591","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32592","messages":"32593","suppressedMessages":"32594","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32595","messages":"32596","suppressedMessages":"32597","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32598","messages":"32599","suppressedMessages":"32600","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"32601","messages":"32602","suppressedMessages":"32603","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32604","messages":"32605","suppressedMessages":"32606","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32607","messages":"32608","suppressedMessages":"32609","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32610","messages":"32611","suppressedMessages":"32612","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32613","messages":"32614","suppressedMessages":"32615","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32616","messages":"32617","suppressedMessages":"32618","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32619","messages":"32620","suppressedMessages":"32621","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32622","messages":"32623","suppressedMessages":"32624","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32625","messages":"32626","suppressedMessages":"32627","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32628","messages":"32629","suppressedMessages":"32630","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32631","messages":"32632","suppressedMessages":"32633","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32634","messages":"32635","suppressedMessages":"32636","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32637","messages":"32638","suppressedMessages":"32639","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32640","messages":"32641","suppressedMessages":"32642","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32643","messages":"32644","suppressedMessages":"32645","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32646","messages":"32647","suppressedMessages":"32648","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32649","messages":"32650","suppressedMessages":"32651","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32652","messages":"32653","suppressedMessages":"32654","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32655","messages":"32656","suppressedMessages":"32657","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32658","messages":"32659","suppressedMessages":"32660","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32661","messages":"32662","suppressedMessages":"32663","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32664","messages":"32665","suppressedMessages":"32666","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32667","messages":"32668","suppressedMessages":"32669","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32670","messages":"32671","suppressedMessages":"32672","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32673","messages":"32674","suppressedMessages":"32675","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32676","messages":"32677","suppressedMessages":"32678","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32679","messages":"32680","suppressedMessages":"32681","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32682","messages":"32683","suppressedMessages":"32684","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32685","messages":"32686","suppressedMessages":"32687","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32688","messages":"32689","suppressedMessages":"32690","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32691","messages":"32692","suppressedMessages":"32693","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32694","messages":"32695","suppressedMessages":"32696","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32697","messages":"32698","suppressedMessages":"32699","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32700","messages":"32701","suppressedMessages":"32702","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32703","messages":"32704","suppressedMessages":"32705","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32706","messages":"32707","suppressedMessages":"32708","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32709","messages":"32710","suppressedMessages":"32711","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32712","messages":"32713","suppressedMessages":"32714","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32715","messages":"32716","suppressedMessages":"32717","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32718","messages":"32719","suppressedMessages":"32720","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32721","messages":"32722","suppressedMessages":"32723","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32724","messages":"32725","suppressedMessages":"32726","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32727","messages":"32728","suppressedMessages":"32729","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32730","messages":"32731","suppressedMessages":"32732","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32733","messages":"32734","suppressedMessages":"32735","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32736","messages":"32737","suppressedMessages":"32738","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32739","messages":"32740","suppressedMessages":"32741","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32742","messages":"32743","suppressedMessages":"32744","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32745","messages":"32746","suppressedMessages":"32747","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32748","messages":"32749","suppressedMessages":"32750","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32751","messages":"32752","suppressedMessages":"32753","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32754","messages":"32755","suppressedMessages":"32756","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32757","messages":"32758","suppressedMessages":"32759","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32760","messages":"32761","suppressedMessages":"32762","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32763","messages":"32764","suppressedMessages":"32765","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32766","messages":"32767","suppressedMessages":"32768","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32769","messages":"32770","suppressedMessages":"32771","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32772","messages":"32773","suppressedMessages":"32774","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32775","messages":"32776","suppressedMessages":"32777","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32778","messages":"32779","suppressedMessages":"32780","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32781","messages":"32782","suppressedMessages":"32783","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32784","messages":"32785","suppressedMessages":"32786","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32787","messages":"32788","suppressedMessages":"32789","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32790","messages":"32791","suppressedMessages":"32792","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32793","messages":"32794","suppressedMessages":"32795","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32796","messages":"32797","suppressedMessages":"32798","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32799","messages":"32800","suppressedMessages":"32801","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32802","messages":"32803","suppressedMessages":"32804","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32805","messages":"32806","suppressedMessages":"32807","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32808","messages":"32809","suppressedMessages":"32810","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32811","messages":"32812","suppressedMessages":"32813","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32814","messages":"32815","suppressedMessages":"32816","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32817","messages":"32818","suppressedMessages":"32819","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32820","messages":"32821","suppressedMessages":"32822","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32823","messages":"32824","suppressedMessages":"32825","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32826","messages":"32827","suppressedMessages":"32828","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32829","messages":"32830","suppressedMessages":"32831","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32832","messages":"32833","suppressedMessages":"32834","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32835","messages":"32836","suppressedMessages":"32837","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32838","messages":"32839","suppressedMessages":"32840","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32841","messages":"32842","suppressedMessages":"32843","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32844","messages":"32845","suppressedMessages":"32846","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32847","messages":"32848","suppressedMessages":"32849","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32850","messages":"32851","suppressedMessages":"32852","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32853","messages":"32854","suppressedMessages":"32855","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32856","messages":"32857","suppressedMessages":"32858","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32859","messages":"32860","suppressedMessages":"32861","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32862","messages":"32863","suppressedMessages":"32864","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32865","messages":"32866","suppressedMessages":"32867","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32868","messages":"32869","suppressedMessages":"32870","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32871","messages":"32872","suppressedMessages":"32873","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32874","messages":"32875","suppressedMessages":"32876","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32877","messages":"32878","suppressedMessages":"32879","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32880","messages":"32881","suppressedMessages":"32882","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32883","messages":"32884","suppressedMessages":"32885","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32886","messages":"32887","suppressedMessages":"32888","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32889","messages":"32890","suppressedMessages":"32891","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32892","messages":"32893","suppressedMessages":"32894","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32895","messages":"32896","suppressedMessages":"32897","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32898","messages":"32899","suppressedMessages":"32900","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32901","messages":"32902","suppressedMessages":"32903","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32904","messages":"32905","suppressedMessages":"32906","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32907","messages":"32908","suppressedMessages":"32909","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32910","messages":"32911","suppressedMessages":"32912","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32913","messages":"32914","suppressedMessages":"32915","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32916","messages":"32917","suppressedMessages":"32918","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32919","messages":"32920","suppressedMessages":"32921","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32922","messages":"32923","suppressedMessages":"32924","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32925","messages":"32926","suppressedMessages":"32927","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32928","messages":"32929","suppressedMessages":"32930","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32931","messages":"32932","suppressedMessages":"32933","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32934","messages":"32935","suppressedMessages":"32936","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32937","messages":"32938","suppressedMessages":"32939","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32940","messages":"32941","suppressedMessages":"32942","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32943","messages":"32944","suppressedMessages":"32945","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32946","messages":"32947","suppressedMessages":"32948","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32949","messages":"32950","suppressedMessages":"32951","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32952","messages":"32953","suppressedMessages":"32954","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32955","messages":"32956","suppressedMessages":"32957","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32958","messages":"32959","suppressedMessages":"32960","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32961","messages":"32962","suppressedMessages":"32963","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32964","messages":"32965","suppressedMessages":"32966","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32967","messages":"32968","suppressedMessages":"32969","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32970","messages":"32971","suppressedMessages":"32972","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32973","messages":"32974","suppressedMessages":"32975","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32976","messages":"32977","suppressedMessages":"32978","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32979","messages":"32980","suppressedMessages":"32981","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32982","messages":"32983","suppressedMessages":"32984","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32985","messages":"32986","suppressedMessages":"32987","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32988","messages":"32989","suppressedMessages":"32990","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32991","messages":"32992","suppressedMessages":"32993","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32994","messages":"32995","suppressedMessages":"32996","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32997","messages":"32998","suppressedMessages":"32999","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33000","messages":"33001","suppressedMessages":"33002","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33003","messages":"33004","suppressedMessages":"33005","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33006","messages":"33007","suppressedMessages":"33008","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33009","messages":"33010","suppressedMessages":"33011","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33012","messages":"33013","suppressedMessages":"33014","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33015","messages":"33016","suppressedMessages":"33017","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33018","messages":"33019","suppressedMessages":"33020","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33021","messages":"33022","suppressedMessages":"33023","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33024","messages":"33025","suppressedMessages":"33026","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33027","messages":"33028","suppressedMessages":"33029","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33030","messages":"33031","suppressedMessages":"33032","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33033","messages":"33034","suppressedMessages":"33035","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33036","messages":"33037","suppressedMessages":"33038","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33039","messages":"33040","suppressedMessages":"33041","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33042","messages":"33043","suppressedMessages":"33044","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33045","messages":"33046","suppressedMessages":"33047","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33048","messages":"33049","suppressedMessages":"33050","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33051","messages":"33052","suppressedMessages":"33053","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33054","messages":"33055","suppressedMessages":"33056","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33057","messages":"33058","suppressedMessages":"33059","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33060","messages":"33061","suppressedMessages":"33062","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33063","messages":"33064","suppressedMessages":"33065","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33066","messages":"33067","suppressedMessages":"33068","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33069","messages":"33070","suppressedMessages":"33071","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33072","messages":"33073","suppressedMessages":"33074","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33075","messages":"33076","suppressedMessages":"33077","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33078","messages":"33079","suppressedMessages":"33080","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33081","messages":"33082","suppressedMessages":"33083","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33084","messages":"33085","suppressedMessages":"33086","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33087","messages":"33088","suppressedMessages":"33089","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33090","messages":"33091","suppressedMessages":"33092","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33093","messages":"33094","suppressedMessages":"33095","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33096","messages":"33097","suppressedMessages":"33098","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33099","messages":"33100","suppressedMessages":"33101","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33102","messages":"33103","suppressedMessages":"33104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33105","messages":"33106","suppressedMessages":"33107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33108","messages":"33109","suppressedMessages":"33110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33111","messages":"33112","suppressedMessages":"33113","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33114","messages":"33115","suppressedMessages":"33116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33117","messages":"33118","suppressedMessages":"33119","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33120","messages":"33121","suppressedMessages":"33122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33123","messages":"33124","suppressedMessages":"33125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33126","messages":"33127","suppressedMessages":"33128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33129","messages":"33130","suppressedMessages":"33131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33132","messages":"33133","suppressedMessages":"33134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33135","messages":"33136","suppressedMessages":"33137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33138","messages":"33139","suppressedMessages":"33140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33141","messages":"33142","suppressedMessages":"33143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33144","messages":"33145","suppressedMessages":"33146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33147","messages":"33148","suppressedMessages":"33149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33150","messages":"33151","suppressedMessages":"33152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33153","messages":"33154","suppressedMessages":"33155","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33156","messages":"33157","suppressedMessages":"33158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33159","messages":"33160","suppressedMessages":"33161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33162","messages":"33163","suppressedMessages":"33164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33165","messages":"33166","suppressedMessages":"33167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33168","messages":"33169","suppressedMessages":"33170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33171","messages":"33172","suppressedMessages":"33173","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33174","messages":"33175","suppressedMessages":"33176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33177","messages":"33178","suppressedMessages":"33179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33180","messages":"33181","suppressedMessages":"33182","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33183","messages":"33184","suppressedMessages":"33185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33186","messages":"33187","suppressedMessages":"33188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33189","messages":"33190","suppressedMessages":"33191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33192","messages":"33193","suppressedMessages":"33194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33195","messages":"33196","suppressedMessages":"33197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33198","messages":"33199","suppressedMessages":"33200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33201","messages":"33202","suppressedMessages":"33203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33204","messages":"33205","suppressedMessages":"33206","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33207","messages":"33208","suppressedMessages":"33209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33210","messages":"33211","suppressedMessages":"33212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33213","messages":"33214","suppressedMessages":"33215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33216","messages":"33217","suppressedMessages":"33218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33219","messages":"33220","suppressedMessages":"33221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33222","messages":"33223","suppressedMessages":"33224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33225","messages":"33226","suppressedMessages":"33227","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33228","messages":"33229","suppressedMessages":"33230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33231","messages":"33232","suppressedMessages":"33233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33234","messages":"33235","suppressedMessages":"33236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33237","messages":"33238","suppressedMessages":"33239","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33240","messages":"33241","suppressedMessages":"33242","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33243","messages":"33244","suppressedMessages":"33245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33246","messages":"33247","suppressedMessages":"33248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33249","messages":"33250","suppressedMessages":"33251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33252","messages":"33253","suppressedMessages":"33254","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33255","messages":"33256","suppressedMessages":"33257","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33258","messages":"33259","suppressedMessages":"33260","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33261","messages":"33262","suppressedMessages":"33263","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33264","messages":"33265","suppressedMessages":"33266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33267","messages":"33268","suppressedMessages":"33269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33270","messages":"33271","suppressedMessages":"33272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33273","messages":"33274","suppressedMessages":"33275","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33276","messages":"33277","suppressedMessages":"33278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33279","messages":"33280","suppressedMessages":"33281","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33282","messages":"33283","suppressedMessages":"33284","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33285","messages":"33286","suppressedMessages":"33287","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33288","messages":"33289","suppressedMessages":"33290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33291","messages":"33292","suppressedMessages":"33293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33294","messages":"33295","suppressedMessages":"33296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33297","messages":"33298","suppressedMessages":"33299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33300","messages":"33301","suppressedMessages":"33302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33303","messages":"33304","suppressedMessages":"33305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33306","messages":"33307","suppressedMessages":"33308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33309","messages":"33310","suppressedMessages":"33311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33312","messages":"33313","suppressedMessages":"33314","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33315","messages":"33316","suppressedMessages":"33317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33318","messages":"33319","suppressedMessages":"33320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33321","messages":"33322","suppressedMessages":"33323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33324","messages":"33325","suppressedMessages":"33326","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33327","messages":"33328","suppressedMessages":"33329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33330","messages":"33331","suppressedMessages":"33332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33333","messages":"33334","suppressedMessages":"33335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33336","messages":"33337","suppressedMessages":"33338","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33339","messages":"33340","suppressedMessages":"33341","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33342","messages":"33343","suppressedMessages":"33344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33345","messages":"33346","suppressedMessages":"33347","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33348","messages":"33349","suppressedMessages":"33350","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33351","messages":"33352","suppressedMessages":"33353","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33354","messages":"33355","suppressedMessages":"33356","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33357","messages":"33358","suppressedMessages":"33359","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33360","messages":"33361","suppressedMessages":"33362","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33363","messages":"33364","suppressedMessages":"33365","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33366","messages":"33367","suppressedMessages":"33368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33369","messages":"33370","suppressedMessages":"33371","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33372","messages":"33373","suppressedMessages":"33374","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33375","messages":"33376","suppressedMessages":"33377","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33378","messages":"33379","suppressedMessages":"33380","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33381","messages":"33382","suppressedMessages":"33383","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33384","messages":"33385","suppressedMessages":"33386","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33387","messages":"33388","suppressedMessages":"33389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33390","messages":"33391","suppressedMessages":"33392","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33393","messages":"33394","suppressedMessages":"33395","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33396","messages":"33397","suppressedMessages":"33398","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33399","messages":"33400","suppressedMessages":"33401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33402","messages":"33403","suppressedMessages":"33404","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33405","messages":"33406","suppressedMessages":"33407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33408","messages":"33409","suppressedMessages":"33410","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33411","messages":"33412","suppressedMessages":"33413","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33414","messages":"33415","suppressedMessages":"33416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33417","messages":"33418","suppressedMessages":"33419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33420","messages":"33421","suppressedMessages":"33422","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33423","messages":"33424","suppressedMessages":"33425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33426","messages":"33427","suppressedMessages":"33428","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33429","messages":"33430","suppressedMessages":"33431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33432","messages":"33433","suppressedMessages":"33434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33435","messages":"33436","suppressedMessages":"33437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33438","messages":"33439","suppressedMessages":"33440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33441","messages":"33442","suppressedMessages":"33443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33444","messages":"33445","suppressedMessages":"33446","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33447","messages":"33448","suppressedMessages":"33449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33450","messages":"33451","suppressedMessages":"33452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33453","messages":"33454","suppressedMessages":"33455","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33456","messages":"33457","suppressedMessages":"33458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33459","messages":"33460","suppressedMessages":"33461","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33462","messages":"33463","suppressedMessages":"33464","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33465","messages":"33466","suppressedMessages":"33467","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33468","messages":"33469","suppressedMessages":"33470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33471","messages":"33472","suppressedMessages":"33473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33474","messages":"33475","suppressedMessages":"33476","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33477","messages":"33478","suppressedMessages":"33479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33480","messages":"33481","suppressedMessages":"33482","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33483","messages":"33484","suppressedMessages":"33485","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33486","messages":"33487","suppressedMessages":"33488","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33489","messages":"33490","suppressedMessages":"33491","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33492","messages":"33493","suppressedMessages":"33494","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33495","messages":"33496","suppressedMessages":"33497","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33498","messages":"33499","suppressedMessages":"33500","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33501","messages":"33502","suppressedMessages":"33503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33504","messages":"33505","suppressedMessages":"33506","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33507","messages":"33508","suppressedMessages":"33509","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33510","messages":"33511","suppressedMessages":"33512","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33513","messages":"33514","suppressedMessages":"33515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33516","messages":"33517","suppressedMessages":"33518","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33519","messages":"33520","suppressedMessages":"33521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33522","messages":"33523","suppressedMessages":"33524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33525","messages":"33526","suppressedMessages":"33527","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33528","messages":"33529","suppressedMessages":"33530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33531","messages":"33532","suppressedMessages":"33533","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33534","messages":"33535","suppressedMessages":"33536","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33537","messages":"33538","suppressedMessages":"33539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33540","messages":"33541","suppressedMessages":"33542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33543","messages":"33544","suppressedMessages":"33545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33546","messages":"33547","suppressedMessages":"33548","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33549","messages":"33550","suppressedMessages":"33551","errorCount":29,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33552","messages":"33553","suppressedMessages":"33554","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33555","messages":"33556","suppressedMessages":"33557","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33558","messages":"33559","suppressedMessages":"33560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33561","messages":"33562","suppressedMessages":"33563","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33564","messages":"33565","suppressedMessages":"33566","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33567","messages":"33568","suppressedMessages":"33569","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33570","messages":"33571","suppressedMessages":"33572","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33573","messages":"33574","suppressedMessages":"33575","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33576","messages":"33577","suppressedMessages":"33578","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33579","messages":"33580","suppressedMessages":"33581","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33582","messages":"33583","suppressedMessages":"33584","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33585","messages":"33586","suppressedMessages":"33587","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33588","messages":"33589","suppressedMessages":"33590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33591","messages":"33592","suppressedMessages":"33593","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33594","messages":"33595","suppressedMessages":"33596","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33597","messages":"33598","suppressedMessages":"33599","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33600","messages":"33601","suppressedMessages":"33602","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33603","messages":"33604","suppressedMessages":"33605","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33606","messages":"33607","suppressedMessages":"33608","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33609","messages":"33610","suppressedMessages":"33611","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33612","messages":"33613","suppressedMessages":"33614","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33615","messages":"33616","suppressedMessages":"33617","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33618","messages":"33619","suppressedMessages":"33620","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33621","messages":"33622","suppressedMessages":"33623","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33624","messages":"33625","suppressedMessages":"33626","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33627","messages":"33628","suppressedMessages":"33629","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33630","messages":"33631","suppressedMessages":"33632","errorCount":18,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33633","messages":"33634","suppressedMessages":"33635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33636","messages":"33637","suppressedMessages":"33638","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33639","messages":"33640","suppressedMessages":"33641","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33642","messages":"33643","suppressedMessages":"33644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33645","messages":"33646","suppressedMessages":"33647","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33648","messages":"33649","suppressedMessages":"33650","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33651","messages":"33652","suppressedMessages":"33653","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33654","messages":"33655","suppressedMessages":"33656","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33657","messages":"33658","suppressedMessages":"33659","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33660","messages":"33661","suppressedMessages":"33662","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33663","messages":"33664","suppressedMessages":"33665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33666","messages":"33667","suppressedMessages":"33668","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33669","messages":"33670","suppressedMessages":"33671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33672","messages":"33673","suppressedMessages":"33674","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33675","messages":"33676","suppressedMessages":"33677","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33678","messages":"33679","suppressedMessages":"33680","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33681","messages":"33682","suppressedMessages":"33683","errorCount":20,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33684","messages":"33685","suppressedMessages":"33686","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33687","messages":"33688","suppressedMessages":"33689","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33690","messages":"33691","suppressedMessages":"33692","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33693","messages":"33694","suppressedMessages":"33695","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33696","messages":"33697","suppressedMessages":"33698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33699","messages":"33700","suppressedMessages":"33701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33702","messages":"33703","suppressedMessages":"33704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33705","messages":"33706","suppressedMessages":"33707","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33708","messages":"33709","suppressedMessages":"33710","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33711","messages":"33712","suppressedMessages":"33713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33714","messages":"33715","suppressedMessages":"33716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33717","messages":"33718","suppressedMessages":"33719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33720","messages":"33721","suppressedMessages":"33722","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33723","messages":"33724","suppressedMessages":"33725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33726","messages":"33727","suppressedMessages":"33728","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33729","messages":"33730","suppressedMessages":"33731","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33732","messages":"33733","suppressedMessages":"33734","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33735","messages":"33736","suppressedMessages":"33737","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33738","messages":"33739","suppressedMessages":"33740","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33741","messages":"33742","suppressedMessages":"33743","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33744","messages":"33745","suppressedMessages":"33746","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33747","messages":"33748","suppressedMessages":"33749","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33750","messages":"33751","suppressedMessages":"33752","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33753","messages":"33754","suppressedMessages":"33755","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33756","messages":"33757","suppressedMessages":"33758","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33759","messages":"33760","suppressedMessages":"33761","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33762","messages":"33763","suppressedMessages":"33764","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33765","messages":"33766","suppressedMessages":"33767","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33768","messages":"33769","suppressedMessages":"33770","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33771","messages":"33772","suppressedMessages":"33773","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33774","messages":"33775","suppressedMessages":"33776","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33777","messages":"33778","suppressedMessages":"33779","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33780","messages":"33781","suppressedMessages":"33782","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33783","messages":"33784","suppressedMessages":"33785","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33786","messages":"33787","suppressedMessages":"33788","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33789","messages":"33790","suppressedMessages":"33791","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33792","messages":"33793","suppressedMessages":"33794","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33795","messages":"33796","suppressedMessages":"33797","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33798","messages":"33799","suppressedMessages":"33800","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33801","messages":"33802","suppressedMessages":"33803","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33804","messages":"33805","suppressedMessages":"33806","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33807","messages":"33808","suppressedMessages":"33809","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33810","messages":"33811","suppressedMessages":"33812","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33813","messages":"33814","suppressedMessages":"33815","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33816","messages":"33817","suppressedMessages":"33818","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33819","messages":"33820","suppressedMessages":"33821","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33822","messages":"33823","suppressedMessages":"33824","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33825","messages":"33826","suppressedMessages":"33827","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33828","messages":"33829","suppressedMessages":"33830","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33831","messages":"33832","suppressedMessages":"33833","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33834","messages":"33835","suppressedMessages":"33836","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33837","messages":"33838","suppressedMessages":"33839","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33840","messages":"33841","suppressedMessages":"33842","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33843","messages":"33844","suppressedMessages":"33845","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33846","messages":"33847","suppressedMessages":"33848","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33849","messages":"33850","suppressedMessages":"33851","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33852","messages":"33853","suppressedMessages":"33854","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33855","messages":"33856","suppressedMessages":"33857","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33858","messages":"33859","suppressedMessages":"33860","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33861","messages":"33862","suppressedMessages":"33863","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33864","messages":"33865","suppressedMessages":"33866","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33867","messages":"33868","suppressedMessages":"33869","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33870","messages":"33871","suppressedMessages":"33872","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33873","messages":"33874","suppressedMessages":"33875","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33876","messages":"33877","suppressedMessages":"33878","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33879","messages":"33880","suppressedMessages":"33881","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33882","messages":"33883","suppressedMessages":"33884","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33885","messages":"33886","suppressedMessages":"33887","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33888","messages":"33889","suppressedMessages":"33890","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33891","messages":"33892","suppressedMessages":"33893","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33894","messages":"33895","suppressedMessages":"33896","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33897","messages":"33898","suppressedMessages":"33899","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33900","messages":"33901","suppressedMessages":"33902","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33903","messages":"33904","suppressedMessages":"33905","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33906","messages":"33907","suppressedMessages":"33908","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33909","messages":"33910","suppressedMessages":"33911","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33912","messages":"33913","suppressedMessages":"33914","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33915","messages":"33916","suppressedMessages":"33917","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33918","messages":"33919","suppressedMessages":"33920","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33921","messages":"33922","suppressedMessages":"33923","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33924","messages":"33925","suppressedMessages":"33926","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33927","messages":"33928","suppressedMessages":"33929","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33930","messages":"33931","suppressedMessages":"33932","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33933","messages":"33934","suppressedMessages":"33935","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33936","messages":"33937","suppressedMessages":"33938","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33939","messages":"33940","suppressedMessages":"33941","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33942","messages":"33943","suppressedMessages":"33944","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33945","messages":"33946","suppressedMessages":"33947","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33948","messages":"33949","suppressedMessages":"33950","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33951","messages":"33952","suppressedMessages":"33953","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33954","messages":"33955","suppressedMessages":"33956","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33957","messages":"33958","suppressedMessages":"33959","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33960","messages":"33961","suppressedMessages":"33962","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33963","messages":"33964","suppressedMessages":"33965","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33966","messages":"33967","suppressedMessages":"33968","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33969","messages":"33970","suppressedMessages":"33971","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33972","messages":"33973","suppressedMessages":"33974","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33975","messages":"33976","suppressedMessages":"33977","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33978","messages":"33979","suppressedMessages":"33980","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"33981","messages":"33982","suppressedMessages":"33983","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33984","messages":"33985","suppressedMessages":"33986","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33987","messages":"33988","suppressedMessages":"33989","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33990","messages":"33991","suppressedMessages":"33992","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33993","messages":"33994","suppressedMessages":"33995","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33996","messages":"33997","suppressedMessages":"33998","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"33999","messages":"34000","suppressedMessages":"34001","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34002","messages":"34003","suppressedMessages":"34004","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34005","messages":"34006","suppressedMessages":"34007","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34008","messages":"34009","suppressedMessages":"34010","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34011","messages":"34012","suppressedMessages":"34013","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34014","messages":"34015","suppressedMessages":"34016","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34017","messages":"34018","suppressedMessages":"34019","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34020","messages":"34021","suppressedMessages":"34022","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34023","messages":"34024","suppressedMessages":"34025","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34026","messages":"34027","suppressedMessages":"34028","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34029","messages":"34030","suppressedMessages":"34031","errorCount":19,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34032","messages":"34033","suppressedMessages":"34034","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34035","messages":"34036","suppressedMessages":"34037","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34038","messages":"34039","suppressedMessages":"34040","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34041","messages":"34042","suppressedMessages":"34043","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34044","messages":"34045","suppressedMessages":"34046","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34047","messages":"34048","suppressedMessages":"34049","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34050","messages":"34051","suppressedMessages":"34052","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34053","messages":"34054","suppressedMessages":"34055","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34056","messages":"34057","suppressedMessages":"34058","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34059","messages":"34060","suppressedMessages":"34061","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34062","messages":"34063","suppressedMessages":"34064","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34065","messages":"34066","suppressedMessages":"34067","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34068","messages":"34069","suppressedMessages":"34070","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34071","messages":"34072","suppressedMessages":"34073","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34074","messages":"34075","suppressedMessages":"34076","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34077","messages":"34078","suppressedMessages":"34079","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34080","messages":"34081","suppressedMessages":"34082","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34083","messages":"34084","suppressedMessages":"34085","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34086","messages":"34087","suppressedMessages":"34088","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34089","messages":"34090","suppressedMessages":"34091","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34092","messages":"34093","suppressedMessages":"34094","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34095","messages":"34096","suppressedMessages":"34097","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34098","messages":"34099","suppressedMessages":"34100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34101","messages":"34102","suppressedMessages":"34103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34104","messages":"34105","suppressedMessages":"34106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34107","messages":"34108","suppressedMessages":"34109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34110","messages":"34111","suppressedMessages":"34112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34113","messages":"34114","suppressedMessages":"34115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34116","messages":"34117","suppressedMessages":"34118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34119","messages":"34120","suppressedMessages":"34121","errorCount":42,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34122","messages":"34123","suppressedMessages":"34124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34125","messages":"34126","suppressedMessages":"34127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34128","messages":"34129","suppressedMessages":"34130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34131","messages":"34132","suppressedMessages":"34133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34134","messages":"34135","suppressedMessages":"34136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34137","messages":"34138","suppressedMessages":"34139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34140","messages":"34141","suppressedMessages":"34142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34143","messages":"34144","suppressedMessages":"34145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34146","messages":"34147","suppressedMessages":"34148","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34149","messages":"34150","suppressedMessages":"34151","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34152","messages":"34153","suppressedMessages":"34154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34155","messages":"34156","suppressedMessages":"34157","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34158","messages":"34159","suppressedMessages":"34160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34161","messages":"34162","suppressedMessages":"34163","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34164","messages":"34165","suppressedMessages":"34166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34167","messages":"34168","suppressedMessages":"34169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34170","messages":"34171","suppressedMessages":"34172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34173","messages":"34174","suppressedMessages":"34175","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34176","messages":"34177","suppressedMessages":"34178","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34179","messages":"34180","suppressedMessages":"34181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34182","messages":"34183","suppressedMessages":"34184","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34185","messages":"34186","suppressedMessages":"34187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34188","messages":"34189","suppressedMessages":"34190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34191","messages":"34192","suppressedMessages":"34193","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34194","messages":"34195","suppressedMessages":"34196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34197","messages":"34198","suppressedMessages":"34199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34200","messages":"34201","suppressedMessages":"34202","errorCount":40,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34203","messages":"34204","suppressedMessages":"34205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34206","messages":"34207","suppressedMessages":"34208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34209","messages":"34210","suppressedMessages":"34211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34212","messages":"34213","suppressedMessages":"34214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34215","messages":"34216","suppressedMessages":"34217","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34218","messages":"34219","suppressedMessages":"34220","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34221","messages":"34222","suppressedMessages":"34223","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34224","messages":"34225","suppressedMessages":"34226","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34227","messages":"34228","suppressedMessages":"34229","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34230","messages":"34231","suppressedMessages":"34232","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34233","messages":"34234","suppressedMessages":"34235","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34236","messages":"34237","suppressedMessages":"34238","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34239","messages":"34240","suppressedMessages":"34241","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34242","messages":"34243","suppressedMessages":"34244","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34245","messages":"34246","suppressedMessages":"34247","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34248","messages":"34249","suppressedMessages":"34250","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34251","messages":"34252","suppressedMessages":"34253","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34254","messages":"34255","suppressedMessages":"34256","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34257","messages":"34258","suppressedMessages":"34259","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34260","messages":"34261","suppressedMessages":"34262","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34263","messages":"34264","suppressedMessages":"34265","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34266","messages":"34267","suppressedMessages":"34268","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34269","messages":"34270","suppressedMessages":"34271","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34272","messages":"34273","suppressedMessages":"34274","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34275","messages":"34276","suppressedMessages":"34277","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34278","messages":"34279","suppressedMessages":"34280","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34281","messages":"34282","suppressedMessages":"34283","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34284","messages":"34285","suppressedMessages":"34286","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34287","messages":"34288","suppressedMessages":"34289","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34290","messages":"34291","suppressedMessages":"34292","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34293","messages":"34294","suppressedMessages":"34295","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34296","messages":"34297","suppressedMessages":"34298","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34299","messages":"34300","suppressedMessages":"34301","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34302","messages":"34303","suppressedMessages":"34304","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34305","messages":"34306","suppressedMessages":"34307","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34308","messages":"34309","suppressedMessages":"34310","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34311","messages":"34312","suppressedMessages":"34313","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34314","messages":"34315","suppressedMessages":"34316","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34317","messages":"34318","suppressedMessages":"34319","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34320","messages":"34321","suppressedMessages":"34322","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34323","messages":"34324","suppressedMessages":"34325","errorCount":20,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34326","messages":"34327","suppressedMessages":"34328","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34329","messages":"34330","suppressedMessages":"34331","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34332","messages":"34333","suppressedMessages":"34334","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34335","messages":"34336","suppressedMessages":"34337","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34338","messages":"34339","suppressedMessages":"34340","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34341","messages":"34342","suppressedMessages":"34343","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34344","messages":"34345","suppressedMessages":"34346","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34347","messages":"34348","suppressedMessages":"34349","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34350","messages":"34351","suppressedMessages":"34352","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34353","messages":"34354","suppressedMessages":"34355","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34356","messages":"34357","suppressedMessages":"34358","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34359","messages":"34360","suppressedMessages":"34361","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34362","messages":"34363","suppressedMessages":"34364","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34365","messages":"34366","suppressedMessages":"34367","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34368","messages":"34369","suppressedMessages":"34370","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34371","messages":"34372","suppressedMessages":"34373","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34374","messages":"34375","suppressedMessages":"34376","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34377","messages":"34378","suppressedMessages":"34379","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34380","messages":"34381","suppressedMessages":"34382","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34383","messages":"34384","suppressedMessages":"34385","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34386","messages":"34387","suppressedMessages":"34388","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34389","messages":"34390","suppressedMessages":"34391","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34392","messages":"34393","suppressedMessages":"34394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34395","messages":"34396","suppressedMessages":"34397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34398","messages":"34399","suppressedMessages":"34400","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34401","messages":"34402","suppressedMessages":"34403","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34404","messages":"34405","suppressedMessages":"34406","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34407","messages":"34408","suppressedMessages":"34409","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34410","messages":"34411","suppressedMessages":"34412","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34413","messages":"34414","suppressedMessages":"34415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34416","messages":"34417","suppressedMessages":"34418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34419","messages":"34420","suppressedMessages":"34421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34422","messages":"34423","suppressedMessages":"34424","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34425","messages":"34426","suppressedMessages":"34427","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34428","messages":"34429","suppressedMessages":"34430","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34431","messages":"34432","suppressedMessages":"34433","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34434","messages":"34435","suppressedMessages":"34436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34437","messages":"34438","suppressedMessages":"34439","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34440","messages":"34441","suppressedMessages":"34442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34443","messages":"34444","suppressedMessages":"34445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34446","messages":"34447","suppressedMessages":"34448","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34449","messages":"34450","suppressedMessages":"34451","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34452","messages":"34453","suppressedMessages":"34454","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34455","messages":"34456","suppressedMessages":"34457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34458","messages":"34459","suppressedMessages":"34460","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34461","messages":"34462","suppressedMessages":"34463","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34464","messages":"34465","suppressedMessages":"34466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34467","messages":"34468","suppressedMessages":"34469","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34470","messages":"34471","suppressedMessages":"34472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34473","messages":"34474","suppressedMessages":"34475","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34476","messages":"34477","suppressedMessages":"34478","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34479","messages":"34480","suppressedMessages":"34481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34482","messages":"34483","suppressedMessages":"34484","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34485","messages":"34486","suppressedMessages":"34487","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34488","messages":"34489","suppressedMessages":"34490","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34491","messages":"34492","suppressedMessages":"34493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34494","messages":"34495","suppressedMessages":"34496","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34497","messages":"34498","suppressedMessages":"34499","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34500","messages":"34501","suppressedMessages":"34502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34503","messages":"34504","suppressedMessages":"34505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34506","messages":"34507","suppressedMessages":"34508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34509","messages":"34510","suppressedMessages":"34511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34512","messages":"34513","suppressedMessages":"34514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34515","messages":"34516","suppressedMessages":"34517","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34518","messages":"34519","suppressedMessages":"34520","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34521","messages":"34522","suppressedMessages":"34523","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34524","messages":"34525","suppressedMessages":"34526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34527","messages":"34528","suppressedMessages":"34529","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34530","messages":"34531","suppressedMessages":"34532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34533","messages":"34534","suppressedMessages":"34535","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34536","messages":"34537","suppressedMessages":"34538","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34539","messages":"34540","suppressedMessages":"34541","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34542","messages":"34543","suppressedMessages":"34544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34545","messages":"34546","suppressedMessages":"34547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34548","messages":"34549","suppressedMessages":"34550","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34551","messages":"34552","suppressedMessages":"34553","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34554","messages":"34555","suppressedMessages":"34556","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34557","messages":"34558","suppressedMessages":"34559","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34560","messages":"34561","suppressedMessages":"34562","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34563","messages":"34564","suppressedMessages":"34565","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34566","messages":"34567","suppressedMessages":"34568","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34569","messages":"34570","suppressedMessages":"34571","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34572","messages":"34573","suppressedMessages":"34574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34575","messages":"34576","suppressedMessages":"34577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34578","messages":"34579","suppressedMessages":"34580","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34581","messages":"34582","suppressedMessages":"34583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34584","messages":"34585","suppressedMessages":"34586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34587","messages":"34588","suppressedMessages":"34589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34590","messages":"34591","suppressedMessages":"34592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34593","messages":"34594","suppressedMessages":"34595","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34596","messages":"34597","suppressedMessages":"34598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34599","messages":"34600","suppressedMessages":"34601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34602","messages":"34603","suppressedMessages":"34604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34605","messages":"34606","suppressedMessages":"34607","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34608","messages":"34609","suppressedMessages":"34610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34611","messages":"34612","suppressedMessages":"34613","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34614","messages":"34615","suppressedMessages":"34616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34617","messages":"34618","suppressedMessages":"34619","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34620","messages":"34621","suppressedMessages":"34622","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34623","messages":"34624","suppressedMessages":"34625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34626","messages":"34627","suppressedMessages":"34628","errorCount":19,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34629","messages":"34630","suppressedMessages":"34631","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34632","messages":"34633","suppressedMessages":"34634","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34635","messages":"34636","suppressedMessages":"34637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34638","messages":"34639","suppressedMessages":"34640","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34641","messages":"34642","suppressedMessages":"34643","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34644","messages":"34645","suppressedMessages":"34646","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34647","messages":"34648","suppressedMessages":"34649","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34650","messages":"34651","suppressedMessages":"34652","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34653","messages":"34654","suppressedMessages":"34655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34656","messages":"34657","suppressedMessages":"34658","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34659","messages":"34660","suppressedMessages":"34661","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34662","messages":"34663","suppressedMessages":"34664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34665","messages":"34666","suppressedMessages":"34667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34668","messages":"34669","suppressedMessages":"34670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34671","messages":"34672","suppressedMessages":"34673","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34674","messages":"34675","suppressedMessages":"34676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34677","messages":"34678","suppressedMessages":"34679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34680","messages":"34681","suppressedMessages":"34682","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34683","messages":"34684","suppressedMessages":"34685","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34686","messages":"34687","suppressedMessages":"34688","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34689","messages":"34690","suppressedMessages":"34691","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34692","messages":"34693","suppressedMessages":"34694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34695","messages":"34696","suppressedMessages":"34697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34698","messages":"34699","suppressedMessages":"34700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34701","messages":"34702","suppressedMessages":"34703","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34704","messages":"34705","suppressedMessages":"34706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34707","messages":"34708","suppressedMessages":"34709","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34710","messages":"34711","suppressedMessages":"34712","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34713","messages":"34714","suppressedMessages":"34715","errorCount":25,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34716","messages":"34717","suppressedMessages":"34718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34719","messages":"34720","suppressedMessages":"34721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34722","messages":"34723","suppressedMessages":"34724","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34725","messages":"34726","suppressedMessages":"34727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34728","messages":"34729","suppressedMessages":"34730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34731","messages":"34732","suppressedMessages":"34733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34734","messages":"34735","suppressedMessages":"34736","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34737","messages":"34738","suppressedMessages":"34739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34740","messages":"34741","suppressedMessages":"34742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34743","messages":"34744","suppressedMessages":"34745","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34746","messages":"34747","suppressedMessages":"34748","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34749","messages":"34750","suppressedMessages":"34751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34752","messages":"34753","suppressedMessages":"34754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34755","messages":"34756","suppressedMessages":"34757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34758","messages":"34759","suppressedMessages":"34760","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34761","messages":"34762","suppressedMessages":"34763","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34764","messages":"34765","suppressedMessages":"34766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34767","messages":"34768","suppressedMessages":"34769","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34770","messages":"34771","suppressedMessages":"34772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34773","messages":"34774","suppressedMessages":"34775","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34776","messages":"34777","suppressedMessages":"34778","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34779","messages":"34780","suppressedMessages":"34781","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34782","messages":"34783","suppressedMessages":"34784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34785","messages":"34786","suppressedMessages":"34787","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34788","messages":"34789","suppressedMessages":"34790","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34791","messages":"34792","suppressedMessages":"34793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34794","messages":"34795","suppressedMessages":"34796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34797","messages":"34798","suppressedMessages":"34799","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34800","messages":"34801","suppressedMessages":"34802","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34803","messages":"34804","suppressedMessages":"34805","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34806","messages":"34807","suppressedMessages":"34808","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34809","messages":"34810","suppressedMessages":"34811","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34812","messages":"34813","suppressedMessages":"34814","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34815","messages":"34816","suppressedMessages":"34817","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34818","messages":"34819","suppressedMessages":"34820","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34821","messages":"34822","suppressedMessages":"34823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34824","messages":"34825","suppressedMessages":"34826","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34827","messages":"34828","suppressedMessages":"34829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34830","messages":"34831","suppressedMessages":"34832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34833","messages":"34834","suppressedMessages":"34835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34836","messages":"34837","suppressedMessages":"34838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34839","messages":"34840","suppressedMessages":"34841","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34842","messages":"34843","suppressedMessages":"34844","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34845","messages":"34846","suppressedMessages":"34847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34848","messages":"34849","suppressedMessages":"34850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34851","messages":"34852","suppressedMessages":"34853","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34854","messages":"34855","suppressedMessages":"34856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34857","messages":"34858","suppressedMessages":"34859","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34860","messages":"34861","suppressedMessages":"34862","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34863","messages":"34864","suppressedMessages":"34865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34866","messages":"34867","suppressedMessages":"34868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34869","messages":"34870","suppressedMessages":"34871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34872","messages":"34873","suppressedMessages":"34874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34875","messages":"34876","suppressedMessages":"34877","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34878","messages":"34879","suppressedMessages":"34880","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34881","messages":"34882","suppressedMessages":"34883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34884","messages":"34885","suppressedMessages":"34886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34887","messages":"34888","suppressedMessages":"34889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34890","messages":"34891","suppressedMessages":"34892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34893","messages":"34894","suppressedMessages":"34895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34896","messages":"34897","suppressedMessages":"34898","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34899","messages":"34900","suppressedMessages":"34901","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34902","messages":"34903","suppressedMessages":"34904","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34905","messages":"34906","suppressedMessages":"34907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34908","messages":"34909","suppressedMessages":"34910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34911","messages":"34912","suppressedMessages":"34913","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34914","messages":"34915","suppressedMessages":"34916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34917","messages":"34918","suppressedMessages":"34919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34920","messages":"34921","suppressedMessages":"34922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34923","messages":"34924","suppressedMessages":"34925","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34926","messages":"34927","suppressedMessages":"34928","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34929","messages":"34930","suppressedMessages":"34931","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34932","messages":"34933","suppressedMessages":"34934","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34935","messages":"34936","suppressedMessages":"34937","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34938","messages":"34939","suppressedMessages":"34940","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34941","messages":"34942","suppressedMessages":"34943","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34944","messages":"34945","suppressedMessages":"34946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34947","messages":"34948","suppressedMessages":"34949","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34950","messages":"34951","suppressedMessages":"34952","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34953","messages":"34954","suppressedMessages":"34955","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34956","messages":"34957","suppressedMessages":"34958","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"34959","messages":"34960","suppressedMessages":"34961","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34962","messages":"34963","suppressedMessages":"34964","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34965","messages":"34966","suppressedMessages":"34967","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34968","messages":"34969","suppressedMessages":"34970","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34971","messages":"34972","suppressedMessages":"34973","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34974","messages":"34975","suppressedMessages":"34976","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34977","messages":"34978","suppressedMessages":"34979","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34980","messages":"34981","suppressedMessages":"34982","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34983","messages":"34984","suppressedMessages":"34985","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34986","messages":"34987","suppressedMessages":"34988","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34989","messages":"34990","suppressedMessages":"34991","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34992","messages":"34993","suppressedMessages":"34994","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34995","messages":"34996","suppressedMessages":"34997","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34998","messages":"34999","suppressedMessages":"35000","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35001","messages":"35002","suppressedMessages":"35003","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35004","messages":"35005","suppressedMessages":"35006","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35007","messages":"35008","suppressedMessages":"35009","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35010","messages":"35011","suppressedMessages":"35012","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35013","messages":"35014","suppressedMessages":"35015","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35016","messages":"35017","suppressedMessages":"35018","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35019","messages":"35020","suppressedMessages":"35021","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35022","messages":"35023","suppressedMessages":"35024","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35025","messages":"35026","suppressedMessages":"35027","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35028","messages":"35029","suppressedMessages":"35030","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35031","messages":"35032","suppressedMessages":"35033","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35034","messages":"35035","suppressedMessages":"35036","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35037","messages":"35038","suppressedMessages":"35039","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35040","messages":"35041","suppressedMessages":"35042","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35043","messages":"35044","suppressedMessages":"35045","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35046","messages":"35047","suppressedMessages":"35048","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35049","messages":"35050","suppressedMessages":"35051","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35052","messages":"35053","suppressedMessages":"35054","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35055","messages":"35056","suppressedMessages":"35057","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35058","messages":"35059","suppressedMessages":"35060","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35061","messages":"35062","suppressedMessages":"35063","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35064","messages":"35065","suppressedMessages":"35066","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35067","messages":"35068","suppressedMessages":"35069","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35070","messages":"35071","suppressedMessages":"35072","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35073","messages":"35074","suppressedMessages":"35075","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35076","messages":"35077","suppressedMessages":"35078","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35079","messages":"35080","suppressedMessages":"35081","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35082","messages":"35083","suppressedMessages":"35084","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35085","messages":"35086","suppressedMessages":"35087","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35088","messages":"35089","suppressedMessages":"35090","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35091","messages":"35092","suppressedMessages":"35093","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35094","messages":"35095","suppressedMessages":"35096","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35097","messages":"35098","suppressedMessages":"35099","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35100","messages":"35101","suppressedMessages":"35102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35103","messages":"35104","suppressedMessages":"35105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35106","messages":"35107","suppressedMessages":"35108","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35109","messages":"35110","suppressedMessages":"35111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35112","messages":"35113","suppressedMessages":"35114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35115","messages":"35116","suppressedMessages":"35117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35118","messages":"35119","suppressedMessages":"35120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35121","messages":"35122","suppressedMessages":"35123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35124","messages":"35125","suppressedMessages":"35126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35127","messages":"35128","suppressedMessages":"35129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35130","messages":"35131","suppressedMessages":"35132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35133","messages":"35134","suppressedMessages":"35135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35136","messages":"35137","suppressedMessages":"35138","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35139","messages":"35140","suppressedMessages":"35141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35142","messages":"35143","suppressedMessages":"35144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35145","messages":"35146","suppressedMessages":"35147","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35148","messages":"35149","suppressedMessages":"35150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35151","messages":"35152","suppressedMessages":"35153","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35154","messages":"35155","suppressedMessages":"35156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35157","messages":"35158","suppressedMessages":"35159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35160","messages":"35161","suppressedMessages":"35162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35163","messages":"35164","suppressedMessages":"35165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35166","messages":"35167","suppressedMessages":"35168","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35169","messages":"35170","suppressedMessages":"35171","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35172","messages":"35173","suppressedMessages":"35174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35175","messages":"35176","suppressedMessages":"35177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35178","messages":"35179","suppressedMessages":"35180","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35181","messages":"35182","suppressedMessages":"35183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35184","messages":"35185","suppressedMessages":"35186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35187","messages":"35188","suppressedMessages":"35189","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35190","messages":"35191","suppressedMessages":"35192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35193","messages":"35194","suppressedMessages":"35195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35196","messages":"35197","suppressedMessages":"35198","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35199","messages":"35200","suppressedMessages":"35201","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35202","messages":"35203","suppressedMessages":"35204","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35205","messages":"35206","suppressedMessages":"35207","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35208","messages":"35209","suppressedMessages":"35210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35211","messages":"35212","suppressedMessages":"35213","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35214","messages":"35215","suppressedMessages":"35216","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35217","messages":"35218","suppressedMessages":"35219","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35220","messages":"35221","suppressedMessages":"35222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35223","messages":"35224","suppressedMessages":"35225","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35226","messages":"35227","suppressedMessages":"35228","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35229","messages":"35230","suppressedMessages":"35231","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35232","messages":"35233","suppressedMessages":"35234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35235","messages":"35236","suppressedMessages":"35237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35238","messages":"35239","suppressedMessages":"35240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35241","messages":"35242","suppressedMessages":"35243","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35244","messages":"35245","suppressedMessages":"35246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35247","messages":"35248","suppressedMessages":"35249","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35250","messages":"35251","suppressedMessages":"35252","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35253","messages":"35254","suppressedMessages":"35255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35256","messages":"35257","suppressedMessages":"35258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35259","messages":"35260","suppressedMessages":"35261","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35262","messages":"35263","suppressedMessages":"35264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35265","messages":"35266","suppressedMessages":"35267","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35268","messages":"35269","suppressedMessages":"35270","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35271","messages":"35272","suppressedMessages":"35273","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35274","messages":"35275","suppressedMessages":"35276","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35277","messages":"35278","suppressedMessages":"35279","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35280","messages":"35281","suppressedMessages":"35282","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35283","messages":"35284","suppressedMessages":"35285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35286","messages":"35287","suppressedMessages":"35288","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35289","messages":"35290","suppressedMessages":"35291","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35292","messages":"35293","suppressedMessages":"35294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35295","messages":"35296","suppressedMessages":"35297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35298","messages":"35299","suppressedMessages":"35300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35301","messages":"35302","suppressedMessages":"35303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35304","messages":"35305","suppressedMessages":"35306","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35307","messages":"35308","suppressedMessages":"35309","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35310","messages":"35311","suppressedMessages":"35312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35313","messages":"35314","suppressedMessages":"35315","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35316","messages":"35317","suppressedMessages":"35318","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35319","messages":"35320","suppressedMessages":"35321","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35322","messages":"35323","suppressedMessages":"35324","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35325","messages":"35326","suppressedMessages":"35327","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35328","messages":"35329","suppressedMessages":"35330","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35331","messages":"35332","suppressedMessages":"35333","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35334","messages":"35335","suppressedMessages":"35336","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35337","messages":"35338","suppressedMessages":"35339","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35340","messages":"35341","suppressedMessages":"35342","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35343","messages":"35344","suppressedMessages":"35345","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35346","messages":"35347","suppressedMessages":"35348","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35349","messages":"35350","suppressedMessages":"35351","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35352","messages":"35353","suppressedMessages":"35354","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35355","messages":"35356","suppressedMessages":"35357","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35358","messages":"35359","suppressedMessages":"35360","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35361","messages":"35362","suppressedMessages":"35363","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35364","messages":"35365","suppressedMessages":"35366","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35367","messages":"35368","suppressedMessages":"35369","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35370","messages":"35371","suppressedMessages":"35372","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35373","messages":"35374","suppressedMessages":"35375","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35376","messages":"35377","suppressedMessages":"35378","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35379","messages":"35380","suppressedMessages":"35381","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35382","messages":"35383","suppressedMessages":"35384","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35385","messages":"35386","suppressedMessages":"35387","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35388","messages":"35389","suppressedMessages":"35390","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35391","messages":"35392","suppressedMessages":"35393","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35394","messages":"35395","suppressedMessages":"35396","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35397","messages":"35398","suppressedMessages":"35399","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35400","messages":"35401","suppressedMessages":"35402","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35403","messages":"35404","suppressedMessages":"35405","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35406","messages":"35407","suppressedMessages":"35408","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35409","messages":"35410","suppressedMessages":"35411","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35412","messages":"35413","suppressedMessages":"35414","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35415","messages":"35416","suppressedMessages":"35417","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35418","messages":"35419","suppressedMessages":"35420","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35421","messages":"35422","suppressedMessages":"35423","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35424","messages":"35425","suppressedMessages":"35426","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35427","messages":"35428","suppressedMessages":"35429","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35430","messages":"35431","suppressedMessages":"35432","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35433","messages":"35434","suppressedMessages":"35435","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35436","messages":"35437","suppressedMessages":"35438","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35439","messages":"35440","suppressedMessages":"35441","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35442","messages":"35443","suppressedMessages":"35444","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35445","messages":"35446","suppressedMessages":"35447","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35448","messages":"35449","suppressedMessages":"35450","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35451","messages":"35452","suppressedMessages":"35453","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35454","messages":"35455","suppressedMessages":"35456","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35457","messages":"35458","suppressedMessages":"35459","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35460","messages":"35461","suppressedMessages":"35462","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35463","messages":"35464","suppressedMessages":"35465","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35466","messages":"35467","suppressedMessages":"35468","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35469","messages":"35470","suppressedMessages":"35471","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35472","messages":"35473","suppressedMessages":"35474","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35475","messages":"35476","suppressedMessages":"35477","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35478","messages":"35479","suppressedMessages":"35480","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35481","messages":"35482","suppressedMessages":"35483","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35484","messages":"35485","suppressedMessages":"35486","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35487","messages":"35488","suppressedMessages":"35489","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35490","messages":"35491","suppressedMessages":"35492","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35493","messages":"35494","suppressedMessages":"35495","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35496","messages":"35497","suppressedMessages":"35498","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35499","messages":"35500","suppressedMessages":"35501","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35502","messages":"35503","suppressedMessages":"35504","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35505","messages":"35506","suppressedMessages":"35507","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35508","messages":"35509","suppressedMessages":"35510","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35511","messages":"35512","suppressedMessages":"35513","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35514","messages":"35515","suppressedMessages":"35516","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35517","messages":"35518","suppressedMessages":"35519","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35520","messages":"35521","suppressedMessages":"35522","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35523","messages":"35524","suppressedMessages":"35525","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35526","messages":"35527","suppressedMessages":"35528","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35529","messages":"35530","suppressedMessages":"35531","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35532","messages":"35533","suppressedMessages":"35534","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35535","messages":"35536","suppressedMessages":"35537","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35538","messages":"35539","suppressedMessages":"35540","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35541","messages":"35542","suppressedMessages":"35543","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35544","messages":"35545","suppressedMessages":"35546","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35547","messages":"35548","suppressedMessages":"35549","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35550","messages":"35551","suppressedMessages":"35552","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35553","messages":"35554","suppressedMessages":"35555","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35556","messages":"35557","suppressedMessages":"35558","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35559","messages":"35560","suppressedMessages":"35561","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35562","messages":"35563","suppressedMessages":"35564","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35565","messages":"35566","suppressedMessages":"35567","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35568","messages":"35569","suppressedMessages":"35570","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35571","messages":"35572","suppressedMessages":"35573","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35574","messages":"35575","suppressedMessages":"35576","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35577","messages":"35578","suppressedMessages":"35579","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35580","messages":"35581","suppressedMessages":"35582","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35583","messages":"35584","suppressedMessages":"35585","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35586","messages":"35587","suppressedMessages":"35588","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35589","messages":"35590","suppressedMessages":"35591","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35592","messages":"35593","suppressedMessages":"35594","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35595","messages":"35596","suppressedMessages":"35597","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35598","messages":"35599","suppressedMessages":"35600","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35601","messages":"35602","suppressedMessages":"35603","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35604","messages":"35605","suppressedMessages":"35606","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35607","messages":"35608","suppressedMessages":"35609","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35610","messages":"35611","suppressedMessages":"35612","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35613","messages":"35614","suppressedMessages":"35615","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35616","messages":"35617","suppressedMessages":"35618","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35619","messages":"35620","suppressedMessages":"35621","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35622","messages":"35623","suppressedMessages":"35624","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35625","messages":"35626","suppressedMessages":"35627","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35628","messages":"35629","suppressedMessages":"35630","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35631","messages":"35632","suppressedMessages":"35633","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35634","messages":"35635","suppressedMessages":"35636","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35637","messages":"35638","suppressedMessages":"35639","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35640","messages":"35641","suppressedMessages":"35642","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35643","messages":"35644","suppressedMessages":"35645","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35646","messages":"35647","suppressedMessages":"35648","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35649","messages":"35650","suppressedMessages":"35651","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35652","messages":"35653","suppressedMessages":"35654","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35655","messages":"35656","suppressedMessages":"35657","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35658","messages":"35659","suppressedMessages":"35660","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35661","messages":"35662","suppressedMessages":"35663","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35664","messages":"35665","suppressedMessages":"35666","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35667","messages":"35668","suppressedMessages":"35669","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35670","messages":"35671","suppressedMessages":"35672","errorCount":58,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35673","messages":"35674","suppressedMessages":"35675","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35676","messages":"35677","suppressedMessages":"35678","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35679","messages":"35680","suppressedMessages":"35681","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35682","messages":"35683","suppressedMessages":"35684","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35685","messages":"35686","suppressedMessages":"35687","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35688","messages":"35689","suppressedMessages":"35690","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35691","messages":"35692","suppressedMessages":"35693","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35694","messages":"35695","suppressedMessages":"35696","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35697","messages":"35698","suppressedMessages":"35699","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35700","messages":"35701","suppressedMessages":"35702","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35703","messages":"35704","suppressedMessages":"35705","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35706","messages":"35707","suppressedMessages":"35708","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35709","messages":"35710","suppressedMessages":"35711","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35712","messages":"35713","suppressedMessages":"35714","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35715","messages":"35716","suppressedMessages":"35717","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35718","messages":"35719","suppressedMessages":"35720","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35721","messages":"35722","suppressedMessages":"35723","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35724","messages":"35725","suppressedMessages":"35726","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35727","messages":"35728","suppressedMessages":"35729","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35730","messages":"35731","suppressedMessages":"35732","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35733","messages":"35734","suppressedMessages":"35735","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35736","messages":"35737","suppressedMessages":"35738","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35739","messages":"35740","suppressedMessages":"35741","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35742","messages":"35743","suppressedMessages":"35744","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35745","messages":"35746","suppressedMessages":"35747","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35748","messages":"35749","suppressedMessages":"35750","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35751","messages":"35752","suppressedMessages":"35753","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35754","messages":"35755","suppressedMessages":"35756","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35757","messages":"35758","suppressedMessages":"35759","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35760","messages":"35761","suppressedMessages":"35762","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35763","messages":"35764","suppressedMessages":"35765","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35766","messages":"35767","suppressedMessages":"35768","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35769","messages":"35770","suppressedMessages":"35771","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35772","messages":"35773","suppressedMessages":"35774","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35775","messages":"35776","suppressedMessages":"35777","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35778","messages":"35779","suppressedMessages":"35780","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35781","messages":"35782","suppressedMessages":"35783","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35784","messages":"35785","suppressedMessages":"35786","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35787","messages":"35788","suppressedMessages":"35789","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35790","messages":"35791","suppressedMessages":"35792","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35793","messages":"35794","suppressedMessages":"35795","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35796","messages":"35797","suppressedMessages":"35798","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35799","messages":"35800","suppressedMessages":"35801","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35802","messages":"35803","suppressedMessages":"35804","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35805","messages":"35806","suppressedMessages":"35807","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35808","messages":"35809","suppressedMessages":"35810","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35811","messages":"35812","suppressedMessages":"35813","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35814","messages":"35815","suppressedMessages":"35816","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35817","messages":"35818","suppressedMessages":"35819","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35820","messages":"35821","suppressedMessages":"35822","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35823","messages":"35824","suppressedMessages":"35825","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35826","messages":"35827","suppressedMessages":"35828","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35829","messages":"35830","suppressedMessages":"35831","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35832","messages":"35833","suppressedMessages":"35834","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35835","messages":"35836","suppressedMessages":"35837","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35838","messages":"35839","suppressedMessages":"35840","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35841","messages":"35842","suppressedMessages":"35843","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35844","messages":"35845","suppressedMessages":"35846","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35847","messages":"35848","suppressedMessages":"35849","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35850","messages":"35851","suppressedMessages":"35852","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35853","messages":"35854","suppressedMessages":"35855","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35856","messages":"35857","suppressedMessages":"35858","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35859","messages":"35860","suppressedMessages":"35861","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35862","messages":"35863","suppressedMessages":"35864","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35865","messages":"35866","suppressedMessages":"35867","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35868","messages":"35869","suppressedMessages":"35870","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35871","messages":"35872","suppressedMessages":"35873","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35874","messages":"35875","suppressedMessages":"35876","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35877","messages":"35878","suppressedMessages":"35879","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35880","messages":"35881","suppressedMessages":"35882","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35883","messages":"35884","suppressedMessages":"35885","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35886","messages":"35887","suppressedMessages":"35888","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35889","messages":"35890","suppressedMessages":"35891","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35892","messages":"35893","suppressedMessages":"35894","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35895","messages":"35896","suppressedMessages":"35897","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35898","messages":"35899","suppressedMessages":"35900","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35901","messages":"35902","suppressedMessages":"35903","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35904","messages":"35905","suppressedMessages":"35906","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35907","messages":"35908","suppressedMessages":"35909","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35910","messages":"35911","suppressedMessages":"35912","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35913","messages":"35914","suppressedMessages":"35915","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35916","messages":"35917","suppressedMessages":"35918","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35919","messages":"35920","suppressedMessages":"35921","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35922","messages":"35923","suppressedMessages":"35924","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35925","messages":"35926","suppressedMessages":"35927","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35928","messages":"35929","suppressedMessages":"35930","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35931","messages":"35932","suppressedMessages":"35933","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35934","messages":"35935","suppressedMessages":"35936","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35937","messages":"35938","suppressedMessages":"35939","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35940","messages":"35941","suppressedMessages":"35942","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35943","messages":"35944","suppressedMessages":"35945","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35946","messages":"35947","suppressedMessages":"35948","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35949","messages":"35950","suppressedMessages":"35951","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35952","messages":"35953","suppressedMessages":"35954","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35955","messages":"35956","suppressedMessages":"35957","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35958","messages":"35959","suppressedMessages":"35960","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35961","messages":"35962","suppressedMessages":"35963","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"35964","messages":"35965","suppressedMessages":"35966","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35967","messages":"35968","suppressedMessages":"35969","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35970","messages":"35971","suppressedMessages":"35972","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35973","messages":"35974","suppressedMessages":"35975","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35976","messages":"35977","suppressedMessages":"35978","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35979","messages":"35980","suppressedMessages":"35981","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35982","messages":"35983","suppressedMessages":"35984","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35985","messages":"35986","suppressedMessages":"35987","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35988","messages":"35989","suppressedMessages":"35990","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35991","messages":"35992","suppressedMessages":"35993","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35994","messages":"35995","suppressedMessages":"35996","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"35997","messages":"35998","suppressedMessages":"35999","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36000","messages":"36001","suppressedMessages":"36002","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36003","messages":"36004","suppressedMessages":"36005","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36006","messages":"36007","suppressedMessages":"36008","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36009","messages":"36010","suppressedMessages":"36011","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36012","messages":"36013","suppressedMessages":"36014","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36015","messages":"36016","suppressedMessages":"36017","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36018","messages":"36019","suppressedMessages":"36020","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36021","messages":"36022","suppressedMessages":"36023","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36024","messages":"36025","suppressedMessages":"36026","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36027","messages":"36028","suppressedMessages":"36029","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36030","messages":"36031","suppressedMessages":"36032","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36033","messages":"36034","suppressedMessages":"36035","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36036","messages":"36037","suppressedMessages":"36038","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36039","messages":"36040","suppressedMessages":"36041","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36042","messages":"36043","suppressedMessages":"36044","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36045","messages":"36046","suppressedMessages":"36047","errorCount":79,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36048","messages":"36049","suppressedMessages":"36050","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36051","messages":"36052","suppressedMessages":"36053","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36054","messages":"36055","suppressedMessages":"36056","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36057","messages":"36058","suppressedMessages":"36059","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36060","messages":"36061","suppressedMessages":"36062","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36063","messages":"36064","suppressedMessages":"36065","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36066","messages":"36067","suppressedMessages":"36068","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36069","messages":"36070","suppressedMessages":"36071","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36072","messages":"36073","suppressedMessages":"36074","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36075","messages":"36076","suppressedMessages":"36077","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36078","messages":"36079","suppressedMessages":"36080","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36081","messages":"36082","suppressedMessages":"36083","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36084","messages":"36085","suppressedMessages":"36086","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36087","messages":"36088","suppressedMessages":"36089","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36090","messages":"36091","suppressedMessages":"36092","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36093","messages":"36094","suppressedMessages":"36095","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36096","messages":"36097","suppressedMessages":"36098","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36099","messages":"36100","suppressedMessages":"36101","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36102","messages":"36103","suppressedMessages":"36104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36105","messages":"36106","suppressedMessages":"36107","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36108","messages":"36109","suppressedMessages":"36110","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36111","messages":"36112","suppressedMessages":"36113","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36114","messages":"36115","suppressedMessages":"36116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36117","messages":"36118","suppressedMessages":"36119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36120","messages":"36121","suppressedMessages":"36122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36123","messages":"36124","suppressedMessages":"36125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36126","messages":"36127","suppressedMessages":"36128","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36129","messages":"36130","suppressedMessages":"36131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36132","messages":"36133","suppressedMessages":"36134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36135","messages":"36136","suppressedMessages":"36137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36138","messages":"36139","suppressedMessages":"36140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36141","messages":"36142","suppressedMessages":"36143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36144","messages":"36145","suppressedMessages":"36146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36147","messages":"36148","suppressedMessages":"36149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36150","messages":"36151","suppressedMessages":"36152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36153","messages":"36154","suppressedMessages":"36155","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36156","messages":"36157","suppressedMessages":"36158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36159","messages":"36160","suppressedMessages":"36161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36162","messages":"36163","suppressedMessages":"36164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36165","messages":"36166","suppressedMessages":"36167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36168","messages":"36169","suppressedMessages":"36170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36171","messages":"36172","suppressedMessages":"36173","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36174","messages":"36175","suppressedMessages":"36176","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36177","messages":"36178","suppressedMessages":"36179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36180","messages":"36181","suppressedMessages":"36182","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36183","messages":"36184","suppressedMessages":"36185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36186","messages":"36187","suppressedMessages":"36188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36189","messages":"36190","suppressedMessages":"36191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36192","messages":"36193","suppressedMessages":"36194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36195","messages":"36196","suppressedMessages":"36197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36198","messages":"36199","suppressedMessages":"36200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36201","messages":"36202","suppressedMessages":"36203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36204","messages":"36205","suppressedMessages":"36206","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36207","messages":"36208","suppressedMessages":"36209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36210","messages":"36211","suppressedMessages":"36212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36213","messages":"36214","suppressedMessages":"36215","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36216","messages":"36217","suppressedMessages":"36218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36219","messages":"36220","suppressedMessages":"36221","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36222","messages":"36223","suppressedMessages":"36224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36225","messages":"36226","suppressedMessages":"36227","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36228","messages":"36229","suppressedMessages":"36230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36231","messages":"36232","suppressedMessages":"36233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36234","messages":"36235","suppressedMessages":"36236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36237","messages":"36238","suppressedMessages":"36239","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36240","messages":"36241","suppressedMessages":"36242","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36243","messages":"36244","suppressedMessages":"36245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36246","messages":"36247","suppressedMessages":"36248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36249","messages":"36250","suppressedMessages":"36251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36252","messages":"36253","suppressedMessages":"36254","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36255","messages":"36256","suppressedMessages":"36257","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36258","messages":"36259","suppressedMessages":"36260","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36261","messages":"36262","suppressedMessages":"36263","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36264","messages":"36265","suppressedMessages":"36266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36267","messages":"36268","suppressedMessages":"36269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36270","messages":"36271","suppressedMessages":"36272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36273","messages":"36274","suppressedMessages":"36275","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36276","messages":"36277","suppressedMessages":"36278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36279","messages":"36280","suppressedMessages":"36281","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36282","messages":"36283","suppressedMessages":"36284","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36285","messages":"36286","suppressedMessages":"36287","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36288","messages":"36289","suppressedMessages":"36290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36291","messages":"36292","suppressedMessages":"36293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36294","messages":"36295","suppressedMessages":"36296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36297","messages":"36298","suppressedMessages":"36299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36300","messages":"36301","suppressedMessages":"36302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36303","messages":"36304","suppressedMessages":"36305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36306","messages":"36307","suppressedMessages":"36308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36309","messages":"36310","suppressedMessages":"36311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36312","messages":"36313","suppressedMessages":"36314","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36315","messages":"36316","suppressedMessages":"36317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36318","messages":"36319","suppressedMessages":"36320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36321","messages":"36322","suppressedMessages":"36323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36324","messages":"36325","suppressedMessages":"36326","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36327","messages":"36328","suppressedMessages":"36329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36330","messages":"36331","suppressedMessages":"36332","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36333","messages":"36334","suppressedMessages":"36335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36336","messages":"36337","suppressedMessages":"36338","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36339","messages":"36340","suppressedMessages":"36341","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36342","messages":"36343","suppressedMessages":"36344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36345","messages":"36346","suppressedMessages":"36347","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36348","messages":"36349","suppressedMessages":"36350","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36351","messages":"36352","suppressedMessages":"36353","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36354","messages":"36355","suppressedMessages":"36356","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36357","messages":"36358","suppressedMessages":"36359","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36360","messages":"36361","suppressedMessages":"36362","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36363","messages":"36364","suppressedMessages":"36365","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36366","messages":"36367","suppressedMessages":"36368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36369","messages":"36370","suppressedMessages":"36371","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36372","messages":"36373","suppressedMessages":"36374","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36375","messages":"36376","suppressedMessages":"36377","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36378","messages":"36379","suppressedMessages":"36380","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36381","messages":"36382","suppressedMessages":"36383","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36384","messages":"36385","suppressedMessages":"36386","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36387","messages":"36388","suppressedMessages":"36389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36390","messages":"36391","suppressedMessages":"36392","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36393","messages":"36394","suppressedMessages":"36395","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36396","messages":"36397","suppressedMessages":"36398","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36399","messages":"36400","suppressedMessages":"36401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36402","messages":"36403","suppressedMessages":"36404","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36405","messages":"36406","suppressedMessages":"36407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36408","messages":"36409","suppressedMessages":"36410","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36411","messages":"36412","suppressedMessages":"36413","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36414","messages":"36415","suppressedMessages":"36416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36417","messages":"36418","suppressedMessages":"36419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36420","messages":"36421","suppressedMessages":"36422","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36423","messages":"36424","suppressedMessages":"36425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36426","messages":"36427","suppressedMessages":"36428","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36429","messages":"36430","suppressedMessages":"36431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36432","messages":"36433","suppressedMessages":"36434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36435","messages":"36436","suppressedMessages":"36437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36438","messages":"36439","suppressedMessages":"36440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36441","messages":"36442","suppressedMessages":"36443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36444","messages":"36445","suppressedMessages":"36446","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36447","messages":"36448","suppressedMessages":"36449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36450","messages":"36451","suppressedMessages":"36452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36453","messages":"36454","suppressedMessages":"36455","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36456","messages":"36457","suppressedMessages":"36458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36459","messages":"36460","suppressedMessages":"36461","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36462","messages":"36463","suppressedMessages":"36464","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36465","messages":"36466","suppressedMessages":"36467","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36468","messages":"36469","suppressedMessages":"36470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36471","messages":"36472","suppressedMessages":"36473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36474","messages":"36475","suppressedMessages":"36476","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36477","messages":"36478","suppressedMessages":"36479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36480","messages":"36481","suppressedMessages":"36482","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36483","messages":"36484","suppressedMessages":"36485","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36486","messages":"36487","suppressedMessages":"36488","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36489","messages":"36490","suppressedMessages":"36491","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36492","messages":"36493","suppressedMessages":"36494","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36495","messages":"36496","suppressedMessages":"36497","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36498","messages":"36499","suppressedMessages":"36500","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36501","messages":"36502","suppressedMessages":"36503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36504","messages":"36505","suppressedMessages":"36506","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36507","messages":"36508","suppressedMessages":"36509","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36510","messages":"36511","suppressedMessages":"36512","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36513","messages":"36514","suppressedMessages":"36515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36516","messages":"36517","suppressedMessages":"36518","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36519","messages":"36520","suppressedMessages":"36521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36522","messages":"36523","suppressedMessages":"36524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36525","messages":"36526","suppressedMessages":"36527","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36528","messages":"36529","suppressedMessages":"36530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36531","messages":"36532","suppressedMessages":"36533","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36534","messages":"36535","suppressedMessages":"36536","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36537","messages":"36538","suppressedMessages":"36539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36540","messages":"36541","suppressedMessages":"36542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36543","messages":"36544","suppressedMessages":"36545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36546","messages":"36547","suppressedMessages":"36548","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36549","messages":"36550","suppressedMessages":"36551","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36552","messages":"36553","suppressedMessages":"36554","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36555","messages":"36556","suppressedMessages":"36557","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36558","messages":"36559","suppressedMessages":"36560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36561","messages":"36562","suppressedMessages":"36563","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36564","messages":"36565","suppressedMessages":"36566","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36567","messages":"36568","suppressedMessages":"36569","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36570","messages":"36571","suppressedMessages":"36572","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36573","messages":"36574","suppressedMessages":"36575","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36576","messages":"36577","suppressedMessages":"36578","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36579","messages":"36580","suppressedMessages":"36581","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36582","messages":"36583","suppressedMessages":"36584","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36585","messages":"36586","suppressedMessages":"36587","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36588","messages":"36589","suppressedMessages":"36590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36591","messages":"36592","suppressedMessages":"36593","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36594","messages":"36595","suppressedMessages":"36596","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36597","messages":"36598","suppressedMessages":"36599","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36600","messages":"36601","suppressedMessages":"36602","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36603","messages":"36604","suppressedMessages":"36605","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36606","messages":"36607","suppressedMessages":"36608","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36609","messages":"36610","suppressedMessages":"36611","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36612","messages":"36613","suppressedMessages":"36614","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36615","messages":"36616","suppressedMessages":"36617","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36618","messages":"36619","suppressedMessages":"36620","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36621","messages":"36622","suppressedMessages":"36623","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36624","messages":"36625","suppressedMessages":"36626","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36627","messages":"36628","suppressedMessages":"36629","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36630","messages":"36631","suppressedMessages":"36632","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36633","messages":"36634","suppressedMessages":"36635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36636","messages":"36637","suppressedMessages":"36638","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36639","messages":"36640","suppressedMessages":"36641","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36642","messages":"36643","suppressedMessages":"36644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36645","messages":"36646","suppressedMessages":"36647","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36648","messages":"36649","suppressedMessages":"36650","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36651","messages":"36652","suppressedMessages":"36653","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36654","messages":"36655","suppressedMessages":"36656","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36657","messages":"36658","suppressedMessages":"36659","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36660","messages":"36661","suppressedMessages":"36662","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36663","messages":"36664","suppressedMessages":"36665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36666","messages":"36667","suppressedMessages":"36668","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36669","messages":"36670","suppressedMessages":"36671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36672","messages":"36673","suppressedMessages":"36674","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36675","messages":"36676","suppressedMessages":"36677","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36678","messages":"36679","suppressedMessages":"36680","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36681","messages":"36682","suppressedMessages":"36683","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36684","messages":"36685","suppressedMessages":"36686","errorCount":20,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36687","messages":"36688","suppressedMessages":"36689","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36690","messages":"36691","suppressedMessages":"36692","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36693","messages":"36694","suppressedMessages":"36695","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36696","messages":"36697","suppressedMessages":"36698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36699","messages":"36700","suppressedMessages":"36701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36702","messages":"36703","suppressedMessages":"36704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36705","messages":"36706","suppressedMessages":"36707","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36708","messages":"36709","suppressedMessages":"36710","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36711","messages":"36712","suppressedMessages":"36713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36714","messages":"36715","suppressedMessages":"36716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36717","messages":"36718","suppressedMessages":"36719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36720","messages":"36721","suppressedMessages":"36722","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36723","messages":"36724","suppressedMessages":"36725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36726","messages":"36727","suppressedMessages":"36728","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36729","messages":"36730","suppressedMessages":"36731","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36732","messages":"36733","suppressedMessages":"36734","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36735","messages":"36736","suppressedMessages":"36737","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36738","messages":"36739","suppressedMessages":"36740","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36741","messages":"36742","suppressedMessages":"36743","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36744","messages":"36745","suppressedMessages":"36746","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36747","messages":"36748","suppressedMessages":"36749","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36750","messages":"36751","suppressedMessages":"36752","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36753","messages":"36754","suppressedMessages":"36755","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36756","messages":"36757","suppressedMessages":"36758","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36759","messages":"36760","suppressedMessages":"36761","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36762","messages":"36763","suppressedMessages":"36764","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36765","messages":"36766","suppressedMessages":"36767","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36768","messages":"36769","suppressedMessages":"36770","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36771","messages":"36772","suppressedMessages":"36773","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36774","messages":"36775","suppressedMessages":"36776","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36777","messages":"36778","suppressedMessages":"36779","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36780","messages":"36781","suppressedMessages":"36782","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36783","messages":"36784","suppressedMessages":"36785","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36786","messages":"36787","suppressedMessages":"36788","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36789","messages":"36790","suppressedMessages":"36791","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36792","messages":"36793","suppressedMessages":"36794","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36795","messages":"36796","suppressedMessages":"36797","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36798","messages":"36799","suppressedMessages":"36800","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36801","messages":"36802","suppressedMessages":"36803","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36804","messages":"36805","suppressedMessages":"36806","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36807","messages":"36808","suppressedMessages":"36809","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36810","messages":"36811","suppressedMessages":"36812","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36813","messages":"36814","suppressedMessages":"36815","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36816","messages":"36817","suppressedMessages":"36818","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36819","messages":"36820","suppressedMessages":"36821","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36822","messages":"36823","suppressedMessages":"36824","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36825","messages":"36826","suppressedMessages":"36827","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36828","messages":"36829","suppressedMessages":"36830","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36831","messages":"36832","suppressedMessages":"36833","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36834","messages":"36835","suppressedMessages":"36836","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36837","messages":"36838","suppressedMessages":"36839","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36840","messages":"36841","suppressedMessages":"36842","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36843","messages":"36844","suppressedMessages":"36845","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36846","messages":"36847","suppressedMessages":"36848","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36849","messages":"36850","suppressedMessages":"36851","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36852","messages":"36853","suppressedMessages":"36854","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36855","messages":"36856","suppressedMessages":"36857","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36858","messages":"36859","suppressedMessages":"36860","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36861","messages":"36862","suppressedMessages":"36863","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36864","messages":"36865","suppressedMessages":"36866","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36867","messages":"36868","suppressedMessages":"36869","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36870","messages":"36871","suppressedMessages":"36872","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36873","messages":"36874","suppressedMessages":"36875","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36876","messages":"36877","suppressedMessages":"36878","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36879","messages":"36880","suppressedMessages":"36881","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36882","messages":"36883","suppressedMessages":"36884","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36885","messages":"36886","suppressedMessages":"36887","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36888","messages":"36889","suppressedMessages":"36890","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36891","messages":"36892","suppressedMessages":"36893","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36894","messages":"36895","suppressedMessages":"36896","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36897","messages":"36898","suppressedMessages":"36899","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36900","messages":"36901","suppressedMessages":"36902","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36903","messages":"36904","suppressedMessages":"36905","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36906","messages":"36907","suppressedMessages":"36908","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36909","messages":"36910","suppressedMessages":"36911","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36912","messages":"36913","suppressedMessages":"36914","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36915","messages":"36916","suppressedMessages":"36917","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36918","messages":"36919","suppressedMessages":"36920","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36921","messages":"36922","suppressedMessages":"36923","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36924","messages":"36925","suppressedMessages":"36926","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36927","messages":"36928","suppressedMessages":"36929","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36930","messages":"36931","suppressedMessages":"36932","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36933","messages":"36934","suppressedMessages":"36935","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36936","messages":"36937","suppressedMessages":"36938","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36939","messages":"36940","suppressedMessages":"36941","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36942","messages":"36943","suppressedMessages":"36944","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36945","messages":"36946","suppressedMessages":"36947","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"36948","messages":"36949","suppressedMessages":"36950","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36951","messages":"36952","suppressedMessages":"36953","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36954","messages":"36955","suppressedMessages":"36956","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36957","messages":"36958","suppressedMessages":"36959","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36960","messages":"36961","suppressedMessages":"36962","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36963","messages":"36964","suppressedMessages":"36965","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36966","messages":"36967","suppressedMessages":"36968","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36969","messages":"36970","suppressedMessages":"36971","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36972","messages":"36973","suppressedMessages":"36974","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36975","messages":"36976","suppressedMessages":"36977","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36978","messages":"36979","suppressedMessages":"36980","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36981","messages":"36982","suppressedMessages":"36983","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36984","messages":"36985","suppressedMessages":"36986","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36987","messages":"36988","suppressedMessages":"36989","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36990","messages":"36991","suppressedMessages":"36992","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36993","messages":"36994","suppressedMessages":"36995","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36996","messages":"36997","suppressedMessages":"36998","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36999","messages":"37000","suppressedMessages":"37001","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37002","messages":"37003","suppressedMessages":"37004","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37005","messages":"37006","suppressedMessages":"37007","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37008","messages":"37009","suppressedMessages":"37010","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37011","messages":"37012","suppressedMessages":"37013","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37014","messages":"37015","suppressedMessages":"37016","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37017","messages":"37018","suppressedMessages":"37019","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37020","messages":"37021","suppressedMessages":"37022","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37023","messages":"37024","suppressedMessages":"37025","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37026","messages":"37027","suppressedMessages":"37028","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37029","messages":"37030","suppressedMessages":"37031","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37032","messages":"37033","suppressedMessages":"37034","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37035","messages":"37036","suppressedMessages":"37037","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37038","messages":"37039","suppressedMessages":"37040","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37041","messages":"37042","suppressedMessages":"37043","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37044","messages":"37045","suppressedMessages":"37046","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37047","messages":"37048","suppressedMessages":"37049","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37050","messages":"37051","suppressedMessages":"37052","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37053","messages":"37054","suppressedMessages":"37055","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37056","messages":"37057","suppressedMessages":"37058","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37059","messages":"37060","suppressedMessages":"37061","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37062","messages":"37063","suppressedMessages":"37064","errorCount":54,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37065","messages":"37066","suppressedMessages":"37067","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37068","messages":"37069","suppressedMessages":"37070","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37071","messages":"37072","suppressedMessages":"37073","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37074","messages":"37075","suppressedMessages":"37076","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37077","messages":"37078","suppressedMessages":"37079","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37080","messages":"37081","suppressedMessages":"37082","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37083","messages":"37084","suppressedMessages":"37085","errorCount":13,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37086","messages":"37087","suppressedMessages":"37088","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37089","messages":"37090","suppressedMessages":"37091","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37092","messages":"37093","suppressedMessages":"37094","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37095","messages":"37096","suppressedMessages":"37097","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37098","messages":"37099","suppressedMessages":"37100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37101","messages":"37102","suppressedMessages":"37103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37104","messages":"37105","suppressedMessages":"37106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37107","messages":"37108","suppressedMessages":"37109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37110","messages":"37111","suppressedMessages":"37112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37113","messages":"37114","suppressedMessages":"37115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37116","messages":"37117","suppressedMessages":"37118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37119","messages":"37120","suppressedMessages":"37121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37122","messages":"37123","suppressedMessages":"37124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37125","messages":"37126","suppressedMessages":"37127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37128","messages":"37129","suppressedMessages":"37130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37131","messages":"37132","suppressedMessages":"37133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37134","messages":"37135","suppressedMessages":"37136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37137","messages":"37138","suppressedMessages":"37139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37140","messages":"37141","suppressedMessages":"37142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37143","messages":"37144","suppressedMessages":"37145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37146","messages":"37147","suppressedMessages":"37148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37149","messages":"37150","suppressedMessages":"37151","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37152","messages":"37153","suppressedMessages":"37154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37155","messages":"37156","suppressedMessages":"37157","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37158","messages":"37159","suppressedMessages":"37160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37161","messages":"37162","suppressedMessages":"37163","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37164","messages":"37165","suppressedMessages":"37166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37167","messages":"37168","suppressedMessages":"37169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37170","messages":"37171","suppressedMessages":"37172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37173","messages":"37174","suppressedMessages":"37175","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37176","messages":"37177","suppressedMessages":"37178","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37179","messages":"37180","suppressedMessages":"37181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37182","messages":"37183","suppressedMessages":"37184","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37185","messages":"37186","suppressedMessages":"37187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37188","messages":"37189","suppressedMessages":"37190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37191","messages":"37192","suppressedMessages":"37193","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37194","messages":"37195","suppressedMessages":"37196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37197","messages":"37198","suppressedMessages":"37199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37200","messages":"37201","suppressedMessages":"37202","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37203","messages":"37204","suppressedMessages":"37205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37206","messages":"37207","suppressedMessages":"37208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37209","messages":"37210","suppressedMessages":"37211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37212","messages":"37213","suppressedMessages":"37214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37215","messages":"37216","suppressedMessages":"37217","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37218","messages":"37219","suppressedMessages":"37220","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37221","messages":"37222","suppressedMessages":"37223","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37224","messages":"37225","suppressedMessages":"37226","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37227","messages":"37228","suppressedMessages":"37229","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37230","messages":"37231","suppressedMessages":"37232","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37233","messages":"37234","suppressedMessages":"37235","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37236","messages":"37237","suppressedMessages":"37238","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37239","messages":"37240","suppressedMessages":"37241","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37242","messages":"37243","suppressedMessages":"37244","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37245","messages":"37246","suppressedMessages":"37247","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37248","messages":"37249","suppressedMessages":"37250","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37251","messages":"37252","suppressedMessages":"37253","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37254","messages":"37255","suppressedMessages":"37256","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37257","messages":"37258","suppressedMessages":"37259","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37260","messages":"37261","suppressedMessages":"37262","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37263","messages":"37264","suppressedMessages":"37265","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37266","messages":"37267","suppressedMessages":"37268","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37269","messages":"37270","suppressedMessages":"37271","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37272","messages":"37273","suppressedMessages":"37274","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37275","messages":"37276","suppressedMessages":"37277","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37278","messages":"37279","suppressedMessages":"37280","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37281","messages":"37282","suppressedMessages":"37283","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37284","messages":"37285","suppressedMessages":"37286","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37287","messages":"37288","suppressedMessages":"37289","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37290","messages":"37291","suppressedMessages":"37292","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37293","messages":"37294","suppressedMessages":"37295","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37296","messages":"37297","suppressedMessages":"37298","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37299","messages":"37300","suppressedMessages":"37301","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37302","messages":"37303","suppressedMessages":"37304","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37305","messages":"37306","suppressedMessages":"37307","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37308","messages":"37309","suppressedMessages":"37310","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37311","messages":"37312","suppressedMessages":"37313","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37314","messages":"37315","suppressedMessages":"37316","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37317","messages":"37318","suppressedMessages":"37319","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37320","messages":"37321","suppressedMessages":"37322","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37323","messages":"37324","suppressedMessages":"37325","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37326","messages":"37327","suppressedMessages":"37328","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37329","messages":"37330","suppressedMessages":"37331","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37332","messages":"37333","suppressedMessages":"37334","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37335","messages":"37336","suppressedMessages":"37337","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37338","messages":"37339","suppressedMessages":"37340","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37341","messages":"37342","suppressedMessages":"37343","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37344","messages":"37345","suppressedMessages":"37346","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37347","messages":"37348","suppressedMessages":"37349","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37350","messages":"37351","suppressedMessages":"37352","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37353","messages":"37354","suppressedMessages":"37355","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37356","messages":"37357","suppressedMessages":"37358","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37359","messages":"37360","suppressedMessages":"37361","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37362","messages":"37363","suppressedMessages":"37364","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37365","messages":"37366","suppressedMessages":"37367","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37368","messages":"37369","suppressedMessages":"37370","errorCount":22,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37371","messages":"37372","suppressedMessages":"37373","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37374","messages":"37375","suppressedMessages":"37376","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37377","messages":"37378","suppressedMessages":"37379","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37380","messages":"37381","suppressedMessages":"37382","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37383","messages":"37384","suppressedMessages":"37385","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37386","messages":"37387","suppressedMessages":"37388","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37389","messages":"37390","suppressedMessages":"37391","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37392","messages":"37393","suppressedMessages":"37394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37395","messages":"37396","suppressedMessages":"37397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37398","messages":"37399","suppressedMessages":"37400","errorCount":54,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37401","messages":"37402","suppressedMessages":"37403","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37404","messages":"37405","suppressedMessages":"37406","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37407","messages":"37408","suppressedMessages":"37409","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37410","messages":"37411","suppressedMessages":"37412","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37413","messages":"37414","suppressedMessages":"37415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37416","messages":"37417","suppressedMessages":"37418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37419","messages":"37420","suppressedMessages":"37421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37422","messages":"37423","suppressedMessages":"37424","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37425","messages":"37426","suppressedMessages":"37427","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37428","messages":"37429","suppressedMessages":"37430","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37431","messages":"37432","suppressedMessages":"37433","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37434","messages":"37435","suppressedMessages":"37436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37437","messages":"37438","suppressedMessages":"37439","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37440","messages":"37441","suppressedMessages":"37442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37443","messages":"37444","suppressedMessages":"37445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37446","messages":"37447","suppressedMessages":"37448","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37449","messages":"37450","suppressedMessages":"37451","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37452","messages":"37453","suppressedMessages":"37454","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37455","messages":"37456","suppressedMessages":"37457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37458","messages":"37459","suppressedMessages":"37460","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37461","messages":"37462","suppressedMessages":"37463","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37464","messages":"37465","suppressedMessages":"37466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37467","messages":"37468","suppressedMessages":"37469","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37470","messages":"37471","suppressedMessages":"37472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37473","messages":"37474","suppressedMessages":"37475","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37476","messages":"37477","suppressedMessages":"37478","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37479","messages":"37480","suppressedMessages":"37481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37482","messages":"37483","suppressedMessages":"37484","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37485","messages":"37486","suppressedMessages":"37487","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37488","messages":"37489","suppressedMessages":"37490","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37491","messages":"37492","suppressedMessages":"37493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37494","messages":"37495","suppressedMessages":"37496","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37497","messages":"37498","suppressedMessages":"37499","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37500","messages":"37501","suppressedMessages":"37502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37503","messages":"37504","suppressedMessages":"37505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37506","messages":"37507","suppressedMessages":"37508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37509","messages":"37510","suppressedMessages":"37511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37512","messages":"37513","suppressedMessages":"37514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37515","messages":"37516","suppressedMessages":"37517","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37518","messages":"37519","suppressedMessages":"37520","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37521","messages":"37522","suppressedMessages":"37523","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37524","messages":"37525","suppressedMessages":"37526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37527","messages":"37528","suppressedMessages":"37529","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37530","messages":"37531","suppressedMessages":"37532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37533","messages":"37534","suppressedMessages":"37535","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37536","messages":"37537","suppressedMessages":"37538","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37539","messages":"37540","suppressedMessages":"37541","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37542","messages":"37543","suppressedMessages":"37544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37545","messages":"37546","suppressedMessages":"37547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37548","messages":"37549","suppressedMessages":"37550","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37551","messages":"37552","suppressedMessages":"37553","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37554","messages":"37555","suppressedMessages":"37556","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37557","messages":"37558","suppressedMessages":"37559","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37560","messages":"37561","suppressedMessages":"37562","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37563","messages":"37564","suppressedMessages":"37565","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37566","messages":"37567","suppressedMessages":"37568","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37569","messages":"37570","suppressedMessages":"37571","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37572","messages":"37573","suppressedMessages":"37574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37575","messages":"37576","suppressedMessages":"37577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37578","messages":"37579","suppressedMessages":"37580","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37581","messages":"37582","suppressedMessages":"37583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37584","messages":"37585","suppressedMessages":"37586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37587","messages":"37588","suppressedMessages":"37589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37590","messages":"37591","suppressedMessages":"37592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37593","messages":"37594","suppressedMessages":"37595","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37596","messages":"37597","suppressedMessages":"37598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37599","messages":"37600","suppressedMessages":"37601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37602","messages":"37603","suppressedMessages":"37604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37605","messages":"37606","suppressedMessages":"37607","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37608","messages":"37609","suppressedMessages":"37610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37611","messages":"37612","suppressedMessages":"37613","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37614","messages":"37615","suppressedMessages":"37616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37617","messages":"37618","suppressedMessages":"37619","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37620","messages":"37621","suppressedMessages":"37622","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37623","messages":"37624","suppressedMessages":"37625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37626","messages":"37627","suppressedMessages":"37628","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37629","messages":"37630","suppressedMessages":"37631","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37632","messages":"37633","suppressedMessages":"37634","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37635","messages":"37636","suppressedMessages":"37637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37638","messages":"37639","suppressedMessages":"37640","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37641","messages":"37642","suppressedMessages":"37643","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37644","messages":"37645","suppressedMessages":"37646","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37647","messages":"37648","suppressedMessages":"37649","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37650","messages":"37651","suppressedMessages":"37652","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37653","messages":"37654","suppressedMessages":"37655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37656","messages":"37657","suppressedMessages":"37658","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37659","messages":"37660","suppressedMessages":"37661","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37662","messages":"37663","suppressedMessages":"37664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37665","messages":"37666","suppressedMessages":"37667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37668","messages":"37669","suppressedMessages":"37670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37671","messages":"37672","suppressedMessages":"37673","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37674","messages":"37675","suppressedMessages":"37676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37677","messages":"37678","suppressedMessages":"37679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37680","messages":"37681","suppressedMessages":"37682","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37683","messages":"37684","suppressedMessages":"37685","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37686","messages":"37687","suppressedMessages":"37688","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37689","messages":"37690","suppressedMessages":"37691","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37692","messages":"37693","suppressedMessages":"37694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37695","messages":"37696","suppressedMessages":"37697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37698","messages":"37699","suppressedMessages":"37700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37701","messages":"37702","suppressedMessages":"37703","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37704","messages":"37705","suppressedMessages":"37706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37707","messages":"37708","suppressedMessages":"37709","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37710","messages":"37711","suppressedMessages":"37712","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37713","messages":"37714","suppressedMessages":"37715","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37716","messages":"37717","suppressedMessages":"37718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37719","messages":"37720","suppressedMessages":"37721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37722","messages":"37723","suppressedMessages":"37724","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37725","messages":"37726","suppressedMessages":"37727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37728","messages":"37729","suppressedMessages":"37730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37731","messages":"37732","suppressedMessages":"37733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37734","messages":"37735","suppressedMessages":"37736","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37737","messages":"37738","suppressedMessages":"37739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37740","messages":"37741","suppressedMessages":"37742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37743","messages":"37744","suppressedMessages":"37745","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37746","messages":"37747","suppressedMessages":"37748","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37749","messages":"37750","suppressedMessages":"37751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37752","messages":"37753","suppressedMessages":"37754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37755","messages":"37756","suppressedMessages":"37757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37758","messages":"37759","suppressedMessages":"37760","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37761","messages":"37762","suppressedMessages":"37763","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37764","messages":"37765","suppressedMessages":"37766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37767","messages":"37768","suppressedMessages":"37769","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37770","messages":"37771","suppressedMessages":"37772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37773","messages":"37774","suppressedMessages":"37775","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37776","messages":"37777","suppressedMessages":"37778","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37779","messages":"37780","suppressedMessages":"37781","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37782","messages":"37783","suppressedMessages":"37784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37785","messages":"37786","suppressedMessages":"37787","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37788","messages":"37789","suppressedMessages":"37790","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37791","messages":"37792","suppressedMessages":"37793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37794","messages":"37795","suppressedMessages":"37796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37797","messages":"37798","suppressedMessages":"37799","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37800","messages":"37801","suppressedMessages":"37802","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37803","messages":"37804","suppressedMessages":"37805","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37806","messages":"37807","suppressedMessages":"37808","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37809","messages":"37810","suppressedMessages":"37811","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37812","messages":"37813","suppressedMessages":"37814","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37815","messages":"37816","suppressedMessages":"37817","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37818","messages":"37819","suppressedMessages":"37820","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37821","messages":"37822","suppressedMessages":"37823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37824","messages":"37825","suppressedMessages":"37826","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37827","messages":"37828","suppressedMessages":"37829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37830","messages":"37831","suppressedMessages":"37832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37833","messages":"37834","suppressedMessages":"37835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37836","messages":"37837","suppressedMessages":"37838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37839","messages":"37840","suppressedMessages":"37841","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37842","messages":"37843","suppressedMessages":"37844","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37845","messages":"37846","suppressedMessages":"37847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37848","messages":"37849","suppressedMessages":"37850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37851","messages":"37852","suppressedMessages":"37853","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37854","messages":"37855","suppressedMessages":"37856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37857","messages":"37858","suppressedMessages":"37859","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37860","messages":"37861","suppressedMessages":"37862","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37863","messages":"37864","suppressedMessages":"37865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37866","messages":"37867","suppressedMessages":"37868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37869","messages":"37870","suppressedMessages":"37871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37872","messages":"37873","suppressedMessages":"37874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37875","messages":"37876","suppressedMessages":"37877","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37878","messages":"37879","suppressedMessages":"37880","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37881","messages":"37882","suppressedMessages":"37883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37884","messages":"37885","suppressedMessages":"37886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37887","messages":"37888","suppressedMessages":"37889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37890","messages":"37891","suppressedMessages":"37892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37893","messages":"37894","suppressedMessages":"37895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37896","messages":"37897","suppressedMessages":"37898","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37899","messages":"37900","suppressedMessages":"37901","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37902","messages":"37903","suppressedMessages":"37904","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37905","messages":"37906","suppressedMessages":"37907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37908","messages":"37909","suppressedMessages":"37910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37911","messages":"37912","suppressedMessages":"37913","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37914","messages":"37915","suppressedMessages":"37916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37917","messages":"37918","suppressedMessages":"37919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37920","messages":"37921","suppressedMessages":"37922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37923","messages":"37924","suppressedMessages":"37925","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37926","messages":"37927","suppressedMessages":"37928","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37929","messages":"37930","suppressedMessages":"37931","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37932","messages":"37933","suppressedMessages":"37934","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37935","messages":"37936","suppressedMessages":"37937","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37938","messages":"37939","suppressedMessages":"37940","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37941","messages":"37942","suppressedMessages":"37943","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37944","messages":"37945","suppressedMessages":"37946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37947","messages":"37948","suppressedMessages":"37949","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37950","messages":"37951","suppressedMessages":"37952","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37953","messages":"37954","suppressedMessages":"37955","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37956","messages":"37957","suppressedMessages":"37958","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37959","messages":"37960","suppressedMessages":"37961","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37962","messages":"37963","suppressedMessages":"37964","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37965","messages":"37966","suppressedMessages":"37967","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37968","messages":"37969","suppressedMessages":"37970","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37971","messages":"37972","suppressedMessages":"37973","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"37974","messages":"37975","suppressedMessages":"37976","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37977","messages":"37978","suppressedMessages":"37979","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37980","messages":"37981","suppressedMessages":"37982","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37983","messages":"37984","suppressedMessages":"37985","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37986","messages":"37987","suppressedMessages":"37988","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37989","messages":"37990","suppressedMessages":"37991","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37992","messages":"37993","suppressedMessages":"37994","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37995","messages":"37996","suppressedMessages":"37997","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"37998","messages":"37999","suppressedMessages":"38000","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38001","messages":"38002","suppressedMessages":"38003","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38004","messages":"38005","suppressedMessages":"38006","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38007","messages":"38008","suppressedMessages":"38009","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38010","messages":"38011","suppressedMessages":"38012","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38013","messages":"38014","suppressedMessages":"38015","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38016","messages":"38017","suppressedMessages":"38018","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38019","messages":"38020","suppressedMessages":"38021","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38022","messages":"38023","suppressedMessages":"38024","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38025","messages":"38026","suppressedMessages":"38027","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38028","messages":"38029","suppressedMessages":"38030","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38031","messages":"38032","suppressedMessages":"38033","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38034","messages":"38035","suppressedMessages":"38036","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38037","messages":"38038","suppressedMessages":"38039","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38040","messages":"38041","suppressedMessages":"38042","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38043","messages":"38044","suppressedMessages":"38045","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38046","messages":"38047","suppressedMessages":"38048","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38049","messages":"38050","suppressedMessages":"38051","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38052","messages":"38053","suppressedMessages":"38054","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38055","messages":"38056","suppressedMessages":"38057","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38058","messages":"38059","suppressedMessages":"38060","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38061","messages":"38062","suppressedMessages":"38063","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38064","messages":"38065","suppressedMessages":"38066","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38067","messages":"38068","suppressedMessages":"38069","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38070","messages":"38071","suppressedMessages":"38072","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38073","messages":"38074","suppressedMessages":"38075","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38076","messages":"38077","suppressedMessages":"38078","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38079","messages":"38080","suppressedMessages":"38081","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38082","messages":"38083","suppressedMessages":"38084","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38085","messages":"38086","suppressedMessages":"38087","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38088","messages":"38089","suppressedMessages":"38090","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38091","messages":"38092","suppressedMessages":"38093","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38094","messages":"38095","suppressedMessages":"38096","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38097","messages":"38098","suppressedMessages":"38099","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38100","messages":"38101","suppressedMessages":"38102","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38103","messages":"38104","suppressedMessages":"38105","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38106","messages":"38107","suppressedMessages":"38108","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38109","messages":"38110","suppressedMessages":"38111","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38112","messages":"38113","suppressedMessages":"38114","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38115","messages":"38116","suppressedMessages":"38117","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38118","messages":"38119","suppressedMessages":"38120","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38121","messages":"38122","suppressedMessages":"38123","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38124","messages":"38125","suppressedMessages":"38126","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38127","messages":"38128","suppressedMessages":"38129","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38130","messages":"38131","suppressedMessages":"38132","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38133","messages":"38134","suppressedMessages":"38135","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38136","messages":"38137","suppressedMessages":"38138","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38139","messages":"38140","suppressedMessages":"38141","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38142","messages":"38143","suppressedMessages":"38144","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38145","messages":"38146","suppressedMessages":"38147","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38148","messages":"38149","suppressedMessages":"38150","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38151","messages":"38152","suppressedMessages":"38153","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38154","messages":"38155","suppressedMessages":"38156","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38157","messages":"38158","suppressedMessages":"38159","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38160","messages":"38161","suppressedMessages":"38162","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38163","messages":"38164","suppressedMessages":"38165","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38166","messages":"38167","suppressedMessages":"38168","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38169","messages":"38170","suppressedMessages":"38171","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38172","messages":"38173","suppressedMessages":"38174","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38175","messages":"38176","suppressedMessages":"38177","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38178","messages":"38179","suppressedMessages":"38180","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38181","messages":"38182","suppressedMessages":"38183","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38184","messages":"38185","suppressedMessages":"38186","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38187","messages":"38188","suppressedMessages":"38189","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38190","messages":"38191","suppressedMessages":"38192","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38193","messages":"38194","suppressedMessages":"38195","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38196","messages":"38197","suppressedMessages":"38198","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38199","messages":"38200","suppressedMessages":"38201","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38202","messages":"38203","suppressedMessages":"38204","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38205","messages":"38206","suppressedMessages":"38207","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38208","messages":"38209","suppressedMessages":"38210","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38211","messages":"38212","suppressedMessages":"38213","errorCount":83,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38214","messages":"38215","suppressedMessages":"38216","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38217","messages":"38218","suppressedMessages":"38219","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38220","messages":"38221","suppressedMessages":"38222","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38223","messages":"38224","suppressedMessages":"38225","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38226","messages":"38227","suppressedMessages":"38228","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38229","messages":"38230","suppressedMessages":"38231","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38232","messages":"38233","suppressedMessages":"38234","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38235","messages":"38236","suppressedMessages":"38237","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38238","messages":"38239","suppressedMessages":"38240","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38241","messages":"38242","suppressedMessages":"38243","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38244","messages":"38245","suppressedMessages":"38246","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38247","messages":"38248","suppressedMessages":"38249","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38250","messages":"38251","suppressedMessages":"38252","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38253","messages":"38254","suppressedMessages":"38255","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38256","messages":"38257","suppressedMessages":"38258","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38259","messages":"38260","suppressedMessages":"38261","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38262","messages":"38263","suppressedMessages":"38264","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38265","messages":"38266","suppressedMessages":"38267","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38268","messages":"38269","suppressedMessages":"38270","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38271","messages":"38272","suppressedMessages":"38273","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38274","messages":"38275","suppressedMessages":"38276","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38277","messages":"38278","suppressedMessages":"38279","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38280","messages":"38281","suppressedMessages":"38282","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38283","messages":"38284","suppressedMessages":"38285","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38286","messages":"38287","suppressedMessages":"38288","errorCount":35,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38289","messages":"38290","suppressedMessages":"38291","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38292","messages":"38293","suppressedMessages":"38294","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38295","messages":"38296","suppressedMessages":"38297","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38298","messages":"38299","suppressedMessages":"38300","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38301","messages":"38302","suppressedMessages":"38303","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38304","messages":"38305","suppressedMessages":"38306","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38307","messages":"38308","suppressedMessages":"38309","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38310","messages":"38311","suppressedMessages":"38312","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38313","messages":"38314","suppressedMessages":"38315","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38316","messages":"38317","suppressedMessages":"38318","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38319","messages":"38320","suppressedMessages":"38321","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38322","messages":"38323","suppressedMessages":"38324","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38325","messages":"38326","suppressedMessages":"38327","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38328","messages":"38329","suppressedMessages":"38330","errorCount":57,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38331","messages":"38332","suppressedMessages":"38333","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38334","messages":"38335","suppressedMessages":"38336","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38337","messages":"38338","suppressedMessages":"38339","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38340","messages":"38341","suppressedMessages":"38342","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38343","messages":"38344","suppressedMessages":"38345","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38346","messages":"38347","suppressedMessages":"38348","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38349","messages":"38350","suppressedMessages":"38351","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38352","messages":"38353","suppressedMessages":"38354","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38355","messages":"38356","suppressedMessages":"38357","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38358","messages":"38359","suppressedMessages":"38360","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38361","messages":"38362","suppressedMessages":"38363","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38364","messages":"38365","suppressedMessages":"38366","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38367","messages":"38368","suppressedMessages":"38369","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38370","messages":"38371","suppressedMessages":"38372","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38373","messages":"38374","suppressedMessages":"38375","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38376","messages":"38377","suppressedMessages":"38378","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38379","messages":"38380","suppressedMessages":"38381","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38382","messages":"38383","suppressedMessages":"38384","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38385","messages":"38386","suppressedMessages":"38387","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38388","messages":"38389","suppressedMessages":"38390","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38391","messages":"38392","suppressedMessages":"38393","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38394","messages":"38395","suppressedMessages":"38396","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38397","messages":"38398","suppressedMessages":"38399","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38400","messages":"38401","suppressedMessages":"38402","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38403","messages":"38404","suppressedMessages":"38405","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38406","messages":"38407","suppressedMessages":"38408","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38409","messages":"38410","suppressedMessages":"38411","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38412","messages":"38413","suppressedMessages":"38414","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38415","messages":"38416","suppressedMessages":"38417","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38418","messages":"38419","suppressedMessages":"38420","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38421","messages":"38422","suppressedMessages":"38423","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38424","messages":"38425","suppressedMessages":"38426","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38427","messages":"38428","suppressedMessages":"38429","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38430","messages":"38431","suppressedMessages":"38432","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38433","messages":"38434","suppressedMessages":"38435","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38436","messages":"38437","suppressedMessages":"38438","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38439","messages":"38440","suppressedMessages":"38441","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38442","messages":"38443","suppressedMessages":"38444","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38445","messages":"38446","suppressedMessages":"38447","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38448","messages":"38449","suppressedMessages":"38450","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38451","messages":"38452","suppressedMessages":"38453","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38454","messages":"38455","suppressedMessages":"38456","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38457","messages":"38458","suppressedMessages":"38459","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38460","messages":"38461","suppressedMessages":"38462","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38463","messages":"38464","suppressedMessages":"38465","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38466","messages":"38467","suppressedMessages":"38468","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38469","messages":"38470","suppressedMessages":"38471","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38472","messages":"38473","suppressedMessages":"38474","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38475","messages":"38476","suppressedMessages":"38477","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38478","messages":"38479","suppressedMessages":"38480","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38481","messages":"38482","suppressedMessages":"38483","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38484","messages":"38485","suppressedMessages":"38486","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38487","messages":"38488","suppressedMessages":"38489","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38490","messages":"38491","suppressedMessages":"38492","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38493","messages":"38494","suppressedMessages":"38495","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38496","messages":"38497","suppressedMessages":"38498","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38499","messages":"38500","suppressedMessages":"38501","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38502","messages":"38503","suppressedMessages":"38504","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38505","messages":"38506","suppressedMessages":"38507","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38508","messages":"38509","suppressedMessages":"38510","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38511","messages":"38512","suppressedMessages":"38513","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38514","messages":"38515","suppressedMessages":"38516","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38517","messages":"38518","suppressedMessages":"38519","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38520","messages":"38521","suppressedMessages":"38522","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38523","messages":"38524","suppressedMessages":"38525","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38526","messages":"38527","suppressedMessages":"38528","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38529","messages":"38530","suppressedMessages":"38531","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38532","messages":"38533","suppressedMessages":"38534","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38535","messages":"38536","suppressedMessages":"38537","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38538","messages":"38539","suppressedMessages":"38540","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38541","messages":"38542","suppressedMessages":"38543","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38544","messages":"38545","suppressedMessages":"38546","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38547","messages":"38548","suppressedMessages":"38549","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38550","messages":"38551","suppressedMessages":"38552","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38553","messages":"38554","suppressedMessages":"38555","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38556","messages":"38557","suppressedMessages":"38558","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38559","messages":"38560","suppressedMessages":"38561","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38562","messages":"38563","suppressedMessages":"38564","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38565","messages":"38566","suppressedMessages":"38567","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38568","messages":"38569","suppressedMessages":"38570","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38571","messages":"38572","suppressedMessages":"38573","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38574","messages":"38575","suppressedMessages":"38576","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38577","messages":"38578","suppressedMessages":"38579","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38580","messages":"38581","suppressedMessages":"38582","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38583","messages":"38584","suppressedMessages":"38585","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38586","messages":"38587","suppressedMessages":"38588","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38589","messages":"38590","suppressedMessages":"38591","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38592","messages":"38593","suppressedMessages":"38594","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38595","messages":"38596","suppressedMessages":"38597","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38598","messages":"38599","suppressedMessages":"38600","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38601","messages":"38602","suppressedMessages":"38603","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38604","messages":"38605","suppressedMessages":"38606","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38607","messages":"38608","suppressedMessages":"38609","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38610","messages":"38611","suppressedMessages":"38612","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38613","messages":"38614","suppressedMessages":"38615","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38616","messages":"38617","suppressedMessages":"38618","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38619","messages":"38620","suppressedMessages":"38621","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38622","messages":"38623","suppressedMessages":"38624","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38625","messages":"38626","suppressedMessages":"38627","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38628","messages":"38629","suppressedMessages":"38630","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38631","messages":"38632","suppressedMessages":"38633","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38634","messages":"38635","suppressedMessages":"38636","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38637","messages":"38638","suppressedMessages":"38639","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38640","messages":"38641","suppressedMessages":"38642","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38643","messages":"38644","suppressedMessages":"38645","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38646","messages":"38647","suppressedMessages":"38648","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38649","messages":"38650","suppressedMessages":"38651","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38652","messages":"38653","suppressedMessages":"38654","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38655","messages":"38656","suppressedMessages":"38657","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38658","messages":"38659","suppressedMessages":"38660","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38661","messages":"38662","suppressedMessages":"38663","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38664","messages":"38665","suppressedMessages":"38666","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38667","messages":"38668","suppressedMessages":"38669","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38670","messages":"38671","suppressedMessages":"38672","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38673","messages":"38674","suppressedMessages":"38675","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38676","messages":"38677","suppressedMessages":"38678","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38679","messages":"38680","suppressedMessages":"38681","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38682","messages":"38683","suppressedMessages":"38684","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38685","messages":"38686","suppressedMessages":"38687","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38688","messages":"38689","suppressedMessages":"38690","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38691","messages":"38692","suppressedMessages":"38693","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38694","messages":"38695","suppressedMessages":"38696","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38697","messages":"38698","suppressedMessages":"38699","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38700","messages":"38701","suppressedMessages":"38702","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38703","messages":"38704","suppressedMessages":"38705","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38706","messages":"38707","suppressedMessages":"38708","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38709","messages":"38710","suppressedMessages":"38711","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38712","messages":"38713","suppressedMessages":"38714","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38715","messages":"38716","suppressedMessages":"38717","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38718","messages":"38719","suppressedMessages":"38720","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38721","messages":"38722","suppressedMessages":"38723","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38724","messages":"38725","suppressedMessages":"38726","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38727","messages":"38728","suppressedMessages":"38729","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38730","messages":"38731","suppressedMessages":"38732","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38733","messages":"38734","suppressedMessages":"38735","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38736","messages":"38737","suppressedMessages":"38738","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38739","messages":"38740","suppressedMessages":"38741","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38742","messages":"38743","suppressedMessages":"38744","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38745","messages":"38746","suppressedMessages":"38747","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38748","messages":"38749","suppressedMessages":"38750","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38751","messages":"38752","suppressedMessages":"38753","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38754","messages":"38755","suppressedMessages":"38756","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38757","messages":"38758","suppressedMessages":"38759","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38760","messages":"38761","suppressedMessages":"38762","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38763","messages":"38764","suppressedMessages":"38765","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38766","messages":"38767","suppressedMessages":"38768","errorCount":8,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38769","messages":"38770","suppressedMessages":"38771","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38772","messages":"38773","suppressedMessages":"38774","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38775","messages":"38776","suppressedMessages":"38777","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38778","messages":"38779","suppressedMessages":"38780","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38781","messages":"38782","suppressedMessages":"38783","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38784","messages":"38785","suppressedMessages":"38786","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38787","messages":"38788","suppressedMessages":"38789","errorCount":11,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38790","messages":"38791","suppressedMessages":"38792","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38793","messages":"38794","suppressedMessages":"38795","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38796","messages":"38797","suppressedMessages":"38798","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38799","messages":"38800","suppressedMessages":"38801","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38802","messages":"38803","suppressedMessages":"38804","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38805","messages":"38806","suppressedMessages":"38807","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38808","messages":"38809","suppressedMessages":"38810","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38811","messages":"38812","suppressedMessages":"38813","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38814","messages":"38815","suppressedMessages":"38816","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38817","messages":"38818","suppressedMessages":"38819","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38820","messages":"38821","suppressedMessages":"38822","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38823","messages":"38824","suppressedMessages":"38825","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38826","messages":"38827","suppressedMessages":"38828","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38829","messages":"38830","suppressedMessages":"38831","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38832","messages":"38833","suppressedMessages":"38834","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38835","messages":"38836","suppressedMessages":"38837","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38838","messages":"38839","suppressedMessages":"38840","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38841","messages":"38842","suppressedMessages":"38843","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38844","messages":"38845","suppressedMessages":"38846","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38847","messages":"38848","suppressedMessages":"38849","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38850","messages":"38851","suppressedMessages":"38852","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38853","messages":"38854","suppressedMessages":"38855","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38856","messages":"38857","suppressedMessages":"38858","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38859","messages":"38860","suppressedMessages":"38861","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38862","messages":"38863","suppressedMessages":"38864","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38865","messages":"38866","suppressedMessages":"38867","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38868","messages":"38869","suppressedMessages":"38870","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38871","messages":"38872","suppressedMessages":"38873","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38874","messages":"38875","suppressedMessages":"38876","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38877","messages":"38878","suppressedMessages":"38879","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38880","messages":"38881","suppressedMessages":"38882","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38883","messages":"38884","suppressedMessages":"38885","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38886","messages":"38887","suppressedMessages":"38888","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38889","messages":"38890","suppressedMessages":"38891","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38892","messages":"38893","suppressedMessages":"38894","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38895","messages":"38896","suppressedMessages":"38897","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38898","messages":"38899","suppressedMessages":"38900","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38901","messages":"38902","suppressedMessages":"38903","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38904","messages":"38905","suppressedMessages":"38906","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38907","messages":"38908","suppressedMessages":"38909","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38910","messages":"38911","suppressedMessages":"38912","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38913","messages":"38914","suppressedMessages":"38915","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38916","messages":"38917","suppressedMessages":"38918","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38919","messages":"38920","suppressedMessages":"38921","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38922","messages":"38923","suppressedMessages":"38924","errorCount":13,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38925","messages":"38926","suppressedMessages":"38927","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38928","messages":"38929","suppressedMessages":"38930","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38931","messages":"38932","suppressedMessages":"38933","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38934","messages":"38935","suppressedMessages":"38936","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38937","messages":"38938","suppressedMessages":"38939","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38940","messages":"38941","suppressedMessages":"38942","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38943","messages":"38944","suppressedMessages":"38945","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38946","messages":"38947","suppressedMessages":"38948","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38949","messages":"38950","suppressedMessages":"38951","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38952","messages":"38953","suppressedMessages":"38954","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38955","messages":"38956","suppressedMessages":"38957","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38958","messages":"38959","suppressedMessages":"38960","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38961","messages":"38962","suppressedMessages":"38963","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"38964","messages":"38965","suppressedMessages":"38966","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38967","messages":"38968","suppressedMessages":"38969","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38970","messages":"38971","suppressedMessages":"38972","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38973","messages":"38974","suppressedMessages":"38975","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38976","messages":"38977","suppressedMessages":"38978","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38979","messages":"38980","suppressedMessages":"38981","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38982","messages":"38983","suppressedMessages":"38984","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38985","messages":"38986","suppressedMessages":"38987","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38988","messages":"38989","suppressedMessages":"38990","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38991","messages":"38992","suppressedMessages":"38993","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38994","messages":"38995","suppressedMessages":"38996","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38997","messages":"38998","suppressedMessages":"38999","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39000","messages":"39001","suppressedMessages":"39002","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39003","messages":"39004","suppressedMessages":"39005","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39006","messages":"39007","suppressedMessages":"39008","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39009","messages":"39010","suppressedMessages":"39011","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39012","messages":"39013","suppressedMessages":"39014","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39015","messages":"39016","suppressedMessages":"39017","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39018","messages":"39019","suppressedMessages":"39020","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39021","messages":"39022","suppressedMessages":"39023","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39024","messages":"39025","suppressedMessages":"39026","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39027","messages":"39028","suppressedMessages":"39029","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39030","messages":"39031","suppressedMessages":"39032","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39033","messages":"39034","suppressedMessages":"39035","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39036","messages":"39037","suppressedMessages":"39038","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39039","messages":"39040","suppressedMessages":"39041","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39042","messages":"39043","suppressedMessages":"39044","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39045","messages":"39046","suppressedMessages":"39047","errorCount":14,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39048","messages":"39049","suppressedMessages":"39050","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39051","messages":"39052","suppressedMessages":"39053","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39054","messages":"39055","suppressedMessages":"39056","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39057","messages":"39058","suppressedMessages":"39059","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39060","messages":"39061","suppressedMessages":"39062","errorCount":18,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39063","messages":"39064","suppressedMessages":"39065","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39066","messages":"39067","suppressedMessages":"39068","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39069","messages":"39070","suppressedMessages":"39071","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39072","messages":"39073","suppressedMessages":"39074","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39075","messages":"39076","suppressedMessages":"39077","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39078","messages":"39079","suppressedMessages":"39080","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39081","messages":"39082","suppressedMessages":"39083","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39084","messages":"39085","suppressedMessages":"39086","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39087","messages":"39088","suppressedMessages":"39089","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39090","messages":"39091","suppressedMessages":"39092","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39093","messages":"39094","suppressedMessages":"39095","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39096","messages":"39097","suppressedMessages":"39098","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39099","messages":"39100","suppressedMessages":"39101","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39102","messages":"39103","suppressedMessages":"39104","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39105","messages":"39106","suppressedMessages":"39107","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39108","messages":"39109","suppressedMessages":"39110","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39111","messages":"39112","suppressedMessages":"39113","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39114","messages":"39115","suppressedMessages":"39116","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39117","messages":"39118","suppressedMessages":"39119","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39120","messages":"39121","suppressedMessages":"39122","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39123","messages":"39124","suppressedMessages":"39125","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39126","messages":"39127","suppressedMessages":"39128","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39129","messages":"39130","suppressedMessages":"39131","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39132","messages":"39133","suppressedMessages":"39134","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39135","messages":"39136","suppressedMessages":"39137","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39138","messages":"39139","suppressedMessages":"39140","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39141","messages":"39142","suppressedMessages":"39143","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39144","messages":"39145","suppressedMessages":"39146","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39147","messages":"39148","suppressedMessages":"39149","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39150","messages":"39151","suppressedMessages":"39152","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39153","messages":"39154","suppressedMessages":"39155","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39156","messages":"39157","suppressedMessages":"39158","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39159","messages":"39160","suppressedMessages":"39161","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39162","messages":"39163","suppressedMessages":"39164","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39165","messages":"39166","suppressedMessages":"39167","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39168","messages":"39169","suppressedMessages":"39170","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39171","messages":"39172","suppressedMessages":"39173","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39174","messages":"39175","suppressedMessages":"39176","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39177","messages":"39178","suppressedMessages":"39179","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39180","messages":"39181","suppressedMessages":"39182","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39183","messages":"39184","suppressedMessages":"39185","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39186","messages":"39187","suppressedMessages":"39188","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39189","messages":"39190","suppressedMessages":"39191","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39192","messages":"39193","suppressedMessages":"39194","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39195","messages":"39196","suppressedMessages":"39197","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39198","messages":"39199","suppressedMessages":"39200","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39201","messages":"39202","suppressedMessages":"39203","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39204","messages":"39205","suppressedMessages":"39206","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39207","messages":"39208","suppressedMessages":"39209","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39210","messages":"39211","suppressedMessages":"39212","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39213","messages":"39214","suppressedMessages":"39215","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39216","messages":"39217","suppressedMessages":"39218","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39219","messages":"39220","suppressedMessages":"39221","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39222","messages":"39223","suppressedMessages":"39224","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39225","messages":"39226","suppressedMessages":"39227","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39228","messages":"39229","suppressedMessages":"39230","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39231","messages":"39232","suppressedMessages":"39233","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39234","messages":"39235","suppressedMessages":"39236","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39237","messages":"39238","suppressedMessages":"39239","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39240","messages":"39241","suppressedMessages":"39242","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39243","messages":"39244","suppressedMessages":"39245","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39246","messages":"39247","suppressedMessages":"39248","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39249","messages":"39250","suppressedMessages":"39251","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39252","messages":"39253","suppressedMessages":"39254","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39255","messages":"39256","suppressedMessages":"39257","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39258","messages":"39259","suppressedMessages":"39260","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39261","messages":"39262","suppressedMessages":"39263","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39264","messages":"39265","suppressedMessages":"39266","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39267","messages":"39268","suppressedMessages":"39269","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39270","messages":"39271","suppressedMessages":"39272","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39273","messages":"39274","suppressedMessages":"39275","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39276","messages":"39277","suppressedMessages":"39278","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39279","messages":"39280","suppressedMessages":"39281","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39282","messages":"39283","suppressedMessages":"39284","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39285","messages":"39286","suppressedMessages":"39287","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39288","messages":"39289","suppressedMessages":"39290","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39291","messages":"39292","suppressedMessages":"39293","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39294","messages":"39295","suppressedMessages":"39296","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39297","messages":"39298","suppressedMessages":"39299","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39300","messages":"39301","suppressedMessages":"39302","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39303","messages":"39304","suppressedMessages":"39305","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39306","messages":"39307","suppressedMessages":"39308","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39309","messages":"39310","suppressedMessages":"39311","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39312","messages":"39313","suppressedMessages":"39314","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39315","messages":"39316","suppressedMessages":"39317","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39318","messages":"39319","suppressedMessages":"39320","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39321","messages":"39322","suppressedMessages":"39323","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39324","messages":"39325","suppressedMessages":"39326","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39327","messages":"39328","suppressedMessages":"39329","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39330","messages":"39331","suppressedMessages":"39332","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39333","messages":"39334","suppressedMessages":"39335","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39336","messages":"39337","suppressedMessages":"39338","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39339","messages":"39340","suppressedMessages":"39341","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39342","messages":"39343","suppressedMessages":"39344","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39345","messages":"39346","suppressedMessages":"39347","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39348","messages":"39349","suppressedMessages":"39350","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39351","messages":"39352","suppressedMessages":"39353","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39354","messages":"39355","suppressedMessages":"39356","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39357","messages":"39358","suppressedMessages":"39359","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39360","messages":"39361","suppressedMessages":"39362","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39363","messages":"39364","suppressedMessages":"39365","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39366","messages":"39367","suppressedMessages":"39368","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39369","messages":"39370","suppressedMessages":"39371","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39372","messages":"39373","suppressedMessages":"39374","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39375","messages":"39376","suppressedMessages":"39377","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39378","messages":"39379","suppressedMessages":"39380","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39381","messages":"39382","suppressedMessages":"39383","errorCount":10,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39384","messages":"39385","suppressedMessages":"39386","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39387","messages":"39388","suppressedMessages":"39389","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39390","messages":"39391","suppressedMessages":"39392","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39393","messages":"39394","suppressedMessages":"39395","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39396","messages":"39397","suppressedMessages":"39398","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39399","messages":"39400","suppressedMessages":"39401","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39402","messages":"39403","suppressedMessages":"39404","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39405","messages":"39406","suppressedMessages":"39407","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39408","messages":"39409","suppressedMessages":"39410","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39411","messages":"39412","suppressedMessages":"39413","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39414","messages":"39415","suppressedMessages":"39416","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39417","messages":"39418","suppressedMessages":"39419","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39420","messages":"39421","suppressedMessages":"39422","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39423","messages":"39424","suppressedMessages":"39425","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39426","messages":"39427","suppressedMessages":"39428","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39429","messages":"39430","suppressedMessages":"39431","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39432","messages":"39433","suppressedMessages":"39434","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39435","messages":"39436","suppressedMessages":"39437","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39438","messages":"39439","suppressedMessages":"39440","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39441","messages":"39442","suppressedMessages":"39443","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39444","messages":"39445","suppressedMessages":"39446","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39447","messages":"39448","suppressedMessages":"39449","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39450","messages":"39451","suppressedMessages":"39452","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39453","messages":"39454","suppressedMessages":"39455","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39456","messages":"39457","suppressedMessages":"39458","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39459","messages":"39460","suppressedMessages":"39461","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39462","messages":"39463","suppressedMessages":"39464","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39465","messages":"39466","suppressedMessages":"39467","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39468","messages":"39469","suppressedMessages":"39470","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39471","messages":"39472","suppressedMessages":"39473","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39474","messages":"39475","suppressedMessages":"39476","errorCount":7,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39477","messages":"39478","suppressedMessages":"39479","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39480","messages":"39481","suppressedMessages":"39482","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39483","messages":"39484","suppressedMessages":"39485","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39486","messages":"39487","suppressedMessages":"39488","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39489","messages":"39490","suppressedMessages":"39491","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39492","messages":"39493","suppressedMessages":"39494","errorCount":21,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39495","messages":"39496","suppressedMessages":"39497","errorCount":15,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39498","messages":"39499","suppressedMessages":"39500","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39501","messages":"39502","suppressedMessages":"39503","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39504","messages":"39505","suppressedMessages":"39506","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39507","messages":"39508","suppressedMessages":"39509","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39510","messages":"39511","suppressedMessages":"39512","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39513","messages":"39514","suppressedMessages":"39515","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39516","messages":"39517","suppressedMessages":"39518","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39519","messages":"39520","suppressedMessages":"39521","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39522","messages":"39523","suppressedMessages":"39524","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39525","messages":"39526","suppressedMessages":"39527","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39528","messages":"39529","suppressedMessages":"39530","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39531","messages":"39532","suppressedMessages":"39533","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39534","messages":"39535","suppressedMessages":"39536","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39537","messages":"39538","suppressedMessages":"39539","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39540","messages":"39541","suppressedMessages":"39542","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39543","messages":"39544","suppressedMessages":"39545","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39546","messages":"39547","suppressedMessages":"39548","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39549","messages":"39550","suppressedMessages":"39551","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39552","messages":"39553","suppressedMessages":"39554","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39555","messages":"39556","suppressedMessages":"39557","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39558","messages":"39559","suppressedMessages":"39560","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39561","messages":"39562","suppressedMessages":"39563","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39564","messages":"39565","suppressedMessages":"39566","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39567","messages":"39568","suppressedMessages":"39569","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39570","messages":"39571","suppressedMessages":"39572","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39573","messages":"39574","suppressedMessages":"39575","errorCount":25,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39576","messages":"39577","suppressedMessages":"39578","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39579","messages":"39580","suppressedMessages":"39581","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39582","messages":"39583","suppressedMessages":"39584","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39585","messages":"39586","suppressedMessages":"39587","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39588","messages":"39589","suppressedMessages":"39590","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39591","messages":"39592","suppressedMessages":"39593","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39594","messages":"39595","suppressedMessages":"39596","errorCount":76,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39597","messages":"39598","suppressedMessages":"39599","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39600","messages":"39601","suppressedMessages":"39602","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39603","messages":"39604","suppressedMessages":"39605","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39606","messages":"39607","suppressedMessages":"39608","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39609","messages":"39610","suppressedMessages":"39611","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39612","messages":"39613","suppressedMessages":"39614","errorCount":74,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39615","messages":"39616","suppressedMessages":"39617","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39618","messages":"39619","suppressedMessages":"39620","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39621","messages":"39622","suppressedMessages":"39623","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39624","messages":"39625","suppressedMessages":"39626","errorCount":6,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39627","messages":"39628","suppressedMessages":"39629","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39630","messages":"39631","suppressedMessages":"39632","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39633","messages":"39634","suppressedMessages":"39635","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39636","messages":"39637","suppressedMessages":"39638","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39639","messages":"39640","suppressedMessages":"39641","errorCount":75,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39642","messages":"39643","suppressedMessages":"39644","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39645","messages":"39646","suppressedMessages":"39647","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39648","messages":"39649","suppressedMessages":"39650","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39651","messages":"39652","suppressedMessages":"39653","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39654","messages":"39655","suppressedMessages":"39656","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39657","messages":"39658","suppressedMessages":"39659","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39660","messages":"39661","suppressedMessages":"39662","errorCount":14,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39663","messages":"39664","suppressedMessages":"39665","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39666","messages":"39667","suppressedMessages":"39668","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39669","messages":"39670","suppressedMessages":"39671","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39672","messages":"39673","suppressedMessages":"39674","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39675","messages":"39676","suppressedMessages":"39677","errorCount":12,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39678","messages":"39679","suppressedMessages":"39680","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39681","messages":"39682","suppressedMessages":"39683","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39684","messages":"39685","suppressedMessages":"39686","errorCount":9,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"39687","messages":"39688","suppressedMessages":"39689","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39690","messages":"39691","suppressedMessages":"39692","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39693","messages":"39694","suppressedMessages":"39695","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39696","messages":"39697","suppressedMessages":"39698","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39699","messages":"39700","suppressedMessages":"39701","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39702","messages":"39703","suppressedMessages":"39704","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39705","messages":"39706","suppressedMessages":"39707","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39708","messages":"39709","suppressedMessages":"39710","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39711","messages":"39712","suppressedMessages":"39713","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39714","messages":"39715","suppressedMessages":"39716","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39717","messages":"39718","suppressedMessages":"39719","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39720","messages":"39721","suppressedMessages":"39722","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39723","messages":"39724","suppressedMessages":"39725","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39726","messages":"39727","suppressedMessages":"39728","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39729","messages":"39730","suppressedMessages":"39731","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39732","messages":"39733","suppressedMessages":"39734","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39735","messages":"39736","suppressedMessages":"39737","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39738","messages":"39739","suppressedMessages":"39740","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39741","messages":"39742","suppressedMessages":"39743","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39744","messages":"39745","suppressedMessages":"39746","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39747","messages":"39748","suppressedMessages":"39749","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39750","messages":"39751","suppressedMessages":"39752","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39753","messages":"39754","suppressedMessages":"39755","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39756","messages":"39757","suppressedMessages":"39758","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39759","messages":"39760","suppressedMessages":"39761","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39762","messages":"39763","suppressedMessages":"39764","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39765","messages":"39766","suppressedMessages":"39767","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39768","messages":"39769","suppressedMessages":"39770","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39771","messages":"39772","suppressedMessages":"39773","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39774","messages":"39775","suppressedMessages":"39776","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39777","messages":"39778","suppressedMessages":"39779","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39780","messages":"39781","suppressedMessages":"39782","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39783","messages":"39784","suppressedMessages":"39785","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39786","messages":"39787","suppressedMessages":"39788","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39789","messages":"39790","suppressedMessages":"39791","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39792","messages":"39793","suppressedMessages":"39794","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39795","messages":"39796","suppressedMessages":"39797","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39798","messages":"39799","suppressedMessages":"39800","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39801","messages":"39802","suppressedMessages":"39803","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39804","messages":"39805","suppressedMessages":"39806","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39807","messages":"39808","suppressedMessages":"39809","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39810","messages":"39811","suppressedMessages":"39812","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39813","messages":"39814","suppressedMessages":"39815","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39816","messages":"39817","suppressedMessages":"39818","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39819","messages":"39820","suppressedMessages":"39821","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39822","messages":"39823","suppressedMessages":"39824","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39825","messages":"39826","suppressedMessages":"39827","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39828","messages":"39829","suppressedMessages":"39830","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39831","messages":"39832","suppressedMessages":"39833","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39834","messages":"39835","suppressedMessages":"39836","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39837","messages":"39838","suppressedMessages":"39839","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39840","messages":"39841","suppressedMessages":"39842","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39843","messages":"39844","suppressedMessages":"39845","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39846","messages":"39847","suppressedMessages":"39848","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39849","messages":"39850","suppressedMessages":"39851","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39852","messages":"39853","suppressedMessages":"39854","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39855","messages":"39856","suppressedMessages":"39857","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39858","messages":"39859","suppressedMessages":"39860","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39861","messages":"39862","suppressedMessages":"39863","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39864","messages":"39865","suppressedMessages":"39866","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39867","messages":"39868","suppressedMessages":"39869","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39870","messages":"39871","suppressedMessages":"39872","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39873","messages":"39874","suppressedMessages":"39875","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39876","messages":"39877","suppressedMessages":"39878","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39879","messages":"39880","suppressedMessages":"39881","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39882","messages":"39883","suppressedMessages":"39884","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39885","messages":"39886","suppressedMessages":"39887","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39888","messages":"39889","suppressedMessages":"39890","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39891","messages":"39892","suppressedMessages":"39893","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39894","messages":"39895","suppressedMessages":"39896","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39897","messages":"39898","suppressedMessages":"39899","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39900","messages":"39901","suppressedMessages":"39902","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39903","messages":"39904","suppressedMessages":"39905","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39906","messages":"39907","suppressedMessages":"39908","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39909","messages":"39910","suppressedMessages":"39911","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39912","messages":"39913","suppressedMessages":"39914","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39915","messages":"39916","suppressedMessages":"39917","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39918","messages":"39919","suppressedMessages":"39920","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39921","messages":"39922","suppressedMessages":"39923","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39924","messages":"39925","suppressedMessages":"39926","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39927","messages":"39928","suppressedMessages":"39929","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39930","messages":"39931","suppressedMessages":"39932","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39933","messages":"39934","suppressedMessages":"39935","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39936","messages":"39937","suppressedMessages":"39938","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39939","messages":"39940","suppressedMessages":"39941","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39942","messages":"39943","suppressedMessages":"39944","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39945","messages":"39946","suppressedMessages":"39947","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39948","messages":"39949","suppressedMessages":"39950","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39951","messages":"39952","suppressedMessages":"39953","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39954","messages":"39955","suppressedMessages":"39956","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39957","messages":"39958","suppressedMessages":"39959","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39960","messages":"39961","suppressedMessages":"39962","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39963","messages":"39964","suppressedMessages":"39965","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39966","messages":"39967","suppressedMessages":"39968","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39969","messages":"39970","suppressedMessages":"39971","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39972","messages":"39973","suppressedMessages":"39974","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39975","messages":"39976","suppressedMessages":"39977","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39978","messages":"39979","suppressedMessages":"39980","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39981","messages":"39982","suppressedMessages":"39983","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39984","messages":"39985","suppressedMessages":"39986","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39987","messages":"39988","suppressedMessages":"39989","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39990","messages":"39991","suppressedMessages":"39992","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39993","messages":"39994","suppressedMessages":"39995","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39996","messages":"39997","suppressedMessages":"39998","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"39999","messages":"40000","suppressedMessages":"40001","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40002","messages":"40003","suppressedMessages":"40004","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40005","messages":"40006","suppressedMessages":"40007","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40008","messages":"40009","suppressedMessages":"40010","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40011","messages":"40012","suppressedMessages":"40013","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40014","messages":"40015","suppressedMessages":"40016","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40017","messages":"40018","suppressedMessages":"40019","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40020","messages":"40021","suppressedMessages":"40022","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40023","messages":"40024","suppressedMessages":"40025","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40026","messages":"40027","suppressedMessages":"40028","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40029","messages":"40030","suppressedMessages":"40031","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40032","messages":"40033","suppressedMessages":"40034","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40035","messages":"40036","suppressedMessages":"40037","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40038","messages":"40039","suppressedMessages":"40040","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40041","messages":"40042","suppressedMessages":"40043","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40044","messages":"40045","suppressedMessages":"40046","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40047","messages":"40048","suppressedMessages":"40049","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40050","messages":"40051","suppressedMessages":"40052","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40053","messages":"40054","suppressedMessages":"40055","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40056","messages":"40057","suppressedMessages":"40058","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40059","messages":"40060","suppressedMessages":"40061","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40062","messages":"40063","suppressedMessages":"40064","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40065","messages":"40066","suppressedMessages":"40067","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40068","messages":"40069","suppressedMessages":"40070","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40071","messages":"40072","suppressedMessages":"40073","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40074","messages":"40075","suppressedMessages":"40076","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40077","messages":"40078","suppressedMessages":"40079","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40080","messages":"40081","suppressedMessages":"40082","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40083","messages":"40084","suppressedMessages":"40085","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40086","messages":"40087","suppressedMessages":"40088","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40089","messages":"40090","suppressedMessages":"40091","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40092","messages":"40093","suppressedMessages":"40094","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40095","messages":"40096","suppressedMessages":"40097","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40098","messages":"40099","suppressedMessages":"40100","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40101","messages":"40102","suppressedMessages":"40103","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40104","messages":"40105","suppressedMessages":"40106","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40107","messages":"40108","suppressedMessages":"40109","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40110","messages":"40111","suppressedMessages":"40112","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40113","messages":"40114","suppressedMessages":"40115","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40116","messages":"40117","suppressedMessages":"40118","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40119","messages":"40120","suppressedMessages":"40121","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40122","messages":"40123","suppressedMessages":"40124","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40125","messages":"40126","suppressedMessages":"40127","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40128","messages":"40129","suppressedMessages":"40130","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40131","messages":"40132","suppressedMessages":"40133","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40134","messages":"40135","suppressedMessages":"40136","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40137","messages":"40138","suppressedMessages":"40139","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40140","messages":"40141","suppressedMessages":"40142","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40143","messages":"40144","suppressedMessages":"40145","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40146","messages":"40147","suppressedMessages":"40148","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40149","messages":"40150","suppressedMessages":"40151","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40152","messages":"40153","suppressedMessages":"40154","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40155","messages":"40156","suppressedMessages":"40157","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40158","messages":"40159","suppressedMessages":"40160","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40161","messages":"40162","suppressedMessages":"40163","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40164","messages":"40165","suppressedMessages":"40166","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40167","messages":"40168","suppressedMessages":"40169","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40170","messages":"40171","suppressedMessages":"40172","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40173","messages":"40174","suppressedMessages":"40175","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40176","messages":"40177","suppressedMessages":"40178","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40179","messages":"40180","suppressedMessages":"40181","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40182","messages":"40183","suppressedMessages":"40184","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40185","messages":"40186","suppressedMessages":"40187","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40188","messages":"40189","suppressedMessages":"40190","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40191","messages":"40192","suppressedMessages":"40193","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40194","messages":"40195","suppressedMessages":"40196","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40197","messages":"40198","suppressedMessages":"40199","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40200","messages":"40201","suppressedMessages":"40202","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40203","messages":"40204","suppressedMessages":"40205","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40206","messages":"40207","suppressedMessages":"40208","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40209","messages":"40210","suppressedMessages":"40211","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40212","messages":"40213","suppressedMessages":"40214","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40215","messages":"40216","suppressedMessages":"40217","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40218","messages":"40219","suppressedMessages":"40220","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40221","messages":"40222","suppressedMessages":"40223","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40224","messages":"40225","suppressedMessages":"40226","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40227","messages":"40228","suppressedMessages":"40229","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40230","messages":"40231","suppressedMessages":"40232","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40233","messages":"40234","suppressedMessages":"40235","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40236","messages":"40237","suppressedMessages":"40238","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40239","messages":"40240","suppressedMessages":"40241","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40242","messages":"40243","suppressedMessages":"40244","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40245","messages":"40246","suppressedMessages":"40247","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40248","messages":"40249","suppressedMessages":"40250","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40251","messages":"40252","suppressedMessages":"40253","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40254","messages":"40255","suppressedMessages":"40256","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40257","messages":"40258","suppressedMessages":"40259","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40260","messages":"40261","suppressedMessages":"40262","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40263","messages":"40264","suppressedMessages":"40265","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40266","messages":"40267","suppressedMessages":"40268","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40269","messages":"40270","suppressedMessages":"40271","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40272","messages":"40273","suppressedMessages":"40274","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40275","messages":"40276","suppressedMessages":"40277","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40278","messages":"40279","suppressedMessages":"40280","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40281","messages":"40282","suppressedMessages":"40283","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40284","messages":"40285","suppressedMessages":"40286","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40287","messages":"40288","suppressedMessages":"40289","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40290","messages":"40291","suppressedMessages":"40292","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40293","messages":"40294","suppressedMessages":"40295","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40296","messages":"40297","suppressedMessages":"40298","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40299","messages":"40300","suppressedMessages":"40301","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40302","messages":"40303","suppressedMessages":"40304","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40305","messages":"40306","suppressedMessages":"40307","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40308","messages":"40309","suppressedMessages":"40310","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40311","messages":"40312","suppressedMessages":"40313","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40314","messages":"40315","suppressedMessages":"40316","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40317","messages":"40318","suppressedMessages":"40319","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40320","messages":"40321","suppressedMessages":"40322","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40323","messages":"40324","suppressedMessages":"40325","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40326","messages":"40327","suppressedMessages":"40328","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40329","messages":"40330","suppressedMessages":"40331","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40332","messages":"40333","suppressedMessages":"40334","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40335","messages":"40336","suppressedMessages":"40337","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40338","messages":"40339","suppressedMessages":"40340","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40341","messages":"40342","suppressedMessages":"40343","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40344","messages":"40345","suppressedMessages":"40346","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40347","messages":"40348","suppressedMessages":"40349","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40350","messages":"40351","suppressedMessages":"40352","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40353","messages":"40354","suppressedMessages":"40355","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40356","messages":"40357","suppressedMessages":"40358","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40359","messages":"40360","suppressedMessages":"40361","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40362","messages":"40363","suppressedMessages":"40364","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40365","messages":"40366","suppressedMessages":"40367","errorCount":16,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40368","messages":"40369","suppressedMessages":"40370","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40371","messages":"40372","suppressedMessages":"40373","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40374","messages":"40375","suppressedMessages":"40376","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40377","messages":"40378","suppressedMessages":"40379","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40380","messages":"40381","suppressedMessages":"40382","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40383","messages":"40384","suppressedMessages":"40385","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40386","messages":"40387","suppressedMessages":"40388","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40389","messages":"40390","suppressedMessages":"40391","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40392","messages":"40393","suppressedMessages":"40394","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40395","messages":"40396","suppressedMessages":"40397","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40398","messages":"40399","suppressedMessages":"40400","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40401","messages":"40402","suppressedMessages":"40403","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40404","messages":"40405","suppressedMessages":"40406","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40407","messages":"40408","suppressedMessages":"40409","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40410","messages":"40411","suppressedMessages":"40412","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40413","messages":"40414","suppressedMessages":"40415","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40416","messages":"40417","suppressedMessages":"40418","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40419","messages":"40420","suppressedMessages":"40421","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40422","messages":"40423","suppressedMessages":"40424","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40425","messages":"40426","suppressedMessages":"40427","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40428","messages":"40429","suppressedMessages":"40430","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40431","messages":"40432","suppressedMessages":"40433","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40434","messages":"40435","suppressedMessages":"40436","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40437","messages":"40438","suppressedMessages":"40439","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40440","messages":"40441","suppressedMessages":"40442","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40443","messages":"40444","suppressedMessages":"40445","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40446","messages":"40447","suppressedMessages":"40448","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40449","messages":"40450","suppressedMessages":"40451","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40452","messages":"40453","suppressedMessages":"40454","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40455","messages":"40456","suppressedMessages":"40457","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40458","messages":"40459","suppressedMessages":"40460","errorCount":17,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40461","messages":"40462","suppressedMessages":"40463","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40464","messages":"40465","suppressedMessages":"40466","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40467","messages":"40468","suppressedMessages":"40469","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40470","messages":"40471","suppressedMessages":"40472","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40473","messages":"40474","suppressedMessages":"40475","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40476","messages":"40477","suppressedMessages":"40478","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40479","messages":"40480","suppressedMessages":"40481","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40482","messages":"40483","suppressedMessages":"40484","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40485","messages":"40486","suppressedMessages":"40487","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40488","messages":"40489","suppressedMessages":"40490","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40491","messages":"40492","suppressedMessages":"40493","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40494","messages":"40495","suppressedMessages":"40496","errorCount":56,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40497","messages":"40498","suppressedMessages":"40499","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40500","messages":"40501","suppressedMessages":"40502","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40503","messages":"40504","suppressedMessages":"40505","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40506","messages":"40507","suppressedMessages":"40508","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40509","messages":"40510","suppressedMessages":"40511","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40512","messages":"40513","suppressedMessages":"40514","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40515","messages":"40516","suppressedMessages":"40517","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40518","messages":"40519","suppressedMessages":"40520","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40521","messages":"40522","suppressedMessages":"40523","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40524","messages":"40525","suppressedMessages":"40526","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40527","messages":"40528","suppressedMessages":"40529","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40530","messages":"40531","suppressedMessages":"40532","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40533","messages":"40534","suppressedMessages":"40535","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40536","messages":"40537","suppressedMessages":"40538","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40539","messages":"40540","suppressedMessages":"40541","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40542","messages":"40543","suppressedMessages":"40544","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40545","messages":"40546","suppressedMessages":"40547","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40548","messages":"40549","suppressedMessages":"40550","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40551","messages":"40552","suppressedMessages":"40553","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40554","messages":"40555","suppressedMessages":"40556","errorCount":4,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40557","messages":"40558","suppressedMessages":"40559","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40560","messages":"40561","suppressedMessages":"40562","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40563","messages":"40564","suppressedMessages":"40565","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40566","messages":"40567","suppressedMessages":"40568","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40569","messages":"40570","suppressedMessages":"40571","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40572","messages":"40573","suppressedMessages":"40574","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40575","messages":"40576","suppressedMessages":"40577","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40578","messages":"40579","suppressedMessages":"40580","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40581","messages":"40582","suppressedMessages":"40583","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40584","messages":"40585","suppressedMessages":"40586","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40587","messages":"40588","suppressedMessages":"40589","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40590","messages":"40591","suppressedMessages":"40592","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40593","messages":"40594","suppressedMessages":"40595","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40596","messages":"40597","suppressedMessages":"40598","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40599","messages":"40600","suppressedMessages":"40601","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40602","messages":"40603","suppressedMessages":"40604","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40605","messages":"40606","suppressedMessages":"40607","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40608","messages":"40609","suppressedMessages":"40610","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40611","messages":"40612","suppressedMessages":"40613","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40614","messages":"40615","suppressedMessages":"40616","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40617","messages":"40618","suppressedMessages":"40619","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40620","messages":"40621","suppressedMessages":"40622","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40623","messages":"40624","suppressedMessages":"40625","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40626","messages":"40627","suppressedMessages":"40628","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40629","messages":"40630","suppressedMessages":"40631","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40632","messages":"40633","suppressedMessages":"40634","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40635","messages":"40636","suppressedMessages":"40637","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40638","messages":"40639","suppressedMessages":"40640","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40641","messages":"40642","suppressedMessages":"40643","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40644","messages":"40645","suppressedMessages":"40646","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40647","messages":"40648","suppressedMessages":"40649","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40650","messages":"40651","suppressedMessages":"40652","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40653","messages":"40654","suppressedMessages":"40655","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40656","messages":"40657","suppressedMessages":"40658","errorCount":3,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40659","messages":"40660","suppressedMessages":"40661","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40662","messages":"40663","suppressedMessages":"40664","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40665","messages":"40666","suppressedMessages":"40667","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40668","messages":"40669","suppressedMessages":"40670","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40671","messages":"40672","suppressedMessages":"40673","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40674","messages":"40675","suppressedMessages":"40676","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40677","messages":"40678","suppressedMessages":"40679","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40680","messages":"40681","suppressedMessages":"40682","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40683","messages":"40684","suppressedMessages":"40685","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40686","messages":"40687","suppressedMessages":"40688","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40689","messages":"40690","suppressedMessages":"40691","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40692","messages":"40693","suppressedMessages":"40694","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40695","messages":"40696","suppressedMessages":"40697","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40698","messages":"40699","suppressedMessages":"40700","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40701","messages":"40702","suppressedMessages":"40703","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40704","messages":"40705","suppressedMessages":"40706","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40707","messages":"40708","suppressedMessages":"40709","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40710","messages":"40711","suppressedMessages":"40712","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40713","messages":"40714","suppressedMessages":"40715","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40716","messages":"40717","suppressedMessages":"40718","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40719","messages":"40720","suppressedMessages":"40721","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40722","messages":"40723","suppressedMessages":"40724","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40725","messages":"40726","suppressedMessages":"40727","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40728","messages":"40729","suppressedMessages":"40730","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40731","messages":"40732","suppressedMessages":"40733","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40734","messages":"40735","suppressedMessages":"40736","errorCount":65,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40737","messages":"40738","suppressedMessages":"40739","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40740","messages":"40741","suppressedMessages":"40742","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40743","messages":"40744","suppressedMessages":"40745","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40746","messages":"40747","suppressedMessages":"40748","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40749","messages":"40750","suppressedMessages":"40751","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40752","messages":"40753","suppressedMessages":"40754","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40755","messages":"40756","suppressedMessages":"40757","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40758","messages":"40759","suppressedMessages":"40760","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40761","messages":"40762","suppressedMessages":"40763","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40764","messages":"40765","suppressedMessages":"40766","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40767","messages":"40768","suppressedMessages":"40769","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40770","messages":"40771","suppressedMessages":"40772","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40773","messages":"40774","suppressedMessages":"40775","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40776","messages":"40777","suppressedMessages":"40778","errorCount":1,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40779","messages":"40780","suppressedMessages":"40781","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40782","messages":"40783","suppressedMessages":"40784","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40785","messages":"40786","suppressedMessages":"40787","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40788","messages":"40789","suppressedMessages":"40790","errorCount":2,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40791","messages":"40792","suppressedMessages":"40793","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40794","messages":"40795","suppressedMessages":"40796","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40797","messages":"40798","suppressedMessages":"40799","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40800","messages":"40801","suppressedMessages":"40802","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40803","messages":"40804","suppressedMessages":"40805","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40806","messages":"40807","suppressedMessages":"40808","errorCount":5,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0,"source":null},{"filePath":"40809","messages":"40810","suppressedMessages":"40811","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40812","messages":"40813","suppressedMessages":"40814","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40815","messages":"40816","suppressedMessages":"40817","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40818","messages":"40819","suppressedMessages":"40820","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40821","messages":"40822","suppressedMessages":"40823","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40824","messages":"40825","suppressedMessages":"40826","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40827","messages":"40828","suppressedMessages":"40829","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40830","messages":"40831","suppressedMessages":"40832","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40833","messages":"40834","suppressedMessages":"40835","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40836","messages":"40837","suppressedMessages":"40838","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40839","messages":"40840","suppressedMessages":"40841","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40842","messages":"40843","suppressedMessages":"40844","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40845","messages":"40846","suppressedMessages":"40847","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40848","messages":"40849","suppressedMessages":"40850","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40851","messages":"40852","suppressedMessages":"40853","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40854","messages":"40855","suppressedMessages":"40856","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40857","messages":"40858","suppressedMessages":"40859","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40860","messages":"40861","suppressedMessages":"40862","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40863","messages":"40864","suppressedMessages":"40865","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40866","messages":"40867","suppressedMessages":"40868","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40869","messages":"40870","suppressedMessages":"40871","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40872","messages":"40873","suppressedMessages":"40874","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40875","messages":"40876","suppressedMessages":"40877","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40878","messages":"40879","suppressedMessages":"40880","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40881","messages":"40882","suppressedMessages":"40883","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40884","messages":"40885","suppressedMessages":"40886","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40887","messages":"40888","suppressedMessages":"40889","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40890","messages":"40891","suppressedMessages":"40892","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40893","messages":"40894","suppressedMessages":"40895","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40896","messages":"40897","suppressedMessages":"40898","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40899","messages":"40900","suppressedMessages":"40901","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40902","messages":"40903","suppressedMessages":"40904","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40905","messages":"40906","suppressedMessages":"40907","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40908","messages":"40909","suppressedMessages":"40910","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40911","messages":"40912","suppressedMessages":"40913","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40914","messages":"40915","suppressedMessages":"40916","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40917","messages":"40918","suppressedMessages":"40919","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40920","messages":"40921","suppressedMessages":"40922","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40923","messages":"40924","suppressedMessages":"40925","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40926","messages":"40927","suppressedMessages":"40928","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40929","messages":"40930","suppressedMessages":"40931","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40932","messages":"40933","suppressedMessages":"40934","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40935","messages":"40936","suppressedMessages":"40937","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40938","messages":"40939","suppressedMessages":"40940","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40941","messages":"40942","suppressedMessages":"40943","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40944","messages":"40945","suppressedMessages":"40946","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/src/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/src/logger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/src/naming.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/auto-combo-context.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/auto-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/combos.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/config-shim.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/disk-snapshot-perms.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/feature-defaults.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/features.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/fetch-interceptor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/fork-features.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/gemini-sanitize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/management-read-token.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/model-allowlist.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/multi-instance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/options-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/provider-id-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/scaffold.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tests/usable-combo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-plugin/tsup.config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-provider/src/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-provider/tests/index.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/@omniroute/opencode-provider/tsup.config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/docker/devin-bridge/mock-devin.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/docker/devin-bridge/network-guard/policy.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/docker/devin-bridge/network-guard/proxy.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/docker/devin-bridge/run-contract.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/eslint.complexity-ratchets.config.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/eslint.complexity.config.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/eslint.config.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/eslint.sonarjs.config.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/omniroute-cmd-hello/index.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/plugins/langfuse/index.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/plugins/request-logger/index.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/plugins/theme-manager/index.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/examples/plugins/welcome-banner/index.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/next.config.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/agyModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/anthropicHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/antigravityModelAliases.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/antigravityUpstream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/audioRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/azureAi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/bedrock.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/claudeCodeCompatibleIdentity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/claudeWebFingerprint.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/cliFingerprints.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/codexClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/codexIdentity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/codexInstructions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/codexQuotaScopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/constants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/contextEditing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/credentialLoader.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/datarobot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/defaultThinkingSignature.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/embeddingRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/errorConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/freeModelCatalog.data.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/freeModelCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/freeTierCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/glmProvider.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/grokBuild.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/imageRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/maritalk.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/mediaServiceKinds.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/moderationRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/musicRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/oci.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/ocrRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/ollamaModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerErrorRules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerFieldStrips.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerHeaderProfiles.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerPluginManifest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerPluginManifestRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerPluginManifestUrl.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providerRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/alternateFormats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/adapta-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/agentrouter/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/agnes/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/agy/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ai21/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/aihorde/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/aimlapi/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ainative/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/aion/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/alibaba/cn/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/alibaba/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ant-ling/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/anthropic/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/antigravity/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/anyapi/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/api-airforce/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/auggie/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/baichuan/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/baidu/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bailian-coding-plan/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/baseten/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bazaarlink/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bedrock/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/blackbox/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/blackbox/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bluesminds/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/byteplus/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/bytez/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cerebras/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/charm-hyper/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/chatgpt-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cheaperinference/imageModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cheaperinference/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/chenzk/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/chipotle/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/chutes/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/claude/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/claude/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cline/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/clinepass/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cloudflare-ai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/clova-studio/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/codebuddy-cn/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/codestral/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/codex/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cohere/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/command-code/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/copilot-m365-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/copilot-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/coze/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/crof/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/cursor/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/dahl/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/databricks/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/deepinfra/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/deepseek/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/deepseek/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/devin/catalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/devin-cli/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/devin-cli-agentic/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/dgrid/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/dify/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/digitalocean/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/dit/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/doubao/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/doubao/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/duckduckgo-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/electronhub/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/factory/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/fastrouter/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/featherless-ai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/felo-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/fireworks/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/freeaiapikey/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/freemodel-dev/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/freepik/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/freetheai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/friendliai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-gemini/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-groq/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-nvidia/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-ollama/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/g4f-pollinations/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/galadriel/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gemini/imageModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gemini/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gemini/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ghe-copilot/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gigachat/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/github/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/github/models/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/github/retiredModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gitlab-duo/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gitlawb/gmi/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/gitlawb/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/glm/cn/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/glm/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/glm/t/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/grok-cli/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/grok-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/groq/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/hackclub/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/haiper/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/hcnsec/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/heroku/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/huggingchat/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/huggingface/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/hyperagent/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/hyperbolic/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ideogram/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/iflytek/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/inception/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/inference-net/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/inner-ai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/internlm/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kenari/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kie/imageModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kie/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kie/models.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kilo-gateway/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kilocode/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/coding/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/coding/runtime.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/coding-apikey/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kimi/web/runtime.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/kiro/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/lambda-ai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/leonardo/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/liquid/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/llamagate/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/llm-kiwi/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/llm7/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/llmgateway/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/lmarena/directModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/lmarena/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/longcat/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/maritalk/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/meta-llama/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/mimocode/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/minimax/cn/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/minimax/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/minimax/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/mistral/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/modal/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/modelscope/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/monsterapi/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/moonshot/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/morph/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/muse-spark-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nanogpt/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nara/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/navy/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nebius/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nlpcloud/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/notion-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nous-research/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/novita/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nscale/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nube/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/nvidia/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ollama-cloud/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/openadapter/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/openai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/opencode/go/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/opencode/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/opencode/zen/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/openrouter/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/openvecta/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/orcarouter/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/ovhcloud/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/perplexity/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/perplexity/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/pioneer/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/plamo/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/poe/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/pollinations/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/predibase/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/promptql/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/publicai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/puter/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qianfan/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qiniu/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qoder/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qwen/web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qwen-cloud/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/qwen-cloud-token-plan/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/raycast/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/regolo/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/reka/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/requesty/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/routeway/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sambanova/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sarvam/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/scaleway/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sealion/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/segmind/imageModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/segmind/videoModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sensenova/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/siliconflow/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/snowflake/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sparkdesk/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/stability-ai/imageModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/stepfun/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/sumopod/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/suno/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/synthetic/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/t3-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/tencent/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/theoldllm/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/together/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/tokenrouter/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/trae/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/typhoon/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/udio/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/uncloseai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/unorouter/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/upstage/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/v0-vercel/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/venice/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/veoaifree-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/vercel-ai-gateway/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/vertex/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/vertex/partner/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/volcengine/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/wafer/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/wandb/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/windsurf/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/writer/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/x5lab/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/xai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/xai-oauth/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/xiaomi-mimo/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/xiaomi-mimo-token-plan/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/yi/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/yuanbao-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zai/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zai-web/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zed-hosted/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zenmux/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/registry/zenmux-free/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/providers/shared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/registryUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/rerankRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/runway.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/sap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/searchRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/toolCloaking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/upscaleRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/videoRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/config/watsonx.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/adapta-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/adobe-firefly.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity/executeAttempt.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity/proFallbackChain.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity/sseCollect.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity/streamingPassthrough.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/antigravityUpstreamError.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/auggie.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/awsPollyTts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/azure-openai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/base/headers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/base/reasoningEffort.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/base.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/bedrock.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/blackbox-web.ts",["40947"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgpt-web/citations.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgpt-web/handoff.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgpt-web/models.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgpt-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgptWebErrors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chatgptWebTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cheaperinference.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/chipotle.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/browserTransport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/payload.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/session.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/stream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web/transport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claude-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/claudeIdentity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cliproxyapi.ts",["40948"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cloudflare-ai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codebuddy-cn.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex/bodyTimeout.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex/quota.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex/reasoningSuffix.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex/tools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/commandCode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/copilot-m365-connection.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/copilot-m365-frames.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/copilot-m365-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/copilot-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cursor/builtinToolBridge.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cursor/composer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cursor/prompt.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/dario.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/deepseek-web/stream-format.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/deepseek-web-done-terminator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/deepseek-web-with-auto-refresh.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/deepseek-web.ts",["40949","40950","40951","40952","40953","40954","40955","40956","40957","40958","40959","40960"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/default/nvidiaConcurrencyGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/default/urlNormalizers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/default/zaiFormatOverride.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/default.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-agentic/anthropicResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-agentic/serializer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-agentic/toolParser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-agentic/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-cli-agentic.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/devin-cli.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/doubao-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/duckduckgo-web/challenge.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/duckduckgo-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/edgeTts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/felo-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/firecrawl-fetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/forceResponsesUpstream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gemini-business.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gemini-web.ts",["40961","40962"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/ghe-copilot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/github.ts",["40963","40964","40965","40966","40967","40968","40969","40970","40971","40972","40973","40974","40975","40976"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gitlab.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gitlabResponses.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/glm.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-cli.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web/native-tools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web/text-cleanup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web/tool-bridge.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/grok-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/gtts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/hailuo-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/huggingchat/jsonlStream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/huggingchat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/hyperagent.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/inner-ai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/jina-reader-fetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kie.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kimi-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kimi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kimiToolNames.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kiro/eventstream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kiroThinking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/kiroToolCallValidation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena/cookie.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena/models.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena/response.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena/stream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/lmarena.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/microsoft-designer-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/mimocode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/moonshot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/muse-spark-web/response-parser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/muse-spark-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/ninerouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/nlpcloud.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/notion-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/opencode.ts",["40977","40978"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/perplexity-web/protocol.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/perplexity-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/poe-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/pollinations.ts",["40979","40980","40981","40982","40983","40984","40985"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/promptql/eventTree.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/promptql/messageText.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/promptql/threadSticky.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/promptql.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/puter.ts",["40986","40987","40988","40989"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/qoder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/qwen-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/raycast.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/t3-chat-web.ts",["40990","40991","40992","40993","40994","40995","40996","40997","40998","40999","41000"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/tavily-fetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/theoldllm.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/tinyfish-fetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/trae.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/v0-vercel-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/venice-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/veoaifree-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/vertex.ts",["41001","41002","41003"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/vertexMedia.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/windsurf.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/xai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/yuanbao-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/zai-web.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/zed-hosted.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/executors/zenmux-free.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/audioSpeech.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/audioTranscription.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/audioTranslation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/autoComboCandidates.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/agentRouterProtocol.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/attemptLogging.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/backgroundRedirect.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cacheUsageMeta.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cavemanOutputAnalytics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/ccDiscoveryAliasStrip.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeClassifierCompat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeEffortVariant.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeMessageTypes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeSystemRole.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeToolDefaults.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/claudeUpstreamMessages.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/clientUsageBuffer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/clineResponseEnvelope.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cliproxyModelMapping.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cliproxyapiCredentials.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/codexFailover.ts",["41004"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/codexQuota.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/comboContextCache.ts",["41005"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionAnalyticsWrite.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionCacheStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionComboPredicates.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/compressionUsageReceipt.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/contextEditingTelemetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/contextEstimation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/cooldownClassification.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/executionCredentials.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/executorClientHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/executorHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/executorProxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/failureUsage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/gamificationEvent.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/headers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/idempotency.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/jsonBodyToSse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/keyHealth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/logTruncation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/memoryExtraction.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/memorySkillsInjection.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingJsonResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingResponseBody.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingResponseHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingResponseParse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingSse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/nonStreamingUsageStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/outputStyleTelemetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/outputTokenBudget.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/passthroughHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/passthroughToolNames.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/pluginOnRequest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/pluginOnResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/postCallGuardrailContext.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/quotaShareConsumption.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/requestFormat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/requestSetup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/responseHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/sanitization.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/semanticCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/semanticCacheStore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/serviceTier.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/skillsFormat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/stageTrace.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamErrorResult.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamFinalize.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingCost.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingPipeline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingQuotaShare.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingResponseHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingSemanticCacheStore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/streamingUsageStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/targetFormat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/telemetryHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/thinkingSignatureRecovery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/toolCallingRequiredCheck.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/unsupportedParamsStrip.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/upstreamBody.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/upstreamExecuteHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore/upstreamTimeouts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/chatCore.ts",["41006"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/embeddingStructuredInput.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/embeddings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/pollinationsAnonAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/adobeFirefly.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/alibabaImage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/chatgptWeb.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/comfyUI.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/designerWeb.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/freepik.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/googleImagen.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/haiper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/huggingface.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/hyperbolic.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/ideogram.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/imagen3.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/leonardo.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/minimax.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/nvidiaNim.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/sdWebUI.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration/providers/segmind.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageGeneration.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale/adobeFirefly.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale/shared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale/stability.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale/topaz.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/imageUpscale.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/moderations.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/musicGeneration.ts",["41007"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/ocr.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/openrouterTranscription.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/rerank.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/responseSanitizer/reasoning.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/responseSanitizer.ts",["41008"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/responseTranslator.ts",["41009"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/responsesHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/search/firecrawlSearch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/search/perplexitySearch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/search.ts",["41010","41011","41012","41013","41014","41015","41016","41017","41018","41019","41020","41021","41022","41023","41024","41025","41026","41027","41028","41029","41030","41031","41032","41033","41034","41035","41036","41037","41038","41039","41040","41041","41042","41043"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/sseParser/geminiResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/sseParser.ts",["41044"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/usageExtractor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/adobeFireflyHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/dashscopeHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/deepinfraHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/googleFlow.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/googleFlowHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/leonardoHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/novita.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/novitaHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/providers/segmind.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration/xaiGrokImagineHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/videoGeneration.ts",["41045"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/handlers/webFetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/lib/deepseek-pow-solver.cjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/lib/deepseek-pow.ts",["41046","41047","41048","41049","41050"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/a2aLifecycle.test.ts",["41051"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/advancedTools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/audit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/cacheTools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/createComboTool.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/dbHealthTool.test.ts",["41052"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/essentialTools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/glmCodingProviderConfig.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/httpAuthContext.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/pricingSync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/routingStrategyTool.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/toolSearch.catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/toolSearch.search.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/toolSearch.signature.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/__tests__/toolSearch.tool.test.ts",["41053","41054"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/audit.ts",["41055"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/catalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/descriptionCompressor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/httpAuthContext.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/httpTransport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/mcpCallerIdentity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/runtimeHeartbeat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/a2a.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/audit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/ccrTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/pickFastestModel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/toolDefinition.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/toolSearch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/schemas/tools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/scopeEnforcement.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/server.ts",["41056","41057","41058","41059"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolCardinality.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolCount.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/catalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/handler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/register.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/search.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/toolSearch/signature.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/advancedTools.ts",["41060"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/agentSkillTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/compressionTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/gamificationTools.ts",["41061","41062"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/githubSkillTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/localCorpusTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/memoryTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/notionTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/obsidianTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/pickFastestModel.ts",["41063"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/pluginTools.ts",["41064"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/poolTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/mcp-server/tools/skillTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/antigravity-quota-family.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/chatgptTlsClient.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/claudeTlsClient.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/fail-fast-concurrency-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/grokTlsClient.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/manifestAdapter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/specificityDetector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/tierResolver.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/__tests__/volumeDetector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback/cooldownCap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback/exactModelLock.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback/lockoutEviction.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback/nonRetryableUpstream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountFallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountSelector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/accountSemaphore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/adaptation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/controller.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/cost.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/queue.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/requestFeatures.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/runtime.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/admission/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/adobeFireflyBrowserLogin.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/adobeFireflyClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/adobeFireflyModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/adobeFireflyUpscale.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/agentrouterQuotaFetcher.ts",["41065"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravity429Engine.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityClientProfile.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityCredits.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityHeaderScrub.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityIdentity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityProjectBootstrap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityProjectPersist.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityQuotaFamily.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/antigravityVersion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/apiKeyRotator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/autoCombo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/chaosEngine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/chaosVirtualCombo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/providerDiversity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/speedRanking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/__tests__/taskFitness-pattern-order-8603.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/autoPrefix.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/builtinCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/candidateOverrides.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/chaosEngine.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/complexityRouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/engine.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/modePacks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/modelFamily.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/paidModelFilter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/persistence.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/pipelineRouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/providerDiversity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/providerRegistryAccessor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/requestControls.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/resilienceCandidateFilter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/routerStrategy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/scoring.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/selfHealing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/speedRanking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/suffixComposition.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/taskFitness.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoCombo/virtualFactory.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/autoRefreshDaemon.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/backgroundTaskDetector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/bailianQuotaFetcher.ts",["41066"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/batchProcessor.ts",["41067","41068","41069","41070","41071","41072","41073","41074","41075","41076","41077","41078","41079","41080","41081","41082","41083","41084","41085","41086"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/bedrock.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/browserBackedChat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/browserPool.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/ccBridgeTransforms.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/ccOpenAiMediaBlocks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/ccWireImageBuiltins.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/chatgptImageCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/chatgptTlsClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeAdaptiveThinking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeCCH.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeCompatible.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeCompatibleBeta.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeCompatibleThinkingDisplay.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeConstraints.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeExtraRemap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeFingerprint.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeObfuscation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeCodeToolRemapper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeHaikuConstraints.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeTlsClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeTurnstileSolver.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeUsageCooldown.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/claudeWebAutoRefresh.ts",["41087","41088","41089"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/clinepassModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/cloudCodeHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/cloudCodeThinking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/codeAssistSubscription.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/codexQuotaFetcher.ts",["41090"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/codexUsageQuotas.ts",["41091"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/codexVerbosity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/applyStrategyOrdering.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/autoConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/autoStrategy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboCompatFallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboCooldownRetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboData.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboPredicates.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboSetup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboStructure.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/comboVisibility.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/concurrencyCaps.ts",["41092"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/context.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/contextOverrideGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/contextRequirements.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/dispatchPrelude.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/failureTracker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/fingerprintExpansion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/fusionPanel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/headroomRanking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/knownContextOverflow.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/pinRecovery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/promptCacheAffinity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/providerWildcard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaExhaustionCutoff.ts",["41093"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaScoring.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaShareConcurrency.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaShareInflight.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaShareStrategy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/quotaStrategies.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/resolveAutoStrategy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/responseValidation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/rrState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/runtimeUnitCapacity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/runtimeUnits.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/sessionStickiness.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/shadowRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/strategyDispatch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/targetExhaustion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/targetResolution.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/targetSorters.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/targetTimeoutRunner.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/unavailableRetryGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo/validateQuality.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/combo.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/comboAgentMiddleware.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/comboConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/comboManifestMetrics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/comboMetrics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/adaptiveCompression/computeTarget.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/adaptiveCompression/ladder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/adaptiveCompression/resolveAdaptivePlan.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/adaptiveCompression/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/aggressive.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/bodyAdapter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/cacheAwareConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/cachingAware.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/caveman.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/cavemanRules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/deriveDefaultPlan.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/diffHelper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engineBreakdown.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engineCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/cavemanAdapter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ccr/ccrQuery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ccr/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ccr/protocolInstruction.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/codexResponses/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/encoderComparison.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/gcf/decode_generic.ts",["41094","41095","41096","41097","41098","41099","41100","41101","41102","41103","41104","41105","41106","41107","41108","41109","41110","41111","41112","41113","41114","41115"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/gcf/generic.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/gcf/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/gcf/scalar.ts",["41116"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/smartcrusher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/tabular.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/headroom/toon.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ionizer/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/ionizer/sample.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llm/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/constants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/modelStore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/onnxWorker.ts",[],["41117","41118","41119","41120"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/ultraEntry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/llmlingua/worker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/mcpAccessibility/collapseRepeated.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/mcpAccessibility/constants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/mcpAccessibility/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/omniglyphAdapter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/omniglyphSingleMode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/readLifecycle/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/relevance/configSchema.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/relevance/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/relevance/scorer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/codeStripper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/commandDetector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/configSchema.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/deduplicator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/discover.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/filterLoader.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/filterSchema.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/grouper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/learn.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/lineFilter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/rawOutput.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/gitDiff.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/structuredTable.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/terraformPlan.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/testGreen.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/renderers/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/smartTruncate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/splitCompositeCommand.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/tomlCompatibility.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/rtk/verify.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/session-dedup/fuzzy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/session-dedup/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/engines/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/entrypointWrap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/aggregate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/corpus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/costMeter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/executorModelClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/fidelityCheck.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/grader.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/judge.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/report.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/runner.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/savings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/seedCorpus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/eval/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/exclusions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/fidelityGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/fidelityGateStep.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/hardBudget.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/benchmark.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/budgetGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/measure.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/replay.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/harness/runner.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/languageDetector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/lite.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/liveZone.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/messageContent.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputMode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputStyles/apply.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputStyles/backCompat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputStyles/catalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/outputStyles/telemetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/pipelineEngineBreaker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/pipelineGuards.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/planResolution.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/prefixFreeze.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/preservation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/preserveSystemPromptMode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/progressiveAging.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/quantumLock.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/quantumLockStep.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/quantumPatterns.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/quantumLock/strategyWrap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/resolveCompressionPlan.ts",["41121","41122"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/resultMemo.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/riskGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/riskGateStep.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/riskPatterns.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/riskGate/strategyWrap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/ruleLoader.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/stackedStepCore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/stats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/stepDetailConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/strategySelector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/summarizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/toolResultCompressor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/ultra.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/ultraHeuristic.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/compression/validation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/contextHandoff.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/contextManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/credentialGate.ts",["41123"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/crofUsageFetcher.ts",["41124"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/cursorSessionManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/deepseekQuotaFetcher.ts",["41125"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/defaultReasoningEffort.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/deviceTracker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/emergencyFallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/errorClassifier.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/evalRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/firecrawlQuotaFetcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/freeModelQuotaFetcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/freeWebSearch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/fusion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/geminiRateLimitTracker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/geminiThoughtSignatureStore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/genericQuotaFetcher.ts",["41126"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/gigachatAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/githubCopilotModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/gpt5SamplingGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokClearance.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokCliQuotaFetcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokCliQuotaFrame.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokQuotaFetcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/grokTlsClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/hfModelSuggestions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/httpBackedChatFingerprint.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/hyperagentModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/inAppLoginService.ts",["41127","41128"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/intentClassifier.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/ipFilter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/keyGroupAuth.ts",["41129"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/kiroExternalIdp.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/kiroModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/kiroRegion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/learnedThinkingCaps.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/lmarenaTlsClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/manifestAdapter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/mimoThinking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/model.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelCapabilities.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelDeprecation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelFamilyFallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelStrip.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/modelscopePolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/newApiAggregatorQuotaFetcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionStreamParser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionThreadSessions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionTlsClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionTranscriptBuilder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionWebFallbackModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/notionWebModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/opencodeOllamaUsage.ts",["41130"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/opencodeQuotaFetcher.ts",["41131"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/opencodeReasoningSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/openrouterFreeWindow.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/openrouterQuotaFetcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/payloadRules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/perplexityTlsClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/pipeline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/promptql/jwt.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/promptqlModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/provider.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/providerCooldownTracker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/providerCostData.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/providerDefaultRateLimit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/providerRequestDefaults.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/proxyAutoSelector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/qoderCli.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/qoderCliResolve.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaFetchThrottle.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaMonitor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaPreflight.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaResetParsing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaTextCooldowns.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/quotaTrackersBatch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/qwenThinking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rateLimitManager/admission.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rateLimitManager/headers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rateLimitManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rateLimitSemaphore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/raycast.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/reasoningCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/reasoningTokenBuffer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/refreshSerializer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/requestDedup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/responseModelEcho.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/responsesInputSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/retryAfterJson.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/roleNormalizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rollingRpmGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/rotationConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/searchCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/fingerprintRotator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/poolRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/session.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/sessionFactory.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/sessionPool.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/sessionPool/webExecutorWrapper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/signatureCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/slidingWindowLimiter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/specificityDetector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/specificityRules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/specificityTypes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/streamRecovery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/systemPrompt.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/systemTransforms.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/targetRequestSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/taskAwareRouter.ts",["41132","41133","41134","41135"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/taskAwareRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/thinkingBudget.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tierConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tierResolver.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tierTypes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tlsClientDownloadDir.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tlsClientProxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenExtractionConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenLimitCounter.ts",["41136"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/casGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/circuitBreaker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/claudeOAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/cline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/codebuddyCn.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/copilot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/github.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/gitlabDuo.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/google.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/kimiCoding.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/qoder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/providers/windsurf.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/rotationMap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh/shared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/tokenRefresh.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/toolLatencyTracker.ts",["41137"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/toolLimitDetector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/toolSchemaSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/adobeFirefly.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/antigravity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/antigravityWeeklyQuota.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/bailian.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/claude.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/codebuddy-cn.ts",["41138","41139"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/crof.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/deepseek.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/firecrawl.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/github.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/glm.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/grokCli.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/hyperagent.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/kimi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/minimax.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/nanogpt.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/opencode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/openrouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/promptql.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/qoder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/quota.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/scalars.ts",["41140"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/vertex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/xai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/xaiOauth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage/xiaomi-mimo.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/usage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/v0QuotaFetcher.ts",["41141"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/volumeDetector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/wafRateLimit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/webFetchInterception.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/webSearchFallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/webSearchRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/webSessionPoolHealth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/wildcardRouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/workflowFSM.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/services/xaiOauthQuotaFetcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/shared/zedAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/transformer/responsesTransformer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/bootstrap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/deepseekWebTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/formats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/__tests__/maxTokensHelper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/__tests__/schemaCoercion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/claudeHelper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/geminiHelper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/geminiToolsSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/jsonUtil.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/maxTokensHelper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/openaiHelper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/responsesApiHelper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/schemaCoercion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/strictSystemHoist.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/toolCallHelper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/helpers/toolCallShim.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/image/sizeMapper.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/paramSupport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/antigravity-to-openai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/claude-to-gemini.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/claude-to-openai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/gemini-to-openai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses/additionalTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses/helpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses/namespaceFlatten.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses/toResponses.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-responses.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-claude/sanitizeToolResultId.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-claude/thinkingBudget.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-claude/toolResultAdjacency.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-claude.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-gemini/helpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-gemini.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-kiro/adaptiveThinking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-kiro/messageHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/request/openai-to-kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/claude-to-openai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/cursor-to-openai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/gemini-to-claude.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/gemini-to-openai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/kiro-to-openai.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/eventEmitter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/pureHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/requestToolIdentity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/synthesizeCompletedToolCalls.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses/toolSchemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-responses.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-to-antigravity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-to-claude.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-to-gemini-sse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/openai-to-gemini.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/response/responsesToolItem.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/translator/webTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/types.d.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/agentGoalPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/aiSdkCompat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/anthropicHost.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/audioResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/awsSigV4.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/bypassHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/bypassResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cacheControlPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/ccDiscoveryAliases.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/claudeCodeMetaRequests.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/claudeEffortVariants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/clinepassEnvelope.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/comfyuiClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/composerToolCalls.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorAgentCliVersion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorAgentProtobuf/nativeTodoWrite.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorAgentProtobuf/wire.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorAgentProtobuf.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorChecksum.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorImages.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/cursorVersionDetector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/diagnostics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/earlyStreamKeepalive.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/error.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/estimateSize.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/finishReason.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/flattenToolHistory.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/functionalGatewayMirrors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/headers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/heapPressure.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/jsonSize.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/jsonToSse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/keepaliveThreshold.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/kieTask.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/kimiDevice.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/kiroSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/logger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/networkProxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/nextAuthCookie.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/noThinkingAlias.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/number.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/ollamaTransform.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/openAIStreamChunk.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/opencodeHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/passthroughTailProcessor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/progressTracker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/providerRequestLogging.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyDispatcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyDispatcherCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyFallback.ts",["41142"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyFamily.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyFamilyResolve.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/proxyFetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/publicCreds.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/reasoningContentInjector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/reasoningFields.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/reasoningPlaceholder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/registeredEffortVariants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/requestLogger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/resourcePressure.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/resourcePressurePolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/resourcePressureSampler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesCommentaryDrop.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesEndpoint.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesInputNormalization.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesStatePolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/responsesStreamHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/segmindClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/setupPolyfill.ts",["41143","41144","41145","41146","41147"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/sha3-512.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/sleep.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/socksConnectorWithFamily.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/sseHeartbeat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/stream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamErrorFormat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamFailureFinalization.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamHandler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamPayloadCollector.ts",["41148"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamReadiness.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/streamReadinessPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/syncedEffortVariants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/textualToolCall.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/thinkCloseMarker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/thinkTagParser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/tlsClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/toolCallArguments.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/toolSources.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/upstreamErrorPassthrough.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/upstreamResponseHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/urlSanitize.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/open-sse/utils/usageTracking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/playwright.config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/postcss.config.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/prettier.config.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/public/sw.js",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/source.config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/BootstrapBanner.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/HomePageClient.tsx",["41149"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/HomeProviderTopologySection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/KimiSponsorBanner.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/TierCoverageWidget.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/a2a/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/acp-agents/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/ActivityFeedClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/components/ActivityFeed.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/components/ActivityItem.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/components/DayHeader.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/components/EventTypeFilter.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/activity/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/AgentSkillsPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/components/CoverageBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/components/McpA2aLinksBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/components/SkillCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/components/SkillPreviewPane.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/agent-skills/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/AutoRoutingAnalyticsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/CacheHealthTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/ComboHealthTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/CompressionAnalyticsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/ProviderUtilizationTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/RouteExplainabilityTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/SearchAnalyticsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/combo-health/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/components/DiversityScoreCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/components/ProviderCharts.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/compression/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/evals/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/loading.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/search/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/analytics/utilization/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-endpoints/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/ApiManagerPageClient.tsx",[],["41150"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/apiManagerPageStorage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/apiManagerPageUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/apiManagerScopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/ApiKeyFilterBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/ApiKeyFilterChip.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/BypassProviderQuotaToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/ChaosModeAccessToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/components/UsageLimitSettings.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/api-manager/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/A2aAuditTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/ComplianceTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/McpAuditTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/a2a/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/mcp/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/audit/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/auto-combo/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/BatchDetailModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/BatchListTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/FileDetailModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/FilesListTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/batch-utils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/BatchConceptCard.tsx",[],["41151"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/ExpirationBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/FilesConceptCard.tsx",[],["41152"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/NewBatchWizard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/ProgressBarBicolor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/UploadFileModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/useBatchActions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/CostEstimateStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/CsvMappingStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/DestinationStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/InputStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/wizard/JsonlValidationStep.tsx",[],["41153"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/files/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/CachePage.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/CachePerformance.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/CacheTrends.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/IdempotencyLayer.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/__tests__/MemoryCards.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/CacheEntriesTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/CachePerformance.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/CacheTrends.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/IdempotencyLayer.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/MemoryCards.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/components/ReasoningCacheTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/media/MediaPageClient.tsx",[],["41154","41155","41156","41157","41158","41159","41160"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/media/mediaProviderModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/media/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cache/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/changelog/components/ChangelogViewer.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/changelog/components/NewsViewer.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/changelog/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/ChaosConfigPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/chaosPageTypes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosBasicSettingsFields.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosConfigActionsBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosModeSelector.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosProviderOverridesPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosStatusMessage.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/components/ChaosTestResultsPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/useChaosConfigData.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/useChaosConfigPage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/useChaosConfigPersistence.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/chaos/useChaosTestRun.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-agents/CliAgentsPageClient.tsx",["41161","41162","41163","41164"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-agents/[id]/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-agents/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/CliCodePageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/[id]/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/AntigravityToolCard.tsx",["41165"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClaudeCcDiscoveryInfoButton.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClaudeClassifierCompatToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClaudeGatewayOnboardingBlock.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClaudeToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CliProfileAutoSyncToggles.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CliStatusBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ClineToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CliproxyapiToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CodexToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CopilotToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/CustomCliCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/DefaultToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/DroidToolCard.tsx",[],["41166"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/HermesAgentToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/KiloToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/OpenClawToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ToolDetailClient.tsx",[],["41167"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/codexButtonState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/codexToolOptions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/customCliConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/index.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cloud-agents/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/AutoComboCatalog.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/BuilderIntelligentStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/ComboControlCenterClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/FieldLabelWithHelp.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/IntelligentComboPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/KimiComboPresetCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/ReasoningTokenBufferToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/ResponseValidationEditor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/WeightTotalBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/[id]/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/error.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/kimiComboPreset.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/ComboLiveStudio.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/comboFlowModel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/fleetAggregation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/nodes/ProviderCascadeNode.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/nodes/RequestNode.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/nodes/ResponseNode.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/nodes/StrategyNode.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/live/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/loading.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/parts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/playground/ComboPlaygroundClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/playground/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/combos/useComboProxyAssignments.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/components/BadgeToast.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/exclusions/ExclusionsPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/exclusions/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/live/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/CompareView.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/CompressionAnnotation.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/CompressionCockpit.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/DiffPane.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/EncoderComparisonTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/PlayView.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/PlaygroundInput.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/QuantumLockBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/RiskGateBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/SaliencyHeatmap.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/WaterfallInspector.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/compressionFlowModel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/nodes/EngineNode.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/nodes/IoNode.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/compression/studio/useCompressionReplay.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/CompressionStylesTile.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/aggressive/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/caveman/CavemanContextPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/caveman/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/ccr/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/combos/CompressionCombosPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/combos/CompressionHub.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/combos/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/headroom/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/lite/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/llmlingua/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/omniglyph/OmniglyphContextPageClient.tsx",[],["41168"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/omniglyph/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/omniglyph/sampleData.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/rtk/RtkContextPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/rtk/RtkLearnDiscoverCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/rtk/RtkTomlImportCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/rtk/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/session-dedup/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/settings/CompressionPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/settings/EngineGuidanceDetail.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/settings/adaptiveTargetLabel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/settings/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/context/ultra/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/CostOverviewTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/budget/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/components/ApiKeyUsageLimitCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/components/CostCharts.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/components/MetricCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/components/TopListCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/costExplorerParams.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/costExplorerUtils.ts",["41169"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/pricing/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/QuotaSharePageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/AccountQuotaRow.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/AllocationTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/BurnRateChart.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/BurnRateChartInner.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/CreatePoolModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/DimensionBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/PoolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/PoolWizard.tsx",[],["41170","41171","41172"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaConceptCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/QuotaEndpointsCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/StackedAllocationBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/components/UsageLogCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/hooks/useLocalStoragePoolMigration.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/hooks/usePoolUsage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/hooks/usePools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/hooks/usePoolsUsageAggregate.ts",[],["41173","41174"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/quota-share/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/costs/useApiKeyUsageLimits.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/discovery/DiscoveryPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/discovery/__tests__/DiscoveryPageClient.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/discovery/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/ApiEndpointsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/EndpointPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/VscodeTokenAliasCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/__tests__/ApiEndpointsTab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/__tests__/EndpointPageClient.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/components/A2ADashboard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/components/MCPDashboard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/components/NotionSourceCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/components/ObsidianSourceCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/endpoint/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/free-provider-rankings/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/free-tiers/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/gamification/admin/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/health/ProviderHealthAutopilotCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/health/ProviderHealthMatrixCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/health/TelemetryCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/health/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/homeAppearance.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/kimiSponsorBannerGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/leaderboard/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/limits/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/CompressionLogTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/activity/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/console/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/proxy/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/logs/timeline/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/mcp/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/MediaProviderPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/[kind]/[id]/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/[kind]/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/EmbeddingExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/ImageExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/LlmChatCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/MediaProviderHeader.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/MediaProviderKindNav.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/MusicExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/OcrExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/PlaygroundCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/ServiceKindTabs.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/SttExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/TtsExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/VideoExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/WebFetchExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/WebSearchExampleCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/components/mediaKinds.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/media-providers/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/EditMemoryModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/EmbeddingSourceSelector.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/MemoryConceptCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/MemoryEngineStatus.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/QdrantConfigCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/RerankConfigCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/RetrievePreview.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/tabs/EngineTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/tabs/MemoriesTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/components/tabs/PlaygroundTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/hooks/useEngineStatus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/hooks/useMemorySettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/memory/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/OmniSkillsPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniExecutionsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniMarketplaceTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniSandboxTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniSkillCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/OmniSkillsList.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/components/SkillInspectorPane.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/omni-skills/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/onboarding/components/TierFlowDiagram.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/onboarding/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/onboarding/steps/TierTour.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/PlaygroundStudio.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/CompareColumn.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ExportCodeModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ImprovePromptButton.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/MarkdownMessage.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ParamSliders.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/PresetPicker.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ProviderMetrics.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ReasoningControls.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/StructuredOutputEditor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/StudioConfigPane.tsx",[],["41175","41176","41177"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/StudioTopBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/TokenCostCounter.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/ToolsBuilder.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/modelSelection.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/reasoningControlUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/ApiTab.tsx",["41178"],["41179","41180"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/BuildTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/ChatTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/CompareTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/components/tabs/build/BuildWizard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/useImprovePrompt.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/usePresets.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/useStreamMetrics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/useStructuredOutput.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/hooks/useToolsBuilder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/playground/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/plugins/[name]/config/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/plugins/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/profile/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/provider-stats/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/ProviderDetailPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/ProviderDetailPageClient.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/connectionRowAutoSyncToggle.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/modelVisibilityToolbarActiveCount.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/passthroughModelRowDisplayName.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/passthroughTestHelpers.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/phase1e.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/phase1f.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/providerModelsSectionVisibilityKey.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/useConnectionAutoSync.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/useModelImportHandlers.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/__tests__/useModelVisibilityHandlers.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/codexPlanLabel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/AdaptaTutorialModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/BatchTestResultsModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/CompatibleModelsSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/CompatibleNodeCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionRow.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionsHeaderToolbar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionsListPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/CoolingConnectionsPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/CustomModelsSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/EmptyConnectionsPlaceholder.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ExternalLinkModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ImportProgressModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/KimiCodeAuthMethodModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ModelCompatPopover.tsx",[],["41181"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ModelRow.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/NoAuthProviderControls.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/OpenRouterPresetInput.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/PassthroughModelRow.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/PassthroughModelsSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderCcAliasSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderExtraPanels.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderInterceptionSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderModalsPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderModelsSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderPageHeader.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderParamFilterSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderPlaygroundPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ProviderQuotaVisibilityToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/SearchProviderCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/SiliconFlowEndpointModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/UpstreamProxyCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/WebSessionCredentialGuide.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/ZedImportCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/__tests__/phase1d.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/connectionRowHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AddApiKeyModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AgentrouterConsoleFields.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/AlibabaProviderRegionField.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/CcCompatibleRequestDefaultsFields.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/EditCompatibleNodeModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/EditConnectionModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/GlmTeamQuotaFields.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ImportClaudeAuthModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ImportCodexAuthModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ImportGrokCliAuthModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/NewApiAggregatorFields.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ProviderTierField.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/QuotaScrapingFields.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/__tests__/authImportModals.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/__tests__/connModals.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/__tests__/editCompatibleNodeModal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/ccCompatibleRequestDefaults.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/commandCodeAuthPhase.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/computeConnectionDefaultName.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/connectionProviderSpecificData.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/glmTeamQuotaProviderData.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/m365Tier.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/modals/providerTierFieldApi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/components/passthroughAlias.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/connectionsSearchFilter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/modelImportWarning.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useApiKeySave.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useAuthFileHandlers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useCommandCodeAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useConnectionAutoSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useConnectionDeleteConfirm.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useConnectionGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useExternalLinkFlow.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useModelCompatState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useModelImportHandlers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useModelVisibilityHandlers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderConnections.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderNodeActions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderQuotaVisibility.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useProviderSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/hooks/useReorderByAvailability.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/providerCredentialText.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/providerDetailConstants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/providerInputParsers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/providerPageHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/[id]/webSessionCredentials.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/AddCompatibleProviderModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/CategoryDot.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/CodexCliGuideModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/HighlightableProviderCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ImportProvidersFromFileModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/NoAuthProvidersSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ProviderCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ProviderCountBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ProviderDisplayModeControl.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/ProviderSummaryCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/RiskNoticeModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/__tests__/providerCardAudioBadge.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/onboarding/ProviderOnboardingWizard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/onboarding/providerOnboardingApi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/onboarding/providerOnboardingCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/onboarding/providerOnboardingHref.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/parseProviderImportFile.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/components/useImportProvidersFromFile.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/context/openRouterProviderStatsContext.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/error.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/featuredProviders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useApiKey.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useProviderModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useProviderUrlFilters.ts",[],["41182","41183"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useRiskAcknowledged.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/hooks/useSyncedModelsByProvider.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/loading.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/new/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/providerCompactMode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/providerPageHighlightUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/providerPageStorage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/providerPageUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/[name]/embed/[[...path]]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/ApiKeyField.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/AutoRestartAdoptedToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/AutoStartToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/CliproxyConnectionPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/CliproxyModelMappingEditor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/CliproxyProviderExposureCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/DarioAccountPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/NinerouterEmbedFrame.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/NinerouterInstallWizard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/NinerouterModelList.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/NinerouterProviderExposureCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/ServiceLifecycleButtons.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/ServiceLogsPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/components/ServiceStatusCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/hooks/useServiceLogs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/hooks/useServiceStatus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/BifrostServiceTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/CliproxyServiceTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/DarioServiceTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/MuxServiceTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/services/tabs/NinerouterServiceTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/providers/utils/buildCurl.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/quota/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/radar/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/radar/setup/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/relay/RelayProxyClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/relay/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/runtime/RuntimePageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/runtime/components/ModelCooldownsCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/runtime/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/SearchToolsClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/ProviderCatalog.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/ProviderComparison.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/RerankPanel.tsx",[],["41184"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/ResultsPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/ScrapeResult.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchConceptCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchForm.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchHistory.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchToolsConfigPane.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/SearchToolsTopBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/tabs/CompareTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/tabs/ScrapeTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/components/tabs/SearchTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/hooks/useScrapeFetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/search-tools/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/access-tokens/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/advanced/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/ai/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/appearance/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/cache/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AccessTokensTab.tsx",[],["41185"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AccountEmailVisibilitySetting.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AppearanceTab.tsx",["41186","41187","41188","41189"],["41190"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AuthzSection.tsx",["41191"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/AutoDisableCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/BackgroundDegradationTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CacheSettingsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CacheStatsCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ClaudeFastModeTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CliproxyapiSettingsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CodexAutoPingTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CodexFastTierTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ComboDefaultsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ComplianceTab.tsx",[],["41192"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CompressionSettingsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/CompressionTokenSaverCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/DatabaseBackupRetentionCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/DebugModeCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/FallbackChainsEditor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/FeatureFlagCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/FeatureFlagsGrid.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/FusionDefaultsFields.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/IPFilterSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/LogToolSourcesCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/MemorySkillsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/MitmProxyTab.tsx",["41193"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelAliasesTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelAliasesUnified.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelCapabilityOverridesTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelLockoutCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ModelsDevSyncTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/OneproxyTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/PayloadRulesTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/PoliciesPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/PricingTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProviderAccountRoutingCard.tsx",["41194"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyBatchActions.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyBulkImportModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyCheckboxCell.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyHealthCell.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyStatusBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ProxyTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/RedisLauncherPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/RequestLimitsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ResilienceFields.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ResilienceTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ResponsesStatePolicyTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/RoutingStrategyCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/RoutingTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SecurityTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SessionInfoCard.tsx",["41195"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SidebarTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SystemPromptTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/SystemStorageTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/ThinkingBudgetTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/UsageTokenBufferTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/VisionBridgeSettingsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/parseBulkProxyImport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/CloudflareRelayModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/DenoRelayModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/DocumentationTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx",[],["41196","41197"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/FreeProxyRow.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/GlobalConfigTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/ProxyPoolTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/SourceToggleBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/SubscriptionTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/VercelRelayModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxyRegistryTypes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxyStrategyOptions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/systemTransformsHermesDefaults.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/useProxyBatchOperations.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/useProxyBulkImport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/useProxyPoolModal.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/error.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/feature-flags/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/general/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/loading.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/pricing/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/resilience/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/routing/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/security/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/sidebar/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/system/1proxy/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/system/mitm-proxy/error.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/system/mitm-proxy/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/system/proxy/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tokens/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentBridgeMaintenanceCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentBridgeServerCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx",["41198","41199","41200"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/BypassListEditor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/EmptyStateNoProviders.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelMappingTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelSelectorModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/RiskNoticeBanner.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/SetupWizard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/UpstreamCaField.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/shared/AgentIcon.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/shared/CertStatusIcon.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/components/shared/DnsStatusBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/hooks/useAgentBridgeState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/hooks/useMitmSudoPrompt.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/normalizeState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/agent-bridge/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/TrafficInspectorPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/CaptureModesToolbar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/CustomHostsManager.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/DetailsPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/HttpProxySnippetCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/RequestRow.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/RequestStreamingList.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/TopBarControls.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/chat/ChatBubble.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/chat/MessageContent.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/chat/ToolCallBlock.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/chat/ToolResultBlock.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/session/HistoricSessionBanner.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/session/SessionPicker.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/session/SessionRecorderBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/AgentEmoji.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/AnnotationField.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/ContextColorBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/HeaderTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/JsonViewer.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/SecretMaskToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/SseEventList.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/TimingWaterfall.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/shared/TokenBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/ConversationTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/HeadersTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/LlmDetailsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/RequestBodyTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/ResponseBodyTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/StatsCharts.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/StatsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/components/tabs/TimingTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useAnnotations.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useReplay.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useResizablePanels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useSessionRecorder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useSystemProxyExitGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useTrafficFilters.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useTrafficStream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/hooks/useVirtualList.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/tools/traffic-inspector/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/TranslatorPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/MonitorTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/ResultNarrated.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/SimpleControls.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/TranslateFlowDiagram.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/TranslateTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/TranslatorConceptCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/AdvancedSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/CompressionPreviewAccordion.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/PipelineView.tsx",[],["41201"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/RawJsonPanel.tsx",[],["41202"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/StreamTransformerAccordion.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/components/advanced/TestBenchAccordion.tsx",[],["41203"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/exampleTemplates.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/hooks/useAvailableModels.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/hooks/useProviderOptions.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/hooks/useTranslateDeepLink.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/hooks/useTranslateSession.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/translator/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/BudgetTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/BudgetTelemetryCards.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/EvalsTab.tsx",[],["41204"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/FreeBudgetCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/CodexResetCreditsModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderLimitCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/ProviderUsdCostModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaCardGrid.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaCutoffModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaMiniBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaProgressBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/QuotaTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/constants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/formatters.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/i18nFallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/index.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/parts/QuotaCardBody.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/parts/QuotaCardExpanded.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/parts/QuotaCardHeader.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/parts/QuotaEnvGroup.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/providerColumns.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/quotaParsing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/useCodexResetCreditRedemption.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/useQuotaVisibility.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/useVisibleQuotaData.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/ProviderLimits/utils.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/RateLimitStatus.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/components/SessionsTab.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/usage/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/WebhooksPageClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/__tests__/webhook-wizard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/AddWebhookWizard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/HowItWorksSidebar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/WebhookCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/WebhookDeliveriesPanel.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/WebhooksList.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/DeliveryStatusBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/EventChecklist.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/HmacRecipeBlock.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/IntegrationCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/shared/PayloadPreview.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/Step1ChooseIntegration.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/Step2ConfigureIntegration.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/Step3EventsAndTest.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/CustomConfigForm.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/DiscordConfigForm.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/SlackConfigForm.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/TelegramConfigForm.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/webhooks/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/ProviderQuotaWidget.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/ProviderTopology.tsx",[],["41205"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/page.tsx",["41206"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/topologyLabel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/home/topologyUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/.well-known/agent.json/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/400/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/400/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/401/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/401/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/403/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/403/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/408/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/408/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/429/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/429/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/500/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/500/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/502/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/502/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/503/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/503/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/a2a/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/[...omnirouteApiCatchAll]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/a2a/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/a2a/tasks/[id]/cancel/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/a2a/tasks/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/a2a/tasks/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/acp/agents/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/admin/concurrency/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/[id]/raw/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/coverage/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/generate/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/agent-skills/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/analytics/auto-routing/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/analytics/compression/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/analytics/diversity/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/assess/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/csrf/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/login/route.ts",["41207"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/logout/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/oidc/callback/route.ts",["41208"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/oidc/login/route.ts",["41209"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/auth/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/batches/[id]/route.ts",["41210"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/batches/route.ts",["41211"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cache/entries/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cache/reasoning/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cache/route.ts",["41212"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cache/stats/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/chaos/config/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/chaos/run/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli/connect/route.ts",["41213"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli/tokens/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli/tokens/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli/whoami/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/_lib/jsoncConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/all-statuses/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/antigravity-mitm/alias/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/antigravity-mitm/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/apply/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/backups/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/claude-settings/route.ts",["41214"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/cline-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/codewhale-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/codex-profiles/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/codex-settings/route.ts",["41215"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/config/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/crush-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/deepseek-tui-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/detect/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/droid-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/forge-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/grok-build-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/guide-settings/[toolId]/route.ts",[],["41216"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/hermes-agent-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/jcode-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/keys/route.ts",["41217"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/kilo-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/letta-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/logs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/omp-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/openclaw/auto-order/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/openclaw-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/pi-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/qwen-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/runtime/[toolId]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/smelt-settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cli-tools/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cloud/auth/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cloud/credentials/update/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cloud/model/resolve/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/cloud/models/alias/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/codex/connect/[token]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/[id]/route.ts",["41218"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/auto/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/builder/options/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/metrics/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/reorder/route.ts",["41219"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/route.ts",["41220"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/combos/test/route.ts",["41221"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compliance/audit-log/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/compare/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/compare/verify/route.ts",["41222"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/engines/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/language-packs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/preview/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/retrieve/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/compression/rules/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/analytics/engine/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/analytics/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/caveman/config/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/combos/[id]/assignments/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/combos/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/combos/default/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/combos/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/config/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/discover/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/filters/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/learn/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/raw-output/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/context/rtk/test/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/copilot/chat/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/dahl/tokens/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db/health/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db-backups/export/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db-backups/exportAll/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db-backups/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/db-backups/route.ts",["41223"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/discovery/results/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/discovery/results/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/discovery/scan/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/discovery/verify/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/docs/codex-cli/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/docs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/evals/[suiteId]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/evals/route.ts",["41224"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/evals/suites/[suiteId]/route.ts",["41225"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/evals/suites/route.ts",["41226"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/fallback/chains/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/files/[id]/content/route.ts",["41227"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/files/route.ts",["41228"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/free-models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/free-provider-rankings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/free-tier/summary/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/anomalies/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/badges/earned/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/badges/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/federation/leaderboard/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/federation/score/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/invite/redeem/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/invite/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/leaderboard/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/level/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/notifications/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/rotate/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/servers/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/stream/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/gamification/transfer/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/github-skills/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/guardrails/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/guardrails/test/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/headroom/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/headroom/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/headroom/stop/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/health/degradation/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/health/ping/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/init/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/intelligence/sync/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/internal/codex-responses-ws/compression.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/internal/codex-responses-ws/history.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/internal/codex-responses-ws/modelResolution.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/internal/codex-responses-ws/route.ts",["41229"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/issue-agent/runs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/devices/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/regenerate/route.ts",["41230"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/reveal/route.ts",["41231"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/route.ts",["41232"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/[id]/usage-limits/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/groups/[id]/keys/route.ts",["41233"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/groups/[id]/permissions/route.ts",["41234"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/groups/[id]/route.ts",["41235"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/groups/route.ts",["41236"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/keys/route.ts",["41237"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/local/redis/redisRuntime.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/local/redis/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/local/redis/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/local/redis/stop/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/logs/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/logs/console/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/logs/detail/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/logs/export/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/audit/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/audit/stats/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/sse/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/stream/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/mcp/tools/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/embedding-providers/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/engine-status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/health/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/reindex/route.ts",["41238"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/retrieve-preview/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/memory/summarize/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/middleware/hooks/[name]/route.ts",["41239"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/middleware/hooks/route.ts",["41240"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/model-capability-overrides/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/model-combo-mappings/[id]/route.ts",["41241"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/model-combo-mappings/route.ts",["41242"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/alias/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/catalog/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/openrouter-catalog/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/test/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/models/test-all/route.ts",["41243"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/monitoring/health/route.ts",["41244"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/network/info/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/[provider]/[action]/keychainImportOnly.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/[provider]/[action]/remoteOAuthHint.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/[provider]/[action]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/[provider]/paste-credentials/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/cliproxy-import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/codex/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/codex/import-token/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/cursor/auto-import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/cursor/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/api-key/helpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/api-key/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/auto-import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/social-authorize/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/kiro/social-exchange/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/raycast/auto-import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/raycast/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/oauth/trae/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/openapi/spec/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/openapi/try/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/playground/improve-prompt/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/playground/presets/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/playground/presets/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/playground/simulate-route/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/[name]/activate/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/[name]/config/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/[name]/deactivate/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/[name]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/marketplace/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/plugins/scan/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/policies/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/pricing/defaults/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/pricing/models/route.ts",["41245"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/pricing/route.ts",["41246"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/pricing/sync/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-metrics/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-models/route.ts",["41247"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-nodes/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-nodes/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-nodes/urlGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-nodes/validate/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/provider-stats/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/cc-alias/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/claude-auth/apply-local/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/claude-auth/export/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/codex-auth/apply-local/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/codex-auth/export/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/interception-rules/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/login/route.ts",["41248"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/helpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/normalizers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/providerModelsConfig.ts",["41249"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discovery/providerSets.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discoveryClientVersion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/discoveryConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/route.ts",["41250"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/models/staleEncryptionGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/param-filters/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/refresh/route.ts",["41251"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/route.ts",["41252"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/sync-models/degradedLocalCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/sync-models/route.ts",["41253"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/test/cliRuntimeProviderMap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/test/mistralAmbiguousAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/test/oauthTestConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/[id]/test/route.ts",["41254"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/agy-auth/apply-local/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/agy-auth/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/agy-auth/import-bulk/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/agy-auth/zip-extract/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/bulk/route.ts",["41255"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/bulk-web-session/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/claude-auth/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/claude-auth/import-bulk/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/claude-auth/zip-extract/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/client/route.ts",["41256"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/codex-auth/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/codex-auth/import-bulk/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/codex-auth/zip-extract/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/apply/route.ts",["41257"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/callback/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/shared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/command-code/auth/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/expiration/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/health-autopilot/actions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/health-autopilot/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/health-matrix/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/import/route.ts",["41258"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/openrouter-stats/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/quota-windows/route.ts",["41259"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/test-batch/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/validate/route.ts",["41260"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/zed/discover/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/zed/import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/providers/zed/manual-import/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/proxy-fallback/test/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/groups/[id]/route.ts",["41261"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/groups/route.ts",["41262"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/keys/[id]/models/route.ts",["41263"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/plans/[connectionId]/route.ts",["41264"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/plans/route.ts",["41265"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/pools/[id]/log/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/pools/[id]/route.ts",["41266"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/pools/[id]/usage/route.ts",["41267"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/pools/route.ts",["41268"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/quota/preview/route.ts",["41269"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/radar/catalog/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/radar/settings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/radar/sync/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/rate-limit/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/rate-limits/route.ts",["41270"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/relay/tokens/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/relay/tokens/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/resilience/model-cooldowns/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/resilience/reset/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/resilience/route.ts",["41271"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/restart/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/routing/decisions/[requestId]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/search/providers/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/search/stats/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/_lib.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/auto-restart-adopted/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/auto-start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/provider-expose/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/restart/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/rotate-key/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/stop/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/9router/update/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/[name]/logs/route.ts",["41272"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/_shared/installRoute.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/_lib.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/auto-restart-adopted/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/auto-start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/restart/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/stop/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/bifrost/update/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/_lib.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/auto-restart-adopted/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/auto-start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/provider-expose/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/restart/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/stop/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/cliproxy/update/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/_lib.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/_lib.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/accounts/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/import-from-omniroute/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/login-complete/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/admin/login-start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/auto-restart-adopted/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/auto-start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/restart/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/stop/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/dario/update/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/_lib.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/auto-restart-adopted/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/auto-start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/restart/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/stop/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/services/mux/update/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/session-pools/[provider]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/session-pools/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sessions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/__tests__/memory.test.ts",["41273"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/__tests__/settings.test.ts",["41274"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/authz-inventory/route.ts",["41275"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/auto-disable-accounts/route.ts",["41276"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/background-degradation/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/cache-config/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/cache-metrics/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/cc-discovery-metrics/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/combo-defaults/route.ts",["41277"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/compression/mcp-accessibility/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/compression/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/compression/rules/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/compression/run-telemetry/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/database/refresh-stats/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/database/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/database/vacuum/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/export-json/route.ts",["41278"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/favicon/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/feature-flags/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/[id]/add-to-pool/route.ts",["41279"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/bulk-add-to-pool/route.ts",["41280"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/route.ts",["41281"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/stats/route.ts",["41282"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/free-proxies/sync/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/import-json/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/ip-filter/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/lkgp-cache/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/local-corpus/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/memory/route.ts",["41283"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/mitm/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/model-aliases/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/models-dev/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/notion/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/obsidian/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/obsidian/webdav/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/oneproxy/rotate/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/oneproxy/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/payload-rules/route.ts",["41284"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/[id]/repair-relay/route.ts",["41285"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/assignments/route.ts",["41286"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/auto-test/route.ts",["41287"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/batch-activate/route.ts",["41288"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/batch-delete/route.ts",["41289"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/bulk-assign/route.ts",["41290"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/bulk-import/route.ts",["41291"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/egress/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/health/route.ts",["41292"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/migrate/route.ts",["41293"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/pool/route.ts",["41294"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxies/route.ts",["41295"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/cloudflare-deploy/route.ts",["41296"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/deno-deploy/route.ts",["41297"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/route.ts",["41298"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/test/relayTestResult.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/test/route.ts",["41299"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/proxy/vercel-deploy/route.ts",["41300"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-call-logs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-detailed-logs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-logs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-quota-snapshots/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-request-history/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/purge-usage-history/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/cleanup/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/embedding-models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/health/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/route.ts",["41301"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/qdrant/search/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/quota-store/route.ts",["41302"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/reasoning-routing-rules/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/reasoning-routing-rules/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/reasoning-routing-rules/simulate/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/require-login/route.ts",["41303"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/route.ts",["41304","41305"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/system-prompt/route.ts",["41306"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/task-routing/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/thinking-budget/route.ts",["41307"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/settings/tier-config/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/shutdown/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/collect/chaos/route.ts",["41308"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/collect/detect/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/collect/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/executions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/marketplace/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/marketplace/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/skillssh/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/skills/skillssh/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/storage/health/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/bundle/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/cloud/route.ts",["41309"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/initialize/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/tokens/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/sync/tokens/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/synced-available-models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/system/env/repair/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/system/version/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tags/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/telemetry/summary/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/token-health/route.ts",["41310"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/detect/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/detected-models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/dns/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/mappings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/agents/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/bypass/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/cert/download/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/cert/regenerate/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/cert/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/config/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/diagnose/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/repair/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/server/route.ts",["41311"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/state/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/tproxy/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/upstream-ca/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/agent-bridge/upstream-ca/test/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/capture-modes/http-proxy/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/capture-modes/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/capture-modes/system-proxy/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/capture-modes/tls-intercept/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/export.har/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/hosts/[host]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/hosts/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/internal/ingest/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/requests/[id]/annotation/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/requests/[id]/replay/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/requests/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/requests/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/sessions/[id]/export.har/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/sessions/[id]/requests/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/sessions/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/sessions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tools/traffic-inspector/ws/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/detect/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/history/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/send/route.ts",["41312"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/transform-stream/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/translator/translate/route.ts",["41313"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/cloudflared/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/ngrok/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/check/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/disable/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/enable/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/login/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/routeUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/tunnels/tailscale/start-daemon/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/upstream-proxy/[providerId]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/[connectionId]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/analytics/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/budget/bulk/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/budget/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/cache-health/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/call-logs/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/call-logs/route.ts",["41314"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/codex-reset-credit/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-forecast/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-health/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-health-autopilot/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-health-dashboard/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/combo-scoring-inspector/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/history/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/logs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/model-latency-stats/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/om-usage/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/provider-limits/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/provider-window-costs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/proxy-logs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/quota/route.ts",["41315"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/request-logs/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/requests-by-provider-date/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/route-explain/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/token-limits/route.ts",["41316"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/usage/utilization/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/[...omnirouteCatchAll]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_helpers/apiKeyScope.ts",["41317"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_shared/audioProviderNodes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_shared/mediaGenerationRoute.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_shared/rateLimit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/_shared/specialtyCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/accounts/[id]/limits/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/agents/credentials/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/agents/health/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/agents/tasks/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/agents/tasks/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/antigravity/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/api/chat/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/audio/speech/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/audio/transcriptions/route.ts",["41318"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/audio/translations/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/auto-combo/[channel]/candidates/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/[id]/cancel/route.ts",["41319"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/[id]/route.ts",["41320"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/delete-completed/route.ts",["41321"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/formatBatchResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/parseListLimit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/batches/route.ts",["41322"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/chat/completions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/chatgpt-web/image/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/combos/projectCombo.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/combos/route.ts",["41323"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/completions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/completions/textCompletionTransform.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/embeddings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/files/[id]/content/route.ts",["41324"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/files/[id]/route.ts",["41325"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/files/route.ts",["41326"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/images/edits/route.ts",["41327","41328"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/images/generations/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/images/upscale/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/issues/report/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxies/assignments/route.ts",["41329"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxies/bulk-assign/route.ts",["41330"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxies/health/route.ts",["41331"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxies/route.ts",["41332"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxy-subscriptions/[id]/nodes/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxy-subscriptions/[id]/refresh/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxy-subscriptions/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/management/proxy-subscriptions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/me/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/messages/count_tokens/route.ts",["41333"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/messages/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/[...model]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/aliasBackedModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalog.ts",["41334"],["41335"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogDedupe.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogOpenrouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogOrder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogProviderMaps.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogRequest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogSyncedCoverage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/catalogVision.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/ccAliasPredicate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/functionalGatewayPredicate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/modelById.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/models/syncedCapabilities.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/moderations/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/music/generations/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/ocr/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/provider-plugin-manifest/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/chat/completions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/embeddings/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/images/generations/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/limits/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/[provider]/models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/providers/suggested-models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/quotas/check/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/registered-keys/[id]/revoke/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/registered-keys/[id]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/registered-keys/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/bifrost/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/bifrostCooldown.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/relaySecurity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/routingBackend.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/relay/chat/completions/streamFinalizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/rerank/route.ts",["41336"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/responses/[...path]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/responses/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/search/analytics/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/search/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/videos/generations/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/api/chat/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/api/show/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/api/tags/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/api/version/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/chat/completions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/combos/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/familyFirstModelIds.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/modelPresentation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/models/route.ts",["41337"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/reasoningMetadata.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/responses/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/serviceTierVariants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/tokenizedRequest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/usableChatModel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/v1/chat/completions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/[token]/v1/models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/combos/[token]/[[...slug]]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/contextSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/api/chat/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/api/show/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/api/tags/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/api/version/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/chat/completions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/combos/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/familyFirstModelIds.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/modelPresentation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/reasoningMetadata.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/responses/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/serviceTierVariants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/tokenizedRequest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/v1/chat/completions/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/vscode/raw/[token]/v1/models/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/web/fetch/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1/ws/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1beta/models/[...path]/convertGeminiToInternal.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1beta/models/[...path]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/v1beta/models/route.ts",["41338"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/check-update/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/install/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/request.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/restart/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/start/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/status/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/version-manager/stop/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/vnc-session/[...params]/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/vnc-session/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/[id]/deliveries/route.ts",["41339"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/[id]/route.ts",["41340"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/[id]/test/route.ts",["41341","41342"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/route.ts",["41343"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/api/webhooks/validate-url/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/auth/callback/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/authorize/parseCallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/authorize/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/callback/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/connect/codex/[token]/CodexConnectClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/connect/codex/[token]/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/[...slug]/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/api/search/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/api-explorer/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/components/ApiExplorerClient.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/components/DocsPageAnalytics.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/components/FeedbackWidget.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/lib/openapi.generated.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/docs/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/error.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/forbidden/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/forgot-password/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/global-error.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/healthz/route.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/AnimatedBackground.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/Features.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/FlowAnimation.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/Footer.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/GetStarted.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/HeroSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/HowItWorks.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/components/Navigation.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/landing/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/layout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/loading.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/login/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/maintenance/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/manifest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/not-found.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/offline/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/privacy/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/status/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/terms/page.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/assessor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/categorizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/migration.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/selfHealer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/assessment/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/comboResolver.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/configAudit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/connectionModelRules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/costRules.ts",["41344"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/degradation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/fallbackPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/lockoutPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/modelAvailability.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/omnirouteResponseMeta.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/persistence/comboRepositories.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/pipeline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/policyEngine.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/prompts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/providerExpiration.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/quotaCache.ts",["41345"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/responses.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/tagRouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/domain/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/hooks/useLiveCompression.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/hooks/useLiveDashboard.ts",["41346","41347"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/hooks/usePreviewCompression.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/hooks/useProviderBreakerHealth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/i18n/config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/i18n/detectBrowserLocale.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/i18n/request.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/instrumentation-node.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/instrumentation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/routingLogger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/costAnalysis.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/healthReport.ts",["41348"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/listCapabilities.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/providerDiscovery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/quotaManagement.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/skills/smartRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/streaming.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/taskExecution.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/a2a/taskManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/accessTokens/scopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/acp/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/acp/manager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/acp/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/catalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/cliRegistryParser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/generator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/openapiParser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/schemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/agentSkills/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/comboErrorResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/errorResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/internalServiceAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/modelTestRunner.ts",["41349"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/proxyRegistryRouteHandlers.ts",["41350"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/requireCliToolsAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/requireManagementAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/api/serverErrorMessage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/apiBridgeServer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/apiKeyExposure.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/arenaEloSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/audit/activityIcons.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/audit/highLevelActions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/audit/timeline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/auth/managementPassword.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/costEstimator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/csvToJsonl.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/dispatch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/retryFailed.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/schemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/batches/validateJsonl.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/benchmarks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/build-profile/featureDisabled.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cacheControlSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cacheLayer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/catalog/openrouterCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/catalog/openrouterProviderStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/ccDiscoveryAliasResolve.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/chaos/chaosConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/chaos/chaosExecutor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/claudeProfileAutoSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/codexProfileAutoSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/claude.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/cline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/continue.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/hermes-agent.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/hermes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/hermesHome.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/kilocode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/config-generator/opencode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/doctor/checks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/log-streamer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cli-helper/tool-detector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cliTools/batchStatusCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cliTools/checkToolConfigStatus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/agents/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/agents/cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/agents/devin.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/agents/jules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/api.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/baseAgent.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/credentials.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/db.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/julesApi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudAgent/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudSync.stub.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudSync.ts",["41351"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/cloudflaredTunnel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/autoPromote.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/builderDraft.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/builderOptions.ts",["41352"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/comboContext.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/compositeTiers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/controlCenter.ts",["41353"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/intelligentRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/invariants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/modelNameCollision.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/steps.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/combos/testHealth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/compliance/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/compliance/noLog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/compliance/providerAudit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/compression/judgeModelClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/config/hotReload.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/config/runtimeSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/consoleInterceptor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/container.ts",["41354"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/contextWindowResolver.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/codegraphKnowledge.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/commandClassification.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/engine.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/systemPrompt.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/copilot/tools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/credentialHealth/cache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/credentialHealth/scheduler.ts",["41355"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/dataPaths.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/__tests__/quotaSnapshots.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/_rowTypes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/accessTokens.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/betterSqliteAdapter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/bunSqliteAdapter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/driverFactory.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/nodeSqliteAdapter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/nodeSqliteShared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/sqljsAdapter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/adapters/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/agentBridgeBypass.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/agentBridgeMappings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/agentBridgeState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeyColumnFallbacks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeyContextSources.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeyGroups.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeyUsageLimitFields.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeys/modelPermissions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeys/rowParsers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeys/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/apiKeys.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/autoCandidateOverrides.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/backup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/batches.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/callLogStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/caseMapping.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/ccDiscoveryAliases.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/ccDiscoveryMetrics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/ccrBlocks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/cleanup/usagePurge.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/cleanup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/cliToolState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/comboForecast.ts",["41356"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/combos.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/commandCodeAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compression.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionAnalytics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionCacheStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionCombos.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionContextBudget.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionDetailNormalizers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/compressionRunTelemetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/contextHandoffs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/core.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/creditBalance.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/databaseSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/detailedLogs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/discovery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/discoveryResults.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/domainState.ts",["41357"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/encryption.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/evals.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/featureFlags.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/files.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/freeProxies.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/functionalGatewayMirrors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/gamification.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/healthCheck.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/inspectorCustomHosts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/inspectorSessions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/interceptionRules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/jsonMigration.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/localCorpus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/memoryVec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/middleware.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/migrationRunner/constants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/migrationRunner/extraDirs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/migrationRunner.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/modelCapabilityOverrides.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/modelComboMappings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/modelContextOverrides.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/modelIntelligence.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/activeSyncedCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/aliases.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/compat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/mitmAlias.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/shared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models/synced.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/models.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/notion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/obsidian.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/omp.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/oneproxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/optimizationSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/paramFilters.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/playgroundPresets.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/pluginMetrics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/plugins.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/probeUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/prompts.ts",["41358"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providerLimits.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providerNodeSelect.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providerPlans.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providerStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/columns.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/deletion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/lazyConnectionView.ts",["41359"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/migrations.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/nodes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/rateLimit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers/usageIdentityReconciliation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/providers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/guards.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/mappers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/registryGeneration.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/rotation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxies.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxyLatency.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxyLogs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/proxySubscriptions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaConsumption.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaGroups.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaModelCaps.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaPools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaResetEvents.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/quotaSnapshots.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/radar.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/readCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/reasoningCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/reasoningRoutingRules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/recovery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/registeredKeys.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/relayProbeStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/relayProxies.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/repositories/routingConfigRepositories.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/repositories/sqliteComboRepository.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/repositories/sqliteModelComboMappingRepository.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/schemaColumns.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/secrets.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/semanticCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/serviceModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/sessionAccountAffinity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/cacheMetrics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/lkgp.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/noAuthProxyFallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/pricing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings/shared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/settings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/skills.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/stateReset.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/stats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/syncTokens.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/tierConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/tokenLimits.ts",["41360"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/upstreamProxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/usageAnalytics/sources.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/usageAnalytics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/usageLogs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/usageSummary.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/vacuumScheduler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/versionManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/webSessionDedup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/webhookDeliveries.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/db/webhooks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/discovery/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/display/names.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/display/useProviderNodeMap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/docsI18nPath.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/docsSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/embeddings/familyGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/embeddings/service.ts",["41361"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/env/runtimeEnv.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/evals/evalRunner/builtinSuites.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/evals/evalRunner.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/evals/runtime.ts",["41362"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/events/eventBus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/events/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProviderRankings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProviderRankingsAuthType.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/iplocate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/oneproxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/proxifly.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/scheduler.ts",["41363"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/syncCycle.ts",["41364"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/freeProxyProviders/webshare.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/antiCheat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/badges.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/events.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/invites.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/leaderboard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/notifications.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/servers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/sharing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/streaks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gamification/xp.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/gracefulShutdown.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/base.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/credentialMasker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/piiMasker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/promptInjection.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/visionBridge.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/visionBridgeCredentials.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/visionBridgeHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/guardrails/visionBridgeRouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/headroom/detect.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/headroom/process.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/idempotencyLayer.ts",["41365"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/images/imageRouteModel.ts",["41366"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/initCloudSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/agentBridgeMaintenanceApi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/captureState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/configPortability.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/harExport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/matchesTrafficFilter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/secretMask.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/inspector/tproxyCaptureApi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/ipUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/issueAgent/audit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/issueAgent/execution.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/issueAgent/githubExport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/issueAgent/recordedTriage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/jobs/backupScheduleJob.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/jobs/budgetResetJob.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/jobs/cronMatch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/jobs/reasoningCacheCleanupJob.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/localCorpus/configured.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/localCorpus/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/localDb.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/localHealthCheck.ts",["41367"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/logEnv.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/logPayloads.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/logRotation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/machineToken.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/generic-backend.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/injection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/qdrant-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/retrieval.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/__tests__/schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/backend.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/cache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/cache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/index.ts",["41368"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/remote.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/staticPotion.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/transformersLocal.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/embedding/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/extraction.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/genericBackend.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/injection.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/manager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/obsidianBackend.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/qdrant.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/reindex.ts",["41369"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/retrieval/scoring.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/retrieval.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/schemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/settings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/sqliteBackend.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/store.ts",["41370"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/summarization.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/typedDecay.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/vectorStore.ts",["41371"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/memory/verify.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/middleware/cliTokenAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/middleware/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/middleware/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelAliasResolver.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelAliasSeed.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelCapabilities.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelMetadataRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelsDevSync/transform.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/modelsDevSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/monitoring/comboHealthAutopilot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/monitoring/observability.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/monitoring/providerHealthAutopilot.ts",["41372","41373"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/monitoring/providerHealthMatrix.ts",["41374"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/ngrokTunnel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/notion/api.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/codexDeviceFlow.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/config/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/connectionPersistence.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/constants/oauth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/credentialBlob.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/deviceFlowTickets.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/gitlab.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/kiroConnectionIdentity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/kiroSocialPoll.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/pasteCredentials.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/agy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/antigravity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/claude.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/cline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/codebuddy-cn.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/ghe-copilot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/github.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/gitlab-duo.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/grok-cli-oauth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/grok-cli.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/kilocode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/kimi-coding.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/qoder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/raycast.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/trae.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/windsurf.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/xai-oauth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/zed-hosted.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers/zed.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/providers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/codexImport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/raycast.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/services/raycastLocal.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/agyAuthImport.ts",["41375"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/banner.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/claudeAuthFile.ts",["41376"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/claudeAuthImport.ts",["41377"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/claudeAuthZipExtract.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/cliProxyAuthImport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexAuthFile.ts",["41378"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexAuthImport.ts",["41379"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexAuthZipExtract.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexConnectionSelection.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/codexSessionImport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/googleLoopbackHint.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/grokCliAuthJson.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/jsonZipExtract.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/loopbackTunnel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/pkce.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/pkceLoopbackWarning.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/server.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oauth/utils/ui.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/obsidian/api.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/obsidianSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oneproxyRotator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/oneproxySync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/piiSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/playground/codeExport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/playground/promptImprover.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/playground/streamMetrics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/playground/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/devMode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/doctor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/errors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/hooks.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/loader.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/logger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/manager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/manifest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/marketplace.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/scanner.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/sdk.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/testRunner.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/plugins/watcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/pricingSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/promptCache/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/promptCache/prefixAnalyzer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/cursorAgent.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/geminiModelsParser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/managedAvailableModels.ts",["41380"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/managedModelImport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providerModels/modelDiscovery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/catalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/claudeExtraUsage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/claudeFastMode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/codexConnectionDefaults.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/codexFastTier.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/imageValidation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/managedAvailableModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/modelListingCapability.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/nvidiaValidationModel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/requestDefaults.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/serviceKindIndex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/staticModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/anthropicFormat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/audioMiscProviders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/cloudProviders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/cozeError.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/directChatProbe.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/embeddingProviders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/headers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/metaAi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/openaiFormat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/searchProviders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/specialtyInline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/transport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/urlHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/webCookie.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/webProvidersA.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation/webProvidersB.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/validation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/webCookieAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/thinking.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/translators/claude.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/translators/gemini.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/translators/openai-chat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/providers/xai/translators/openai-responses.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyEgress.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyHealth/decision.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyHealth/scheduler.ts",["41381"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyHealth/statusPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyHealth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyLogger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxyRelay/cloudflareWorkerScript.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/coreEndpoint.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/due.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/fetchGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/fetchRetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/needsCore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/parse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/schema.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/scopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/subscriptionService.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/proxySubscription/url.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/QuotaStore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/accountBuckets.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/burnRate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/connectionProvider.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/connectionRecovery.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/dimensions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/enforce.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/fairShare.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/planRegistry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/planResolver.ts",["41382"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/quotaCombos.ts",["41383"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/quotaKey.ts",["41384"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/quotaModelNaming.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/redisQuotaStore.ts",["41385"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/saturationSignals.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/spendRecorder.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/sqliteQuotaStore.ts",["41386"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/storeFactory.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/quota/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/applyFeed.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/feedSchema.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/pinnedKeys.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/sync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/radar/verify.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/reasoningRouting/input.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/reasoningRouting/policy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/resilience/modelLockoutSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/resilience/settings/normalize.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/resilience/settings/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/resilience/settings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/routerEval/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/runtime/ports.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/search/executeWebSearch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/security/localEndpoints.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/semanticCache.ts",["41387"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/serverLifecycle.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/ServiceSupervisor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/apiKey.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/bootstrap.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/embedPath.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/embedWsProxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/healthCheck.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/htmlRewriter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/bifrost.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/cliproxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/dario.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/mux.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/ninerouter.stub.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/ninerouter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/installers/utils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/modelSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/portProbe.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/providerPlugins/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/providerPlugins/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/quotaAutoPing.ts",["41388"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/reverseProxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/ringBuffer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/serviceBackends.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/services/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/__tests__/integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/a2a.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/builtin/browser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/builtins.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/containerProvider.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/custom.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/executor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/githubCollector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/hybrid.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/injection.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/interception.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/providerSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/registry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/sandbox.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/schemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/skillssh.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/skills/webFetchExecution.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/source.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/spend/batchWriter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/sseTextTransform.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/streamingPiiTransform.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/sync/bundle.ts",["41389"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/sync/tokens.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/system/autoUpdate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/system/globalPackagePath.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/system/versionCheck.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/system/versionCompare.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/tailscaleTunnel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/tokenHealthCheck.ts",["41390"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/tokenHealthCheckCopilot.ts",["41391"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/toolPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/translator/streamTransform.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/translatorEvents.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/accountIdentity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/aggregateHistory.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/apiKeySelfService.ts",["41392"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/apiKeyUsageLimits.ts",["41393"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/cacheHealth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogApiKeyContext.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogArtifacts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogs/format.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/callLogsBoundedQueries.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/codexResetCredits.ts",["41394"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/comboForecast.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/comboHealth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/comboHealthDashboard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/comboScoringInspector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/completedRequestDetails.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/costCalculator.ts",["41395"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/fetcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/flatRateProviders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/internalUsageCommand.ts",["41396"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/migrations.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/pendingRequestScope.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerDisplayNames.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerLimits/chunkedSpacingSync.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerLimits/quotaNormalize.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerLimits.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerLimitsCache.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/providerWindowCosts.ts",["41397"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/resilienceExplain.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/routeExplain.ts",["41398"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/tokenAccounting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/usageEvents.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/usageHistory/helpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/usageHistory.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usage/usageStats.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usageAnalytics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/usageDb.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/binaryManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/healthMonitor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/processManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/versionManager/releaseChecker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vncSession/harvest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vncSession/manifest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vncSession/service.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/familyFirstModelIds.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/modelPresentation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/reasoningMetadata.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/serviceTierVariants.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/vscode/tokenizedRequest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhookDispatcher.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhooks/eventDescriptions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhooks/integrations/discord.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhooks/integrations/slack.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/webhooks/integrations/telegram.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/ws/handshake.ts",["41399"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/confirmedAccounts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/credentialFingerprint.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/dockerDetect.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/importUtils.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/keychain-reader.stub.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/lib/zed-oauth/keychain-reader.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/middleware/promptInjectionGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/aliasConfig.cjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/bypass.cjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/forwardTarget.cjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/ingest.cjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/rootCaShim.cjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/_internal/standaloneRouting.cjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/aliasConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/generate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/install.stub.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/install.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/migration.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/cert/rootCa.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/dataDir.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/antigravity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/claudeCode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/copilot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/openCode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/detection/zed.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/dns/dnsConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/dns/provision.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/antigravity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/base.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/claudeCode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/copilot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/openCode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/trae.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/handlers/zed.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/agentBridgeHook.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/buffer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/contextKey.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/conversationNormalizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/diagnostics.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/httpProxyServer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/kindDetector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/llmMetadataExtractor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/pricing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/processAttribution.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/sseMerger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/systemProxyConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/inspector/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/manager.runtime.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/manager.stub.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/manager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/maskSecrets.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/passthrough.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/privilegedMitmStep.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/repair.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/sanitizeHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/server.cjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/socketTimeouts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/stopDnsTeardown.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/sudoGate.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/systemCommands.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/antigravity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/claudeCode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/codex.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/copilot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/cursor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/ghe-copilot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/kiro.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/openCode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/trae.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/targets/zed.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/caTrust.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/captureManager.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/captureMode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/commands.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/dynamicCert.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/setup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/tlsCapture.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/tproxy/transparentSocket.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/mitm/upstreamTrust.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/models/index.ts",["41400"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/proxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/scripts/backfillAggregation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/auth/loginGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/accessScopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/accessTokenAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/assertAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/classify.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/context.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/csrf.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/headers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/peerStamp.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/pipeline.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/policies/clientApi.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/policies/management.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/policies/public.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/routeGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/authz/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/cors/origins.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/origin/publicOrigin.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/ws/liveServer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/ws/liveServerAllowList.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server/ws/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/server-init.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Avatar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Badge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/BasePathNetworkProvider.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Breadcrumbs.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Button.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Card.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Checkbox.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/CloudSyncStatus.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Collapsible.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/CollapsibleSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ColumnToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/CommandPalette.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ConsoleLogViewer.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/CursorAuthModal.tsx",["41401"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/DataTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/DegradationBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/DistributeProxiesButton.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/DistributeProxiesButton.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/EmptyState.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ErrorPageScaffold.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/FilterBar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Footer.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Header.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/InfoTooltip.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Input.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/KiroAuthModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/KiroOAuthWrapper.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/KiroSocialOAuthModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/LanguageSelector.tsx",["41402"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/LinkifiedText.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Loading.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/LocaleAutoDetect.tsx",[],["41403"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/MaintenanceBanner.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ManualConfigModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Modal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ModelRoutingSection.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ModelSelectField.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ModelSelectModal.tsx",[],["41404"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/MonacoEditor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NavigationProgress.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NoAuthAccountCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NoAuthProviderCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NoAuthProviderToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/NotificationToast.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/OAuthModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/OAuthModalPanels.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/OmniRouteLogo.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/PresetSlider.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/PricingModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProviderCooldownCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProviderIcon.tsx",[],["41405","41406"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProviderTestSlideOver.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProxyConfigModal.tsx",["41407"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProxyLogDetail.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ProxyLogger.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/PwaRegister.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RaycastAuthModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ReasoningRoutingRules.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RequestLoggerDetail.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RequestLoggerV2.tsx",["41408","41409","41410","41411","41412","41413"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RequestTimeline.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/RiskNoticeModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/SegmentedControl.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Select.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Sidebar.search.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Sidebar.tsx",["41414"],["41415"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/SkillsConceptCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/SystemMonitor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Textarea.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ThemeProvider.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/ThemeToggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Toggle.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/TokenHealthBadge.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/Tooltip.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/TraeAuthModal.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/UsageAnalytics.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/UsageStats.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/ApiKeyFilterDropdown.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/CustomRangePicker.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/ModelTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/RequestCountByProviderDateTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/RequestCountDateFilter.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/RequestCountTable.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/TimeRangeSelector.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/chartColors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/charts.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/index.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/modelBreakdownSort.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/rechartsCore.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/rechartsDonuts.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/rechartsUsageCharts.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/requestCountSort.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/analytics/useProviderDailyUsage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/cli/CliComparisonCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/cli/CliConceptCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/cli/CliToolCard.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/cli/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/ComboCompressionModeSelect.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/CompressionPipelineEditor.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/EngineConfigForm.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/EngineConfigPage.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/compression/compressionPipelineModel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/APIReference.stories.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/APIReference.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/Callout.stories.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/Callout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/CodeBlock.stories.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/CodeBlock.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsBreadcrumbs.stories.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsBreadcrumbs.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsSidebar.stories.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsSidebar.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/DocsThemeProvider.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/Tabs.stories.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/Tabs.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/docs/tokens.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/flow/FlowCanvas.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/flow/StatusDot.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/flow/edgeStyles.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/index.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/layouts/AuthLayout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/layouts/DashboardLayout.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/layouts/index.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/lobeProviderIcons.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/logTableStyles.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/modelSelectModalHelpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthBlobSubmit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthModal/GheConfigStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthModal/GitlabDuoSetupStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthModal/OAuthErrorStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/oauthModal/OAuthWaitingStep.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/proxyAssignment.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/proxyAssignment.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/requestLoggerPreferences.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/components/requestLoggerSignature.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/agentSkills.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/alibabaProviderRegions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/antigravityClientProfile.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/apiKeyPolicyScopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/appConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/batch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/batchEndpoints.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/bodySize.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/claudeCodeClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/cliCompatProviders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/cliTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/cliToolsGrokBuild.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/clientIdentityProfiles.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/codexClient.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/colors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/comboConfigMode.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/dashboardCsrf.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/endpointCategories.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/errorCodes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/featureFlagDefinitions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/gitlabDuoSetupMessage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/headers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/homeWidgets.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/managementScopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/mcpScopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/mitmToolHosts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/modal.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/modelCompat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/modelSpecs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/models.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/openRouterPreset.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/default-pricing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/frontier-labs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/inference-hosts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/oauth-subscriptions.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/regional.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing/shared-tiers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/pricing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/enterprise-cloud.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/frontier-labs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/gateways.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/inference-hosts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/regional.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/apikey/specialty-media.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/audio.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/cloud-agent.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/local.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/noauth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/oauth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/search.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/system.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/upstream-proxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers/web-cookie.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/providers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/publicApiRoutes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/quotaAutoPing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/responsesPreviousResponseId.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/routingStrategies.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/selfServiceScopes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/serviceKinds.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/sidebarGroupVisibility.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/sidebarVisibility/sections.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/sidebarVisibility/types.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/sidebarVisibility.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/spawnCapablePrefixes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/statusColors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/upstreamHeaders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/visionBridgeDefaults.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/constants/visionModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/contracts/quota.ts",["41416"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/__tests__/useDisplayBaseUrl.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/cli/useToolBatchStatuses.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/useCopyToClipboard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/useDisplayBaseUrl.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/useElectron.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/hooks/useTheme.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/http/apiErrorMessage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/lib/persistLocale.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/middleware/bodySizeGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/middleware/chatBodyAdmission.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/middleware/correlationId.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/middleware/requireJsonContentType.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/network/outboundUrlGuard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/network/outboundUrlGuardPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/network/remoteImageFetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/network/safeOutboundFetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/platform/windowsProcess.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/providers/webSessionCredentials.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/reasoning/effortStandardization.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/resilience/peerRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/agentBridge.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/cliCatalog.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/inspector.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/memory.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/playground.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/qdrant.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/quota.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/searchTools.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/schemas/validation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/apiKeyResolver.ts",["41417"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/backupService.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/claudeCliConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliInstallFallback.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliRuntime.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliRuntimeGrokBuild.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliRuntimeHealthcheckPath.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cliRuntimeKnownPath.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/cloudSyncScheduler.ts",["41418"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/codexCatalogRevalidation.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/codexDiscoveryPolicy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/droidCustomModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/initializeCloudSync.ts",["41419"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/loginShellPath.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/modelSyncScheduler.ts",["41420"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/opencodeConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/providerLimitsSyncScheduler.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/services/qwenCodeConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/types/cliBatchStatus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/types/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/types/pagination.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/types/utilization.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/a11yAudit.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/api.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/apiAuth.ts",["41421"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/apiKey.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/apiKeyPolicy.ts",["41422"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/apiResponse.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/basePath.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/basePathFetch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/bulkApiKeyParser.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/circuitBreaker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/classify429.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/cliCompat.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/clientApiRouteAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/clineAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/clipboard.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/cloud.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/cn.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/codexBaseUrl.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/codexConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/compatibleProviderId.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/compressionHeaderEcho.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/connectionStatus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/cors.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/costEstimator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/dashboardCsrf.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/envBoolean.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/featureFlags.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/fetchError.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/fetchTimeout.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/formatting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/freeModels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/globPattern.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/grokBilling.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/injectionSeverity.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/inputSanitizer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/linkify.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/logRedaction.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/logger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/machine.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/machineId.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/maskEmail.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/modelCatalogSearch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/noAuthProviders.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/nodeRuntimeSupport.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/numeric.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/parseApiKeys.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerConnectionStatus.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerCredentialRequirement.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerDisplayLabel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerFallbackColor.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerHints.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerModelAliases.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/providerQuotaVisibility.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/rateLimiter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/releaseNotes.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/requestId.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/requestTelemetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/requestTimeout.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/resolveOmniRouteBaseUrl.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/runtimeTimeouts.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/secretsValidator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/secureRandom.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/serviceTierLabels.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/shuffleDeck.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/sidebarExpansionState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/sidebarRouteMatch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/sidebarSearch.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/streamTracker.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/structuredLogger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/testProcess.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/tiktokenCounter.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/turkishText.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/upstreamError.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/utils/wsPath.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/compressionConfigSchemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/freeProxySchemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/helpers.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/oneproxySchemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/providerSchema.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/providerSpecificData.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/apiV1.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/auth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/cli.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/cloud.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/combo.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/evals.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/gemini.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/keys.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/misc.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/payloadRules.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/pricing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/provider.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/proxy.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/reasoningRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/routing.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/settings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas/translator.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/schemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/shared/validation/settingsSchemas.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/autoRouting.ts",["41423"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chat/clientRawRequest.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chat.ts",["41424"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chatAdmission.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chatHelpers.ts",["41425"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/chatPredicates.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/comboFailureLogging.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/reasoningRouting.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/rejectedRequestUsage.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/requestBody.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/handlers/resolveRoutingModel.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/auth.ts",["41426","41427"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/cooldownAwareRetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/googApiKeyAuth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/headerReader.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/imageCredentialRetry.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/model.ts",["41428","41429"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/noAuthProviderSettings.ts",["41430"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/noAuthProviderSiblings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/noAuthProxyResolution.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/requestResourceHealth.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/sessionAffinityPin.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/streamState.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/services/tokenRefresh.ts",["41431"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/utils/backpressure.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/sse/utils/logger.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/store/emailPrivacyStore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/store/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/store/notificationStore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/store/themeStore.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/databaseSettings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/global.d.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/index.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/provider.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/types/sqljs.d.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_cp_mock_hook.mts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_cp_mock_module.mts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_helpers/readSrc.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_setup/isolateDataDir.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/_setup/vitestUiPolyfills.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/benchmarks/pipeline-accuracy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/gemini-double-escaping.live.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/gemini-midstream-503-e2e.live.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/gemma4-multiturn.live.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/gemma4-newline-investigation.live.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/boundary/openclaw-omniroute-tool-boundary.live.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/a11y-resilience.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/a11y.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/agent-bridge-traffic-cross.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/agent-bridge.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/agent-skills-page.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/analytics-tabs.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/api-keys-flow.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/api.spec.ts",["41432","41433","41434"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/combo-live-studio.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/combo-unification.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/combos-flow.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/compression-studio.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/ecosystem.test.ts",["41435","41436","41437","41438","41439","41440","41441","41442","41443","41444","41445","41446","41447","41448","41449","41450","41451"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/error-pages.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/group-b-activity-feed.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/group-b-quota-plans-config.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/group-b-quota-share-pools.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/group-b-redirect-logs-activity.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/helpers/dashboardAuth.ts",["41452","41453"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/helpers/mockUpstreamServer.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/memory-engine.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/memory-qdrant-routes.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/memory-settings.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/navigation.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/playground-compare.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/playground-studio.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/protocol-clients.test.ts",["41454","41455","41456","41457","41458","41459"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/protocol-visibility.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/providers-bailian-coding-plan.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/providers-management.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/proxy-registry.smoke.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/resilience-plan-alignment.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/responsive.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/responsiveSpecs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/search-tools-studio.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/settings-toggles.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/skills-marketplace.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/smoke.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/system-failover.test.ts",["41460","41461"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/traffic-inspector.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/translator-friendly.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/e2e/visual-resilience-smoke.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/compression/session-dedup-memory-7849.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/devin-bridge/e2e-workspace/.claude/hooks/log-tool.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/devin-bridge/e2e-workspace/math.js",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/devin-bridge/e2e-workspace/math.test.js",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/sanitizerFixtures.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/fixtures/welcome-banner-plugin/index.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/golden-set/compression-caveman-v2.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/golden-set/compression-quality.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/golden-set/compression-savings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/golden-set/compression-upstream-parity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/fakeUpstreamStream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/faultyUpstream.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/goldenSnapshot.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/managementSession.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/persistence/comboRepositoryConformance.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/propertyConfig.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/helpers/translationFixtures.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/homolog/ui/api-key-flow.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/homolog/ui/auth.setup.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/homolog/ui/playwright.config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/homolog/ui/routes.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/_chatPipelineCallLogs.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/_chatPipelineHarness.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/_comboRoutingHarness.ts",["41462","41463","41464"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/active-request-completion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-bridge-bypass-flow.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-bridge-cert-flow.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-bridge-mappings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-bridge-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-skills-content.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/agent-skills-discovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/aihorde-load-test.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/all-statuses-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/antigravity-projectid-discovery-persist-8491.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/api-keys.test.ts",["41465","41466","41467","41468","41469","41470","41471","41472","41473","41474","41475","41476","41477","41478","41479","41480","41481","41482","41483","41484","41485","41486","41487"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/api-routes-critical.test.ts",["41488","41489","41490","41491","41492","41493","41494","41495","41496","41497","41498","41499","41500","41501","41502","41503","41504","41505","41506","41507","41508","41509","41510","41511","41512","41513","41514","41515","41516","41517","41518","41519","41520","41521","41522","41523","41524","41525","41526"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/audit-log-level-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/batch-e2e-rate-limit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/batch-processor-escaping.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/chat-pipeline.test.ts",["41527","41528","41529","41530","41531","41532","41533","41534","41535","41536","41537","41538","41539","41540","41541","41542","41543","41544","41545","41546"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/chatcore-compression-integration.test.ts",["41547","41548","41549","41550","41551","41552","41553","41554","41555"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/chatcore-context-window-boundary.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-codewhale.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-deepseek-tui.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-forge.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-grok-build.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-jcode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-letta.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-omp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-pi.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cli-settings-smelt.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/codex-chat-reasoning-http-e2e.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-failover-e2e.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-live/_liveHarness.ts",["41556","41557","41558","41559","41560","41561","41562","41563","41564","41565"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-live/auto.live.test.ts",["41566","41567","41568","41569","41570","41571","41572","41573","41574","41575","41576","41577","41578","41579","41580","41581","41582","41583","41584","41585","41586","41587"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-live/cost-and-fusion.live.test.ts",["41588","41589","41590","41591","41592","41593","41594","41595","41596","41597","41598","41599","41600","41601","41602","41603","41604","41605","41606","41607","41608","41609","41610","41611","41612","41613","41614","41615","41616"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-live/ordered.live.test.ts",["41617","41618","41619","41620"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/auto.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/context-relay-codex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/context-relay-handoff.test.ts",["41621","41622"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/cost-and-context.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/fusion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/ordered.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/quota-aware.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/quota-share.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-matrix/weighted.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-provider-exhaustion.test.ts",["41623","41624","41625","41626","41627","41628","41629","41630","41631","41632","41633","41634","41635","41636","41637","41638","41639","41640","41641"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/combo-routing-e2e.test.ts",["41642","41643","41644","41645","41646","41647","41648"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/compression-pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/cursor-e2e.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/files-api.test.ts",["41649"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/fingerprint-expansion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/free-models-benchmark.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/free-models-tpm-stress.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/freeModelBenchmarkShared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-combo-cooldown-wait.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-large-context-tpm.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-live-429-classification.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-malformed-function-call-stream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-rate-limit-classification.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/gemini-tool-call-escaping.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/heap-growth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/historical-tool-call-leak.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/integration-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-gemini-agentic-loop.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-gemini-nonstream.test.ts",["41650"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-gemini-workload.test.ts",["41651"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-gemini.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/live-ws-startup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/liveGeminiShared.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/llama-cpp-provider.test.ts",["41652","41653","41654","41655"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/manifest-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-embedding-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-engine-status.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-pipeline.test.ts",["41656"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-reindex.test.ts",["41657"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-retrieve-preview.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-route-put.test.ts",["41658"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/memory-summarize.test.ts",["41659"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/mimocode-proxy.integration.test.ts",["41660","41661","41662","41663","41664","41665","41666","41667","41668","41669","41670","41671","41672"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/modelsDevSync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/monitoring-health-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/newly-enabled-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/obsidian-plugin-e2e.test.ts",["41673","41674","41675","41676","41677","41678","41679","41680","41681","41682","41683","41684"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/performance-regression.test.ts",["41685"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/pipeline-combo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/playground-improve-prompt.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/playground-presets-crud.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/playground-presets-zod.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/plugins-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/presets-dashboard-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/provider-journey.contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/proxy-context-passthrough.test.ts",["41686","41687","41688","41689","41690","41691","41692","41693","41694"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/proxy-pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/proxy-registry-flow.test.ts",["41695","41696","41697","41698","41699","41700","41701","41702","41703"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/qdrant-routes.test.ts",["41704","41705","41706","41707","41708","41709","41710","41711","41712","41713","41714","41715","41716","41717","41718","41719","41720","41721","41722"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-plans-crud.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-pool-usage-provider-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-pools-crud.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-pools-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-preview.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-routes-error-sanitization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/quota-store-settings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/reasoning-routing-pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/resilience-chaos.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/resilience-http-e2e.test.ts",["41723","41724","41725"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/search-providers-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/security-hardening.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/services/cliproxy-coexistence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/services/full-lifecycle.int.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/services/route-guard-services.int.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/skills-pipeline.test.ts",["41726","41727","41728","41729","41730","41731","41732","41733","41734","41735","41736","41737","41738","41739"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/sse-correctness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/stream-recovery-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/test-model-compression-off-6240.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-capture-modes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-error-sanitization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-hosts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-internal-ingest.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-localonly.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-requests.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-session-requests.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-sessions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/traffic-inspector-ws.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/integration/v1-contracts-behavior.test.ts",["41740","41741","41742","41743","41744","41745","41746","41747","41748","41749"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/live/deepseek-web-live.test.ts",["41750","41751"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/load/k6-soak.js",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/load/proxy-load.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/scratch_test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/theoldllm-stress.test.ts",["41752","41753","41754","41755","41756","41757","41758","41759","41760","41761"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/translator/testFromFile.ts",["41762","41763","41764"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/7993-noauth-proxy-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8134-github-t5-fallback-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8169-lite-word-boundary-truncation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8189-classifier-compat-auto-narrow.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8200-perplexity-web-401-cooldown.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8200-perplexity-web-cookie-rotation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8231-gemini-civic-integrity-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8247-accountfallback-model-unhealthy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8248-accountfallback-nvidia-degraded.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8295-namespace-leaf-collision.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8326-compatible-id-regex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8327-models-owned-by-prefix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8328-topology-custom-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8331-usage-buffer-inflation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8332-combo-vision-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8336-audit-loopback-login.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8350-hermes-oauth-usage-400.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8368-image-token-context.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8370-priority-affinity-reorder.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8374-plugins-status-optional.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8376-econnrefused-breaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8385-perkey-proxy-global-toggle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8388-compression-detail-persist.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8395-plugin-hooks-fire.test.ts",[],["41765"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8396-cooldown-429-cap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8431-multiwindow-quota-eviction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8488-capability-filter-fail-closed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8510-adobe-firefly-edits-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8560-responses-image-compaction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8594-compress-image-token-stringify.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8676-monsterapi-deprecation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8958-alias-backed-node-prefix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/8989-perplexity-catalog-mode-repro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9232-purge-proxy-assignments-on-delete.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9474-claude-code-oauth-mismap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9536-usage-misreporting-openai-to-claude.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9545-gpt56-reasoning-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9551-proxyfetch-no-proxy-context-bypass.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9560-turbopack-nft-lazy-module-fs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/9568-gemini-tool-casing-mismatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/AutoComboCatalog.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/SkillsConceptCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/_fixtures/tsx-runtime-modern-syntax.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/_mitmHandlerHarness.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/_mocks/settings.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/a2a-auth-timing-safe.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/a2a-cost-analysis-numeric-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/a2a-enabled-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/a2a-routing-logger.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/access-scopes-infer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/access-token-scopes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/access-tokens-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-concurrency-cap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-anthropic-quota.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-cf1010-no-retry-8775.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-lockout-eviction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-retry-after-json.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-route-restriction-403.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-fallback-service.test.ts",["41766"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/account-selector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/accountSemaphore.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/accountfallback-ratelimit-400-4976.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/acp-agents-route.test.ts",["41767","41768"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/acp-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/active-request-stream-chunks-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-controller.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-cost.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-domain.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-features.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-queue.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-route-matrix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adaptive-admission-runtime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/admin-audit-events.test.ts",["41769","41770","41771","41772","41773","41774","41775","41776","41777","41778","41779"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adobe-firefly-browser-login.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adobe-firefly-jwt-redos-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adobe-firefly.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/advanced-fase07-09.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/adversarialPii.test.ts",["41780","41781"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-cert-install-fallback-4546.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-cert-route-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-cert-trust-sudo-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-config-portability.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-detected-models-8656.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-params-7271.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-per-agent-8466.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-route-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-sudo-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-dns-toggle-method-7157.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-maintenance-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-mappings-sync-8656.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-repair-route-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-repair-sudo-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-server-route-dynamic-import.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-state-full-payload-8656.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-state-normalize-3318.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-bridge-targets-serializable.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-card-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-goal-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agent-skills-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkillTools-mcp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-cliRegistryParser.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-generator.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-openapiParser.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentSkills-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentbridge-antigravity-cert-hosts-6494.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentbridge-mitm-router-key-6403.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-cc-wire-image.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-chatcore-protocols.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-executor-protocols.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-live-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-models-discovery-7016.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agentrouter-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agnes-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-auth-import.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-gemini-3696-tier-passthrough.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-gemini-400-3229.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-pro-fallback-chain-3786.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-projectid-ui.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/agy-usage-quota.test.ts",["41782","41783","41784","41785"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/aihorde-tools-unsupported-provider-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/airforce-v1-double-prefix-5899.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/alibaba-image-media.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/alibaba-provider-regions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/alibaba-video-media.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/alternate-formats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-cache-fingerprint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-compat-validation-v1-messages.test.ts",["41786","41787","41788"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-header-dedupe-1475.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-official-baseurl-host.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-stream-thinking-close-marker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-thinking-signature-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/anthropic-toolcall-args-6459.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-429-quota-cooldown.test.ts",["41789","41790"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-429-quota-tdd.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-claude-prefill-strip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-client-identity-paths.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-client-profile.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-credits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-discovery-bootstrap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-executor-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-finish-reason-normalization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-format-detection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-image-catalog-separation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-local-usage-fallback-3821.test.ts",["41791","41792","41793","41794"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-missing-project-chat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-mitm-model-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-model-aliases.test.ts",["41795","41796","41797"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-native-toolcall-collect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-oauth-client-profile.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-oauth-no-pkce-no-openid.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-oauth-postexchange-nonblocking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-orphan-toolresult-6026.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-orphan-tooluse-7752.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-prefer-stored-project.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-projectid.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-quota-skipping.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-refresh-empty-token-3850.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-retired-public-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-retry-hook.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-safetysettings-5003.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-server-side-tools-6914.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-sse-collect-socket-release-4309.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-streaming-error-body-sanitized-2461.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-streaming-passthrough.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-strip-builtin-tools-funcdecls-1095.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-strip-output-config-1944.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-strip-thinking-fields-1926.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-tool-cloak-server-side-invocations.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-tool-cloaking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-usage-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-usage-service.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-version.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/antigravity-weekly-quota-4017.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/api-catchall-json-404.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/authz-inventory.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/auto-combo-candidates-route-7819.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/cli-tools/detect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/combo-002-first-field.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/combo-error-response.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression/compression-api.test.ts",[],["41798"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression/rtk-learn-discover-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression/rtk-toml-import-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression-engines-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression-preview-caveman-and-stacked-6425.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/compression-preview-engine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/context-analytics-engine-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/context-combos-default-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/discovery-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/free-proxies-list-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/free-proxies-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/providers-import-route-6836.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/proxies-repair-relay.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/root-catchall-json-404.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/server-error-message.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/services/9router-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/services/9router-provider-expose.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/services/9router-status-reveal.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/services/cliproxy-provider-expose.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/settings-audit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/sync-models-readiness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/bifrost-cooldown.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/bifrost-sidecar.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/provider-plugin-manifest-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/relay-routing-backend.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1/relay-stream-finalizer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1-catchall-json-404.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/v1-me-status-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/validated-json-body.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api/webhooks/webhook-url-ssrf-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-docs-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-error-message-5340.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-mask-fix.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-provider-quota-bypass-scope.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-regeneration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-reveal-route.test.ts",["41799","41800","41801","41802","41803","41804","41805","41806"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-rotator-health.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-scope-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-self-service.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-usage-limits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-key-utils-public-surface.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-keys-create-no-hang-6570.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-malformed-json-400.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-filters.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-key-visibility.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-mask-key-passthrough.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-page-static.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-quota-keys-section.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-scope-preservation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-manager-usage-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-models-hide-paid-6328.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-parse-response.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/api-routes-lib.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikey-connection-health-check.test.ts",["41807"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikey-policy-default-rate-limits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeypolicy-disable-non-public.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeypolicy-quota-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-allowed-quotas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-disable-non-public.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-model-permissions-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-row-parsers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apikeys-usage-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/appearance-widget-settings-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/apply-executor-proxy-info-5217.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/approvalGate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/arena-cookie-validation-redirect-7542.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/arena-elo-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-provider-nodes-selection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-speech-fishaudio.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-speech-handler.test.ts",["41808","41809","41810","41811","41812","41813","41814","41815","41816"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-transcription-handler.test.ts",["41817","41818","41819","41820","41821","41822","41823","41824","41825"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-transcription-openrouter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-transcriptions-combo-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audio-translations-route.test.ts",["41826","41827","41828","41829","41830","41831"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-activity-icons.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-allowlist-real-actions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-eventtype-i18n.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-high-level-actions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/audit-timeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auggie-executor.test.ts",["41832","41833","41834","41835","41836","41837","41838","41839","41840"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auggie-win32-spawn-6304.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth/loginGuard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-antigravity-account-retry-v2.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-clear-account-error.test.ts",["41841","41842","41843","41844","41845"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-clear-provider-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-disable-cooling-2997.test.ts",["41846","41847","41848","41849","41850","41851","41852","41853","41854","41855","41856"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-extract-api-key.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-login-route.test.ts",["41857"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-noauth-fallback-loop-3061.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-ollama-cloud-per-model-403-3027.test.ts",["41858","41859","41860","41861","41862","41863","41864","41865","41866","41867","41868"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-opencode-zen-noauth-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-policy-embeddings-webfetch-7785.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-redirect-login.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auth-terminal-status.test.ts",["41869","41870","41871","41872","41873","41874","41875","41876","41877","41878","41879","41880","41881","41882","41883"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/classify.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/client-api-policy-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/client-api-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/csrf.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/discovery-routes-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/ip-filter-enforcement-6131.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/management-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/probe-9033-repro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/proxy-contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/public-origin.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/public-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/route-guard-local-prefix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/route-guard-skills-collect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/route-guard-version-get-exemption.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/route-guard-vnc-session-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/routeGuard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/authz/spawn-capable-prefixes-client-safe.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-candidate-overrides-7819.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-candidate-overrides-regression-7819.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-candidate-pool-filter-7819.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-budget-fallback-3470.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-codex-responses-3509.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-context-advertising.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-credentialed-model-pool.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-engine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-hidden-models-4558.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-request-controls-6024.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combo-scoring-clamp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combos-enhanced-4235.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combos-free-models-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-combos-suffixes-4235.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-custom-provider-5873.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-empty-pool-fastfail-6458.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-family-classification-8866.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-routing-settings-resolve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-update-mode-detection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-update-runtime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/auto-update.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/free-alias-intelligence-8601.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/paid-model-filter-6512.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/paid-tier-auto-id-6328.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/provider-family-combos.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/static-table-longest-match-8603.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/suffixComposition-4517.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoCombo/tieredRotation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoPrefix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autocombo-unification.test.ts",["41884"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autostart-cli-shorthand-3331.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/autoupdate-npm-win32-5542.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/azure-openai-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/azureAiMultiModelTest.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/background-task-detector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/backpressure.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bai-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/baidu-qianfan-website-urls-6271.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-coding-plan-media.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-coding-plan-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-quota-fetcher.test.ts",["41885","41886","41887","41888","41889","41890","41891","41892","41893","41894","41895","41896","41897","41898","41899","41900","41901","41902","41903","41904","41905"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-schema-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bailian-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/balance-e2e-shards.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bare-model-autopick.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-executor-buildheaders-extra-keys-8493.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-executor-sanitize-effort.test.ts",["41906","41907","41908","41909","41910","41911","41912","41913","41914","41915","41916","41917","41918","41919","41920","41921","41922","41923","41924","41925","41926","41927","41928","41929","41930","41931","41932","41933","41934","41935","41936","41937","41938","41939","41940","41941","41942","41943","41944","41945","41946","41947","41948","41949","41950","41951","41952","41953"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-executor-waf-retry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-headers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-reasoning-effort-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/base-thinking-budget-config-5312.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-a-domain.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-b-final.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-deletion-route-logic.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-deletion.test.ts",["41954"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-file-download.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-list-limit-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-maybe-throttle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-processor-expiration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-processor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-status-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch-status-logic.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch_api.test.ts",["41955","41956","41957","41958","41959","41960","41961"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batch_results.test.ts",["41962","41963"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/batches-f9-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bazaarlink-provider-integrity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bedrock-image-log-redaction-7297.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bin-omniroute-mcp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/binary-manager-extract-zip-5590.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/binaryManager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/blackbox-web-validated-token.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/blackbox-web.test.ts",["41964","41965","41966","41967","41968","41969","41970","41971","41972","41973"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/blackbox.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/body-read-timeout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/body-size-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/body-timeout-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bootstrap-env.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/browser-pool-optional-import.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/browserBackedChat-matcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/browserPool-proxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/budget-route-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/budget-schema-empty-limits-3537.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bug-7940-gemini-retrydelay.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bug-8020-codex-peek-body-timeout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bug-8029-promptql-issuer-substring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/allowlist-helper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/assemble-standalone.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/backend-only-smoke-workflows.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-bundle-size.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-circular-deps.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-codeql-ratchet.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-cognitive-complexity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-complexity-rule-count.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-complexity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-dashboard-typecheck.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-dead-code.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-licenses.test.ts",["41974","41975","41976","41977","41978"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-lockfile.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-mutation-ratchet.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-mutation-test-coverage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-openapi-breaking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-pr-evidence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-secrets.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-test-runner-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-tracked-artifacts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-type-coverage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-vuln-ratchet.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/check-workflows.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/docker-next-channel-8576.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/electron-release-latest-yml.repro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/mcp-bundle-no-eager-ioredis.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/mitm-server-bundle-contents.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/mutation-radiography.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/opencode-plugin-esm-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/optional-transformers-dependency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/resolve-npm-entry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/should-promote-latest-5301.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build/sync-changelog-i18n.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build-bundler-default-turbopack.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build-next-isolated-windows-home-2402.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/build-next-isolated.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/buildCurl.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulk-add-keys-no-overwrite-2587.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulk-api-key-parser-cloudflare.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulk-paste-api-keys.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulk-web-session-import.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bulkApiKeyParser.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bypass-handler.test.ts",["41979","41980"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bypass-response-claude-merge.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/bytez-validation-5422.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-config-route-8219.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-control-claude-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-control-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-metrics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cache-sweeps.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-cap.test.ts",["41981","41982","41983","41984","41985","41986","41987","41988","41989","41990","41991","41992","41993","41994","41995","41996","41997","41998","41999","42000","42001","42002","42003","42004","42005","42006","42007","42008","42009","42010","42011","42012","42013","42014","42015","42016","42017","42018","42019","42020","42021","42022","42023"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-detailed-tokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-file-rotation.test.ts",["42024","42025","42026","42027","42028"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-oom-unbounded-5618.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-provider-display.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-startup.test.ts",["42029"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-stream-debug.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-log-trim-sql-vars-5217.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-correlation-sort.test.ts",["42030","42031","42032"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-correlation-substring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-pagination.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-requested-model.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/call-logs-session-tag.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/calllogs-format-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cap-thinking-budget-gemini-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/capture-critical-db-state.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/card-hover-visible.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/case-collision-6584.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-helpers-extraction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-hide-auto-no-think.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-order-contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-order-helper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-pricing-lookup-index-8697.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-pricing-surface-8018.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-synced-static-preservation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-updates-v3829-kimi-qwen.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/catalog-updates-v3x.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/caveman-packs-de-fr-ja.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/caveman-packs-zh-wenyan.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-bridge-openai-image-7777.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-bridge-tool-pair-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-bridge-transforms.test.ts",["42033","42034","42035","42036","42037","42038","42039","42040","42041","42042","42043","42044","42045","42046","42047","42048","42049","42050","42051","42052","42053","42054","42055","42056","42057","42058","42059","42060","42061","42062","42063"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-compatible-model-catalog.test.ts",["42064","42065"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-compatible-provider.test.ts",["42066","42067","42068","42069","42070","42071","42072","42073","42074","42075","42076","42077","42078","42079","42080","42081","42082","42083","42084","42085","42086","42087","42088","42089","42090","42091","42092","42093","42094","42095","42096","42097","42098","42099","42100","42101","42102"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-alias-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-alias-resolve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-alias-strip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-aliases-append.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-aliases-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-aliases-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cc-discovery-metrics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ccr-durable-store-9061.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ccr-protocol-instruction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/changelog-fragments.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chaos-api-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chaos-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chaos-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/charm-hyper-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-adaptive-admission-binding.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-admission-wrapper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-auth-log-redaction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-body-admission.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-build-client-raw-request.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-combo-live-test.test.ts",["42103","42104","42105","42106","42107","42108"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-completions-parse-once-7847.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-completions-route-shape-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-content-type-6414.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-context-relay.test.ts",["42109","42110","42111","42112","42113","42114","42115","42116","42117","42118"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-cooldown-aware-retry.test.ts",["42119","42120","42121","42122","42123","42124","42125","42126","42127","42128"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-core-intercept-fetch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-early-schema-validation-6412.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-helpers.test.ts",["42129","42130","42131","42132","42133","42134","42135","42136","42137","42138","42139","42140","42141"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-messages-validation-6402.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-non-string-model-6407.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-openai-compat-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-rate-limit-body-lock.test.ts",["42142","42143"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-rejects-image-only-model.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-request-body-parse-once-4380.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-route-coverage.test.ts",["42144","42145","42146","42147","42148","42149","42150","42151","42152","42153","42154","42155","42156","42157","42158"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-route-edge-cases.test.ts",["42159","42160","42161","42162"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chat-safetynet-reqid-6097.test.ts",["42163","42164"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-attempt-logging.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-background-redirect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-cache-usage-meta.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-caveman-output-analytics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-claude-effort-variant.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-claude-upstream-messages.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-client-usage-buffer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-codex-quota.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-combo-context-limit-8378.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-combo-context-override-rescue.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-analytics-write.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-cache-stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-combo-predicates.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-integration.test.ts",["42165","42166","42167","42168"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-settings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-compression-usage-receipt.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-context-editing-telemetry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-context-estimation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-execution-credentials.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-executor-client-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-executor-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-executor-proxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-extracted-modules-3821.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-failure-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-gamification-event.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-imports-cleanly.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-json-body-to-sse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-key-health.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-log-truncation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-memory-extraction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-memory-pressure.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-memory-skills-injection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-model-output-cap-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-non-streaming-response-body.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-non-streaming-response-parse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-non-streaming-sse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-non-streaming-usage-stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-nonstreaming-json-response.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-nonstreaming-response-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-output-style-telemetry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-passthrough-tool-names.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-plugin-onrequest.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-plugin-onresponse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-postcall-guardrail-context.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-quota-share-consumption.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-request-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-request-setup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-sanitization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-semantic-cache-store.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-semantic-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-service-tier.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-skills-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-stage-trace.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-stream-error-result.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-stream-finalize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-cache-store.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-cost.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-quota-share.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-response-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-streaming-usage-stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-strip-stale-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-target-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-telemetry-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-tool-calling-required-check.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-translation-paths.test.ts",["42169","42170","42171","42172","42173","42174","42175","42176","42177","42178","42179","42180","42181","42182","42183","42184","42185","42186","42187","42188","42189","42190","42191","42192","42193","42194","42195","42196","42197","42198","42199","42200","42201","42202"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-unsupported-params-strip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-upstream-body.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-upstream-execute-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatcore-upstream-timeouts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-image-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-async-image-ws-shapes-7357.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-citations-escape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-citations.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-handoff-resume.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-image-silentdrop.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-models-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-sha3-boringssl-5531.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web-tools-5240.test.ts",["42203","42204","42205","42206","42207","42208"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chatgpt-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cheaperinference-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cheaperinference-image-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cheaperinference-provider-registration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-changelog-integrity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-cognitive-complexity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-complexity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-db-rules-classification.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-db-rules.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-dead-code.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-deps.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-docs-counts-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-docs-symbols.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-duplication.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-env-doc-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-error-helper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-fabricated-docs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-fetch-targets.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-file-size.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-install-upgrade-convergence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-known-symbols.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-migration-numbering.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-openapi-breaking-ratchet.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-openapi-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-pack-boot.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-pr-evidence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-provider-consistency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-public-creds.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-route-guard-membership.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-rtl-ratchet.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-test-discovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-test-masking-selfref-6634.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-test-masking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-tool-config-status.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/check-type-coverage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chenzk-provider-2437.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chipotle-executor.test.ts",["42209","42210","42211"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/chutes-registry-baseurl-7621.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-abort-provider-trip-7907.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-client-abort.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-failure-kind.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-registry-cap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/circuit-breaker-stream-controller-4602.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/classify-pr-changes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/classify429.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-adaptive-sampling-params.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-adaptive-thinking-normalize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-atu-effort-leak-9505.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-beta-client-header-3415.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-beta-flags-2454.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-cache-control-passthrough.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-classifier-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-cli-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-cli-defaults.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-compatible-helpers.test.ts",["42212","42213"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-compatible-request.test.ts",["42214","42215","42216","42217","42218","42219","42220","42221","42222","42223","42224","42225","42226","42227","42228","42229","42230","42231","42232","42233","42234","42235","42236","42237","42238","42239","42240"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-meta-requests.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-obfuscation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-parity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-rendering-fixes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-code-tool-remapper-flag-leak.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-codex-identity-version-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-context-1m-client-beta-forward.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-context-1m-supported-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-effort-suffix-strip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-effort-variants.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-empty-stream-error-3685.test.ts",["42241","42242","42243","42244"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-extra-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-fast-mode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-gemini-thought-signature-8979.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-haiku-no-adaptive-thinking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-helper-minimax-output-config.test.ts",["42245","42246","42247"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-identity-version-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-import-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-native-passthrough-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-oauth-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-oauth-tool-cloak.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-oauth-usage-429-backoff.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-oauth-vps-endpoints.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-passthrough-stream-boolean.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-passthrough-thinking-2454.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-prepare-request-preserve-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-profile-auto-sync-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-server-tool-name-preserve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-stream-reconstructed-body.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-thinking-tool-choice-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-to-gemini-budget-tokens-zero-6813.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-to-openai-image-toolresult.test.ts",["42248","42249","42250","42251","42252","42253","42254","42255"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-to-openai-system-role-6954.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-to-openai-think-close-5123.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-tool-result-pairing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-tool-search-beta-3974.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-tool-type-default-2195.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-auto-refresh.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-browser-transport.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-executor-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-live-alignment.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-payload-runtime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-session.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-slow-first-byte.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-sonnet5-registry-6209.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-stream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-transport.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web-turnstile-ua-mismatch-7548.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claude-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claudeAuthFile.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/claudeAuthImport.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cleanup-column-fix.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/alias-resolver-7791.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/autostart-linux.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/autostart-macos-launchctl.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/autostart-windows.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/autostart.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-claude-exe-windows-9454.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-codex-windows-spawn-args.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-codex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/launch-windows-spawn-args.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-aider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-claude.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-cline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-codex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-continue.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-crush.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-cursor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-goose.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-kilo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-opencode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-qwen.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/setup-roo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli/tray.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-a2a-invoke-commands.test.ts",["42256","42257","42258","42259","42260","42261","42262","42263","42264","42265","42266","42267","42268","42269","42270","42271"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-audit-commands.test.ts",["42272","42273","42274","42275","42276","42277","42278","42279","42280","42281","42282","42283","42284","42285","42286"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-auth-export-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-backup-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-batches-commands.test.ts",["42287","42288","42289","42290","42291","42292","42293","42294","42295","42296","42297","42298","42299","42300","42301","42302"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-acpspawnable.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-counts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-display-contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-newentries.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-removed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-catalog-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-chat.test.ts",["42303","42304","42305","42306","42307","42308","42309","42310","42311","42312","42313","42314","42315","42316","42317","42318","42319"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-clipboard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-cloud-commands.test.ts",["42320","42321","42322","42323","42324","42325","42326","42327","42328","42329","42330","42331","42332","42333","42334","42335","42336","42337"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-combo-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-combo-suggest-commands.test.ts",["42338","42339","42340","42341","42342","42343","42344","42345","42346","42347","42348","42349","42350","42351","42352","42353"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-completion-dynamic.test.ts",["42354","42355","42356","42357","42358","42359","42360","42361","42362","42363","42364"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-compression-commands.test.ts",["42365","42366","42367","42368","42369","42370","42371","42372","42373","42374","42375","42376","42377","42378","42379","42380","42381","42382","42383","42384","42385","42386","42387","42388","42389","42390","42391","42392","42393","42394","42395","42396"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-connect-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-context-eng-commands.test.ts",["42397","42398","42399","42400","42401","42402","42403","42404","42405","42406","42407","42408","42409","42410","42411","42412","42413","42414","42415"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-contexts.test.ts",[],["42416","42417"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-cost.test.ts",["42418","42419","42420","42421","42422","42423","42424","42425","42426","42427","42428","42429","42430","42431","42432","42433"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-dashboard-open-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-dashboard-port.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-data-dir-env-loading.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-data-dir-env.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-doctor-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-doctor-liveness-fallback-6162.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-doctor-rooturl-windows-5844.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-electron-to-cli-migration-server-env-7302.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-entrypoint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-environment-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-environment.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-eval-commands.test.ts",["42434","42435","42436","42437","42438","42439","42440","42441","42442","42443","42444","42445","42446","42447","42448","42449","42450","42451","42452","42453","42454","42455"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-exit-codes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-expanded-commands.test.ts",["42456"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-files-commands.test.ts",["42457","42458","42459","42460","42461","42462","42463","42464","42465","42466","42467","42468"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-fingerprints.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-health-monitoring-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper/config-generator.test.ts",["42469","42470"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper/hermes-home-env.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper/tool-detector-win32-7279.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper/tool-detector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-helper-tool-detector-paths-6162.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-i18n-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-io.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-ipv4-first-dns-2699.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-keys-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-lang-commands.test.ts",["42471"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-login-antigravity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-login-push-remote.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-logs-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-machine-token.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-mcp-call-commands.test.ts",["42472","42473","42474","42475","42476","42477","42478","42479","42480","42481","42482","42483","42484","42485","42486","42487"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-memory-commands.test.ts",["42488","42489","42490","42491","42492","42493","42494","42495","42496","42497","42498","42499","42500","42501","42502","42503","42504","42505"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-memory-types.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-memory.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-mitm-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-model-config-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-models-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-nodes-commands.test.ts",["42506","42507","42508","42509","42510","42511","42512","42513","42514","42515","42516","42517","42518","42519","42520","42521","42522","42523","42524"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-oauth-commands.test.ts",["42525","42526","42527","42528","42529","42530","42531","42532","42533","42534","42535","42536","42537","42538","42539","42540","42541","42542"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-oneproxy-commands.test.ts",["42543","42544","42545","42546","42547","42548","42549","42550","42551","42552","42553","42554","42555","42556","42557","42558","42559","42560","42561","42562","42563","42564"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-open-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-openapi-codegen.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-openapi-commands.test.ts",["42565","42566","42567","42568","42569","42570"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-output-render-table.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-output.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-plugin-system.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-policy-commands.test.ts",["42571","42572","42573","42574","42575","42576","42577","42578","42579","42580","42581","42582","42583","42584","42585","42586","42587","42588","42589","42590"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-pricing-commands.test.ts",["42591","42592","42593","42594","42595","42596","42597","42598","42599","42600","42601","42602","42603","42604","42605","42606"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-process-supervisor-spawn-error-8091.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-process-supervisor.test.ts",["42607","42608","42609","42610","42611","42612"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-program.test.ts",["42613","42614","42615","42616"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-providers-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-providers-metrics.test.ts",["42617","42618","42619","42620","42621","42622","42623","42624","42625","42626","42627","42628","42629","42630","42631"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-providers-rotate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-redis-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-remote-mode.test.ts",["42632","42633","42634","42635","42636"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-repl.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-resilience-commands.test.ts",["42637","42638","42639","42640","42641","42642","42643","42644","42645","42646","42647","42648","42649","42650","42651","42652"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime-detection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime-extended.test.ts",["42653"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime-imports-packaged-5227.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime-known-path-shortcircuit-7774.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-runtime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-hostname.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-port.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-readiness-timeout-6321.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-startup-time.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-stop-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-serve-version-banner.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-server-commands.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-sessions-commands.test.ts",["42654","42655","42656","42657","42658","42659","42660","42661","42662","42663","42664","42665"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-setup-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-setup-opencode-nested-alias-7682.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-setup-opencode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-simulate.test.ts",["42666","42667","42668","42669","42670","42671","42672","42673","42674","42675","42676","42677","42678"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-skills-commands.test.ts",["42679","42680","42681","42682","42683","42684","42685","42686","42687","42688","42689","42690","42691","42692","42693","42694","42695","42696","42697","42698","42699","42700"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-spinner.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-sqlite-bindings-not-found-7868.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-sqlite-no-fallback-7586.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-stop-supervisor-respawn-9455.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-storage-key-bootstrap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-storage-key-provision.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-stream.test.ts",["42701","42702","42703","42704","42705","42706","42707","42708","42709","42710","42711","42712","42713"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-sync-commands.test.ts",["42714","42715","42716","42717","42718","42719","42720","42721","42722","42723","42724","42725","42726","42727","42728","42729","42730","42731","42732","42733","42734"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tags-commands.test.ts",["42735","42736","42737","42738","42739","42740","42741","42742","42743","42744","42745","42746","42747","42748","42749","42750","42751"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-telemetry-commands.test.ts",["42752","42753","42754","42755","42756","42757"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tool-detector-imports.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-auth-hardening.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-crush.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-i18n.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-keys-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools-settings-jsonc.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-translator-commands.test.ts",["42758","42759","42760","42761","42762","42763","42764","42765","42766","42767","42768","42769","42770","42771","42772","42773"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tray-systray2.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tray.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-tui.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-update-global-paths-3295.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-update-notifier.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-update-prefer-online-4376.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-update-shadow-install-9475.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-usage.test.ts",["42774","42775","42776","42777","42778","42779","42780","42781","42782","42783","42784","42785","42786","42787","42788","42789","42790"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-version-fastpath.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-waitForServer.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cli-webhooks-commands.test.ts",["42791","42792","42793","42794","42795","42796","42797","42798","42799","42800","42801","42802","42803","42804","42805","42806","42807","42808","42809","42810","42811","42812","42813"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliRuntime-codex-shebang-8036.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliRuntime-symlink-escape-7753.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/client-identity-profiles.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cline-catalog-models-3321.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cline-force-stream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cline-response-envelope.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cline-workos-auth-token-shape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/clinepass-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/clinepass-thinking-budget.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxy-auth-import-1934.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxyapi-dedicated-credential-7645.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxyapi-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxyapi-fallback-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cliproxyapi-model-mapping-dispatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-cors-failclosed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-credentials-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-credentials.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-cursor-4227.test.ts",["42814","42815"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-health-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-agent-tasks-route-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloud-write-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudAgent-types.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-ai-catalog-8717.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-ai-image-parts-6390.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-ai-neuron-exhaustion-6980.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-models-uuid-4259.test.ts",["42816","42817","42818"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflare-worker-upload-content-type-6416.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflaredTunnel-extended.test.ts",["42819","42820","42821"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cloudflaredTunnel.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/code-assist-subscription.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codebuddy-cn-provider.test.ts",["42822","42823","42824"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codebuddy-reasoning-optin.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-auth-import-expiry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-auth-import-userid-dedup-6301.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-banked-reset-credits-5199.test.ts",["42825","42826","42827","42828","42829","42830","42831"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-base-url.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-cache-key.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-capacity-limit-merge.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-catalog-revalidation-runtime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-catalog-revalidation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-compact-strip-include-6805.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-config-hooks-migration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-connection-defaults.test.ts",["42832","42833","42834","42835","42836","42837","42838","42839","42840","42841","42842","42843","42844","42845","42846","42847"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-connection-edit-6562.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-custom-tool-image-output-7698.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-device-flow-tickets.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-device-flow.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-drop-nonstandard-events.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-effort-alias-priority.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-effort-model-echo-3697.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-executor-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-failover.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-fast-tier.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-finalize-tokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-free-plan-image-generation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-gpt55-effort-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-gpt55-routing-5887.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-gpt56-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-import-refresh-validation-7522.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-import-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-import-token-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-manual-refresh-rotating-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-models-catalog-refresh.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-oauth-refresh-persist-6352.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-oauth-remote-host-hint-7523.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-orphaned-tool-outputs-2928.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-peek-nonsse-body-untouched-7536.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-plan-label-2570.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-profile-auto-sync-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-quota-selection-hydration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-quota-sync-no-proactive-refresh.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-reset-credits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-responses-passthrough-strip-3317.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-responses-ws-memory.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-responses-ws-model-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-session-affinity-reset-aware-5903.test.ts",["42848"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-session-json-import-6636.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-spark-image-generation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-sse-capacity-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-sse-peek-body-double-read.test.ts",[],["42849"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-stream-false.test.ts",["42850","42851","42852","42853"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-synced-bare-model-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-system-message-image-8089.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-tool-card-button-state.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-tools-regex-lookaround.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-tools-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-usage-quotas-latent-window.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-usage-quotas-review-window.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-usage-windows.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-verbosity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-ws-http-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codex-ws-policy-enforcement-6564.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexAuthFile.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexAuthImport.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexAuthImportBulk.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexAuthZipExtract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/codexBulkImport.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/collect-metrics-module-coverage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/colocate-optionals.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/auto-quota-cutoff.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/auto-status-penalty-4540.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-context.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-exhausted-skip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-failure-tracker-session-isolation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-failure-tracker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-target-exhaustion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/combo-target-timeout-standards.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/context-requirements-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/effective-max-concurrency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/pin-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/quota-share-concurrency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/recovery-hint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo/strict-context-failopen-8786.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-499-abort.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-account-allowlist-3266.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-antigravity-missing-project-reset-8486.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-apply-strategy-ordering-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-attempt-body-isolation-7847.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-auto-candidate-expansion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-auto-config-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-auto-promote.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-body-specific-400-stop-4279.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-bracket-names.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-breaker-429.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-draft.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-effort-variants-8072.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-eligible-connection-2057.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-fingerprint-expansion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-model-source-5477.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-opencode-prefix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-builder-options-route.test.ts",["42854","42855","42856","42857","42858"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-cache-invalidation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-cleanup-stale-connection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-length.test.ts",["42859","42860"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-prefix-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-relay.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-requirements.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-context-window-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-control-center.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-cooldown-retry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-cost-blending.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-custom-provider-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-description-5005.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-diagnostics-trace.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-disable-session-stickiness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-dispatch-prelude.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-empty-content-failover-5085.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-failure-log-message.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fallback-token-estimate-7847.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fingerprint-expansion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fingerprint-pin-6696.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-flatten-anthropic-tool-messages.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-forecast.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fusion-config-warn-6455.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fusion-strategy-comboref-6764.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-fusion-strategy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-headroom-ranking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-headroom-strategy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-health-dashboard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-health-route.test.ts",["42861","42862","42863"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-hedging.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-hidden-leaf-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-id-resolution-4446.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-input-bound-failure-8375.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-input-bound-heterogeneous-8375.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-least-used-account.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-lockout-quota-reset-6863.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-max-depth-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-model-lockout-honors-reset-1308.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-model-name-collision-8530.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-model-scoped-400-advance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-name-codex-responses-rewrite.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-omnimodel-tag-stripping.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-param-validation-fallback-4519.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-pin-health-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-pipeline-strategy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-prescreen.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-priority-quota-exhaustion-cutoff-5923.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-projection-capabilities-3979.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-provider-cooldown-sibling.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-provider-cooldown.test.ts",["42864","42865","42866"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-provider-diversity-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-provider-wildcard.test.ts",["42867","42868","42869","42870","42871","42872","42873","42874","42875","42876","42877","42878","42879","42880","42881","42882","42883","42884"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-proxy-assignments-parse-7149.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-quality-validator-reasoning.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-quota-share-cooldown-wait.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-quota-soft-penalty.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-resolve-auto-strategy-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-resource-404-health.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-response-validation-failover.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-response-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-responses-sse-failure-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-round-robin-streaming-lock-3811.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-roundrobin-compat-fallback-6238.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-routes-composite-tiers.test.ts",["42885","42886","42887","42888","42889","42890","42891","42892","42893","42894"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-routing-engine.test.ts",["42895","42896","42897","42898","42899","42900","42901","42902","42903","42904","42905","42906","42907","42908","42909","42910","42911","42912","42913","42914","42915","42916","42917","42918","42919","42920","42921","42922","42923","42924","42925","42926","42927","42928","42929","42930","42931","42932","42933","42934","42935","42936","42937","42938","42939","42940","42941","42942","42943","42944","42945","42946","42947","42948","42949","42950","42951","42952","42953","42954","42955","42956","42957","42958","42959","42960","42961","42962","42963","42964","42965","42966","42967","42968","42969","42970","42971","42972","42973","42974","42975","42976","42977","42978","42979","42980","42981","42982","42983","42984","42985","42986","42987","42988","42989","42990","42991","42992","42993","42994","42995","42996","42997","42998","42999","43000","43001","43002","43003","43004","43005","43006","43007","43008","43009","43010","43011","43012","43013","43014","43015","43016","43017","43018","43019","43020","43021","43022","43023","43024","43025","43026","43027","43028","43029","43030","43031","43032","43033","43034","43035","43036","43037","43038","43039","43040","43041","43042","43043","43044","43045","43046","43047","43048","43049","43050","43051","43052","43053","43054","43055","43056","43057","43058","43059","43060","43061","43062","43063","43064","43065","43066","43067","43068","43069","43070","43071","43072","43073","43074","43075","43076","43077","43078","43079","43080","43081","43082","43083","43084","43085","43086","43087","43088","43089","43090","43091","43092","43093","43094","43095","43096","43097","43098","43099","43100","43101","43102","43103","43104","43105","43106","43107","43108","43109","43110","43111","43112","43113","43114","43115","43116","43117","43118","43119","43120","43121","43122","43123","43124","43125","43126","43127","43128","43129","43130","43131","43132","43133","43134","43135","43136","43137","43138","43139","43140","43141","43142","43143","43144","43145","43146","43147","43148","43149","43150","43151","43152","43153","43154","43155","43156","43157","43158","43159","43160","43161"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-rr-fallback-advance-948.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-rr-session-stickiness-3825.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-rr-sticky-9router.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-runtime-unit-concurrency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-same-provider-cascade.test.ts",["43162"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-scope-proxy-dead-7149.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-scoring-inspector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-select-all-batch-8526.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-selected-connection-success.test.ts",[],["43163","43164","43165","43166","43167","43168","43169","43170","43171","43172","43173","43174"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-session-stickiness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-sessionless-pin-3825.test.ts",["43175","43176","43177","43178","43179","43180","43181","43182","43183","43184","43185","43186","43187","43188","43189","43190","43191"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-skip-conn-disable-plugin-block-7806.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-speed-telemetry-6875.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-stickiness-responses-input-7270.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-strategies.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-strategy-fallbacks.test.ts",["43192","43193","43194","43195","43196","43197","43198","43199","43200","43201","43202","43203","43204","43205","43206","43207","43208","43209","43210","43211","43212","43213","43214","43215","43216","43217","43218","43219","43220","43221","43222","43223","43224"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-stream-readiness-fallback.test.ts",["43225","43226","43227","43228","43229","43230","43231","43232","43233","43234","43235","43236","43237","43238","43239","43240","43241"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-streaming-empty-content-failover.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-streaming-openai-no-finish-reason-7285.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-strict-random-distribution-3959.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-target-defensive-modelstr.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-target-resolution-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-target-timeout-runner.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-target-token-limit-8716.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-task-aware.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-test-health.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-test-route.test.ts",["43242","43243","43244","43245","43246","43247","43248","43249","43250","43251"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-thinking-disabled-fable5-3554.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combo-vision-aware-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/combos-quota-protected.test.ts",["43252","43253","43254","43255"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/comfyui-baseurl-override-6928.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-auth-assist.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-maxtokens-negative-5166.test.ts",["43256","43257","43258"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-mimo-v2-5-safety.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-registry-vision.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-user-array-5166.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/command-code-vision.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/commandClassification.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/completions-body-model-echo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/completions-provider-removed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/completions-text-format-3571.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/complexity-aware-scoring-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/complexity-router.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compliance-audit-route.test.ts",["43259"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compliance-index.test.ts",["43260","43261","43262","43263","43264"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compliance-noLog-cycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compose-redis-loopback-bind.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/composer-tool-calls.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/composite-tiers-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/active-combo-dispatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/active-combo-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-chatcore-source-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-compute-target.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-context-budget-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-panel-target.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-resolve-plan.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/adaptive-select-plan-wiring.test.ts",["43265","43266","43267"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/aggressive-fidelity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/aggressive.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/applycompression-bailout-optin.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/bailout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/benchmark.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/body-adapter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/cache-aware-preserve-mode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/cachingAware.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-dedup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-engine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-hedging.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-preservation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-rules.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-structural.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/caveman-v379.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/cavemanSharedBoundaries.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-cross-tenant.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-eviction-scope-9146.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-marker-retrieve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-mcp-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-mcp-principal-5649.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-non-mcp-full-prompt-loss-7746.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-retrieval-ramp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccr-skip-tool-outputs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccrQuery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ccrRanged.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/codestripper-lazy-ts-7096.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/codex-responses.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/combos-engine-ui-schema-parity-4955.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compareRoute.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-aggressive.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-benchmark-cli.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-budget-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-combos-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-engines-map-migration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-header-dispatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-preview-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-preview-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-registry-clear.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-step-streaming.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compression-tool-cardinality-env.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compressionAnalytics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compressionAnnotation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compressionChannel.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/compressionMcpTools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/context-compression-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/context-editing-telemetry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/context-editing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/db.test.ts",["43268","43269","43270","43271","43272","43273","43274","43275","43276","43277","43278","43279","43280","43281","43282","43283"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/derive-default-plan.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/derived-pipeline-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/diffHelper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/encoderComparison.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-breakdown-synthesis.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-enabled-toggle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-guidance-7530.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/engine-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-aggregate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-corpus.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-cost-meter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-grader.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-judge.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-report.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-runner.test.ts",["43284"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-savings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-seed-corpus.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/eval-selftest.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fidelityCheck.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fidelityGate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fidelityGateStacked.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fidelityGateTypes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/fuzzyDedup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/gcf-benchmark.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/gcf-inline-array-quote.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/golden-eval.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/hard-budget.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/harness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/headroom-developer-role-2132.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/headroom-minrows-persist-8056.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/headroom-smartcrusher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/heatmap-build.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/image-aware-tokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ionizerEngine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ionizerGateSkip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ionizerSample.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/language-detect-select.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/language-packs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/lite.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/live-zone.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llm-compressor-engine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-failopen.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-model-store.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-ultra-entry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-worker-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/llmlingua-worker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcp-accessibility-config.test.ts",[],["43285","43286","43287"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcp-description-compressor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcpAccessibility-anchors.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcpAccessibility-clamp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcpAccessibility-config-bounds.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mcpAccessibility.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/mode-and-pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-adapter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-chatcore-plumbing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-import.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-plumbing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-registries.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/omniglyph-single-mode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-apply.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-backcompat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/output-styles-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/outputMode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/pipeline-circuit-breaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/pipeline-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ponytail-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/prefix-freeze.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preservation-redos-4795.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preserve-system-prompt-mode-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preserve-system-prompt-mode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preview-fallback-reasons-6461.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/preview-outer-engine-token-reconcile-6488.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteBreakdown.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteFidelity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteFuzzy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteIonizer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRoutePipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteTokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/previewRouteToon.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/progressiveAging.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/quantumLockDetect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/quantumLockIntegration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/quantumLockStep.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/read-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/relevance-engine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/relevance-scorer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/repro-6479-6491-null-stats-silent-drop.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/repro-6480-noop-guard-misfire.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/resolve-compression-plan.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/responses-orphan-tool-call.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/result-memo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/retrieveRoute.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/retrieveRouteRanged.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/riskGateDetect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/riskGateIntegration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/riskGateStep.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-anthropic-tool-result.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-cache-control-preserve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-code-stripper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-command-detector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-command-samples.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-comments.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-custom-filters.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-deduplicator.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-discover-redos.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-dsl-pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-engine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-file-read-no-truncate-4559.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-filter-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-filter-deduplicate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-filter-loader-resilience.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-filter-redos-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-grouping-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-grouping.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-intensity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-learn.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-line-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-loader-dir-resolution-5089.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-mcp-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-raw-output-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-raw-output.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-render-gitdiff.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-render-table.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-render-terraform.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-render-testgreen.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-renderers-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-smart-truncate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-strip-comments.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-toml-compatibility.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-truncate-preserve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rtk-verify.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/rule-loader.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/session-dedup-intra-message-6467.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/session-dedup-memory-7849.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/session-dedup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/sessionDedupFuzzy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/smartcrusherToon.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/splitCompositeCommand.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/stacked-async.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/stacked-pipeline-engines-fallback-6463.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/strategySelector-cache-aware.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/strategySelector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/summarizer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/toolResultCompressor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/toon.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/types.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ultra-code-preservation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ultra-slm-tier.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/ultra.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression/validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-cache-guard-3955.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-cli-rest-fallback-6571.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-exclusions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-header-echo-6422.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-noop-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-pipeline-inflation-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-pipeline-model.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-run-telemetry-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-settings-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-tokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compression-unknown-engine-validation-6485.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/compute-connection-default-name-6499.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/config-hot-reload.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-cache-override-6880.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-level-upstream-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-model-rules.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-reorder-by-availability.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-row-last-error-visibility.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-row-rtl-margin.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/connection-status-filter-active-2526.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/console-log-levels.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-editing-executor-injection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-editing-relays.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-editing-streaming-telemetry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-handoff.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-manager.test.ts",["43288","43289","43290","43291","43292","43293","43294","43295","43296","43297"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-pinning-tool-calls.test.ts",["43298","43299","43300","43301","43302"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-window-reconcile-persisted-overrides.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/context-window-reconcile.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cooldown-aware-retry-budget.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cooldown-epoch-string-3954.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-agent-antigravity-parity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-codegraph-knowledge.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-free-quota-not-inverted.test.ts",["43303","43304","43305","43306"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-gemini-claude-route-no-responses.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-edu-writeatcursor-6210.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-enterprise-6334.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-enterprise-invocation-7870.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-web-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-web-logging-6210.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-m365-web-silent-empty-7858.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-runOmniRouteCli.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/copilot-web-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/combo.property.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/fakeUpstreamStream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/fixtures.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/goldenSnapshot.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/sanitizers.property.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/sse-parser.property.test.ts",[],["43307","43308"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/translation.golden.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/correctness/translators.property.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cors/origins.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cost-explorer-params.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cost-explorer-utils.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/coze-validation-error-5426.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/credential-health-active-connections-9180.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/credential-health-boot-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/credential-hint-copy-3180-3091.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/credential-masker-guardrail.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/crof-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/crof-usage-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/crof-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/crypto-randomuuid-polyfill.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/csp-lan-ws-5083.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-cli-version.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-exec-router.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-protobuf.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-session.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-system-prompt.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-agent-tool-calls.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-builtin-tool-bridge.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-composer-thinking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-executor-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-image-input.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-model-effort-suffix-7289.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-protobuf-wire-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-registry-claude-families.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-streaming.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-usage-fetcher.test.ts",["43309"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/cursor-version-detector.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-cli-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-endpoint-paths.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-endpoint-system-prompt.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-headers-provider-nodes.test.ts",["43310","43311","43312","43313","43314","43315"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-model-target-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/custom-provider-combo-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dahl-manual-api-key.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dahl-provider-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dahl-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dahl-tokens-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/agentrouter-connection-modal-fields.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/BatchDetailModal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/ExpirationBadge.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/NewBatchWizard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/ProgressBarBicolor.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/UploadFileModal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/components/useBatchActions.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/concept-cards.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/list-regression.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/batch/sanitization.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/context-parent-redirect-5298.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/crypto-randomuuid-polyfill.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/hydration-extension-attrs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/material-icons-self-hosted.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providerPageStorage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/api-key-field.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/auto-start-toggle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/cliproxy-model-mapping.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/cliproxy-tab.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/mux-tab.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/ninerouter-tab.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard/providers/services/page.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard-localization-contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard-shell-tabs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashboard-sidebar-desktop-visible.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashscope-cache-control-openai-2069.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dashscope-text-models-discovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dast-method-not-allowed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/data-dir-writable-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/database-settings-maintenance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/api-keys.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/compressionRunTelemetry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/context-editing-telemetry-record.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/default-combo-toggle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/discovery-results.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/encryption-error-handling.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/migration-071.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/no-migration-collisions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/notion.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/obsidian.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/omp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/per-engine-analytics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/per-engine-breakdown-analytics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/quota-pools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/repositories/sqliteComboRepositories.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/serviceModels.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/stats-virtual-table.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/vacuum-scheduler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db/weak-rng-fixes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/betterSqliteAdapter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/bunSqliteAdapter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/cliSqlite.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/driverFactory.test.ts",[],["43316","43317"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/nodeSqliteShared.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-adapters/sqljsAdapter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-agent-bridge-bypass.test.ts",["43318"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-agent-bridge-mappings.test.ts",["43319"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-agent-bridge-state.test.ts",["43320"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-api-key-groups.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-apiKeys-crud.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-backup-autobackup-setting-5871.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-backup-extended.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-backups-skills-3500.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-call-log-stats-3500.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-case-mapping-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-cleanup-xp-audit-log.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-cleanup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-cli-tool-state.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-combos-crud.test.ts",["43321","43322","43323","43324","43325","43326","43327","43328","43329"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-command-code-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-compression-cache-stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-context-handoffs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-extended.test.ts",["43330","43331","43332","43333","43334"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-init.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-migration.test.ts",["43335","43336","43337","43338","43339","43340","43341"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-native-error.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core-temp-store-pragma.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-core.test.ts",["43342","43343","43344","43345"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-credit-balance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-detailed-logs.test.ts",["43346","43347","43348","43349"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-domainState-crud.test.ts",["43350","43351","43352","43353","43354"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-driver-bundling-externals.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-driver-logs-english-5103.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-encryption.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-gamification-federation-3500.test.ts",["43355"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-health-check.test.ts",["43356","43357","43358","43359","43360","43361","43362","43363","43364","43365","43366","43367","43368","43369","43370","43371","43372","43373","43374","43375","43376","43377","43378","43379","43380","43381","43382","43383","43384"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-health-route.test.ts",["43385","43386","43387","43388","43389","43390","43391"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-import-ebusy-5406.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-import-max-size-4719.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-import-resilient-driver-3025.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-inspector-custom-hosts.test.ts",["43392"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-inspector-sessions.test.ts",["43393"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-logs-cache-3500.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-middleware.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migration-runner-account-identity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migration-runner-extra-dirs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migration-runner.test.ts",["43394","43395","43396","43397","43398","43399","43400","43401","43402","43403","43404","43405"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migration-version-uniqueness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-migrationrunner-constants-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-model-aliases-cascade.test.ts",["43406"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-model-context-overrides.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-models-crud.test.ts",["43407","43408"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-models-extended.test.ts",["43409","43410","43411","43412","43413"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-models-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-playground-presets.test.ts",["43414"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-cookie-dedup-3368.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-daily-usage-4009.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-limits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-plans.test.ts",["43415"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-provider-stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-providers-access-token-1290.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-providers-cross-idp-dedup-2244.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-providers-crud.test.ts",["43416","43417","43418","43419","43420","43421","43422","43423","43424","43425","43426","43427","43428","43429","43430","43431","43432","43433"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-providers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-proxies-crud.test.ts",["43434","43435","43436","43437","43438","43439"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-proxies-family.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-proxies-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-quota-consumption.test.ts",["43440"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-quota-migrations-idempotency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-quota-pools.test.ts",["43441"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-quota-snapshots.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-read-cache.test.ts",["43442"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-registered-keys.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-registeredKeys-crud.test.ts",["43443","43444","43445","43446","43447","43448","43449","43450"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-reset-module-state.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-schema-columns-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-secrets.test.ts",["43451"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-session-account-affinity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-settings-crud.test.ts",["43452","43453","43454","43455","43456","43457","43458","43459","43460","43461","43462","43463","43464","43465","43466","43467","43468","43469","43470","43471"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-settings-extended.test.ts",["43472","43473","43474","43475","43476","43477","43478"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-settings-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-sqljs-close-poison-7494.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-sqljs-preinit-ordering-gap-7288.test.ts",[],["43479"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-state-reset.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-sync-tokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-tier-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-upstreamProxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-usage-analytics-3500.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-usageanalytics-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-versionManager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/db-webhooks.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ddg-circuit-breaker-null-content-6999-7000.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/decrypt-stale-key-hint-6148.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-pow-solver-strict.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-quota-fetcher.test.ts",["43480","43481","43482","43483","43484","43485","43486","43487"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-autorefresh-401-response.test.ts",["43488","43489","43490","43491"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-executor-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-rolling-window-2942.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-session-persistence-2942.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tool-result-prompt-4712.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tools-execute-2820.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tools-execute.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tools-nameless-5154.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web-tools-variants.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deepseek-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/default-reasoning-effort-6879.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/default-url-normalizers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/delete-provider-connection-purges-key-health-7740.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/deno-deploy-relay-path-ssrf.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/derive-discovery-config-5087.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/design-grid-background.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/designer-web-empty-response-502.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dev-ensure-native-sqlite.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dev-origins-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dev-script-heap-limit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/device-tracker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/devin-bridge-live-runtime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/devin-bridge-network-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/devin-cli-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/devin-cloud-agent-validator-6142.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dgrid-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/diagnostics-claude-thinking-5108.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/diagnostics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/digitalocean-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/direct-dispatcher-pipelining-4580.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/discontinued-providers-2026.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/display-and-error-utils.test.ts",["43492","43493","43494","43495"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dns-config-generic.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-base-path-patch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-ensure-base-path.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-healthcheck-3151.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-healthcheck-base-path.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docker-llmlingua-optionals-9166.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dockerfile-base-path-arg.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dockerfile-better-sqlite3-node-gyp-6700.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dockerfile-build-heap-4076.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/dockerignore-docs-coverage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/docs/skillManifestsLint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-branch-hardening.test.ts",["43496"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-cost-rules.test.ts",["43497","43498","43499"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-degradation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-fallback-policy.test.ts",["43500"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-lockout-policy.test.ts",["43501"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/domain-persistence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/droid-custom-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-challenge-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-domain-4037.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-vqd-429-misclassification-6996.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-web-executor.test.ts",["43502","43503","43504","43505","43506","43507","43508","43509"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/duckduckgo-web-model-catalog-8000.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/early-stream-keepalive.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/earlyStreamKeepalive.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/edgetts-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/effort-thinking-standardization-6241.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-main.test.ts",["43510","43511"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-packaging.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-preload.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-processtree.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-rebuild-spawn-win.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-release-desktop-channel-8949.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-remote-server.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-resolve-node-executable-7941.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-resolve-server-entry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/electron-smoke-script.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embed-ws-host-empty-messages-5110.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embedding-family-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embedding-rerank-provider-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-combo-dimensions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-combo-family-reject.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-cost-telemetry-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-flatten-single-row-9089.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-gemini-dimensions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-lan-noauth-6925.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-multimodal-7956.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-nvidia-input-type.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-proxy-forwarding.test.ts",["43512"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/embeddings-route-apikeymeta-6929.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/emergency-fallback-service.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-choices-no-inject.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-content-stopreason-3572.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-response-hardening.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-stream-no-content-8649.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/empty-tool-name-loop.test.ts",["43513","43514","43515","43516","43517","43518","43519","43520"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/encrypted-reasoning-summary-7243.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/encryption.spec.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/endpoint-categories.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/endpoint-restrictions-policy.test.ts",["43521","43522","43523"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/env-docs-input-sanitizer-8093.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-boundary-stack.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-classification.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-classifier.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-message-sanitization.test.ts",["43524","43525","43526","43527","43528","43529","43530","43531","43532","43533","43534","43535","43536","43537","43538","43539","43540","43541","43542"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/error-sensitive-redaction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/errorClassifier-noauth-403-6315.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/errorclassifier-antigravity-403.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/eslint-import-boundaries.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/estimateSizeFast.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/evalrunner-builtinsuites-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/evals-history.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/evals-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/event-bus.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/eviction-guards-apiKeyRotator.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/eviction-guards-codexQuotaFetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/execute-chat-resource-pressure-breaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-adapta-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-agy.test.ts",["43543"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-antigravity-credits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-antigravity-protocol.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-antigravity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-azure-ai-responses.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-base-utils.test.ts",["43544","43545","43546","43547","43548"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-bedrock.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-claude-identity.test.ts",["43549","43550","43551"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-cloudflare-ai.test.ts",["43552","43553","43554","43555"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-codex-gpt56-lite-ultra.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-codex-gpt56.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-codex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-command-code.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-deepseek-web-auto-refresh.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-default-anthropic-auth-8653.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-default-anthropic-compatible-bearer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-default-base.test.ts",["43556","43557","43558","43559","43560","43561","43562","43563","43564","43565","43566","43567","43568","43569","43570","43571","43572","43573","43574","43575","43576","43577","43578","43579","43580","43581","43582","43583","43584","43585","43586","43587","43588","43589","43590","43591","43592","43593","43594","43595","43596","43597"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-default-strip-client-metadata.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-devin-cli-acp-protocol-8406.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-devin-cli-agentic-acp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-devin-cli-agentic-core.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-devin-cli.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-doubao-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-firecrawl-fetch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-github-prefill-sanitize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-github.test.ts",["43598","43599","43600","43601","43602","43603","43604"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-gitlab.test.ts",["43605","43606","43607","43608"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-hailuo-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-huggingchat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-hyperagent.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-inner-ai.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-kimi-web-decoder.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-kimi-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-kimi.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-kiro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-nlpcloud.test.ts",["43609","43610"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-notion-web-thread-sessions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-notion-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-nous-research.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-poe-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-pollinations.test.ts",["43611","43612","43613","43614"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-promptql.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-puter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-qwen-web.test.ts",["43615","43616","43617","43618","43619","43620","43621","43622","43623","43624","43625","43626","43627","43628","43629","43630","43631","43632","43633","43634","43635","43636","43637","43638","43639","43640","43641","43642","43643","43644","43645","43646","43647","43648","43649","43650","43651","43652","43653","43654"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-strip-stainless-openai-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-tinyfish-fetch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-v0-vercel-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-venice-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-vertex-extended.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-web-cookie-sweep.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-xai.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executor-zai-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/executors-strip-unsupported-params.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/export-json-hide-paid-combos-6328.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/factory-provider-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/faulty-upstream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-flags-settings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/args.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/classify.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/delivered.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/frontmatter.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/integration.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/lifecycle.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/feature-triage/resync.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/featured-providers-rank.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/felo-web-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fetch-error-message.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fetch-timeout.test.ts",["43655","43656","43657","43658","43659","43660","43661"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/field-400-downgrade.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/file-deletion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/file-expiration-policy.test.ts",["43662","43663"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/finishReason.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/firecrawl-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/firecrawl-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/firecrawl-search.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/firecrawl-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fireworks-model-id-prefix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-2130-system-passthrough.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-bare-model-precedence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-bare-routing-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-error-message-candidates.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-synced-model-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-tls-client-node-binary-7802.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fix-tool-adjacency.test.ts",["43664","43665","43666","43667"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fixes-p1.test.ts",["43668","43669","43670","43671","43672","43673","43674","43675","43676","43677","43678","43679","43680","43681","43682","43683","43684","43685","43686","43687"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/flat-rate-cost-5552.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/format-provider-error-cause.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/format-reset-countdown.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/formatting-public-surface.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/forwarded-header-budget.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-catalog-2026-07-expansion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-model-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-note-freshness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-provider-rankings-custom-models-6368.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-providers-batch-2026-07.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxies-add-to-pool.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxies-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxies-list-search.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxy-auto-sync-scheduler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxy-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-proxy-sync-cycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-providers-wave1-b.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-providers-wave1-c.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-summary-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-tier-used-this-month.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/free-web-search.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freeProviderRankings-authtype-6915.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freeProviderRankings-filters.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freeProviderRankings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freemodel-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/freepik-image-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/functional-gateway-mirrors-append.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/functional-gateway-mirrors-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/functional-gateway-predicate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-judge-model-6455.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-judge-own-intelligence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-judge-survivor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-panel-size-cap-1905.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-partial-panel-failure-6454.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/fusion-tools-bypass-6771.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/g13-combo-chatcore-golden.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/g4f-space-gateway-6650.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/aggregate-profile-3484.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/antiCheat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/badge-unlock-once-3472.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/badges.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/db-gamification.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/events.test.ts",["43688"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/federation-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/invites.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/leaderboard.test.ts",["43689","43690","43691"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/sharing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/streaks.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification/xp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gamification-display-contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-antigravity-pattern-preserved.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-business-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-cli-ansi-sanitization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-cli-deprecation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-cli-legacy-refresh.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-finish-reason-normalization.test.ts",["43692","43693","43694"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-helper-audio-input-912.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-helper-http-image-url-port344.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-helper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-imagen-predict.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-malformed-function-call-finish-reason-2462.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-midstream-error-4177.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-midstream-nonstreaming-responses.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-midstream-responses.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-models-parser.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-multipleof-2309.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-signatureless-text-mode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-strict-tool-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-thinking-budget-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-thinking-budget-zero-6813.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-to-openai-function-response.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-tool-choice.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-tool-params-object-3357.test.ts",["43695","43696"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web-cookie-rotation-7676.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web-missing-browser-3516.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web-multiturn-context-8371.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web-tool-calling-7286.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gemini-web.test.ts",["43697","43698","43699","43700","43701","43702","43703","43704"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gen-contributors.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/generic-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ghe-copilot-targetformat-parity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ghe-copilot.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-claude-reasoning-effort-granular.test.ts",["43705","43706","43707","43708","43709","43710","43711","43712","43713"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-collector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-copilot-claude-native-messages.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-copilot-gpt-4o-mini.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-copilot-model-discovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-copilot-retired-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-models-curated-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-models-request-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-skill-tools-mcp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/github-skills-route-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlab-duo-oauth-setup-8688.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlab-duo-toolcalls-6051.test.ts",["43714","43715","43716","43717","43718","43719"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlab-tool-exchange-bounded-6220.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlab-tool-result-feedback-6220.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gitlawb-provider.test.ts",["43720","43721"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-executor-max-tokens-clamp-7364.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-executor.test.ts",["43722","43723","43724","43725","43726","43727","43728","43729","43730","43731","43732","43733","43734","43735","43736","43737","43738","43739","43740"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-provider-model-import-route.test.ts",["43741","43742","43743"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-team-quota.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glm-think-close-marker-leak.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/glob-pattern-6540.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/global-package-path.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/google-flow-video-4569.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gpt-max-input-tokens-6191.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gpt5-sampling-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gpt5-tools-reasoning-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gptoss-provider-inference-5852.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/graceful-shutdown-sighup-8045.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-auth-json-paste-7610.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-device-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-function-call-output-sanitize-7611.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-oauth-test-supported-7610.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-oauth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-proactive-refresh-7610.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-provider-limits-ui.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-provider-limits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-proxy-selection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-quota-frame.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-reasoning-strip-6288.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-responses-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-cli-strip-params.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-web-cloudflare-classification.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-web-executor-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grok-web.test.ts",["43744","43745","43746","43747","43748","43749","43750","43751","43752","43753","43754","43755","43756","43757","43758","43759","43760","43761","43762","43763","43764","43765","43766","43767","43768"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/grokweb-cookie-ua-hint-7567.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/groq-field-strip-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/group-provider-permission.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/gtts-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/injection-extraction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/injection-route-coverage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/vision-bridge-callmodel.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/vision-bridge-sse-and-reasoning.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridge.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeHelpers.callVisionModel.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeHelpers.extractImageParts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeHelpers.replaceImageParts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeHelpers.resolveImageAsDataUri.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails/visionBridgeRouter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails-api-3496.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guardrails-void-no-change-contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guide-settings-apikey-null-3552.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/guide-settings-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/hcnsec-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/head-request-closes-6400.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/head-request-v1-models-6400.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headers-normalize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headroom-codex-quota-snapshot-6379.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headroom-detect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headroom-proxy-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/headroom-responses-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/health-ping-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/healthMonitor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/healthz-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/heap-autocalibrate-5172.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/heap-benchmark-corpus.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/heap-pressure.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/hf-model-suggestions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/hide-paid-models-settings-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/home-no-autorouting-banner.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/home-page-client-hook-imports-4759.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/home-provider-topology-default-4596.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/home-provider-topology-live-state.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-admin-client.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-parity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-promptfoo-ctrf.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-provider-tiers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/homolog-sse-parser.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/huggingchat-jsonl-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/huggingchat-model-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-block-extra-usage-copy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-cli-namespaces.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-detect-browser-locale.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-glossary-consistency-check.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-hardcoded-pt-dashboard-6761.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-missing-placeholder-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-nest-dotted-keys.test.ts",["43769","43770","43771","43772"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-provider-filter-keys-6290.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-provider-visibility-filter-keys-6694.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-pt-br.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-quota-share-english.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-ui-value-drift.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/i18n-vi-completeness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/idempotency-fusion-collision.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/idempotency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-compat-node-alias-shadow.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-edits-multipart-3273.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-baseurl-3205.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-fetch-timeout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-route-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-generation-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-model-not-in-chat-catalog-6457.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-registry-gpt56.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-routes-combo-edits-3214-3215.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-text-to-image-modality.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/image-upscale.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inclusionai-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/injection-guard-scan-bound-3932.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/injection-system-prompt-leak-heuristic-4041.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inner-ai-find-model.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/input-sanitizer-pii-redaction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-agent-bridge-hook.test.ts",["43773","43774","43775"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-buffer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-context-key.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-conversation-normalizer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-har-export.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-http-proxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-kind-detector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-llm-metadata.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-pricing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-process-attribution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-sse-merger.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-system-proxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/inspector-types.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-database-closed-6560.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-live-ws.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-node-boot-db-failure.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-process-title.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/instrumentation-warm-catalog-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/intent-classifier-pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/intercept-fetch-resolver.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/interception-rules.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/internal-service-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/internal-usage-command.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ip-filter-persistence-6131.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ip-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ipUtils.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/isLocalStreamLifecycleError-abort-shape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/isolate-datadir.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6343-v0-web-alias-collision.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6623-opencode-mimo-reasoning-details-nonstream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6638-ollama-quota.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6662-repro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-6686-quota-preflight-coverage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7071-ollama-session-quota.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7284-connection-test-masks-429.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7705-tool-use-id-mismatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7793-env-doc-sync-repro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7856-copilot-reasoning-text-nonstream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-7859-gemini-web-redirect-valid.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-9407-gemini-web-validation-false-positive.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-audit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-execution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-github-export.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-route-execution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-runner.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-agent-runs-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/issue-fixes-v3.7.9.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/jina-reader-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/json-migration-combos.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/json-size-exactness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/json-to-sse-3089.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/keepalive-cleanup-8140.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/keepalive-threshold.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kenari.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/key-health-402-disable-5239.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kie-audio-transcription-result.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kie-executor-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kie-task-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kilocode-anonymous-fallback-4019.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-cn-region-baseurl.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-coding-apikey-quota-4435.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-coding-model-discovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-coding-translator.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-combo-preset.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-k2.7-code-registration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-native-reasoning-injected-1480.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-partner-aff-links.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-quota-reset-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-sponsor-banner-version-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kimi-web-models-discovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-api-key-route-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-api-key-service.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-auto-import-idc-2059.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-auto-import-name-dedup-3615.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-available-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-builder-id-import-3333.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-catalog-real-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-claude-sonnet-5-2267.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-connection-identity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-continue-filler-5231.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-eventstream-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-external-idp.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-gpt56-family-registration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-iam-profilearn-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-iam-region.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-idc-cross-region.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-import-error-3589.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-import-overwrite-9435.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-long-tool-description-docs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-model-aliases.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-multi-account-isolation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-overage-usage-4469.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-region-ssrf-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-social-poll.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-sso-cache-direct-clientid-1253.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-streaming-finish-reason-3980.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-system-reminder-2306.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-tool-args-streaming.test.ts",["43776"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-tool-call-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-tool-schema-sanitize-1375.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-toolresult-compression.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-usage-empty-breakdown-3506.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiro-windows-auto-import-3363.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/kiroThinking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ladder-engine-maps-6533.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/latency-stats-ttft-6875.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/launch-codex-windows-spawn-6312.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/learned-thinking-caps.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/costEstimator.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/csvToJsonl.test.ts",[],["43777"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/retryFailed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/batches/validateJsonl.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/connection-cooldown-summary.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/consoleInterceptor-epipe.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/consoleInterceptor-writes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/jobs/backupScheduleJob.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/jobs/cronMatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/machineToken.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/managementCliToken.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lib/quota-reset-events.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/limiter-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/list-uncovered-commits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/listCapabilities-a2a.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-model-catalog-reconciliation-8926.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-ws-cookie-parse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-ws-eaddrinuse-6324.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-ws-public-url.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/live-ws-standalone-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/livews-forward-backoff-4604.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/llama-cpp-local-url.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/llamacpp-model-delete.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/llm-selector-custom-vision-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/llm7-byteplus-models-fetch-3976.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lmarena-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lmarena-split-cookie-4271.test.ts",["43778"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/lmstudio-embedding-provider-7601.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/local-aliases-precedence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/local-corpus-index.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/local-corpus-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/local-redis-runtime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/log-export-routes.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/log-redaction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/log-retention.test.ts",["43779","43780","43781","43782","43783","43784","43785","43786","43787","43788","43789","43790"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/log-rotation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/logenv-datadir-path-6197.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/logger-redaction-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/logger-write-after-datadir-removed-6360.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/login-bootstrap-route.test.ts",["43791","43792","43793","43794","43795","43796","43797","43798","43799","43800"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/login-shell-path-3321.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-bizchat-frames-4042.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-connection-4042.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-tier-selector-6334.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-tone-model-variants.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/m365-web-token-extraction-7078.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mac-update-manifest-merge.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/machine-id.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/main-server-keepalive-timeout-7003.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/main-server-timeouts-parity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/managed-available-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/managed-model-import.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/management-auth-docs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/management-auth-hardening.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/management-password-insecure-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/management-password.test.ts",["43801","43802","43803","43804"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/manual-config-modal-clipboard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/maritalk-model-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mark-account-unavailable-numeric-epoch-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mask-email.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/masked-200-exhaustion-fallback-6427.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/materialize-bundled-symlinks.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp/serverSmartFilter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp/tool-cardinality.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp/tool-definition-reexport.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-connect-scope.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-extra-forward-6178.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-memory-tools-strategy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-model-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-pool-tools-3368.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-published-files-closure-3578.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-server-entry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-server-hollow-dist-deps.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-session-sweep.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-sse-response-headers-8277.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-tool-collections-shape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-tool-count-dedup-6854.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mcp-web-fetch-tool.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/media-body-arraybuffer-backing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/media-cost-headers-handlers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/media-cost-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/media-provider-ordering.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory/typed-decay.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-cache-safe-injection.test.ts",["43805","43806","43807","43808"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-list-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-remote.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-resolve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-static-potion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-embedding-transformers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-engine-status.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-extraction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-glm-injection.test.ts",["43809"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-needs-reindex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-reindex-batch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-retrieval-hybrid.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-retrieval-rerank.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-retrieval-semantic.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-retrieve-preview.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-route.test.ts",["43810","43811"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-schemas-roundtrip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-settings-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-settings-extended.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-settings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-stats-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-store-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-store.test.ts",["43812"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-summarization-older-than.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-summarization.test.ts",["43813","43814"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-system-first-6135.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vec-meta.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-crud.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-ensure-ready.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-int8-quant.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-load.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-rrf.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/memory-vectorstore-upsert-self-heal.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/merge-train-plan.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/messages-count-tokens-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/microsoft-designer-web-6672.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/middleware-header-strip-5849.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/middleware-hook-sandbox-5872.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/middleware-hooks-error-sanitization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/migration-107-quota-share-strategy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/migration-safety-abort-6260.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mimo-thinking-normalize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mimocode-executor.test.ts",["43815","43816","43817","43818","43819","43820","43821","43822","43823","43824","43825","43826","43827","43828","43829","43830","43831","43832","43833","43834","43835","43836","43837","43838","43839","43840","43841","43842","43843","43844","43845","43846","43847","43848","43849","43850","43851","43852","43853","43854","43855","43856","43857","43858","43859","43860","43861","43862","43863","43864","43865","43866","43867","43868","43869","43870","43871","43872"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-coding-plan-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-image-provider-2482.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-m3-maxtokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-m3-model-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-media-servicekinds.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-thinking-signature-2706.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/minimax-tts-1043.test.ts",["43873","43874","43875","43876","43877","43878"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mistral-strip-reasoning-content-1649.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mistral-trailing-assistant.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-alias-config-shim.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-antigravity-reasoning-effort-override.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-cert-install-mode-9442.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-cert-mac-fingerprint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-cert-migration-6684.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-cert-removal-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-detection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-diagnostics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-dns-graceful-degrade-6127.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-dnsConfig.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-forward-target.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-antigravity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-base.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-claudeCode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-codex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-copilot.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-cursor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-kiro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-openCode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-trae.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-handler-zed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-hosts-cleanup-on-exit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-ingest-route-sanitize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-ingest-shim.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-manager-bypass-json.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-manager-cleanup-symmetry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-manager-repair.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-manager-stub.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-masksecrets.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-passthrough.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-privileged-steps-sudo-gate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-root-ca-leaf-issuance-6684.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-root-ca-persistence-6684.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-sanitize-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-server-claude-code-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-server-connect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-server-loop-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-server-timeouts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-start-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-startup-error-3606.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-stop-dns-before-kill-1809.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-stub-alias-6344.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-sudo-gate-822.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-sudo-graceful-degrade.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-system-commands-prefix-3641.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-systemCommands-no-sudo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-targets-resolve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-targets-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-tool-hosts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-upstream-ca-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mitm-upstream-trust.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/mixedbread-embedding-provider-6660.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modal-credential-combine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modal-validation-model-prefill.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modalCost.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-alias-provider-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-alias-route.test.ts",["43879","43880","43881","43882","43883","43884"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-alias-seed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-aliases-globalthis-5777.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-aliases-settings-route-selfheal.test.ts",["43885","43886","43887","43888"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-breakdown-sort-8769.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-kimi-k3-vision-8250.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-mimo-vision-override.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-mistral-vision-sync-4073.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-path-shaped-vision-8032.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-provider-unsupported-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capabilities-specialty-8016.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-capability-overrides.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-catalog-name-disambiguation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-catalog-search.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-catalog-source.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-combo-mappings-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-combo-mappings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-connid-prefix-normalization-6772.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-context-override-readpath.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-cooldowns-route-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-cooldowns-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-cross-proxy-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-deprecation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-discovery-reasoning-levels.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-family-fallback-notation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-intelligence-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-latency-stats-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-listing-capability-5420.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-lockout-decay.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-lockout-exact-cooldown-cap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-lockout-max-cooldown.test.ts",["43889","43890","43891","43892"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-metadata-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-output-cap-synced-fallthrough-6714.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-parse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-pricing-litellm-gap-9364.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-resolver.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-select-all-confirm-threshold-8526.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-select-hidden-map-helpers-9203.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-select-null-alias-guard-2247.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-select-passthrough-alias-485.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-spec-lookup-index-8697.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-strip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-sync-custom-preservation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-sync-route.test.ts",["43893","43894","43895","43896","43897","43898","43899","43900","43901","43902","43903","43904","43905","43906","43907","43908"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-sync-scheduler.test.ts",["43909"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-test-route.test.ts",["43910","43911","43912"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-test-runner-compression-off-6240.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-test-runner.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/model-token-limit-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-auto-combos-4164.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-block-auto-5192.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-combo-metadata.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-envkey-6406.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-exact-dup-4424.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-functional-gateway.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-hidden-combo-leaves.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-hide-paid.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-low-noise-flag.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-catalog-route.test.ts",["43913","43914","43915","43916","43917","43918","43919","43920","43921","43922","43923","43924","43925","43926","43927","43928","43929","43930","43931","43932","43933","43934","43935","43936","43937","43938","43939","43940","43941","43942","43943","43944","43945","43946","43947","43948","43949","43950","43951","43952","43953","43954","43955","43956","43957","43958","43959","43960","43961","43962","43963","43964","43965","43966","43967","43968","43969","43970","43971","43972","43973","43974","43975","43976","43977","43978","43979","43980","43981","43982","43983","43984","43985","43986","43987","43988","43989","43990","43991"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-dev-pricing-memoization-8697.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/models-test-error-shape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelsDevSync-extended.test.ts",["43992","43993"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelsDevSync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelscope-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelscope-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelsdev-specialty-keying-8017.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modelsdevsync-transform-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/moderations-handler.test.ts",["43994","43995","43996","43997","43998","43999","44000"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/modular-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/monaco-editor-import-path.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/moonshot-k3.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/morph-provider-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/multipart-body-arraybuffer-backing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/muse-spark-cookie-copy-5449.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/muse-spark-response-parser-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/muse-spark-web-continuation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/muse-spark-ws-auth-token-9502.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/music-generation-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/namespace-tool-identity-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nanobanana-image-generation.test.ts",["44001","44002"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nanobanana-image-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/native-binary-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/new-content-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/newapi-aggregator-preflight-dispatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/newapi-aggregator-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/next-config.test.ts",["44003","44004","44005"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nightly-compat-node26-webpack-8090.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ninerouter-embed-port-6205.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ninerouter-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/no-memory-header.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/no-src-open-sse-alias.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/no-thinking-alias.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noAuthProxyResolution.relayAuth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-autocombo-allowlist.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-autocombo-exclude-7622.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-autocombo-hidden-7620.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-autocombo-lockout-7623.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-blocked-partition-5183.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-imported-models-3200.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-provider-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/noauth-proxy-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/node-runtime-support.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/non-streaming-sse-terminal-typescan-4459.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nonstream-usage-cache-tokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nonstreaming-gemini-family-response-projection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/normalize-base-path.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notification-toast-coercion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notificationStore.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notion-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notion-thread-idor-7900.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notion-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/notion-web-models-discovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/npm-publish-artifact-provenance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/npm-runtime-deps-fumadocs-mdx-7661.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nube-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/numeric-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-catalog-drift.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-minimax-m3-removed-3329.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-minimax-thinking-strip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-nim-catalog-expansion-2373.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-nim-image.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-nim-registry-6108.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-nim-validator.test.ts",["44006","44007"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-passthrough-models-6773.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-quota-phase1.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-strip-prompt-cache-key.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-tool-compatibility-2840.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-validation-bypass-proxy-3226.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/nvidia-validation-model-3116.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-callback-path-doc.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-connection-persistence-codex-dedup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-connection-test-codex-endpoint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-connection-test-timeout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-connection-tokenexpiresat-5326.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-credential-blob.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-cursor-auto-import.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-device-code-endpoints.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-device-code-error-transparency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-error-linkify-5486.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-google-loopback-guidance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-grok-cli-browser.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-keychain-import-only-6041.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-keychain-import-only-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-kiro-idc.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-kiro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-lan-loopback-guidance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-legacy-services-removed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-modal-codex-lan-ip-8046.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-modal-grok-cli-browser-login-7013.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-modal-grok-cli-paste-7610.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-modal-typescript-regressions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-paste-credentials-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-paste-credentials.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-providers-config.test.ts",["44008","44009"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-providers-error-handling.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-redirect-uri-mismatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-refresh-connection-dedup-8059.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-refresh-error-resilience.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-test-config-8408.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oauth-trae.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/observability-fase04.test.ts",["44010"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/observability-payloads.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-plugin-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/obsidian-webdav-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ocr-route.test.ts",["44011","44012","44013","44014","44015","44016","44017","44018"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/oidc-callback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-cloud-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-cloud-weekly-quota-cooldown-3709.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-local-embedding-2824.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-local-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ollama-transform.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/omni-skills-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/omniroute-decision-header.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/omniroute-meta-fallback-attempts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/omniroute-response-meta.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/onboarding-step-titles-i18n-4698.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/onboarding-wizard-details-link-6145.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/onboarding-wizard-route-5427.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-developer-role-normalize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-gpt56-catalog.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-gpt56-responses-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-only-models-5842.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-reasoning-effort.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-request-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-single-text-content-string.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-subagent-strip-2446.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-responses-verbosity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-style-providers-4239-4155-3841.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-bare-tool.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-empty-messages-5245.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-file-attachments.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-glm-split-tool-name-2077.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-redacted-replay-5312.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-strip-empty-signature-6953.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-strip-empty.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-strip-temperature-thinking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-claude-thinking-budget-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-gemini-gemma-thinking.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-gemini-helpers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-to-kiro-helpers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openai-tool-opaque-object-schema.test.ts",["44019","44020","44021","44022"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-coverage.test.ts",["44023"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-security-tiers.test.ts",["44024","44025","44026","44027","44028","44029","44030","44031"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-spec-example-body.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-spec-route.test.ts",["44032"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-try-route.test.ts",["44033","44034","44035","44036","44037","44038"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openapi-ws-endpoint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-cli-headers-synthesis-5997.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-deepseek-reasoning-injected.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-executor.test.ts",["44039"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-free-tier-catalog-stale-6998.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-catalog-alignment.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-effort-aliases-6922.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-effort-aliases-8353.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-quota-no-zai.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-go-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-noauth-models-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-proxy-rotation-4954.test.ts",["44040","44041","44042","44043","44044","44045"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-quota-fetcher.test.ts",["44046"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-strip-client-metadata-1442.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencode-zen-alias-combo-e2e.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/opencodeReasoningSanitizer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-context-length-3202.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-embeddings-catalog-6976.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-free-window-wiring-6842.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-midstream-error-chunk.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-provider-stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-quota-6842.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openrouter-vision-sync-4264.test.ts",["44047","44048","44049","44050"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/openvecta-provider-registration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ops-scripts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/orphaned-tool-filter.test.ts",["44051","44052","44053","44054"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/outbound-url-guard-feature-flag.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/output-token-budget-model-cap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/output-token-budget.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pack-artifact-entrypoint-closures.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pack-artifact-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pack-artifact-server-ws-closure.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pagination.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/paid-model-target-6540.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/paid-model-target-routes-6540.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/param-filters-apply.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/param-filters-auto-learn.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/param-filters-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/parse-model-defensive.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/parse-provider-import-6836.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/passthrough-alias-1850.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/payload-rules-restart-persistence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/payload-rules-route.test.ts",["44055","44056","44057","44058","44059","44060","44061"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/payload-rules.test.ts",["44062","44063"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/peer-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pending-counter-drift-8141.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-key-validation-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-tls-client.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-web-executor-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-web-model-mappings.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-web-streaming-tools-5927.test.ts",["44064","44065"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/perplexity-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/persist-429-cooldown-account-fallback.test.ts",["44066","44067","44068","44069","44070","44071","44072"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pick-internal-api-key-6372.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pii-opt-in-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/piiReproduction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/piiSanitizer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/piiSanitizerIpv6.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pioneer-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pipeline-router.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pipeline.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plan3-p0.test.ts",["44073","44074","44075","44076","44077","44078","44079","44080","44081","44082","44083","44084","44085","44086","44087","44088","44089","44090","44091","44092"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-code-export.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-key-policy-3503.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-model-filter-3505.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-model-qualify.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-model-selection-3731.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-prompt-improver.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-reasoning-controls-6241.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/playground-stream-metrics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-analytics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-api-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-config-route.test.ts",["44093"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-config-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-dev-mode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-doctor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-edge-cases.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-errors.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-fs-safety.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-hook-payload-chaining-3286.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-hooks-rate-limit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-hooks.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-index.test.ts",["44094","44095","44096","44097","44098","44099","44100","44101","44102"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-loader-ipc.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-loader.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-logger.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-manager-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-manager-restart-reload-7806.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-manager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-manifest.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-marketplace.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-metrics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-permissions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-route-error-sanitization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-scanner.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-set-enabled-shim-3473.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-signing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-upgrade.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/plugins-welcome-banner-e2e.test.ts",["44103"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/podman-machine-guidance-8497.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/poe-api-executor-regression.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/poe-provider-models-baseurl.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/policy-engine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pollinations-image-anon-fallback-8085.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pollinations-jsonmode-3981.test.ts",["44104","44105","44106"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/postinstall-support.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pr-self-target-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-ag-flash-tiers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-cc-anthropic-rates.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-constants-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-route-sources.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-sync-cross-instance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-sync-extended.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-sync-status-7955.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricing-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/pricingSync.modal.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-6409-turbopack-memory-doc.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-6699-jules-executor-misroute.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-6835-cyclebreaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-6835-oom-uncapped.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-7134-claude-web-empty-error-body.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-7293-strict-system-hoist.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-9064-code-execution-beta.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-9408-tool-use-protocol.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-9541-repro.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/probe-9575-tool-name-case.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/processManager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/progress-tracker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-cache-affinity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-cache-prefix-analyzer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-injection-guard-db-flag.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-injection-guard.test.ts",["44107","44108","44109"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/prompt-required-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-add-ux-i18n-import-warning.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-alias-transitive-5918.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-alias-uniqueness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-apikey-cap-6715.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-audit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-columns.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connection-apikey-dedup.test.ts",["44110"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connection-healthcheck-interval-zero.test.ts",["44111","44112","44113","44114","44115","44116"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connection-status.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connections-fetch-url-2998.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connections-pagination-2998.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connections-quota-threshold.test.ts",["44117"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-connections-ui-regression.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-credential-requirement.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-detect-format-endpoint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-display-label.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-endpoints-friendliai-novita.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-error-rules.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-field-strips.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-filters-url-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-header-profiles.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-health-matrix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-hints.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-icon-arena-themed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-learn-more-link.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-401-reauth-hint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-accesstoken-fallback-on-refresh-failure.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-apikey-proxy-context.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-chunked-spacing-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-force-refresh-imported.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-local-apikey-sync-spacing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-oauth-sequential-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-provider-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-proxy-fail-closed.test.ts",["44118","44119","44120"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-rotating-expired-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-sanitize-scope-3821.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-sync-scheduler-public-surface.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-limits-ui.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-metadata-5461-5470-5534.test.ts",["44121","44122","44123"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-metrics-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-model-filter-live-catalog-7250.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-context-window-override-4125.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-custom-merge-6247.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-discovery-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-management-route.test.ts",["44124","44125","44126","44127"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-qwen-web-redirect-6267.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-route-codex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-route-lan-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-route.test.ts",["44128","44129","44130","44131","44132","44133","44134","44135","44136","44137","44138","44139","44140","44141","44142","44143","44144","44145","44146","44147","44148","44149","44150","44151","44152","44153","44154","44155","44156","44157","44158","44159","44160","44161","44162","44163","44164","44165","44166","44167","44168","44169","44170","44171","44172","44173","44174","44175","44176","44177","44178","44179","44180","44181"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-token-limits.test.ts",["44182","44183"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-v1-route.test.ts",["44184"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-models-vision-override-1904.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-node-dedup-4746.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-node-icon-url.test.ts",["44185","44186","44187","44188","44189","44190"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-node-select-4421.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-nodes-route.test.ts",["44191","44192","44193","44194","44195","44196","44197","44198","44199","44200","44201","44202","44203"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-nodes-validate-docker-hint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-nodes-validate-modelid.test.ts",["44204","44205","44206","44207","44208","44209","44210","44211"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-nodes-vibeproxy-preset.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-onboarding-href.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-onboarding-wizard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-page-helpers-3501.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-plugin-manifest-url.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-plugin-manifest.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-proxy-lazy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-quota-visibility.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-quota-widget-icon-prop.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-rate-limit-overrides-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-freetheai.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-github-copilot-gpt-4.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-github-copilot-gpt-4o.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-github-copilot-targetformat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-kilocode-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-llm7-cohere.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-models-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-openai-gemini-expanded-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-registry-qwen-vision.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-request-capture-toolname-antigravity-4181.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-request-capture-toolname-map-4091.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-request-failure-pipeline.test.ts",["44212","44213","44214","44215","44216","44217"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-request-logging.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-route-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-scoped-aliases.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-scoped-chat-completions-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-scoped-models-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-section-visibility.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-service-kind-filter-4240.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-service.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-settings-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-setup-links-5572.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-specific-data-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-sweep-live-discovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-target-format-badge-4475.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-test-account-deactivated.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-test-mistral-401-classify.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-tier-field-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-translate-path-golden.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-azure-vertex.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-branches.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-firepass-403.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-hardening.test.ts",["44218","44219","44220","44221","44222","44223"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-image-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-qwen-web-5855.test.ts",["44224"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-specialty.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-ssrf-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-tinyfish.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-web-cookie-auth007.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-validation-webfetch-4401.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-wafer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/provider-window-costs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providerlimits-quotanormalize-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-autosync-ssrf-323.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-batch-update.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-bulk-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-constants-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-free-tier-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-page-data-timeout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-page-utils-kimi.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-page-utils.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-route-managed-catalog.test.ts",["44225","44226","44227","44228"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-test-route-cli-map.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-validate-route.test.ts",["44229","44230","44231","44232"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/providers-yuanbao-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-assigned-unavailable-6246.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-autoselect-optin-3332.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-batch-routes-5918.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-bulk-import-dedup-7594.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-bypass-scope-guard-3226.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-concurrency-keepalive-regression.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-connection-test.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-dispatcher-cache-cap.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-dispatcher-family.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-egress-isolation-bdd.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-egress-validate-pool-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-egress-visibility.test.ts",["44233","44234","44235","44236","44237","44238","44239","44240","44241","44242"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-fallback-cache-key.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-fallback-candidates-listproxies-shape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-fallback-ssrf.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-family-migration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-family-resolve-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-family-resolve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-family.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-fetch.test.ts",["44243"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-health-6246.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-health-decide-action-6246.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-health-ipv6.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-health-scheduler-listproxies-shape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-logger-client-ip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-logs-egress-ip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-logs-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-management-v1-route.test.ts",["44244","44245","44246","44247","44248","44249","44250","44251","44252","44253","44254","44255","44256","44257","44258","44259","44260","44261","44262","44263","44264","44265"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-nested-context-skip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-noauth-provider-6272.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-cloudflare-workers-deployer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-deno-deploy-relay.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-rotation-6365.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-route-6365.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-pool-sync-4878.test.ts",["44266"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-registry-manager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-registry-route-handlers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-registry.test.ts",["44267","44268","44269","44270","44271","44272","44273","44274","44275","44276","44277","44278","44279","44280","44281","44282","44283","44284","44285","44286","44287","44288","44289","44290","44291","44292","44293","44294","44295","44296","44297","44298","44299","44300","44301","44302","44303","44304","44305","44306","44307","44308","44309","44310","44311","44312","44313","44314","44315","44316","44317","44318","44319","44320"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-relay-mappers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-relay-test-error-5716.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-resolution-status-filter.test.ts",["44321","44322","44323"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-rotation-latency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-subscriptions-route-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxy-types-socks5-runtime-3508.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.coreEndpoint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.due.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.fetchGuard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.fetchRetry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.needsCore.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.parse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.scopes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.service.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxySubscription.url.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxyfetch-caller-abort-log-suppression.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxyfetch-retry-fresh-socket-4252.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxyfetch-undici-retry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/proxyfetch-vercel-relay-2743.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/public-api-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/public-client-ids-3493.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/publicCreds.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/publicai-not-keyless-3558.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qdrant-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qianfan-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qiniu-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-cli.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-display-label.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-executor.test.ts",["44324","44325","44326"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-jobtoken-exchange-4683.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-oauth-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-test-runtime-disambiguation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-unwrap-error-envelope.test.ts",["44327","44328","44329"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qoder-usage-quota.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qodercli-windows-resolve-6263.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quality-rail-gate-membership.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quality-ratchet.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-account-buckets.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-account-quota-row.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-auto-ping.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-burn-rate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-cache-hydrate-5015.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-cache-is-exhausted-per-window-5923.test.ts",["44330","44331","44332","44333","44334","44335"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-cache-snapshot-dedup-4438.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-expanded-fixed-order-6687.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-expanded-loading-placeholder.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-expanded-sort-collapse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-grid-density-6815.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-grid-horizontal-layout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-card-grid-mobile-7072.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-catalog-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-combo-balancing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-combo-cli-providers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-combo-groups.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-combos-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-concept-card-i18n.test.ts",["44336","44337"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-connection-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-constrain-connections.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-deactivate-toggle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-deterministic-order.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-dimensions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-edit-opens-wizard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-email-privacy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-endpoints-card.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-enforce-await-store.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-enforce.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-epsilon-unconfigured-allow.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-equal-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-exclusive-catalog-4806.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-exclusive-catalog-short-circuit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-exclusivity-reconcile.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-fair-share.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-fetch-throttle-6009.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-fetch-throttle-scope-6911.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-group-allocations.test.ts",[],["44338","44339"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-group-scope.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-groups-crud.test.ts",["44340"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-groups-migration.test.ts",["44341"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-groups-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-groups-ui.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-helpers.test.ts",["44342"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-key-models-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-key-resolve.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-model-naming.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-monitor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-multiprovider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-parsing-claude-extra-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-per-key-model-hotpath.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-per-key-model.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-plan-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-plan-resolver.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-plans-route-retired.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-policy-generalization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-connections.test.ts",["44343"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-delete-prune.test.ts",["44344","44345"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-log-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-single-provider.test.ts",["44346","44347","44348","44349","44350","44351","44352","44353","44354"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-update-full.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-usage-shape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-wizard-edit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-wizard-multi.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-pool-wizard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-preflight.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-redis-store.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-saturation-anthropic-oauth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-saturation-signals.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-saturation-token-headers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-share-bugfixes-v388.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-share-grid.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-share-layout-v2.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-share-strategy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-sharing-fixes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-spend-recorder.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-sqlite-store.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-store-factory.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-store-pool-total.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-streaming-consumption-usd.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-summed-budget.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/quota-token-expiry-display.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-cloud-image-media.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-cloud-token-plan-media.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-cloud-video-media.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-code-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-settings-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-web-content-array-serialization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-web-cookie-validation-3958.test.ts",["44355"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/qwen-web-models-discovery-3931.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-api-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-apply-feed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-flag-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-inertia.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-page-state.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/radar-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-enhanced.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-manager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-provider-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-queue-timeout-lockout.test.ts",["44356","44357","44358","44359"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-queue-timeout-message-4165.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limit-wedge-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limiter-eviction-4041.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limiter-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rate-limiter-redis-optional.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rateLimitManager-idle-eviction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rateLimitSemaphore.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ratelimit-admission-control-6593.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ratelimit-reservoir-refresh.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ratelimitmanager-headers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/raycast-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/raycast-local-extract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reactive-context-compaction-policy.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-cache-truncation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-cost-double-billing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-placeholder-strip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-replay-big-pickle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-routing-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-routing-decision-guards.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-token-buffer-6274.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-token-buffer-9507.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoning-token-source-6187.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reasoningContentInjector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/redirects-cli-renames.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-buildHeaders-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-buildHeaders-opencode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-buildHeaders-preamble.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-effortLevel.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-opencodeHeaders.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-registryFactory.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-resolveBaseUrl.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refactor-urlSanitize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refresh-serializer-spacing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/refresh-serializer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/regional-provider-cn-notices-5462.test.ts",["44360","44361"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/registry-direct-exports.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/registry-utils.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/regolo-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rehome-open-prs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rejected-request-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-check-rate-limit-existing-token.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-deploy-5128.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-minified-fn-6149.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-probe-stats.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/relay-test-result-awareness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/release-cycle-base-resolver.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/release-green-docs-drift-7253.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/release-notes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/releaseChecker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/remaining-tasks.test.ts",["44362"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/remote-image-fetch-dns-rebinding.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/remote-image-fetch-pin-dns-connection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/remote-image-fetch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/replace-custom-models-preserve-hidden-5086.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6142-devin-cloud-agent-unwired.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6377-agentrouter-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6524.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6557-noauth-connection-disable-ignored.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6576-kiro-thinking-unsupported-model.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6637-kimi-token-limit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6692-sticky-terminal.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6701-claude-detect-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6912-volcengine-max-completion-tokens.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6951.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6952-commentary.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6953.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6957.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-6975.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7023.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7268-401-model-not-supported-lockout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7387-sticky-quota-exhausted.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7503-no-choices.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7764-collapsed-quota-order.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7820-amazon-q-static-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-7847-bound-client-raw-request.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8065-quota-cache-cross-instance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8136-antigravity-400-model-not-supported-lockout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8429-capability-canonicalization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8430.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8522.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-8956.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-9406-claude-web-429-valid.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-9500-reasoning-separator.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-9550-amazon-q-alias-resolution.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/repro-antigravity-404-family-cooldown-hijack.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-defaults-store-session.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-log-detail-layout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-log-detail-stream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-log-migration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-log-payloads.test.ts",["44363","44364","44365","44366"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-bounded-clone.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-bounded-idempotence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-endpoints.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-preferences.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/request-logger-signature.test.ts",["44367","44368","44369","44370","44371","44372","44373","44374"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/requesty-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/require-management-auth-access-token.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-object-documents-response-path.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-openrouter-6574.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-providers-5332.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-proxy-pinning-7350.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank-voyage-7809.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rerank.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reset-connection-backoff.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reset-password-cli-6261-6258.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-provider-cooldown-api-3556.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-combo-cooldown-wait.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-normalize-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-provider-breaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-quota-preflight.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-quota-share-concurrency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-stream-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-settings-upstream429-breaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-stream-recovery-feature-flags.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resilience-tab-response-fields.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-bare-model-to-connection-default-474.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-model-alias-index-8697.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-omniroute-base-url.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-proxy-family.test.ts",["44375","44376","44377","44378","44379","44380","44381","44382","44383","44384"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-routing-model.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-stream-flag.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolve-web-provider-host.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resolveComboContextLimit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resource-pressure-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resource-pressure-runtime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resource-pressure-sampler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/resource-pressure.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/response-model-echo-1311.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/response-openai-responses-purehelpers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/response-sanitizer.test.ts",["44385","44386","44387","44388","44389","44390","44391","44392","44393","44394","44395","44396","44397","44398","44399","44400","44401","44402","44403","44404","44405","44406","44407","44408","44409","44410","44411","44412","44413","44414","44415","44416","44417","44418","44419","44420","44421","44422","44423","44424","44425","44426","44427","44428","44429","44430","44431","44432","44433","44434","44435","44436","44437","44438","44439","44440","44441","44442","44443","44444","44445","44446","44447","44448","44449","44450","44451","44452","44453","44454","44455","44456","44457","44458","44459","44460","44461","44462","44463","44464","44465","44466","44467"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-active-stream-custom-tool.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-additional-tools.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-chat-assistant-role-first-chunk.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-chat-namespace-identity-map.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-chat-namespace-qualified-name.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-chat-translation-gaps.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-combo-resolution-3227.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-commentary-event-frame-6561.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-commentary-passthrough-6199.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-default-text-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-input-item-status-8083.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-input-sanitizer-name.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-nameless-hosted-tool-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-namespace-flatten.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-parse-once-4041.test.ts",["44468","44469","44470","44471","44472","44473"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-reasoning-close-before-message-466.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-state-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-strip-truncation-2311.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-textless-terminal-3948.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-to-claude-whitespace-9170.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-tool-search-call-skip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-transformer-dense-output.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-transformer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-translation-fixes.test.ts",["44474","44475","44476","44477","44478","44479","44480","44481","44482","44483","44484","44485","44486","44487","44488","44489","44490","44491","44492","44493","44494","44495","44496","44497","44498","44499","44500","44501","44502","44503","44504","44505","44506","44507","44508"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-usage-trailing-6906.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-ws-proxy-compression-parity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-ws-proxy-headers.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-ws-proxy-multi-turn-history.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responses-ws-proxy.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/responsesanitizer-reasoning-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/retrieval-scoring-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/reverse-models-dev-providers-8697.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/review-reviews-v3814-fixes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/risk-notice-acknowledged.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/risk-notice-modal-button-import.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/role-normalizer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rotation-config-omniroute.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-edge-coverage.test.ts",["44509","44510","44511","44512","44513","44514","44515","44516","44517","44518","44519","44520","44521","44522","44523","44524","44525","44526","44527","44528","44529","44530","44531","44532","44533","44534","44535","44536","44537","44538","44539","44540","44541","44542","44543","44544","44545","44546","44547","44548","44549","44550","44551","44552","44553","44554","44555","44556","44557","44558","44559","44560","44561","44562","44563","44564","44565"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-error-sanitization-v382.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-explainability.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-acp-agents-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-forge-jcode-settings-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-grok-build-settings-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-loopback-via-proxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-middleware-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-plugins-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-private-lan.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-provider-login-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/route-guard-qwen-settings-local-only.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-check.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-cli.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-compare.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-e2e-chain.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-patch-compare.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-search.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval-trends.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-eval.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/router-strategies.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/routing-settings-ux-6147.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rtk-enable-renderers-6703.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rtk-gradle-dotnet-filters.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rtk-new-filters.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/rule12-error-sanitization-sweep.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/run-next-node-env.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/run-next-playwright.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime/live-ws-default.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime/magicBytes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime/sqliteRuntime-node26-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime/sqliteRuntime.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-config-globalthis-5312.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-deps-save-exact-no-prune.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-env-max-old-space.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-env.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-ports.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/runtime-timeouts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/safe-outbound-fetch.test.ts",["44566","44567","44568","44569","44570","44571","44572","44573","44574"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/safe-resolve-proxy-fail-closed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sanitizer-residual-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/save-call-log-persistence.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/schema-coercion.test.ts",["44575","44576","44577","44578","44579","44580","44581","44582","44583","44584","44585","44586"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-cache-ttl-zero.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-handler-duckduckgo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-handler-extended.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-handler-perplexity-options.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-provider-validation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-providers-static-model-catalog-7529.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-route.test.ts",["44587","44588","44589","44590","44591","44592","44593"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-select-provider-searxng-bug-9543.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/search-tools-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/secure-random-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/build-profile-stubs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/cloud-sync-hmac.test.ts",["44594","44595","44596","44597","44598"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/docs-path-traversal.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/docs-sanitization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/elevated-powershell-no-encoded.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/live-server-allowlist.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/local-endpoints.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/zed-credential-fingerprint.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security/zed-import-two-step.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security-docs-truthfulness-8097.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security-fase01.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/security-hashkey.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/segmind-image-video-provider-6656.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/select-impacted-tests.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/self-inflicted-upstream-timeout.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/semantic-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sensenova-image-provider-2233.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sensenova-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/combo-health-autopilot.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/combo-quota-share-cooldown-wait-timing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/combo-strategy-fallbacks-half-open-timing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/glm-coding-plan-monthly-3580.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/provider-health-autopilot.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serial/quota-division-blocks.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/serve-node-options-preserve-5238.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-backends.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-batch-processor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-combo-metrics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-context-handoff.test.ts",["44599"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-context-manager.test.ts",["44600"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-intent-classifier.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-payload-rules.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-provider-plugin-manifest.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-provider-plugin-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-quota-monitor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-reasoning-cache.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-session-manager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-system-transforms.test.ts",["44601","44602","44603"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-thinking-budget.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-tier-labels.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-token-limit-counter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-token-refresh.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/service-worker-navigation-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/ServiceSupervisor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/bifrost-route-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/bifrost-routing-backend.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/combo-metrics-memory.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/embed-proxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/embedWsProxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/emergency-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/end-to-end-shape.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/fusion-min-panel-and-failure-detail.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/geminiRateLimitTracker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/htmlRewriter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/install-route-helper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/bifrost-transport-version-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/bifrost.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/cliproxy-resolve-spawn-args-6877.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/cliproxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/mux.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/ninerouter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/installers/runNpm-shell-5379.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/logs-sse.test.ts",["44604","44605","44606","44607","44608","44609","44610"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/modelSync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/providerCooldownTracker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services/ringBuffer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/services-branch-hardening.test.ts",["44611"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-affinity-generic-7274.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-manager-sweep.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-manager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-pool-modular.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-pool-rest-api.test.ts",["44612","44613","44614"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/session-pool.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings/authz-bypass.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings/probe-8950-set-password.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-cas-7784.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-i18n-keys.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-route-password.test.ts",["44615","44616","44617"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-schema-routing-strategies.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-transform-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/settings-ui-layout-static.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/setup-open-code-win32-shell.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/analytics-recharts-lazy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/basePath.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/basePathFetch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/components/AutoRoutingBanner.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/components/KiroAuthModal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/components/ProxyConfigModal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/machineId.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared/structuredLogger-raw-write-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared-api-utils.test.ts",["44618","44619","44620","44621","44622","44623","44624","44625"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared-clipboard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/shared-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-back-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-cli-renames.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-costs-quota-plans.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-costs-section.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-customization.test.ts",["44626","44627","44628","44629","44630","44631","44632","44633","44634","44635","44636"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-icon-accents-3812.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-monitoring-reorg.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-prefetch-policy-8281.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-quota-share-placement.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-route-match.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-search-filter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-tools-group.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sidebar-visibility.test.ts",["44637"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/signature-cache-bypass.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/signature-cache.test.ts",["44638"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/silent-sse-close-7699.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/siliconflow-model-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/siliconflow-registry-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-builtins-sandbox.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-collect-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-injection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-interception.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-provider-setting.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-routes-error-sanitization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-routes.test.ts",["44639","44640","44641","44642","44643","44644","44645","44646","44647"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-schemas.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skills-skillssh.test.ts",["44648","44649","44650","44651","44652","44653","44654"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/skip-provider-breaker-consumer-2743.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sliding-window-limiter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/small-vps-docs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/socks-connector-family.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/socks-handshake-timeout-5109.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/socks5-default-on.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sonar-quality-gate-fixes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/source-scanner-guards.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/spark-openai-compatible-endpoint-7942.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/specialty-model-catalog-routes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/specificity-rules.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/speechmatics-transcription-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/spend-batch-writer.test.ts",["44655"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sqlite-repair-discoverability-3476.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sqljs-build-warning-8135.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sre-oncall-rotation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sre-redact-logs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sre-tcp-close-analyzer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-auth-antigravity-credits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-auth-resource-404.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-auth.test.ts",["44656","44657","44658","44659","44660","44661","44662","44663","44664","44665","44666","44667","44668"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-error-passthrough-3324.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-finish-reason-synthesis-7800.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-heartbeat-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-heartbeat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-nonstream-accept-5305.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-parser-numeric-ids.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-parser.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sse-shim-contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sseHeartbeat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sseTextTransform.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/standalone-server-ws-keepalive-timeout-7003.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/start-ws-server-cwd-4055.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/startup-stale-cooldown-recovery.test.ts",["44669"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/static-constants-public-surface.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/static-models-venice-web-6269.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stepfun-mono-fallback-and-sidebar-hydration-7743.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sticky-affinity-failover-6219.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stmt-cache-lru.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-continuation-wiring.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-continuation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-early-eof-affinity-8928.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-early-eof-breaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-early-eof-retry-3758.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-failure-499-classification.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-handler-catch-logging-8143.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-handler-client-disconnect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-helpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-non-json-sse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-numeric-ids.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-onfailure-callback-logging.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-options-nonstreaming-3884.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-payload-collector.test.ts",["44670","44671"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-prompt-tokens-zero-upstream.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-readiness-policy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-readiness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-recovery.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-request-body-size-mark-7045.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-strip-responses-lifecycle-echo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-utilities.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/stream-utils.test.ts",["44672","44673","44674","44675","44676","44677","44678","44679","44680","44681","44682","44683","44684","44685"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streamHelpers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streaming-empty-content-block-1382.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streaming-reasoning-dedup-5786.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streamingPiiInitialization.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/streamingPiiTransform.test.ts",["44686","44687","44688","44689","44690","44691","44692","44693","44694","44695","44696","44697","44698","44699","44700","44701","44702","44703"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/strict-random-deck.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/strip-reasoning-blobs-agentic-context-1599.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/strip-reasoning-header.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/structured-logger-dedup-bound.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/suggested-models-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sumopod-x5lab-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/supervisor-policy-4425.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sweep-stale-fragments.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-bundle.test.ts",["44704","44705"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-env-bundled-require-5006.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-env.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-models-degraded-local-catalog-5460-5465.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-next-cycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-reasoning-supported-efforts-7694.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-routes.test.ts",["44706","44707","44708","44709","44710"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-search-to-url-8624.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/sync-wiki.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/synced-capability-warmup-8697.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/synced-model-delete-persist-3199.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/synced-model-hide-persist-3782.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/synthetic-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-prompt.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-role-extraction.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-transforms.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-trust-test-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-version-cache-8278.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/system-version-check-4100.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t06-schema-hardening.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t07-no-log-key-config.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t08-allowed-connections.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t08-mcp-scope-enforcement.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t09-a2a-lifecycle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t12-pricing-updates.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t13-stale-quota-display.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t14-proxy-fast-fail.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t16-gemini-enum-type-string.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t19-codex-responses-empty-content.test.ts",["44711","44712","44713","44714"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t23-t24-fallback-resilience.test.ts",["44715"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t25-provider-validation-modelid-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t26-ai-sdk-accept-header-compat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t27-github-copilot-response-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t28-model-catalog-updates.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t29-vertex-sa-json-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t3-chat-web-credentials.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t3-chat-web.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t30-kiro-400-model-unavailable.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t31-t33-t34-t38-model-specs.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t3chat-web-cookie-hint-5465.test.ts",["44716"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t40-opencode-cli-tools-integration.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t42-image-size-to-aspect-ratio.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t43-gemini-tool-call-no-thought-signature.test.ts",["44717","44718","44719","44720"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/t44-antigravity-thought-signature-preserved.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tag-routing.test.ts",["44721"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tailscale-authkey.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tailscaleTunnel.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/task-fitness-missing-table-8603.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/task-router-auto-intent-8602.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/task-routing-config-restore-8601.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/telemetry-auto-cleanup-6848.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/telemetry-summary-route.test.ts",["44722"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/termux-android-cache-dir.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/termux-android-playwright-static-import-7265.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-all-model-status.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-all-results-i18n.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-masking-release-scale.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-process-detection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-scoped-selection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/test-serial-quarantine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/textual-toolcall-sanitizer-false-positive.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-body-double-read-3296.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-context-length-4184.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-model-refresh-5181.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-provider-proxy.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/theoldllm-request-token-3491.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/think-close-marker-responses-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/think-close-marker-suppress-5245.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/think-tag-parser.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget-boot-wiring-5312.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget-globalthis-5312.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget-groq-3258.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget-hydration-5312.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thinking-budget.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/thundering-herd.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tier-config-provider-override-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tier-coverage-widget-provider-override.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tier-resolver-provider-override.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tiktoken-counter.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-client-download-dir-8579.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-client-node-docker-binary-7802.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-client-proxy-fail-closed.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-options.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tls-profiles-valid-5591.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tlsClient-circuit-breaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-accounting-input-fix.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check-circuit-breaker.test.ts",["44723","44724","44725"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check-devin-cli-8407.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check-sweep.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check-tickms-defined.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-check.test.ts",["44726","44727","44728","44729","44730","44731","44732","44733","44734","44735"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-health-no-refresh-token-expired-5326.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-limits.test.ts",["44736"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-cas-guard-4038.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-cas-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-circuit-breaker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-race-comprehensive.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-rotation-map.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-route-service.test.ts",["44737","44738","44739","44740","44741","44742","44743","44744","44745","44746"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/token-refresh-service.test.ts",["44747","44748","44749","44750","44751","44752","44753","44754","44755","44756","44757","44758","44759","44760","44761","44762","44763"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tokenExtractionConfig.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tokenHealthCheck-batchSize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tokenHealthCheck-transient.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-call-arguments.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-latency-tracker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-limit-detector.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-name-case-preserve-4307.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-request-sanitization.test.ts",["44764","44765","44766","44767","44768","44769","44770","44771","44772","44773","44774","44775"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-schema-sanitizer.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-search-filtered-responses-to-chat-7532.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tool-source-diagnostics.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tools-filter-anthropic-format.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tooltip-portal-behavior.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-active-requests-3507.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-connection-health.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-filtering-and-click.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-label-3198.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/topology-request-lifecycle-emit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-build-native.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-ca-trust.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-capture-api.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-capture-manager.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-capture-mode.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-commands.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-dynamic-cert.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-setup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-tls-capture.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tproxy-transparent-socket.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/trae-executor.test.ts",["44776","44777","44778","44779","44780","44781","44782"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/trae-publiccred.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/traffic-filter-live.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/transform-stream-hwm.test.ts",["44783","44784","44785","44786","44787"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-ai-sdk-image-parts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-antigravity-to-openai.test.ts",["44788","44789","44790","44791"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-helper-thinking.test.ts",["44792","44793","44794","44795","44796","44797","44798","44799","44800","44801","44802","44803","44804","44805","44806","44807","44808","44809","44810","44811","44812"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-to-gemini.test.ts",["44813","44814","44815","44816","44817","44818","44819","44820","44821","44822","44823","44824","44825","44826","44827"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-to-openai-orphan-tool-4385.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-to-openai-strip-billing-header.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-claude-to-openai.test.ts",["44828"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-format-detection-2949.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-advanced-section.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-compression.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-concept-card.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-deeplink.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-i18n-keys.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-integration.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-monitor-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-page-client.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-pipeline-view.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-raw-json-panel.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-result-narrated.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-session.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-simple-controls.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-stream-transformer.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-test-bench.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-friendly-translate-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-audio-input.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-consecutive-role-2191.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-schema-pattern-property.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-thinking-budget-6943.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-gemini-to-openai.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-helper-branches.test.ts",["44829","44830","44831","44832","44833","44834","44835","44836","44837","44838","44839","44840","44841","44842","44843","44844","44845","44846","44847","44848","44849","44850","44851","44852","44853"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-helper-tool-description-coercion.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-json-util.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-mistral-strip-echo-fields.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-responses-custom-tool-1007.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-responses-empty-input-419.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-responses-image-output-8459.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-responses-req.test.ts",["44854","44855","44856","44857","44858","44859","44860","44861","44862","44863","44864","44865","44866","44867","44868","44869","44870","44871","44872","44873","44874","44875","44876","44877","44878","44879","44880","44881","44882","44883","44884","44885","44886","44887","44888","44889","44890","44891","44892","44893","44894","44895","44896","44897","44898","44899","44900","44901","44902","44903","44904","44905","44906","44907","44908","44909","44910","44911","44912","44913","44914","44915","44916","44917","44918","44919","44920","44921","44922","44923","44924","44925","44926","44927","44928","44929"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-claude-empty-reasoning.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-claude.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-cursor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-gemini-defaults.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-gemini-sse.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-gemini.test.ts",["44930","44931","44932","44933","44934","44935","44936","44937","44938","44939","44940","44941","44942","44943","44944","44945","44946","44947","44948","44949","44950","44951","44952","44953","44954","44955","44956","44957","44958","44959","44960","44961","44962","44963","44964","44965","44966","44967","44968","44969","44970","44971","44972","44973","44974","44975","44976","44977","44978","44979","44980","44981","44982","44983","44984","44985","44986","44987","44988","44989","44990","44991","44992","44993","44994","44995","44996","44997","44998","44999","45000","45001","45002","45003"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-openai-to-kiro.test.ts",["45004","45005","45006","45007","45008","45009","45010","45011","45012","45013","45014","45015","45016","45017","45018","45019","45020"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-redacted-thinking-model-aware-4479.test.ts",["45021","45022","45023","45024","45025","45026"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-request-openai-responses.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-antigravity-thinking-boundary.test.ts",["45027","45028","45029","45030","45031","45032"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-claude-to-openai.test.ts",["45033","45034","45035","45036","45037","45038","45039","45040","45041","45042","45043","45044","45045","45046","45047","45048","45049"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-cursor-to-openai.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-empty-string-tool-arg.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-gemini-to-claude.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-gemini-to-openai.test.ts",["45050","45051","45052","45053","45054","45055","45056","45057","45058","45059","45060","45061","45062","45063","45064","45065","45066","45067","45068","45069","45070","45071","45072","45073","45074","45075","45076","45077","45078","45079","45080","45081","45082","45083","45084","45085","45086","45087","45088","45089","45090","45091","45092","45093","45094","45095","45096","45097","45098","45099","45100","45101","45102","45103","45104","45105","45106","45107","45108","45109","45110","45111","45112","45113","45114","45115","45116","45117","45118","45119","45120","45121","45122","45123","45124"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-kiro-to-openai.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-responses-completed-synthesis.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-responses-namespace-identity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-responses-roundtrip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-responses.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-to-antigravity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-to-claude.test.ts",["45125","45126","45127","45128","45129","45130","45131","45132","45133","45134","45135","45136","45137","45138"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-resp-openai-to-gemini.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-same-format-null-flush.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-stream-transform.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-strip-client-metadata-1157.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-thinking-provider-compat-2043.test.ts",["45139","45140","45141","45142","45143","45144","45145","45146","45147","45148","45149","45150"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-tool-call-shim.test.ts",["45151","45152","45153","45154"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-toolcall-helper.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-tools-anthropic-shape.test.ts",["45155","45156","45157","45158","45159","45160","45161","45162","45163"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/translator-xiaomi-mimo-reasoning-replay-1321.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tray-kill-orphan-pid.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tray-systray-loader-4605.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/triage-bugs-2026-08-02.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tryBackedChat.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ts7-executor-override-signatures.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ts7-executor-result-contract.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ts7-executor-shared-shapes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ts7-open-sse-type-fixes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tsconfig-ts7-readiness.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/tsx-runtime-transform-5757.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/turbopack-cache-heal-6289.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/turkishText.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/types-barrel-model-cooldown.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/AcpAgentsPage.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/AntigravityToolCard-model-aliases.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ClaudeClassifierCompatToggle.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ClaudeToolCard-manual-config-fallback.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliAgentsPage.test.tsx",[],["45164"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliCodePage.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliComparisonCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliConceptCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CliToolCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CompressionHub-patch-only.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/CoolingConnectionsPanel.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/HermesAgentToolCard-model-aliases.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/LocaleAutoDetect-refresh.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/OpenClawToolCard-manual-config-fallback.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ProviderIcon-icon-url.test.tsx",[],["45165"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ProxyRegistryManager-tdz-render.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ToolDetailClient.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/activity-page-redirect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/add-api-key-modal-free-models.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/add-api-key-modal-unsupported-save-5565.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/add-api-key-modal-validation-error-5088.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/agent-bridge-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/agent-bridge-server-card-a11y.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/agent-card-risk-modal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/agent-card.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/allocation-table.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/authz-cors-banner.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/burn-rate-chart.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/bypass-list-editor.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/cache-settings-tab-bounds-8219.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/cli-agents-detail-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/cli-code-detail-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/cli-tools-no-mitm-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-compression-mode-select.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-defaults-fusion-5598.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-form-deselect-handler.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-form-select-all-handlers.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combo-response-validation-editor.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/comboFlowModel-breakers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/comboFlowModel-cooldown.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/comboFlowModel.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/comboLiveStudio.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combos-error-boundary.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/combos-page-smoke.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compareView.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compatible-provider-apikey-setup.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compliance-tab-actor-filter.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-combos-routing-mode-6760.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-exclusions-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-guidance-7530.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-log-namespace.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-pipeline-editor.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-replay-reducer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-replay-speed.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-settings-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compression-settings-tab-consolidation.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionAnnotation.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionCockpit.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionFlowModel.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionHub-active-selector.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionHub-context-editing.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionHub.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionPanel.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionStylesPanel.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionStylesTile.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/compressionUltraTier.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/confirm-delete-connection-7361.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/connection-row-proxy-name-7643.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/connection-row-token-badge-5836.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/connectionsSearchFilter.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/conversation-tab-separators.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/conversation-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/costs-toplistcard-legacy-free-label-7272.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/dashboard-csrf-fetch.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/diffPane.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/edgeStyles.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/edit-connection-modal-free-models.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/edit-memory-modal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/embedding-source-selector.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engine-pages.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engine-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engineConfigForm.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engineConfigPage.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/engineNode.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/evals-tab-smoke.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/fidelityGateToggle.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/fleetAggregation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/flowCanvas.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/free-budget-card.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/free-pool-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/free-provider-rankings-page-authtype-6915.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/fuzzyDedupToggle.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/grok-device-oauth-modal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/hermes-agent-config-loop.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/hermes-agent-opencode-free.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/highlightableProviderCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/historic-session-banner.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-page-client-dashboard-smoke-4615.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-provider-topology-section-4606.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-topology-hidden-4596.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-topology-last-used-node-color.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-update-error-render-5991.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/home-update-step-warning-color-amber.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/ionizerLane.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/issue-7845-log-detail-structured-error.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/kimiComboPresetCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/kimiSponsorBanner.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/live-compression-accumulate.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/livePage.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/lobe-provider-icons-stepfun.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/logs-page-detail-modal-reopen-on-close.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/markdown-message.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/memories-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/memory-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/mitm-proxy-error-boundary.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/mitm-proxy-moved-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-alias-edit.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-field-6540.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-connection-filter.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-deselect.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-hidden-models-7156.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-keep-open.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-select-all.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-select-modal-zero-config.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/model-visibility-toolbar-free.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/namedCombos-active-badge.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/noauth-account-card.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/oauth-callback-postmessage-scope.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/omniglyphContextPage.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/onboarding-public-endpoint.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/open-sse-alias.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playView.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-api-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-build-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-chat-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-compare-column.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-compare-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-config-pane.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-export-modal.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-improve-prompt-button.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-model-search-4086.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-preset-picker.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-structured-output-editor.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-studio.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-token-cost-counter.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/playground-tools-builder.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/pool-card.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/previewToRunModel.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/provider-breaker-health-hook.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/provider-quota-widget-auto-refresh-label-4611.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerCardHandle.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerCardKimiPartnerAccent.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerCascadeNode.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerIconKimiLogomark.test.tsx",[],["45166"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerPageHeaderKimiPartnerLink.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/providerPageHighlightLogic.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/proxy-config-modal-saved-sort-default-7643.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/qdrant-config-card.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quantumLockBadge.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quick-start-api-keys-link-5695.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quota-cutoff-modal-draft-reset-7889.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quota-share-delete-error.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/quota-share-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/request-logger-autorefresh-visibility-3972.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/rerank-config-card.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/riskGateBadge.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/rtkLearnDiscoverCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/rtkTomlImportCard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/rtl-logical-classes.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/runtime-page-client.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/saliencyHeatmap.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/same-context-filter.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-compare-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-concept-card.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-provider-catalog.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-scrape-result.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-scrape-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-search-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/search-tools-studio.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/session-recorder-bar.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/setup-wizard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/sidebar-engine-items.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/sidebar-proxy-expansion.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/stacked-allocation-bar.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/stats-tab.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/status-dot.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/studio-pages.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/studioTabs.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/system-storage-manual-vacuum.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/timeline-page-detail-deeplink.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/timing-i18n.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/toonEncoderTable.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/traffic-inspector-page.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-improve-prompt.test.tsx",[],["45167"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-local-storage-pool-migration.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-model-visibility-handlers-test-all.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-pools-usage-aggregate.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-presets.test.tsx",[],["45168"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-resizable-panels.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-session-recorder.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-stream-metrics.test.tsx",[],["45169"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-structured-output.test.tsx",[],["45170"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-system-proxy-exit-guard.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-tools-builder.test.tsx",[],["45171"],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-traffic-stream.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-virtual-list.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/usePreviewCompression.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/useToolBatchStatuses.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/waterfallInspector.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/web-session-cookie-modal-size-6265.test.tsx",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui-value-drift-cosmetic.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/universal-handoff.test.ts",["45172","45173","45174","45175","45176","45177","45178","45179","45180","45181","45182","45183","45184","45185","45186","45187"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/unorouter-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-ca-test-route-3488.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-error-passthrough.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-headers-sanitize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-response-headers-strip.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-retry-hints-toggle.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/upstream-timeout-model-override.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/url-sanitize.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage/usageHistoryDedup.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-account-analytics-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-account-identity.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-analytics-model-dedup-7535.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-analytics-provider-display-name-7534.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-analytics-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-analytics.test.ts",["45188","45189","45190","45191","45192"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-antigravity-family-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-bailian-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-cache-health-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-cache-health.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-crof-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-deepseek-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-endpoint-dimension.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-events.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-extractor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-families-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-github-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-glm-family-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-history-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-history-reset.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-migrations-legacy-archive-safety.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-migrations.test.ts",["45193","45194","45195","45196","45197","45198","45199","45200","45201","45202","45203","45204","45205","45206","45207","45208","45209"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-minimax-family-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-nanogpt-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-opencode-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-pending-sweep.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-providers.test.ts",["45210","45211","45212"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-qoder-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-quota-core-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-quota-row-visibility.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-scalars-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-service-antigravity-credits.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-service-deepseek.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-service-hardening.test.ts",["45213","45214","45215","45216","45217","45218","45219","45220","45221","45222","45223","45224","45225","45226","45227","45228","45229","45230","45231","45232","45233","45234","45235","45236","45237","45238","45239","45240","45241","45242","45243","45244","45245","45246","45247","45248","45249","45250","45251","45252","45253","45254","45255","45256","45257","45258","45259","45260","45261","45262","45263","45264","45265","45266","45267","45268"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-token-buffer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-utils.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-vertex-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-xai-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usage-xiaomi-mimo-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/usagehistory-helpers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/useApiKey.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v0-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-chat-completions-content-type-6414.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-combos-projection.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-completions-model-header-match-6426.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-aliases-included.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-auth-leak-9320.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-by-id-4674.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-catalog-generation-race.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-catalog-ttl.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-concurrent-6408.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-models-discovery-conformance.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-ws-bridge.test.ts",["45269","45270"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1-ws-route.test.ts",["45271","45272","45273","45274"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1beta-gemini-tool-calling-6222.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v1beta-models-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v388-phase1-screen-fixes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v388-phase3-memory.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v388-phase4-playground.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/v388-quota-share-usage-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validate-release-green.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validate-response-quality.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-audio-misc-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-badge-unsupported-5442.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-cloud-providers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-format-validators-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-helpers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-kiro-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-search-embedding-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-specialty-inline-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-web-cookie-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/validation-web-providers-split.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/veoaifree-video-route.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/veoaifree-web-executor.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/verbosity-prompt-cache-key-provider-gate-7533.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vercel-ai-gateway-media.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vercel-deploy-relay-path-ssrf.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vercel-deploy-sso-protection-check.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vercel-gateway-models-fetch-4249.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/verify-published.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/verify-ratchet-bank.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/version-compare-client-safe.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/version-manager-request.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/version-manager.test.ts",["45275"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/versionManager-orchestrator.test.ts",["45276","45277"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-express-apikey.test.ts",["45278","45279"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-functioncall-id-3440.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-media.test.ts",["45280","45281","45282"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-oauth-scopes.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-spend-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vertex-tts.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/video-deepinfra-6653.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/video-generation-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/video-novita-6658.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/video-xai-grok-imagine.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/virtual-auto-combo.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-cc-no-reroute.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-env-override.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-policy-reroute-6640.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-preserve-on-failure-4012.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-bridge-settings-schema.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-compression-authoritative-capability-7237.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-detection-consistency.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vision-models-cc-fragments.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/visionBridgeDefaults.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vnc-session.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vps-runner-variable-scope.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-context-sanitizer.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-responses-models.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-shared-metadata.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-token-in-url-warning.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-token-routes-gpt56.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-token-routes-responses-listing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-token-routes.test.ts",["45283","45284","45285","45286","45287","45288","45289","45290","45291","45292","45293","45294","45295","45296","45297","45298","45299","45300","45301","45302","45303","45304","45305","45306","45307","45308","45309","45310","45311","45312","45313","45314","45315","45316","45317","45318","45319","45320","45321","45322","45323","45324","45325","45326","45327","45328","45329","45330","45331","45332","45333","45334","45335","45336","45337","45338","45339","45340","45341","45342","45343","45344","45345","45346","45347"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/vscode-tokenized-request.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/wafRateLimit.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/waitForServer-tcp-fallback-6800.test.mjs",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-auth.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-providers-new.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-validation-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-validation-false-positive-7857.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-cookie-validation-proxy-7058.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-fetch-dispatch.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-fetch-handler.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-fetch-interception.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-fetch-quota-fallback.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-runtime-env.test.ts",["45348"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-search-fallback-format.test.ts",["45349"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-search-tool-routing-4481.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-session-credentials.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-session-dedup-3368.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-session-pool-health.test.ts",["45350","45351"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-session-provider-link-6316.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-tools-translation-2820.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-tools-translation-3260.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/web-tools-translation.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webdav-server-3485.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-abort-timer-cleanup.test.ts",["45352","45353","45354","45355","45356"],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-deliveries-db.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-discord-dispatcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-dispatcher-routing.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-edit-wizard-regression.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-event-descriptions.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-metadata-guard-3269.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-private-optin-3269.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-slack-dispatcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-ssrf-guard.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webhook-telegram-dispatcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/webshare-sync.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/wildcard-alias-settings-not-applied-7693.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/wildcard-router.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/windows-cert-identity-7275.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/windows-hide-child-process-spawns-8131.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/windows-process-stop-8045.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/windsurf-devin-executors.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/workflows-no-foreign-fork-publishers.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-agent-tools-passthrough.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-exact-cost-2453.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-oauth-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-oauth-quota-fetcher.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-oauth-test-supported.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-oauth-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-translators.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xai-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xiaomi-mimo-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xiaomi-mimo-selftrack-usage.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/xiaomi-providers-registry.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-catalog-glm52.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-execution-credentials-target-format-7364.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-glm-max-tokens-clamp-7364.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-glm-target-format-override.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-validator.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-web-chat-endpoint-8014-probe.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zai-web-models-discovery-7678.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-docker-detect.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-hosted-think-close-marker.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-import-utils.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-oauth-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zed-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zenmux-free-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zenmux-models-fetch-4202.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/zenmux-provider.test.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/vitest.config.ts",[],[],"/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/vitest.mcp.config.ts",[],[],{"ruleId":"45357","severity":2,"message":"45358","line":383,"column":39,"nodeType":"45359","messageId":"45360","endLine":383,"endColumn":42,"suggestions":"45361"},{"ruleId":"45357","severity":2,"message":"45358","line":386,"column":11,"nodeType":"45359","messageId":"45360","endLine":386,"endColumn":14,"suggestions":"45362"},{"ruleId":"45357","severity":2,"message":"45358","line":238,"column":42,"nodeType":"45359","messageId":"45360","endLine":238,"endColumn":45,"suggestions":"45363"},{"ruleId":"45357","severity":2,"message":"45358","line":244,"column":39,"nodeType":"45359","messageId":"45360","endLine":244,"endColumn":42,"suggestions":"45364"},{"ruleId":"45357","severity":2,"message":"45358","line":280,"column":34,"nodeType":"45359","messageId":"45360","endLine":280,"endColumn":37,"suggestions":"45365"},{"ruleId":"45357","severity":2,"message":"45358","line":281,"column":34,"nodeType":"45359","messageId":"45360","endLine":281,"endColumn":37,"suggestions":"45366"},{"ruleId":"45357","severity":2,"message":"45358","line":282,"column":34,"nodeType":"45359","messageId":"45360","endLine":282,"endColumn":37,"suggestions":"45367"},{"ruleId":"45357","severity":2,"message":"45358","line":332,"column":55,"nodeType":"45359","messageId":"45360","endLine":332,"endColumn":58,"suggestions":"45368"},{"ruleId":"45357","severity":2,"message":"45358","line":393,"column":36,"nodeType":"45359","messageId":"45360","endLine":393,"endColumn":39,"suggestions":"45369"},{"ruleId":"45357","severity":2,"message":"45358","line":399,"column":33,"nodeType":"45359","messageId":"45360","endLine":399,"endColumn":36,"suggestions":"45370"},{"ruleId":"45357","severity":2,"message":"45358","line":472,"column":49,"nodeType":"45359","messageId":"45360","endLine":472,"endColumn":52,"suggestions":"45371"},{"ruleId":"45357","severity":2,"message":"45358","line":493,"column":24,"nodeType":"45359","messageId":"45360","endLine":493,"endColumn":27,"suggestions":"45372"},{"ruleId":"45357","severity":2,"message":"45358","line":494,"column":22,"nodeType":"45359","messageId":"45360","endLine":494,"endColumn":25,"suggestions":"45373"},{"ruleId":"45357","severity":2,"message":"45358","line":495,"column":19,"nodeType":"45359","messageId":"45360","endLine":495,"endColumn":22,"suggestions":"45374"},{"ruleId":"45357","severity":2,"message":"45358","line":449,"column":18,"nodeType":"45359","messageId":"45360","endLine":449,"endColumn":21,"suggestions":"45375"},{"ruleId":"45357","severity":2,"message":"45358","line":482,"column":42,"nodeType":"45359","messageId":"45360","endLine":482,"endColumn":45,"suggestions":"45376"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":47,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":50,"suggestions":"45377"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":56,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":59,"suggestions":"45378"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":55,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":58,"suggestions":"45379"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":78,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":81,"suggestions":"45380"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":41,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":44,"suggestions":"45381"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":76,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":79,"suggestions":"45382"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":82,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":85,"suggestions":"45383"},{"ruleId":"45357","severity":2,"message":"45358","line":214,"column":61,"nodeType":"45359","messageId":"45360","endLine":214,"endColumn":64,"suggestions":"45384"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":47,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":50,"suggestions":"45385"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":53,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":56,"suggestions":"45386"},{"ruleId":"45357","severity":2,"message":"45358","line":236,"column":19,"nodeType":"45359","messageId":"45360","endLine":236,"endColumn":22,"suggestions":"45387"},{"ruleId":"45357","severity":2,"message":"45358","line":251,"column":22,"nodeType":"45359","messageId":"45360","endLine":251,"endColumn":25,"suggestions":"45388"},{"ruleId":"45357","severity":2,"message":"45358","line":264,"column":42,"nodeType":"45359","messageId":"45360","endLine":264,"endColumn":45,"suggestions":"45389"},{"ruleId":"45357","severity":2,"message":"45358","line":264,"column":48,"nodeType":"45359","messageId":"45360","endLine":264,"endColumn":51,"suggestions":"45390"},{"ruleId":"45357","severity":2,"message":"45358","line":327,"column":11,"nodeType":"45359","messageId":"45360","endLine":327,"endColumn":14,"suggestions":"45391"},{"ruleId":"45357","severity":2,"message":"45358","line":330,"column":6,"nodeType":"45359","messageId":"45360","endLine":330,"endColumn":9,"suggestions":"45392"},{"ruleId":"45357","severity":2,"message":"45358","line":19,"column":29,"nodeType":"45359","messageId":"45360","endLine":19,"endColumn":32,"suggestions":"45393"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":41,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":44,"suggestions":"45394"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":77,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":80,"suggestions":"45395"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":83,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":86,"suggestions":"45396"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":19,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":22,"suggestions":"45397"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":24,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":27,"suggestions":"45398"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":24,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":27,"suggestions":"45399"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":29,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":32,"suggestions":"45400"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":41,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":44,"suggestions":"45401"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":78,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":81,"suggestions":"45402"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":84,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":87,"suggestions":"45403"},{"ruleId":"45357","severity":2,"message":"45358","line":241,"column":23,"nodeType":"45359","messageId":"45360","endLine":241,"endColumn":26,"suggestions":"45404"},{"ruleId":"45357","severity":2,"message":"45358","line":241,"column":64,"nodeType":"45359","messageId":"45360","endLine":241,"endColumn":67,"suggestions":"45405"},{"ruleId":"45357","severity":2,"message":"45358","line":242,"column":23,"nodeType":"45359","messageId":"45360","endLine":242,"endColumn":26,"suggestions":"45406"},{"ruleId":"45357","severity":2,"message":"45358","line":242,"column":65,"nodeType":"45359","messageId":"45360","endLine":242,"endColumn":68,"suggestions":"45407"},{"ruleId":"45357","severity":2,"message":"45358","line":243,"column":23,"nodeType":"45359","messageId":"45360","endLine":243,"endColumn":26,"suggestions":"45408"},{"ruleId":"45357","severity":2,"message":"45358","line":243,"column":67,"nodeType":"45359","messageId":"45360","endLine":243,"endColumn":70,"suggestions":"45409"},{"ruleId":"45357","severity":2,"message":"45358","line":246,"column":22,"nodeType":"45359","messageId":"45360","endLine":246,"endColumn":25,"suggestions":"45410"},{"ruleId":"45357","severity":2,"message":"45358","line":258,"column":40,"nodeType":"45359","messageId":"45360","endLine":258,"endColumn":43,"suggestions":"45411"},{"ruleId":"45357","severity":2,"message":"45358","line":258,"column":78,"nodeType":"45359","messageId":"45360","endLine":258,"endColumn":81,"suggestions":"45412"},{"ruleId":"45357","severity":2,"message":"45358","line":265,"column":21,"nodeType":"45359","messageId":"45360","endLine":265,"endColumn":24,"suggestions":"45413"},{"ruleId":"45357","severity":2,"message":"45358","line":436,"column":62,"nodeType":"45359","messageId":"45360","endLine":436,"endColumn":65,"suggestions":"45414"},{"ruleId":"45357","severity":2,"message":"45358","line":158,"column":21,"nodeType":"45359","messageId":"45360","endLine":158,"endColumn":24,"suggestions":"45415"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":71,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":74,"suggestions":"45416"},{"ruleId":"45357","severity":2,"message":"45358","line":198,"column":29,"nodeType":"45359","messageId":"45360","endLine":198,"endColumn":32,"suggestions":"45417"},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":266,"column":1,"nodeType":"45420","messageId":"45421","endLine":266,"endColumn":98},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":19,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":22,"suggestions":"45422"},{"ruleId":"45423","severity":2,"message":"45424","line":70,"column":1,"nodeType":"45425","messageId":"45426","endLine":72,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":24,"column":1,"nodeType":"45425","messageId":"45426","endLine":32,"endColumn":2},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":31,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":34,"suggestions":"45427"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":41,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":44,"suggestions":"45428"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":9,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":12,"suggestions":"45429"},{"ruleId":"45357","severity":2,"message":"45358","line":169,"column":9,"nodeType":"45359","messageId":"45360","endLine":169,"endColumn":12,"suggestions":"45430"},{"ruleId":"45357","severity":2,"message":"45358","line":177,"column":36,"nodeType":"45359","messageId":"45360","endLine":177,"endColumn":39,"suggestions":"45431"},{"ruleId":"45357","severity":2,"message":"45358","line":201,"column":9,"nodeType":"45359","messageId":"45360","endLine":201,"endColumn":12,"suggestions":"45432"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":36,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":39,"suggestions":"45433"},{"ruleId":"45357","severity":2,"message":"45358","line":629,"column":9,"nodeType":"45359","messageId":"45360","endLine":629,"endColumn":12,"suggestions":"45434"},{"ruleId":"45357","severity":2,"message":"45358","line":637,"column":36,"nodeType":"45359","messageId":"45360","endLine":637,"endColumn":39,"suggestions":"45435"},{"ruleId":"45357","severity":2,"message":"45358","line":654,"column":9,"nodeType":"45359","messageId":"45360","endLine":654,"endColumn":12,"suggestions":"45436"},{"ruleId":"45357","severity":2,"message":"45358","line":662,"column":36,"nodeType":"45359","messageId":"45360","endLine":662,"endColumn":39,"suggestions":"45437"},{"ruleId":"45357","severity":2,"message":"45358","line":685,"column":9,"nodeType":"45359","messageId":"45360","endLine":685,"endColumn":12,"suggestions":"45438"},{"ruleId":"45357","severity":2,"message":"45358","line":693,"column":36,"nodeType":"45359","messageId":"45360","endLine":693,"endColumn":39,"suggestions":"45439"},{"ruleId":"45357","severity":2,"message":"45358","line":713,"column":9,"nodeType":"45359","messageId":"45360","endLine":713,"endColumn":12,"suggestions":"45440"},{"ruleId":"45357","severity":2,"message":"45358","line":719,"column":36,"nodeType":"45359","messageId":"45360","endLine":719,"endColumn":39,"suggestions":"45441"},{"ruleId":"45357","severity":2,"message":"45358","line":748,"column":9,"nodeType":"45359","messageId":"45360","endLine":748,"endColumn":12,"suggestions":"45442"},{"ruleId":"45357","severity":2,"message":"45358","line":754,"column":36,"nodeType":"45359","messageId":"45360","endLine":754,"endColumn":39,"suggestions":"45443"},{"ruleId":"45357","severity":2,"message":"45358","line":775,"column":9,"nodeType":"45359","messageId":"45360","endLine":775,"endColumn":12,"suggestions":"45444"},{"ruleId":"45357","severity":2,"message":"45358","line":786,"column":36,"nodeType":"45359","messageId":"45360","endLine":786,"endColumn":39,"suggestions":"45445"},{"ruleId":"45357","severity":2,"message":"45358","line":817,"column":9,"nodeType":"45359","messageId":"45360","endLine":817,"endColumn":12,"suggestions":"45446"},{"ruleId":"45357","severity":2,"message":"45358","line":828,"column":36,"nodeType":"45359","messageId":"45360","endLine":828,"endColumn":39,"suggestions":"45447"},{"ruleId":"45357","severity":2,"message":"45358","line":867,"column":9,"nodeType":"45359","messageId":"45360","endLine":867,"endColumn":12,"suggestions":"45448"},{"ruleId":"45357","severity":2,"message":"45358","line":874,"column":36,"nodeType":"45359","messageId":"45360","endLine":874,"endColumn":39,"suggestions":"45449"},{"ruleId":"45357","severity":2,"message":"45358","line":896,"column":9,"nodeType":"45359","messageId":"45360","endLine":896,"endColumn":12,"suggestions":"45450"},{"ruleId":"45357","severity":2,"message":"45358","line":903,"column":36,"nodeType":"45359","messageId":"45360","endLine":903,"endColumn":39,"suggestions":"45451"},{"ruleId":"45357","severity":2,"message":"45358","line":1030,"column":19,"nodeType":"45359","messageId":"45360","endLine":1030,"endColumn":22,"suggestions":"45452"},{"ruleId":"45357","severity":2,"message":"45358","line":1031,"column":16,"nodeType":"45359","messageId":"45360","endLine":1031,"endColumn":19,"suggestions":"45453"},{"ruleId":"45357","severity":2,"message":"45358","line":1075,"column":9,"nodeType":"45359","messageId":"45360","endLine":1075,"endColumn":12,"suggestions":"45454"},{"ruleId":"45357","severity":2,"message":"45358","line":1128,"column":17,"nodeType":"45359","messageId":"45360","endLine":1128,"endColumn":20,"suggestions":"45455"},{"ruleId":"45357","severity":2,"message":"45358","line":1160,"column":9,"nodeType":"45359","messageId":"45360","endLine":1160,"endColumn":12,"suggestions":"45456"},{"ruleId":"45357","severity":2,"message":"45358","line":1375,"column":31,"nodeType":"45359","messageId":"45360","endLine":1375,"endColumn":34,"suggestions":"45457"},{"ruleId":"45357","severity":2,"message":"45358","line":1377,"column":9,"nodeType":"45359","messageId":"45360","endLine":1377,"endColumn":12,"suggestions":"45458"},{"ruleId":"45357","severity":2,"message":"45358","line":1416,"column":17,"nodeType":"45359","messageId":"45360","endLine":1416,"endColumn":20,"suggestions":"45459"},{"ruleId":"45357","severity":2,"message":"45358","line":1507,"column":17,"nodeType":"45359","messageId":"45360","endLine":1507,"endColumn":20,"suggestions":"45460"},{"ruleId":"45423","severity":2,"message":"45424","line":151,"column":1,"nodeType":"45425","messageId":"45426","endLine":158,"endColumn":2},{"ruleId":"45357","severity":2,"message":"45358","line":206,"column":17,"nodeType":"45359","messageId":"45360","endLine":206,"endColumn":20,"suggestions":"45461"},{"ruleId":"45357","severity":2,"message":"45358","line":9,"column":25,"nodeType":"45359","messageId":"45360","endLine":9,"endColumn":28,"suggestions":"45462"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":9,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":12,"suggestions":"45463"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":19,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":22,"suggestions":"45464"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":17,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":20,"suggestions":"45465"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":16,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":19,"suggestions":"45466"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":12,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":15,"suggestions":"45467"},{"ruleId":"45357","severity":2,"message":"45358","line":17,"column":39,"nodeType":"45359","messageId":"45360","endLine":17,"endColumn":42,"suggestions":"45468"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":34,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":37,"suggestions":"45469"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":35,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":38,"suggestions":"45470"},{"ruleId":"45423","severity":2,"message":"45424","line":195,"column":1,"nodeType":"45425","messageId":"45426","endLine":203,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":166,"column":1,"nodeType":"45425","messageId":"45426","endLine":168,"endColumn":2},{"ruleId":"45357","severity":2,"message":"45358","line":1044,"column":48,"nodeType":"45359","messageId":"45360","endLine":1044,"endColumn":51,"suggestions":"45471"},{"ruleId":"45357","severity":2,"message":"45358","line":1071,"column":47,"nodeType":"45359","messageId":"45360","endLine":1071,"endColumn":50,"suggestions":"45472"},{"ruleId":"45357","severity":2,"message":"45358","line":1175,"column":53,"nodeType":"45359","messageId":"45360","endLine":1175,"endColumn":56,"suggestions":"45473"},{"ruleId":"45423","severity":2,"message":"45424","line":79,"column":1,"nodeType":"45425","messageId":"45426","endLine":87,"endColumn":2},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":51,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":54,"suggestions":"45474"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":63,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":66,"suggestions":"45475"},{"ruleId":"45423","severity":2,"message":"45424","line":66,"column":1,"nodeType":"45425","messageId":"45426","endLine":69,"endColumn":2},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":50,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":53,"suggestions":"45476"},{"ruleId":"45423","severity":2,"message":"45424","line":75,"column":1,"nodeType":"45425","messageId":"45426","endLine":82,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":76,"column":1,"nodeType":"45425","messageId":"45426","endLine":83,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":71},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":19,"endColumn":24},{"ruleId":"45357","severity":2,"message":"45358","line":181,"column":83,"nodeType":"45359","messageId":"45360","endLine":181,"endColumn":86,"suggestions":"45477"},{"ruleId":"45357","severity":2,"message":"45358","line":181,"column":89,"nodeType":"45359","messageId":"45360","endLine":181,"endColumn":92,"suggestions":"45478"},{"ruleId":"45357","severity":2,"message":"45358","line":292,"column":34,"nodeType":"45359","messageId":"45360","endLine":292,"endColumn":37,"suggestions":"45479"},{"ruleId":"45357","severity":2,"message":"45358","line":465,"column":59,"nodeType":"45359","messageId":"45360","endLine":465,"endColumn":62,"suggestions":"45480"},{"ruleId":"45423","severity":2,"message":"45424","line":624,"column":7,"nodeType":"45481","messageId":"45426","endLine":628,"endColumn":2},{"ruleId":"45357","severity":2,"message":"45358","line":645,"column":33,"nodeType":"45359","messageId":"45360","endLine":645,"endColumn":36,"suggestions":"45482"},{"ruleId":"45357","severity":2,"message":"45358","line":645,"column":64,"nodeType":"45359","messageId":"45360","endLine":645,"endColumn":67,"suggestions":"45483"},{"ruleId":"45357","severity":2,"message":"45358","line":663,"column":55,"nodeType":"45359","messageId":"45360","endLine":663,"endColumn":58,"suggestions":"45484"},{"ruleId":"45357","severity":2,"message":"45358","line":700,"column":12,"nodeType":"45359","messageId":"45360","endLine":700,"endColumn":15,"suggestions":"45485"},{"ruleId":"45357","severity":2,"message":"45358","line":701,"column":20,"nodeType":"45359","messageId":"45360","endLine":701,"endColumn":23,"suggestions":"45486"},{"ruleId":"45357","severity":2,"message":"45358","line":781,"column":55,"nodeType":"45359","messageId":"45360","endLine":781,"endColumn":58,"suggestions":"45487"},{"ruleId":"45357","severity":2,"message":"45358","line":823,"column":54,"nodeType":"45359","messageId":"45360","endLine":823,"endColumn":57,"suggestions":"45488"},{"ruleId":"45357","severity":2,"message":"45358","line":823,"column":68,"nodeType":"45359","messageId":"45360","endLine":823,"endColumn":71,"suggestions":"45489"},{"ruleId":"45357","severity":2,"message":"45358","line":844,"column":12,"nodeType":"45359","messageId":"45360","endLine":844,"endColumn":15,"suggestions":"45490"},{"ruleId":"45357","severity":2,"message":"45358","line":845,"column":12,"nodeType":"45359","messageId":"45360","endLine":845,"endColumn":15,"suggestions":"45491"},{"ruleId":"45357","severity":2,"message":"45358","line":846,"column":20,"nodeType":"45359","messageId":"45360","endLine":846,"endColumn":23,"suggestions":"45492"},{"ruleId":"45357","severity":2,"message":"45358","line":875,"column":25,"nodeType":"45359","messageId":"45360","endLine":875,"endColumn":28,"suggestions":"45493"},{"ruleId":"45357","severity":2,"message":"45358","line":879,"column":35,"nodeType":"45359","messageId":"45360","endLine":879,"endColumn":38,"suggestions":"45494"},{"ruleId":"45357","severity":2,"message":"45358","line":17,"column":9,"nodeType":"45359","messageId":"45360","endLine":17,"endColumn":12,"suggestions":"45495"},{"ruleId":"45357","severity":2,"message":"45358","line":161,"column":33,"nodeType":"45359","messageId":"45360","endLine":161,"endColumn":36,"suggestions":"45496"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":12,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":15,"suggestions":"45497"},{"ruleId":"45423","severity":2,"message":"45424","line":275,"column":1,"nodeType":"45425","messageId":"45426","endLine":282,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":33,"column":1,"nodeType":"45425","messageId":"45426","endLine":40,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":22,"column":1,"nodeType":"45420","messageId":"45421","endLine":22,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":22,"column":1,"nodeType":"45420","messageId":"45421","endLine":22,"endColumn":65},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":47,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":50,"suggestions":"45498"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":32,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":35,"suggestions":"45499"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":23,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":26,"suggestions":"45500"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":36,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":39,"suggestions":"45501"},{"ruleId":"45357","severity":2,"message":"45358","line":211,"column":39,"nodeType":"45359","messageId":"45360","endLine":211,"endColumn":42,"suggestions":"45502"},{"ruleId":"45357","severity":2,"message":"45358","line":222,"column":5,"nodeType":"45359","messageId":"45360","endLine":222,"endColumn":8,"suggestions":"45503"},{"ruleId":"45357","severity":2,"message":"45358","line":313,"column":27,"nodeType":"45359","messageId":"45360","endLine":313,"endColumn":30,"suggestions":"45504"},{"ruleId":"45357","severity":2,"message":"45358","line":315,"column":19,"nodeType":"45359","messageId":"45360","endLine":315,"endColumn":22,"suggestions":"45505"},{"ruleId":"45357","severity":2,"message":"45358","line":333,"column":32,"nodeType":"45359","messageId":"45360","endLine":333,"endColumn":35,"suggestions":"45506"},{"ruleId":"45357","severity":2,"message":"45358","line":384,"column":5,"nodeType":"45359","messageId":"45360","endLine":384,"endColumn":8,"suggestions":"45507"},{"ruleId":"45357","severity":2,"message":"45358","line":386,"column":15,"nodeType":"45359","messageId":"45360","endLine":386,"endColumn":18,"suggestions":"45508"},{"ruleId":"45357","severity":2,"message":"45358","line":437,"column":40,"nodeType":"45359","messageId":"45360","endLine":437,"endColumn":43,"suggestions":"45509"},{"ruleId":"45357","severity":2,"message":"45358","line":444,"column":40,"nodeType":"45359","messageId":"45360","endLine":444,"endColumn":43,"suggestions":"45510"},{"ruleId":"45357","severity":2,"message":"45358","line":500,"column":46,"nodeType":"45359","messageId":"45360","endLine":500,"endColumn":49,"suggestions":"45511"},{"ruleId":"45357","severity":2,"message":"45358","line":538,"column":39,"nodeType":"45359","messageId":"45360","endLine":538,"endColumn":42,"suggestions":"45512"},{"ruleId":"45357","severity":2,"message":"45358","line":587,"column":35,"nodeType":"45359","messageId":"45360","endLine":587,"endColumn":38,"suggestions":"45513"},{"ruleId":"45357","severity":2,"message":"45358","line":626,"column":31,"nodeType":"45359","messageId":"45360","endLine":626,"endColumn":34,"suggestions":"45514"},{"ruleId":"45357","severity":2,"message":"45358","line":684,"column":13,"nodeType":"45359","messageId":"45360","endLine":684,"endColumn":16,"suggestions":"45515"},{"ruleId":"45357","severity":2,"message":"45358","line":689,"column":34,"nodeType":"45359","messageId":"45360","endLine":689,"endColumn":37,"suggestions":"45516"},{"ruleId":"45357","severity":2,"message":"45358","line":767,"column":77,"nodeType":"45359","messageId":"45360","endLine":767,"endColumn":80,"suggestions":"45517"},{"ruleId":"45357","severity":2,"message":"45358","line":769,"column":16,"nodeType":"45359","messageId":"45360","endLine":769,"endColumn":19,"suggestions":"45518"},{"ruleId":"45357","severity":2,"message":"45358","line":796,"column":36,"nodeType":"45359","messageId":"45360","endLine":796,"endColumn":39,"suggestions":"45519"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":66,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":69,"suggestions":"45520"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":52,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":55,"suggestions":"45521","suppressions":"45522"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":49,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":52,"suggestions":"45523","suppressions":"45524"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":87,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":90,"suggestions":"45525","suppressions":"45526"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":53,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":56,"suggestions":"45527","suppressions":"45528"},{"ruleId":"45357","severity":2,"message":"45358","line":8,"column":48,"nodeType":"45359","messageId":"45360","endLine":8,"endColumn":51,"suggestions":"45529"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":43,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":46,"suggestions":"45530"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":40,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":43,"suggestions":"45531"},{"ruleId":"45423","severity":2,"message":"45424","line":69,"column":1,"nodeType":"45425","messageId":"45426","endLine":76,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":78,"column":1,"nodeType":"45425","messageId":"45426","endLine":85,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":55,"column":1,"nodeType":"45425","messageId":"45426","endLine":62,"endColumn":2},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":21,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":24,"suggestions":"45532"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":19,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":22,"suggestions":"45533"},{"ruleId":"45418","severity":2,"message":"45419","line":15,"column":1,"nodeType":"45420","messageId":"45421","endLine":15,"endColumn":76},{"ruleId":"45423","severity":2,"message":"45424","line":53,"column":1,"nodeType":"45425","messageId":"45426","endLine":61,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":122,"column":1,"nodeType":"45425","messageId":"45426","endLine":129,"endColumn":2},{"ruleId":"45357","severity":2,"message":"45358","line":288,"column":19,"nodeType":"45359","messageId":"45360","endLine":288,"endColumn":22,"suggestions":"45534"},{"ruleId":"45357","severity":2,"message":"45358","line":299,"column":41,"nodeType":"45359","messageId":"45360","endLine":299,"endColumn":44,"suggestions":"45535"},{"ruleId":"45357","severity":2,"message":"45358","line":311,"column":38,"nodeType":"45359","messageId":"45360","endLine":311,"endColumn":41,"suggestions":"45536"},{"ruleId":"45357","severity":2,"message":"45358","line":373,"column":9,"nodeType":"45359","messageId":"45360","endLine":373,"endColumn":12,"suggestions":"45537"},{"ruleId":"45418","severity":2,"message":"45419","line":16,"column":1,"nodeType":"45420","messageId":"45421","endLine":23,"endColumn":24},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":32,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":35,"suggestions":"45538"},{"ruleId":"45357","severity":2,"message":"45358","line":150,"column":17,"nodeType":"45359","messageId":"45360","endLine":150,"endColumn":20,"suggestions":"45539"},{"ruleId":"45357","severity":2,"message":"45358","line":191,"column":19,"nodeType":"45359","messageId":"45360","endLine":191,"endColumn":22,"suggestions":"45540"},{"ruleId":"45423","severity":2,"message":"45424","line":17,"column":8,"nodeType":"45425","messageId":"45426","endLine":25,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":68,"column":1,"nodeType":"45425","messageId":"45426","endLine":75,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":13,"column":1,"nodeType":"45420","messageId":"45421","endLine":13,"endColumn":100},{"ruleId":"45357","severity":2,"message":"45358","line":6,"column":22,"nodeType":"45359","messageId":"45360","endLine":6,"endColumn":25,"suggestions":"45541"},{"ruleId":"45357","severity":2,"message":"45358","line":6,"column":62,"nodeType":"45359","messageId":"45360","endLine":6,"endColumn":65,"suggestions":"45542"},{"ruleId":"45357","severity":2,"message":"45358","line":21,"column":28,"nodeType":"45359","messageId":"45360","endLine":21,"endColumn":31,"suggestions":"45543"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":8,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":11,"suggestions":"45544"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":18,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":21,"suggestions":"45545"},{"ruleId":"45423","severity":2,"message":"45424","line":46,"column":1,"nodeType":"45425","messageId":"45426","endLine":53,"endColumn":2},{"ruleId":"45546","severity":2,"message":"45547","line":171,"column":6,"nodeType":"45548","endLine":171,"endColumn":59,"suggestions":"45549"},{"ruleId":"45546","severity":2,"message":"45550","line":262,"column":6,"nodeType":"45548","endLine":262,"endColumn":8,"suggestions":"45551","suppressions":"45552"},{"ruleId":"45553","severity":2,"message":"45554","line":23,"column":9,"nodeType":null,"endLine":23,"endColumn":21,"suppressions":"45555"},{"ruleId":"45553","severity":2,"message":"45556","line":32,"column":9,"nodeType":null,"endLine":32,"endColumn":21,"suppressions":"45557"},{"ruleId":"45546","severity":2,"message":"45558","line":50,"column":6,"nodeType":"45548","endLine":50,"endColumn":23,"suggestions":"45559","suppressions":"45560"},{"ruleId":"45423","severity":2,"message":"45561","line":335,"column":6,"nodeType":"45562","messageId":"45426","endLine":335,"endColumn":50,"suppressions":"45563"},{"ruleId":"45423","severity":2,"message":"45561","line":337,"column":7,"nodeType":"45562","messageId":"45426","endLine":337,"endColumn":52,"suppressions":"45564"},{"ruleId":"45423","severity":2,"message":"45561","line":339,"column":7,"nodeType":"45562","messageId":"45426","endLine":339,"endColumn":49,"suppressions":"45565"},{"ruleId":"45423","severity":2,"message":"45561","line":341,"column":7,"nodeType":"45562","messageId":"45426","endLine":341,"endColumn":51,"suppressions":"45566"},{"ruleId":"45423","severity":2,"message":"45561","line":343,"column":7,"nodeType":"45562","messageId":"45426","endLine":343,"endColumn":44,"suppressions":"45567"},{"ruleId":"45568","severity":2,"message":"45569","line":392,"column":13,"nodeType":"45570","endLine":396,"endColumn":15,"suppressions":"45571"},{"ruleId":"45546","severity":2,"message":"45572","line":490,"column":6,"nodeType":"45548","endLine":490,"endColumn":8,"suggestions":"45573","suppressions":"45574"},{"ruleId":"45423","severity":2,"message":"45561","line":40,"column":29,"nodeType":"45562","messageId":"45426","endLine":40,"endColumn":64},{"ruleId":"45423","severity":2,"message":"45561","line":41,"column":27,"nodeType":"45562","messageId":"45426","endLine":41,"endColumn":60},{"ruleId":"45423","severity":2,"message":"45561","line":42,"column":29,"nodeType":"45562","messageId":"45426","endLine":42,"endColumn":71},{"ruleId":"45423","severity":2,"message":"45561","line":43,"column":31,"nodeType":"45562","messageId":"45426","endLine":43,"endColumn":68},{"ruleId":"45546","severity":2,"message":"45575","line":65,"column":6,"nodeType":"45548","endLine":65,"endColumn":26,"suggestions":"45576"},{"ruleId":"45423","severity":2,"message":"45561","line":293,"column":23,"nodeType":"45562","messageId":"45426","endLine":293,"endColumn":62,"suppressions":"45577"},{"ruleId":"45553","severity":2,"message":"45578","line":97,"column":7,"nodeType":null,"endLine":97,"endColumn":23,"suppressions":"45579"},{"ruleId":"45568","severity":2,"message":"45569","line":111,"column":13,"nodeType":"45570","endLine":120,"endColumn":15,"suppressions":"45580"},{"ruleId":"45423","severity":2,"message":"45561","line":158,"column":14,"nodeType":"45562","messageId":"45426","endLine":158,"endColumn":82},{"ruleId":"45546","severity":2,"message":"45581","line":268,"column":6,"nodeType":"45548","endLine":268,"endColumn":27,"suggestions":"45582","suppressions":"45583"},{"ruleId":"45546","severity":2,"message":"45584","line":315,"column":6,"nodeType":"45548","endLine":315,"endColumn":38,"suggestions":"45585","suppressions":"45586"},{"ruleId":"45546","severity":2,"message":"45587","line":327,"column":6,"nodeType":"45548","endLine":327,"endColumn":30,"suggestions":"45588","suppressions":"45589"},{"ruleId":"45546","severity":2,"message":"45590","line":72,"column":6,"nodeType":"45548","endLine":72,"endColumn":40,"suggestions":"45591","suppressions":"45592"},{"ruleId":"45546","severity":2,"message":"45593","line":72,"column":7,"nodeType":"45562","endLine":72,"endColumn":39,"suppressions":"45594"},{"ruleId":"45546","severity":2,"message":"45595","line":122,"column":6,"nodeType":"45548","endLine":122,"endColumn":42,"suggestions":"45596","suppressions":"45597"},{"ruleId":"45546","severity":2,"message":"45598","line":134,"column":6,"nodeType":"45548","endLine":134,"endColumn":65,"suggestions":"45599","suppressions":"45600"},{"ruleId":"45546","severity":2,"message":"45593","line":134,"column":27,"nodeType":"45562","endLine":134,"endColumn":64,"suppressions":"45601"},{"ruleId":"45546","severity":2,"message":"45602","line":343,"column":9,"nodeType":"45481","endLine":350,"endColumn":4,"suggestions":"45603"},{"ruleId":"45568","severity":2,"message":"45569","line":161,"column":15,"nodeType":"45570","endLine":165,"endColumn":17,"suppressions":"45604"},{"ruleId":"45568","severity":2,"message":"45569","line":662,"column":25,"nodeType":"45570","endLine":666,"endColumn":27,"suppressions":"45605"},{"ruleId":"45546","severity":2,"message":"45606","line":165,"column":6,"nodeType":"45548","endLine":165,"endColumn":22,"suggestions":"45607","suppressions":"45608"},{"ruleId":"45546","severity":2,"message":"45609","line":62,"column":6,"nodeType":"45548","endLine":62,"endColumn":20,"suggestions":"45610","suppressions":"45611"},{"ruleId":"45546","severity":2,"message":"45612","line":73,"column":6,"nodeType":"45548","endLine":73,"endColumn":20,"suggestions":"45613","suppressions":"45614"},{"ruleId":"45423","severity":2,"message":"45561","line":36,"column":31,"nodeType":"45562","messageId":"45426","endLine":36,"endColumn":68,"suppressions":"45615"},{"ruleId":"45546","severity":2,"message":"45616","line":56,"column":6,"nodeType":"45548","endLine":56,"endColumn":8,"suggestions":"45617","suppressions":"45618"},{"ruleId":"45568","severity":2,"message":"45569","line":572,"column":19,"nodeType":"45570","endLine":579,"endColumn":21},{"ruleId":"45568","severity":2,"message":"45569","line":642,"column":19,"nodeType":"45570","endLine":646,"endColumn":21},{"ruleId":"45568","severity":2,"message":"45569","line":666,"column":19,"nodeType":"45570","endLine":673,"endColumn":21},{"ruleId":"45568","severity":2,"message":"45569","line":742,"column":19,"nodeType":"45570","endLine":746,"endColumn":21},{"ruleId":"45546","severity":2,"message":"45619","line":65,"column":6,"nodeType":"45548","endLine":65,"endColumn":8,"suggestions":"45620","suppressions":"45621"},{"ruleId":"45423","severity":2,"message":"45561","line":66,"column":9,"nodeType":"45562","messageId":"45426","endLine":66,"endColumn":52},{"ruleId":"45546","severity":2,"message":"45622","line":40,"column":6,"nodeType":"45548","endLine":40,"endColumn":8,"suggestions":"45623","suppressions":"45624"},{"ruleId":"45625","severity":2,"message":"45626","line":304,"column":15,"nodeType":"45570","endLine":311,"endColumn":16},{"ruleId":"45546","severity":2,"message":"45627","line":87,"column":5,"nodeType":"45548","endLine":87,"endColumn":18,"suggestions":"45628"},{"ruleId":"45546","severity":2,"message":"45629","line":73,"column":6,"nodeType":"45548","endLine":73,"endColumn":8,"suggestions":"45630"},{"ruleId":"45553","severity":2,"message":"45631","line":52,"column":16,"nodeType":null,"endLine":52,"endColumn":34,"suppressions":"45632"},{"ruleId":"45553","severity":2,"message":"45633","line":101,"column":5,"nodeType":null,"endLine":101,"endColumn":13,"suppressions":"45634"},{"ruleId":"45423","severity":2,"message":"45561","line":50,"column":10,"nodeType":"45562","messageId":"45426","endLine":50,"endColumn":47},{"ruleId":"45423","severity":2,"message":"45561","line":51,"column":10,"nodeType":"45562","messageId":"45426","endLine":51,"endColumn":45},{"ruleId":"45423","severity":2,"message":"45561","line":52,"column":35,"nodeType":"45562","messageId":"45426","endLine":52,"endColumn":62},{"ruleId":"45546","severity":2,"message":"45635","line":133,"column":6,"nodeType":"45548","endLine":133,"endColumn":8,"suggestions":"45636","suppressions":"45637"},{"ruleId":"45546","severity":2,"message":"45638","line":45,"column":6,"nodeType":"45548","endLine":45,"endColumn":8,"suggestions":"45639","suppressions":"45640"},{"ruleId":"45546","severity":2,"message":"45641","line":497,"column":6,"nodeType":"45548","endLine":497,"endColumn":8,"suggestions":"45642","suppressions":"45643"},{"ruleId":"45546","severity":2,"message":"45622","line":491,"column":6,"nodeType":"45548","endLine":491,"endColumn":8,"suggestions":"45644","suppressions":"45645"},{"ruleId":"45546","severity":2,"message":"45646","line":320,"column":5,"nodeType":"45548","endLine":320,"endColumn":46,"suggestions":"45647","suppressions":"45648"},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":67},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":42},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":11,"column":1,"nodeType":"45420","messageId":"45421","endLine":11,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":17,"column":1,"nodeType":"45420","messageId":"45421","endLine":17,"endColumn":47},{"ruleId":"45418","severity":2,"message":"45419","line":16,"column":1,"nodeType":"45420","messageId":"45421","endLine":16,"endColumn":47},{"ruleId":"45423","severity":2,"message":"45561","line":140,"column":9,"nodeType":"45562","messageId":"45426","endLine":142,"endColumn":36,"suppressions":"45649"},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":44},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":9,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":63},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":85},{"ruleId":"45418","severity":2,"message":"45650","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":79},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":11,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":76},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":96},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":53},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":57},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":43},{"ruleId":"45418","severity":2,"message":"45651","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":72},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":50},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":47},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":7,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":97},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":12,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":78},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":60},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":10,"column":1,"nodeType":"45420","messageId":"45421","endLine":14,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":10,"column":1,"nodeType":"45420","messageId":"45421","endLine":10,"endColumn":80},{"ruleId":"45418","severity":2,"message":"45419","line":17,"column":1,"nodeType":"45420","messageId":"45421","endLine":17,"endColumn":50},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":75},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":93},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":9,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":14,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":10,"column":1,"nodeType":"45420","messageId":"45421","endLine":10,"endColumn":91},{"ruleId":"45418","severity":2,"message":"45652","line":23,"column":1,"nodeType":"45420","messageId":"45421","endLine":23,"endColumn":76},{"ruleId":"45418","severity":2,"message":"45419","line":14,"column":1,"nodeType":"45420","messageId":"45421","endLine":19,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":7,"column":1,"nodeType":"45420","messageId":"45421","endLine":12,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":9,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":31,"column":1,"nodeType":"45420","messageId":"45421","endLine":31,"endColumn":75},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":7,"column":1,"nodeType":"45420","messageId":"45421","endLine":7,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":27,"column":1,"nodeType":"45420","messageId":"45421","endLine":27,"endColumn":75},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":11,"column":1,"nodeType":"45420","messageId":"45421","endLine":11,"endColumn":75},{"ruleId":"45418","severity":2,"message":"45419","line":25,"column":1,"nodeType":"45420","messageId":"45421","endLine":25,"endColumn":85},{"ruleId":"45418","severity":2,"message":"45419","line":18,"column":1,"nodeType":"45420","messageId":"45421","endLine":18,"endColumn":57},{"ruleId":"45418","severity":2,"message":"45419","line":22,"column":1,"nodeType":"45420","messageId":"45421","endLine":22,"endColumn":58},{"ruleId":"45418","severity":2,"message":"45419","line":22,"column":1,"nodeType":"45420","messageId":"45421","endLine":26,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":20,"column":1,"nodeType":"45420","messageId":"45421","endLine":20,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":18,"column":1,"nodeType":"45420","messageId":"45421","endLine":18,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":16,"column":1,"nodeType":"45420","messageId":"45421","endLine":16,"endColumn":41},{"ruleId":"45418","severity":2,"message":"45419","line":19,"column":1,"nodeType":"45420","messageId":"45421","endLine":19,"endColumn":55},{"ruleId":"45418","severity":2,"message":"45419","line":28,"column":1,"nodeType":"45420","messageId":"45421","endLine":28,"endColumn":41},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":82},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":80},{"ruleId":"45423","severity":2,"message":"45561","line":95,"column":33,"nodeType":"45562","messageId":"45426","endLine":95,"endColumn":78},{"ruleId":"45418","severity":2,"message":"45653","line":22,"column":1,"nodeType":"45420","messageId":"45421","endLine":22,"endColumn":71},{"ruleId":"45418","severity":2,"message":"45653","line":14,"column":1,"nodeType":"45420","messageId":"45421","endLine":14,"endColumn":71},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":74},{"ruleId":"45418","severity":2,"message":"45419","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":74},{"ruleId":"45418","severity":2,"message":"45419","line":5,"column":1,"nodeType":"45420","messageId":"45421","endLine":12,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":48},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":59},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":100},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":75},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":49},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":53},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":68},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":7,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45653","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":9,"endColumn":34},{"ruleId":"45418","severity":2,"message":"45419","line":12,"column":1,"nodeType":"45420","messageId":"45421","endLine":12,"endColumn":46},{"ruleId":"45418","severity":2,"message":"45419","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":26,"column":1,"nodeType":"45420","messageId":"45421","endLine":26,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":82},{"ruleId":"45418","severity":2,"message":"45654","line":15,"column":1,"nodeType":"45420","messageId":"45421","endLine":15,"endColumn":89},{"ruleId":"45418","severity":2,"message":"45419","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":48},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":30,"column":1,"nodeType":"45420","messageId":"45421","endLine":30,"endColumn":67},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":100},{"ruleId":"45418","severity":2,"message":"45419","line":8,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":21,"column":1,"nodeType":"45420","messageId":"45421","endLine":21,"endColumn":58},{"ruleId":"45418","severity":2,"message":"45419","line":8,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":10,"column":1,"nodeType":"45420","messageId":"45421","endLine":10,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":5,"column":1,"nodeType":"45420","messageId":"45421","endLine":5,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":16,"column":1,"nodeType":"45420","messageId":"45421","endLine":22,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":22,"column":1,"nodeType":"45420","messageId":"45421","endLine":22,"endColumn":80},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":55},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":55},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":81},{"ruleId":"45418","severity":2,"message":"45419","line":11,"column":1,"nodeType":"45420","messageId":"45421","endLine":11,"endColumn":43},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":57},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":73},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":87},{"ruleId":"45418","severity":2,"message":"45419","line":27,"column":1,"nodeType":"45420","messageId":"45421","endLine":27,"endColumn":59},{"ruleId":"45418","severity":2,"message":"45655","line":29,"column":1,"nodeType":"45420","messageId":"45421","endLine":29,"endColumn":80},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":100},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":53},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45656","line":5,"column":1,"nodeType":"45420","messageId":"45421","endLine":5,"endColumn":70},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":12,"endColumn":24},{"ruleId":"45423","severity":2,"message":"45561","line":440,"column":17,"nodeType":"45562","messageId":"45426","endLine":440,"endColumn":54,"suppressions":"45657"},{"ruleId":"45418","severity":2,"message":"45419","line":13,"column":1,"nodeType":"45420","messageId":"45421","endLine":13,"endColumn":56},{"ruleId":"45423","severity":2,"message":"45561","line":131,"column":49,"nodeType":"45562","messageId":"45426","endLine":131,"endColumn":117},{"ruleId":"45418","severity":2,"message":"45419","line":8,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":8,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":59},{"ruleId":"45418","severity":2,"message":"45419","line":11,"column":1,"nodeType":"45420","messageId":"45421","endLine":11,"endColumn":80},{"ruleId":"45418","severity":2,"message":"45419","line":8,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":44},{"ruleId":"45418","severity":2,"message":"45419","line":15,"column":1,"nodeType":"45420","messageId":"45421","endLine":15,"endColumn":55},{"ruleId":"45418","severity":2,"message":"45419","line":10,"column":1,"nodeType":"45420","messageId":"45421","endLine":10,"endColumn":60},{"ruleId":"45423","severity":2,"message":"45424","line":100,"column":1,"nodeType":"45425","messageId":"45426","endLine":107,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":20,"column":1,"nodeType":"45420","messageId":"45421","endLine":20,"endColumn":92},{"ruleId":"45546","severity":2,"message":"45658","line":274,"column":6,"nodeType":"45548","endLine":274,"endColumn":94,"suggestions":"45659"},{"ruleId":"45546","severity":2,"message":"45660","line":274,"column":31,"nodeType":"45562","endLine":274,"endColumn":49},{"ruleId":"45423","severity":2,"message":"45424","line":39,"column":1,"nodeType":"45425","messageId":"45426","endLine":41,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":11,"column":1,"nodeType":"45420","messageId":"45421","endLine":11,"endColumn":49},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":9,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":82},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":9,"endColumn":24},{"ruleId":"45423","severity":2,"message":"45424","line":101,"column":1,"nodeType":"45425","messageId":"45426","endLine":103,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45661","line":26,"column":1,"nodeType":"45420","messageId":"45421","endLine":26,"endColumn":44},{"ruleId":"45418","severity":2,"message":"45419","line":20,"column":1,"nodeType":"45420","messageId":"45421","endLine":20,"endColumn":56},{"ruleId":"45423","severity":2,"message":"45424","line":43,"column":1,"nodeType":"45425","messageId":"45426","endLine":45,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":65,"column":1,"nodeType":"45425","messageId":"45426","endLine":72,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":45,"column":1,"nodeType":"45425","messageId":"45426","endLine":53,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":26,"column":1,"nodeType":"45425","messageId":"45426","endLine":33,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":59,"column":1,"nodeType":"45425","messageId":"45426","endLine":66,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":14,"column":1,"nodeType":"45420","messageId":"45421","endLine":19,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":4,"column":1,"nodeType":"45420","messageId":"45421","endLine":4,"endColumn":58},{"ruleId":"45418","severity":2,"message":"45419","line":25,"column":1,"nodeType":"45420","messageId":"45421","endLine":25,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":6,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":13,"column":1,"nodeType":"45420","messageId":"45421","endLine":13,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":21,"column":1,"nodeType":"45420","messageId":"45421","endLine":21,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":14,"column":1,"nodeType":"45420","messageId":"45421","endLine":14,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":8,"column":1,"nodeType":"45420","messageId":"45421","endLine":8,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45419","line":6,"column":1,"nodeType":"45420","messageId":"45421","endLine":10,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":13,"column":1,"nodeType":"45420","messageId":"45421","endLine":13,"endColumn":56},{"ruleId":"45418","severity":2,"message":"45662","line":12,"column":1,"nodeType":"45420","messageId":"45421","endLine":17,"endColumn":21},{"ruleId":"45418","severity":2,"message":"45419","line":7,"column":1,"nodeType":"45420","messageId":"45421","endLine":7,"endColumn":65},{"ruleId":"45423","severity":2,"message":"45424","line":116,"column":1,"nodeType":"45425","messageId":"45426","endLine":123,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":136,"column":1,"nodeType":"45425","messageId":"45426","endLine":143,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":5,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":5,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":5,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":7,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":14,"column":1,"nodeType":"45420","messageId":"45421","endLine":14,"endColumn":75},{"ruleId":"45418","severity":2,"message":"45419","line":15,"column":1,"nodeType":"45420","messageId":"45421","endLine":15,"endColumn":49},{"ruleId":"45418","severity":2,"message":"45419","line":15,"column":1,"nodeType":"45420","messageId":"45421","endLine":15,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":11,"column":1,"nodeType":"45420","messageId":"45421","endLine":11,"endColumn":65},{"ruleId":"45418","severity":2,"message":"45419","line":19,"column":1,"nodeType":"45420","messageId":"45421","endLine":22,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":18,"column":1,"nodeType":"45420","messageId":"45421","endLine":18,"endColumn":96},{"ruleId":"45423","severity":2,"message":"45424","line":25,"column":1,"nodeType":"45425","messageId":"45426","endLine":32,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":27,"column":1,"nodeType":"45420","messageId":"45421","endLine":27,"endColumn":95},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":10,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":14,"column":1,"nodeType":"45420","messageId":"45421","endLine":20,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":13,"column":1,"nodeType":"45420","messageId":"45421","endLine":13,"endColumn":85},{"ruleId":"45423","severity":2,"message":"45424","line":72,"column":1,"nodeType":"45425","messageId":"45426","endLine":80,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":66,"column":1,"nodeType":"45425","messageId":"45426","endLine":73,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":86},{"ruleId":"45423","severity":2,"message":"45424","line":68,"column":1,"nodeType":"45425","messageId":"45426","endLine":75,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":158,"column":1,"nodeType":"45425","messageId":"45426","endLine":165,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":123,"column":1,"nodeType":"45425","messageId":"45426","endLine":130,"endColumn":2},{"ruleId":"45423","severity":2,"message":"45424","line":201,"column":1,"nodeType":"45425","messageId":"45426","endLine":203,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45663","messageId":"45421","endLine":31,"endColumn":24},{"ruleId":"45546","severity":2,"message":"45629","line":62,"column":6,"nodeType":"45548","endLine":62,"endColumn":14,"suggestions":"45664"},{"ruleId":"45568","severity":2,"message":"45569","line":26,"column":5,"nodeType":"45570","endLine":31,"endColumn":7},{"ruleId":"45546","severity":2,"message":"45665","line":40,"column":6,"nodeType":"45548","endLine":40,"endColumn":8,"suggestions":"45666","suppressions":"45667"},{"ruleId":"45546","severity":2,"message":"45668","line":244,"column":6,"nodeType":"45548","endLine":244,"endColumn":31,"suggestions":"45669","suppressions":"45670"},{"ruleId":"45568","severity":2,"message":"45569","line":360,"column":9,"nodeType":"45570","endLine":367,"endColumn":11,"suppressions":"45671"},{"ruleId":"45568","severity":2,"message":"45569","line":479,"column":9,"nodeType":"45570","endLine":486,"endColumn":11,"suppressions":"45672"},{"ruleId":"45546","severity":2,"message":"45673","line":285,"column":6,"nodeType":"45548","endLine":285,"endColumn":30,"suggestions":"45674"},{"ruleId":"45546","severity":2,"message":"45675","line":163,"column":8,"nodeType":"45548","endLine":163,"endColumn":10,"suggestions":"45676"},{"ruleId":"45546","severity":2,"message":"45675","line":172,"column":7,"nodeType":"45548","endLine":172,"endColumn":15,"suggestions":"45677"},{"ruleId":"45546","severity":2,"message":"45678","line":529,"column":11,"nodeType":"45481","endLine":609,"endColumn":6,"suggestions":"45679"},{"ruleId":"45546","severity":2,"message":"45680","line":648,"column":8,"nodeType":"45548","endLine":648,"endColumn":27,"suggestions":"45681"},{"ruleId":"45546","severity":2,"message":"45682","line":754,"column":8,"nodeType":"45548","endLine":754,"endColumn":43,"suggestions":"45683"},{"ruleId":"45546","severity":2,"message":"45682","line":769,"column":8,"nodeType":"45548","endLine":769,"endColumn":43,"suggestions":"45684"},{"ruleId":"45568","severity":2,"message":"45569","line":506,"column":17,"nodeType":"45570","endLine":510,"endColumn":19},{"ruleId":"45546","severity":2,"message":"45685","line":304,"column":6,"nodeType":"45548","endLine":304,"endColumn":69,"suggestions":"45686","suppressions":"45687"},{"ruleId":"45423","severity":2,"message":"45424","line":30,"column":1,"nodeType":"45425","messageId":"45426","endLine":37,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":48},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":2,"endColumn":76},{"ruleId":"45418","severity":2,"message":"45419","line":13,"column":1,"nodeType":"45420","messageId":"45421","endLine":13,"endColumn":61},{"ruleId":"45418","severity":2,"message":"45419","line":12,"column":1,"nodeType":"45420","messageId":"45421","endLine":12,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":12,"column":1,"nodeType":"45420","messageId":"45421","endLine":17,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":17,"column":1,"nodeType":"45420","messageId":"45421","endLine":17,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":54,"column":1,"nodeType":"45420","messageId":"45421","endLine":61,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":34,"column":1,"nodeType":"45420","messageId":"45421","endLine":34,"endColumn":59},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":14,"endColumn":24},{"ruleId":"45423","severity":2,"message":"45424","line":128,"column":1,"nodeType":"45425","messageId":"45426","endLine":135,"endColumn":2},{"ruleId":"45418","severity":2,"message":"45419","line":2,"column":1,"nodeType":"45420","messageId":"45421","endLine":9,"endColumn":24},{"ruleId":"45418","severity":2,"message":"45419","line":10,"column":1,"nodeType":"45420","messageId":"45421","endLine":10,"endColumn":51},{"ruleId":"45418","severity":2,"message":"45419","line":1,"column":1,"nodeType":"45420","messageId":"45421","endLine":1,"endColumn":45},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":7,"endColumn":24},{"ruleId":"45357","severity":2,"message":"45358","line":7,"column":40,"nodeType":"45359","messageId":"45360","endLine":7,"endColumn":43,"suggestions":"45688"},{"ruleId":"45357","severity":2,"message":"45358","line":14,"column":40,"nodeType":"45359","messageId":"45360","endLine":14,"endColumn":43,"suggestions":"45689"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":42,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":45,"suggestions":"45690"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":40,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":43,"suggestions":"45691"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":40,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":43,"suggestions":"45692"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":40,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":43,"suggestions":"45693"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":40,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":43,"suggestions":"45694"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":46,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":49,"suggestions":"45695"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":56,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":59,"suggestions":"45696"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":45,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":48,"suggestions":"45697"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":46,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":49,"suggestions":"45698"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":56,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":59,"suggestions":"45699"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":45,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":48,"suggestions":"45700"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":40,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":43,"suggestions":"45701"},{"ruleId":"45357","severity":2,"message":"45358","line":161,"column":40,"nodeType":"45359","messageId":"45360","endLine":161,"endColumn":43,"suggestions":"45702"},{"ruleId":"45357","severity":2,"message":"45358","line":177,"column":40,"nodeType":"45359","messageId":"45360","endLine":177,"endColumn":43,"suggestions":"45703"},{"ruleId":"45357","severity":2,"message":"45358","line":206,"column":40,"nodeType":"45359","messageId":"45360","endLine":206,"endColumn":43,"suggestions":"45704"},{"ruleId":"45357","severity":2,"message":"45358","line":208,"column":47,"nodeType":"45359","messageId":"45360","endLine":208,"endColumn":50,"suggestions":"45705"},{"ruleId":"45357","severity":2,"message":"45358","line":218,"column":40,"nodeType":"45359","messageId":"45360","endLine":218,"endColumn":43,"suggestions":"45706"},{"ruleId":"45357","severity":2,"message":"45358","line":321,"column":40,"nodeType":"45359","messageId":"45360","endLine":321,"endColumn":43,"suggestions":"45707"},{"ruleId":"45357","severity":2,"message":"45358","line":54,"column":43,"nodeType":"45359","messageId":"45360","endLine":54,"endColumn":46,"suggestions":"45708"},{"ruleId":"45357","severity":2,"message":"45358","line":130,"column":21,"nodeType":"45359","messageId":"45360","endLine":130,"endColumn":24,"suggestions":"45709"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":19,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":22,"suggestions":"45710"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":54,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":57,"suggestions":"45711"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":37,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":40,"suggestions":"45712"},{"ruleId":"45357","severity":2,"message":"45358","line":153,"column":46,"nodeType":"45359","messageId":"45360","endLine":153,"endColumn":49,"suggestions":"45713"},{"ruleId":"45357","severity":2,"message":"45358","line":214,"column":54,"nodeType":"45359","messageId":"45360","endLine":214,"endColumn":57,"suggestions":"45714"},{"ruleId":"45357","severity":2,"message":"45358","line":216,"column":34,"nodeType":"45359","messageId":"45360","endLine":216,"endColumn":37,"suggestions":"45715"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":38,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":41,"suggestions":"45716"},{"ruleId":"45357","severity":2,"message":"45358","line":173,"column":21,"nodeType":"45359","messageId":"45360","endLine":173,"endColumn":24,"suggestions":"45717"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":28,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":31,"suggestions":"45718"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":36,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":39,"suggestions":"45719"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":47,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":50,"suggestions":"45720"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":65,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":68,"suggestions":"45721"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":59,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":62,"suggestions":"45722"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":65,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":68,"suggestions":"45723"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":59,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":62,"suggestions":"45724"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":43,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":46,"suggestions":"45725"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":43,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":46,"suggestions":"45726"},{"ruleId":"45357","severity":2,"message":"45358","line":186,"column":51,"nodeType":"45359","messageId":"45360","endLine":186,"endColumn":54,"suggestions":"45727"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":49,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":52,"suggestions":"45728"},{"ruleId":"45357","severity":2,"message":"45358","line":211,"column":43,"nodeType":"45359","messageId":"45360","endLine":211,"endColumn":46,"suggestions":"45729"},{"ruleId":"45357","severity":2,"message":"45358","line":228,"column":43,"nodeType":"45359","messageId":"45360","endLine":228,"endColumn":46,"suggestions":"45730"},{"ruleId":"45357","severity":2,"message":"45358","line":249,"column":43,"nodeType":"45359","messageId":"45360","endLine":249,"endColumn":46,"suggestions":"45731"},{"ruleId":"45357","severity":2,"message":"45358","line":280,"column":45,"nodeType":"45359","messageId":"45360","endLine":280,"endColumn":48,"suggestions":"45732"},{"ruleId":"45357","severity":2,"message":"45358","line":320,"column":45,"nodeType":"45359","messageId":"45360","endLine":320,"endColumn":48,"suggestions":"45733"},{"ruleId":"45357","severity":2,"message":"45358","line":351,"column":45,"nodeType":"45359","messageId":"45360","endLine":351,"endColumn":48,"suggestions":"45734"},{"ruleId":"45357","severity":2,"message":"45358","line":388,"column":57,"nodeType":"45359","messageId":"45360","endLine":388,"endColumn":60,"suggestions":"45735"},{"ruleId":"45357","severity":2,"message":"45358","line":389,"column":63,"nodeType":"45359","messageId":"45360","endLine":389,"endColumn":66,"suggestions":"45736"},{"ruleId":"45357","severity":2,"message":"45358","line":390,"column":61,"nodeType":"45359","messageId":"45360","endLine":390,"endColumn":64,"suggestions":"45737"},{"ruleId":"45357","severity":2,"message":"45358","line":433,"column":53,"nodeType":"45359","messageId":"45360","endLine":433,"endColumn":56,"suggestions":"45738"},{"ruleId":"45357","severity":2,"message":"45358","line":434,"column":65,"nodeType":"45359","messageId":"45360","endLine":434,"endColumn":68,"suggestions":"45739"},{"ruleId":"45357","severity":2,"message":"45358","line":435,"column":63,"nodeType":"45359","messageId":"45360","endLine":435,"endColumn":66,"suggestions":"45740"},{"ruleId":"45357","severity":2,"message":"45358","line":464,"column":55,"nodeType":"45359","messageId":"45360","endLine":464,"endColumn":58,"suggestions":"45741"},{"ruleId":"45357","severity":2,"message":"45358","line":510,"column":55,"nodeType":"45359","messageId":"45360","endLine":510,"endColumn":58,"suggestions":"45742"},{"ruleId":"45357","severity":2,"message":"45358","line":511,"column":69,"nodeType":"45359","messageId":"45360","endLine":511,"endColumn":72,"suggestions":"45743"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":52,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":55,"suggestions":"45744"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":65,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":68,"suggestions":"45745"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":59,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":62,"suggestions":"45746"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":49,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":52,"suggestions":"45747"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":53,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":56,"suggestions":"45748"},{"ruleId":"45357","severity":2,"message":"45358","line":150,"column":55,"nodeType":"45359","messageId":"45360","endLine":150,"endColumn":58,"suggestions":"45749"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":67,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":70,"suggestions":"45750"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":59,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":62,"suggestions":"45751"},{"ruleId":"45357","severity":2,"message":"45358","line":153,"column":55,"nodeType":"45359","messageId":"45360","endLine":153,"endColumn":58,"suggestions":"45752"},{"ruleId":"45357","severity":2,"message":"45358","line":154,"column":61,"nodeType":"45359","messageId":"45360","endLine":154,"endColumn":64,"suggestions":"45753"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":63,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":66,"suggestions":"45754"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":59,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":62,"suggestions":"45755"},{"ruleId":"45357","severity":2,"message":"45358","line":214,"column":54,"nodeType":"45359","messageId":"45360","endLine":214,"endColumn":57,"suggestions":"45756"},{"ruleId":"45357","severity":2,"message":"45358","line":236,"column":65,"nodeType":"45359","messageId":"45360","endLine":236,"endColumn":68,"suggestions":"45757"},{"ruleId":"45357","severity":2,"message":"45358","line":237,"column":57,"nodeType":"45359","messageId":"45360","endLine":237,"endColumn":60,"suggestions":"45758"},{"ruleId":"45357","severity":2,"message":"45358","line":238,"column":53,"nodeType":"45359","messageId":"45360","endLine":238,"endColumn":56,"suggestions":"45759"},{"ruleId":"45357","severity":2,"message":"45358","line":239,"column":59,"nodeType":"45359","messageId":"45360","endLine":239,"endColumn":62,"suggestions":"45760"},{"ruleId":"45357","severity":2,"message":"45358","line":240,"column":61,"nodeType":"45359","messageId":"45360","endLine":240,"endColumn":64,"suggestions":"45761"},{"ruleId":"45357","severity":2,"message":"45358","line":308,"column":45,"nodeType":"45359","messageId":"45360","endLine":308,"endColumn":48,"suggestions":"45762"},{"ruleId":"45357","severity":2,"message":"45358","line":314,"column":45,"nodeType":"45359","messageId":"45360","endLine":314,"endColumn":48,"suggestions":"45763"},{"ruleId":"45357","severity":2,"message":"45358","line":374,"column":57,"nodeType":"45359","messageId":"45360","endLine":374,"endColumn":60,"suggestions":"45764"},{"ruleId":"45357","severity":2,"message":"45358","line":375,"column":67,"nodeType":"45359","messageId":"45360","endLine":375,"endColumn":70,"suggestions":"45765"},{"ruleId":"45357","severity":2,"message":"45358","line":376,"column":67,"nodeType":"45359","messageId":"45360","endLine":376,"endColumn":70,"suggestions":"45766"},{"ruleId":"45357","severity":2,"message":"45358","line":377,"column":67,"nodeType":"45359","messageId":"45360","endLine":377,"endColumn":70,"suggestions":"45767"},{"ruleId":"45357","severity":2,"message":"45358","line":378,"column":59,"nodeType":"45359","messageId":"45360","endLine":378,"endColumn":62,"suggestions":"45768"},{"ruleId":"45357","severity":2,"message":"45358","line":379,"column":71,"nodeType":"45359","messageId":"45360","endLine":379,"endColumn":74,"suggestions":"45769"},{"ruleId":"45357","severity":2,"message":"45358","line":380,"column":73,"nodeType":"45359","messageId":"45360","endLine":380,"endColumn":76,"suggestions":"45770"},{"ruleId":"45357","severity":2,"message":"45358","line":381,"column":61,"nodeType":"45359","messageId":"45360","endLine":381,"endColumn":64,"suggestions":"45771"},{"ruleId":"45357","severity":2,"message":"45358","line":417,"column":43,"nodeType":"45359","messageId":"45360","endLine":417,"endColumn":46,"suggestions":"45772"},{"ruleId":"45357","severity":2,"message":"45358","line":436,"column":57,"nodeType":"45359","messageId":"45360","endLine":436,"endColumn":60,"suggestions":"45773"},{"ruleId":"45357","severity":2,"message":"45358","line":444,"column":57,"nodeType":"45359","messageId":"45360","endLine":444,"endColumn":60,"suggestions":"45774"},{"ruleId":"45357","severity":2,"message":"45358","line":452,"column":53,"nodeType":"45359","messageId":"45360","endLine":452,"endColumn":56,"suggestions":"45775"},{"ruleId":"45357","severity":2,"message":"45358","line":454,"column":14,"nodeType":"45359","messageId":"45360","endLine":454,"endColumn":17,"suggestions":"45776"},{"ruleId":"45357","severity":2,"message":"45358","line":457,"column":14,"nodeType":"45359","messageId":"45360","endLine":457,"endColumn":17,"suggestions":"45777"},{"ruleId":"45357","severity":2,"message":"45358","line":521,"column":75,"nodeType":"45359","messageId":"45360","endLine":521,"endColumn":78,"suggestions":"45778"},{"ruleId":"45357","severity":2,"message":"45358","line":522,"column":75,"nodeType":"45359","messageId":"45360","endLine":522,"endColumn":78,"suggestions":"45779"},{"ruleId":"45357","severity":2,"message":"45358","line":523,"column":61,"nodeType":"45359","messageId":"45360","endLine":523,"endColumn":64,"suggestions":"45780"},{"ruleId":"45357","severity":2,"message":"45358","line":524,"column":59,"nodeType":"45359","messageId":"45360","endLine":524,"endColumn":62,"suggestions":"45781"},{"ruleId":"45357","severity":2,"message":"45358","line":541,"column":43,"nodeType":"45359","messageId":"45360","endLine":541,"endColumn":46,"suggestions":"45782"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":24,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":27,"suggestions":"45783"},{"ruleId":"45357","severity":2,"message":"45358","line":543,"column":43,"nodeType":"45359","messageId":"45360","endLine":543,"endColumn":46,"suggestions":"45784"},{"ruleId":"45357","severity":2,"message":"45358","line":576,"column":43,"nodeType":"45359","messageId":"45360","endLine":576,"endColumn":46,"suggestions":"45785"},{"ruleId":"45357","severity":2,"message":"45358","line":630,"column":43,"nodeType":"45359","messageId":"45360","endLine":630,"endColumn":46,"suggestions":"45786"},{"ruleId":"45357","severity":2,"message":"45358","line":959,"column":43,"nodeType":"45359","messageId":"45360","endLine":959,"endColumn":46,"suggestions":"45787"},{"ruleId":"45357","severity":2,"message":"45358","line":993,"column":43,"nodeType":"45359","messageId":"45360","endLine":993,"endColumn":46,"suggestions":"45788"},{"ruleId":"45357","severity":2,"message":"45358","line":1030,"column":43,"nodeType":"45359","messageId":"45360","endLine":1030,"endColumn":46,"suggestions":"45789"},{"ruleId":"45357","severity":2,"message":"45358","line":1077,"column":63,"nodeType":"45359","messageId":"45360","endLine":1077,"endColumn":66,"suggestions":"45790"},{"ruleId":"45357","severity":2,"message":"45358","line":1086,"column":61,"nodeType":"45359","messageId":"45360","endLine":1086,"endColumn":64,"suggestions":"45791"},{"ruleId":"45357","severity":2,"message":"45358","line":1106,"column":43,"nodeType":"45359","messageId":"45360","endLine":1106,"endColumn":46,"suggestions":"45792"},{"ruleId":"45357","severity":2,"message":"45358","line":1124,"column":43,"nodeType":"45359","messageId":"45360","endLine":1124,"endColumn":46,"suggestions":"45793"},{"ruleId":"45357","severity":2,"message":"45358","line":1184,"column":43,"nodeType":"45359","messageId":"45360","endLine":1184,"endColumn":46,"suggestions":"45794"},{"ruleId":"45357","severity":2,"message":"45358","line":1228,"column":43,"nodeType":"45359","messageId":"45360","endLine":1228,"endColumn":46,"suggestions":"45795"},{"ruleId":"45357","severity":2,"message":"45358","line":1253,"column":43,"nodeType":"45359","messageId":"45360","endLine":1253,"endColumn":46,"suggestions":"45796"},{"ruleId":"45357","severity":2,"message":"45358","line":1291,"column":43,"nodeType":"45359","messageId":"45360","endLine":1291,"endColumn":46,"suggestions":"45797"},{"ruleId":"45357","severity":2,"message":"45358","line":1357,"column":43,"nodeType":"45359","messageId":"45360","endLine":1357,"endColumn":46,"suggestions":"45798"},{"ruleId":"45357","severity":2,"message":"45358","line":1396,"column":43,"nodeType":"45359","messageId":"45360","endLine":1396,"endColumn":46,"suggestions":"45799"},{"ruleId":"45357","severity":2,"message":"45358","line":1457,"column":43,"nodeType":"45359","messageId":"45360","endLine":1457,"endColumn":46,"suggestions":"45800"},{"ruleId":"45357","severity":2,"message":"45358","line":1504,"column":43,"nodeType":"45359","messageId":"45360","endLine":1504,"endColumn":46,"suggestions":"45801"},{"ruleId":"45357","severity":2,"message":"45358","line":1552,"column":43,"nodeType":"45359","messageId":"45360","endLine":1552,"endColumn":46,"suggestions":"45802"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":21,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":24,"suggestions":"45803"},{"ruleId":"45357","severity":2,"message":"45358","line":281,"column":21,"nodeType":"45359","messageId":"45360","endLine":281,"endColumn":24,"suggestions":"45804"},{"ruleId":"45357","severity":2,"message":"45358","line":363,"column":21,"nodeType":"45359","messageId":"45360","endLine":363,"endColumn":24,"suggestions":"45805"},{"ruleId":"45357","severity":2,"message":"45358","line":406,"column":54,"nodeType":"45359","messageId":"45360","endLine":406,"endColumn":57,"suggestions":"45806"},{"ruleId":"45357","severity":2,"message":"45358","line":442,"column":21,"nodeType":"45359","messageId":"45360","endLine":442,"endColumn":24,"suggestions":"45807"},{"ruleId":"45357","severity":2,"message":"45358","line":478,"column":56,"nodeType":"45359","messageId":"45360","endLine":478,"endColumn":59,"suggestions":"45808"},{"ruleId":"45357","severity":2,"message":"45358","line":651,"column":21,"nodeType":"45359","messageId":"45360","endLine":651,"endColumn":24,"suggestions":"45809"},{"ruleId":"45357","severity":2,"message":"45358","line":1000,"column":21,"nodeType":"45359","messageId":"45360","endLine":1000,"endColumn":24,"suggestions":"45810"},{"ruleId":"45357","severity":2,"message":"45358","line":1070,"column":21,"nodeType":"45359","messageId":"45360","endLine":1070,"endColumn":24,"suggestions":"45811"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":17,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":20,"suggestions":"45812"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":15,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":18,"suggestions":"45813"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":13,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":16,"suggestions":"45814"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":12,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":15,"suggestions":"45815"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":17,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":20,"suggestions":"45816"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":17,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":20,"suggestions":"45817"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":38,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":41,"suggestions":"45818"},{"ruleId":"45357","severity":2,"message":"45358","line":245,"column":12,"nodeType":"45359","messageId":"45360","endLine":245,"endColumn":15,"suggestions":"45819"},{"ruleId":"45357","severity":2,"message":"45358","line":279,"column":19,"nodeType":"45359","messageId":"45360","endLine":279,"endColumn":22,"suggestions":"45820"},{"ruleId":"45357","severity":2,"message":"45358","line":280,"column":16,"nodeType":"45359","messageId":"45360","endLine":280,"endColumn":19,"suggestions":"45821"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":30,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":33,"suggestions":"45822"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":13,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":16,"suggestions":"45823"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":21,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":24,"suggestions":"45824"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":30,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":33,"suggestions":"45825"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":29,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":32,"suggestions":"45826"},{"ruleId":"45357","severity":2,"message":"45358","line":164,"column":9,"nodeType":"45359","messageId":"45360","endLine":164,"endColumn":12,"suggestions":"45827"},{"ruleId":"45357","severity":2,"message":"45358","line":165,"column":9,"nodeType":"45359","messageId":"45360","endLine":165,"endColumn":12,"suggestions":"45828"},{"ruleId":"45357","severity":2,"message":"45358","line":170,"column":9,"nodeType":"45359","messageId":"45360","endLine":170,"endColumn":12,"suggestions":"45829"},{"ruleId":"45357","severity":2,"message":"45358","line":170,"column":56,"nodeType":"45359","messageId":"45360","endLine":170,"endColumn":59,"suggestions":"45830"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":17,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":20,"suggestions":"45831"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":32,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":35,"suggestions":"45832"},{"ruleId":"45357","severity":2,"message":"45358","line":203,"column":11,"nodeType":"45359","messageId":"45360","endLine":203,"endColumn":14,"suggestions":"45833"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":19,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":22,"suggestions":"45834"},{"ruleId":"45357","severity":2,"message":"45358","line":217,"column":28,"nodeType":"45359","messageId":"45360","endLine":217,"endColumn":31,"suggestions":"45835"},{"ruleId":"45357","severity":2,"message":"45358","line":245,"column":32,"nodeType":"45359","messageId":"45360","endLine":245,"endColumn":35,"suggestions":"45836"},{"ruleId":"45357","severity":2,"message":"45358","line":246,"column":36,"nodeType":"45359","messageId":"45360","endLine":246,"endColumn":39,"suggestions":"45837"},{"ruleId":"45357","severity":2,"message":"45358","line":300,"column":32,"nodeType":"45359","messageId":"45360","endLine":300,"endColumn":35,"suggestions":"45838"},{"ruleId":"45357","severity":2,"message":"45358","line":301,"column":11,"nodeType":"45359","messageId":"45360","endLine":301,"endColumn":14,"suggestions":"45839"},{"ruleId":"45357","severity":2,"message":"45358","line":302,"column":19,"nodeType":"45359","messageId":"45360","endLine":302,"endColumn":22,"suggestions":"45840"},{"ruleId":"45357","severity":2,"message":"45358","line":349,"column":28,"nodeType":"45359","messageId":"45360","endLine":349,"endColumn":31,"suggestions":"45841"},{"ruleId":"45357","severity":2,"message":"45358","line":371,"column":32,"nodeType":"45359","messageId":"45360","endLine":371,"endColumn":35,"suggestions":"45842"},{"ruleId":"45357","severity":2,"message":"45358","line":372,"column":36,"nodeType":"45359","messageId":"45360","endLine":372,"endColumn":39,"suggestions":"45843"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":30,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":33,"suggestions":"45844"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":13,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":16,"suggestions":"45845"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":21,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":24,"suggestions":"45846"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":30,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":33,"suggestions":"45847"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":29,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":32,"suggestions":"45848"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":37,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":40,"suggestions":"45849"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":9,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":12,"suggestions":"45850"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":9,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":12,"suggestions":"45851"},{"ruleId":"45357","severity":2,"message":"45358","line":154,"column":9,"nodeType":"45359","messageId":"45360","endLine":154,"endColumn":12,"suggestions":"45852"},{"ruleId":"45357","severity":2,"message":"45358","line":154,"column":56,"nodeType":"45359","messageId":"45360","endLine":154,"endColumn":59,"suggestions":"45853"},{"ruleId":"45357","severity":2,"message":"45358","line":159,"column":17,"nodeType":"45359","messageId":"45360","endLine":159,"endColumn":20,"suggestions":"45854"},{"ruleId":"45357","severity":2,"message":"45358","line":244,"column":29,"nodeType":"45359","messageId":"45360","endLine":244,"endColumn":32,"suggestions":"45855"},{"ruleId":"45357","severity":2,"message":"45358","line":248,"column":20,"nodeType":"45359","messageId":"45360","endLine":248,"endColumn":23,"suggestions":"45856"},{"ruleId":"45357","severity":2,"message":"45358","line":248,"column":58,"nodeType":"45359","messageId":"45360","endLine":248,"endColumn":61,"suggestions":"45857"},{"ruleId":"45357","severity":2,"message":"45358","line":253,"column":34,"nodeType":"45359","messageId":"45360","endLine":253,"endColumn":37,"suggestions":"45858"},{"ruleId":"45357","severity":2,"message":"45358","line":254,"column":13,"nodeType":"45359","messageId":"45360","endLine":254,"endColumn":16,"suggestions":"45859"},{"ruleId":"45357","severity":2,"message":"45358","line":255,"column":21,"nodeType":"45359","messageId":"45360","endLine":255,"endColumn":24,"suggestions":"45860"},{"ruleId":"45357","severity":2,"message":"45358","line":262,"column":30,"nodeType":"45359","messageId":"45360","endLine":262,"endColumn":33,"suggestions":"45861"},{"ruleId":"45357","severity":2,"message":"45358","line":266,"column":34,"nodeType":"45359","messageId":"45360","endLine":266,"endColumn":37,"suggestions":"45862"},{"ruleId":"45357","severity":2,"message":"45358","line":267,"column":38,"nodeType":"45359","messageId":"45360","endLine":267,"endColumn":41,"suggestions":"45863"},{"ruleId":"45357","severity":2,"message":"45358","line":350,"column":19,"nodeType":"45359","messageId":"45360","endLine":350,"endColumn":22,"suggestions":"45864"},{"ruleId":"45357","severity":2,"message":"45358","line":395,"column":67,"nodeType":"45359","messageId":"45360","endLine":395,"endColumn":70,"suggestions":"45865"},{"ruleId":"45357","severity":2,"message":"45358","line":402,"column":29,"nodeType":"45359","messageId":"45360","endLine":402,"endColumn":32,"suggestions":"45866"},{"ruleId":"45357","severity":2,"message":"45358","line":418,"column":34,"nodeType":"45359","messageId":"45360","endLine":418,"endColumn":37,"suggestions":"45867"},{"ruleId":"45357","severity":2,"message":"45358","line":419,"column":13,"nodeType":"45359","messageId":"45360","endLine":419,"endColumn":16,"suggestions":"45868"},{"ruleId":"45357","severity":2,"message":"45358","line":420,"column":21,"nodeType":"45359","messageId":"45360","endLine":420,"endColumn":24,"suggestions":"45869"},{"ruleId":"45357","severity":2,"message":"45358","line":430,"column":30,"nodeType":"45359","messageId":"45360","endLine":430,"endColumn":33,"suggestions":"45870"},{"ruleId":"45357","severity":2,"message":"45358","line":439,"column":38,"nodeType":"45359","messageId":"45360","endLine":439,"endColumn":41,"suggestions":"45871"},{"ruleId":"45357","severity":2,"message":"45358","line":477,"column":19,"nodeType":"45359","messageId":"45360","endLine":477,"endColumn":22,"suggestions":"45872"},{"ruleId":"45357","severity":2,"message":"45358","line":138,"column":9,"nodeType":"45359","messageId":"45360","endLine":138,"endColumn":12,"suggestions":"45873"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":9,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":12,"suggestions":"45874"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":9,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":12,"suggestions":"45875"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":56,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":59,"suggestions":"45876"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":34,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":37,"suggestions":"45877"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":45,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":48,"suggestions":"45878"},{"ruleId":"45357","severity":2,"message":"45358","line":18,"column":34,"nodeType":"45359","messageId":"45360","endLine":18,"endColumn":37,"suggestions":"45879"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":49,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":52,"suggestions":"45880"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":43,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":46,"suggestions":"45881"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":49,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":52,"suggestions":"45882"},{"ruleId":"45357","severity":2,"message":"45358","line":182,"column":43,"nodeType":"45359","messageId":"45360","endLine":182,"endColumn":46,"suggestions":"45883"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":49,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":52,"suggestions":"45884"},{"ruleId":"45357","severity":2,"message":"45358","line":247,"column":43,"nodeType":"45359","messageId":"45360","endLine":247,"endColumn":46,"suggestions":"45885"},{"ruleId":"45357","severity":2,"message":"45358","line":286,"column":49,"nodeType":"45359","messageId":"45360","endLine":286,"endColumn":52,"suggestions":"45886"},{"ruleId":"45357","severity":2,"message":"45358","line":331,"column":43,"nodeType":"45359","messageId":"45360","endLine":331,"endColumn":46,"suggestions":"45887"},{"ruleId":"45357","severity":2,"message":"45358","line":347,"column":10,"nodeType":"45359","messageId":"45360","endLine":347,"endColumn":13,"suggestions":"45888"},{"ruleId":"45357","severity":2,"message":"45358","line":367,"column":49,"nodeType":"45359","messageId":"45360","endLine":367,"endColumn":52,"suggestions":"45889"},{"ruleId":"45357","severity":2,"message":"45358","line":411,"column":45,"nodeType":"45359","messageId":"45360","endLine":411,"endColumn":48,"suggestions":"45890"},{"ruleId":"45357","severity":2,"message":"45358","line":440,"column":45,"nodeType":"45359","messageId":"45360","endLine":440,"endColumn":48,"suggestions":"45891"},{"ruleId":"45357","severity":2,"message":"45358","line":469,"column":49,"nodeType":"45359","messageId":"45360","endLine":469,"endColumn":52,"suggestions":"45892"},{"ruleId":"45357","severity":2,"message":"45358","line":506,"column":43,"nodeType":"45359","messageId":"45360","endLine":506,"endColumn":46,"suggestions":"45893"},{"ruleId":"45357","severity":2,"message":"45358","line":545,"column":49,"nodeType":"45359","messageId":"45360","endLine":545,"endColumn":52,"suggestions":"45894"},{"ruleId":"45357","severity":2,"message":"45358","line":582,"column":43,"nodeType":"45359","messageId":"45360","endLine":582,"endColumn":46,"suggestions":"45895"},{"ruleId":"45357","severity":2,"message":"45358","line":608,"column":34,"nodeType":"45359","messageId":"45360","endLine":608,"endColumn":37,"suggestions":"45896"},{"ruleId":"45357","severity":2,"message":"45358","line":608,"column":45,"nodeType":"45359","messageId":"45360","endLine":608,"endColumn":48,"suggestions":"45897"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":43,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":46,"suggestions":"45898"},{"ruleId":"45357","severity":2,"message":"45358","line":183,"column":43,"nodeType":"45359","messageId":"45360","endLine":183,"endColumn":46,"suggestions":"45899"},{"ruleId":"45357","severity":2,"message":"45358","line":245,"column":43,"nodeType":"45359","messageId":"45360","endLine":245,"endColumn":46,"suggestions":"45900"},{"ruleId":"45357","severity":2,"message":"45358","line":315,"column":43,"nodeType":"45359","messageId":"45360","endLine":315,"endColumn":46,"suggestions":"45901"},{"ruleId":"45357","severity":2,"message":"45358","line":350,"column":43,"nodeType":"45359","messageId":"45360","endLine":350,"endColumn":46,"suggestions":"45902"},{"ruleId":"45357","severity":2,"message":"45358","line":365,"column":43,"nodeType":"45359","messageId":"45360","endLine":365,"endColumn":46,"suggestions":"45903"},{"ruleId":"45357","severity":2,"message":"45358","line":398,"column":40,"nodeType":"45359","messageId":"45360","endLine":398,"endColumn":43,"suggestions":"45904"},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":76},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":36,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":39,"suggestions":"45905"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":36,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":39,"suggestions":"45906"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":24,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":27,"suggestions":"45907"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":43,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":46,"suggestions":"45908"},{"ruleId":"45357","severity":2,"message":"45358","line":169,"column":43,"nodeType":"45359","messageId":"45360","endLine":169,"endColumn":46,"suggestions":"45909"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":43,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":46,"suggestions":"45910"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":15,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":18,"suggestions":"45911"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":24,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":27,"suggestions":"45912"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":24,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":27,"suggestions":"45913"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":24,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":27,"suggestions":"45914"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":14,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":17,"suggestions":"45915"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":14,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":17,"suggestions":"45916"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":14,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":17,"suggestions":"45917"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":27,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":30,"suggestions":"45918"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":50,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":53,"suggestions":"45919"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":14,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":17,"suggestions":"45920"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":14,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":17,"suggestions":"45921"},{"ruleId":"45357","severity":2,"message":"45358","line":126,"column":14,"nodeType":"45359","messageId":"45360","endLine":126,"endColumn":17,"suggestions":"45922"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":25,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":28,"suggestions":"45923"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":48,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":51,"suggestions":"45924"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":25,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":28,"suggestions":"45925"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":48,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":51,"suggestions":"45926"},{"ruleId":"45357","severity":2,"message":"45358","line":144,"column":31,"nodeType":"45359","messageId":"45360","endLine":144,"endColumn":34,"suggestions":"45927"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":18,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":21,"suggestions":"45928"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":12,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":15,"suggestions":"45929"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":14,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":17,"suggestions":"45930"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":12,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":15,"suggestions":"45931"},{"ruleId":"45357","severity":2,"message":"45358","line":196,"column":36,"nodeType":"45359","messageId":"45360","endLine":196,"endColumn":39,"suggestions":"45932"},{"ruleId":"45357","severity":2,"message":"45358","line":233,"column":36,"nodeType":"45359","messageId":"45360","endLine":233,"endColumn":39,"suggestions":"45933"},{"ruleId":"45357","severity":2,"message":"45358","line":310,"column":30,"nodeType":"45359","messageId":"45360","endLine":310,"endColumn":33,"suggestions":"45934"},{"ruleId":"45357","severity":2,"message":"45358","line":494,"column":30,"nodeType":"45359","messageId":"45360","endLine":494,"endColumn":33,"suggestions":"45935"},{"ruleId":"45357","severity":2,"message":"45358","line":507,"column":30,"nodeType":"45359","messageId":"45360","endLine":507,"endColumn":33,"suggestions":"45936"},{"ruleId":"45357","severity":2,"message":"45358","line":530,"column":30,"nodeType":"45359","messageId":"45360","endLine":530,"endColumn":33,"suggestions":"45937"},{"ruleId":"45357","severity":2,"message":"45358","line":542,"column":30,"nodeType":"45359","messageId":"45360","endLine":542,"endColumn":33,"suggestions":"45938"},{"ruleId":"45357","severity":2,"message":"45358","line":628,"column":31,"nodeType":"45359","messageId":"45360","endLine":628,"endColumn":34,"suggestions":"45939"},{"ruleId":"45357","severity":2,"message":"45358","line":248,"column":45,"nodeType":"45359","messageId":"45360","endLine":248,"endColumn":48,"suggestions":"45940"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":12,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":15,"suggestions":"45941"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":12,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":15,"suggestions":"45942"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":37,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":40,"suggestions":"45943"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":48,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":51,"suggestions":"45944"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":45,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":48,"suggestions":"45945"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":12,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":15,"suggestions":"45946"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":36,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":39,"suggestions":"45947"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":48,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":51,"suggestions":"45948"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":45,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":48,"suggestions":"45949"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":52,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":55,"suggestions":"45950"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":56,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":59,"suggestions":"45951"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":52,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":55,"suggestions":"45952"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":52,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":55,"suggestions":"45953"},{"ruleId":"45357","severity":2,"message":"45358","line":141,"column":49,"nodeType":"45359","messageId":"45360","endLine":141,"endColumn":52,"suggestions":"45954"},{"ruleId":"45357","severity":2,"message":"45358","line":158,"column":49,"nodeType":"45359","messageId":"45360","endLine":158,"endColumn":52,"suggestions":"45955"},{"ruleId":"45357","severity":2,"message":"45358","line":183,"column":53,"nodeType":"45359","messageId":"45360","endLine":183,"endColumn":56,"suggestions":"45956"},{"ruleId":"45357","severity":2,"message":"45358","line":195,"column":62,"nodeType":"45359","messageId":"45360","endLine":195,"endColumn":65,"suggestions":"45957"},{"ruleId":"45357","severity":2,"message":"45358","line":232,"column":57,"nodeType":"45359","messageId":"45360","endLine":232,"endColumn":60,"suggestions":"45958"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":52,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":55,"suggestions":"45959"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":52,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":55,"suggestions":"45960"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":52,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":55,"suggestions":"45961"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":52,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":55,"suggestions":"45962"},{"ruleId":"45357","severity":2,"message":"45358","line":179,"column":12,"nodeType":"45359","messageId":"45360","endLine":179,"endColumn":15,"suggestions":"45963"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":12,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":15,"suggestions":"45964"},{"ruleId":"45357","severity":2,"message":"45358","line":201,"column":12,"nodeType":"45359","messageId":"45360","endLine":201,"endColumn":15,"suggestions":"45965"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":12,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":15,"suggestions":"45966"},{"ruleId":"45357","severity":2,"message":"45358","line":248,"column":52,"nodeType":"45359","messageId":"45360","endLine":248,"endColumn":55,"suggestions":"45967"},{"ruleId":"45357","severity":2,"message":"45358","line":257,"column":52,"nodeType":"45359","messageId":"45360","endLine":257,"endColumn":55,"suggestions":"45968"},{"ruleId":"45357","severity":2,"message":"45358","line":271,"column":50,"nodeType":"45359","messageId":"45360","endLine":271,"endColumn":53,"suggestions":"45969"},{"ruleId":"45357","severity":2,"message":"45358","line":284,"column":50,"nodeType":"45359","messageId":"45360","endLine":284,"endColumn":53,"suggestions":"45970"},{"ruleId":"45357","severity":2,"message":"45358","line":297,"column":51,"nodeType":"45359","messageId":"45360","endLine":297,"endColumn":54,"suggestions":"45971"},{"ruleId":"45357","severity":2,"message":"45358","line":311,"column":51,"nodeType":"45359","messageId":"45360","endLine":311,"endColumn":54,"suggestions":"45972"},{"ruleId":"45357","severity":2,"message":"45358","line":321,"column":52,"nodeType":"45359","messageId":"45360","endLine":321,"endColumn":55,"suggestions":"45973"},{"ruleId":"45357","severity":2,"message":"45358","line":340,"column":59,"nodeType":"45359","messageId":"45360","endLine":340,"endColumn":62,"suggestions":"45974"},{"ruleId":"45357","severity":2,"message":"45358","line":347,"column":45,"nodeType":"45359","messageId":"45360","endLine":347,"endColumn":48,"suggestions":"45975"},{"ruleId":"45357","severity":2,"message":"45358","line":354,"column":59,"nodeType":"45359","messageId":"45360","endLine":354,"endColumn":62,"suggestions":"45976"},{"ruleId":"45357","severity":2,"message":"45358","line":370,"column":52,"nodeType":"45359","messageId":"45360","endLine":370,"endColumn":55,"suggestions":"45977"},{"ruleId":"45357","severity":2,"message":"45358","line":264,"column":21,"nodeType":"45359","messageId":"45360","endLine":264,"endColumn":24,"suggestions":"45978"},{"ruleId":"45357","severity":2,"message":"45358","line":412,"column":46,"nodeType":"45359","messageId":"45360","endLine":412,"endColumn":49,"suggestions":"45979"},{"ruleId":"45357","severity":2,"message":"45358","line":419,"column":43,"nodeType":"45359","messageId":"45360","endLine":419,"endColumn":46,"suggestions":"45980"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":43,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":46,"suggestions":"45981"},{"ruleId":"45357","severity":2,"message":"45358","line":173,"column":43,"nodeType":"45359","messageId":"45360","endLine":173,"endColumn":46,"suggestions":"45982"},{"ruleId":"45357","severity":2,"message":"45358","line":205,"column":43,"nodeType":"45359","messageId":"45360","endLine":205,"endColumn":46,"suggestions":"45983"},{"ruleId":"45357","severity":2,"message":"45358","line":278,"column":43,"nodeType":"45359","messageId":"45360","endLine":278,"endColumn":46,"suggestions":"45984"},{"ruleId":"45357","severity":2,"message":"45358","line":353,"column":29,"nodeType":"45359","messageId":"45360","endLine":353,"endColumn":32,"suggestions":"45985"},{"ruleId":"45357","severity":2,"message":"45358","line":354,"column":26,"nodeType":"45359","messageId":"45360","endLine":354,"endColumn":29,"suggestions":"45986"},{"ruleId":"45357","severity":2,"message":"45358","line":355,"column":14,"nodeType":"45359","messageId":"45360","endLine":355,"endColumn":17,"suggestions":"45987"},{"ruleId":"45357","severity":2,"message":"45358","line":356,"column":18,"nodeType":"45359","messageId":"45360","endLine":356,"endColumn":21,"suggestions":"45988"},{"ruleId":"45357","severity":2,"message":"45358","line":359,"column":26,"nodeType":"45359","messageId":"45360","endLine":359,"endColumn":29,"suggestions":"45989"},{"ruleId":"45357","severity":2,"message":"45358","line":390,"column":40,"nodeType":"45359","messageId":"45360","endLine":390,"endColumn":43,"suggestions":"45990"},{"ruleId":"45357","severity":2,"message":"45358","line":390,"column":69,"nodeType":"45359","messageId":"45360","endLine":390,"endColumn":72,"suggestions":"45991"},{"ruleId":"45357","severity":2,"message":"45358","line":605,"column":25,"nodeType":"45359","messageId":"45360","endLine":605,"endColumn":28,"suggestions":"45992"},{"ruleId":"45357","severity":2,"message":"45358","line":836,"column":43,"nodeType":"45359","messageId":"45360","endLine":836,"endColumn":46,"suggestions":"45993"},{"ruleId":"45357","severity":2,"message":"45358","line":902,"column":43,"nodeType":"45359","messageId":"45360","endLine":902,"endColumn":46,"suggestions":"45994"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":47,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":50,"suggestions":"45995"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":59,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":62,"suggestions":"45996"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":52,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":55,"suggestions":"45997"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":64,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":67,"suggestions":"45998"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":43,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":46,"suggestions":"45999"},{"ruleId":"45357","severity":2,"message":"45358","line":78,"column":43,"nodeType":"45359","messageId":"45360","endLine":78,"endColumn":46,"suggestions":"46000"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":43,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":46,"suggestions":"46001"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":43,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":46,"suggestions":"46002"},{"ruleId":"45357","severity":2,"message":"45358","line":143,"column":43,"nodeType":"45359","messageId":"45360","endLine":143,"endColumn":46,"suggestions":"46003"},{"ruleId":"45357","severity":2,"message":"45358","line":173,"column":43,"nodeType":"45359","messageId":"45360","endLine":173,"endColumn":46,"suggestions":"46004"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":12,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":15,"suggestions":"46005"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":12,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":15,"suggestions":"46006"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":34,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":37,"suggestions":"46007"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":43,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":46,"suggestions":"46008"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":59,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":62,"suggestions":"46009"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":59,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":62,"suggestions":"46010"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":87,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":90,"suggestions":"46011"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":37,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":40,"suggestions":"46012"},{"ruleId":"45357","severity":2,"message":"45358","line":188,"column":35,"nodeType":"45359","messageId":"45360","endLine":188,"endColumn":38,"suggestions":"46013"},{"ruleId":"45357","severity":2,"message":"45358","line":221,"column":37,"nodeType":"45359","messageId":"45360","endLine":221,"endColumn":40,"suggestions":"46014"},{"ruleId":"45357","severity":2,"message":"45358","line":254,"column":19,"nodeType":"45359","messageId":"45360","endLine":254,"endColumn":22,"suggestions":"46015"},{"ruleId":"45357","severity":2,"message":"45358","line":272,"column":37,"nodeType":"45359","messageId":"45360","endLine":272,"endColumn":40,"suggestions":"46016"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":15,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":18,"suggestions":"46017"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":55,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":58,"suggestions":"46018"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":17,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":20,"suggestions":"46019"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":32,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":35,"suggestions":"46020","suppressions":"46021"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":64,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":67,"suggestions":"46022"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":43,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":46,"suggestions":"46023"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":43,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":46,"suggestions":"46024"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":55,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":58,"suggestions":"46025"},{"ruleId":"45357","severity":2,"message":"45358","line":192,"column":54,"nodeType":"45359","messageId":"45360","endLine":192,"endColumn":57,"suggestions":"46026"},{"ruleId":"45357","severity":2,"message":"45358","line":196,"column":37,"nodeType":"45359","messageId":"45360","endLine":196,"endColumn":40,"suggestions":"46027"},{"ruleId":"45357","severity":2,"message":"45358","line":201,"column":33,"nodeType":"45359","messageId":"45360","endLine":201,"endColumn":36,"suggestions":"46028"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":14,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":17,"suggestions":"46029"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":51,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":54,"suggestions":"46030"},{"ruleId":"45357","severity":2,"message":"45358","line":203,"column":14,"nodeType":"45359","messageId":"45360","endLine":203,"endColumn":17,"suggestions":"46031"},{"ruleId":"45357","severity":2,"message":"45358","line":203,"column":63,"nodeType":"45359","messageId":"45360","endLine":203,"endColumn":66,"suggestions":"46032"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":14,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":17,"suggestions":"46033"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":63,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":66,"suggestions":"46034"},{"ruleId":"45357","severity":2,"message":"45358","line":210,"column":54,"nodeType":"45359","messageId":"45360","endLine":210,"endColumn":57,"suggestions":"46035"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":19,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":22,"suggestions":"46036"},{"ruleId":"45357","severity":2,"message":"45358","line":246,"column":16,"nodeType":"45359","messageId":"45360","endLine":246,"endColumn":19,"suggestions":"46037"},{"ruleId":"45357","severity":2,"message":"45358","line":51,"column":55,"nodeType":"45359","messageId":"45360","endLine":51,"endColumn":58,"suggestions":"46038"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":43,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":46,"suggestions":"46039"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":39,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":42,"suggestions":"46040"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":42,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":45,"suggestions":"46041"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":36,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":39,"suggestions":"46042"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":47,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":50,"suggestions":"46043"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":36,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":39,"suggestions":"46044"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":27,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":30,"suggestions":"46045"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":27,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":30,"suggestions":"46046"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":37,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":40,"suggestions":"46047"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":28,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":31,"suggestions":"46048"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":37,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":40,"suggestions":"46049"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":28,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":31,"suggestions":"46050"},{"ruleId":"45357","severity":2,"message":"45358","line":16,"column":72,"nodeType":"45359","messageId":"45360","endLine":16,"endColumn":75,"suggestions":"46051"},{"ruleId":"45357","severity":2,"message":"45358","line":197,"column":35,"nodeType":"45359","messageId":"45360","endLine":197,"endColumn":38,"suggestions":"46052"},{"ruleId":"45357","severity":2,"message":"45358","line":210,"column":37,"nodeType":"45359","messageId":"45360","endLine":210,"endColumn":40,"suggestions":"46053"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":9,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":12,"suggestions":"46054","suppressions":"46055"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":43,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":46,"suggestions":"46056"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":43,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":46,"suggestions":"46057"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":45,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":48,"suggestions":"46058"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":43,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":46,"suggestions":"46059"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":43,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":46,"suggestions":"46060"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":43,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":46,"suggestions":"46061"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":43,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":46,"suggestions":"46062"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":43,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":46,"suggestions":"46063"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":21,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":24,"suggestions":"46064"},{"ruleId":"45357","severity":2,"message":"45358","line":12,"column":46,"nodeType":"45359","messageId":"45360","endLine":12,"endColumn":49,"suggestions":"46065"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":46,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":49,"suggestions":"46066"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":48,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":51,"suggestions":"46067"},{"ruleId":"45357","severity":2,"message":"45358","line":333,"column":46,"nodeType":"45359","messageId":"45360","endLine":333,"endColumn":49,"suggestions":"46068"},{"ruleId":"45357","severity":2,"message":"45358","line":347,"column":46,"nodeType":"45359","messageId":"45360","endLine":347,"endColumn":49,"suggestions":"46069"},{"ruleId":"45357","severity":2,"message":"45358","line":430,"column":46,"nodeType":"45359","messageId":"45360","endLine":430,"endColumn":49,"suggestions":"46070"},{"ruleId":"45357","severity":2,"message":"45358","line":553,"column":52,"nodeType":"45359","messageId":"45360","endLine":553,"endColumn":55,"suggestions":"46071"},{"ruleId":"45357","severity":2,"message":"45358","line":640,"column":48,"nodeType":"45359","messageId":"45360","endLine":640,"endColumn":51,"suggestions":"46072"},{"ruleId":"45357","severity":2,"message":"45358","line":664,"column":48,"nodeType":"45359","messageId":"45360","endLine":664,"endColumn":51,"suggestions":"46073"},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":46,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":49,"suggestions":"46074"},{"ruleId":"45357","severity":2,"message":"45358","line":31,"column":46,"nodeType":"45359","messageId":"45360","endLine":31,"endColumn":49,"suggestions":"46075"},{"ruleId":"45357","severity":2,"message":"45358","line":127,"column":48,"nodeType":"45359","messageId":"45360","endLine":127,"endColumn":51,"suggestions":"46076"},{"ruleId":"45357","severity":2,"message":"45358","line":227,"column":46,"nodeType":"45359","messageId":"45360","endLine":227,"endColumn":49,"suggestions":"46077"},{"ruleId":"45357","severity":2,"message":"45358","line":239,"column":46,"nodeType":"45359","messageId":"45360","endLine":239,"endColumn":49,"suggestions":"46078"},{"ruleId":"45357","severity":2,"message":"45358","line":352,"column":48,"nodeType":"45359","messageId":"45360","endLine":352,"endColumn":51,"suggestions":"46079"},{"ruleId":"45357","severity":2,"message":"45358","line":548,"column":46,"nodeType":"45359","messageId":"45360","endLine":548,"endColumn":49,"suggestions":"46080"},{"ruleId":"45357","severity":2,"message":"45358","line":575,"column":48,"nodeType":"45359","messageId":"45360","endLine":575,"endColumn":51,"suggestions":"46081"},{"ruleId":"45357","severity":2,"message":"45358","line":600,"column":48,"nodeType":"45359","messageId":"45360","endLine":600,"endColumn":51,"suggestions":"46082"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":46,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":49,"suggestions":"46083"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":46,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":49,"suggestions":"46084"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":46,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":49,"suggestions":"46085"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":46,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":49,"suggestions":"46086"},{"ruleId":"45357","severity":2,"message":"45358","line":164,"column":48,"nodeType":"45359","messageId":"45360","endLine":164,"endColumn":51,"suggestions":"46087"},{"ruleId":"45357","severity":2,"message":"45358","line":190,"column":48,"nodeType":"45359","messageId":"45360","endLine":190,"endColumn":51,"suggestions":"46088"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":49,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":52,"suggestions":"46089"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":43,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":46,"suggestions":"46090"},{"ruleId":"45357","severity":2,"message":"45358","line":160,"column":49,"nodeType":"45359","messageId":"45360","endLine":160,"endColumn":52,"suggestions":"46091"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":43,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":46,"suggestions":"46092"},{"ruleId":"45357","severity":2,"message":"45358","line":209,"column":32,"nodeType":"45359","messageId":"45360","endLine":209,"endColumn":35,"suggestions":"46093"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":25,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":28,"suggestions":"46094"},{"ruleId":"45357","severity":2,"message":"45358","line":216,"column":47,"nodeType":"45359","messageId":"45360","endLine":216,"endColumn":50,"suggestions":"46095"},{"ruleId":"45357","severity":2,"message":"45358","line":364,"column":49,"nodeType":"45359","messageId":"45360","endLine":364,"endColumn":52,"suggestions":"46096"},{"ruleId":"45357","severity":2,"message":"45358","line":366,"column":40,"nodeType":"45359","messageId":"45360","endLine":366,"endColumn":43,"suggestions":"46097"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":44,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":47,"suggestions":"46098"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":75,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":78,"suggestions":"46099"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":44,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":47,"suggestions":"46100"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":75,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":78,"suggestions":"46101"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":75,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":78,"suggestions":"46102"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":14,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":17,"suggestions":"46103"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":70,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":73,"suggestions":"46104"},{"ruleId":"45357","severity":2,"message":"45358","line":78,"column":14,"nodeType":"45359","messageId":"45360","endLine":78,"endColumn":17,"suggestions":"46105"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":70,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":73,"suggestions":"46106"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":14,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":17,"suggestions":"46107"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":70,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":73,"suggestions":"46108"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":14,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":17,"suggestions":"46109"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":70,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":73,"suggestions":"46110"},{"ruleId":"45357","severity":2,"message":"45358","line":167,"column":17,"nodeType":"45359","messageId":"45360","endLine":167,"endColumn":20,"suggestions":"46111"},{"ruleId":"45357","severity":2,"message":"45358","line":174,"column":19,"nodeType":"45359","messageId":"45360","endLine":174,"endColumn":22,"suggestions":"46112"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":19,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":22,"suggestions":"46113"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":20,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":23,"suggestions":"46114"},{"ruleId":"45357","severity":2,"message":"45358","line":49,"column":14,"nodeType":"45359","messageId":"45360","endLine":49,"endColumn":17,"suggestions":"46115"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":70,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":73,"suggestions":"46116"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":14,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":17,"suggestions":"46117"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":14,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":17,"suggestions":"46118"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":14,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":17,"suggestions":"46119"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":70,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":73,"suggestions":"46120"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":14,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":17,"suggestions":"46121"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":14,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":17,"suggestions":"46122"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":14,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":17,"suggestions":"46123"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":70,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":73,"suggestions":"46124"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":14,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":17,"suggestions":"46125"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":14,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":17,"suggestions":"46126"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":70,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":73,"suggestions":"46127"},{"ruleId":"45357","severity":2,"message":"45358","line":126,"column":14,"nodeType":"45359","messageId":"45360","endLine":126,"endColumn":17,"suggestions":"46128"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":70,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":73,"suggestions":"46129"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":14,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":17,"suggestions":"46130"},{"ruleId":"45357","severity":2,"message":"45358","line":158,"column":70,"nodeType":"45359","messageId":"45360","endLine":158,"endColumn":73,"suggestions":"46131"},{"ruleId":"45357","severity":2,"message":"45358","line":178,"column":14,"nodeType":"45359","messageId":"45360","endLine":178,"endColumn":17,"suggestions":"46132"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":70,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":73,"suggestions":"46133"},{"ruleId":"45357","severity":2,"message":"45358","line":205,"column":14,"nodeType":"45359","messageId":"45360","endLine":205,"endColumn":17,"suggestions":"46134"},{"ruleId":"45357","severity":2,"message":"45358","line":211,"column":70,"nodeType":"45359","messageId":"45360","endLine":211,"endColumn":73,"suggestions":"46135"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":70,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":73,"suggestions":"46136"},{"ruleId":"45357","severity":2,"message":"45358","line":234,"column":14,"nodeType":"45359","messageId":"45360","endLine":234,"endColumn":17,"suggestions":"46137"},{"ruleId":"45357","severity":2,"message":"45358","line":240,"column":70,"nodeType":"45359","messageId":"45360","endLine":240,"endColumn":73,"suggestions":"46138"},{"ruleId":"45357","severity":2,"message":"45358","line":261,"column":14,"nodeType":"45359","messageId":"45360","endLine":261,"endColumn":17,"suggestions":"46139"},{"ruleId":"45357","severity":2,"message":"45358","line":267,"column":70,"nodeType":"45359","messageId":"45360","endLine":267,"endColumn":73,"suggestions":"46140"},{"ruleId":"45357","severity":2,"message":"45358","line":153,"column":83,"nodeType":"45359","messageId":"45360","endLine":153,"endColumn":86,"suggestions":"46141"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":16,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":19,"suggestions":"46142"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":16,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":19,"suggestions":"46143"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":16,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":19,"suggestions":"46144"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":16,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":19,"suggestions":"46145"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":16,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":19,"suggestions":"46146"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":16,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":19,"suggestions":"46147"},{"ruleId":"45357","severity":2,"message":"45358","line":164,"column":16,"nodeType":"45359","messageId":"45360","endLine":164,"endColumn":19,"suggestions":"46148"},{"ruleId":"45357","severity":2,"message":"45358","line":180,"column":16,"nodeType":"45359","messageId":"45360","endLine":180,"endColumn":19,"suggestions":"46149"},{"ruleId":"45357","severity":2,"message":"45358","line":213,"column":16,"nodeType":"45359","messageId":"45360","endLine":213,"endColumn":19,"suggestions":"46150"},{"ruleId":"45357","severity":2,"message":"45358","line":231,"column":16,"nodeType":"45359","messageId":"45360","endLine":231,"endColumn":19,"suggestions":"46151"},{"ruleId":"45357","severity":2,"message":"45358","line":278,"column":16,"nodeType":"45359","messageId":"45360","endLine":278,"endColumn":19,"suggestions":"46152"},{"ruleId":"45357","severity":2,"message":"45358","line":292,"column":16,"nodeType":"45359","messageId":"45360","endLine":292,"endColumn":19,"suggestions":"46153"},{"ruleId":"45357","severity":2,"message":"45358","line":308,"column":16,"nodeType":"45359","messageId":"45360","endLine":308,"endColumn":19,"suggestions":"46154"},{"ruleId":"45357","severity":2,"message":"45358","line":325,"column":16,"nodeType":"45359","messageId":"45360","endLine":325,"endColumn":19,"suggestions":"46155"},{"ruleId":"45357","severity":2,"message":"45358","line":354,"column":16,"nodeType":"45359","messageId":"45360","endLine":354,"endColumn":19,"suggestions":"46156"},{"ruleId":"45357","severity":2,"message":"45358","line":362,"column":16,"nodeType":"45359","messageId":"45360","endLine":362,"endColumn":19,"suggestions":"46157"},{"ruleId":"45357","severity":2,"message":"45358","line":417,"column":16,"nodeType":"45359","messageId":"45360","endLine":417,"endColumn":19,"suggestions":"46158"},{"ruleId":"45357","severity":2,"message":"45358","line":453,"column":16,"nodeType":"45359","messageId":"45360","endLine":453,"endColumn":19,"suggestions":"46159"},{"ruleId":"45357","severity":2,"message":"45358","line":467,"column":16,"nodeType":"45359","messageId":"45360","endLine":467,"endColumn":19,"suggestions":"46160"},{"ruleId":"45357","severity":2,"message":"45358","line":503,"column":16,"nodeType":"45359","messageId":"45360","endLine":503,"endColumn":19,"suggestions":"46161"},{"ruleId":"45357","severity":2,"message":"45358","line":579,"column":16,"nodeType":"45359","messageId":"45360","endLine":579,"endColumn":19,"suggestions":"46162"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":27,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":30,"suggestions":"46163"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":27,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":30,"suggestions":"46164"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":27,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":30,"suggestions":"46165"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":27,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":30,"suggestions":"46166"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":27,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":30,"suggestions":"46167"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":27,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":30,"suggestions":"46168"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":27,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":30,"suggestions":"46169"},{"ruleId":"45357","severity":2,"message":"45358","line":154,"column":27,"nodeType":"45359","messageId":"45360","endLine":154,"endColumn":30,"suggestions":"46170"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":27,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":30,"suggestions":"46171"},{"ruleId":"45357","severity":2,"message":"45358","line":172,"column":27,"nodeType":"45359","messageId":"45360","endLine":172,"endColumn":30,"suggestions":"46172"},{"ruleId":"45357","severity":2,"message":"45358","line":193,"column":27,"nodeType":"45359","messageId":"45360","endLine":193,"endColumn":30,"suggestions":"46173"},{"ruleId":"45357","severity":2,"message":"45358","line":214,"column":27,"nodeType":"45359","messageId":"45360","endLine":214,"endColumn":30,"suggestions":"46174"},{"ruleId":"45357","severity":2,"message":"45358","line":233,"column":27,"nodeType":"45359","messageId":"45360","endLine":233,"endColumn":30,"suggestions":"46175"},{"ruleId":"45357","severity":2,"message":"45358","line":234,"column":27,"nodeType":"45359","messageId":"45360","endLine":234,"endColumn":30,"suggestions":"46176"},{"ruleId":"45357","severity":2,"message":"45358","line":235,"column":27,"nodeType":"45359","messageId":"45360","endLine":235,"endColumn":30,"suggestions":"46177"},{"ruleId":"45357","severity":2,"message":"45358","line":251,"column":33,"nodeType":"45359","messageId":"45360","endLine":251,"endColumn":36,"suggestions":"46178"},{"ruleId":"45357","severity":2,"message":"45358","line":265,"column":31,"nodeType":"45359","messageId":"45360","endLine":265,"endColumn":34,"suggestions":"46179"},{"ruleId":"45357","severity":2,"message":"45358","line":279,"column":32,"nodeType":"45359","messageId":"45360","endLine":279,"endColumn":35,"suggestions":"46180"},{"ruleId":"45357","severity":2,"message":"45358","line":290,"column":27,"nodeType":"45359","messageId":"45360","endLine":290,"endColumn":30,"suggestions":"46181"},{"ruleId":"45357","severity":2,"message":"45358","line":291,"column":27,"nodeType":"45359","messageId":"45360","endLine":291,"endColumn":30,"suggestions":"46182"},{"ruleId":"45357","severity":2,"message":"45358","line":301,"column":27,"nodeType":"45359","messageId":"45360","endLine":301,"endColumn":30,"suggestions":"46183"},{"ruleId":"45357","severity":2,"message":"45358","line":302,"column":27,"nodeType":"45359","messageId":"45360","endLine":302,"endColumn":30,"suggestions":"46184"},{"ruleId":"45357","severity":2,"message":"45358","line":313,"column":27,"nodeType":"45359","messageId":"45360","endLine":313,"endColumn":30,"suggestions":"46185"},{"ruleId":"45357","severity":2,"message":"45358","line":329,"column":27,"nodeType":"45359","messageId":"45360","endLine":329,"endColumn":30,"suggestions":"46186"},{"ruleId":"45357","severity":2,"message":"45358","line":339,"column":27,"nodeType":"45359","messageId":"45360","endLine":339,"endColumn":30,"suggestions":"46187"},{"ruleId":"45357","severity":2,"message":"45358","line":354,"column":34,"nodeType":"45359","messageId":"45360","endLine":354,"endColumn":37,"suggestions":"46188"},{"ruleId":"45357","severity":2,"message":"45358","line":371,"column":33,"nodeType":"45359","messageId":"45360","endLine":371,"endColumn":36,"suggestions":"46189"},{"ruleId":"45357","severity":2,"message":"45358","line":386,"column":38,"nodeType":"45359","messageId":"45360","endLine":386,"endColumn":41,"suggestions":"46190"},{"ruleId":"45357","severity":2,"message":"45358","line":396,"column":27,"nodeType":"45359","messageId":"45360","endLine":396,"endColumn":30,"suggestions":"46191"},{"ruleId":"45357","severity":2,"message":"45358","line":406,"column":31,"nodeType":"45359","messageId":"45360","endLine":406,"endColumn":34,"suggestions":"46192"},{"ruleId":"45357","severity":2,"message":"45358","line":416,"column":27,"nodeType":"45359","messageId":"45360","endLine":416,"endColumn":30,"suggestions":"46193"},{"ruleId":"45357","severity":2,"message":"45358","line":447,"column":27,"nodeType":"45359","messageId":"45360","endLine":447,"endColumn":30,"suggestions":"46194"},{"ruleId":"45357","severity":2,"message":"45358","line":581,"column":27,"nodeType":"45359","messageId":"45360","endLine":581,"endColumn":30,"suggestions":"46195"},{"ruleId":"45357","severity":2,"message":"45358","line":582,"column":27,"nodeType":"45359","messageId":"45360","endLine":582,"endColumn":30,"suggestions":"46196"},{"ruleId":"45357","severity":2,"message":"45358","line":598,"column":27,"nodeType":"45359","messageId":"45360","endLine":598,"endColumn":30,"suggestions":"46197"},{"ruleId":"45357","severity":2,"message":"45358","line":610,"column":27,"nodeType":"45359","messageId":"45360","endLine":610,"endColumn":30,"suggestions":"46198"},{"ruleId":"45357","severity":2,"message":"45358","line":620,"column":27,"nodeType":"45359","messageId":"45360","endLine":620,"endColumn":30,"suggestions":"46199"},{"ruleId":"45357","severity":2,"message":"45358","line":631,"column":27,"nodeType":"45359","messageId":"45360","endLine":631,"endColumn":30,"suggestions":"46200"},{"ruleId":"45357","severity":2,"message":"45358","line":641,"column":27,"nodeType":"45359","messageId":"45360","endLine":641,"endColumn":30,"suggestions":"46201"},{"ruleId":"45357","severity":2,"message":"45358","line":642,"column":27,"nodeType":"45359","messageId":"45360","endLine":642,"endColumn":30,"suggestions":"46202"},{"ruleId":"45357","severity":2,"message":"45358","line":643,"column":27,"nodeType":"45359","messageId":"45360","endLine":643,"endColumn":30,"suggestions":"46203"},{"ruleId":"45357","severity":2,"message":"45358","line":661,"column":27,"nodeType":"45359","messageId":"45360","endLine":661,"endColumn":30,"suggestions":"46204"},{"ruleId":"45357","severity":2,"message":"45358","line":678,"column":27,"nodeType":"45359","messageId":"45360","endLine":678,"endColumn":30,"suggestions":"46205"},{"ruleId":"45357","severity":2,"message":"45358","line":695,"column":18,"nodeType":"45359","messageId":"45360","endLine":695,"endColumn":21,"suggestions":"46206"},{"ruleId":"45357","severity":2,"message":"45358","line":712,"column":27,"nodeType":"45359","messageId":"45360","endLine":712,"endColumn":30,"suggestions":"46207"},{"ruleId":"45357","severity":2,"message":"45358","line":725,"column":16,"nodeType":"45359","messageId":"45360","endLine":725,"endColumn":19,"suggestions":"46208"},{"ruleId":"45357","severity":2,"message":"45358","line":730,"column":40,"nodeType":"45359","messageId":"45360","endLine":730,"endColumn":43,"suggestions":"46209"},{"ruleId":"45357","severity":2,"message":"45358","line":747,"column":27,"nodeType":"45359","messageId":"45360","endLine":747,"endColumn":30,"suggestions":"46210"},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":11,"endColumn":24},{"ruleId":"45357","severity":2,"message":"45358","line":276,"column":18,"nodeType":"45359","messageId":"45360","endLine":276,"endColumn":21,"suggestions":"46211"},{"ruleId":"45357","severity":2,"message":"45358","line":502,"column":39,"nodeType":"45359","messageId":"45360","endLine":502,"endColumn":42,"suggestions":"46212"},{"ruleId":"45357","severity":2,"message":"45358","line":904,"column":18,"nodeType":"45359","messageId":"45360","endLine":904,"endColumn":21,"suggestions":"46213"},{"ruleId":"45357","severity":2,"message":"45358","line":1072,"column":41,"nodeType":"45359","messageId":"45360","endLine":1072,"endColumn":44,"suggestions":"46214"},{"ruleId":"45357","severity":2,"message":"45358","line":1073,"column":42,"nodeType":"45359","messageId":"45360","endLine":1073,"endColumn":45,"suggestions":"46215"},{"ruleId":"45357","severity":2,"message":"45358","line":1074,"column":42,"nodeType":"45359","messageId":"45360","endLine":1074,"endColumn":45,"suggestions":"46216"},{"ruleId":"45357","severity":2,"message":"45358","line":1102,"column":24,"nodeType":"45359","messageId":"45360","endLine":1102,"endColumn":27,"suggestions":"46217"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":9,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":12,"suggestions":"46218"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":18,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":21,"suggestions":"46219"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":34,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":37,"suggestions":"46220"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":45,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":48,"suggestions":"46221"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":52,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":55,"suggestions":"46222"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":52,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":55,"suggestions":"46223"},{"ruleId":"45357","severity":2,"message":"45358","line":174,"column":52,"nodeType":"45359","messageId":"45360","endLine":174,"endColumn":55,"suggestions":"46224"},{"ruleId":"45357","severity":2,"message":"45358","line":196,"column":52,"nodeType":"45359","messageId":"45360","endLine":196,"endColumn":55,"suggestions":"46225"},{"ruleId":"45357","severity":2,"message":"45358","line":218,"column":52,"nodeType":"45359","messageId":"45360","endLine":218,"endColumn":55,"suggestions":"46226"},{"ruleId":"45357","severity":2,"message":"45358","line":240,"column":52,"nodeType":"45359","messageId":"45360","endLine":240,"endColumn":55,"suggestions":"46227"},{"ruleId":"45357","severity":2,"message":"45358","line":323,"column":47,"nodeType":"45359","messageId":"45360","endLine":323,"endColumn":50,"suggestions":"46228"},{"ruleId":"45357","severity":2,"message":"45358","line":335,"column":36,"nodeType":"45359","messageId":"45360","endLine":335,"endColumn":39,"suggestions":"46229"},{"ruleId":"45357","severity":2,"message":"45358","line":250,"column":22,"nodeType":"45359","messageId":"45360","endLine":250,"endColumn":25,"suggestions":"46230"},{"ruleId":"45357","severity":2,"message":"45358","line":254,"column":22,"nodeType":"45359","messageId":"45360","endLine":254,"endColumn":25,"suggestions":"46231"},{"ruleId":"45357","severity":2,"message":"45358","line":258,"column":22,"nodeType":"45359","messageId":"45360","endLine":258,"endColumn":25,"suggestions":"46232"},{"ruleId":"45357","severity":2,"message":"45358","line":262,"column":15,"nodeType":"45359","messageId":"45360","endLine":262,"endColumn":18,"suggestions":"46233"},{"ruleId":"45357","severity":2,"message":"45358","line":270,"column":58,"nodeType":"45359","messageId":"45360","endLine":270,"endColumn":61,"suggestions":"46234"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":53,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":56,"suggestions":"46235"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":53,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":56,"suggestions":"46236"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":62,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":65,"suggestions":"46237"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":45,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":48,"suggestions":"46238"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":45,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":48,"suggestions":"46239"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":27,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":30,"suggestions":"46240"},{"ruleId":"45357","severity":2,"message":"45358","line":158,"column":14,"nodeType":"45359","messageId":"45360","endLine":158,"endColumn":17,"suggestions":"46241"},{"ruleId":"45357","severity":2,"message":"45358","line":158,"column":40,"nodeType":"45359","messageId":"45360","endLine":158,"endColumn":43,"suggestions":"46242"},{"ruleId":"45357","severity":2,"message":"45358","line":159,"column":31,"nodeType":"45359","messageId":"45360","endLine":159,"endColumn":34,"suggestions":"46243"},{"ruleId":"45357","severity":2,"message":"45358","line":160,"column":31,"nodeType":"45359","messageId":"45360","endLine":160,"endColumn":34,"suggestions":"46244"},{"ruleId":"45357","severity":2,"message":"45358","line":161,"column":31,"nodeType":"45359","messageId":"45360","endLine":161,"endColumn":34,"suggestions":"46245"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":31,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":34,"suggestions":"46246"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":38,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":41,"suggestions":"46247"},{"ruleId":"45357","severity":2,"message":"45358","line":238,"column":75,"nodeType":"45359","messageId":"45360","endLine":238,"endColumn":78,"suggestions":"46248"},{"ruleId":"45357","severity":2,"message":"45358","line":245,"column":32,"nodeType":"45359","messageId":"45360","endLine":245,"endColumn":35,"suggestions":"46249"},{"ruleId":"45357","severity":2,"message":"45358","line":256,"column":93,"nodeType":"45359","messageId":"45360","endLine":256,"endColumn":96,"suggestions":"46250"},{"ruleId":"45357","severity":2,"message":"45358","line":262,"column":91,"nodeType":"45359","messageId":"45360","endLine":262,"endColumn":94,"suggestions":"46251"},{"ruleId":"45357","severity":2,"message":"45358","line":421,"column":51,"nodeType":"45359","messageId":"45360","endLine":421,"endColumn":54,"suggestions":"46252"},{"ruleId":"45357","severity":2,"message":"45358","line":424,"column":14,"nodeType":"45359","messageId":"45360","endLine":424,"endColumn":17,"suggestions":"46253"},{"ruleId":"45357","severity":2,"message":"45358","line":425,"column":52,"nodeType":"45359","messageId":"45360","endLine":425,"endColumn":55,"suggestions":"46254"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":50,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":53,"suggestions":"46255"},{"ruleId":"45357","severity":2,"message":"45358","line":458,"column":24,"nodeType":"45359","messageId":"45360","endLine":458,"endColumn":27,"suggestions":"46256"},{"ruleId":"45357","severity":2,"message":"45358","line":459,"column":24,"nodeType":"45359","messageId":"45360","endLine":459,"endColumn":27,"suggestions":"46257"},{"ruleId":"45357","severity":2,"message":"45358","line":488,"column":24,"nodeType":"45359","messageId":"45360","endLine":488,"endColumn":27,"suggestions":"46258"},{"ruleId":"45357","severity":2,"message":"45358","line":489,"column":24,"nodeType":"45359","messageId":"45360","endLine":489,"endColumn":27,"suggestions":"46259"},{"ruleId":"45357","severity":2,"message":"45358","line":490,"column":14,"nodeType":"45359","messageId":"45360","endLine":490,"endColumn":17,"suggestions":"46260"},{"ruleId":"45357","severity":2,"message":"45358","line":490,"column":40,"nodeType":"45359","messageId":"45360","endLine":490,"endColumn":43,"suggestions":"46261"},{"ruleId":"45357","severity":2,"message":"45358","line":491,"column":24,"nodeType":"45359","messageId":"45360","endLine":491,"endColumn":27,"suggestions":"46262"},{"ruleId":"45357","severity":2,"message":"45358","line":493,"column":70,"nodeType":"45359","messageId":"45360","endLine":493,"endColumn":73,"suggestions":"46263"},{"ruleId":"45357","severity":2,"message":"45358","line":502,"column":32,"nodeType":"45359","messageId":"45360","endLine":502,"endColumn":35,"suggestions":"46264"},{"ruleId":"45357","severity":2,"message":"45358","line":536,"column":24,"nodeType":"45359","messageId":"45360","endLine":536,"endColumn":27,"suggestions":"46265"},{"ruleId":"45357","severity":2,"message":"45358","line":537,"column":21,"nodeType":"45359","messageId":"45360","endLine":537,"endColumn":24,"suggestions":"46266"},{"ruleId":"45357","severity":2,"message":"45358","line":539,"column":70,"nodeType":"45359","messageId":"45360","endLine":539,"endColumn":73,"suggestions":"46267"},{"ruleId":"45357","severity":2,"message":"45358","line":579,"column":24,"nodeType":"45359","messageId":"45360","endLine":579,"endColumn":27,"suggestions":"46268"},{"ruleId":"45357","severity":2,"message":"45358","line":580,"column":21,"nodeType":"45359","messageId":"45360","endLine":580,"endColumn":24,"suggestions":"46269"},{"ruleId":"45357","severity":2,"message":"45358","line":582,"column":70,"nodeType":"45359","messageId":"45360","endLine":582,"endColumn":73,"suggestions":"46270"},{"ruleId":"45357","severity":2,"message":"45358","line":623,"column":24,"nodeType":"45359","messageId":"45360","endLine":623,"endColumn":27,"suggestions":"46271"},{"ruleId":"45357","severity":2,"message":"45358","line":624,"column":21,"nodeType":"45359","messageId":"45360","endLine":624,"endColumn":24,"suggestions":"46272"},{"ruleId":"45357","severity":2,"message":"45358","line":626,"column":70,"nodeType":"45359","messageId":"45360","endLine":626,"endColumn":73,"suggestions":"46273"},{"ruleId":"45357","severity":2,"message":"45358","line":665,"column":24,"nodeType":"45359","messageId":"45360","endLine":665,"endColumn":27,"suggestions":"46274"},{"ruleId":"45357","severity":2,"message":"45358","line":666,"column":21,"nodeType":"45359","messageId":"45360","endLine":666,"endColumn":24,"suggestions":"46275"},{"ruleId":"45357","severity":2,"message":"45358","line":668,"column":70,"nodeType":"45359","messageId":"45360","endLine":668,"endColumn":73,"suggestions":"46276"},{"ruleId":"45357","severity":2,"message":"45358","line":702,"column":24,"nodeType":"45359","messageId":"45360","endLine":702,"endColumn":27,"suggestions":"46277"},{"ruleId":"45357","severity":2,"message":"45358","line":703,"column":21,"nodeType":"45359","messageId":"45360","endLine":703,"endColumn":24,"suggestions":"46278"},{"ruleId":"45357","severity":2,"message":"45358","line":705,"column":70,"nodeType":"45359","messageId":"45360","endLine":705,"endColumn":73,"suggestions":"46279"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":21,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":24,"suggestions":"46280"},{"ruleId":"45357","severity":2,"message":"45358","line":179,"column":89,"nodeType":"45359","messageId":"45360","endLine":179,"endColumn":92,"suggestions":"46281"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":29,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":32,"suggestions":"46282"},{"ruleId":"45357","severity":2,"message":"45358","line":188,"column":14,"nodeType":"45359","messageId":"45360","endLine":188,"endColumn":17,"suggestions":"46283"},{"ruleId":"45357","severity":2,"message":"45358","line":188,"column":38,"nodeType":"45359","messageId":"45360","endLine":188,"endColumn":41,"suggestions":"46284"},{"ruleId":"45357","severity":2,"message":"45358","line":18,"column":21,"nodeType":"45359","messageId":"45360","endLine":18,"endColumn":24,"suggestions":"46285"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":18,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":21,"suggestions":"46286"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":32,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":35,"suggestions":"46287"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":35,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":38,"suggestions":"46288"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":28,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":31,"suggestions":"46289"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":38,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":41,"suggestions":"46290"},{"ruleId":"45357","severity":2,"message":"45358","line":54,"column":40,"nodeType":"45359","messageId":"45360","endLine":54,"endColumn":43,"suggestions":"46291"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":38,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":41,"suggestions":"46292"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":39,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":42,"suggestions":"46293"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":38,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":41,"suggestions":"46294"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":38,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":41,"suggestions":"46295"},{"ruleId":"45357","severity":2,"message":"45358","line":138,"column":39,"nodeType":"45359","messageId":"45360","endLine":138,"endColumn":42,"suggestions":"46296"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":39,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":42,"suggestions":"46297"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":39,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":42,"suggestions":"46298"},{"ruleId":"45357","severity":2,"message":"45358","line":170,"column":40,"nodeType":"45359","messageId":"45360","endLine":170,"endColumn":43,"suggestions":"46299"},{"ruleId":"45357","severity":2,"message":"45358","line":182,"column":40,"nodeType":"45359","messageId":"45360","endLine":182,"endColumn":43,"suggestions":"46300"},{"ruleId":"45357","severity":2,"message":"45358","line":195,"column":40,"nodeType":"45359","messageId":"45360","endLine":195,"endColumn":43,"suggestions":"46301"},{"ruleId":"45357","severity":2,"message":"45358","line":207,"column":40,"nodeType":"45359","messageId":"45360","endLine":207,"endColumn":43,"suggestions":"46302"},{"ruleId":"45357","severity":2,"message":"45358","line":224,"column":40,"nodeType":"45359","messageId":"45360","endLine":224,"endColumn":43,"suggestions":"46303"},{"ruleId":"45357","severity":2,"message":"45358","line":242,"column":40,"nodeType":"45359","messageId":"45360","endLine":242,"endColumn":43,"suggestions":"46304"},{"ruleId":"45357","severity":2,"message":"45358","line":244,"column":9,"nodeType":"45359","messageId":"45360","endLine":244,"endColumn":12,"suggestions":"46305"},{"ruleId":"45357","severity":2,"message":"45358","line":251,"column":67,"nodeType":"45359","messageId":"45360","endLine":251,"endColumn":70,"suggestions":"46306"},{"ruleId":"45357","severity":2,"message":"45358","line":264,"column":40,"nodeType":"45359","messageId":"45360","endLine":264,"endColumn":43,"suggestions":"46307"},{"ruleId":"45357","severity":2,"message":"45358","line":277,"column":40,"nodeType":"45359","messageId":"45360","endLine":277,"endColumn":43,"suggestions":"46308"},{"ruleId":"45357","severity":2,"message":"45358","line":285,"column":84,"nodeType":"45359","messageId":"45360","endLine":285,"endColumn":87,"suggestions":"46309"},{"ruleId":"45357","severity":2,"message":"45358","line":288,"column":48,"nodeType":"45359","messageId":"45360","endLine":288,"endColumn":51,"suggestions":"46310"},{"ruleId":"45357","severity":2,"message":"45358","line":289,"column":69,"nodeType":"45359","messageId":"45360","endLine":289,"endColumn":72,"suggestions":"46311"},{"ruleId":"45357","severity":2,"message":"45358","line":293,"column":50,"nodeType":"45359","messageId":"45360","endLine":293,"endColumn":53,"suggestions":"46312"},{"ruleId":"45357","severity":2,"message":"45358","line":318,"column":81,"nodeType":"45359","messageId":"45360","endLine":318,"endColumn":84,"suggestions":"46313"},{"ruleId":"45357","severity":2,"message":"45358","line":338,"column":39,"nodeType":"45359","messageId":"45360","endLine":338,"endColumn":42,"suggestions":"46314"},{"ruleId":"45357","severity":2,"message":"45358","line":358,"column":40,"nodeType":"45359","messageId":"45360","endLine":358,"endColumn":43,"suggestions":"46315"},{"ruleId":"45357","severity":2,"message":"45358","line":386,"column":57,"nodeType":"45359","messageId":"45360","endLine":386,"endColumn":60,"suggestions":"46316"},{"ruleId":"45357","severity":2,"message":"45358","line":390,"column":40,"nodeType":"45359","messageId":"45360","endLine":390,"endColumn":43,"suggestions":"46317"},{"ruleId":"45357","severity":2,"message":"45358","line":428,"column":38,"nodeType":"45359","messageId":"45360","endLine":428,"endColumn":41,"suggestions":"46318"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":40,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":43,"suggestions":"46319"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":43,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":46,"suggestions":"46320"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":34,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":37,"suggestions":"46321"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":55,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":58,"suggestions":"46322"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":40,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":43,"suggestions":"46323"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":37,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":40,"suggestions":"46324"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":28,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":31,"suggestions":"46325"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":14,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":17,"suggestions":"46326"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":47,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":50,"suggestions":"46327"},{"ruleId":"45357","severity":2,"message":"45358","line":138,"column":38,"nodeType":"45359","messageId":"45360","endLine":138,"endColumn":41,"suggestions":"46328"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":38,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":41,"suggestions":"46329"},{"ruleId":"45357","severity":2,"message":"45358","line":154,"column":57,"nodeType":"45359","messageId":"45360","endLine":154,"endColumn":60,"suggestions":"46330"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":39,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":42,"suggestions":"46331"},{"ruleId":"45357","severity":2,"message":"45358","line":227,"column":38,"nodeType":"45359","messageId":"45360","endLine":227,"endColumn":41,"suggestions":"46332"},{"ruleId":"45357","severity":2,"message":"45358","line":228,"column":38,"nodeType":"45359","messageId":"45360","endLine":228,"endColumn":41,"suggestions":"46333"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":42,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":45,"suggestions":"46334"},{"ruleId":"45357","severity":2,"message":"45358","line":230,"column":14,"nodeType":"45359","messageId":"45360","endLine":230,"endColumn":17,"suggestions":"46335"},{"ruleId":"45357","severity":2,"message":"45358","line":230,"column":64,"nodeType":"45359","messageId":"45360","endLine":230,"endColumn":67,"suggestions":"46336"},{"ruleId":"45357","severity":2,"message":"45358","line":233,"column":55,"nodeType":"45359","messageId":"45360","endLine":233,"endColumn":58,"suggestions":"46337"},{"ruleId":"45357","severity":2,"message":"45358","line":237,"column":51,"nodeType":"45359","messageId":"45360","endLine":237,"endColumn":54,"suggestions":"46338"},{"ruleId":"45357","severity":2,"message":"45358","line":282,"column":38,"nodeType":"45359","messageId":"45360","endLine":282,"endColumn":41,"suggestions":"46339"},{"ruleId":"45357","severity":2,"message":"45358","line":283,"column":51,"nodeType":"45359","messageId":"45360","endLine":283,"endColumn":54,"suggestions":"46340"},{"ruleId":"45357","severity":2,"message":"45358","line":284,"column":51,"nodeType":"45359","messageId":"45360","endLine":284,"endColumn":54,"suggestions":"46341"},{"ruleId":"45357","severity":2,"message":"45358","line":285,"column":51,"nodeType":"45359","messageId":"45360","endLine":285,"endColumn":54,"suggestions":"46342"},{"ruleId":"45357","severity":2,"message":"45358","line":286,"column":42,"nodeType":"45359","messageId":"45360","endLine":286,"endColumn":45,"suggestions":"46343"},{"ruleId":"45357","severity":2,"message":"45358","line":312,"column":38,"nodeType":"45359","messageId":"45360","endLine":312,"endColumn":41,"suggestions":"46344"},{"ruleId":"45357","severity":2,"message":"45358","line":313,"column":38,"nodeType":"45359","messageId":"45360","endLine":313,"endColumn":41,"suggestions":"46345"},{"ruleId":"45357","severity":2,"message":"45358","line":314,"column":42,"nodeType":"45359","messageId":"45360","endLine":314,"endColumn":45,"suggestions":"46346"},{"ruleId":"45357","severity":2,"message":"45358","line":315,"column":42,"nodeType":"45359","messageId":"45360","endLine":315,"endColumn":45,"suggestions":"46347"},{"ruleId":"45357","severity":2,"message":"45358","line":342,"column":14,"nodeType":"45359","messageId":"45360","endLine":342,"endColumn":17,"suggestions":"46348"},{"ruleId":"45357","severity":2,"message":"45358","line":343,"column":28,"nodeType":"45359","messageId":"45360","endLine":343,"endColumn":31,"suggestions":"46349"},{"ruleId":"45357","severity":2,"message":"45358","line":344,"column":28,"nodeType":"45359","messageId":"45360","endLine":344,"endColumn":31,"suggestions":"46350"},{"ruleId":"45357","severity":2,"message":"45358","line":345,"column":28,"nodeType":"45359","messageId":"45360","endLine":345,"endColumn":31,"suggestions":"46351"},{"ruleId":"45357","severity":2,"message":"45358","line":346,"column":28,"nodeType":"45359","messageId":"45360","endLine":346,"endColumn":31,"suggestions":"46352"},{"ruleId":"45357","severity":2,"message":"45358","line":347,"column":51,"nodeType":"45359","messageId":"45360","endLine":347,"endColumn":54,"suggestions":"46353"},{"ruleId":"45357","severity":2,"message":"45358","line":579,"column":53,"nodeType":"45359","messageId":"45360","endLine":579,"endColumn":56,"suggestions":"46354"},{"ruleId":"45357","severity":2,"message":"45358","line":666,"column":53,"nodeType":"45359","messageId":"45360","endLine":666,"endColumn":56,"suggestions":"46355"},{"ruleId":"45357","severity":2,"message":"45358","line":834,"column":43,"nodeType":"45359","messageId":"45360","endLine":834,"endColumn":46,"suggestions":"46356"},{"ruleId":"45357","severity":2,"message":"45358","line":889,"column":68,"nodeType":"45359","messageId":"45360","endLine":889,"endColumn":71,"suggestions":"46357"},{"ruleId":"45357","severity":2,"message":"45358","line":1189,"column":43,"nodeType":"45359","messageId":"45360","endLine":1189,"endColumn":46,"suggestions":"46358"},{"ruleId":"45357","severity":2,"message":"45358","line":173,"column":51,"nodeType":"45359","messageId":"45360","endLine":173,"endColumn":54,"suggestions":"46359"},{"ruleId":"45357","severity":2,"message":"45358","line":181,"column":75,"nodeType":"45359","messageId":"45360","endLine":181,"endColumn":78,"suggestions":"46360"},{"ruleId":"45357","severity":2,"message":"45358","line":225,"column":57,"nodeType":"45359","messageId":"45360","endLine":225,"endColumn":60,"suggestions":"46361"},{"ruleId":"45357","severity":2,"message":"45358","line":238,"column":53,"nodeType":"45359","messageId":"45360","endLine":238,"endColumn":56,"suggestions":"46362"},{"ruleId":"45357","severity":2,"message":"45358","line":310,"column":43,"nodeType":"45359","messageId":"45360","endLine":310,"endColumn":46,"suggestions":"46363"},{"ruleId":"45357","severity":2,"message":"45358","line":337,"column":51,"nodeType":"45359","messageId":"45360","endLine":337,"endColumn":54,"suggestions":"46364"},{"ruleId":"45357","severity":2,"message":"45358","line":8,"column":14,"nodeType":"45359","messageId":"45360","endLine":8,"endColumn":17,"suggestions":"46365"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":18,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":21,"suggestions":"46366"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":43,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":46,"suggestions":"46367"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":54,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":57,"suggestions":"46368"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":53,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":56,"suggestions":"46369"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":58,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":61,"suggestions":"46370"},{"ruleId":"45357","severity":2,"message":"45358","line":189,"column":55,"nodeType":"45359","messageId":"45360","endLine":189,"endColumn":58,"suggestions":"46371"},{"ruleId":"45357","severity":2,"message":"45358","line":235,"column":18,"nodeType":"45359","messageId":"45360","endLine":235,"endColumn":21,"suggestions":"46372"},{"ruleId":"45357","severity":2,"message":"45358","line":235,"column":43,"nodeType":"45359","messageId":"45360","endLine":235,"endColumn":46,"suggestions":"46373"},{"ruleId":"45357","severity":2,"message":"45358","line":235,"column":54,"nodeType":"45359","messageId":"45360","endLine":235,"endColumn":57,"suggestions":"46374"},{"ruleId":"45357","severity":2,"message":"45358","line":144,"column":43,"nodeType":"45359","messageId":"45360","endLine":144,"endColumn":46,"suggestions":"46375"},{"ruleId":"45357","severity":2,"message":"45358","line":195,"column":43,"nodeType":"45359","messageId":"45360","endLine":195,"endColumn":46,"suggestions":"46376"},{"ruleId":"45357","severity":2,"message":"45358","line":230,"column":43,"nodeType":"45359","messageId":"45360","endLine":230,"endColumn":46,"suggestions":"46377"},{"ruleId":"45357","severity":2,"message":"45358","line":251,"column":15,"nodeType":"45359","messageId":"45360","endLine":251,"endColumn":18,"suggestions":"46378"},{"ruleId":"45357","severity":2,"message":"45358","line":258,"column":16,"nodeType":"45359","messageId":"45360","endLine":258,"endColumn":19,"suggestions":"46379"},{"ruleId":"45357","severity":2,"message":"45358","line":280,"column":43,"nodeType":"45359","messageId":"45360","endLine":280,"endColumn":46,"suggestions":"46380"},{"ruleId":"45357","severity":2,"message":"45358","line":315,"column":43,"nodeType":"45359","messageId":"45360","endLine":315,"endColumn":46,"suggestions":"46381"},{"ruleId":"45357","severity":2,"message":"45358","line":321,"column":79,"nodeType":"45359","messageId":"45360","endLine":321,"endColumn":82,"suggestions":"46382"},{"ruleId":"45357","severity":2,"message":"45358","line":321,"column":92,"nodeType":"45359","messageId":"45360","endLine":321,"endColumn":95,"suggestions":"46383"},{"ruleId":"45357","severity":2,"message":"45358","line":361,"column":43,"nodeType":"45359","messageId":"45360","endLine":361,"endColumn":46,"suggestions":"46384"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":47,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":50,"suggestions":"46385"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":47,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":50,"suggestions":"46386"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":47,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":50,"suggestions":"46387"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":47,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":50,"suggestions":"46388"},{"ruleId":"45357","severity":2,"message":"45358","line":216,"column":43,"nodeType":"45359","messageId":"45360","endLine":216,"endColumn":46,"suggestions":"46389"},{"ruleId":"45357","severity":2,"message":"45358","line":273,"column":49,"nodeType":"45359","messageId":"45360","endLine":273,"endColumn":52,"suggestions":"46390"},{"ruleId":"45357","severity":2,"message":"45358","line":274,"column":53,"nodeType":"45359","messageId":"45360","endLine":274,"endColumn":56,"suggestions":"46391"},{"ruleId":"45357","severity":2,"message":"45358","line":298,"column":43,"nodeType":"45359","messageId":"45360","endLine":298,"endColumn":46,"suggestions":"46392"},{"ruleId":"45357","severity":2,"message":"45358","line":323,"column":43,"nodeType":"45359","messageId":"45360","endLine":323,"endColumn":46,"suggestions":"46393"},{"ruleId":"45357","severity":2,"message":"45358","line":346,"column":43,"nodeType":"45359","messageId":"45360","endLine":346,"endColumn":46,"suggestions":"46394"},{"ruleId":"45357","severity":2,"message":"45358","line":363,"column":43,"nodeType":"45359","messageId":"45360","endLine":363,"endColumn":46,"suggestions":"46395"},{"ruleId":"45357","severity":2,"message":"45358","line":372,"column":58,"nodeType":"45359","messageId":"45360","endLine":372,"endColumn":61,"suggestions":"46396"},{"ruleId":"45357","severity":2,"message":"45358","line":474,"column":47,"nodeType":"45359","messageId":"45360","endLine":474,"endColumn":50,"suggestions":"46397"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":43,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":46,"suggestions":"46398"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":43,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":46,"suggestions":"46399"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":43,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":46,"suggestions":"46400"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":43,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":46,"suggestions":"46401"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":43,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":46,"suggestions":"46402"},{"ruleId":"45357","severity":2,"message":"45358","line":181,"column":43,"nodeType":"45359","messageId":"45360","endLine":181,"endColumn":46,"suggestions":"46403"},{"ruleId":"45357","severity":2,"message":"45358","line":196,"column":43,"nodeType":"45359","messageId":"45360","endLine":196,"endColumn":46,"suggestions":"46404"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":43,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":46,"suggestions":"46405"},{"ruleId":"45357","severity":2,"message":"45358","line":276,"column":43,"nodeType":"45359","messageId":"45360","endLine":276,"endColumn":46,"suggestions":"46406"},{"ruleId":"45357","severity":2,"message":"45358","line":317,"column":43,"nodeType":"45359","messageId":"45360","endLine":317,"endColumn":46,"suggestions":"46407"},{"ruleId":"45357","severity":2,"message":"45358","line":338,"column":43,"nodeType":"45359","messageId":"45360","endLine":338,"endColumn":46,"suggestions":"46408"},{"ruleId":"45357","severity":2,"message":"45358","line":359,"column":59,"nodeType":"45359","messageId":"45360","endLine":359,"endColumn":62,"suggestions":"46409"},{"ruleId":"45357","severity":2,"message":"45358","line":378,"column":56,"nodeType":"45359","messageId":"45360","endLine":378,"endColumn":59,"suggestions":"46410"},{"ruleId":"45357","severity":2,"message":"45358","line":404,"column":43,"nodeType":"45359","messageId":"45360","endLine":404,"endColumn":46,"suggestions":"46411"},{"ruleId":"45357","severity":2,"message":"45358","line":441,"column":43,"nodeType":"45359","messageId":"45360","endLine":441,"endColumn":46,"suggestions":"46412"},{"ruleId":"45357","severity":2,"message":"45358","line":487,"column":43,"nodeType":"45359","messageId":"45360","endLine":487,"endColumn":46,"suggestions":"46413"},{"ruleId":"45357","severity":2,"message":"45358","line":514,"column":43,"nodeType":"45359","messageId":"45360","endLine":514,"endColumn":46,"suggestions":"46414"},{"ruleId":"45357","severity":2,"message":"45358","line":176,"column":40,"nodeType":"45359","messageId":"45360","endLine":176,"endColumn":43,"suggestions":"46415"},{"ruleId":"45357","severity":2,"message":"45358","line":268,"column":45,"nodeType":"45359","messageId":"45360","endLine":268,"endColumn":48,"suggestions":"46416"},{"ruleId":"45357","severity":2,"message":"45358","line":304,"column":43,"nodeType":"45359","messageId":"45360","endLine":304,"endColumn":46,"suggestions":"46417"},{"ruleId":"45357","severity":2,"message":"45358","line":330,"column":45,"nodeType":"45359","messageId":"45360","endLine":330,"endColumn":48,"suggestions":"46418"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":36,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":39,"suggestions":"46419"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":42,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":45,"suggestions":"46420"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":51,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":54,"suggestions":"46421"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":51,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":54,"suggestions":"46422"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":39,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":42,"suggestions":"46423"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":62,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":65,"suggestions":"46424"},{"ruleId":"45357","severity":2,"message":"45358","line":318,"column":4,"nodeType":"45359","messageId":"45360","endLine":318,"endColumn":7,"suggestions":"46425"},{"ruleId":"45357","severity":2,"message":"45358","line":319,"column":16,"nodeType":"45359","messageId":"45360","endLine":319,"endColumn":19,"suggestions":"46426"},{"ruleId":"45357","severity":2,"message":"45358","line":365,"column":10,"nodeType":"45359","messageId":"45360","endLine":365,"endColumn":13,"suggestions":"46427"},{"ruleId":"45357","severity":2,"message":"45358","line":410,"column":25,"nodeType":"45359","messageId":"45360","endLine":410,"endColumn":28,"suggestions":"46428"},{"ruleId":"45357","severity":2,"message":"45358","line":433,"column":10,"nodeType":"45359","messageId":"45360","endLine":433,"endColumn":13,"suggestions":"46429"},{"ruleId":"45357","severity":2,"message":"45358","line":441,"column":24,"nodeType":"45359","messageId":"45360","endLine":441,"endColumn":27,"suggestions":"46430"},{"ruleId":"45357","severity":2,"message":"45358","line":442,"column":11,"nodeType":"45359","messageId":"45360","endLine":442,"endColumn":14,"suggestions":"46431"},{"ruleId":"45357","severity":2,"message":"45358","line":480,"column":44,"nodeType":"45359","messageId":"45360","endLine":480,"endColumn":47,"suggestions":"46432"},{"ruleId":"45357","severity":2,"message":"45358","line":533,"column":53,"nodeType":"45359","messageId":"45360","endLine":533,"endColumn":56,"suggestions":"46433"},{"ruleId":"45357","severity":2,"message":"45358","line":1248,"column":53,"nodeType":"45359","messageId":"45360","endLine":1248,"endColumn":56,"suggestions":"46434"},{"ruleId":"45357","severity":2,"message":"45358","line":1377,"column":53,"nodeType":"45359","messageId":"45360","endLine":1377,"endColumn":56,"suggestions":"46435"},{"ruleId":"45357","severity":2,"message":"45358","line":1458,"column":53,"nodeType":"45359","messageId":"45360","endLine":1458,"endColumn":56,"suggestions":"46436"},{"ruleId":"45357","severity":2,"message":"45358","line":1661,"column":60,"nodeType":"45359","messageId":"45360","endLine":1661,"endColumn":63,"suggestions":"46437"},{"ruleId":"45357","severity":2,"message":"45358","line":1702,"column":60,"nodeType":"45359","messageId":"45360","endLine":1702,"endColumn":63,"suggestions":"46438"},{"ruleId":"45357","severity":2,"message":"45358","line":1757,"column":60,"nodeType":"45359","messageId":"45360","endLine":1757,"endColumn":63,"suggestions":"46439"},{"ruleId":"45357","severity":2,"message":"45358","line":1847,"column":53,"nodeType":"45359","messageId":"45360","endLine":1847,"endColumn":56,"suggestions":"46440"},{"ruleId":"45357","severity":2,"message":"45358","line":1865,"column":53,"nodeType":"45359","messageId":"45360","endLine":1865,"endColumn":56,"suggestions":"46441"},{"ruleId":"45357","severity":2,"message":"45358","line":1940,"column":78,"nodeType":"45359","messageId":"45360","endLine":1940,"endColumn":81,"suggestions":"46442"},{"ruleId":"45357","severity":2,"message":"45358","line":1943,"column":28,"nodeType":"45359","messageId":"45360","endLine":1943,"endColumn":31,"suggestions":"46443"},{"ruleId":"45357","severity":2,"message":"45358","line":1944,"column":28,"nodeType":"45359","messageId":"45360","endLine":1944,"endColumn":31,"suggestions":"46444"},{"ruleId":"45357","severity":2,"message":"45358","line":1946,"column":24,"nodeType":"45359","messageId":"45360","endLine":1946,"endColumn":27,"suggestions":"46445"},{"ruleId":"45357","severity":2,"message":"45358","line":1949,"column":28,"nodeType":"45359","messageId":"45360","endLine":1949,"endColumn":31,"suggestions":"46446"},{"ruleId":"45357","severity":2,"message":"45358","line":1991,"column":80,"nodeType":"45359","messageId":"45360","endLine":1991,"endColumn":83,"suggestions":"46447"},{"ruleId":"45357","severity":2,"message":"45358","line":1994,"column":30,"nodeType":"45359","messageId":"45360","endLine":1994,"endColumn":33,"suggestions":"46448"},{"ruleId":"45357","severity":2,"message":"45358","line":1997,"column":20,"nodeType":"45359","messageId":"45360","endLine":1997,"endColumn":23,"suggestions":"46449"},{"ruleId":"45357","severity":2,"message":"45358","line":2003,"column":84,"nodeType":"45359","messageId":"45360","endLine":2003,"endColumn":87,"suggestions":"46450"},{"ruleId":"45357","severity":2,"message":"45358","line":2005,"column":32,"nodeType":"45359","messageId":"45360","endLine":2005,"endColumn":35,"suggestions":"46451"},{"ruleId":"45357","severity":2,"message":"45358","line":2009,"column":34,"nodeType":"45359","messageId":"45360","endLine":2009,"endColumn":37,"suggestions":"46452"},{"ruleId":"45357","severity":2,"message":"45358","line":2033,"column":53,"nodeType":"45359","messageId":"45360","endLine":2033,"endColumn":56,"suggestions":"46453"},{"ruleId":"45357","severity":2,"message":"45358","line":2068,"column":53,"nodeType":"45359","messageId":"45360","endLine":2068,"endColumn":56,"suggestions":"46454"},{"ruleId":"45357","severity":2,"message":"45358","line":2089,"column":53,"nodeType":"45359","messageId":"45360","endLine":2089,"endColumn":56,"suggestions":"46455"},{"ruleId":"45357","severity":2,"message":"45358","line":2172,"column":53,"nodeType":"45359","messageId":"45360","endLine":2172,"endColumn":56,"suggestions":"46456"},{"ruleId":"45357","severity":2,"message":"45358","line":2334,"column":50,"nodeType":"45359","messageId":"45360","endLine":2334,"endColumn":53,"suggestions":"46457"},{"ruleId":"45357","severity":2,"message":"45358","line":2337,"column":21,"nodeType":"45359","messageId":"45360","endLine":2337,"endColumn":24,"suggestions":"46458"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":61,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":64,"suggestions":"46459"},{"ruleId":"45357","severity":2,"message":"45358","line":150,"column":13,"nodeType":"45359","messageId":"45360","endLine":150,"endColumn":16,"suggestions":"46460"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":51,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":54,"suggestions":"46461"},{"ruleId":"45357","severity":2,"message":"45358","line":178,"column":13,"nodeType":"45359","messageId":"45360","endLine":178,"endColumn":16,"suggestions":"46462"},{"ruleId":"45357","severity":2,"message":"45358","line":209,"column":13,"nodeType":"45359","messageId":"45360","endLine":209,"endColumn":16,"suggestions":"46463"},{"ruleId":"45357","severity":2,"message":"45358","line":244,"column":13,"nodeType":"45359","messageId":"45360","endLine":244,"endColumn":16,"suggestions":"46464"},{"ruleId":"45357","severity":2,"message":"45358","line":13,"column":34,"nodeType":"45359","messageId":"45360","endLine":13,"endColumn":37,"suggestions":"46465"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":33,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":36,"suggestions":"46466"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":35,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":38,"suggestions":"46467"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":28,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":31,"suggestions":"46468"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":22,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":25,"suggestions":"46469"},{"ruleId":"45357","severity":2,"message":"45358","line":143,"column":28,"nodeType":"45359","messageId":"45360","endLine":143,"endColumn":31,"suggestions":"46470"},{"ruleId":"45357","severity":2,"message":"45358","line":179,"column":38,"nodeType":"45359","messageId":"45360","endLine":179,"endColumn":41,"suggestions":"46471"},{"ruleId":"45357","severity":2,"message":"45358","line":180,"column":38,"nodeType":"45359","messageId":"45360","endLine":180,"endColumn":41,"suggestions":"46472"},{"ruleId":"45357","severity":2,"message":"45358","line":277,"column":38,"nodeType":"45359","messageId":"45360","endLine":277,"endColumn":41,"suggestions":"46473"},{"ruleId":"45357","severity":2,"message":"45358","line":344,"column":25,"nodeType":"45359","messageId":"45360","endLine":344,"endColumn":28,"suggestions":"46474"},{"ruleId":"45357","severity":2,"message":"45358","line":346,"column":29,"nodeType":"45359","messageId":"45360","endLine":346,"endColumn":32,"suggestions":"46475"},{"ruleId":"45357","severity":2,"message":"45358","line":347,"column":39,"nodeType":"45359","messageId":"45360","endLine":347,"endColumn":42,"suggestions":"46476"},{"ruleId":"45357","severity":2,"message":"45358","line":348,"column":39,"nodeType":"45359","messageId":"45360","endLine":348,"endColumn":42,"suggestions":"46477"},{"ruleId":"45357","severity":2,"message":"45358","line":349,"column":29,"nodeType":"45359","messageId":"45360","endLine":349,"endColumn":32,"suggestions":"46478"},{"ruleId":"45357","severity":2,"message":"45358","line":354,"column":40,"nodeType":"45359","messageId":"45360","endLine":354,"endColumn":43,"suggestions":"46479"},{"ruleId":"45357","severity":2,"message":"45358","line":355,"column":40,"nodeType":"45359","messageId":"45360","endLine":355,"endColumn":43,"suggestions":"46480"},{"ruleId":"45357","severity":2,"message":"45358","line":356,"column":14,"nodeType":"45359","messageId":"45360","endLine":356,"endColumn":17,"suggestions":"46481"},{"ruleId":"45357","severity":2,"message":"45358","line":356,"column":53,"nodeType":"45359","messageId":"45360","endLine":356,"endColumn":56,"suggestions":"46482"},{"ruleId":"45357","severity":2,"message":"45358","line":357,"column":14,"nodeType":"45359","messageId":"45360","endLine":357,"endColumn":17,"suggestions":"46483"},{"ruleId":"45357","severity":2,"message":"45358","line":357,"column":62,"nodeType":"45359","messageId":"45360","endLine":357,"endColumn":65,"suggestions":"46484"},{"ruleId":"45357","severity":2,"message":"45358","line":358,"column":53,"nodeType":"45359","messageId":"45360","endLine":358,"endColumn":56,"suggestions":"46485"},{"ruleId":"45357","severity":2,"message":"45358","line":396,"column":51,"nodeType":"45359","messageId":"45360","endLine":396,"endColumn":54,"suggestions":"46486"},{"ruleId":"45357","severity":2,"message":"45358","line":398,"column":51,"nodeType":"45359","messageId":"45360","endLine":398,"endColumn":54,"suggestions":"46487"},{"ruleId":"45357","severity":2,"message":"45358","line":399,"column":51,"nodeType":"45359","messageId":"45360","endLine":399,"endColumn":54,"suggestions":"46488"},{"ruleId":"45357","severity":2,"message":"45358","line":400,"column":51,"nodeType":"45359","messageId":"45360","endLine":400,"endColumn":54,"suggestions":"46489"},{"ruleId":"45357","severity":2,"message":"45358","line":401,"column":51,"nodeType":"45359","messageId":"45360","endLine":401,"endColumn":54,"suggestions":"46490"},{"ruleId":"45357","severity":2,"message":"45358","line":428,"column":51,"nodeType":"45359","messageId":"45360","endLine":428,"endColumn":54,"suggestions":"46491"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":51,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":54,"suggestions":"46492"},{"ruleId":"45357","severity":2,"message":"45358","line":447,"column":14,"nodeType":"45359","messageId":"45360","endLine":447,"endColumn":17,"suggestions":"46493"},{"ruleId":"45357","severity":2,"message":"45358","line":448,"column":28,"nodeType":"45359","messageId":"45360","endLine":448,"endColumn":31,"suggestions":"46494"},{"ruleId":"45357","severity":2,"message":"45358","line":489,"column":30,"nodeType":"45359","messageId":"45360","endLine":489,"endColumn":33,"suggestions":"46495"},{"ruleId":"45357","severity":2,"message":"45358","line":490,"column":52,"nodeType":"45359","messageId":"45360","endLine":490,"endColumn":55,"suggestions":"46496"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":69,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":72,"suggestions":"46497"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":35,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":38,"suggestions":"46498"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":35,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":38,"suggestions":"46499"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":10,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":13,"suggestions":"46500"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":49,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":52,"suggestions":"46501"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":49,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":52,"suggestions":"46502"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":49,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":52,"suggestions":"46503"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":35,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":38,"suggestions":"46504"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":22,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":25,"suggestions":"46505"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":9,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":12,"suggestions":"46506"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":35,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":38,"suggestions":"46507"},{"ruleId":"45357","severity":2,"message":"45358","line":161,"column":22,"nodeType":"45359","messageId":"45360","endLine":161,"endColumn":25,"suggestions":"46508"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":9,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":12,"suggestions":"46509"},{"ruleId":"45357","severity":2,"message":"45358","line":208,"column":35,"nodeType":"45359","messageId":"45360","endLine":208,"endColumn":38,"suggestions":"46510"},{"ruleId":"45357","severity":2,"message":"45358","line":253,"column":35,"nodeType":"45359","messageId":"45360","endLine":253,"endColumn":38,"suggestions":"46511"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":9,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":12,"suggestions":"46512"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":44,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":47,"suggestions":"46513"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":29,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":32,"suggestions":"46514"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":21,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":24,"suggestions":"46515"},{"ruleId":"45357","severity":2,"message":"45358","line":78,"column":43,"nodeType":"45359","messageId":"45360","endLine":78,"endColumn":46,"suggestions":"46516"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":9,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":12,"suggestions":"46517"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":30,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":33,"suggestions":"46518"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":9,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":12,"suggestions":"46519"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":30,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":33,"suggestions":"46520"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":9,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":12,"suggestions":"46521"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":44,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":47,"suggestions":"46522"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":43,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":46,"suggestions":"46523"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":9,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":12,"suggestions":"46524"},{"ruleId":"45357","severity":2,"message":"45358","line":153,"column":30,"nodeType":"45359","messageId":"45360","endLine":153,"endColumn":33,"suggestions":"46525"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":9,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":12,"suggestions":"46526"},{"ruleId":"45357","severity":2,"message":"45358","line":168,"column":30,"nodeType":"45359","messageId":"45360","endLine":168,"endColumn":33,"suggestions":"46527"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":37,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":40,"suggestions":"46528"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":61,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":64,"suggestions":"46529"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":29,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":32,"suggestions":"46530"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":29,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":32,"suggestions":"46531"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":9,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":12,"suggestions":"46532"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":68,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":71,"suggestions":"46533"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":30,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":33,"suggestions":"46534"},{"ruleId":"45357","severity":2,"message":"45358","line":127,"column":9,"nodeType":"45359","messageId":"45360","endLine":127,"endColumn":12,"suggestions":"46535"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":20,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":23,"suggestions":"46536"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":9,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":12,"suggestions":"46537"},{"ruleId":"45357","severity":2,"message":"45358","line":153,"column":65,"nodeType":"45359","messageId":"45360","endLine":153,"endColumn":68,"suggestions":"46538"},{"ruleId":"45357","severity":2,"message":"45358","line":169,"column":9,"nodeType":"45359","messageId":"45360","endLine":169,"endColumn":12,"suggestions":"46539"},{"ruleId":"45357","severity":2,"message":"45358","line":173,"column":62,"nodeType":"45359","messageId":"45360","endLine":173,"endColumn":65,"suggestions":"46540"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":37,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":40,"suggestions":"46541"},{"ruleId":"45357","severity":2,"message":"45358","line":188,"column":75,"nodeType":"45359","messageId":"45360","endLine":188,"endColumn":78,"suggestions":"46542"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":9,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":12,"suggestions":"46543"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":30,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":33,"suggestions":"46544"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":9,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":12,"suggestions":"46545"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":30,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":33,"suggestions":"46546"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":21,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":24,"suggestions":"46547"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":44,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":47,"suggestions":"46548"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":9,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":12,"suggestions":"46549"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":30,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":33,"suggestions":"46550"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":43,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":46,"suggestions":"46551"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":9,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":12,"suggestions":"46552"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":30,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":33,"suggestions":"46553"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":9,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":12,"suggestions":"46554"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":30,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":33,"suggestions":"46555"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":10,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":13,"suggestions":"46556"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":9,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":12,"suggestions":"46557"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":47,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":50,"suggestions":"46558"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":50,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":53,"suggestions":"46559"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":69,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":72,"suggestions":"46560"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":50,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":53,"suggestions":"46561"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":69,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":72,"suggestions":"46562"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":21,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":24,"suggestions":"46563"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":43,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":46,"suggestions":"46564"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":9,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":12,"suggestions":"46565"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":92,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":95,"suggestions":"46566"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":50,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":53,"suggestions":"46567"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":83,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":86,"suggestions":"46568"},{"ruleId":"45357","severity":2,"message":"45358","line":126,"column":43,"nodeType":"45359","messageId":"45360","endLine":126,"endColumn":46,"suggestions":"46569"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":9,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":12,"suggestions":"46570"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":91,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":94,"suggestions":"46571"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":21,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":24,"suggestions":"46572"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":43,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":46,"suggestions":"46573"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":9,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":12,"suggestions":"46574"},{"ruleId":"45357","severity":2,"message":"45358","line":160,"column":91,"nodeType":"45359","messageId":"45360","endLine":160,"endColumn":94,"suggestions":"46575"},{"ruleId":"45357","severity":2,"message":"45358","line":54,"column":9,"nodeType":"45359","messageId":"45360","endLine":54,"endColumn":12,"suggestions":"46576"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":42,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":45,"suggestions":"46577"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":9,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":12,"suggestions":"46578"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":42,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":45,"suggestions":"46579"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":21,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":24,"suggestions":"46580"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":43,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":46,"suggestions":"46581"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":9,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":12,"suggestions":"46582"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":30,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":33,"suggestions":"46583"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":21,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":24,"suggestions":"46584"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":44,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":47,"suggestions":"46585"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":9,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":12,"suggestions":"46586"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":30,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":33,"suggestions":"46587"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":21,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":24,"suggestions":"46588"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":44,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":47,"suggestions":"46589"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":9,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":12,"suggestions":"46590"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":30,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":33,"suggestions":"46591"},{"ruleId":"45357","severity":2,"message":"45358","line":157,"column":9,"nodeType":"45359","messageId":"45360","endLine":157,"endColumn":12,"suggestions":"46592"},{"ruleId":"45357","severity":2,"message":"45358","line":159,"column":30,"nodeType":"45359","messageId":"45360","endLine":159,"endColumn":33,"suggestions":"46593"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":21,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":24,"suggestions":"46594"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":43,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":46,"suggestions":"46595"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":9,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":12,"suggestions":"46596"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":30,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":33,"suggestions":"46597"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":21,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":24,"suggestions":"46598"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":44,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":47,"suggestions":"46599"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":9,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":12,"suggestions":"46600"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":30,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":33,"suggestions":"46601"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":21,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":24,"suggestions":"46602"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":44,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":47,"suggestions":"46603"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":9,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":12,"suggestions":"46604"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":30,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":33,"suggestions":"46605"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":43,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":46,"suggestions":"46606"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":9,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":12,"suggestions":"46607"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":30,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":33,"suggestions":"46608"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":30,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":33,"suggestions":"46609"},{"ruleId":"45357","severity":2,"message":"45358","line":13,"column":22,"nodeType":"45359","messageId":"45360","endLine":13,"endColumn":25,"suggestions":"46610"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":24,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":27,"suggestions":"46611"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":22,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":25,"suggestions":"46612"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":24,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":27,"suggestions":"46613"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":22,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":25,"suggestions":"46614"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":24,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":27,"suggestions":"46615"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":22,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":25,"suggestions":"46616"},{"ruleId":"45357","severity":2,"message":"45358","line":70,"column":61,"nodeType":"45359","messageId":"45360","endLine":70,"endColumn":64,"suggestions":"46617"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":24,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":27,"suggestions":"46618"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":22,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":25,"suggestions":"46619"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":24,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":27,"suggestions":"46620"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":21,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":24,"suggestions":"46621"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":44,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":47,"suggestions":"46622"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":9,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":12,"suggestions":"46623"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":67,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":70,"suggestions":"46624"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":21,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":24,"suggestions":"46625"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":44,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":47,"suggestions":"46626"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":9,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":12,"suggestions":"46627"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":93,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":96,"suggestions":"46628"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":21,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":24,"suggestions":"46629"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":44,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":47,"suggestions":"46630"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":9,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":12,"suggestions":"46631"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":59,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":62,"suggestions":"46632"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":9,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":12,"suggestions":"46633"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":70,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":73,"suggestions":"46634"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":9,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":12,"suggestions":"46635"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":30,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":33,"suggestions":"46636"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":21,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":24,"suggestions":"46637"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":43,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":46,"suggestions":"46638"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":9,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":12,"suggestions":"46639"},{"ruleId":"45357","severity":2,"message":"45358","line":138,"column":30,"nodeType":"45359","messageId":"45360","endLine":138,"endColumn":33,"suggestions":"46640"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":9,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":12,"suggestions":"46641"},{"ruleId":"45357","severity":2,"message":"45358","line":157,"column":30,"nodeType":"45359","messageId":"45360","endLine":157,"endColumn":33,"suggestions":"46642"},{"ruleId":"45357","severity":2,"message":"45358","line":191,"column":9,"nodeType":"45359","messageId":"45360","endLine":191,"endColumn":12,"suggestions":"46643"},{"ruleId":"45357","severity":2,"message":"45358","line":194,"column":67,"nodeType":"45359","messageId":"45360","endLine":194,"endColumn":70,"suggestions":"46644"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":17,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":20,"suggestions":"46645"},{"ruleId":"45357","severity":2,"message":"45358","line":214,"column":44,"nodeType":"45359","messageId":"45360","endLine":214,"endColumn":47,"suggestions":"46646"},{"ruleId":"45357","severity":2,"message":"45358","line":217,"column":9,"nodeType":"45359","messageId":"45360","endLine":217,"endColumn":12,"suggestions":"46647"},{"ruleId":"45357","severity":2,"message":"45358","line":221,"column":62,"nodeType":"45359","messageId":"45360","endLine":221,"endColumn":65,"suggestions":"46648"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":61,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":64,"suggestions":"46649"},{"ruleId":"45357","severity":2,"message":"45358","line":231,"column":43,"nodeType":"45359","messageId":"45360","endLine":231,"endColumn":46,"suggestions":"46650"},{"ruleId":"45357","severity":2,"message":"45358","line":241,"column":9,"nodeType":"45359","messageId":"45360","endLine":241,"endColumn":12,"suggestions":"46651"},{"ruleId":"45357","severity":2,"message":"45358","line":245,"column":59,"nodeType":"45359","messageId":"45360","endLine":245,"endColumn":62,"suggestions":"46652"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":9,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":12,"suggestions":"46653"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":30,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":33,"suggestions":"46654"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":21,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":24,"suggestions":"46655"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":44,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":47,"suggestions":"46656"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":9,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":12,"suggestions":"46657"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":30,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":33,"suggestions":"46658"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":21,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":24,"suggestions":"46659"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":44,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":47,"suggestions":"46660"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":9,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":12,"suggestions":"46661"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":30,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":33,"suggestions":"46662"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":21,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":24,"suggestions":"46663"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":44,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":47,"suggestions":"46664"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":9,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":12,"suggestions":"46665"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":30,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":33,"suggestions":"46666"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":43,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":46,"suggestions":"46667"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":9,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":12,"suggestions":"46668"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":30,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":33,"suggestions":"46669"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":9,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":12,"suggestions":"46670"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":30,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":33,"suggestions":"46671"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":18,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":21,"suggestions":"46672","suppressions":"46673"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":22,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":25,"suggestions":"46674","suppressions":"46675"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":37,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":40,"suggestions":"46676"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":79,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":82,"suggestions":"46677"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":37,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":40,"suggestions":"46678"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":79,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":82,"suggestions":"46679"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":37,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":40,"suggestions":"46680"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":75,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":78,"suggestions":"46681"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":29,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":32,"suggestions":"46682"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":37,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":40,"suggestions":"46683"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":73,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":76,"suggestions":"46684"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":29,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":32,"suggestions":"46685"},{"ruleId":"45357","severity":2,"message":"45358","line":167,"column":37,"nodeType":"45359","messageId":"45360","endLine":167,"endColumn":40,"suggestions":"46686"},{"ruleId":"45357","severity":2,"message":"45358","line":172,"column":79,"nodeType":"45359","messageId":"45360","endLine":172,"endColumn":82,"suggestions":"46687"},{"ruleId":"45357","severity":2,"message":"45358","line":185,"column":9,"nodeType":"45359","messageId":"45360","endLine":185,"endColumn":12,"suggestions":"46688"},{"ruleId":"45357","severity":2,"message":"45358","line":192,"column":14,"nodeType":"45359","messageId":"45360","endLine":192,"endColumn":17,"suggestions":"46689"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":37,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":40,"suggestions":"46690"},{"ruleId":"45357","severity":2,"message":"45358","line":209,"column":77,"nodeType":"45359","messageId":"45360","endLine":209,"endColumn":80,"suggestions":"46691"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":9,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":12,"suggestions":"46692"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":76,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":79,"suggestions":"46693"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":9,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":12,"suggestions":"46694"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":88,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":91,"suggestions":"46695"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":21,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":24,"suggestions":"46696"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":43,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":46,"suggestions":"46697"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":9,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":12,"suggestions":"46698"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":79,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":82,"suggestions":"46699"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":9,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":12,"suggestions":"46700"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":86,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":89,"suggestions":"46701"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":9,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":12,"suggestions":"46702"},{"ruleId":"45357","severity":2,"message":"45358","line":143,"column":80,"nodeType":"45359","messageId":"45360","endLine":143,"endColumn":83,"suggestions":"46703"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":9,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":12,"suggestions":"46704"},{"ruleId":"45357","severity":2,"message":"45358","line":158,"column":84,"nodeType":"45359","messageId":"45360","endLine":158,"endColumn":87,"suggestions":"46705"},{"ruleId":"45357","severity":2,"message":"45358","line":172,"column":9,"nodeType":"45359","messageId":"45360","endLine":172,"endColumn":12,"suggestions":"46706"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":86,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":89,"suggestions":"46707"},{"ruleId":"45357","severity":2,"message":"45358","line":182,"column":21,"nodeType":"45359","messageId":"45360","endLine":182,"endColumn":24,"suggestions":"46708"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":44,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":47,"suggestions":"46709"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":9,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":12,"suggestions":"46710"},{"ruleId":"45357","severity":2,"message":"45358","line":191,"column":64,"nodeType":"45359","messageId":"45360","endLine":191,"endColumn":67,"suggestions":"46711"},{"ruleId":"45357","severity":2,"message":"45358","line":209,"column":9,"nodeType":"45359","messageId":"45360","endLine":209,"endColumn":12,"suggestions":"46712"},{"ruleId":"45357","severity":2,"message":"45358","line":213,"column":89,"nodeType":"45359","messageId":"45360","endLine":213,"endColumn":92,"suggestions":"46713"},{"ruleId":"45357","severity":2,"message":"45358","line":241,"column":44,"nodeType":"45359","messageId":"45360","endLine":241,"endColumn":47,"suggestions":"46714"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":9,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":12,"suggestions":"46715"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":30,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":33,"suggestions":"46716"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":9,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":12,"suggestions":"46717"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":30,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":33,"suggestions":"46718"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":9,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":12,"suggestions":"46719"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":30,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":33,"suggestions":"46720"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":10,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":13,"suggestions":"46721"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":9,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":12,"suggestions":"46722"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":30,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":33,"suggestions":"46723"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":43,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":46,"suggestions":"46724"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":9,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":12,"suggestions":"46725"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":30,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":33,"suggestions":"46726"},{"ruleId":"45357","severity":2,"message":"45358","line":158,"column":58,"nodeType":"45359","messageId":"45360","endLine":158,"endColumn":61,"suggestions":"46727"},{"ruleId":"45357","severity":2,"message":"45358","line":300,"column":12,"nodeType":"45359","messageId":"45360","endLine":300,"endColumn":15,"suggestions":"46728"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":34,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":37,"suggestions":"46729"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":21,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":24,"suggestions":"46730"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":43,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":46,"suggestions":"46731"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":9,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":12,"suggestions":"46732"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":30,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":33,"suggestions":"46733"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":21,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":24,"suggestions":"46734"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":44,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":47,"suggestions":"46735"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":9,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":12,"suggestions":"46736"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":30,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":33,"suggestions":"46737"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":9,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":12,"suggestions":"46738"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":30,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":33,"suggestions":"46739"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":9,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":12,"suggestions":"46740"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":44,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":47,"suggestions":"46741"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":9,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":12,"suggestions":"46742"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":30,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":33,"suggestions":"46743"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":9,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":12,"suggestions":"46744"},{"ruleId":"45357","severity":2,"message":"45358","line":138,"column":30,"nodeType":"45359","messageId":"45360","endLine":138,"endColumn":33,"suggestions":"46745"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":84,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":87,"suggestions":"46746"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":62,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":65,"suggestions":"46747"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":9,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":12,"suggestions":"46748"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":81,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":84,"suggestions":"46749"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":21,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":24,"suggestions":"46750"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":43,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":46,"suggestions":"46751"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":9,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":12,"suggestions":"46752"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":74,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":77,"suggestions":"46753"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":9,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":12,"suggestions":"46754"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":84,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":87,"suggestions":"46755"},{"ruleId":"45357","severity":2,"message":"45358","line":143,"column":9,"nodeType":"45359","messageId":"45360","endLine":143,"endColumn":12,"suggestions":"46756"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":82,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":85,"suggestions":"46757"},{"ruleId":"45357","severity":2,"message":"45358","line":157,"column":84,"nodeType":"45359","messageId":"45360","endLine":157,"endColumn":87,"suggestions":"46758"},{"ruleId":"45357","severity":2,"message":"45358","line":160,"column":74,"nodeType":"45359","messageId":"45360","endLine":160,"endColumn":77,"suggestions":"46759"},{"ruleId":"45357","severity":2,"message":"45358","line":169,"column":21,"nodeType":"45359","messageId":"45360","endLine":169,"endColumn":24,"suggestions":"46760"},{"ruleId":"45357","severity":2,"message":"45358","line":171,"column":43,"nodeType":"45359","messageId":"45360","endLine":171,"endColumn":46,"suggestions":"46761"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":9,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":12,"suggestions":"46762"},{"ruleId":"45357","severity":2,"message":"45358","line":178,"column":89,"nodeType":"45359","messageId":"45360","endLine":178,"endColumn":92,"suggestions":"46763"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":9,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":12,"suggestions":"46764"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":30,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":33,"suggestions":"46765"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":9,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":12,"suggestions":"46766"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":30,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":33,"suggestions":"46767"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":21,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":24,"suggestions":"46768"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":44,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":47,"suggestions":"46769"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":9,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":12,"suggestions":"46770"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":30,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":33,"suggestions":"46771"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":21,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":24,"suggestions":"46772"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":43,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":46,"suggestions":"46773"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":9,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":12,"suggestions":"46774"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":30,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":33,"suggestions":"46775"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":43,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":46,"suggestions":"46776"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":9,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":12,"suggestions":"46777"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":30,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":33,"suggestions":"46778"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":21,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":24,"suggestions":"46779"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":44,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":47,"suggestions":"46780"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":9,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":12,"suggestions":"46781"},{"ruleId":"45357","severity":2,"message":"45358","line":138,"column":30,"nodeType":"45359","messageId":"45360","endLine":138,"endColumn":33,"suggestions":"46782"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":9,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":12,"suggestions":"46783"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":73,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":76,"suggestions":"46784"},{"ruleId":"45357","severity":2,"message":"45358","line":78,"column":30,"nodeType":"45359","messageId":"45360","endLine":78,"endColumn":33,"suggestions":"46785"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":9,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":12,"suggestions":"46786"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":81,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":84,"suggestions":"46787"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":43,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":46,"suggestions":"46788"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":9,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":12,"suggestions":"46789"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":74,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":77,"suggestions":"46790"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":43,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":46,"suggestions":"46791"},{"ruleId":"45357","severity":2,"message":"45358","line":127,"column":9,"nodeType":"45359","messageId":"45360","endLine":127,"endColumn":12,"suggestions":"46792"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":20,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":23,"suggestions":"46793"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":43,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":46,"suggestions":"46794"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":9,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":12,"suggestions":"46795"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":62,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":65,"suggestions":"46796"},{"ruleId":"45357","severity":2,"message":"45358","line":170,"column":9,"nodeType":"45359","messageId":"45360","endLine":170,"endColumn":12,"suggestions":"46797"},{"ruleId":"45357","severity":2,"message":"45358","line":174,"column":83,"nodeType":"45359","messageId":"45360","endLine":174,"endColumn":86,"suggestions":"46798"},{"ruleId":"45357","severity":2,"message":"45358","line":192,"column":9,"nodeType":"45359","messageId":"45360","endLine":192,"endColumn":12,"suggestions":"46799"},{"ruleId":"45357","severity":2,"message":"45358","line":196,"column":76,"nodeType":"45359","messageId":"45360","endLine":196,"endColumn":79,"suggestions":"46800"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":21,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":24,"suggestions":"46801"},{"ruleId":"45357","severity":2,"message":"45358","line":25,"column":44,"nodeType":"45359","messageId":"45360","endLine":25,"endColumn":47,"suggestions":"46802"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":9,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":12,"suggestions":"46803"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":30,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":33,"suggestions":"46804"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":21,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":24,"suggestions":"46805"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":44,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":47,"suggestions":"46806"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":9,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":12,"suggestions":"46807"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":30,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":33,"suggestions":"46808"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":21,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":24,"suggestions":"46809"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":44,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":47,"suggestions":"46810"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":9,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":12,"suggestions":"46811"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":30,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":33,"suggestions":"46812"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":21,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":24,"suggestions":"46813"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":44,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":47,"suggestions":"46814"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":9,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":12,"suggestions":"46815"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":30,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":33,"suggestions":"46816"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":21,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":24,"suggestions":"46817"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":43,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":46,"suggestions":"46818"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":9,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":12,"suggestions":"46819"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":30,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":33,"suggestions":"46820"},{"ruleId":"45357","severity":2,"message":"45358","line":130,"column":9,"nodeType":"45359","messageId":"45360","endLine":130,"endColumn":12,"suggestions":"46821"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":30,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":33,"suggestions":"46822"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":9,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":12,"suggestions":"46823"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":30,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":33,"suggestions":"46824"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":21,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":24,"suggestions":"46825"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":43,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":46,"suggestions":"46826"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":9,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":12,"suggestions":"46827"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":30,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":33,"suggestions":"46828"},{"ruleId":"45357","severity":2,"message":"45358","line":54,"column":9,"nodeType":"45359","messageId":"45360","endLine":54,"endColumn":12,"suggestions":"46829"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":72,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":75,"suggestions":"46830"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":9,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":12,"suggestions":"46831"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":92,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":95,"suggestions":"46832"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":9,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":12,"suggestions":"46833"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":82,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":85,"suggestions":"46834"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":43,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":46,"suggestions":"46835"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":9,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":12,"suggestions":"46836"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":66,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":69,"suggestions":"46837"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":21,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":24,"suggestions":"46838"},{"ruleId":"45357","severity":2,"message":"45358","line":126,"column":9,"nodeType":"45359","messageId":"45360","endLine":126,"endColumn":12,"suggestions":"46839"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":44,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":47,"suggestions":"46840"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":9,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":12,"suggestions":"46841"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":20,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":23,"suggestions":"46842"},{"ruleId":"45357","severity":2,"message":"45358","line":154,"column":9,"nodeType":"45359","messageId":"45360","endLine":154,"endColumn":12,"suggestions":"46843"},{"ruleId":"45357","severity":2,"message":"45358","line":158,"column":9,"nodeType":"45359","messageId":"45360","endLine":158,"endColumn":12,"suggestions":"46844"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":76,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":79,"suggestions":"46845"},{"ruleId":"45357","severity":2,"message":"45358","line":178,"column":9,"nodeType":"45359","messageId":"45360","endLine":178,"endColumn":12,"suggestions":"46846"},{"ruleId":"45357","severity":2,"message":"45358","line":186,"column":9,"nodeType":"45359","messageId":"45360","endLine":186,"endColumn":12,"suggestions":"46847"},{"ruleId":"45357","severity":2,"message":"45358","line":189,"column":30,"nodeType":"45359","messageId":"45360","endLine":189,"endColumn":33,"suggestions":"46848"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":21,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":24,"suggestions":"46849"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":43,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":46,"suggestions":"46850"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":9,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":12,"suggestions":"46851"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":94,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":97,"suggestions":"46852"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":9,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":12,"suggestions":"46853"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":90,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":93,"suggestions":"46854"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":9,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":12,"suggestions":"46855"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":30,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":33,"suggestions":"46856"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":9,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":12,"suggestions":"46857"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":30,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":33,"suggestions":"46858"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":21,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":24,"suggestions":"46859"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":44,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":47,"suggestions":"46860"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":9,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":12,"suggestions":"46861"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":30,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":33,"suggestions":"46862"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":9,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":12,"suggestions":"46863"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":30,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":33,"suggestions":"46864"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":20,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":23,"suggestions":"46865"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":20,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":23,"suggestions":"46866"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":36,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":39,"suggestions":"46867"},{"ruleId":"45357","severity":2,"message":"45358","line":196,"column":20,"nodeType":"45359","messageId":"45360","endLine":196,"endColumn":23,"suggestions":"46868"},{"ruleId":"45357","severity":2,"message":"45358","line":215,"column":36,"nodeType":"45359","messageId":"45360","endLine":215,"endColumn":39,"suggestions":"46869"},{"ruleId":"45357","severity":2,"message":"45358","line":242,"column":37,"nodeType":"45359","messageId":"45360","endLine":242,"endColumn":40,"suggestions":"46870"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":17,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":20,"suggestions":"46871"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":17,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":20,"suggestions":"46872"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":17,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":20,"suggestions":"46873"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":17,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":20,"suggestions":"46874"},{"ruleId":"45357","severity":2,"message":"45358","line":54,"column":75,"nodeType":"45359","messageId":"45360","endLine":54,"endColumn":78,"suggestions":"46875"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":68,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":71,"suggestions":"46876"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":29,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":32,"suggestions":"46877"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":29,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":32,"suggestions":"46878"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":74,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":77,"suggestions":"46879"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":68,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":71,"suggestions":"46880"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":29,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":32,"suggestions":"46881"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":75,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":78,"suggestions":"46882"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":67,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":70,"suggestions":"46883"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":9,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":12,"suggestions":"46884"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":87,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":90,"suggestions":"46885"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":75,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":78,"suggestions":"46886"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":75,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":78,"suggestions":"46887"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":68,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":71,"suggestions":"46888"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":68,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":71,"suggestions":"46889"},{"ruleId":"45357","severity":2,"message":"45358","line":218,"column":18,"nodeType":"45359","messageId":"45360","endLine":218,"endColumn":21,"suggestions":"46890"},{"ruleId":"45357","severity":2,"message":"45358","line":239,"column":22,"nodeType":"45359","messageId":"45360","endLine":239,"endColumn":25,"suggestions":"46891"},{"ruleId":"45357","severity":2,"message":"45358","line":255,"column":42,"nodeType":"45359","messageId":"45360","endLine":255,"endColumn":45,"suggestions":"46892"},{"ruleId":"45357","severity":2,"message":"45358","line":259,"column":46,"nodeType":"45359","messageId":"45360","endLine":259,"endColumn":49,"suggestions":"46893"},{"ruleId":"45357","severity":2,"message":"45358","line":260,"column":42,"nodeType":"45359","messageId":"45360","endLine":260,"endColumn":45,"suggestions":"46894"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":9,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":12,"suggestions":"46895"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":30,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":33,"suggestions":"46896"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":9,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":12,"suggestions":"46897"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":30,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":33,"suggestions":"46898"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":9,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":12,"suggestions":"46899"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":30,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":33,"suggestions":"46900"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":9,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":12,"suggestions":"46901"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":30,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":33,"suggestions":"46902"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":21,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":24,"suggestions":"46903"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":44,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":47,"suggestions":"46904"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":9,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":12,"suggestions":"46905"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":30,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":33,"suggestions":"46906"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":21,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":24,"suggestions":"46907"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":44,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":47,"suggestions":"46908"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":9,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":12,"suggestions":"46909"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":30,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":33,"suggestions":"46910"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":22,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":25,"suggestions":"46911"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":9,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":12,"suggestions":"46912"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":30,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":33,"suggestions":"46913"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":9,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":12,"suggestions":"46914"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":30,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":33,"suggestions":"46915"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":43,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":46,"suggestions":"46916"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":9,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":12,"suggestions":"46917"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":30,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":33,"suggestions":"46918"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":43,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":46,"suggestions":"46919"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":9,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":12,"suggestions":"46920"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":30,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":33,"suggestions":"46921"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":9,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":12,"suggestions":"46922"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":30,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":33,"suggestions":"46923"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":37,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":40,"suggestions":"46924"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":66,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":69,"suggestions":"46925"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":37,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":40,"suggestions":"46926"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":58,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":61,"suggestions":"46927"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":37,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":40,"suggestions":"46928"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":73,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":76,"suggestions":"46929"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":37,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":40,"suggestions":"46930"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":77,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":80,"suggestions":"46931"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":37,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":40,"suggestions":"46932"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":76,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":79,"suggestions":"46933"},{"ruleId":"45357","severity":2,"message":"45358","line":167,"column":9,"nodeType":"45359","messageId":"45360","endLine":167,"endColumn":12,"suggestions":"46934"},{"ruleId":"45357","severity":2,"message":"45358","line":168,"column":75,"nodeType":"45359","messageId":"45360","endLine":168,"endColumn":78,"suggestions":"46935"},{"ruleId":"45357","severity":2,"message":"45358","line":173,"column":58,"nodeType":"45359","messageId":"45360","endLine":173,"endColumn":61,"suggestions":"46936"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":83,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":86,"suggestions":"46937"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":72,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":75,"suggestions":"46938"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":9,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":12,"suggestions":"46939"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":75,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":78,"suggestions":"46940"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":9,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":12,"suggestions":"46941"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":81,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":84,"suggestions":"46942"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":21,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":24,"suggestions":"46943"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":43,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":46,"suggestions":"46944"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":9,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":12,"suggestions":"46945"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":84,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":87,"suggestions":"46946"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":21,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":24,"suggestions":"46947"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":44,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":47,"suggestions":"46948"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":9,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":12,"suggestions":"46949"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":78,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":81,"suggestions":"46950"},{"ruleId":"45357","severity":2,"message":"45358","line":164,"column":9,"nodeType":"45359","messageId":"45360","endLine":164,"endColumn":12,"suggestions":"46951"},{"ruleId":"45357","severity":2,"message":"45358","line":168,"column":91,"nodeType":"45359","messageId":"45360","endLine":168,"endColumn":94,"suggestions":"46952"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":9,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":12,"suggestions":"46953"},{"ruleId":"45357","severity":2,"message":"45358","line":188,"column":84,"nodeType":"45359","messageId":"45360","endLine":188,"endColumn":87,"suggestions":"46954"},{"ruleId":"45357","severity":2,"message":"45358","line":200,"column":21,"nodeType":"45359","messageId":"45360","endLine":200,"endColumn":24,"suggestions":"46955"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":44,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":47,"suggestions":"46956"},{"ruleId":"45357","severity":2,"message":"45358","line":205,"column":9,"nodeType":"45359","messageId":"45360","endLine":205,"endColumn":12,"suggestions":"46957"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":20,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":23,"suggestions":"46958"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":59,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":62,"suggestions":"46959"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":90,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":93,"suggestions":"46960"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":51,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":54,"suggestions":"46961"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":65,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":68,"suggestions":"46962"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":59,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":62,"suggestions":"46963"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":90,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":93,"suggestions":"46964"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":59,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":62,"suggestions":"46965"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":94,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":97,"suggestions":"46966"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":51,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":54,"suggestions":"46967"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":87,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":90,"suggestions":"46968"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":43,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":46,"suggestions":"46969"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":9,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":12,"suggestions":"46970"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":74,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":77,"suggestions":"46971"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":21,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":24,"suggestions":"46972"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":43,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":46,"suggestions":"46973"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":9,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":12,"suggestions":"46974"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":30,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":33,"suggestions":"46975"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":21,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":24,"suggestions":"46976"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":43,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":46,"suggestions":"46977"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":9,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":12,"suggestions":"46978"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":30,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":33,"suggestions":"46979"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":9,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":12,"suggestions":"46980"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":30,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":33,"suggestions":"46981"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":9,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":12,"suggestions":"46982"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":30,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":33,"suggestions":"46983"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":9,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":12,"suggestions":"46984"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":30,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":33,"suggestions":"46985"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":21,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":24,"suggestions":"46986"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":44,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":47,"suggestions":"46987"},{"ruleId":"45357","severity":2,"message":"45358","line":126,"column":9,"nodeType":"45359","messageId":"45360","endLine":126,"endColumn":12,"suggestions":"46988"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":30,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":33,"suggestions":"46989"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":43,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":46,"suggestions":"46990"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":9,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":12,"suggestions":"46991"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":30,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":33,"suggestions":"46992"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":9,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":12,"suggestions":"46993"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":30,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":33,"suggestions":"46994"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":21,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":24,"suggestions":"46995"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":44,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":47,"suggestions":"46996"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":9,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":12,"suggestions":"46997"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":30,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":33,"suggestions":"46998"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":43,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":46,"suggestions":"46999"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":9,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":12,"suggestions":"47000"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":30,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":33,"suggestions":"47001"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":21,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":24,"suggestions":"47002"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":43,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":46,"suggestions":"47003"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":9,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":12,"suggestions":"47004"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":30,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":33,"suggestions":"47005"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":9,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":12,"suggestions":"47006"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":30,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":33,"suggestions":"47007"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":9,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":12,"suggestions":"47008"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":30,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":33,"suggestions":"47009"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":9,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":12,"suggestions":"47010"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":30,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":33,"suggestions":"47011"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":9,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":12,"suggestions":"47012"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":30,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":33,"suggestions":"47013"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":9,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":12,"suggestions":"47014"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":30,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":33,"suggestions":"47015"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":21,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":24,"suggestions":"47016"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":43,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":46,"suggestions":"47017"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":9,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":12,"suggestions":"47018"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":30,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":33,"suggestions":"47019"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":21,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":24,"suggestions":"47020"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":44,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":47,"suggestions":"47021"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":9,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":12,"suggestions":"47022"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":30,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":33,"suggestions":"47023"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":21,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":24,"suggestions":"47024"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":44,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":47,"suggestions":"47025"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":9,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":12,"suggestions":"47026"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":30,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":33,"suggestions":"47027"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":9,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":12,"suggestions":"47028"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":30,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":33,"suggestions":"47029"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":9,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":12,"suggestions":"47030"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":75,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":78,"suggestions":"47031"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":37,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":40,"suggestions":"47032"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":85,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":88,"suggestions":"47033"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":37,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":40,"suggestions":"47034"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":66,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":69,"suggestions":"47035"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":37,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":40,"suggestions":"47036"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":66,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":69,"suggestions":"47037"},{"ruleId":"45357","severity":2,"message":"45358","line":161,"column":37,"nodeType":"45359","messageId":"45360","endLine":161,"endColumn":40,"suggestions":"47038"},{"ruleId":"45357","severity":2,"message":"45358","line":165,"column":76,"nodeType":"45359","messageId":"45360","endLine":165,"endColumn":79,"suggestions":"47039"},{"ruleId":"45357","severity":2,"message":"45358","line":173,"column":37,"nodeType":"45359","messageId":"45360","endLine":173,"endColumn":40,"suggestions":"47040"},{"ruleId":"45357","severity":2,"message":"45358","line":177,"column":76,"nodeType":"45359","messageId":"45360","endLine":177,"endColumn":79,"suggestions":"47041"},{"ruleId":"45357","severity":2,"message":"45358","line":189,"column":37,"nodeType":"45359","messageId":"45360","endLine":189,"endColumn":40,"suggestions":"47042"},{"ruleId":"45357","severity":2,"message":"45358","line":193,"column":79,"nodeType":"45359","messageId":"45360","endLine":193,"endColumn":82,"suggestions":"47043"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":43,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":46,"suggestions":"47044"},{"ruleId":"45357","severity":2,"message":"45358","line":209,"column":9,"nodeType":"45359","messageId":"45360","endLine":209,"endColumn":12,"suggestions":"47045"},{"ruleId":"45357","severity":2,"message":"45358","line":213,"column":95,"nodeType":"45359","messageId":"45360","endLine":213,"endColumn":98,"suggestions":"47046"},{"ruleId":"45357","severity":2,"message":"45358","line":217,"column":33,"nodeType":"45359","messageId":"45360","endLine":217,"endColumn":36,"suggestions":"47047"},{"ruleId":"45357","severity":2,"message":"45358","line":218,"column":33,"nodeType":"45359","messageId":"45360","endLine":218,"endColumn":36,"suggestions":"47048"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":9,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":12,"suggestions":"47049"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":74,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":77,"suggestions":"47050"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":9,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":12,"suggestions":"47051"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":83,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":86,"suggestions":"47052"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":21,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":24,"suggestions":"47053"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":44,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":47,"suggestions":"47054"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":9,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":12,"suggestions":"47055"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":20,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":23,"suggestions":"47056"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":9,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":12,"suggestions":"47057"},{"ruleId":"45357","severity":2,"message":"45358","line":130,"column":27,"nodeType":"45359","messageId":"45360","endLine":130,"endColumn":30,"suggestions":"47058"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":21,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":24,"suggestions":"47059"},{"ruleId":"45357","severity":2,"message":"45358","line":143,"column":43,"nodeType":"45359","messageId":"45360","endLine":143,"endColumn":46,"suggestions":"47060"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":9,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":12,"suggestions":"47061"},{"ruleId":"45357","severity":2,"message":"45358","line":150,"column":90,"nodeType":"45359","messageId":"45360","endLine":150,"endColumn":93,"suggestions":"47062"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":43,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":46,"suggestions":"47063"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":9,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":12,"suggestions":"47064"},{"ruleId":"45357","severity":2,"message":"45358","line":170,"column":67,"nodeType":"45359","messageId":"45360","endLine":170,"endColumn":70,"suggestions":"47065"},{"ruleId":"45357","severity":2,"message":"45358","line":180,"column":21,"nodeType":"45359","messageId":"45360","endLine":180,"endColumn":24,"suggestions":"47066"},{"ruleId":"45357","severity":2,"message":"45358","line":183,"column":43,"nodeType":"45359","messageId":"45360","endLine":183,"endColumn":46,"suggestions":"47067"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":9,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":12,"suggestions":"47068"},{"ruleId":"45357","severity":2,"message":"45358","line":191,"column":74,"nodeType":"45359","messageId":"45360","endLine":191,"endColumn":77,"suggestions":"47069"},{"ruleId":"45357","severity":2,"message":"45358","line":228,"column":29,"nodeType":"45359","messageId":"45360","endLine":228,"endColumn":32,"suggestions":"47070"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":29,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":32,"suggestions":"47071"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":38,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":41,"suggestions":"47072"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":38,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":41,"suggestions":"47073"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":75,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":78,"suggestions":"47074"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":35,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":38,"suggestions":"47075"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":45,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":48,"suggestions":"47076"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":21,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":24,"suggestions":"47077"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":21,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":24,"suggestions":"47078"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":24,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":27,"suggestions":"47079"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":48,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":51,"suggestions":"47080"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":34,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":37,"suggestions":"47081"},{"ruleId":"45357","severity":2,"message":"45358","line":245,"column":40,"nodeType":"45359","messageId":"45360","endLine":245,"endColumn":43,"suggestions":"47082"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":26,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":29,"suggestions":"47083"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":26,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":29,"suggestions":"47084"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":26,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":29,"suggestions":"47085"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":26,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":29,"suggestions":"47086"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":50,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":53,"suggestions":"47087"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":26,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":29,"suggestions":"47088"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":26,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":29,"suggestions":"47089"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":64,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":67,"suggestions":"47090"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":44,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":47,"suggestions":"47091"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":47,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":50,"suggestions":"47092"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":36,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":39,"suggestions":"47093"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":69,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":72,"suggestions":"47094"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":29,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":32,"suggestions":"47095"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":14,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":17,"suggestions":"47096"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":62,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":65,"suggestions":"47097"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":49,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":52,"suggestions":"47098"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":49,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":52,"suggestions":"47099"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":49,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":52,"suggestions":"47100"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":74,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":77,"suggestions":"47101"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":53,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":56,"suggestions":"47102"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":49,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":52,"suggestions":"47103"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":49,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":52,"suggestions":"47104"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":49,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":52,"suggestions":"47105"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":60,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":63,"suggestions":"47106"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":36,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":39,"suggestions":"47107","suppressions":"47108"},{"ruleId":"45357","severity":2,"message":"45358","line":244,"column":53,"nodeType":"45359","messageId":"45360","endLine":244,"endColumn":56,"suggestions":"47109"},{"ruleId":"45357","severity":2,"message":"45358","line":269,"column":53,"nodeType":"45359","messageId":"45360","endLine":269,"endColumn":56,"suggestions":"47110"},{"ruleId":"45357","severity":2,"message":"45358","line":305,"column":53,"nodeType":"45359","messageId":"45360","endLine":305,"endColumn":56,"suggestions":"47111"},{"ruleId":"45357","severity":2,"message":"45358","line":355,"column":44,"nodeType":"45359","messageId":"45360","endLine":355,"endColumn":47,"suggestions":"47112"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":43,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":46,"suggestions":"47113"},{"ruleId":"45357","severity":2,"message":"45358","line":203,"column":43,"nodeType":"45359","messageId":"45360","endLine":203,"endColumn":46,"suggestions":"47114"},{"ruleId":"45357","severity":2,"message":"45358","line":208,"column":44,"nodeType":"45359","messageId":"45360","endLine":208,"endColumn":47,"suggestions":"47115"},{"ruleId":"45357","severity":2,"message":"45358","line":215,"column":30,"nodeType":"45359","messageId":"45360","endLine":215,"endColumn":33,"suggestions":"47116"},{"ruleId":"45357","severity":2,"message":"45358","line":243,"column":43,"nodeType":"45359","messageId":"45360","endLine":243,"endColumn":46,"suggestions":"47117"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":21,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":24,"suggestions":"47118"},{"ruleId":"45357","severity":2,"message":"45358","line":263,"column":8,"nodeType":"45359","messageId":"45360","endLine":263,"endColumn":11,"suggestions":"47119"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":43,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":46,"suggestions":"47120"},{"ruleId":"45357","severity":2,"message":"45358","line":237,"column":43,"nodeType":"45359","messageId":"45360","endLine":237,"endColumn":46,"suggestions":"47121"},{"ruleId":"45357","severity":2,"message":"45358","line":319,"column":43,"nodeType":"45359","messageId":"45360","endLine":319,"endColumn":46,"suggestions":"47122"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":53,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":56,"suggestions":"47123"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":55,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":58,"suggestions":"47124"},{"ruleId":"45357","severity":2,"message":"45358","line":150,"column":53,"nodeType":"45359","messageId":"45360","endLine":150,"endColumn":56,"suggestions":"47125"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":28,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":31,"suggestions":"47126"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":24,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":27,"suggestions":"47127"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":61,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":64,"suggestions":"47128"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":58,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":61,"suggestions":"47129"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":28,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":31,"suggestions":"47130"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":52,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":55,"suggestions":"47131"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":46,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":49,"suggestions":"47132"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":28,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":31,"suggestions":"47133"},{"ruleId":"45357","severity":2,"message":"45358","line":176,"column":28,"nodeType":"45359","messageId":"45360","endLine":176,"endColumn":31,"suggestions":"47134"},{"ruleId":"45357","severity":2,"message":"45358","line":190,"column":37,"nodeType":"45359","messageId":"45360","endLine":190,"endColumn":40,"suggestions":"47135"},{"ruleId":"45357","severity":2,"message":"45358","line":208,"column":41,"nodeType":"45359","messageId":"45360","endLine":208,"endColumn":44,"suggestions":"47136"},{"ruleId":"45357","severity":2,"message":"45358","line":232,"column":37,"nodeType":"45359","messageId":"45360","endLine":232,"endColumn":40,"suggestions":"47137"},{"ruleId":"45357","severity":2,"message":"45358","line":233,"column":37,"nodeType":"45359","messageId":"45360","endLine":233,"endColumn":40,"suggestions":"47138"},{"ruleId":"45357","severity":2,"message":"45358","line":314,"column":49,"nodeType":"45359","messageId":"45360","endLine":314,"endColumn":52,"suggestions":"47139"},{"ruleId":"45357","severity":2,"message":"45358","line":336,"column":49,"nodeType":"45359","messageId":"45360","endLine":336,"endColumn":52,"suggestions":"47140"},{"ruleId":"45357","severity":2,"message":"45358","line":358,"column":37,"nodeType":"45359","messageId":"45360","endLine":358,"endColumn":40,"suggestions":"47141"},{"ruleId":"45357","severity":2,"message":"45358","line":359,"column":37,"nodeType":"45359","messageId":"45360","endLine":359,"endColumn":40,"suggestions":"47142"},{"ruleId":"45357","severity":2,"message":"45358","line":360,"column":37,"nodeType":"45359","messageId":"45360","endLine":360,"endColumn":40,"suggestions":"47143"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":43,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":46,"suggestions":"47144"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":43,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":46,"suggestions":"47145"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":43,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":46,"suggestions":"47146"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":43,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":46,"suggestions":"47147"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":43,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":46,"suggestions":"47148"},{"ruleId":"45357","severity":2,"message":"45358","line":180,"column":34,"nodeType":"45359","messageId":"45360","endLine":180,"endColumn":37,"suggestions":"47149"},{"ruleId":"45357","severity":2,"message":"45358","line":198,"column":43,"nodeType":"45359","messageId":"45360","endLine":198,"endColumn":46,"suggestions":"47150"},{"ruleId":"45357","severity":2,"message":"45358","line":225,"column":43,"nodeType":"45359","messageId":"45360","endLine":225,"endColumn":46,"suggestions":"47151"},{"ruleId":"45357","severity":2,"message":"45358","line":264,"column":43,"nodeType":"45359","messageId":"45360","endLine":264,"endColumn":46,"suggestions":"47152"},{"ruleId":"45357","severity":2,"message":"45358","line":265,"column":56,"nodeType":"45359","messageId":"45360","endLine":265,"endColumn":59,"suggestions":"47153"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":18,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":21,"suggestions":"47154"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":17,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":20,"suggestions":"47155"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":27,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":30,"suggestions":"47156"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":17,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":20,"suggestions":"47157"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":27,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":30,"suggestions":"47158"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":18,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":21,"suggestions":"47159"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":28,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":31,"suggestions":"47160"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":18,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":21,"suggestions":"47161"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":28,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":31,"suggestions":"47162"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":27,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":30,"suggestions":"47163"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":33,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":36,"suggestions":"47164"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":82,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":85,"suggestions":"47165"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":21,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":24,"suggestions":"47166"},{"ruleId":"45357","severity":2,"message":"45358","line":259,"column":16,"nodeType":"45359","messageId":"45360","endLine":259,"endColumn":19,"suggestions":"47167"},{"ruleId":"45357","severity":2,"message":"45358","line":268,"column":38,"nodeType":"45359","messageId":"45360","endLine":268,"endColumn":41,"suggestions":"47168"},{"ruleId":"45357","severity":2,"message":"45358","line":268,"column":53,"nodeType":"45359","messageId":"45360","endLine":268,"endColumn":56,"suggestions":"47169"},{"ruleId":"45357","severity":2,"message":"45358","line":295,"column":16,"nodeType":"45359","messageId":"45360","endLine":295,"endColumn":19,"suggestions":"47170"},{"ruleId":"45357","severity":2,"message":"45358","line":296,"column":25,"nodeType":"45359","messageId":"45360","endLine":296,"endColumn":28,"suggestions":"47171"},{"ruleId":"45357","severity":2,"message":"45358","line":321,"column":37,"nodeType":"45359","messageId":"45360","endLine":321,"endColumn":40,"suggestions":"47172"},{"ruleId":"45357","severity":2,"message":"45358","line":321,"column":52,"nodeType":"45359","messageId":"45360","endLine":321,"endColumn":55,"suggestions":"47173"},{"ruleId":"45357","severity":2,"message":"45358","line":321,"column":66,"nodeType":"45359","messageId":"45360","endLine":321,"endColumn":69,"suggestions":"47174"},{"ruleId":"45357","severity":2,"message":"45358","line":413,"column":16,"nodeType":"45359","messageId":"45360","endLine":413,"endColumn":19,"suggestions":"47175"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":38,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":41,"suggestions":"47176"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":53,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":56,"suggestions":"47177"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":67,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":70,"suggestions":"47178"},{"ruleId":"45357","severity":2,"message":"45358","line":450,"column":16,"nodeType":"45359","messageId":"45360","endLine":450,"endColumn":19,"suggestions":"47179"},{"ruleId":"45357","severity":2,"message":"45358","line":494,"column":38,"nodeType":"45359","messageId":"45360","endLine":494,"endColumn":41,"suggestions":"47180"},{"ruleId":"45357","severity":2,"message":"45358","line":494,"column":53,"nodeType":"45359","messageId":"45360","endLine":494,"endColumn":56,"suggestions":"47181"},{"ruleId":"45357","severity":2,"message":"45358","line":504,"column":27,"nodeType":"45359","messageId":"45360","endLine":504,"endColumn":30,"suggestions":"47182"},{"ruleId":"45357","severity":2,"message":"45358","line":513,"column":16,"nodeType":"45359","messageId":"45360","endLine":513,"endColumn":19,"suggestions":"47183"},{"ruleId":"45357","severity":2,"message":"45358","line":529,"column":40,"nodeType":"45359","messageId":"45360","endLine":529,"endColumn":43,"suggestions":"47184"},{"ruleId":"45357","severity":2,"message":"45358","line":529,"column":55,"nodeType":"45359","messageId":"45360","endLine":529,"endColumn":58,"suggestions":"47185"},{"ruleId":"45357","severity":2,"message":"45358","line":537,"column":29,"nodeType":"45359","messageId":"45360","endLine":537,"endColumn":32,"suggestions":"47186"},{"ruleId":"45357","severity":2,"message":"45358","line":593,"column":16,"nodeType":"45359","messageId":"45360","endLine":593,"endColumn":19,"suggestions":"47187"},{"ruleId":"45357","severity":2,"message":"45358","line":608,"column":40,"nodeType":"45359","messageId":"45360","endLine":608,"endColumn":43,"suggestions":"47188"},{"ruleId":"45357","severity":2,"message":"45358","line":608,"column":55,"nodeType":"45359","messageId":"45360","endLine":608,"endColumn":58,"suggestions":"47189"},{"ruleId":"45357","severity":2,"message":"45358","line":615,"column":29,"nodeType":"45359","messageId":"45360","endLine":615,"endColumn":32,"suggestions":"47190"},{"ruleId":"45357","severity":2,"message":"45358","line":627,"column":16,"nodeType":"45359","messageId":"45360","endLine":627,"endColumn":19,"suggestions":"47191"},{"ruleId":"45357","severity":2,"message":"45358","line":640,"column":40,"nodeType":"45359","messageId":"45360","endLine":640,"endColumn":43,"suggestions":"47192"},{"ruleId":"45357","severity":2,"message":"45358","line":640,"column":55,"nodeType":"45359","messageId":"45360","endLine":640,"endColumn":58,"suggestions":"47193"},{"ruleId":"45357","severity":2,"message":"45358","line":647,"column":29,"nodeType":"45359","messageId":"45360","endLine":647,"endColumn":32,"suggestions":"47194"},{"ruleId":"45357","severity":2,"message":"45358","line":659,"column":16,"nodeType":"45359","messageId":"45360","endLine":659,"endColumn":19,"suggestions":"47195"},{"ruleId":"45357","severity":2,"message":"45358","line":668,"column":38,"nodeType":"45359","messageId":"45360","endLine":668,"endColumn":41,"suggestions":"47196"},{"ruleId":"45357","severity":2,"message":"45358","line":668,"column":53,"nodeType":"45359","messageId":"45360","endLine":668,"endColumn":56,"suggestions":"47197"},{"ruleId":"45357","severity":2,"message":"45358","line":675,"column":27,"nodeType":"45359","messageId":"45360","endLine":675,"endColumn":30,"suggestions":"47198"},{"ruleId":"45357","severity":2,"message":"45358","line":683,"column":16,"nodeType":"45359","messageId":"45360","endLine":683,"endColumn":19,"suggestions":"47199"},{"ruleId":"45357","severity":2,"message":"45358","line":707,"column":40,"nodeType":"45359","messageId":"45360","endLine":707,"endColumn":43,"suggestions":"47200"},{"ruleId":"45357","severity":2,"message":"45358","line":707,"column":55,"nodeType":"45359","messageId":"45360","endLine":707,"endColumn":58,"suggestions":"47201"},{"ruleId":"45357","severity":2,"message":"45358","line":714,"column":29,"nodeType":"45359","messageId":"45360","endLine":714,"endColumn":32,"suggestions":"47202"},{"ruleId":"45357","severity":2,"message":"45358","line":738,"column":23,"nodeType":"45359","messageId":"45360","endLine":738,"endColumn":26,"suggestions":"47203"},{"ruleId":"45357","severity":2,"message":"45358","line":743,"column":40,"nodeType":"45359","messageId":"45360","endLine":743,"endColumn":43,"suggestions":"47204"},{"ruleId":"45357","severity":2,"message":"45358","line":743,"column":55,"nodeType":"45359","messageId":"45360","endLine":743,"endColumn":58,"suggestions":"47205"},{"ruleId":"45357","severity":2,"message":"45358","line":750,"column":29,"nodeType":"45359","messageId":"45360","endLine":750,"endColumn":32,"suggestions":"47206"},{"ruleId":"45357","severity":2,"message":"45358","line":762,"column":16,"nodeType":"45359","messageId":"45360","endLine":762,"endColumn":19,"suggestions":"47207"},{"ruleId":"45357","severity":2,"message":"45358","line":767,"column":38,"nodeType":"45359","messageId":"45360","endLine":767,"endColumn":41,"suggestions":"47208"},{"ruleId":"45357","severity":2,"message":"45358","line":767,"column":53,"nodeType":"45359","messageId":"45360","endLine":767,"endColumn":56,"suggestions":"47209"},{"ruleId":"45357","severity":2,"message":"45358","line":774,"column":27,"nodeType":"45359","messageId":"45360","endLine":774,"endColumn":30,"suggestions":"47210"},{"ruleId":"45357","severity":2,"message":"45358","line":782,"column":16,"nodeType":"45359","messageId":"45360","endLine":782,"endColumn":19,"suggestions":"47211"},{"ruleId":"45357","severity":2,"message":"45358","line":790,"column":38,"nodeType":"45359","messageId":"45360","endLine":790,"endColumn":41,"suggestions":"47212"},{"ruleId":"45357","severity":2,"message":"45358","line":790,"column":53,"nodeType":"45359","messageId":"45360","endLine":790,"endColumn":56,"suggestions":"47213"},{"ruleId":"45357","severity":2,"message":"45358","line":797,"column":27,"nodeType":"45359","messageId":"45360","endLine":797,"endColumn":30,"suggestions":"47214"},{"ruleId":"45357","severity":2,"message":"45358","line":806,"column":16,"nodeType":"45359","messageId":"45360","endLine":806,"endColumn":19,"suggestions":"47215"},{"ruleId":"45357","severity":2,"message":"45358","line":815,"column":38,"nodeType":"45359","messageId":"45360","endLine":815,"endColumn":41,"suggestions":"47216"},{"ruleId":"45357","severity":2,"message":"45358","line":815,"column":53,"nodeType":"45359","messageId":"45360","endLine":815,"endColumn":56,"suggestions":"47217"},{"ruleId":"45357","severity":2,"message":"45358","line":825,"column":27,"nodeType":"45359","messageId":"45360","endLine":825,"endColumn":30,"suggestions":"47218"},{"ruleId":"45357","severity":2,"message":"45358","line":841,"column":16,"nodeType":"45359","messageId":"45360","endLine":841,"endColumn":19,"suggestions":"47219"},{"ruleId":"45357","severity":2,"message":"45358","line":867,"column":38,"nodeType":"45359","messageId":"45360","endLine":867,"endColumn":41,"suggestions":"47220"},{"ruleId":"45357","severity":2,"message":"45358","line":867,"column":53,"nodeType":"45359","messageId":"45360","endLine":867,"endColumn":56,"suggestions":"47221"},{"ruleId":"45357","severity":2,"message":"45358","line":867,"column":66,"nodeType":"45359","messageId":"45360","endLine":867,"endColumn":69,"suggestions":"47222"},{"ruleId":"45357","severity":2,"message":"45358","line":877,"column":27,"nodeType":"45359","messageId":"45360","endLine":877,"endColumn":30,"suggestions":"47223"},{"ruleId":"45357","severity":2,"message":"45358","line":909,"column":38,"nodeType":"45359","messageId":"45360","endLine":909,"endColumn":41,"suggestions":"47224"},{"ruleId":"45357","severity":2,"message":"45358","line":909,"column":53,"nodeType":"45359","messageId":"45360","endLine":909,"endColumn":56,"suggestions":"47225"},{"ruleId":"45357","severity":2,"message":"45358","line":915,"column":27,"nodeType":"45359","messageId":"45360","endLine":915,"endColumn":30,"suggestions":"47226"},{"ruleId":"45357","severity":2,"message":"45358","line":919,"column":44,"nodeType":"45359","messageId":"45360","endLine":919,"endColumn":47,"suggestions":"47227"},{"ruleId":"45357","severity":2,"message":"45358","line":994,"column":16,"nodeType":"45359","messageId":"45360","endLine":994,"endColumn":19,"suggestions":"47228"},{"ruleId":"45357","severity":2,"message":"45358","line":1006,"column":40,"nodeType":"45359","messageId":"45360","endLine":1006,"endColumn":43,"suggestions":"47229"},{"ruleId":"45357","severity":2,"message":"45358","line":1006,"column":55,"nodeType":"45359","messageId":"45360","endLine":1006,"endColumn":58,"suggestions":"47230"},{"ruleId":"45357","severity":2,"message":"45358","line":1013,"column":29,"nodeType":"45359","messageId":"45360","endLine":1013,"endColumn":32,"suggestions":"47231"},{"ruleId":"45357","severity":2,"message":"45358","line":1024,"column":16,"nodeType":"45359","messageId":"45360","endLine":1024,"endColumn":19,"suggestions":"47232"},{"ruleId":"45357","severity":2,"message":"45358","line":1065,"column":40,"nodeType":"45359","messageId":"45360","endLine":1065,"endColumn":43,"suggestions":"47233"},{"ruleId":"45357","severity":2,"message":"45358","line":1065,"column":55,"nodeType":"45359","messageId":"45360","endLine":1065,"endColumn":58,"suggestions":"47234"},{"ruleId":"45357","severity":2,"message":"45358","line":1072,"column":29,"nodeType":"45359","messageId":"45360","endLine":1072,"endColumn":32,"suggestions":"47235"},{"ruleId":"45357","severity":2,"message":"45358","line":1130,"column":27,"nodeType":"45359","messageId":"45360","endLine":1130,"endColumn":30,"suggestions":"47236"},{"ruleId":"45357","severity":2,"message":"45358","line":1152,"column":27,"nodeType":"45359","messageId":"45360","endLine":1152,"endColumn":30,"suggestions":"47237"},{"ruleId":"45357","severity":2,"message":"45358","line":1158,"column":16,"nodeType":"45359","messageId":"45360","endLine":1158,"endColumn":19,"suggestions":"47238"},{"ruleId":"45357","severity":2,"message":"45358","line":1167,"column":38,"nodeType":"45359","messageId":"45360","endLine":1167,"endColumn":41,"suggestions":"47239"},{"ruleId":"45357","severity":2,"message":"45358","line":1167,"column":53,"nodeType":"45359","messageId":"45360","endLine":1167,"endColumn":56,"suggestions":"47240"},{"ruleId":"45357","severity":2,"message":"45358","line":1183,"column":27,"nodeType":"45359","messageId":"45360","endLine":1183,"endColumn":30,"suggestions":"47241"},{"ruleId":"45357","severity":2,"message":"45358","line":1208,"column":27,"nodeType":"45359","messageId":"45360","endLine":1208,"endColumn":30,"suggestions":"47242"},{"ruleId":"45357","severity":2,"message":"45358","line":1217,"column":16,"nodeType":"45359","messageId":"45360","endLine":1217,"endColumn":19,"suggestions":"47243"},{"ruleId":"45357","severity":2,"message":"45358","line":1226,"column":38,"nodeType":"45359","messageId":"45360","endLine":1226,"endColumn":41,"suggestions":"47244"},{"ruleId":"45357","severity":2,"message":"45358","line":1226,"column":53,"nodeType":"45359","messageId":"45360","endLine":1226,"endColumn":56,"suggestions":"47245"},{"ruleId":"45357","severity":2,"message":"45358","line":1245,"column":27,"nodeType":"45359","messageId":"45360","endLine":1245,"endColumn":30,"suggestions":"47246"},{"ruleId":"45357","severity":2,"message":"45358","line":1264,"column":38,"nodeType":"45359","messageId":"45360","endLine":1264,"endColumn":41,"suggestions":"47247"},{"ruleId":"45357","severity":2,"message":"45358","line":1264,"column":53,"nodeType":"45359","messageId":"45360","endLine":1264,"endColumn":56,"suggestions":"47248"},{"ruleId":"45357","severity":2,"message":"45358","line":1280,"column":27,"nodeType":"45359","messageId":"45360","endLine":1280,"endColumn":30,"suggestions":"47249"},{"ruleId":"45357","severity":2,"message":"45358","line":1284,"column":44,"nodeType":"45359","messageId":"45360","endLine":1284,"endColumn":47,"suggestions":"47250"},{"ruleId":"45357","severity":2,"message":"45358","line":1310,"column":27,"nodeType":"45359","messageId":"45360","endLine":1310,"endColumn":30,"suggestions":"47251"},{"ruleId":"45357","severity":2,"message":"45358","line":1314,"column":44,"nodeType":"45359","messageId":"45360","endLine":1314,"endColumn":47,"suggestions":"47252"},{"ruleId":"45357","severity":2,"message":"45358","line":1342,"column":27,"nodeType":"45359","messageId":"45360","endLine":1342,"endColumn":30,"suggestions":"47253"},{"ruleId":"45357","severity":2,"message":"45358","line":1346,"column":44,"nodeType":"45359","messageId":"45360","endLine":1346,"endColumn":47,"suggestions":"47254"},{"ruleId":"45357","severity":2,"message":"45358","line":1361,"column":16,"nodeType":"45359","messageId":"45360","endLine":1361,"endColumn":19,"suggestions":"47255"},{"ruleId":"45357","severity":2,"message":"45358","line":1371,"column":40,"nodeType":"45359","messageId":"45360","endLine":1371,"endColumn":43,"suggestions":"47256"},{"ruleId":"45357","severity":2,"message":"45358","line":1371,"column":55,"nodeType":"45359","messageId":"45360","endLine":1371,"endColumn":58,"suggestions":"47257"},{"ruleId":"45357","severity":2,"message":"45358","line":1388,"column":29,"nodeType":"45359","messageId":"45360","endLine":1388,"endColumn":32,"suggestions":"47258"},{"ruleId":"45357","severity":2,"message":"45358","line":1410,"column":38,"nodeType":"45359","messageId":"45360","endLine":1410,"endColumn":41,"suggestions":"47259"},{"ruleId":"45357","severity":2,"message":"45358","line":1410,"column":53,"nodeType":"45359","messageId":"45360","endLine":1410,"endColumn":56,"suggestions":"47260"},{"ruleId":"45357","severity":2,"message":"45358","line":1431,"column":27,"nodeType":"45359","messageId":"45360","endLine":1431,"endColumn":30,"suggestions":"47261"},{"ruleId":"45357","severity":2,"message":"45358","line":1435,"column":44,"nodeType":"45359","messageId":"45360","endLine":1435,"endColumn":47,"suggestions":"47262"},{"ruleId":"45357","severity":2,"message":"45358","line":1443,"column":16,"nodeType":"45359","messageId":"45360","endLine":1443,"endColumn":19,"suggestions":"47263"},{"ruleId":"45357","severity":2,"message":"45358","line":1453,"column":38,"nodeType":"45359","messageId":"45360","endLine":1453,"endColumn":41,"suggestions":"47264"},{"ruleId":"45357","severity":2,"message":"45358","line":1453,"column":53,"nodeType":"45359","messageId":"45360","endLine":1453,"endColumn":56,"suggestions":"47265"},{"ruleId":"45357","severity":2,"message":"45358","line":1466,"column":27,"nodeType":"45359","messageId":"45360","endLine":1466,"endColumn":30,"suggestions":"47266"},{"ruleId":"45357","severity":2,"message":"45358","line":1470,"column":44,"nodeType":"45359","messageId":"45360","endLine":1470,"endColumn":47,"suggestions":"47267"},{"ruleId":"45357","severity":2,"message":"45358","line":1478,"column":21,"nodeType":"45359","messageId":"45360","endLine":1478,"endColumn":24,"suggestions":"47268"},{"ruleId":"45357","severity":2,"message":"45358","line":1498,"column":44,"nodeType":"45359","messageId":"45360","endLine":1498,"endColumn":47,"suggestions":"47269"},{"ruleId":"45357","severity":2,"message":"45358","line":1498,"column":59,"nodeType":"45359","messageId":"45360","endLine":1498,"endColumn":62,"suggestions":"47270"},{"ruleId":"45357","severity":2,"message":"45358","line":1508,"column":27,"nodeType":"45359","messageId":"45360","endLine":1508,"endColumn":30,"suggestions":"47271"},{"ruleId":"45357","severity":2,"message":"45358","line":1518,"column":21,"nodeType":"45359","messageId":"45360","endLine":1518,"endColumn":24,"suggestions":"47272"},{"ruleId":"45357","severity":2,"message":"45358","line":1539,"column":44,"nodeType":"45359","messageId":"45360","endLine":1539,"endColumn":47,"suggestions":"47273"},{"ruleId":"45357","severity":2,"message":"45358","line":1539,"column":59,"nodeType":"45359","messageId":"45360","endLine":1539,"endColumn":62,"suggestions":"47274"},{"ruleId":"45357","severity":2,"message":"45358","line":1549,"column":27,"nodeType":"45359","messageId":"45360","endLine":1549,"endColumn":30,"suggestions":"47275"},{"ruleId":"45357","severity":2,"message":"45358","line":1561,"column":16,"nodeType":"45359","messageId":"45360","endLine":1561,"endColumn":19,"suggestions":"47276"},{"ruleId":"45357","severity":2,"message":"45358","line":1576,"column":38,"nodeType":"45359","messageId":"45360","endLine":1576,"endColumn":41,"suggestions":"47277"},{"ruleId":"45357","severity":2,"message":"45358","line":1576,"column":53,"nodeType":"45359","messageId":"45360","endLine":1576,"endColumn":56,"suggestions":"47278"},{"ruleId":"45357","severity":2,"message":"45358","line":1584,"column":27,"nodeType":"45359","messageId":"45360","endLine":1584,"endColumn":30,"suggestions":"47279"},{"ruleId":"45357","severity":2,"message":"45358","line":1588,"column":44,"nodeType":"45359","messageId":"45360","endLine":1588,"endColumn":47,"suggestions":"47280"},{"ruleId":"45357","severity":2,"message":"45358","line":1596,"column":16,"nodeType":"45359","messageId":"45360","endLine":1596,"endColumn":19,"suggestions":"47281"},{"ruleId":"45357","severity":2,"message":"45358","line":1612,"column":38,"nodeType":"45359","messageId":"45360","endLine":1612,"endColumn":41,"suggestions":"47282"},{"ruleId":"45357","severity":2,"message":"45358","line":1612,"column":53,"nodeType":"45359","messageId":"45360","endLine":1612,"endColumn":56,"suggestions":"47283"},{"ruleId":"45357","severity":2,"message":"45358","line":1612,"column":66,"nodeType":"45359","messageId":"45360","endLine":1612,"endColumn":69,"suggestions":"47284"},{"ruleId":"45357","severity":2,"message":"45358","line":1633,"column":27,"nodeType":"45359","messageId":"45360","endLine":1633,"endColumn":30,"suggestions":"47285"},{"ruleId":"45357","severity":2,"message":"45358","line":1637,"column":44,"nodeType":"45359","messageId":"45360","endLine":1637,"endColumn":47,"suggestions":"47286"},{"ruleId":"45357","severity":2,"message":"45358","line":1645,"column":16,"nodeType":"45359","messageId":"45360","endLine":1645,"endColumn":19,"suggestions":"47287"},{"ruleId":"45357","severity":2,"message":"45358","line":1654,"column":38,"nodeType":"45359","messageId":"45360","endLine":1654,"endColumn":41,"suggestions":"47288"},{"ruleId":"45357","severity":2,"message":"45358","line":1654,"column":53,"nodeType":"45359","messageId":"45360","endLine":1654,"endColumn":56,"suggestions":"47289"},{"ruleId":"45357","severity":2,"message":"45358","line":1674,"column":27,"nodeType":"45359","messageId":"45360","endLine":1674,"endColumn":30,"suggestions":"47290"},{"ruleId":"45357","severity":2,"message":"45358","line":1683,"column":16,"nodeType":"45359","messageId":"45360","endLine":1683,"endColumn":19,"suggestions":"47291"},{"ruleId":"45357","severity":2,"message":"45358","line":1692,"column":38,"nodeType":"45359","messageId":"45360","endLine":1692,"endColumn":41,"suggestions":"47292"},{"ruleId":"45357","severity":2,"message":"45358","line":1692,"column":53,"nodeType":"45359","messageId":"45360","endLine":1692,"endColumn":56,"suggestions":"47293"},{"ruleId":"45357","severity":2,"message":"45358","line":1715,"column":27,"nodeType":"45359","messageId":"45360","endLine":1715,"endColumn":30,"suggestions":"47294"},{"ruleId":"45357","severity":2,"message":"45358","line":1719,"column":44,"nodeType":"45359","messageId":"45360","endLine":1719,"endColumn":47,"suggestions":"47295"},{"ruleId":"45357","severity":2,"message":"45358","line":1726,"column":16,"nodeType":"45359","messageId":"45360","endLine":1726,"endColumn":19,"suggestions":"47296"},{"ruleId":"45357","severity":2,"message":"45358","line":1737,"column":40,"nodeType":"45359","messageId":"45360","endLine":1737,"endColumn":43,"suggestions":"47297"},{"ruleId":"45357","severity":2,"message":"45358","line":1737,"column":55,"nodeType":"45359","messageId":"45360","endLine":1737,"endColumn":58,"suggestions":"47298"},{"ruleId":"45357","severity":2,"message":"45358","line":1744,"column":29,"nodeType":"45359","messageId":"45360","endLine":1744,"endColumn":32,"suggestions":"47299"},{"ruleId":"45357","severity":2,"message":"45358","line":1763,"column":16,"nodeType":"45359","messageId":"45360","endLine":1763,"endColumn":19,"suggestions":"47300"},{"ruleId":"45357","severity":2,"message":"45358","line":1771,"column":38,"nodeType":"45359","messageId":"45360","endLine":1771,"endColumn":41,"suggestions":"47301"},{"ruleId":"45357","severity":2,"message":"45358","line":1771,"column":53,"nodeType":"45359","messageId":"45360","endLine":1771,"endColumn":56,"suggestions":"47302"},{"ruleId":"45357","severity":2,"message":"45358","line":1778,"column":27,"nodeType":"45359","messageId":"45360","endLine":1778,"endColumn":30,"suggestions":"47303"},{"ruleId":"45357","severity":2,"message":"45358","line":1787,"column":16,"nodeType":"45359","messageId":"45360","endLine":1787,"endColumn":19,"suggestions":"47304"},{"ruleId":"45357","severity":2,"message":"45358","line":1802,"column":40,"nodeType":"45359","messageId":"45360","endLine":1802,"endColumn":43,"suggestions":"47305"},{"ruleId":"45357","severity":2,"message":"45358","line":1802,"column":55,"nodeType":"45359","messageId":"45360","endLine":1802,"endColumn":58,"suggestions":"47306"},{"ruleId":"45357","severity":2,"message":"45358","line":1810,"column":29,"nodeType":"45359","messageId":"45360","endLine":1810,"endColumn":32,"suggestions":"47307"},{"ruleId":"45357","severity":2,"message":"45358","line":1839,"column":16,"nodeType":"45359","messageId":"45360","endLine":1839,"endColumn":19,"suggestions":"47308"},{"ruleId":"45357","severity":2,"message":"45358","line":1847,"column":38,"nodeType":"45359","messageId":"45360","endLine":1847,"endColumn":41,"suggestions":"47309"},{"ruleId":"45357","severity":2,"message":"45358","line":1847,"column":53,"nodeType":"45359","messageId":"45360","endLine":1847,"endColumn":56,"suggestions":"47310"},{"ruleId":"45357","severity":2,"message":"45358","line":1854,"column":27,"nodeType":"45359","messageId":"45360","endLine":1854,"endColumn":30,"suggestions":"47311"},{"ruleId":"45357","severity":2,"message":"45358","line":1863,"column":16,"nodeType":"45359","messageId":"45360","endLine":1863,"endColumn":19,"suggestions":"47312"},{"ruleId":"45357","severity":2,"message":"45358","line":1871,"column":38,"nodeType":"45359","messageId":"45360","endLine":1871,"endColumn":41,"suggestions":"47313"},{"ruleId":"45357","severity":2,"message":"45358","line":1871,"column":53,"nodeType":"45359","messageId":"45360","endLine":1871,"endColumn":56,"suggestions":"47314"},{"ruleId":"45357","severity":2,"message":"45358","line":1878,"column":27,"nodeType":"45359","messageId":"45360","endLine":1878,"endColumn":30,"suggestions":"47315"},{"ruleId":"45357","severity":2,"message":"45358","line":1894,"column":16,"nodeType":"45359","messageId":"45360","endLine":1894,"endColumn":19,"suggestions":"47316"},{"ruleId":"45357","severity":2,"message":"45358","line":1904,"column":38,"nodeType":"45359","messageId":"45360","endLine":1904,"endColumn":41,"suggestions":"47317"},{"ruleId":"45357","severity":2,"message":"45358","line":1904,"column":53,"nodeType":"45359","messageId":"45360","endLine":1904,"endColumn":56,"suggestions":"47318"},{"ruleId":"45357","severity":2,"message":"45358","line":1911,"column":27,"nodeType":"45359","messageId":"45360","endLine":1911,"endColumn":30,"suggestions":"47319"},{"ruleId":"45357","severity":2,"message":"45358","line":1949,"column":16,"nodeType":"45359","messageId":"45360","endLine":1949,"endColumn":19,"suggestions":"47320"},{"ruleId":"45357","severity":2,"message":"45358","line":1969,"column":38,"nodeType":"45359","messageId":"45360","endLine":1969,"endColumn":41,"suggestions":"47321"},{"ruleId":"45357","severity":2,"message":"45358","line":1969,"column":53,"nodeType":"45359","messageId":"45360","endLine":1969,"endColumn":56,"suggestions":"47322"},{"ruleId":"45357","severity":2,"message":"45358","line":1976,"column":27,"nodeType":"45359","messageId":"45360","endLine":1976,"endColumn":30,"suggestions":"47323"},{"ruleId":"45357","severity":2,"message":"45358","line":2078,"column":16,"nodeType":"45359","messageId":"45360","endLine":2078,"endColumn":19,"suggestions":"47324"},{"ruleId":"45357","severity":2,"message":"45358","line":2094,"column":38,"nodeType":"45359","messageId":"45360","endLine":2094,"endColumn":41,"suggestions":"47325"},{"ruleId":"45357","severity":2,"message":"45358","line":2094,"column":53,"nodeType":"45359","messageId":"45360","endLine":2094,"endColumn":56,"suggestions":"47326"},{"ruleId":"45357","severity":2,"message":"45358","line":2101,"column":27,"nodeType":"45359","messageId":"45360","endLine":2101,"endColumn":30,"suggestions":"47327"},{"ruleId":"45357","severity":2,"message":"45358","line":2145,"column":38,"nodeType":"45359","messageId":"45360","endLine":2145,"endColumn":41,"suggestions":"47328"},{"ruleId":"45357","severity":2,"message":"45358","line":2152,"column":27,"nodeType":"45359","messageId":"45360","endLine":2152,"endColumn":30,"suggestions":"47329"},{"ruleId":"45357","severity":2,"message":"45358","line":2180,"column":16,"nodeType":"45359","messageId":"45360","endLine":2180,"endColumn":19,"suggestions":"47330"},{"ruleId":"45357","severity":2,"message":"45358","line":2198,"column":38,"nodeType":"45359","messageId":"45360","endLine":2198,"endColumn":41,"suggestions":"47331"},{"ruleId":"45357","severity":2,"message":"45358","line":2198,"column":53,"nodeType":"45359","messageId":"45360","endLine":2198,"endColumn":56,"suggestions":"47332"},{"ruleId":"45357","severity":2,"message":"45358","line":2205,"column":27,"nodeType":"45359","messageId":"45360","endLine":2205,"endColumn":30,"suggestions":"47333"},{"ruleId":"45357","severity":2,"message":"45358","line":2224,"column":16,"nodeType":"45359","messageId":"45360","endLine":2224,"endColumn":19,"suggestions":"47334"},{"ruleId":"45357","severity":2,"message":"45358","line":2240,"column":38,"nodeType":"45359","messageId":"45360","endLine":2240,"endColumn":41,"suggestions":"47335"},{"ruleId":"45357","severity":2,"message":"45358","line":2240,"column":53,"nodeType":"45359","messageId":"45360","endLine":2240,"endColumn":56,"suggestions":"47336"},{"ruleId":"45357","severity":2,"message":"45358","line":2247,"column":27,"nodeType":"45359","messageId":"45360","endLine":2247,"endColumn":30,"suggestions":"47337"},{"ruleId":"45357","severity":2,"message":"45358","line":2265,"column":23,"nodeType":"45359","messageId":"45360","endLine":2265,"endColumn":26,"suggestions":"47338"},{"ruleId":"45357","severity":2,"message":"45358","line":2269,"column":38,"nodeType":"45359","messageId":"45360","endLine":2269,"endColumn":41,"suggestions":"47339"},{"ruleId":"45357","severity":2,"message":"45358","line":2269,"column":53,"nodeType":"45359","messageId":"45360","endLine":2269,"endColumn":56,"suggestions":"47340"},{"ruleId":"45357","severity":2,"message":"45358","line":2276,"column":27,"nodeType":"45359","messageId":"45360","endLine":2276,"endColumn":30,"suggestions":"47341"},{"ruleId":"45357","severity":2,"message":"45358","line":2282,"column":21,"nodeType":"45359","messageId":"45360","endLine":2282,"endColumn":24,"suggestions":"47342"},{"ruleId":"45357","severity":2,"message":"45358","line":2287,"column":38,"nodeType":"45359","messageId":"45360","endLine":2287,"endColumn":41,"suggestions":"47343"},{"ruleId":"45357","severity":2,"message":"45358","line":2287,"column":53,"nodeType":"45359","messageId":"45360","endLine":2287,"endColumn":56,"suggestions":"47344"},{"ruleId":"45357","severity":2,"message":"45358","line":2294,"column":27,"nodeType":"45359","messageId":"45360","endLine":2294,"endColumn":30,"suggestions":"47345"},{"ruleId":"45357","severity":2,"message":"45358","line":2315,"column":27,"nodeType":"45359","messageId":"45360","endLine":2315,"endColumn":30,"suggestions":"47346"},{"ruleId":"45357","severity":2,"message":"45358","line":2319,"column":44,"nodeType":"45359","messageId":"45360","endLine":2319,"endColumn":47,"suggestions":"47347"},{"ruleId":"45357","severity":2,"message":"45358","line":2344,"column":27,"nodeType":"45359","messageId":"45360","endLine":2344,"endColumn":30,"suggestions":"47348"},{"ruleId":"45357","severity":2,"message":"45358","line":2355,"column":16,"nodeType":"45359","messageId":"45360","endLine":2355,"endColumn":19,"suggestions":"47349"},{"ruleId":"45357","severity":2,"message":"45358","line":2368,"column":38,"nodeType":"45359","messageId":"45360","endLine":2368,"endColumn":41,"suggestions":"47350"},{"ruleId":"45357","severity":2,"message":"45358","line":2368,"column":53,"nodeType":"45359","messageId":"45360","endLine":2368,"endColumn":56,"suggestions":"47351"},{"ruleId":"45357","severity":2,"message":"45358","line":2375,"column":27,"nodeType":"45359","messageId":"45360","endLine":2375,"endColumn":30,"suggestions":"47352"},{"ruleId":"45357","severity":2,"message":"45358","line":2442,"column":38,"nodeType":"45359","messageId":"45360","endLine":2442,"endColumn":41,"suggestions":"47353"},{"ruleId":"45357","severity":2,"message":"45358","line":2442,"column":53,"nodeType":"45359","messageId":"45360","endLine":2442,"endColumn":56,"suggestions":"47354"},{"ruleId":"45357","severity":2,"message":"45358","line":2442,"column":66,"nodeType":"45359","messageId":"45360","endLine":2442,"endColumn":69,"suggestions":"47355"},{"ruleId":"45357","severity":2,"message":"45358","line":2449,"column":59,"nodeType":"45359","messageId":"45360","endLine":2449,"endColumn":62,"suggestions":"47356"},{"ruleId":"45357","severity":2,"message":"45358","line":2466,"column":16,"nodeType":"45359","messageId":"45360","endLine":2466,"endColumn":19,"suggestions":"47357"},{"ruleId":"45357","severity":2,"message":"45358","line":2475,"column":38,"nodeType":"45359","messageId":"45360","endLine":2475,"endColumn":41,"suggestions":"47358"},{"ruleId":"45357","severity":2,"message":"45358","line":2475,"column":53,"nodeType":"45359","messageId":"45360","endLine":2475,"endColumn":56,"suggestions":"47359"},{"ruleId":"45357","severity":2,"message":"45358","line":2482,"column":27,"nodeType":"45359","messageId":"45360","endLine":2482,"endColumn":30,"suggestions":"47360"},{"ruleId":"45357","severity":2,"message":"45358","line":2491,"column":16,"nodeType":"45359","messageId":"45360","endLine":2491,"endColumn":19,"suggestions":"47361"},{"ruleId":"45357","severity":2,"message":"45358","line":2500,"column":38,"nodeType":"45359","messageId":"45360","endLine":2500,"endColumn":41,"suggestions":"47362"},{"ruleId":"45357","severity":2,"message":"45358","line":2500,"column":53,"nodeType":"45359","messageId":"45360","endLine":2500,"endColumn":56,"suggestions":"47363"},{"ruleId":"45357","severity":2,"message":"45358","line":2507,"column":27,"nodeType":"45359","messageId":"45360","endLine":2507,"endColumn":30,"suggestions":"47364"},{"ruleId":"45357","severity":2,"message":"45358","line":2528,"column":27,"nodeType":"45359","messageId":"45360","endLine":2528,"endColumn":30,"suggestions":"47365"},{"ruleId":"45357","severity":2,"message":"45358","line":2533,"column":26,"nodeType":"45359","messageId":"45360","endLine":2533,"endColumn":29,"suggestions":"47366"},{"ruleId":"45357","severity":2,"message":"45358","line":2557,"column":16,"nodeType":"45359","messageId":"45360","endLine":2557,"endColumn":19,"suggestions":"47367"},{"ruleId":"45357","severity":2,"message":"45358","line":2569,"column":38,"nodeType":"45359","messageId":"45360","endLine":2569,"endColumn":41,"suggestions":"47368"},{"ruleId":"45357","severity":2,"message":"45358","line":2569,"column":53,"nodeType":"45359","messageId":"45360","endLine":2569,"endColumn":56,"suggestions":"47369"},{"ruleId":"45357","severity":2,"message":"45358","line":2579,"column":27,"nodeType":"45359","messageId":"45360","endLine":2579,"endColumn":30,"suggestions":"47370"},{"ruleId":"45357","severity":2,"message":"45358","line":2597,"column":16,"nodeType":"45359","messageId":"45360","endLine":2597,"endColumn":19,"suggestions":"47371"},{"ruleId":"45357","severity":2,"message":"45358","line":2606,"column":38,"nodeType":"45359","messageId":"45360","endLine":2606,"endColumn":41,"suggestions":"47372"},{"ruleId":"45357","severity":2,"message":"45358","line":2606,"column":53,"nodeType":"45359","messageId":"45360","endLine":2606,"endColumn":56,"suggestions":"47373"},{"ruleId":"45357","severity":2,"message":"45358","line":2613,"column":27,"nodeType":"45359","messageId":"45360","endLine":2613,"endColumn":30,"suggestions":"47374"},{"ruleId":"45357","severity":2,"message":"45358","line":2627,"column":16,"nodeType":"45359","messageId":"45360","endLine":2627,"endColumn":19,"suggestions":"47375"},{"ruleId":"45357","severity":2,"message":"45358","line":2640,"column":38,"nodeType":"45359","messageId":"45360","endLine":2640,"endColumn":41,"suggestions":"47376"},{"ruleId":"45357","severity":2,"message":"45358","line":2640,"column":53,"nodeType":"45359","messageId":"45360","endLine":2640,"endColumn":56,"suggestions":"47377"},{"ruleId":"45357","severity":2,"message":"45358","line":2647,"column":27,"nodeType":"45359","messageId":"45360","endLine":2647,"endColumn":30,"suggestions":"47378"},{"ruleId":"45357","severity":2,"message":"45358","line":2656,"column":16,"nodeType":"45359","messageId":"45360","endLine":2656,"endColumn":19,"suggestions":"47379"},{"ruleId":"45357","severity":2,"message":"45358","line":2670,"column":38,"nodeType":"45359","messageId":"45360","endLine":2670,"endColumn":41,"suggestions":"47380"},{"ruleId":"45357","severity":2,"message":"45358","line":2670,"column":53,"nodeType":"45359","messageId":"45360","endLine":2670,"endColumn":56,"suggestions":"47381"},{"ruleId":"45357","severity":2,"message":"45358","line":2677,"column":27,"nodeType":"45359","messageId":"45360","endLine":2677,"endColumn":30,"suggestions":"47382"},{"ruleId":"45357","severity":2,"message":"45358","line":2694,"column":16,"nodeType":"45359","messageId":"45360","endLine":2694,"endColumn":19,"suggestions":"47383"},{"ruleId":"45357","severity":2,"message":"45358","line":2711,"column":38,"nodeType":"45359","messageId":"45360","endLine":2711,"endColumn":41,"suggestions":"47384"},{"ruleId":"45357","severity":2,"message":"45358","line":2711,"column":53,"nodeType":"45359","messageId":"45360","endLine":2711,"endColumn":56,"suggestions":"47385"},{"ruleId":"45357","severity":2,"message":"45358","line":2733,"column":27,"nodeType":"45359","messageId":"45360","endLine":2733,"endColumn":30,"suggestions":"47386"},{"ruleId":"45357","severity":2,"message":"45358","line":2737,"column":44,"nodeType":"45359","messageId":"45360","endLine":2737,"endColumn":47,"suggestions":"47387"},{"ruleId":"45357","severity":2,"message":"45358","line":2764,"column":27,"nodeType":"45359","messageId":"45360","endLine":2764,"endColumn":30,"suggestions":"47388"},{"ruleId":"45357","severity":2,"message":"45358","line":2793,"column":27,"nodeType":"45359","messageId":"45360","endLine":2793,"endColumn":30,"suggestions":"47389"},{"ruleId":"45357","severity":2,"message":"45358","line":2817,"column":27,"nodeType":"45359","messageId":"45360","endLine":2817,"endColumn":30,"suggestions":"47390"},{"ruleId":"45357","severity":2,"message":"45358","line":2841,"column":27,"nodeType":"45359","messageId":"45360","endLine":2841,"endColumn":30,"suggestions":"47391"},{"ruleId":"45357","severity":2,"message":"45358","line":2848,"column":44,"nodeType":"45359","messageId":"45360","endLine":2848,"endColumn":47,"suggestions":"47392"},{"ruleId":"45357","severity":2,"message":"45358","line":2873,"column":27,"nodeType":"45359","messageId":"45360","endLine":2873,"endColumn":30,"suggestions":"47393"},{"ruleId":"45357","severity":2,"message":"45358","line":2882,"column":16,"nodeType":"45359","messageId":"45360","endLine":2882,"endColumn":19,"suggestions":"47394"},{"ruleId":"45357","severity":2,"message":"45358","line":2893,"column":38,"nodeType":"45359","messageId":"45360","endLine":2893,"endColumn":41,"suggestions":"47395"},{"ruleId":"45357","severity":2,"message":"45358","line":2893,"column":53,"nodeType":"45359","messageId":"45360","endLine":2893,"endColumn":56,"suggestions":"47396"},{"ruleId":"45357","severity":2,"message":"45358","line":2902,"column":27,"nodeType":"45359","messageId":"45360","endLine":2902,"endColumn":30,"suggestions":"47397"},{"ruleId":"45357","severity":2,"message":"45358","line":2911,"column":16,"nodeType":"45359","messageId":"45360","endLine":2911,"endColumn":19,"suggestions":"47398"},{"ruleId":"45357","severity":2,"message":"45358","line":2921,"column":38,"nodeType":"45359","messageId":"45360","endLine":2921,"endColumn":41,"suggestions":"47399"},{"ruleId":"45357","severity":2,"message":"45358","line":2921,"column":53,"nodeType":"45359","messageId":"45360","endLine":2921,"endColumn":56,"suggestions":"47400"},{"ruleId":"45357","severity":2,"message":"45358","line":2937,"column":27,"nodeType":"45359","messageId":"45360","endLine":2937,"endColumn":30,"suggestions":"47401"},{"ruleId":"45357","severity":2,"message":"45358","line":2962,"column":27,"nodeType":"45359","messageId":"45360","endLine":2962,"endColumn":30,"suggestions":"47402"},{"ruleId":"45357","severity":2,"message":"45358","line":2966,"column":44,"nodeType":"45359","messageId":"45360","endLine":2966,"endColumn":47,"suggestions":"47403"},{"ruleId":"45357","severity":2,"message":"45358","line":2989,"column":27,"nodeType":"45359","messageId":"45360","endLine":2989,"endColumn":30,"suggestions":"47404"},{"ruleId":"45357","severity":2,"message":"45358","line":2993,"column":44,"nodeType":"45359","messageId":"45360","endLine":2993,"endColumn":47,"suggestions":"47405"},{"ruleId":"45357","severity":2,"message":"45358","line":3000,"column":16,"nodeType":"45359","messageId":"45360","endLine":3000,"endColumn":19,"suggestions":"47406"},{"ruleId":"45357","severity":2,"message":"45358","line":3010,"column":38,"nodeType":"45359","messageId":"45360","endLine":3010,"endColumn":41,"suggestions":"47407"},{"ruleId":"45357","severity":2,"message":"45358","line":3010,"column":53,"nodeType":"45359","messageId":"45360","endLine":3010,"endColumn":56,"suggestions":"47408"},{"ruleId":"45357","severity":2,"message":"45358","line":3028,"column":27,"nodeType":"45359","messageId":"45360","endLine":3028,"endColumn":30,"suggestions":"47409"},{"ruleId":"45357","severity":2,"message":"45358","line":3032,"column":44,"nodeType":"45359","messageId":"45360","endLine":3032,"endColumn":47,"suggestions":"47410"},{"ruleId":"45357","severity":2,"message":"45358","line":3041,"column":16,"nodeType":"45359","messageId":"45360","endLine":3041,"endColumn":19,"suggestions":"47411"},{"ruleId":"45357","severity":2,"message":"45358","line":3053,"column":38,"nodeType":"45359","messageId":"45360","endLine":3053,"endColumn":41,"suggestions":"47412"},{"ruleId":"45357","severity":2,"message":"45358","line":3053,"column":53,"nodeType":"45359","messageId":"45360","endLine":3053,"endColumn":56,"suggestions":"47413"},{"ruleId":"45357","severity":2,"message":"45358","line":3070,"column":27,"nodeType":"45359","messageId":"45360","endLine":3070,"endColumn":30,"suggestions":"47414"},{"ruleId":"45357","severity":2,"message":"45358","line":3074,"column":44,"nodeType":"45359","messageId":"45360","endLine":3074,"endColumn":47,"suggestions":"47415"},{"ruleId":"45357","severity":2,"message":"45358","line":3081,"column":16,"nodeType":"45359","messageId":"45360","endLine":3081,"endColumn":19,"suggestions":"47416"},{"ruleId":"45357","severity":2,"message":"45358","line":3091,"column":38,"nodeType":"45359","messageId":"45360","endLine":3091,"endColumn":41,"suggestions":"47417"},{"ruleId":"45357","severity":2,"message":"45358","line":3091,"column":53,"nodeType":"45359","messageId":"45360","endLine":3091,"endColumn":56,"suggestions":"47418"},{"ruleId":"45357","severity":2,"message":"45358","line":3103,"column":27,"nodeType":"45359","messageId":"45360","endLine":3103,"endColumn":30,"suggestions":"47419"},{"ruleId":"45357","severity":2,"message":"45358","line":3107,"column":44,"nodeType":"45359","messageId":"45360","endLine":3107,"endColumn":47,"suggestions":"47420"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":43,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":46,"suggestions":"47421"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":17,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":20,"suggestions":"47422","suppressions":"47423"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":27,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":30,"suggestions":"47424","suppressions":"47425"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":17,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":20,"suggestions":"47426","suppressions":"47427"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":27,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":30,"suggestions":"47428","suppressions":"47429"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":18,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":21,"suggestions":"47430","suppressions":"47431"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":28,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":31,"suggestions":"47432","suppressions":"47433"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":18,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":21,"suggestions":"47434","suppressions":"47435"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":28,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":31,"suggestions":"47436","suppressions":"47437"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":21,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":24,"suggestions":"47438","suppressions":"47439"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":20,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":23,"suggestions":"47440","suppressions":"47441"},{"ruleId":"45357","severity":2,"message":"45358","line":263,"column":20,"nodeType":"45359","messageId":"45360","endLine":263,"endColumn":23,"suggestions":"47442","suppressions":"47443"},{"ruleId":"45357","severity":2,"message":"45358","line":364,"column":20,"nodeType":"45359","messageId":"45360","endLine":364,"endColumn":23,"suggestions":"47444","suppressions":"47445"},{"ruleId":"45357","severity":2,"message":"45358","line":25,"column":18,"nodeType":"45359","messageId":"45360","endLine":25,"endColumn":21,"suggestions":"47446"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":17,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":20,"suggestions":"47447"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":27,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":30,"suggestions":"47448"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":17,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":20,"suggestions":"47449"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":27,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":30,"suggestions":"47450"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":18,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":21,"suggestions":"47451"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":28,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":31,"suggestions":"47452"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":18,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":21,"suggestions":"47453"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":28,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":31,"suggestions":"47454"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":27,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":30,"suggestions":"47455"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":21,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":24,"suggestions":"47456"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":43,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":46,"suggestions":"47457"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":47,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":50,"suggestions":"47458"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":29,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":32,"suggestions":"47459"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":51,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":54,"suggestions":"47460"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":47,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":50,"suggestions":"47461"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":29,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":32,"suggestions":"47462"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":18,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":21,"suggestions":"47463"},{"ruleId":"45357","severity":2,"message":"45358","line":31,"column":17,"nodeType":"45359","messageId":"45360","endLine":31,"endColumn":20,"suggestions":"47464"},{"ruleId":"45357","severity":2,"message":"45358","line":31,"column":27,"nodeType":"45359","messageId":"45360","endLine":31,"endColumn":30,"suggestions":"47465"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":17,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":20,"suggestions":"47466"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":27,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":30,"suggestions":"47467"},{"ruleId":"45357","severity":2,"message":"45358","line":33,"column":18,"nodeType":"45359","messageId":"45360","endLine":33,"endColumn":21,"suggestions":"47468"},{"ruleId":"45357","severity":2,"message":"45358","line":33,"column":28,"nodeType":"45359","messageId":"45360","endLine":33,"endColumn":31,"suggestions":"47469"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":18,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":21,"suggestions":"47470"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":28,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":31,"suggestions":"47471"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":27,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":30,"suggestions":"47472"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":21,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":24,"suggestions":"47473"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":38,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":41,"suggestions":"47474"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":38,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":41,"suggestions":"47475"},{"ruleId":"45357","severity":2,"message":"45358","line":160,"column":38,"nodeType":"45359","messageId":"45360","endLine":160,"endColumn":41,"suggestions":"47476"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":38,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":41,"suggestions":"47477"},{"ruleId":"45357","severity":2,"message":"45358","line":224,"column":38,"nodeType":"45359","messageId":"45360","endLine":224,"endColumn":41,"suggestions":"47478"},{"ruleId":"45357","severity":2,"message":"45358","line":260,"column":38,"nodeType":"45359","messageId":"45360","endLine":260,"endColumn":41,"suggestions":"47479"},{"ruleId":"45357","severity":2,"message":"45358","line":284,"column":38,"nodeType":"45359","messageId":"45360","endLine":284,"endColumn":41,"suggestions":"47480"},{"ruleId":"45357","severity":2,"message":"45358","line":313,"column":40,"nodeType":"45359","messageId":"45360","endLine":313,"endColumn":43,"suggestions":"47481"},{"ruleId":"45357","severity":2,"message":"45358","line":351,"column":40,"nodeType":"45359","messageId":"45360","endLine":351,"endColumn":43,"suggestions":"47482"},{"ruleId":"45357","severity":2,"message":"45358","line":378,"column":40,"nodeType":"45359","messageId":"45360","endLine":378,"endColumn":43,"suggestions":"47483"},{"ruleId":"45357","severity":2,"message":"45358","line":414,"column":42,"nodeType":"45359","messageId":"45360","endLine":414,"endColumn":45,"suggestions":"47484"},{"ruleId":"45357","severity":2,"message":"45358","line":448,"column":38,"nodeType":"45359","messageId":"45360","endLine":448,"endColumn":41,"suggestions":"47485"},{"ruleId":"45357","severity":2,"message":"45358","line":482,"column":42,"nodeType":"45359","messageId":"45360","endLine":482,"endColumn":45,"suggestions":"47486"},{"ruleId":"45357","severity":2,"message":"45358","line":516,"column":38,"nodeType":"45359","messageId":"45360","endLine":516,"endColumn":41,"suggestions":"47487"},{"ruleId":"45357","severity":2,"message":"45358","line":543,"column":38,"nodeType":"45359","messageId":"45360","endLine":543,"endColumn":41,"suggestions":"47488"},{"ruleId":"45357","severity":2,"message":"45358","line":589,"column":38,"nodeType":"45359","messageId":"45360","endLine":589,"endColumn":41,"suggestions":"47489"},{"ruleId":"45357","severity":2,"message":"45358","line":620,"column":38,"nodeType":"45359","messageId":"45360","endLine":620,"endColumn":41,"suggestions":"47490"},{"ruleId":"45357","severity":2,"message":"45358","line":651,"column":38,"nodeType":"45359","messageId":"45360","endLine":651,"endColumn":41,"suggestions":"47491"},{"ruleId":"45357","severity":2,"message":"45358","line":688,"column":38,"nodeType":"45359","messageId":"45360","endLine":688,"endColumn":41,"suggestions":"47492"},{"ruleId":"45357","severity":2,"message":"45358","line":747,"column":38,"nodeType":"45359","messageId":"45360","endLine":747,"endColumn":41,"suggestions":"47493"},{"ruleId":"45357","severity":2,"message":"45358","line":771,"column":38,"nodeType":"45359","messageId":"45360","endLine":771,"endColumn":41,"suggestions":"47494"},{"ruleId":"45357","severity":2,"message":"45358","line":817,"column":53,"nodeType":"45359","messageId":"45360","endLine":817,"endColumn":56,"suggestions":"47495"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":18,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":21,"suggestions":"47496"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":17,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":20,"suggestions":"47497"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":27,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":30,"suggestions":"47498"},{"ruleId":"45357","severity":2,"message":"45358","line":25,"column":17,"nodeType":"45359","messageId":"45360","endLine":25,"endColumn":20,"suggestions":"47499"},{"ruleId":"45357","severity":2,"message":"45358","line":25,"column":27,"nodeType":"45359","messageId":"45360","endLine":25,"endColumn":30,"suggestions":"47500"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":18,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":21,"suggestions":"47501"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":28,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":31,"suggestions":"47502"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":18,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":21,"suggestions":"47503"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":28,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":31,"suggestions":"47504"},{"ruleId":"45357","severity":2,"message":"45358","line":476,"column":38,"nodeType":"45359","messageId":"45360","endLine":476,"endColumn":41,"suggestions":"47505"},{"ruleId":"45357","severity":2,"message":"45358","line":487,"column":27,"nodeType":"45359","messageId":"45360","endLine":487,"endColumn":30,"suggestions":"47506"},{"ruleId":"45357","severity":2,"message":"45358","line":518,"column":38,"nodeType":"45359","messageId":"45360","endLine":518,"endColumn":41,"suggestions":"47507"},{"ruleId":"45357","severity":2,"message":"45358","line":526,"column":27,"nodeType":"45359","messageId":"45360","endLine":526,"endColumn":30,"suggestions":"47508"},{"ruleId":"45357","severity":2,"message":"45358","line":552,"column":38,"nodeType":"45359","messageId":"45360","endLine":552,"endColumn":41,"suggestions":"47509"},{"ruleId":"45357","severity":2,"message":"45358","line":563,"column":27,"nodeType":"45359","messageId":"45360","endLine":563,"endColumn":30,"suggestions":"47510"},{"ruleId":"45357","severity":2,"message":"45358","line":590,"column":38,"nodeType":"45359","messageId":"45360","endLine":590,"endColumn":41,"suggestions":"47511"},{"ruleId":"45357","severity":2,"message":"45358","line":601,"column":27,"nodeType":"45359","messageId":"45360","endLine":601,"endColumn":30,"suggestions":"47512"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":61,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":64,"suggestions":"47513"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":57,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":60,"suggestions":"47514"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":43,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":46,"suggestions":"47515"},{"ruleId":"45357","severity":2,"message":"45358","line":174,"column":43,"nodeType":"45359","messageId":"45360","endLine":174,"endColumn":46,"suggestions":"47516"},{"ruleId":"45357","severity":2,"message":"45358","line":214,"column":43,"nodeType":"45359","messageId":"45360","endLine":214,"endColumn":46,"suggestions":"47517"},{"ruleId":"45357","severity":2,"message":"45358","line":239,"column":43,"nodeType":"45359","messageId":"45360","endLine":239,"endColumn":46,"suggestions":"47518"},{"ruleId":"45357","severity":2,"message":"45358","line":295,"column":43,"nodeType":"45359","messageId":"45360","endLine":295,"endColumn":46,"suggestions":"47519"},{"ruleId":"45357","severity":2,"message":"45358","line":354,"column":43,"nodeType":"45359","messageId":"45360","endLine":354,"endColumn":46,"suggestions":"47520"},{"ruleId":"45357","severity":2,"message":"45358","line":377,"column":53,"nodeType":"45359","messageId":"45360","endLine":377,"endColumn":56,"suggestions":"47521"},{"ruleId":"45357","severity":2,"message":"45358","line":437,"column":43,"nodeType":"45359","messageId":"45360","endLine":437,"endColumn":46,"suggestions":"47522"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":43,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":46,"suggestions":"47523"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":43,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":46,"suggestions":"47524"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":43,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":46,"suggestions":"47525"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":43,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":46,"suggestions":"47526"},{"ruleId":"45357","severity":2,"message":"45358","line":21,"column":71,"nodeType":"45359","messageId":"45360","endLine":21,"endColumn":74,"suggestions":"47527"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":34,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":37,"suggestions":"47528"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":45,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":48,"suggestions":"47529"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":46,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":49,"suggestions":"47530"},{"ruleId":"45357","severity":2,"message":"45358","line":236,"column":90,"nodeType":"45359","messageId":"45360","endLine":236,"endColumn":93,"suggestions":"47531"},{"ruleId":"45357","severity":2,"message":"45358","line":237,"column":85,"nodeType":"45359","messageId":"45360","endLine":237,"endColumn":88,"suggestions":"47532"},{"ruleId":"45357","severity":2,"message":"45358","line":238,"column":87,"nodeType":"45359","messageId":"45360","endLine":238,"endColumn":90,"suggestions":"47533"},{"ruleId":"45357","severity":2,"message":"45358","line":240,"column":72,"nodeType":"45359","messageId":"45360","endLine":240,"endColumn":75,"suggestions":"47534"},{"ruleId":"45357","severity":2,"message":"45358","line":242,"column":94,"nodeType":"45359","messageId":"45360","endLine":242,"endColumn":97,"suggestions":"47535"},{"ruleId":"45357","severity":2,"message":"45358","line":33,"column":45,"nodeType":"45359","messageId":"45360","endLine":33,"endColumn":48,"suggestions":"47536"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":12,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":15,"suggestions":"47537"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":12,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":15,"suggestions":"47538"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":58,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":61,"suggestions":"47539"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":59,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":62,"suggestions":"47540"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":64,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":67,"suggestions":"47541"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":63,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":66,"suggestions":"47542"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":78,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":81,"suggestions":"47543"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":84,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":87,"suggestions":"47544"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":80,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":83,"suggestions":"47545"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":79,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":82,"suggestions":"47546"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":68,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":71,"suggestions":"47547"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":65,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":68,"suggestions":"47548"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":10,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":13,"suggestions":"47549"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":10,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":13,"suggestions":"47550"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":58,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":61,"suggestions":"47551"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":59,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":62,"suggestions":"47552"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":10,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":13,"suggestions":"47553"},{"ruleId":"45357","severity":2,"message":"45358","line":182,"column":10,"nodeType":"45359","messageId":"45360","endLine":182,"endColumn":13,"suggestions":"47554"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":77,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":80,"suggestions":"47555"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":13,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":16,"suggestions":"47556","suppressions":"47557"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":85,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":88,"suggestions":"47558","suppressions":"47559"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":13,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":16,"suggestions":"47560","suppressions":"47561"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":44,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":47,"suggestions":"47562"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":58,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":61,"suggestions":"47563"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":42,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":45,"suggestions":"47564"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":65,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":68,"suggestions":"47565"},{"ruleId":"45357","severity":2,"message":"45358","line":168,"column":57,"nodeType":"45359","messageId":"45360","endLine":168,"endColumn":60,"suggestions":"47566"},{"ruleId":"45357","severity":2,"message":"45358","line":195,"column":42,"nodeType":"45359","messageId":"45360","endLine":195,"endColumn":45,"suggestions":"47567"},{"ruleId":"45357","severity":2,"message":"45358","line":196,"column":9,"nodeType":"45359","messageId":"45360","endLine":196,"endColumn":12,"suggestions":"47568"},{"ruleId":"45357","severity":2,"message":"45358","line":216,"column":24,"nodeType":"45359","messageId":"45360","endLine":216,"endColumn":27,"suggestions":"47569"},{"ruleId":"45357","severity":2,"message":"45358","line":330,"column":44,"nodeType":"45359","messageId":"45360","endLine":330,"endColumn":47,"suggestions":"47570"},{"ruleId":"45357","severity":2,"message":"45358","line":331,"column":9,"nodeType":"45359","messageId":"45360","endLine":331,"endColumn":12,"suggestions":"47571"},{"ruleId":"45357","severity":2,"message":"45358","line":31,"column":29,"nodeType":"45359","messageId":"45360","endLine":31,"endColumn":32,"suggestions":"47572"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":29,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":32,"suggestions":"47573"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":26,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":29,"suggestions":"47574"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":16,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":19,"suggestions":"47575"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":46,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":49,"suggestions":"47576"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":17,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":20,"suggestions":"47577"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":17,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":20,"suggestions":"47578"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":17,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":20,"suggestions":"47579"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":17,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":20,"suggestions":"47580"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":32,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":35,"suggestions":"47581","suppressions":"47582"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":27,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":30,"suggestions":"47583","suppressions":"47584"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":37,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":40,"suggestions":"47585"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":43,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":46,"suggestions":"47586"},{"ruleId":"45357","severity":2,"message":"45358","line":171,"column":43,"nodeType":"45359","messageId":"45360","endLine":171,"endColumn":46,"suggestions":"47587"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":52,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":55,"suggestions":"47588"},{"ruleId":"45357","severity":2,"message":"45358","line":200,"column":52,"nodeType":"45359","messageId":"45360","endLine":200,"endColumn":55,"suggestions":"47589"},{"ruleId":"45357","severity":2,"message":"45358","line":219,"column":52,"nodeType":"45359","messageId":"45360","endLine":219,"endColumn":55,"suggestions":"47590"},{"ruleId":"45357","severity":2,"message":"45358","line":232,"column":52,"nodeType":"45359","messageId":"45360","endLine":232,"endColumn":55,"suggestions":"47591"},{"ruleId":"45357","severity":2,"message":"45358","line":382,"column":12,"nodeType":"45359","messageId":"45360","endLine":382,"endColumn":15,"suggestions":"47592","suppressions":"47593"},{"ruleId":"45357","severity":2,"message":"45358","line":388,"column":14,"nodeType":"45359","messageId":"45360","endLine":388,"endColumn":17,"suggestions":"47594","suppressions":"47595"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":21,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":24,"suggestions":"47596"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":21,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":24,"suggestions":"47597"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":21,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":24,"suggestions":"47598"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":21,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":24,"suggestions":"47599"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":58,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":61,"suggestions":"47600"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":56,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":59,"suggestions":"47601"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":58,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":61,"suggestions":"47602"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":57,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":60,"suggestions":"47603"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":55,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":58,"suggestions":"47604"},{"ruleId":"45357","severity":2,"message":"45358","line":164,"column":55,"nodeType":"45359","messageId":"45360","endLine":164,"endColumn":58,"suggestions":"47605"},{"ruleId":"45357","severity":2,"message":"45358","line":174,"column":53,"nodeType":"45359","messageId":"45360","endLine":174,"endColumn":56,"suggestions":"47606"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":54,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":57,"suggestions":"47607"},{"ruleId":"45357","severity":2,"message":"45358","line":14,"column":24,"nodeType":"45359","messageId":"45360","endLine":14,"endColumn":27,"suggestions":"47608"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":22,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":25,"suggestions":"47609"},{"ruleId":"45357","severity":2,"message":"45358","line":18,"column":25,"nodeType":"45359","messageId":"45360","endLine":18,"endColumn":28,"suggestions":"47610"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":25,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":28,"suggestions":"47611"},{"ruleId":"45357","severity":2,"message":"45358","line":168,"column":70,"nodeType":"45359","messageId":"45360","endLine":168,"endColumn":73,"suggestions":"47612"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":23,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":26,"suggestions":"47613"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":14,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":17,"suggestions":"47614"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":32,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":35,"suggestions":"47615"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":14,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":17,"suggestions":"47616"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":33,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":36,"suggestions":"47617"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":14,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":17,"suggestions":"47618"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":43,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":46,"suggestions":"47619"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":24,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":27,"suggestions":"47620"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":22,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":25,"suggestions":"47621"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":25,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":28,"suggestions":"47622"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":11,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":14,"suggestions":"47623"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":21,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":24,"suggestions":"47624"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":42,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":45,"suggestions":"47625"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":24,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":27,"suggestions":"47626"},{"ruleId":"45357","severity":2,"message":"45358","line":153,"column":28,"nodeType":"45359","messageId":"45360","endLine":153,"endColumn":31,"suggestions":"47627"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":35,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":38,"suggestions":"47628"},{"ruleId":"45357","severity":2,"message":"45358","line":215,"column":31,"nodeType":"45359","messageId":"45360","endLine":215,"endColumn":34,"suggestions":"47629"},{"ruleId":"45357","severity":2,"message":"45358","line":216,"column":31,"nodeType":"45359","messageId":"45360","endLine":216,"endColumn":34,"suggestions":"47630"},{"ruleId":"45357","severity":2,"message":"45358","line":227,"column":31,"nodeType":"45359","messageId":"45360","endLine":227,"endColumn":34,"suggestions":"47631"},{"ruleId":"45357","severity":2,"message":"45358","line":345,"column":29,"nodeType":"45359","messageId":"45360","endLine":345,"endColumn":32,"suggestions":"47632"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":21,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":24,"suggestions":"47633"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":86,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":89,"suggestions":"47634"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":85,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":88,"suggestions":"47635"},{"ruleId":"45357","severity":2,"message":"45358","line":78,"column":82,"nodeType":"45359","messageId":"45360","endLine":78,"endColumn":85,"suggestions":"47636"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":86,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":89,"suggestions":"47637"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":85,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":88,"suggestions":"47638"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":79,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":82,"suggestions":"47639"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":82,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":85,"suggestions":"47640"},{"ruleId":"45357","severity":2,"message":"45358","line":119,"column":80,"nodeType":"45359","messageId":"45360","endLine":119,"endColumn":83,"suggestions":"47641"},{"ruleId":"45357","severity":2,"message":"45358","line":126,"column":35,"nodeType":"45359","messageId":"45360","endLine":126,"endColumn":38,"suggestions":"47642"},{"ruleId":"45357","severity":2,"message":"45358","line":210,"column":81,"nodeType":"45359","messageId":"45360","endLine":210,"endColumn":84,"suggestions":"47643"},{"ruleId":"45357","severity":2,"message":"45358","line":213,"column":80,"nodeType":"45359","messageId":"45360","endLine":213,"endColumn":83,"suggestions":"47644"},{"ruleId":"45357","severity":2,"message":"45358","line":291,"column":86,"nodeType":"45359","messageId":"45360","endLine":291,"endColumn":89,"suggestions":"47645"},{"ruleId":"45357","severity":2,"message":"45358","line":292,"column":85,"nodeType":"45359","messageId":"45360","endLine":292,"endColumn":88,"suggestions":"47646"},{"ruleId":"45357","severity":2,"message":"45358","line":294,"column":79,"nodeType":"45359","messageId":"45360","endLine":294,"endColumn":82,"suggestions":"47647"},{"ruleId":"45357","severity":2,"message":"45358","line":298,"column":82,"nodeType":"45359","messageId":"45360","endLine":298,"endColumn":85,"suggestions":"47648"},{"ruleId":"45357","severity":2,"message":"45358","line":302,"column":80,"nodeType":"45359","messageId":"45360","endLine":302,"endColumn":83,"suggestions":"47649"},{"ruleId":"45357","severity":2,"message":"45358","line":309,"column":35,"nodeType":"45359","messageId":"45360","endLine":309,"endColumn":38,"suggestions":"47650"},{"ruleId":"45357","severity":2,"message":"45358","line":322,"column":86,"nodeType":"45359","messageId":"45360","endLine":322,"endColumn":89,"suggestions":"47651"},{"ruleId":"45357","severity":2,"message":"45358","line":323,"column":85,"nodeType":"45359","messageId":"45360","endLine":323,"endColumn":88,"suggestions":"47652"},{"ruleId":"45357","severity":2,"message":"45358","line":325,"column":79,"nodeType":"45359","messageId":"45360","endLine":325,"endColumn":82,"suggestions":"47653"},{"ruleId":"45357","severity":2,"message":"45358","line":329,"column":82,"nodeType":"45359","messageId":"45360","endLine":329,"endColumn":85,"suggestions":"47654"},{"ruleId":"45357","severity":2,"message":"45358","line":333,"column":80,"nodeType":"45359","messageId":"45360","endLine":333,"endColumn":83,"suggestions":"47655"},{"ruleId":"45357","severity":2,"message":"45358","line":352,"column":84,"nodeType":"45359","messageId":"45360","endLine":352,"endColumn":87,"suggestions":"47656"},{"ruleId":"45357","severity":2,"message":"45358","line":375,"column":29,"nodeType":"45359","messageId":"45360","endLine":375,"endColumn":32,"suggestions":"47657"},{"ruleId":"45357","severity":2,"message":"45358","line":383,"column":26,"nodeType":"45359","messageId":"45360","endLine":383,"endColumn":29,"suggestions":"47658"},{"ruleId":"45357","severity":2,"message":"45358","line":383,"column":38,"nodeType":"45359","messageId":"45360","endLine":383,"endColumn":41,"suggestions":"47659"},{"ruleId":"45357","severity":2,"message":"45358","line":415,"column":69,"nodeType":"45359","messageId":"45360","endLine":415,"endColumn":72,"suggestions":"47660"},{"ruleId":"45357","severity":2,"message":"45358","line":418,"column":94,"nodeType":"45359","messageId":"45360","endLine":418,"endColumn":97,"suggestions":"47661"},{"ruleId":"45357","severity":2,"message":"45358","line":428,"column":28,"nodeType":"45359","messageId":"45360","endLine":428,"endColumn":31,"suggestions":"47662"},{"ruleId":"45357","severity":2,"message":"45358","line":70,"column":43,"nodeType":"45359","messageId":"45360","endLine":70,"endColumn":46,"suggestions":"47663"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":43,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":46,"suggestions":"47664"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":86,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":89,"suggestions":"47665"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":85,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":88,"suggestions":"47666"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":43,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":46,"suggestions":"47667"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":86,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":89,"suggestions":"47668"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":85,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":88,"suggestions":"47669"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":21,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":24,"suggestions":"47670"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":21,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":24,"suggestions":"47671"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":48,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":51,"suggestions":"47672"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":9,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":12,"suggestions":"47673"},{"ruleId":"45357","severity":2,"message":"45358","line":240,"column":26,"nodeType":"45359","messageId":"45360","endLine":240,"endColumn":29,"suggestions":"47674"},{"ruleId":"45357","severity":2,"message":"45358","line":248,"column":26,"nodeType":"45359","messageId":"45360","endLine":248,"endColumn":29,"suggestions":"47675"},{"ruleId":"45357","severity":2,"message":"45358","line":416,"column":28,"nodeType":"45359","messageId":"45360","endLine":416,"endColumn":31,"suggestions":"47676"},{"ruleId":"45357","severity":2,"message":"45358","line":796,"column":33,"nodeType":"45359","messageId":"45360","endLine":796,"endColumn":36,"suggestions":"47677"},{"ruleId":"45357","severity":2,"message":"45358","line":864,"column":33,"nodeType":"45359","messageId":"45360","endLine":864,"endColumn":36,"suggestions":"47678"},{"ruleId":"45357","severity":2,"message":"45358","line":930,"column":33,"nodeType":"45359","messageId":"45360","endLine":930,"endColumn":36,"suggestions":"47679"},{"ruleId":"45357","severity":2,"message":"45358","line":1051,"column":33,"nodeType":"45359","messageId":"45360","endLine":1051,"endColumn":36,"suggestions":"47680"},{"ruleId":"45357","severity":2,"message":"45358","line":1125,"column":33,"nodeType":"45359","messageId":"45360","endLine":1125,"endColumn":36,"suggestions":"47681"},{"ruleId":"45357","severity":2,"message":"45358","line":1195,"column":33,"nodeType":"45359","messageId":"45360","endLine":1195,"endColumn":36,"suggestions":"47682"},{"ruleId":"45357","severity":2,"message":"45358","line":1268,"column":33,"nodeType":"45359","messageId":"45360","endLine":1268,"endColumn":36,"suggestions":"47683"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":21,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":24,"suggestions":"47684"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":21,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":24,"suggestions":"47685"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":41,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":44,"suggestions":"47686"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":24,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":27,"suggestions":"47687"},{"ruleId":"45357","severity":2,"message":"45358","line":16,"column":22,"nodeType":"45359","messageId":"45360","endLine":16,"endColumn":25,"suggestions":"47688"},{"ruleId":"45357","severity":2,"message":"45358","line":19,"column":25,"nodeType":"45359","messageId":"45360","endLine":19,"endColumn":28,"suggestions":"47689"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":66,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":69,"suggestions":"47690"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":61,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":64,"suggestions":"47691"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":21,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":24,"suggestions":"47692"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":19,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":22,"suggestions":"47693"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":21,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":24,"suggestions":"47694"},{"ruleId":"45357","severity":2,"message":"45358","line":167,"column":67,"nodeType":"45359","messageId":"45360","endLine":167,"endColumn":70,"suggestions":"47695"},{"ruleId":"45357","severity":2,"message":"45358","line":224,"column":72,"nodeType":"45359","messageId":"45360","endLine":224,"endColumn":75,"suggestions":"47696"},{"ruleId":"45357","severity":2,"message":"45358","line":232,"column":28,"nodeType":"45359","messageId":"45360","endLine":232,"endColumn":31,"suggestions":"47697"},{"ruleId":"45357","severity":2,"message":"45358","line":267,"column":70,"nodeType":"45359","messageId":"45360","endLine":267,"endColumn":73,"suggestions":"47698"},{"ruleId":"45357","severity":2,"message":"45358","line":306,"column":70,"nodeType":"45359","messageId":"45360","endLine":306,"endColumn":73,"suggestions":"47699"},{"ruleId":"45357","severity":2,"message":"45358","line":306,"column":85,"nodeType":"45359","messageId":"45360","endLine":306,"endColumn":88,"suggestions":"47700"},{"ruleId":"45357","severity":2,"message":"45358","line":309,"column":66,"nodeType":"45359","messageId":"45360","endLine":309,"endColumn":69,"suggestions":"47701"},{"ruleId":"45357","severity":2,"message":"45358","line":310,"column":66,"nodeType":"45359","messageId":"45360","endLine":310,"endColumn":69,"suggestions":"47702"},{"ruleId":"45357","severity":2,"message":"45358","line":311,"column":71,"nodeType":"45359","messageId":"45360","endLine":311,"endColumn":74,"suggestions":"47703"},{"ruleId":"45357","severity":2,"message":"45358","line":334,"column":71,"nodeType":"45359","messageId":"45360","endLine":334,"endColumn":74,"suggestions":"47704"},{"ruleId":"45357","severity":2,"message":"45358","line":339,"column":71,"nodeType":"45359","messageId":"45360","endLine":339,"endColumn":74,"suggestions":"47705"},{"ruleId":"45357","severity":2,"message":"45358","line":347,"column":73,"nodeType":"45359","messageId":"45360","endLine":347,"endColumn":76,"suggestions":"47706"},{"ruleId":"45357","severity":2,"message":"45358","line":349,"column":69,"nodeType":"45359","messageId":"45360","endLine":349,"endColumn":72,"suggestions":"47707"},{"ruleId":"45357","severity":2,"message":"45358","line":361,"column":58,"nodeType":"45359","messageId":"45360","endLine":361,"endColumn":61,"suggestions":"47708"},{"ruleId":"45357","severity":2,"message":"45358","line":363,"column":67,"nodeType":"45359","messageId":"45360","endLine":363,"endColumn":70,"suggestions":"47709"},{"ruleId":"45357","severity":2,"message":"45358","line":371,"column":58,"nodeType":"45359","messageId":"45360","endLine":371,"endColumn":61,"suggestions":"47710"},{"ruleId":"45357","severity":2,"message":"45358","line":373,"column":67,"nodeType":"45359","messageId":"45360","endLine":373,"endColumn":70,"suggestions":"47711"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":21,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":24,"suggestions":"47712"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":20,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":23,"suggestions":"47713"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":60,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":63,"suggestions":"47714"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":20,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":23,"suggestions":"47715"},{"ruleId":"45357","severity":2,"message":"45358","line":254,"column":79,"nodeType":"45359","messageId":"45360","endLine":254,"endColumn":82,"suggestions":"47716"},{"ruleId":"45357","severity":2,"message":"45358","line":264,"column":76,"nodeType":"45359","messageId":"45360","endLine":264,"endColumn":79,"suggestions":"47717"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":19,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":22,"suggestions":"47718"},{"ruleId":"45357","severity":2,"message":"45358","line":33,"column":19,"nodeType":"45359","messageId":"45360","endLine":33,"endColumn":22,"suggestions":"47719"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":21,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":24,"suggestions":"47720"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":46,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":49,"suggestions":"47721"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":64,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":67,"suggestions":"47722"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":67,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":70,"suggestions":"47723"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":67,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":70,"suggestions":"47724"},{"ruleId":"45357","severity":2,"message":"45358","line":164,"column":69,"nodeType":"45359","messageId":"45360","endLine":164,"endColumn":72,"suggestions":"47725"},{"ruleId":"45357","severity":2,"message":"45358","line":177,"column":70,"nodeType":"45359","messageId":"45360","endLine":177,"endColumn":73,"suggestions":"47726"},{"ruleId":"45357","severity":2,"message":"45358","line":190,"column":9,"nodeType":"45359","messageId":"45360","endLine":190,"endColumn":12,"suggestions":"47727"},{"ruleId":"45357","severity":2,"message":"45358","line":206,"column":9,"nodeType":"45359","messageId":"45360","endLine":206,"endColumn":12,"suggestions":"47728"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":21,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":24,"suggestions":"47729"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":21,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":24,"suggestions":"47730"},{"ruleId":"45357","severity":2,"message":"45358","line":494,"column":20,"nodeType":"45359","messageId":"45360","endLine":494,"endColumn":23,"suggestions":"47731"},{"ruleId":"45357","severity":2,"message":"45358","line":522,"column":86,"nodeType":"45359","messageId":"45360","endLine":522,"endColumn":89,"suggestions":"47732"},{"ruleId":"45357","severity":2,"message":"45358","line":534,"column":84,"nodeType":"45359","messageId":"45360","endLine":534,"endColumn":87,"suggestions":"47733"},{"ruleId":"45357","severity":2,"message":"45358","line":539,"column":59,"nodeType":"45359","messageId":"45360","endLine":539,"endColumn":62,"suggestions":"47734"},{"ruleId":"45357","severity":2,"message":"45358","line":545,"column":81,"nodeType":"45359","messageId":"45360","endLine":545,"endColumn":84,"suggestions":"47735"},{"ruleId":"45357","severity":2,"message":"45358","line":550,"column":62,"nodeType":"45359","messageId":"45360","endLine":550,"endColumn":65,"suggestions":"47736"},{"ruleId":"45357","severity":2,"message":"45358","line":553,"column":84,"nodeType":"45359","messageId":"45360","endLine":553,"endColumn":87,"suggestions":"47737"},{"ruleId":"45357","severity":2,"message":"45358","line":568,"column":20,"nodeType":"45359","messageId":"45360","endLine":568,"endColumn":23,"suggestions":"47738"},{"ruleId":"45357","severity":2,"message":"45358","line":582,"column":48,"nodeType":"45359","messageId":"45360","endLine":582,"endColumn":51,"suggestions":"47739"},{"ruleId":"45357","severity":2,"message":"45358","line":582,"column":63,"nodeType":"45359","messageId":"45360","endLine":582,"endColumn":66,"suggestions":"47740"},{"ruleId":"45357","severity":2,"message":"45358","line":589,"column":78,"nodeType":"45359","messageId":"45360","endLine":589,"endColumn":81,"suggestions":"47741"},{"ruleId":"45357","severity":2,"message":"45358","line":606,"column":25,"nodeType":"45359","messageId":"45360","endLine":606,"endColumn":28,"suggestions":"47742"},{"ruleId":"45357","severity":2,"message":"45358","line":613,"column":56,"nodeType":"45359","messageId":"45360","endLine":613,"endColumn":59,"suggestions":"47743"},{"ruleId":"45357","severity":2,"message":"45358","line":619,"column":78,"nodeType":"45359","messageId":"45360","endLine":619,"endColumn":81,"suggestions":"47744"},{"ruleId":"45357","severity":2,"message":"45358","line":652,"column":28,"nodeType":"45359","messageId":"45360","endLine":652,"endColumn":31,"suggestions":"47745"},{"ruleId":"45357","severity":2,"message":"45358","line":656,"column":33,"nodeType":"45359","messageId":"45360","endLine":656,"endColumn":36,"suggestions":"47746"},{"ruleId":"45357","severity":2,"message":"45358","line":658,"column":62,"nodeType":"45359","messageId":"45360","endLine":658,"endColumn":65,"suggestions":"47747"},{"ruleId":"45357","severity":2,"message":"45358","line":669,"column":84,"nodeType":"45359","messageId":"45360","endLine":669,"endColumn":87,"suggestions":"47748"},{"ruleId":"45357","severity":2,"message":"45358","line":671,"column":28,"nodeType":"45359","messageId":"45360","endLine":671,"endColumn":31,"suggestions":"47749"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":24,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":27,"suggestions":"47750"},{"ruleId":"45357","severity":2,"message":"45358","line":16,"column":22,"nodeType":"45359","messageId":"45360","endLine":16,"endColumn":25,"suggestions":"47751"},{"ruleId":"45357","severity":2,"message":"45358","line":19,"column":25,"nodeType":"45359","messageId":"45360","endLine":19,"endColumn":28,"suggestions":"47752"},{"ruleId":"45357","severity":2,"message":"45358","line":51,"column":27,"nodeType":"45359","messageId":"45360","endLine":51,"endColumn":30,"suggestions":"47753"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":27,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":30,"suggestions":"47754"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":27,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":30,"suggestions":"47755"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":27,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":30,"suggestions":"47756"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":17,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":20,"suggestions":"47757","suppressions":"47758"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":26,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":29,"suggestions":"47759"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":26,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":29,"suggestions":"47760"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":26,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":29,"suggestions":"47761"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":26,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":29,"suggestions":"47762"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":26,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":29,"suggestions":"47763"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":32,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":35,"suggestions":"47764"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":56,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":59,"suggestions":"47765"},{"ruleId":"45357","severity":2,"message":"45358","line":179,"column":26,"nodeType":"45359","messageId":"45360","endLine":179,"endColumn":29,"suggestions":"47766"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":8,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":11,"suggestions":"47767"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":18,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":21,"suggestions":"47768"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":18,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":21,"suggestions":"47769"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":18,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":21,"suggestions":"47770"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":43,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":46,"suggestions":"47771"},{"ruleId":"45357","severity":2,"message":"45358","line":144,"column":43,"nodeType":"45359","messageId":"45360","endLine":144,"endColumn":46,"suggestions":"47772"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":43,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":46,"suggestions":"47773"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":43,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":46,"suggestions":"47774"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":21,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":24,"suggestions":"47775"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":21,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":24,"suggestions":"47776"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":28,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":31,"suggestions":"47777"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":10,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":13,"suggestions":"47778"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":21,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":24,"suggestions":"47779"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":21,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":24,"suggestions":"47780"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":12,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":15,"suggestions":"47781"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":14,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":17,"suggestions":"47782"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":14,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":17,"suggestions":"47783"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":12,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":15,"suggestions":"47784"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":14,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":17,"suggestions":"47785"},{"ruleId":"45357","severity":2,"message":"45358","line":171,"column":14,"nodeType":"45359","messageId":"45360","endLine":171,"endColumn":17,"suggestions":"47786"},{"ruleId":"45357","severity":2,"message":"45358","line":189,"column":14,"nodeType":"45359","messageId":"45360","endLine":189,"endColumn":17,"suggestions":"47787"},{"ruleId":"45357","severity":2,"message":"45358","line":206,"column":12,"nodeType":"45359","messageId":"45360","endLine":206,"endColumn":15,"suggestions":"47788"},{"ruleId":"45357","severity":2,"message":"45358","line":442,"column":9,"nodeType":"45359","messageId":"45360","endLine":442,"endColumn":12,"suggestions":"47789"},{"ruleId":"45357","severity":2,"message":"45358","line":444,"column":21,"nodeType":"45359","messageId":"45360","endLine":444,"endColumn":24,"suggestions":"47790"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":63,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":66,"suggestions":"47791"},{"ruleId":"45357","severity":2,"message":"45358","line":21,"column":31,"nodeType":"45359","messageId":"45360","endLine":21,"endColumn":34,"suggestions":"47792"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":31,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":34,"suggestions":"47793"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":31,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":34,"suggestions":"47794"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":31,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":34,"suggestions":"47795"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":30,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":33,"suggestions":"47796"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":30,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":33,"suggestions":"47797"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":30,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":33,"suggestions":"47798"},{"ruleId":"45357","severity":2,"message":"45358","line":177,"column":30,"nodeType":"45359","messageId":"45360","endLine":177,"endColumn":33,"suggestions":"47799"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":21,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":24,"suggestions":"47800"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":43,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":46,"suggestions":"47801"},{"ruleId":"45357","severity":2,"message":"45358","line":207,"column":31,"nodeType":"45359","messageId":"45360","endLine":207,"endColumn":34,"suggestions":"47802"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":38,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":41,"suggestions":"47803"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":38,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":41,"suggestions":"47804"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":38,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":41,"suggestions":"47805"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":38,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":41,"suggestions":"47806"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":38,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":41,"suggestions":"47807"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":38,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":41,"suggestions":"47808"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":38,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":41,"suggestions":"47809"},{"ruleId":"45357","severity":2,"message":"45358","line":161,"column":38,"nodeType":"45359","messageId":"45360","endLine":161,"endColumn":41,"suggestions":"47810"},{"ruleId":"45357","severity":2,"message":"45358","line":278,"column":49,"nodeType":"45359","messageId":"45360","endLine":278,"endColumn":52,"suggestions":"47811"},{"ruleId":"45357","severity":2,"message":"45358","line":286,"column":49,"nodeType":"45359","messageId":"45360","endLine":286,"endColumn":52,"suggestions":"47812"},{"ruleId":"45357","severity":2,"message":"45358","line":301,"column":49,"nodeType":"45359","messageId":"45360","endLine":301,"endColumn":52,"suggestions":"47813"},{"ruleId":"45357","severity":2,"message":"45358","line":311,"column":49,"nodeType":"45359","messageId":"45360","endLine":311,"endColumn":52,"suggestions":"47814"},{"ruleId":"45357","severity":2,"message":"45358","line":330,"column":42,"nodeType":"45359","messageId":"45360","endLine":330,"endColumn":45,"suggestions":"47815"},{"ruleId":"45357","severity":2,"message":"45358","line":338,"column":44,"nodeType":"45359","messageId":"45360","endLine":338,"endColumn":47,"suggestions":"47816"},{"ruleId":"45357","severity":2,"message":"45358","line":341,"column":42,"nodeType":"45359","messageId":"45360","endLine":341,"endColumn":45,"suggestions":"47817"},{"ruleId":"45357","severity":2,"message":"45358","line":356,"column":58,"nodeType":"45359","messageId":"45360","endLine":356,"endColumn":61,"suggestions":"47818"},{"ruleId":"45357","severity":2,"message":"45358","line":364,"column":58,"nodeType":"45359","messageId":"45360","endLine":364,"endColumn":61,"suggestions":"47819"},{"ruleId":"45357","severity":2,"message":"45358","line":436,"column":58,"nodeType":"45359","messageId":"45360","endLine":436,"endColumn":61,"suggestions":"47820"},{"ruleId":"45357","severity":2,"message":"45358","line":450,"column":38,"nodeType":"45359","messageId":"45360","endLine":450,"endColumn":41,"suggestions":"47821"},{"ruleId":"45357","severity":2,"message":"45358","line":7,"column":28,"nodeType":"45359","messageId":"45360","endLine":7,"endColumn":31,"suggestions":"47822"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":55,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":58,"suggestions":"47823"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":78,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":81,"suggestions":"47824"},{"ruleId":"45357","severity":2,"message":"45358","line":127,"column":87,"nodeType":"45359","messageId":"45360","endLine":127,"endColumn":90,"suggestions":"47825"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":87,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":90,"suggestions":"47826"},{"ruleId":"45357","severity":2,"message":"45358","line":139,"column":87,"nodeType":"45359","messageId":"45360","endLine":139,"endColumn":90,"suggestions":"47827"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":33,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":36,"suggestions":"47828"},{"ruleId":"45357","severity":2,"message":"45358","line":205,"column":33,"nodeType":"45359","messageId":"45360","endLine":205,"endColumn":36,"suggestions":"47829"},{"ruleId":"45357","severity":2,"message":"45358","line":211,"column":39,"nodeType":"45359","messageId":"45360","endLine":211,"endColumn":42,"suggestions":"47830"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":94,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":97,"suggestions":"47831"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":28,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":31,"suggestions":"47832"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":11,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":14,"suggestions":"47833"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":8,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":11,"suggestions":"47834"},{"ruleId":"45357","severity":2,"message":"45358","line":691,"column":18,"nodeType":"45359","messageId":"45360","endLine":691,"endColumn":21,"suggestions":"47835"},{"ruleId":"45357","severity":2,"message":"45358","line":692,"column":17,"nodeType":"45359","messageId":"45360","endLine":692,"endColumn":20,"suggestions":"47836"},{"ruleId":"45357","severity":2,"message":"45358","line":836,"column":41,"nodeType":"45359","messageId":"45360","endLine":836,"endColumn":44,"suggestions":"47837"},{"ruleId":"45357","severity":2,"message":"45358","line":837,"column":41,"nodeType":"45359","messageId":"45360","endLine":837,"endColumn":44,"suggestions":"47838"},{"ruleId":"45357","severity":2,"message":"45358","line":840,"column":41,"nodeType":"45359","messageId":"45360","endLine":840,"endColumn":44,"suggestions":"47839"},{"ruleId":"45357","severity":2,"message":"45358","line":842,"column":37,"nodeType":"45359","messageId":"45360","endLine":842,"endColumn":40,"suggestions":"47840"},{"ruleId":"45357","severity":2,"message":"45358","line":843,"column":37,"nodeType":"45359","messageId":"45360","endLine":843,"endColumn":40,"suggestions":"47841"},{"ruleId":"45357","severity":2,"message":"45358","line":844,"column":37,"nodeType":"45359","messageId":"45360","endLine":844,"endColumn":40,"suggestions":"47842"},{"ruleId":"45357","severity":2,"message":"45358","line":846,"column":41,"nodeType":"45359","messageId":"45360","endLine":846,"endColumn":44,"suggestions":"47843"},{"ruleId":"45357","severity":2,"message":"45358","line":847,"column":37,"nodeType":"45359","messageId":"45360","endLine":847,"endColumn":40,"suggestions":"47844"},{"ruleId":"45357","severity":2,"message":"45358","line":857,"column":31,"nodeType":"45359","messageId":"45360","endLine":857,"endColumn":34,"suggestions":"47845"},{"ruleId":"45357","severity":2,"message":"45358","line":858,"column":25,"nodeType":"45359","messageId":"45360","endLine":858,"endColumn":28,"suggestions":"47846"},{"ruleId":"45357","severity":2,"message":"45358","line":875,"column":35,"nodeType":"45359","messageId":"45360","endLine":875,"endColumn":38,"suggestions":"47847"},{"ruleId":"45357","severity":2,"message":"45358","line":876,"column":36,"nodeType":"45359","messageId":"45360","endLine":876,"endColumn":39,"suggestions":"47848"},{"ruleId":"45357","severity":2,"message":"45358","line":881,"column":43,"nodeType":"45359","messageId":"45360","endLine":881,"endColumn":46,"suggestions":"47849"},{"ruleId":"45357","severity":2,"message":"45358","line":931,"column":39,"nodeType":"45359","messageId":"45360","endLine":931,"endColumn":42,"suggestions":"47850"},{"ruleId":"45357","severity":2,"message":"45358","line":932,"column":42,"nodeType":"45359","messageId":"45360","endLine":932,"endColumn":45,"suggestions":"47851"},{"ruleId":"45357","severity":2,"message":"45358","line":943,"column":27,"nodeType":"45359","messageId":"45360","endLine":943,"endColumn":30,"suggestions":"47852"},{"ruleId":"45357","severity":2,"message":"45358","line":944,"column":31,"nodeType":"45359","messageId":"45360","endLine":944,"endColumn":34,"suggestions":"47853"},{"ruleId":"45357","severity":2,"message":"45358","line":945,"column":25,"nodeType":"45359","messageId":"45360","endLine":945,"endColumn":28,"suggestions":"47854"},{"ruleId":"45357","severity":2,"message":"45358","line":954,"column":29,"nodeType":"45359","messageId":"45360","endLine":954,"endColumn":32,"suggestions":"47855"},{"ruleId":"45357","severity":2,"message":"45358","line":959,"column":33,"nodeType":"45359","messageId":"45360","endLine":959,"endColumn":36,"suggestions":"47856"},{"ruleId":"45357","severity":2,"message":"45358","line":964,"column":34,"nodeType":"45359","messageId":"45360","endLine":964,"endColumn":37,"suggestions":"47857"},{"ruleId":"45357","severity":2,"message":"45358","line":970,"column":26,"nodeType":"45359","messageId":"45360","endLine":970,"endColumn":29,"suggestions":"47858"},{"ruleId":"45357","severity":2,"message":"45358","line":998,"column":36,"nodeType":"45359","messageId":"45360","endLine":998,"endColumn":39,"suggestions":"47859"},{"ruleId":"45357","severity":2,"message":"45358","line":999,"column":29,"nodeType":"45359","messageId":"45360","endLine":999,"endColumn":32,"suggestions":"47860"},{"ruleId":"45357","severity":2,"message":"45358","line":1024,"column":9,"nodeType":"45359","messageId":"45360","endLine":1024,"endColumn":12,"suggestions":"47861"},{"ruleId":"45357","severity":2,"message":"45358","line":1036,"column":25,"nodeType":"45359","messageId":"45360","endLine":1036,"endColumn":28,"suggestions":"47862"},{"ruleId":"45357","severity":2,"message":"45358","line":1056,"column":9,"nodeType":"45359","messageId":"45360","endLine":1056,"endColumn":12,"suggestions":"47863"},{"ruleId":"45357","severity":2,"message":"45358","line":1078,"column":74,"nodeType":"45359","messageId":"45360","endLine":1078,"endColumn":77,"suggestions":"47864"},{"ruleId":"45357","severity":2,"message":"45358","line":1096,"column":9,"nodeType":"45359","messageId":"45360","endLine":1096,"endColumn":12,"suggestions":"47865"},{"ruleId":"45357","severity":2,"message":"45358","line":1112,"column":31,"nodeType":"45359","messageId":"45360","endLine":1112,"endColumn":34,"suggestions":"47866"},{"ruleId":"45357","severity":2,"message":"45358","line":1113,"column":14,"nodeType":"45359","messageId":"45360","endLine":1113,"endColumn":17,"suggestions":"47867"},{"ruleId":"45357","severity":2,"message":"45358","line":1113,"column":40,"nodeType":"45359","messageId":"45360","endLine":1113,"endColumn":43,"suggestions":"47868"},{"ruleId":"45357","severity":2,"message":"45358","line":1114,"column":14,"nodeType":"45359","messageId":"45360","endLine":1114,"endColumn":17,"suggestions":"47869"},{"ruleId":"45357","severity":2,"message":"45358","line":1114,"column":44,"nodeType":"45359","messageId":"45360","endLine":1114,"endColumn":47,"suggestions":"47870"},{"ruleId":"45357","severity":2,"message":"45358","line":1128,"column":35,"nodeType":"45359","messageId":"45360","endLine":1128,"endColumn":38,"suggestions":"47871"},{"ruleId":"45357","severity":2,"message":"45358","line":1129,"column":35,"nodeType":"45359","messageId":"45360","endLine":1129,"endColumn":38,"suggestions":"47872"},{"ruleId":"45357","severity":2,"message":"45358","line":1130,"column":39,"nodeType":"45359","messageId":"45360","endLine":1130,"endColumn":42,"suggestions":"47873"},{"ruleId":"45357","severity":2,"message":"45358","line":1293,"column":16,"nodeType":"45359","messageId":"45360","endLine":1293,"endColumn":19,"suggestions":"47874"},{"ruleId":"45357","severity":2,"message":"45358","line":1293,"column":54,"nodeType":"45359","messageId":"45360","endLine":1293,"endColumn":57,"suggestions":"47875"},{"ruleId":"45357","severity":2,"message":"45358","line":1294,"column":45,"nodeType":"45359","messageId":"45360","endLine":1294,"endColumn":48,"suggestions":"47876"},{"ruleId":"45357","severity":2,"message":"45358","line":18,"column":16,"nodeType":"45359","messageId":"45360","endLine":18,"endColumn":19,"suggestions":"47877"},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":35,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":38,"suggestions":"47878"},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":49,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":52,"suggestions":"47879"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":10,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":13,"suggestions":"47880"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":9,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":12,"suggestions":"47881"},{"ruleId":"45357","severity":2,"message":"45358","line":200,"column":49,"nodeType":"45359","messageId":"45360","endLine":200,"endColumn":52,"suggestions":"47882"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":41,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":44,"suggestions":"47883"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":52,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":55,"suggestions":"47884"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":52,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":55,"suggestions":"47885"},{"ruleId":"45357","severity":2,"message":"45358","line":209,"column":52,"nodeType":"45359","messageId":"45360","endLine":209,"endColumn":55,"suggestions":"47886"},{"ruleId":"45357","severity":2,"message":"45358","line":257,"column":52,"nodeType":"45359","messageId":"45360","endLine":257,"endColumn":55,"suggestions":"47887"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":52,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":55,"suggestions":"47888"},{"ruleId":"45357","severity":2,"message":"45358","line":144,"column":52,"nodeType":"45359","messageId":"45360","endLine":144,"endColumn":55,"suggestions":"47889"},{"ruleId":"45357","severity":2,"message":"45358","line":51,"column":13,"nodeType":"45359","messageId":"45360","endLine":51,"endColumn":16,"suggestions":"47890"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":17,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":20,"suggestions":"47891"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":13,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":16,"suggestions":"47892"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":17,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":20,"suggestions":"47893"},{"ruleId":"45357","severity":2,"message":"45358","line":9,"column":39,"nodeType":"45359","messageId":"45360","endLine":9,"endColumn":42,"suggestions":"47894"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":37,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":40,"suggestions":"47895"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":48,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":51,"suggestions":"47896"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":11,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":14,"suggestions":"47897"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":10,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":13,"suggestions":"47898"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":52,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":55,"suggestions":"47899"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":37,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":40,"suggestions":"47900"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":48,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":51,"suggestions":"47901"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":11,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":14,"suggestions":"47902"},{"ruleId":"45357","severity":2,"message":"45358","line":123,"column":10,"nodeType":"45359","messageId":"45360","endLine":123,"endColumn":13,"suggestions":"47903"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":37,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":40,"suggestions":"47904"},{"ruleId":"45357","severity":2,"message":"45358","line":136,"column":48,"nodeType":"45359","messageId":"45360","endLine":136,"endColumn":51,"suggestions":"47905"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":11,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":14,"suggestions":"47906"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":10,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":13,"suggestions":"47907"},{"ruleId":"45357","severity":2,"message":"45358","line":160,"column":37,"nodeType":"45359","messageId":"45360","endLine":160,"endColumn":40,"suggestions":"47908"},{"ruleId":"45357","severity":2,"message":"45358","line":160,"column":48,"nodeType":"45359","messageId":"45360","endLine":160,"endColumn":51,"suggestions":"47909"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":11,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":14,"suggestions":"47910"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":10,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":13,"suggestions":"47911"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":37,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":40,"suggestions":"47912"},{"ruleId":"45357","severity":2,"message":"45358","line":194,"column":11,"nodeType":"45359","messageId":"45360","endLine":194,"endColumn":14,"suggestions":"47913"},{"ruleId":"45357","severity":2,"message":"45358","line":203,"column":10,"nodeType":"45359","messageId":"45360","endLine":203,"endColumn":13,"suggestions":"47914"},{"ruleId":"45357","severity":2,"message":"45358","line":205,"column":52,"nodeType":"45359","messageId":"45360","endLine":205,"endColumn":55,"suggestions":"47915"},{"ruleId":"45357","severity":2,"message":"45358","line":214,"column":37,"nodeType":"45359","messageId":"45360","endLine":214,"endColumn":40,"suggestions":"47916"},{"ruleId":"45357","severity":2,"message":"45358","line":217,"column":11,"nodeType":"45359","messageId":"45360","endLine":217,"endColumn":14,"suggestions":"47917"},{"ruleId":"45357","severity":2,"message":"45358","line":226,"column":10,"nodeType":"45359","messageId":"45360","endLine":226,"endColumn":13,"suggestions":"47918"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":52,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":55,"suggestions":"47919"},{"ruleId":"45357","severity":2,"message":"45358","line":236,"column":37,"nodeType":"45359","messageId":"45360","endLine":236,"endColumn":40,"suggestions":"47920"},{"ruleId":"45357","severity":2,"message":"45358","line":242,"column":11,"nodeType":"45359","messageId":"45360","endLine":242,"endColumn":14,"suggestions":"47921"},{"ruleId":"45357","severity":2,"message":"45358","line":251,"column":10,"nodeType":"45359","messageId":"45360","endLine":251,"endColumn":13,"suggestions":"47922"},{"ruleId":"45357","severity":2,"message":"45358","line":261,"column":37,"nodeType":"45359","messageId":"45360","endLine":261,"endColumn":40,"suggestions":"47923"},{"ruleId":"45357","severity":2,"message":"45358","line":261,"column":48,"nodeType":"45359","messageId":"45360","endLine":261,"endColumn":51,"suggestions":"47924"},{"ruleId":"45357","severity":2,"message":"45358","line":267,"column":11,"nodeType":"45359","messageId":"45360","endLine":267,"endColumn":14,"suggestions":"47925"},{"ruleId":"45357","severity":2,"message":"45358","line":276,"column":10,"nodeType":"45359","messageId":"45360","endLine":276,"endColumn":13,"suggestions":"47926"},{"ruleId":"45357","severity":2,"message":"45358","line":283,"column":35,"nodeType":"45359","messageId":"45360","endLine":283,"endColumn":38,"suggestions":"47927"},{"ruleId":"45357","severity":2,"message":"45358","line":290,"column":41,"nodeType":"45359","messageId":"45360","endLine":290,"endColumn":44,"suggestions":"47928"},{"ruleId":"45357","severity":2,"message":"45358","line":316,"column":47,"nodeType":"45359","messageId":"45360","endLine":316,"endColumn":50,"suggestions":"47929"},{"ruleId":"45357","severity":2,"message":"45358","line":357,"column":37,"nodeType":"45359","messageId":"45360","endLine":357,"endColumn":40,"suggestions":"47930"},{"ruleId":"45357","severity":2,"message":"45358","line":357,"column":48,"nodeType":"45359","messageId":"45360","endLine":357,"endColumn":51,"suggestions":"47931"},{"ruleId":"45357","severity":2,"message":"45358","line":363,"column":11,"nodeType":"45359","messageId":"45360","endLine":363,"endColumn":14,"suggestions":"47932"},{"ruleId":"45357","severity":2,"message":"45358","line":372,"column":10,"nodeType":"45359","messageId":"45360","endLine":372,"endColumn":13,"suggestions":"47933"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":30,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":33,"suggestions":"47934"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":18,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":21,"suggestions":"47935"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":39,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":42,"suggestions":"47936"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":18,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":21,"suggestions":"47937"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":39,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":42,"suggestions":"47938"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":30,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":33,"suggestions":"47939"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":30,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":33,"suggestions":"47940"},{"ruleId":"45418","severity":2,"message":"45419","line":3,"column":1,"nodeType":"45420","messageId":"45421","endLine":3,"endColumn":76},{"ruleId":"45357","severity":2,"message":"45358","line":7,"column":11,"nodeType":"45359","messageId":"45360","endLine":7,"endColumn":14,"suggestions":"47941"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":34,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":37,"suggestions":"47942"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":52,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":55,"suggestions":"47943"},{"ruleId":"45357","severity":2,"message":"45358","line":139,"column":38,"nodeType":"45359","messageId":"45360","endLine":139,"endColumn":41,"suggestions":"47944"},{"ruleId":"45357","severity":2,"message":"45358","line":139,"column":56,"nodeType":"45359","messageId":"45360","endLine":139,"endColumn":59,"suggestions":"47945"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":19,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":22,"suggestions":"47946"},{"ruleId":"45357","severity":2,"message":"45358","line":143,"column":26,"nodeType":"45359","messageId":"45360","endLine":143,"endColumn":29,"suggestions":"47947"},{"ruleId":"45357","severity":2,"message":"45358","line":167,"column":16,"nodeType":"45359","messageId":"45360","endLine":167,"endColumn":19,"suggestions":"47948"},{"ruleId":"45357","severity":2,"message":"45358","line":167,"column":35,"nodeType":"45359","messageId":"45360","endLine":167,"endColumn":38,"suggestions":"47949"},{"ruleId":"45357","severity":2,"message":"45358","line":276,"column":58,"nodeType":"45359","messageId":"45360","endLine":276,"endColumn":61,"suggestions":"47950"},{"ruleId":"45357","severity":2,"message":"45358","line":278,"column":77,"nodeType":"45359","messageId":"45360","endLine":278,"endColumn":80,"suggestions":"47951"},{"ruleId":"45357","severity":2,"message":"45358","line":282,"column":78,"nodeType":"45359","messageId":"45360","endLine":282,"endColumn":81,"suggestions":"47952"},{"ruleId":"45357","severity":2,"message":"45358","line":339,"column":60,"nodeType":"45359","messageId":"45360","endLine":339,"endColumn":63,"suggestions":"47953"},{"ruleId":"45357","severity":2,"message":"45358","line":361,"column":56,"nodeType":"45359","messageId":"45360","endLine":361,"endColumn":59,"suggestions":"47954"},{"ruleId":"45357","severity":2,"message":"45358","line":367,"column":72,"nodeType":"45359","messageId":"45360","endLine":367,"endColumn":75,"suggestions":"47955"},{"ruleId":"45357","severity":2,"message":"45358","line":467,"column":48,"nodeType":"45359","messageId":"45360","endLine":467,"endColumn":51,"suggestions":"47956"},{"ruleId":"45357","severity":2,"message":"45358","line":491,"column":48,"nodeType":"45359","messageId":"45360","endLine":491,"endColumn":51,"suggestions":"47957"},{"ruleId":"45357","severity":2,"message":"45358","line":512,"column":48,"nodeType":"45359","messageId":"45360","endLine":512,"endColumn":51,"suggestions":"47958"},{"ruleId":"45357","severity":2,"message":"45358","line":534,"column":48,"nodeType":"45359","messageId":"45360","endLine":534,"endColumn":51,"suggestions":"47959"},{"ruleId":"45357","severity":2,"message":"45358","line":552,"column":65,"nodeType":"45359","messageId":"45360","endLine":552,"endColumn":68,"suggestions":"47960"},{"ruleId":"45357","severity":2,"message":"45358","line":563,"column":61,"nodeType":"45359","messageId":"45360","endLine":563,"endColumn":64,"suggestions":"47961"},{"ruleId":"45357","severity":2,"message":"45358","line":580,"column":55,"nodeType":"45359","messageId":"45360","endLine":580,"endColumn":58,"suggestions":"47962"},{"ruleId":"45357","severity":2,"message":"45358","line":597,"column":65,"nodeType":"45359","messageId":"45360","endLine":597,"endColumn":68,"suggestions":"47963"},{"ruleId":"45357","severity":2,"message":"45358","line":621,"column":65,"nodeType":"45359","messageId":"45360","endLine":621,"endColumn":68,"suggestions":"47964"},{"ruleId":"45357","severity":2,"message":"45358","line":647,"column":57,"nodeType":"45359","messageId":"45360","endLine":647,"endColumn":60,"suggestions":"47965"},{"ruleId":"45357","severity":2,"message":"45358","line":17,"column":75,"nodeType":"45359","messageId":"45360","endLine":17,"endColumn":78,"suggestions":"47966"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":34,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":37,"suggestions":"47967"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":38,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":41,"suggestions":"47968"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":38,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":41,"suggestions":"47969"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":27,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":30,"suggestions":"47970"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":27,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":30,"suggestions":"47971"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":25,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":28,"suggestions":"47972"},{"ruleId":"45357","severity":2,"message":"45358","line":16,"column":64,"nodeType":"45359","messageId":"45360","endLine":16,"endColumn":67,"suggestions":"47973"},{"ruleId":"45357","severity":2,"message":"45358","line":17,"column":20,"nodeType":"45359","messageId":"45360","endLine":17,"endColumn":23,"suggestions":"47974"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":50,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":53,"suggestions":"47975"},{"ruleId":"45357","severity":2,"message":"45358","line":49,"column":50,"nodeType":"45359","messageId":"45360","endLine":49,"endColumn":53,"suggestions":"47976"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":12,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":15,"suggestions":"47977"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":10,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":13,"suggestions":"47978"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":11,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":14,"suggestions":"47979"},{"ruleId":"45357","severity":2,"message":"45358","line":171,"column":20,"nodeType":"45359","messageId":"45360","endLine":171,"endColumn":23,"suggestions":"47980"},{"ruleId":"45357","severity":2,"message":"45358","line":226,"column":52,"nodeType":"45359","messageId":"45360","endLine":226,"endColumn":55,"suggestions":"47981"},{"ruleId":"45357","severity":2,"message":"45358","line":262,"column":50,"nodeType":"45359","messageId":"45360","endLine":262,"endColumn":53,"suggestions":"47982"},{"ruleId":"45357","severity":2,"message":"45358","line":31,"column":27,"nodeType":"45359","messageId":"45360","endLine":31,"endColumn":30,"suggestions":"47983"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":27,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":30,"suggestions":"47984"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":16,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":19,"suggestions":"47985"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":16,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":19,"suggestions":"47986"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":27,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":30,"suggestions":"47987"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":27,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":30,"suggestions":"47988"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":27,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":30,"suggestions":"47989"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":27,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":30,"suggestions":"47990"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":27,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":30,"suggestions":"47991"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":10,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":13,"suggestions":"47992"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":45,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":48,"suggestions":"47993"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":52,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":55,"suggestions":"47994"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":10,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":13,"suggestions":"47995"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":10,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":13,"suggestions":"47996"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":52,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":55,"suggestions":"47997"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":41,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":44,"suggestions":"47998"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":45,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":48,"suggestions":"47999"},{"ruleId":"45357","severity":2,"message":"45358","line":216,"column":9,"nodeType":"45359","messageId":"45360","endLine":216,"endColumn":12,"suggestions":"48000"},{"ruleId":"45357","severity":2,"message":"45358","line":219,"column":25,"nodeType":"45359","messageId":"45360","endLine":219,"endColumn":28,"suggestions":"48001"},{"ruleId":"45357","severity":2,"message":"45358","line":231,"column":9,"nodeType":"45359","messageId":"45360","endLine":231,"endColumn":12,"suggestions":"48002"},{"ruleId":"45357","severity":2,"message":"45358","line":234,"column":25,"nodeType":"45359","messageId":"45360","endLine":234,"endColumn":28,"suggestions":"48003"},{"ruleId":"45357","severity":2,"message":"45358","line":249,"column":9,"nodeType":"45359","messageId":"45360","endLine":249,"endColumn":12,"suggestions":"48004"},{"ruleId":"45357","severity":2,"message":"45358","line":252,"column":32,"nodeType":"45359","messageId":"45360","endLine":252,"endColumn":35,"suggestions":"48005"},{"ruleId":"45357","severity":2,"message":"45358","line":253,"column":32,"nodeType":"45359","messageId":"45360","endLine":253,"endColumn":35,"suggestions":"48006"},{"ruleId":"45357","severity":2,"message":"45358","line":268,"column":38,"nodeType":"45359","messageId":"45360","endLine":268,"endColumn":41,"suggestions":"48007"},{"ruleId":"45357","severity":2,"message":"45358","line":268,"column":52,"nodeType":"45359","messageId":"45360","endLine":268,"endColumn":55,"suggestions":"48008"},{"ruleId":"45357","severity":2,"message":"45358","line":338,"column":38,"nodeType":"45359","messageId":"45360","endLine":338,"endColumn":41,"suggestions":"48009"},{"ruleId":"45357","severity":2,"message":"45358","line":338,"column":52,"nodeType":"45359","messageId":"45360","endLine":338,"endColumn":55,"suggestions":"48010"},{"ruleId":"45357","severity":2,"message":"45358","line":390,"column":43,"nodeType":"45359","messageId":"45360","endLine":390,"endColumn":46,"suggestions":"48011"},{"ruleId":"45357","severity":2,"message":"45358","line":390,"column":57,"nodeType":"45359","messageId":"45360","endLine":390,"endColumn":60,"suggestions":"48012"},{"ruleId":"45357","severity":2,"message":"45358","line":587,"column":43,"nodeType":"45359","messageId":"45360","endLine":587,"endColumn":46,"suggestions":"48013"},{"ruleId":"45357","severity":2,"message":"45358","line":587,"column":57,"nodeType":"45359","messageId":"45360","endLine":587,"endColumn":60,"suggestions":"48014"},{"ruleId":"45357","severity":2,"message":"45358","line":661,"column":8,"nodeType":"45359","messageId":"45360","endLine":661,"endColumn":11,"suggestions":"48015"},{"ruleId":"45357","severity":2,"message":"45358","line":663,"column":25,"nodeType":"45359","messageId":"45360","endLine":663,"endColumn":28,"suggestions":"48016"},{"ruleId":"45357","severity":2,"message":"45358","line":679,"column":8,"nodeType":"45359","messageId":"45360","endLine":679,"endColumn":11,"suggestions":"48017"},{"ruleId":"45357","severity":2,"message":"45358","line":696,"column":8,"nodeType":"45359","messageId":"45360","endLine":696,"endColumn":11,"suggestions":"48018"},{"ruleId":"45357","severity":2,"message":"45358","line":260,"column":45,"nodeType":"45359","messageId":"45360","endLine":260,"endColumn":48,"suggestions":"48019"},{"ruleId":"45357","severity":2,"message":"45358","line":292,"column":45,"nodeType":"45359","messageId":"45360","endLine":292,"endColumn":48,"suggestions":"48020"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":45,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":48,"suggestions":"48021"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":52,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":55,"suggestions":"48022"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":52,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":55,"suggestions":"48023"},{"ruleId":"45357","severity":2,"message":"45358","line":179,"column":52,"nodeType":"45359","messageId":"45360","endLine":179,"endColumn":55,"suggestions":"48024"},{"ruleId":"45357","severity":2,"message":"45358","line":227,"column":52,"nodeType":"45359","messageId":"45360","endLine":227,"endColumn":55,"suggestions":"48025"},{"ruleId":"45357","severity":2,"message":"45358","line":259,"column":52,"nodeType":"45359","messageId":"45360","endLine":259,"endColumn":55,"suggestions":"48026"},{"ruleId":"45357","severity":2,"message":"45358","line":292,"column":52,"nodeType":"45359","messageId":"45360","endLine":292,"endColumn":55,"suggestions":"48027"},{"ruleId":"45357","severity":2,"message":"45358","line":337,"column":52,"nodeType":"45359","messageId":"45360","endLine":337,"endColumn":55,"suggestions":"48028"},{"ruleId":"45357","severity":2,"message":"45358","line":386,"column":52,"nodeType":"45359","messageId":"45360","endLine":386,"endColumn":55,"suggestions":"48029"},{"ruleId":"45357","severity":2,"message":"45358","line":454,"column":52,"nodeType":"45359","messageId":"45360","endLine":454,"endColumn":55,"suggestions":"48030"},{"ruleId":"45357","severity":2,"message":"45358","line":518,"column":52,"nodeType":"45359","messageId":"45360","endLine":518,"endColumn":55,"suggestions":"48031"},{"ruleId":"45357","severity":2,"message":"45358","line":581,"column":52,"nodeType":"45359","messageId":"45360","endLine":581,"endColumn":55,"suggestions":"48032"},{"ruleId":"45357","severity":2,"message":"45358","line":646,"column":52,"nodeType":"45359","messageId":"45360","endLine":646,"endColumn":55,"suggestions":"48033"},{"ruleId":"45357","severity":2,"message":"45358","line":699,"column":52,"nodeType":"45359","messageId":"45360","endLine":699,"endColumn":55,"suggestions":"48034"},{"ruleId":"45357","severity":2,"message":"45358","line":807,"column":52,"nodeType":"45359","messageId":"45360","endLine":807,"endColumn":55,"suggestions":"48035"},{"ruleId":"45357","severity":2,"message":"45358","line":859,"column":52,"nodeType":"45359","messageId":"45360","endLine":859,"endColumn":55,"suggestions":"48036"},{"ruleId":"45357","severity":2,"message":"45358","line":924,"column":52,"nodeType":"45359","messageId":"45360","endLine":924,"endColumn":55,"suggestions":"48037"},{"ruleId":"45357","severity":2,"message":"45358","line":972,"column":52,"nodeType":"45359","messageId":"45360","endLine":972,"endColumn":55,"suggestions":"48038"},{"ruleId":"45357","severity":2,"message":"45358","line":1027,"column":52,"nodeType":"45359","messageId":"45360","endLine":1027,"endColumn":55,"suggestions":"48039"},{"ruleId":"45357","severity":2,"message":"45358","line":1058,"column":52,"nodeType":"45359","messageId":"45360","endLine":1058,"endColumn":55,"suggestions":"48040"},{"ruleId":"45357","severity":2,"message":"45358","line":1087,"column":52,"nodeType":"45359","messageId":"45360","endLine":1087,"endColumn":55,"suggestions":"48041"},{"ruleId":"45357","severity":2,"message":"45358","line":1864,"column":54,"nodeType":"45359","messageId":"45360","endLine":1864,"endColumn":57,"suggestions":"48042"},{"ruleId":"45357","severity":2,"message":"45358","line":2165,"column":52,"nodeType":"45359","messageId":"45360","endLine":2165,"endColumn":55,"suggestions":"48043"},{"ruleId":"45357","severity":2,"message":"45358","line":2186,"column":52,"nodeType":"45359","messageId":"45360","endLine":2186,"endColumn":55,"suggestions":"48044"},{"ruleId":"45357","severity":2,"message":"45358","line":2219,"column":52,"nodeType":"45359","messageId":"45360","endLine":2219,"endColumn":55,"suggestions":"48045"},{"ruleId":"45357","severity":2,"message":"45358","line":2403,"column":30,"nodeType":"45359","messageId":"45360","endLine":2403,"endColumn":33,"suggestions":"48046"},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":40,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":43,"suggestions":"48047"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":40,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":43,"suggestions":"48048"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":75,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":78,"suggestions":"48049"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":23,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":26,"suggestions":"48050"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":25,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":28,"suggestions":"48051"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":25,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":28,"suggestions":"48052"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":25,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":28,"suggestions":"48053"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":39,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":42,"suggestions":"48054"},{"ruleId":"45357","severity":2,"message":"45358","line":186,"column":37,"nodeType":"45359","messageId":"45360","endLine":186,"endColumn":40,"suggestions":"48055","suppressions":"48056"},{"ruleId":"45357","severity":2,"message":"45358","line":25,"column":32,"nodeType":"45359","messageId":"45360","endLine":25,"endColumn":35,"suggestions":"48057"},{"ruleId":"45357","severity":2,"message":"45358","line":130,"column":82,"nodeType":"45359","messageId":"45360","endLine":130,"endColumn":85,"suggestions":"48058"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":78,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":81,"suggestions":"48059"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":79,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":82,"suggestions":"48060"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":88,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":91,"suggestions":"48061"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":78,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":81,"suggestions":"48062"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":83,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":86,"suggestions":"48063"},{"ruleId":"45357","severity":2,"message":"45358","line":150,"column":81,"nodeType":"45359","messageId":"45360","endLine":150,"endColumn":84,"suggestions":"48064"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":84,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":87,"suggestions":"48065"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":78,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":81,"suggestions":"48066"},{"ruleId":"45357","severity":2,"message":"45358","line":203,"column":79,"nodeType":"45359","messageId":"45360","endLine":203,"endColumn":82,"suggestions":"48067"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":78,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":81,"suggestions":"48068"},{"ruleId":"45357","severity":2,"message":"45358","line":213,"column":79,"nodeType":"45359","messageId":"45360","endLine":213,"endColumn":82,"suggestions":"48069"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":43,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":46,"suggestions":"48070"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":43,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":46,"suggestions":"48071"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":43,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":46,"suggestions":"48072"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":43,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":46,"suggestions":"48073"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":43,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":46,"suggestions":"48074"},{"ruleId":"45357","severity":2,"message":"45358","line":139,"column":43,"nodeType":"45359","messageId":"45360","endLine":139,"endColumn":46,"suggestions":"48075"},{"ruleId":"45357","severity":2,"message":"45358","line":157,"column":43,"nodeType":"45359","messageId":"45360","endLine":157,"endColumn":46,"suggestions":"48076"},{"ruleId":"45357","severity":2,"message":"45358","line":182,"column":43,"nodeType":"45359","messageId":"45360","endLine":182,"endColumn":46,"suggestions":"48077"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":43,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":46,"suggestions":"48078"},{"ruleId":"45357","severity":2,"message":"45358","line":226,"column":43,"nodeType":"45359","messageId":"45360","endLine":226,"endColumn":46,"suggestions":"48079"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":20,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":23,"suggestions":"48080"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":28,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":31,"suggestions":"48081"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":20,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":23,"suggestions":"48082"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":20,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":23,"suggestions":"48083"},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":24,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":27,"suggestions":"48084"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":93,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":96,"suggestions":"48085"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":95,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":98,"suggestions":"48086"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":39,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":42,"suggestions":"48087"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":24,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":27,"suggestions":"48088"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":43,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":46,"suggestions":"48089"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":43,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":46,"suggestions":"48090"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":21,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":24,"suggestions":"48091"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":21,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":24,"suggestions":"48092"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":78,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":81,"suggestions":"48093"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":34,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":37,"suggestions":"48094"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":34,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":37,"suggestions":"48095"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":34,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":37,"suggestions":"48096"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":33,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":36,"suggestions":"48097"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":33,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":36,"suggestions":"48098"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":33,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":36,"suggestions":"48099"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":33,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":36,"suggestions":"48100"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":46,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":49,"suggestions":"48101"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":33,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":36,"suggestions":"48102"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":19,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":22,"suggestions":"48103"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":16,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":19,"suggestions":"48104"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":33,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":36,"suggestions":"48105"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":11,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":14,"suggestions":"48106"},{"ruleId":"45357","severity":2,"message":"45358","line":141,"column":33,"nodeType":"45359","messageId":"45360","endLine":141,"endColumn":36,"suggestions":"48107"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":35,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":38,"suggestions":"48108"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":35,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":38,"suggestions":"48109"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":35,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":38,"suggestions":"48110"},{"ruleId":"45357","severity":2,"message":"45358","line":181,"column":35,"nodeType":"45359","messageId":"45360","endLine":181,"endColumn":38,"suggestions":"48111"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":35,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":38,"suggestions":"48112"},{"ruleId":"45357","severity":2,"message":"45358","line":198,"column":31,"nodeType":"45359","messageId":"45360","endLine":198,"endColumn":34,"suggestions":"48113"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":31,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":34,"suggestions":"48114"},{"ruleId":"45357","severity":2,"message":"45358","line":206,"column":18,"nodeType":"45359","messageId":"45360","endLine":206,"endColumn":21,"suggestions":"48115"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":31,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":34,"suggestions":"48116"},{"ruleId":"45357","severity":2,"message":"45358","line":214,"column":18,"nodeType":"45359","messageId":"45360","endLine":214,"endColumn":21,"suggestions":"48117"},{"ruleId":"45357","severity":2,"message":"45358","line":222,"column":58,"nodeType":"45359","messageId":"45360","endLine":222,"endColumn":61,"suggestions":"48118"},{"ruleId":"45357","severity":2,"message":"45358","line":232,"column":58,"nodeType":"45359","messageId":"45360","endLine":232,"endColumn":61,"suggestions":"48119"},{"ruleId":"45357","severity":2,"message":"45358","line":270,"column":30,"nodeType":"45359","messageId":"45360","endLine":270,"endColumn":33,"suggestions":"48120"},{"ruleId":"45357","severity":2,"message":"45358","line":279,"column":18,"nodeType":"45359","messageId":"45360","endLine":279,"endColumn":21,"suggestions":"48121"},{"ruleId":"45357","severity":2,"message":"45358","line":292,"column":18,"nodeType":"45359","messageId":"45360","endLine":292,"endColumn":21,"suggestions":"48122"},{"ruleId":"45357","severity":2,"message":"45358","line":294,"column":51,"nodeType":"45359","messageId":"45360","endLine":294,"endColumn":54,"suggestions":"48123"},{"ruleId":"45357","severity":2,"message":"45358","line":301,"column":36,"nodeType":"45359","messageId":"45360","endLine":301,"endColumn":39,"suggestions":"48124"},{"ruleId":"45357","severity":2,"message":"45358","line":302,"column":18,"nodeType":"45359","messageId":"45360","endLine":302,"endColumn":21,"suggestions":"48125"},{"ruleId":"45357","severity":2,"message":"45358","line":303,"column":37,"nodeType":"45359","messageId":"45360","endLine":303,"endColumn":40,"suggestions":"48126"},{"ruleId":"45357","severity":2,"message":"45358","line":308,"column":37,"nodeType":"45359","messageId":"45360","endLine":308,"endColumn":40,"suggestions":"48127"},{"ruleId":"45357","severity":2,"message":"45358","line":309,"column":18,"nodeType":"45359","messageId":"45360","endLine":309,"endColumn":21,"suggestions":"48128"},{"ruleId":"45357","severity":2,"message":"45358","line":319,"column":51,"nodeType":"45359","messageId":"45360","endLine":319,"endColumn":54,"suggestions":"48129"},{"ruleId":"45357","severity":2,"message":"45358","line":337,"column":18,"nodeType":"45359","messageId":"45360","endLine":337,"endColumn":21,"suggestions":"48130"},{"ruleId":"45357","severity":2,"message":"45358","line":341,"column":18,"nodeType":"45359","messageId":"45360","endLine":341,"endColumn":21,"suggestions":"48131"},{"ruleId":"45357","severity":2,"message":"45358","line":350,"column":51,"nodeType":"45359","messageId":"45360","endLine":350,"endColumn":54,"suggestions":"48132"},{"ruleId":"45357","severity":2,"message":"45358","line":358,"column":18,"nodeType":"45359","messageId":"45360","endLine":358,"endColumn":21,"suggestions":"48133"},{"ruleId":"45357","severity":2,"message":"45358","line":361,"column":18,"nodeType":"45359","messageId":"45360","endLine":361,"endColumn":21,"suggestions":"48134"},{"ruleId":"45357","severity":2,"message":"45358","line":369,"column":37,"nodeType":"45359","messageId":"45360","endLine":369,"endColumn":40,"suggestions":"48135"},{"ruleId":"45357","severity":2,"message":"45358","line":375,"column":37,"nodeType":"45359","messageId":"45360","endLine":375,"endColumn":40,"suggestions":"48136"},{"ruleId":"45357","severity":2,"message":"45358","line":389,"column":39,"nodeType":"45359","messageId":"45360","endLine":389,"endColumn":42,"suggestions":"48137"},{"ruleId":"45357","severity":2,"message":"45358","line":400,"column":18,"nodeType":"45359","messageId":"45360","endLine":400,"endColumn":21,"suggestions":"48138"},{"ruleId":"45357","severity":2,"message":"45358","line":403,"column":18,"nodeType":"45359","messageId":"45360","endLine":403,"endColumn":21,"suggestions":"48139"},{"ruleId":"45357","severity":2,"message":"45358","line":420,"column":51,"nodeType":"45359","messageId":"45360","endLine":420,"endColumn":54,"suggestions":"48140"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":18,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":21,"suggestions":"48141"},{"ruleId":"45357","severity":2,"message":"45358","line":432,"column":18,"nodeType":"45359","messageId":"45360","endLine":432,"endColumn":21,"suggestions":"48142"},{"ruleId":"45357","severity":2,"message":"45358","line":440,"column":51,"nodeType":"45359","messageId":"45360","endLine":440,"endColumn":54,"suggestions":"48143"},{"ruleId":"45357","severity":2,"message":"45358","line":447,"column":18,"nodeType":"45359","messageId":"45360","endLine":447,"endColumn":21,"suggestions":"48144"},{"ruleId":"45357","severity":2,"message":"45358","line":450,"column":18,"nodeType":"45359","messageId":"45360","endLine":450,"endColumn":21,"suggestions":"48145"},{"ruleId":"45357","severity":2,"message":"45358","line":458,"column":51,"nodeType":"45359","messageId":"45360","endLine":458,"endColumn":54,"suggestions":"48146"},{"ruleId":"45357","severity":2,"message":"45358","line":465,"column":18,"nodeType":"45359","messageId":"45360","endLine":465,"endColumn":21,"suggestions":"48147"},{"ruleId":"45357","severity":2,"message":"45358","line":469,"column":18,"nodeType":"45359","messageId":"45360","endLine":469,"endColumn":21,"suggestions":"48148"},{"ruleId":"45357","severity":2,"message":"45358","line":476,"column":37,"nodeType":"45359","messageId":"45360","endLine":476,"endColumn":40,"suggestions":"48149"},{"ruleId":"45357","severity":2,"message":"45358","line":478,"column":18,"nodeType":"45359","messageId":"45360","endLine":478,"endColumn":21,"suggestions":"48150"},{"ruleId":"45357","severity":2,"message":"45358","line":485,"column":37,"nodeType":"45359","messageId":"45360","endLine":485,"endColumn":40,"suggestions":"48151"},{"ruleId":"45357","severity":2,"message":"45358","line":13,"column":17,"nodeType":"45359","messageId":"45360","endLine":13,"endColumn":20,"suggestions":"48152"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":34,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":37,"suggestions":"48153"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":48,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":51,"suggestions":"48154"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":39,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":42,"suggestions":"48155"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":48,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":51,"suggestions":"48156"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":48,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":51,"suggestions":"48157"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":43,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":46,"suggestions":"48158"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":43,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":46,"suggestions":"48159"},{"ruleId":"45357","severity":2,"message":"45358","line":78,"column":65,"nodeType":"45359","messageId":"45360","endLine":78,"endColumn":68,"suggestions":"48160"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":59,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":62,"suggestions":"48161"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":43,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":46,"suggestions":"48162"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":43,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":46,"suggestions":"48163"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":43,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":46,"suggestions":"48164"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":45,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":48,"suggestions":"48165"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":43,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":46,"suggestions":"48166"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":43,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":46,"suggestions":"48167"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":60,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":63,"suggestions":"48168"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":79,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":82,"suggestions":"48169"},{"ruleId":"45357","severity":2,"message":"45358","line":155,"column":20,"nodeType":"45359","messageId":"45360","endLine":155,"endColumn":23,"suggestions":"48170"},{"ruleId":"45357","severity":2,"message":"45358","line":188,"column":10,"nodeType":"45359","messageId":"45360","endLine":188,"endColumn":13,"suggestions":"48171"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":45,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":48,"suggestions":"48172"},{"ruleId":"45357","severity":2,"message":"45358","line":139,"column":45,"nodeType":"45359","messageId":"45360","endLine":139,"endColumn":48,"suggestions":"48173"},{"ruleId":"45357","severity":2,"message":"45358","line":171,"column":43,"nodeType":"45359","messageId":"45360","endLine":171,"endColumn":46,"suggestions":"48174"},{"ruleId":"45357","severity":2,"message":"45358","line":219,"column":43,"nodeType":"45359","messageId":"45360","endLine":219,"endColumn":46,"suggestions":"48175"},{"ruleId":"45357","severity":2,"message":"45358","line":256,"column":43,"nodeType":"45359","messageId":"45360","endLine":256,"endColumn":46,"suggestions":"48176"},{"ruleId":"45357","severity":2,"message":"45358","line":295,"column":43,"nodeType":"45359","messageId":"45360","endLine":295,"endColumn":46,"suggestions":"48177"},{"ruleId":"45357","severity":2,"message":"45358","line":340,"column":43,"nodeType":"45359","messageId":"45360","endLine":340,"endColumn":46,"suggestions":"48178"},{"ruleId":"45357","severity":2,"message":"45358","line":396,"column":43,"nodeType":"45359","messageId":"45360","endLine":396,"endColumn":46,"suggestions":"48179"},{"ruleId":"45357","severity":2,"message":"45358","line":457,"column":43,"nodeType":"45359","messageId":"45360","endLine":457,"endColumn":46,"suggestions":"48180"},{"ruleId":"45357","severity":2,"message":"45358","line":506,"column":43,"nodeType":"45359","messageId":"45360","endLine":506,"endColumn":46,"suggestions":"48181"},{"ruleId":"45357","severity":2,"message":"45358","line":578,"column":43,"nodeType":"45359","messageId":"45360","endLine":578,"endColumn":46,"suggestions":"48182"},{"ruleId":"45357","severity":2,"message":"45358","line":642,"column":43,"nodeType":"45359","messageId":"45360","endLine":642,"endColumn":46,"suggestions":"48183"},{"ruleId":"45357","severity":2,"message":"45358","line":721,"column":43,"nodeType":"45359","messageId":"45360","endLine":721,"endColumn":46,"suggestions":"48184"},{"ruleId":"45357","severity":2,"message":"45358","line":802,"column":43,"nodeType":"45359","messageId":"45360","endLine":802,"endColumn":46,"suggestions":"48185"},{"ruleId":"45357","severity":2,"message":"45358","line":854,"column":43,"nodeType":"45359","messageId":"45360","endLine":854,"endColumn":46,"suggestions":"48186"},{"ruleId":"45357","severity":2,"message":"45358","line":919,"column":43,"nodeType":"45359","messageId":"45360","endLine":919,"endColumn":46,"suggestions":"48187"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":21,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":24,"suggestions":"48188"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":65,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":68,"suggestions":"48189"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":59,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":62,"suggestions":"48190"},{"ruleId":"45357","severity":2,"message":"45358","line":141,"column":43,"nodeType":"45359","messageId":"45360","endLine":141,"endColumn":46,"suggestions":"48191"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":43,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":46,"suggestions":"48192"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":43,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":46,"suggestions":"48193"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":43,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":46,"suggestions":"48194"},{"ruleId":"45357","severity":2,"message":"45358","line":177,"column":43,"nodeType":"45359","messageId":"45360","endLine":177,"endColumn":46,"suggestions":"48195"},{"ruleId":"45357","severity":2,"message":"45358","line":192,"column":45,"nodeType":"45359","messageId":"45360","endLine":192,"endColumn":48,"suggestions":"48196"},{"ruleId":"45357","severity":2,"message":"45358","line":221,"column":41,"nodeType":"45359","messageId":"45360","endLine":221,"endColumn":44,"suggestions":"48197"},{"ruleId":"45357","severity":2,"message":"45358","line":227,"column":57,"nodeType":"45359","messageId":"45360","endLine":227,"endColumn":60,"suggestions":"48198"},{"ruleId":"45357","severity":2,"message":"45358","line":236,"column":37,"nodeType":"45359","messageId":"45360","endLine":236,"endColumn":40,"suggestions":"48199"},{"ruleId":"45357","severity":2,"message":"45358","line":242,"column":56,"nodeType":"45359","messageId":"45360","endLine":242,"endColumn":59,"suggestions":"48200"},{"ruleId":"45357","severity":2,"message":"45358","line":278,"column":43,"nodeType":"45359","messageId":"45360","endLine":278,"endColumn":46,"suggestions":"48201"},{"ruleId":"45357","severity":2,"message":"45358","line":287,"column":34,"nodeType":"45359","messageId":"45360","endLine":287,"endColumn":37,"suggestions":"48202"},{"ruleId":"45357","severity":2,"message":"45358","line":287,"column":71,"nodeType":"45359","messageId":"45360","endLine":287,"endColumn":74,"suggestions":"48203"},{"ruleId":"45357","severity":2,"message":"45358","line":298,"column":42,"nodeType":"45359","messageId":"45360","endLine":298,"endColumn":45,"suggestions":"48204"},{"ruleId":"45357","severity":2,"message":"45358","line":310,"column":43,"nodeType":"45359","messageId":"45360","endLine":310,"endColumn":46,"suggestions":"48205"},{"ruleId":"45357","severity":2,"message":"45358","line":315,"column":43,"nodeType":"45359","messageId":"45360","endLine":315,"endColumn":46,"suggestions":"48206"},{"ruleId":"45357","severity":2,"message":"45358","line":377,"column":45,"nodeType":"45359","messageId":"45360","endLine":377,"endColumn":48,"suggestions":"48207"},{"ruleId":"45357","severity":2,"message":"45358","line":430,"column":42,"nodeType":"45359","messageId":"45360","endLine":430,"endColumn":45,"suggestions":"48208"},{"ruleId":"45357","severity":2,"message":"45358","line":435,"column":45,"nodeType":"45359","messageId":"45360","endLine":435,"endColumn":48,"suggestions":"48209"},{"ruleId":"45357","severity":2,"message":"45358","line":457,"column":43,"nodeType":"45359","messageId":"45360","endLine":457,"endColumn":46,"suggestions":"48210"},{"ruleId":"45357","severity":2,"message":"45358","line":508,"column":45,"nodeType":"45359","messageId":"45360","endLine":508,"endColumn":48,"suggestions":"48211"},{"ruleId":"45357","severity":2,"message":"45358","line":559,"column":45,"nodeType":"45359","messageId":"45360","endLine":559,"endColumn":48,"suggestions":"48212"},{"ruleId":"45357","severity":2,"message":"45358","line":582,"column":43,"nodeType":"45359","messageId":"45360","endLine":582,"endColumn":46,"suggestions":"48213"},{"ruleId":"45357","severity":2,"message":"45358","line":603,"column":43,"nodeType":"45359","messageId":"45360","endLine":603,"endColumn":46,"suggestions":"48214"},{"ruleId":"45357","severity":2,"message":"45358","line":630,"column":43,"nodeType":"45359","messageId":"45360","endLine":630,"endColumn":46,"suggestions":"48215"},{"ruleId":"45357","severity":2,"message":"45358","line":663,"column":43,"nodeType":"45359","messageId":"45360","endLine":663,"endColumn":46,"suggestions":"48216"},{"ruleId":"45357","severity":2,"message":"45358","line":692,"column":43,"nodeType":"45359","messageId":"45360","endLine":692,"endColumn":46,"suggestions":"48217"},{"ruleId":"45357","severity":2,"message":"45358","line":739,"column":43,"nodeType":"45359","messageId":"45360","endLine":739,"endColumn":46,"suggestions":"48218"},{"ruleId":"45357","severity":2,"message":"45358","line":754,"column":17,"nodeType":"45359","messageId":"45360","endLine":754,"endColumn":20,"suggestions":"48219"},{"ruleId":"45357","severity":2,"message":"45358","line":755,"column":20,"nodeType":"45359","messageId":"45360","endLine":755,"endColumn":23,"suggestions":"48220"},{"ruleId":"45357","severity":2,"message":"45358","line":784,"column":43,"nodeType":"45359","messageId":"45360","endLine":784,"endColumn":46,"suggestions":"48221"},{"ruleId":"45357","severity":2,"message":"45358","line":804,"column":85,"nodeType":"45359","messageId":"45360","endLine":804,"endColumn":88,"suggestions":"48222"},{"ruleId":"45357","severity":2,"message":"45358","line":816,"column":43,"nodeType":"45359","messageId":"45360","endLine":816,"endColumn":46,"suggestions":"48223"},{"ruleId":"45357","severity":2,"message":"45358","line":832,"column":90,"nodeType":"45359","messageId":"45360","endLine":832,"endColumn":93,"suggestions":"48224"},{"ruleId":"45357","severity":2,"message":"45358","line":845,"column":43,"nodeType":"45359","messageId":"45360","endLine":845,"endColumn":46,"suggestions":"48225"},{"ruleId":"45357","severity":2,"message":"45358","line":902,"column":22,"nodeType":"45359","messageId":"45360","endLine":902,"endColumn":25,"suggestions":"48226"},{"ruleId":"45357","severity":2,"message":"45358","line":916,"column":22,"nodeType":"45359","messageId":"45360","endLine":916,"endColumn":25,"suggestions":"48227"},{"ruleId":"45357","severity":2,"message":"45358","line":928,"column":91,"nodeType":"45359","messageId":"45360","endLine":928,"endColumn":94,"suggestions":"48228"},{"ruleId":"45357","severity":2,"message":"45358","line":955,"column":45,"nodeType":"45359","messageId":"45360","endLine":955,"endColumn":48,"suggestions":"48229"},{"ruleId":"45357","severity":2,"message":"45358","line":964,"column":37,"nodeType":"45359","messageId":"45360","endLine":964,"endColumn":40,"suggestions":"48230"},{"ruleId":"45357","severity":2,"message":"45358","line":987,"column":43,"nodeType":"45359","messageId":"45360","endLine":987,"endColumn":46,"suggestions":"48231"},{"ruleId":"45357","severity":2,"message":"45358","line":991,"column":51,"nodeType":"45359","messageId":"45360","endLine":991,"endColumn":54,"suggestions":"48232"},{"ruleId":"45357","severity":2,"message":"45358","line":992,"column":49,"nodeType":"45359","messageId":"45360","endLine":992,"endColumn":52,"suggestions":"48233"},{"ruleId":"45357","severity":2,"message":"45358","line":993,"column":49,"nodeType":"45359","messageId":"45360","endLine":993,"endColumn":52,"suggestions":"48234"},{"ruleId":"45357","severity":2,"message":"45358","line":994,"column":62,"nodeType":"45359","messageId":"45360","endLine":994,"endColumn":65,"suggestions":"48235"},{"ruleId":"45357","severity":2,"message":"45358","line":995,"column":51,"nodeType":"45359","messageId":"45360","endLine":995,"endColumn":54,"suggestions":"48236"},{"ruleId":"45357","severity":2,"message":"45358","line":996,"column":52,"nodeType":"45359","messageId":"45360","endLine":996,"endColumn":55,"suggestions":"48237"},{"ruleId":"45357","severity":2,"message":"45358","line":997,"column":58,"nodeType":"45359","messageId":"45360","endLine":997,"endColumn":61,"suggestions":"48238"},{"ruleId":"45357","severity":2,"message":"45358","line":1006,"column":86,"nodeType":"45359","messageId":"45360","endLine":1006,"endColumn":89,"suggestions":"48239"},{"ruleId":"45357","severity":2,"message":"45358","line":1026,"column":43,"nodeType":"45359","messageId":"45360","endLine":1026,"endColumn":46,"suggestions":"48240"},{"ruleId":"45357","severity":2,"message":"45358","line":1074,"column":43,"nodeType":"45359","messageId":"45360","endLine":1074,"endColumn":46,"suggestions":"48241"},{"ruleId":"45357","severity":2,"message":"45358","line":1104,"column":43,"nodeType":"45359","messageId":"45360","endLine":1104,"endColumn":46,"suggestions":"48242"},{"ruleId":"45357","severity":2,"message":"45358","line":1108,"column":29,"nodeType":"45359","messageId":"45360","endLine":1108,"endColumn":32,"suggestions":"48243"},{"ruleId":"45357","severity":2,"message":"45358","line":1109,"column":14,"nodeType":"45359","messageId":"45360","endLine":1109,"endColumn":17,"suggestions":"48244"},{"ruleId":"45357","severity":2,"message":"45358","line":1109,"column":56,"nodeType":"45359","messageId":"45360","endLine":1109,"endColumn":59,"suggestions":"48245"},{"ruleId":"45357","severity":2,"message":"45358","line":1110,"column":14,"nodeType":"45359","messageId":"45360","endLine":1110,"endColumn":17,"suggestions":"48246"},{"ruleId":"45357","severity":2,"message":"45358","line":1110,"column":52,"nodeType":"45359","messageId":"45360","endLine":1110,"endColumn":55,"suggestions":"48247"},{"ruleId":"45357","severity":2,"message":"45358","line":1111,"column":40,"nodeType":"45359","messageId":"45360","endLine":1111,"endColumn":43,"suggestions":"48248"},{"ruleId":"45357","severity":2,"message":"45358","line":1112,"column":14,"nodeType":"45359","messageId":"45360","endLine":1112,"endColumn":17,"suggestions":"48249"},{"ruleId":"45357","severity":2,"message":"45358","line":1112,"column":65,"nodeType":"45359","messageId":"45360","endLine":1112,"endColumn":68,"suggestions":"48250"},{"ruleId":"45357","severity":2,"message":"45358","line":1113,"column":56,"nodeType":"45359","messageId":"45360","endLine":1113,"endColumn":59,"suggestions":"48251"},{"ruleId":"45357","severity":2,"message":"45358","line":1138,"column":45,"nodeType":"45359","messageId":"45360","endLine":1138,"endColumn":48,"suggestions":"48252"},{"ruleId":"45357","severity":2,"message":"45358","line":1199,"column":43,"nodeType":"45359","messageId":"45360","endLine":1199,"endColumn":46,"suggestions":"48253"},{"ruleId":"45357","severity":2,"message":"45358","line":1247,"column":45,"nodeType":"45359","messageId":"45360","endLine":1247,"endColumn":48,"suggestions":"48254"},{"ruleId":"45357","severity":2,"message":"45358","line":1266,"column":43,"nodeType":"45359","messageId":"45360","endLine":1266,"endColumn":46,"suggestions":"48255"},{"ruleId":"45357","severity":2,"message":"45358","line":1320,"column":45,"nodeType":"45359","messageId":"45360","endLine":1320,"endColumn":48,"suggestions":"48256"},{"ruleId":"45357","severity":2,"message":"45358","line":1369,"column":45,"nodeType":"45359","messageId":"45360","endLine":1369,"endColumn":48,"suggestions":"48257"},{"ruleId":"45357","severity":2,"message":"45358","line":1397,"column":43,"nodeType":"45359","messageId":"45360","endLine":1397,"endColumn":46,"suggestions":"48258"},{"ruleId":"45357","severity":2,"message":"45358","line":1434,"column":43,"nodeType":"45359","messageId":"45360","endLine":1434,"endColumn":46,"suggestions":"48259"},{"ruleId":"45357","severity":2,"message":"45358","line":1464,"column":43,"nodeType":"45359","messageId":"45360","endLine":1464,"endColumn":46,"suggestions":"48260"},{"ruleId":"45357","severity":2,"message":"45358","line":1488,"column":43,"nodeType":"45359","messageId":"45360","endLine":1488,"endColumn":46,"suggestions":"48261"},{"ruleId":"45357","severity":2,"message":"45358","line":1515,"column":90,"nodeType":"45359","messageId":"45360","endLine":1515,"endColumn":93,"suggestions":"48262"},{"ruleId":"45357","severity":2,"message":"45358","line":1527,"column":43,"nodeType":"45359","messageId":"45360","endLine":1527,"endColumn":46,"suggestions":"48263"},{"ruleId":"45357","severity":2,"message":"45358","line":1546,"column":40,"nodeType":"45359","messageId":"45360","endLine":1546,"endColumn":43,"suggestions":"48264"},{"ruleId":"45357","severity":2,"message":"45358","line":1551,"column":43,"nodeType":"45359","messageId":"45360","endLine":1551,"endColumn":46,"suggestions":"48265"},{"ruleId":"45357","severity":2,"message":"45358","line":1579,"column":43,"nodeType":"45359","messageId":"45360","endLine":1579,"endColumn":46,"suggestions":"48266"},{"ruleId":"45357","severity":2,"message":"45358","line":1598,"column":43,"nodeType":"45359","messageId":"45360","endLine":1598,"endColumn":46,"suggestions":"48267"},{"ruleId":"45357","severity":2,"message":"45358","line":1599,"column":46,"nodeType":"45359","messageId":"45360","endLine":1599,"endColumn":49,"suggestions":"48268"},{"ruleId":"45357","severity":2,"message":"45358","line":1621,"column":43,"nodeType":"45359","messageId":"45360","endLine":1621,"endColumn":46,"suggestions":"48269"},{"ruleId":"45357","severity":2,"message":"45358","line":1622,"column":46,"nodeType":"45359","messageId":"45360","endLine":1622,"endColumn":49,"suggestions":"48270"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":24,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":27,"suggestions":"48271"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":15,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":18,"suggestions":"48272"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":17,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":20,"suggestions":"48273"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":34,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":37,"suggestions":"48274"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":48,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":51,"suggestions":"48275"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":46,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":49,"suggestions":"48276"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":46,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":49,"suggestions":"48277"},{"ruleId":"45357","severity":2,"message":"45358","line":78,"column":46,"nodeType":"45359","messageId":"45360","endLine":78,"endColumn":49,"suggestions":"48278"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":46,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":49,"suggestions":"48279"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":49,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":52,"suggestions":"48280"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":47,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":50,"suggestions":"48281"},{"ruleId":"45357","severity":2,"message":"45358","line":216,"column":17,"nodeType":"45359","messageId":"45360","endLine":216,"endColumn":20,"suggestions":"48282"},{"ruleId":"45357","severity":2,"message":"45358","line":226,"column":38,"nodeType":"45359","messageId":"45360","endLine":226,"endColumn":41,"suggestions":"48283"},{"ruleId":"45357","severity":2,"message":"45358","line":229,"column":18,"nodeType":"45359","messageId":"45360","endLine":229,"endColumn":21,"suggestions":"48284"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":61,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":64,"suggestions":"48285"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":16,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":19,"suggestions":"48286"},{"ruleId":"45357","severity":2,"message":"45358","line":551,"column":18,"nodeType":"45359","messageId":"45360","endLine":551,"endColumn":21,"suggestions":"48287"},{"ruleId":"45357","severity":2,"message":"45358","line":569,"column":18,"nodeType":"45359","messageId":"45360","endLine":569,"endColumn":21,"suggestions":"48288"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":22,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":25,"suggestions":"48289"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":43,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":46,"suggestions":"48290"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":46,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":49,"suggestions":"48291"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":46,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":49,"suggestions":"48292"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":46,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":49,"suggestions":"48293"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":17,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":20,"suggestions":"48294"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":34,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":37,"suggestions":"48295"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":48,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":51,"suggestions":"48296"},{"ruleId":"45357","severity":2,"message":"45358","line":183,"column":46,"nodeType":"45359","messageId":"45360","endLine":183,"endColumn":49,"suggestions":"48297"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":9,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":12,"suggestions":"48298"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":9,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":12,"suggestions":"48299"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":9,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":12,"suggestions":"48300"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":9,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":12,"suggestions":"48301"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":14,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":17,"suggestions":"48302"},{"ruleId":"45357","severity":2,"message":"45358","line":13,"column":12,"nodeType":"45359","messageId":"45360","endLine":13,"endColumn":15,"suggestions":"48303"},{"ruleId":"45357","severity":2,"message":"45358","line":14,"column":29,"nodeType":"45359","messageId":"45360","endLine":14,"endColumn":32,"suggestions":"48304"},{"ruleId":"45357","severity":2,"message":"45358","line":19,"column":75,"nodeType":"45359","messageId":"45360","endLine":19,"endColumn":78,"suggestions":"48305"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":75,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":78,"suggestions":"48306"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":15,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":18,"suggestions":"48307"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":20,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":23,"suggestions":"48308"},{"ruleId":"45357","severity":2,"message":"45358","line":70,"column":80,"nodeType":"45359","messageId":"45360","endLine":70,"endColumn":83,"suggestions":"48309"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":75,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":78,"suggestions":"48310"},{"ruleId":"45357","severity":2,"message":"45358","line":10,"column":46,"nodeType":"45359","messageId":"45360","endLine":10,"endColumn":49,"suggestions":"48311"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":11,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":14,"suggestions":"48312"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":43,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":46,"suggestions":"48313"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":10,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":13,"suggestions":"48314"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":43,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":46,"suggestions":"48315"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":10,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":13,"suggestions":"48316"},{"ruleId":"45357","severity":2,"message":"45358","line":150,"column":43,"nodeType":"45359","messageId":"45360","endLine":150,"endColumn":46,"suggestions":"48317"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":11,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":14,"suggestions":"48318"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":8,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":11,"suggestions":"48319"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":39,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":42,"suggestions":"48320"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":35,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":38,"suggestions":"48321"},{"ruleId":"45357","severity":2,"message":"45358","line":157,"column":35,"nodeType":"45359","messageId":"45360","endLine":157,"endColumn":38,"suggestions":"48322"},{"ruleId":"45357","severity":2,"message":"45358","line":194,"column":22,"nodeType":"45359","messageId":"45360","endLine":194,"endColumn":25,"suggestions":"48323"},{"ruleId":"45357","severity":2,"message":"45358","line":226,"column":26,"nodeType":"45359","messageId":"45360","endLine":226,"endColumn":29,"suggestions":"48324"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":26,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":29,"suggestions":"48325"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":47,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":50,"suggestions":"48326"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":43,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":46,"suggestions":"48327"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":42,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":45,"suggestions":"48328"},{"ruleId":"45357","severity":2,"message":"45358","line":117,"column":40,"nodeType":"45359","messageId":"45360","endLine":117,"endColumn":43,"suggestions":"48329"},{"ruleId":"45357","severity":2,"message":"45358","line":21,"column":35,"nodeType":"45359","messageId":"45360","endLine":21,"endColumn":38,"suggestions":"48330"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":35,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":38,"suggestions":"48331"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":30,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":33,"suggestions":"48332"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":30,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":33,"suggestions":"48333"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":43,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":46,"suggestions":"48334"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":65,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":68,"suggestions":"48335"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":59,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":62,"suggestions":"48336"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":61,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":64,"suggestions":"48337"},{"ruleId":"45357","severity":2,"message":"45358","line":143,"column":43,"nodeType":"45359","messageId":"45360","endLine":143,"endColumn":46,"suggestions":"48338"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":57,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":60,"suggestions":"48339"},{"ruleId":"45357","severity":2,"message":"45358","line":176,"column":61,"nodeType":"45359","messageId":"45360","endLine":176,"endColumn":64,"suggestions":"48340"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":37,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":40,"suggestions":"48341"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":28,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":31,"suggestions":"48342"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":10,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":13,"suggestions":"48343"},{"ruleId":"45357","severity":2,"message":"45358","line":142,"column":10,"nodeType":"45359","messageId":"45360","endLine":142,"endColumn":13,"suggestions":"48344"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":19,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":22,"suggestions":"48345"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":22,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":25,"suggestions":"48346"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":32,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":35,"suggestions":"48347"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":60,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":63,"suggestions":"48348"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":46,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":49,"suggestions":"48349"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":27,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":30,"suggestions":"48350"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":24,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":27,"suggestions":"48351"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":25,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":28,"suggestions":"48352"},{"ruleId":"45357","severity":2,"message":"45358","line":77,"column":25,"nodeType":"45359","messageId":"45360","endLine":77,"endColumn":28,"suggestions":"48353"},{"ruleId":"45357","severity":2,"message":"45358","line":78,"column":36,"nodeType":"45359","messageId":"45360","endLine":78,"endColumn":39,"suggestions":"48354"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":22,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":25,"suggestions":"48355"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":28,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":31,"suggestions":"48356"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":28,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":31,"suggestions":"48357"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":32,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":35,"suggestions":"48358"},{"ruleId":"45357","severity":2,"message":"45358","line":406,"column":31,"nodeType":"45359","messageId":"45360","endLine":406,"endColumn":34,"suggestions":"48359"},{"ruleId":"45357","severity":2,"message":"45358","line":407,"column":31,"nodeType":"45359","messageId":"45360","endLine":407,"endColumn":34,"suggestions":"48360"},{"ruleId":"45357","severity":2,"message":"45358","line":408,"column":14,"nodeType":"45359","messageId":"45360","endLine":408,"endColumn":17,"suggestions":"48361"},{"ruleId":"45357","severity":2,"message":"45358","line":408,"column":40,"nodeType":"45359","messageId":"45360","endLine":408,"endColumn":43,"suggestions":"48362"},{"ruleId":"45357","severity":2,"message":"45358","line":409,"column":14,"nodeType":"45359","messageId":"45360","endLine":409,"endColumn":17,"suggestions":"48363"},{"ruleId":"45357","severity":2,"message":"45358","line":410,"column":20,"nodeType":"45359","messageId":"45360","endLine":410,"endColumn":23,"suggestions":"48364"},{"ruleId":"45357","severity":2,"message":"45358","line":413,"column":31,"nodeType":"45359","messageId":"45360","endLine":413,"endColumn":34,"suggestions":"48365"},{"ruleId":"45357","severity":2,"message":"45358","line":414,"column":32,"nodeType":"45359","messageId":"45360","endLine":414,"endColumn":35,"suggestions":"48366"},{"ruleId":"45357","severity":2,"message":"45358","line":414,"column":70,"nodeType":"45359","messageId":"45360","endLine":414,"endColumn":73,"suggestions":"48367"},{"ruleId":"45357","severity":2,"message":"45358","line":415,"column":32,"nodeType":"45359","messageId":"45360","endLine":415,"endColumn":35,"suggestions":"48368"},{"ruleId":"45357","severity":2,"message":"45358","line":415,"column":46,"nodeType":"45359","messageId":"45360","endLine":415,"endColumn":49,"suggestions":"48369"},{"ruleId":"45357","severity":2,"message":"45358","line":416,"column":31,"nodeType":"45359","messageId":"45360","endLine":416,"endColumn":34,"suggestions":"48370"},{"ruleId":"45357","severity":2,"message":"45358","line":417,"column":31,"nodeType":"45359","messageId":"45360","endLine":417,"endColumn":34,"suggestions":"48371"},{"ruleId":"45357","severity":2,"message":"45358","line":243,"column":63,"nodeType":"45359","messageId":"45360","endLine":243,"endColumn":66,"suggestions":"48372"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":47,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":50,"suggestions":"48373"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":47,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":50,"suggestions":"48374"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":34,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":37,"suggestions":"48375"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":47,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":50,"suggestions":"48376"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":47,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":50,"suggestions":"48377"},{"ruleId":"45357","severity":2,"message":"45358","line":137,"column":34,"nodeType":"45359","messageId":"45360","endLine":137,"endColumn":37,"suggestions":"48378"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":48,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":51,"suggestions":"48379"},{"ruleId":"45357","severity":2,"message":"45358","line":159,"column":48,"nodeType":"45359","messageId":"45360","endLine":159,"endColumn":51,"suggestions":"48380"},{"ruleId":"45357","severity":2,"message":"45358","line":176,"column":45,"nodeType":"45359","messageId":"45360","endLine":176,"endColumn":48,"suggestions":"48381"},{"ruleId":"45357","severity":2,"message":"45358","line":383,"column":32,"nodeType":"45359","messageId":"45360","endLine":383,"endColumn":35,"suggestions":"48382"},{"ruleId":"45357","severity":2,"message":"45358","line":13,"column":15,"nodeType":"45359","messageId":"45360","endLine":13,"endColumn":18,"suggestions":"48383"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":15,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":18,"suggestions":"48384"},{"ruleId":"45357","severity":2,"message":"45358","line":32,"column":15,"nodeType":"45359","messageId":"45360","endLine":32,"endColumn":18,"suggestions":"48385"},{"ruleId":"45357","severity":2,"message":"45358","line":9,"column":75,"nodeType":"45359","messageId":"45360","endLine":9,"endColumn":78,"suggestions":"48386"},{"ruleId":"45357","severity":2,"message":"45358","line":241,"column":48,"nodeType":"45359","messageId":"45360","endLine":241,"endColumn":51,"suggestions":"48387"},{"ruleId":"45357","severity":2,"message":"45358","line":271,"column":48,"nodeType":"45359","messageId":"45360","endLine":271,"endColumn":51,"suggestions":"48388"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":25,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":28,"suggestions":"48389"},{"ruleId":"45357","severity":2,"message":"45358","line":25,"column":21,"nodeType":"45359","messageId":"45360","endLine":25,"endColumn":24,"suggestions":"48390"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":77,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":80,"suggestions":"48391"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":61,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":64,"suggestions":"48392"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":77,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":80,"suggestions":"48393"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":61,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":64,"suggestions":"48394"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":77,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":80,"suggestions":"48395"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":21,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":24,"suggestions":"48396"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":39,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":42,"suggestions":"48397"},{"ruleId":"45357","severity":2,"message":"45358","line":144,"column":39,"nodeType":"45359","messageId":"45360","endLine":144,"endColumn":42,"suggestions":"48398"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":39,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":42,"suggestions":"48399"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":67,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":70,"suggestions":"48400"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":66,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":69,"suggestions":"48401"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":56,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":59,"suggestions":"48402"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":43,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":46,"suggestions":"48403"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":43,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":46,"suggestions":"48404"},{"ruleId":"45357","severity":2,"message":"45358","line":186,"column":43,"nodeType":"45359","messageId":"45360","endLine":186,"endColumn":46,"suggestions":"48405"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":43,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":46,"suggestions":"48406"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":43,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":46,"suggestions":"48407"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":35,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":38,"suggestions":"48408"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":43,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":46,"suggestions":"48409"},{"ruleId":"45357","severity":2,"message":"45358","line":219,"column":43,"nodeType":"45359","messageId":"45360","endLine":219,"endColumn":46,"suggestions":"48410"},{"ruleId":"45357","severity":2,"message":"45358","line":248,"column":43,"nodeType":"45359","messageId":"45360","endLine":248,"endColumn":46,"suggestions":"48411"},{"ruleId":"45357","severity":2,"message":"45358","line":286,"column":43,"nodeType":"45359","messageId":"45360","endLine":286,"endColumn":46,"suggestions":"48412"},{"ruleId":"45357","severity":2,"message":"45358","line":324,"column":43,"nodeType":"45359","messageId":"45360","endLine":324,"endColumn":46,"suggestions":"48413"},{"ruleId":"45357","severity":2,"message":"45358","line":348,"column":43,"nodeType":"45359","messageId":"45360","endLine":348,"endColumn":46,"suggestions":"48414"},{"ruleId":"45357","severity":2,"message":"45358","line":377,"column":43,"nodeType":"45359","messageId":"45360","endLine":377,"endColumn":46,"suggestions":"48415"},{"ruleId":"45357","severity":2,"message":"45358","line":419,"column":43,"nodeType":"45359","messageId":"45360","endLine":419,"endColumn":46,"suggestions":"48416"},{"ruleId":"45357","severity":2,"message":"45358","line":437,"column":43,"nodeType":"45359","messageId":"45360","endLine":437,"endColumn":46,"suggestions":"48417"},{"ruleId":"45357","severity":2,"message":"45358","line":458,"column":43,"nodeType":"45359","messageId":"45360","endLine":458,"endColumn":46,"suggestions":"48418"},{"ruleId":"45357","severity":2,"message":"45358","line":475,"column":43,"nodeType":"45359","messageId":"45360","endLine":475,"endColumn":46,"suggestions":"48419"},{"ruleId":"45357","severity":2,"message":"45358","line":516,"column":59,"nodeType":"45359","messageId":"45360","endLine":516,"endColumn":62,"suggestions":"48420"},{"ruleId":"45357","severity":2,"message":"45358","line":518,"column":59,"nodeType":"45359","messageId":"45360","endLine":518,"endColumn":62,"suggestions":"48421"},{"ruleId":"45357","severity":2,"message":"45358","line":539,"column":43,"nodeType":"45359","messageId":"45360","endLine":539,"endColumn":46,"suggestions":"48422"},{"ruleId":"45357","severity":2,"message":"45358","line":570,"column":43,"nodeType":"45359","messageId":"45360","endLine":570,"endColumn":46,"suggestions":"48423"},{"ruleId":"45357","severity":2,"message":"45358","line":601,"column":55,"nodeType":"45359","messageId":"45360","endLine":601,"endColumn":58,"suggestions":"48424"},{"ruleId":"45357","severity":2,"message":"45358","line":602,"column":51,"nodeType":"45359","messageId":"45360","endLine":602,"endColumn":54,"suggestions":"48425"},{"ruleId":"45357","severity":2,"message":"45358","line":641,"column":48,"nodeType":"45359","messageId":"45360","endLine":641,"endColumn":51,"suggestions":"48426"},{"ruleId":"45357","severity":2,"message":"45358","line":642,"column":50,"nodeType":"45359","messageId":"45360","endLine":642,"endColumn":53,"suggestions":"48427"},{"ruleId":"45357","severity":2,"message":"45358","line":658,"column":67,"nodeType":"45359","messageId":"45360","endLine":658,"endColumn":70,"suggestions":"48428"},{"ruleId":"45357","severity":2,"message":"45358","line":670,"column":43,"nodeType":"45359","messageId":"45360","endLine":670,"endColumn":46,"suggestions":"48429"},{"ruleId":"45357","severity":2,"message":"45358","line":691,"column":43,"nodeType":"45359","messageId":"45360","endLine":691,"endColumn":46,"suggestions":"48430"},{"ruleId":"45357","severity":2,"message":"45358","line":713,"column":43,"nodeType":"45359","messageId":"45360","endLine":713,"endColumn":46,"suggestions":"48431"},{"ruleId":"45357","severity":2,"message":"45358","line":733,"column":43,"nodeType":"45359","messageId":"45360","endLine":733,"endColumn":46,"suggestions":"48432"},{"ruleId":"45357","severity":2,"message":"45358","line":750,"column":43,"nodeType":"45359","messageId":"45360","endLine":750,"endColumn":46,"suggestions":"48433"},{"ruleId":"45357","severity":2,"message":"45358","line":780,"column":53,"nodeType":"45359","messageId":"45360","endLine":780,"endColumn":56,"suggestions":"48434"},{"ruleId":"45357","severity":2,"message":"45358","line":796,"column":55,"nodeType":"45359","messageId":"45360","endLine":796,"endColumn":58,"suggestions":"48435"},{"ruleId":"45357","severity":2,"message":"45358","line":819,"column":43,"nodeType":"45359","messageId":"45360","endLine":819,"endColumn":46,"suggestions":"48436"},{"ruleId":"45357","severity":2,"message":"45358","line":843,"column":43,"nodeType":"45359","messageId":"45360","endLine":843,"endColumn":46,"suggestions":"48437"},{"ruleId":"45357","severity":2,"message":"45358","line":873,"column":43,"nodeType":"45359","messageId":"45360","endLine":873,"endColumn":46,"suggestions":"48438"},{"ruleId":"45357","severity":2,"message":"45358","line":905,"column":43,"nodeType":"45359","messageId":"45360","endLine":905,"endColumn":46,"suggestions":"48439"},{"ruleId":"45357","severity":2,"message":"45358","line":970,"column":43,"nodeType":"45359","messageId":"45360","endLine":970,"endColumn":46,"suggestions":"48440"},{"ruleId":"45357","severity":2,"message":"45358","line":1041,"column":43,"nodeType":"45359","messageId":"45360","endLine":1041,"endColumn":46,"suggestions":"48441"},{"ruleId":"45357","severity":2,"message":"45358","line":1076,"column":43,"nodeType":"45359","messageId":"45360","endLine":1076,"endColumn":46,"suggestions":"48442"},{"ruleId":"45357","severity":2,"message":"45358","line":1130,"column":43,"nodeType":"45359","messageId":"45360","endLine":1130,"endColumn":46,"suggestions":"48443"},{"ruleId":"45357","severity":2,"message":"45358","line":1197,"column":43,"nodeType":"45359","messageId":"45360","endLine":1197,"endColumn":46,"suggestions":"48444"},{"ruleId":"45357","severity":2,"message":"45358","line":1228,"column":43,"nodeType":"45359","messageId":"45360","endLine":1228,"endColumn":46,"suggestions":"48445"},{"ruleId":"45357","severity":2,"message":"45358","line":1246,"column":43,"nodeType":"45359","messageId":"45360","endLine":1246,"endColumn":46,"suggestions":"48446"},{"ruleId":"45357","severity":2,"message":"45358","line":1265,"column":43,"nodeType":"45359","messageId":"45360","endLine":1265,"endColumn":46,"suggestions":"48447"},{"ruleId":"45357","severity":2,"message":"45358","line":1285,"column":43,"nodeType":"45359","messageId":"45360","endLine":1285,"endColumn":46,"suggestions":"48448"},{"ruleId":"45357","severity":2,"message":"45358","line":1316,"column":43,"nodeType":"45359","messageId":"45360","endLine":1316,"endColumn":46,"suggestions":"48449"},{"ruleId":"45357","severity":2,"message":"45358","line":1357,"column":43,"nodeType":"45359","messageId":"45360","endLine":1357,"endColumn":46,"suggestions":"48450"},{"ruleId":"45357","severity":2,"message":"45358","line":1395,"column":43,"nodeType":"45359","messageId":"45360","endLine":1395,"endColumn":46,"suggestions":"48451"},{"ruleId":"45357","severity":2,"message":"45358","line":1432,"column":43,"nodeType":"45359","messageId":"45360","endLine":1432,"endColumn":46,"suggestions":"48452"},{"ruleId":"45357","severity":2,"message":"45358","line":1498,"column":43,"nodeType":"45359","messageId":"45360","endLine":1498,"endColumn":46,"suggestions":"48453"},{"ruleId":"45357","severity":2,"message":"45358","line":1552,"column":43,"nodeType":"45359","messageId":"45360","endLine":1552,"endColumn":46,"suggestions":"48454"},{"ruleId":"45357","severity":2,"message":"45358","line":1598,"column":43,"nodeType":"45359","messageId":"45360","endLine":1598,"endColumn":46,"suggestions":"48455"},{"ruleId":"45357","severity":2,"message":"45358","line":1639,"column":43,"nodeType":"45359","messageId":"45360","endLine":1639,"endColumn":46,"suggestions":"48456"},{"ruleId":"45357","severity":2,"message":"45358","line":1671,"column":43,"nodeType":"45359","messageId":"45360","endLine":1671,"endColumn":46,"suggestions":"48457"},{"ruleId":"45357","severity":2,"message":"45358","line":1694,"column":43,"nodeType":"45359","messageId":"45360","endLine":1694,"endColumn":46,"suggestions":"48458"},{"ruleId":"45357","severity":2,"message":"45358","line":1729,"column":43,"nodeType":"45359","messageId":"45360","endLine":1729,"endColumn":46,"suggestions":"48459"},{"ruleId":"45357","severity":2,"message":"45358","line":1778,"column":43,"nodeType":"45359","messageId":"45360","endLine":1778,"endColumn":46,"suggestions":"48460"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":43,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":46,"suggestions":"48461"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":43,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":46,"suggestions":"48462"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":27,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":30,"suggestions":"48463"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":43,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":46,"suggestions":"48464"},{"ruleId":"45357","severity":2,"message":"45358","line":141,"column":43,"nodeType":"45359","messageId":"45360","endLine":141,"endColumn":46,"suggestions":"48465"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":52,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":55,"suggestions":"48466"},{"ruleId":"45357","severity":2,"message":"45358","line":170,"column":52,"nodeType":"45359","messageId":"45360","endLine":170,"endColumn":55,"suggestions":"48467"},{"ruleId":"45357","severity":2,"message":"45358","line":186,"column":52,"nodeType":"45359","messageId":"45360","endLine":186,"endColumn":55,"suggestions":"48468"},{"ruleId":"45357","severity":2,"message":"45358","line":200,"column":52,"nodeType":"45359","messageId":"45360","endLine":200,"endColumn":55,"suggestions":"48469"},{"ruleId":"45357","severity":2,"message":"45358","line":66,"column":43,"nodeType":"45359","messageId":"45360","endLine":66,"endColumn":46,"suggestions":"48470"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":53,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":56,"suggestions":"48471"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":49,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":52,"suggestions":"48472"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":43,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":46,"suggestions":"48473"},{"ruleId":"45357","severity":2,"message":"45358","line":138,"column":43,"nodeType":"45359","messageId":"45360","endLine":138,"endColumn":46,"suggestions":"48474"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":43,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":46,"suggestions":"48475"},{"ruleId":"45357","severity":2,"message":"45358","line":178,"column":43,"nodeType":"45359","messageId":"45360","endLine":178,"endColumn":46,"suggestions":"48476"},{"ruleId":"45357","severity":2,"message":"45358","line":197,"column":43,"nodeType":"45359","messageId":"45360","endLine":197,"endColumn":46,"suggestions":"48477"},{"ruleId":"45357","severity":2,"message":"45358","line":217,"column":43,"nodeType":"45359","messageId":"45360","endLine":217,"endColumn":46,"suggestions":"48478"},{"ruleId":"45357","severity":2,"message":"45358","line":238,"column":43,"nodeType":"45359","messageId":"45360","endLine":238,"endColumn":46,"suggestions":"48479"},{"ruleId":"45357","severity":2,"message":"45358","line":258,"column":43,"nodeType":"45359","messageId":"45360","endLine":258,"endColumn":46,"suggestions":"48480"},{"ruleId":"45357","severity":2,"message":"45358","line":295,"column":43,"nodeType":"45359","messageId":"45360","endLine":295,"endColumn":46,"suggestions":"48481"},{"ruleId":"45357","severity":2,"message":"45358","line":329,"column":43,"nodeType":"45359","messageId":"45360","endLine":329,"endColumn":46,"suggestions":"48482"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":39,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":42,"suggestions":"48483"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":34,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":37,"suggestions":"48484"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":45,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":48,"suggestions":"48485"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":38,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":41,"suggestions":"48486"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":38,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":41,"suggestions":"48487"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":38,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":41,"suggestions":"48488"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":38,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":41,"suggestions":"48489"},{"ruleId":"45357","severity":2,"message":"45358","line":243,"column":38,"nodeType":"45359","messageId":"45360","endLine":243,"endColumn":41,"suggestions":"48490"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":8,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":11,"suggestions":"48491"},{"ruleId":"45357","severity":2,"message":"45358","line":182,"column":10,"nodeType":"45359","messageId":"45360","endLine":182,"endColumn":13,"suggestions":"48492"},{"ruleId":"45357","severity":2,"message":"45358","line":235,"column":8,"nodeType":"45359","messageId":"45360","endLine":235,"endColumn":11,"suggestions":"48493"},{"ruleId":"45357","severity":2,"message":"45358","line":302,"column":8,"nodeType":"45359","messageId":"45360","endLine":302,"endColumn":11,"suggestions":"48494"},{"ruleId":"45357","severity":2,"message":"45358","line":379,"column":8,"nodeType":"45359","messageId":"45360","endLine":379,"endColumn":11,"suggestions":"48495"},{"ruleId":"45357","severity":2,"message":"45358","line":462,"column":8,"nodeType":"45359","messageId":"45360","endLine":462,"endColumn":11,"suggestions":"48496"},{"ruleId":"45357","severity":2,"message":"45358","line":141,"column":22,"nodeType":"45359","messageId":"45360","endLine":141,"endColumn":25,"suggestions":"48497"},{"ruleId":"45357","severity":2,"message":"45358","line":151,"column":21,"nodeType":"45359","messageId":"45360","endLine":151,"endColumn":24,"suggestions":"48498"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":89,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":92,"suggestions":"48499"},{"ruleId":"45357","severity":2,"message":"45358","line":171,"column":34,"nodeType":"45359","messageId":"45360","endLine":171,"endColumn":37,"suggestions":"48500"},{"ruleId":"45357","severity":2,"message":"45358","line":194,"column":34,"nodeType":"45359","messageId":"45360","endLine":194,"endColumn":37,"suggestions":"48501"},{"ruleId":"45357","severity":2,"message":"45358","line":194,"column":45,"nodeType":"45359","messageId":"45360","endLine":194,"endColumn":48,"suggestions":"48502"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":34,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":37,"suggestions":"48503"},{"ruleId":"45357","severity":2,"message":"45358","line":423,"column":48,"nodeType":"45359","messageId":"45360","endLine":423,"endColumn":51,"suggestions":"48504"},{"ruleId":"45357","severity":2,"message":"45358","line":470,"column":53,"nodeType":"45359","messageId":"45360","endLine":470,"endColumn":56,"suggestions":"48505"},{"ruleId":"45357","severity":2,"message":"45358","line":476,"column":49,"nodeType":"45359","messageId":"45360","endLine":476,"endColumn":52,"suggestions":"48506"},{"ruleId":"45357","severity":2,"message":"45358","line":517,"column":41,"nodeType":"45359","messageId":"45360","endLine":517,"endColumn":44,"suggestions":"48507"},{"ruleId":"45357","severity":2,"message":"45358","line":49,"column":43,"nodeType":"45359","messageId":"45360","endLine":49,"endColumn":46,"suggestions":"48508"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":45,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":48,"suggestions":"48509"},{"ruleId":"45357","severity":2,"message":"45358","line":259,"column":45,"nodeType":"45359","messageId":"45360","endLine":259,"endColumn":48,"suggestions":"48510"},{"ruleId":"45357","severity":2,"message":"45358","line":296,"column":45,"nodeType":"45359","messageId":"45360","endLine":296,"endColumn":48,"suggestions":"48511"},{"ruleId":"45357","severity":2,"message":"45358","line":17,"column":43,"nodeType":"45359","messageId":"45360","endLine":17,"endColumn":46,"suggestions":"48512"},{"ruleId":"45357","severity":2,"message":"45358","line":18,"column":29,"nodeType":"45359","messageId":"45360","endLine":18,"endColumn":32,"suggestions":"48513"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":33,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":36,"suggestions":"48514"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":49,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":52,"suggestions":"48515"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":30,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":33,"suggestions":"48516"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":46,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":49,"suggestions":"48517"},{"ruleId":"45357","severity":2,"message":"45358","line":24,"column":33,"nodeType":"45359","messageId":"45360","endLine":24,"endColumn":36,"suggestions":"48518"},{"ruleId":"45357","severity":2,"message":"45358","line":27,"column":88,"nodeType":"45359","messageId":"45360","endLine":27,"endColumn":91,"suggestions":"48519"},{"ruleId":"45357","severity":2,"message":"45358","line":143,"column":45,"nodeType":"45359","messageId":"45360","endLine":143,"endColumn":48,"suggestions":"48520"},{"ruleId":"45357","severity":2,"message":"45358","line":166,"column":45,"nodeType":"45359","messageId":"45360","endLine":166,"endColumn":48,"suggestions":"48521"},{"ruleId":"45357","severity":2,"message":"45358","line":146,"column":49,"nodeType":"45359","messageId":"45360","endLine":146,"endColumn":52,"suggestions":"48522"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":49,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":52,"suggestions":"48523"},{"ruleId":"45357","severity":2,"message":"45358","line":175,"column":48,"nodeType":"45359","messageId":"45360","endLine":175,"endColumn":51,"suggestions":"48524"},{"ruleId":"45357","severity":2,"message":"45358","line":181,"column":60,"nodeType":"45359","messageId":"45360","endLine":181,"endColumn":63,"suggestions":"48525"},{"ruleId":"45357","severity":2,"message":"45358","line":190,"column":46,"nodeType":"45359","messageId":"45360","endLine":190,"endColumn":49,"suggestions":"48526"},{"ruleId":"45357","severity":2,"message":"45358","line":210,"column":56,"nodeType":"45359","messageId":"45360","endLine":210,"endColumn":59,"suggestions":"48527"},{"ruleId":"45357","severity":2,"message":"45358","line":232,"column":52,"nodeType":"45359","messageId":"45360","endLine":232,"endColumn":55,"suggestions":"48528"},{"ruleId":"45357","severity":2,"message":"45358","line":268,"column":60,"nodeType":"45359","messageId":"45360","endLine":268,"endColumn":63,"suggestions":"48529"},{"ruleId":"45357","severity":2,"message":"45358","line":372,"column":48,"nodeType":"45359","messageId":"45360","endLine":372,"endColumn":51,"suggestions":"48530"},{"ruleId":"45357","severity":2,"message":"45358","line":422,"column":48,"nodeType":"45359","messageId":"45360","endLine":422,"endColumn":51,"suggestions":"48531"},{"ruleId":"45357","severity":2,"message":"45358","line":443,"column":49,"nodeType":"45359","messageId":"45360","endLine":443,"endColumn":52,"suggestions":"48532"},{"ruleId":"45357","severity":2,"message":"45358","line":455,"column":49,"nodeType":"45359","messageId":"45360","endLine":455,"endColumn":52,"suggestions":"48533"},{"ruleId":"45357","severity":2,"message":"45358","line":493,"column":66,"nodeType":"45359","messageId":"45360","endLine":493,"endColumn":69,"suggestions":"48534"},{"ruleId":"45357","severity":2,"message":"45358","line":539,"column":48,"nodeType":"45359","messageId":"45360","endLine":539,"endColumn":51,"suggestions":"48535"},{"ruleId":"45357","severity":2,"message":"45358","line":562,"column":53,"nodeType":"45359","messageId":"45360","endLine":562,"endColumn":56,"suggestions":"48536"},{"ruleId":"45357","severity":2,"message":"45358","line":590,"column":52,"nodeType":"45359","messageId":"45360","endLine":590,"endColumn":55,"suggestions":"48537"},{"ruleId":"45357","severity":2,"message":"45358","line":618,"column":44,"nodeType":"45359","messageId":"45360","endLine":618,"endColumn":47,"suggestions":"48538"},{"ruleId":"45357","severity":2,"message":"45358","line":632,"column":49,"nodeType":"45359","messageId":"45360","endLine":632,"endColumn":52,"suggestions":"48539"},{"ruleId":"45357","severity":2,"message":"45358","line":638,"column":51,"nodeType":"45359","messageId":"45360","endLine":638,"endColumn":54,"suggestions":"48540"},{"ruleId":"45357","severity":2,"message":"45358","line":717,"column":44,"nodeType":"45359","messageId":"45360","endLine":717,"endColumn":47,"suggestions":"48541"},{"ruleId":"45357","severity":2,"message":"45358","line":738,"column":55,"nodeType":"45359","messageId":"45360","endLine":738,"endColumn":58,"suggestions":"48542"},{"ruleId":"45357","severity":2,"message":"45358","line":775,"column":61,"nodeType":"45359","messageId":"45360","endLine":775,"endColumn":64,"suggestions":"48543"},{"ruleId":"45357","severity":2,"message":"45358","line":791,"column":53,"nodeType":"45359","messageId":"45360","endLine":791,"endColumn":56,"suggestions":"48544"},{"ruleId":"45357","severity":2,"message":"45358","line":154,"column":84,"nodeType":"45359","messageId":"45360","endLine":154,"endColumn":87,"suggestions":"48545"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":30,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":33,"suggestions":"48546"},{"ruleId":"45357","severity":2,"message":"45358","line":49,"column":18,"nodeType":"45359","messageId":"45360","endLine":49,"endColumn":21,"suggestions":"48547"},{"ruleId":"45357","severity":2,"message":"45358","line":49,"column":39,"nodeType":"45359","messageId":"45360","endLine":49,"endColumn":42,"suggestions":"48548"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":26,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":29,"suggestions":"48549"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":53,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":56,"suggestions":"48550"},{"ruleId":"45357","severity":2,"message":"45358","line":165,"column":58,"nodeType":"45359","messageId":"45360","endLine":165,"endColumn":61,"suggestions":"48551"},{"ruleId":"45357","severity":2,"message":"45358","line":167,"column":72,"nodeType":"45359","messageId":"45360","endLine":167,"endColumn":75,"suggestions":"48552"},{"ruleId":"45357","severity":2,"message":"45358","line":168,"column":29,"nodeType":"45359","messageId":"45360","endLine":168,"endColumn":32,"suggestions":"48553"},{"ruleId":"45357","severity":2,"message":"45358","line":169,"column":29,"nodeType":"45359","messageId":"45360","endLine":169,"endColumn":32,"suggestions":"48554"},{"ruleId":"45357","severity":2,"message":"45358","line":170,"column":29,"nodeType":"45359","messageId":"45360","endLine":170,"endColumn":32,"suggestions":"48555"},{"ruleId":"45357","severity":2,"message":"45358","line":193,"column":53,"nodeType":"45359","messageId":"45360","endLine":193,"endColumn":56,"suggestions":"48556"},{"ruleId":"45357","severity":2,"message":"45358","line":203,"column":72,"nodeType":"45359","messageId":"45360","endLine":203,"endColumn":75,"suggestions":"48557"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":29,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":32,"suggestions":"48558"},{"ruleId":"45357","severity":2,"message":"45358","line":205,"column":29,"nodeType":"45359","messageId":"45360","endLine":205,"endColumn":32,"suggestions":"48559"},{"ruleId":"45357","severity":2,"message":"45358","line":206,"column":29,"nodeType":"45359","messageId":"45360","endLine":206,"endColumn":32,"suggestions":"48560"},{"ruleId":"45357","severity":2,"message":"45358","line":226,"column":29,"nodeType":"45359","messageId":"45360","endLine":226,"endColumn":32,"suggestions":"48561"},{"ruleId":"45357","severity":2,"message":"45358","line":227,"column":29,"nodeType":"45359","messageId":"45360","endLine":227,"endColumn":32,"suggestions":"48562"},{"ruleId":"45357","severity":2,"message":"45358","line":241,"column":29,"nodeType":"45359","messageId":"45360","endLine":241,"endColumn":32,"suggestions":"48563"},{"ruleId":"45357","severity":2,"message":"45358","line":263,"column":29,"nodeType":"45359","messageId":"45360","endLine":263,"endColumn":32,"suggestions":"48564"},{"ruleId":"45357","severity":2,"message":"45358","line":286,"column":18,"nodeType":"45359","messageId":"45360","endLine":286,"endColumn":21,"suggestions":"48565"},{"ruleId":"45357","severity":2,"message":"45358","line":307,"column":27,"nodeType":"45359","messageId":"45360","endLine":307,"endColumn":30,"suggestions":"48566"},{"ruleId":"45357","severity":2,"message":"45358","line":340,"column":29,"nodeType":"45359","messageId":"45360","endLine":340,"endColumn":32,"suggestions":"48567"},{"ruleId":"45357","severity":2,"message":"45358","line":341,"column":29,"nodeType":"45359","messageId":"45360","endLine":341,"endColumn":32,"suggestions":"48568"},{"ruleId":"45357","severity":2,"message":"45358","line":342,"column":29,"nodeType":"45359","messageId":"45360","endLine":342,"endColumn":32,"suggestions":"48569"},{"ruleId":"45357","severity":2,"message":"45358","line":361,"column":58,"nodeType":"45359","messageId":"45360","endLine":361,"endColumn":61,"suggestions":"48570"},{"ruleId":"45357","severity":2,"message":"45358","line":365,"column":72,"nodeType":"45359","messageId":"45360","endLine":365,"endColumn":75,"suggestions":"48571"},{"ruleId":"45357","severity":2,"message":"45358","line":367,"column":29,"nodeType":"45359","messageId":"45360","endLine":367,"endColumn":32,"suggestions":"48572"},{"ruleId":"45357","severity":2,"message":"45358","line":368,"column":29,"nodeType":"45359","messageId":"45360","endLine":368,"endColumn":32,"suggestions":"48573"},{"ruleId":"45357","severity":2,"message":"45358","line":393,"column":71,"nodeType":"45359","messageId":"45360","endLine":393,"endColumn":74,"suggestions":"48574"},{"ruleId":"45357","severity":2,"message":"45358","line":395,"column":90,"nodeType":"45359","messageId":"45360","endLine":395,"endColumn":93,"suggestions":"48575"},{"ruleId":"45357","severity":2,"message":"45358","line":399,"column":92,"nodeType":"45359","messageId":"45360","endLine":399,"endColumn":95,"suggestions":"48576"},{"ruleId":"45357","severity":2,"message":"45358","line":401,"column":42,"nodeType":"45359","messageId":"45360","endLine":401,"endColumn":45,"suggestions":"48577"},{"ruleId":"45357","severity":2,"message":"45358","line":403,"column":85,"nodeType":"45359","messageId":"45360","endLine":403,"endColumn":88,"suggestions":"48578"},{"ruleId":"45357","severity":2,"message":"45358","line":406,"column":29,"nodeType":"45359","messageId":"45360","endLine":406,"endColumn":32,"suggestions":"48579"},{"ruleId":"45357","severity":2,"message":"45358","line":409,"column":27,"nodeType":"45359","messageId":"45360","endLine":409,"endColumn":30,"suggestions":"48580"},{"ruleId":"45357","severity":2,"message":"45358","line":414,"column":84,"nodeType":"45359","messageId":"45360","endLine":414,"endColumn":87,"suggestions":"48581"},{"ruleId":"45357","severity":2,"message":"45358","line":417,"column":28,"nodeType":"45359","messageId":"45360","endLine":417,"endColumn":31,"suggestions":"48582"},{"ruleId":"45357","severity":2,"message":"45358","line":419,"column":92,"nodeType":"45359","messageId":"45360","endLine":419,"endColumn":95,"suggestions":"48583"},{"ruleId":"45357","severity":2,"message":"45358","line":421,"column":42,"nodeType":"45359","messageId":"45360","endLine":421,"endColumn":45,"suggestions":"48584"},{"ruleId":"45357","severity":2,"message":"45358","line":453,"column":84,"nodeType":"45359","messageId":"45360","endLine":453,"endColumn":87,"suggestions":"48585"},{"ruleId":"45357","severity":2,"message":"45358","line":456,"column":41,"nodeType":"45359","messageId":"45360","endLine":456,"endColumn":44,"suggestions":"48586"},{"ruleId":"45357","severity":2,"message":"45358","line":459,"column":78,"nodeType":"45359","messageId":"45360","endLine":459,"endColumn":81,"suggestions":"48587"},{"ruleId":"45357","severity":2,"message":"45358","line":462,"column":29,"nodeType":"45359","messageId":"45360","endLine":462,"endColumn":32,"suggestions":"48588"},{"ruleId":"45357","severity":2,"message":"45358","line":464,"column":86,"nodeType":"45359","messageId":"45360","endLine":464,"endColumn":89,"suggestions":"48589"},{"ruleId":"45357","severity":2,"message":"45358","line":469,"column":77,"nodeType":"45359","messageId":"45360","endLine":469,"endColumn":80,"suggestions":"48590"},{"ruleId":"45357","severity":2,"message":"45358","line":472,"column":28,"nodeType":"45359","messageId":"45360","endLine":472,"endColumn":31,"suggestions":"48591"},{"ruleId":"45357","severity":2,"message":"45358","line":474,"column":85,"nodeType":"45359","messageId":"45360","endLine":474,"endColumn":88,"suggestions":"48592"},{"ruleId":"45357","severity":2,"message":"45358","line":476,"column":42,"nodeType":"45359","messageId":"45360","endLine":476,"endColumn":45,"suggestions":"48593"},{"ruleId":"45357","severity":2,"message":"45358","line":489,"column":77,"nodeType":"45359","messageId":"45360","endLine":489,"endColumn":80,"suggestions":"48594"},{"ruleId":"45357","severity":2,"message":"45358","line":493,"column":78,"nodeType":"45359","messageId":"45360","endLine":493,"endColumn":81,"suggestions":"48595"},{"ruleId":"45357","severity":2,"message":"45358","line":495,"column":28,"nodeType":"45359","messageId":"45360","endLine":495,"endColumn":31,"suggestions":"48596"},{"ruleId":"45357","severity":2,"message":"45358","line":496,"column":28,"nodeType":"45359","messageId":"45360","endLine":496,"endColumn":31,"suggestions":"48597"},{"ruleId":"45357","severity":2,"message":"45358","line":497,"column":28,"nodeType":"45359","messageId":"45360","endLine":497,"endColumn":31,"suggestions":"48598"},{"ruleId":"45357","severity":2,"message":"45358","line":498,"column":28,"nodeType":"45359","messageId":"45360","endLine":498,"endColumn":31,"suggestions":"48599"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":29,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":32,"suggestions":"48600"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":29,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":32,"suggestions":"48601"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":29,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":32,"suggestions":"48602"},{"ruleId":"45357","severity":2,"message":"45358","line":232,"column":46,"nodeType":"45359","messageId":"45360","endLine":232,"endColumn":49,"suggestions":"48603"},{"ruleId":"45357","severity":2,"message":"45358","line":332,"column":38,"nodeType":"45359","messageId":"45360","endLine":332,"endColumn":41,"suggestions":"48604"},{"ruleId":"45357","severity":2,"message":"45358","line":334,"column":48,"nodeType":"45359","messageId":"45360","endLine":334,"endColumn":51,"suggestions":"48605"},{"ruleId":"45357","severity":2,"message":"45358","line":25,"column":44,"nodeType":"45359","messageId":"45360","endLine":25,"endColumn":47,"suggestions":"48606"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":44,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":47,"suggestions":"48607"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":48,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":51,"suggestions":"48608"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":41,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":44,"suggestions":"48609"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":40,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":43,"suggestions":"48610"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":20,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":23,"suggestions":"48611"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":55,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":58,"suggestions":"48612"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":19,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":22,"suggestions":"48613"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":53,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":56,"suggestions":"48614"},{"ruleId":"45357","severity":2,"message":"45358","line":9,"column":32,"nodeType":"45359","messageId":"45360","endLine":9,"endColumn":35,"suggestions":"48615"},{"ruleId":"45357","severity":2,"message":"45358","line":10,"column":32,"nodeType":"45359","messageId":"45360","endLine":10,"endColumn":35,"suggestions":"48616"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":19,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":22,"suggestions":"48617","suppressions":"48618"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":19,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":22,"suggestions":"48619","suppressions":"48620"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":19,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":22,"suggestions":"48621"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":19,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":22,"suggestions":"48622"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":30,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":33,"suggestions":"48623"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":19,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":22,"suggestions":"48624"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":19,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":22,"suggestions":"48625"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":22,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":25,"suggestions":"48626"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":19,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":22,"suggestions":"48627"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":21,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":24,"suggestions":"48628"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":21,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":24,"suggestions":"48629"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":21,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":24,"suggestions":"48630"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":21,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":24,"suggestions":"48631"},{"ruleId":"45357","severity":2,"message":"45358","line":131,"column":21,"nodeType":"45359","messageId":"45360","endLine":131,"endColumn":24,"suggestions":"48632"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":21,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":24,"suggestions":"48633"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":21,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":24,"suggestions":"48634"},{"ruleId":"45357","severity":2,"message":"45358","line":164,"column":21,"nodeType":"45359","messageId":"45360","endLine":164,"endColumn":24,"suggestions":"48635"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":35,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":38,"suggestions":"48636"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":60,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":63,"suggestions":"48637"},{"ruleId":"45357","severity":2,"message":"45358","line":26,"column":79,"nodeType":"45359","messageId":"45360","endLine":26,"endColumn":82,"suggestions":"48638"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":18,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":21,"suggestions":"48639"},{"ruleId":"45357","severity":2,"message":"45358","line":132,"column":18,"nodeType":"45359","messageId":"45360","endLine":132,"endColumn":21,"suggestions":"48640"},{"ruleId":"45357","severity":2,"message":"45358","line":16,"column":62,"nodeType":"45359","messageId":"45360","endLine":16,"endColumn":65,"suggestions":"48641"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":64,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":67,"suggestions":"48642"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":22,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":25,"suggestions":"48643"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":17,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":20,"suggestions":"48644"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":18,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":21,"suggestions":"48645"},{"ruleId":"45357","severity":2,"message":"45358","line":152,"column":18,"nodeType":"45359","messageId":"45360","endLine":152,"endColumn":21,"suggestions":"48646"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":18,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":21,"suggestions":"48647"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":35,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":38,"suggestions":"48648"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":27,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":30,"suggestions":"48649"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":48,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":51,"suggestions":"48650"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":35,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":38,"suggestions":"48651"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":20,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":23,"suggestions":"48652"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":20,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":23,"suggestions":"48653"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":55,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":58,"suggestions":"48654"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":25,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":28,"suggestions":"48655"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":58,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":61,"suggestions":"48656"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":72,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":75,"suggestions":"48657"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":29,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":32,"suggestions":"48658"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":72,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":75,"suggestions":"48659"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":29,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":32,"suggestions":"48660"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":72,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":75,"suggestions":"48661"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":29,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":32,"suggestions":"48662"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":27,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":30,"suggestions":"48663"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":29,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":32,"suggestions":"48664"},{"ruleId":"45357","severity":2,"message":"45358","line":141,"column":29,"nodeType":"45359","messageId":"45360","endLine":141,"endColumn":32,"suggestions":"48665"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":30,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":33,"suggestions":"48666"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":30,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":33,"suggestions":"48667"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":14,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":17,"suggestions":"48668"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":19,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":22,"suggestions":"48669"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":30,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":33,"suggestions":"48670"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":14,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":17,"suggestions":"48671"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":43,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":46,"suggestions":"48672"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":34,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":37,"suggestions":"48673"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":30,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":33,"suggestions":"48674"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":30,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":33,"suggestions":"48675"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":31,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":34,"suggestions":"48676"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":58,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":61,"suggestions":"48677"},{"ruleId":"45357","severity":2,"message":"45358","line":135,"column":30,"nodeType":"45359","messageId":"45360","endLine":135,"endColumn":33,"suggestions":"48678"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":20,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":23,"suggestions":"48679"},{"ruleId":"45357","severity":2,"message":"45358","line":156,"column":47,"nodeType":"45359","messageId":"45360","endLine":156,"endColumn":50,"suggestions":"48680"},{"ruleId":"45357","severity":2,"message":"45358","line":159,"column":30,"nodeType":"45359","messageId":"45360","endLine":159,"endColumn":33,"suggestions":"48681"},{"ruleId":"45357","severity":2,"message":"45358","line":174,"column":34,"nodeType":"45359","messageId":"45360","endLine":174,"endColumn":37,"suggestions":"48682"},{"ruleId":"45357","severity":2,"message":"45358","line":198,"column":30,"nodeType":"45359","messageId":"45360","endLine":198,"endColumn":33,"suggestions":"48683"},{"ruleId":"45357","severity":2,"message":"45358","line":199,"column":30,"nodeType":"45359","messageId":"45360","endLine":199,"endColumn":33,"suggestions":"48684"},{"ruleId":"45357","severity":2,"message":"45358","line":200,"column":34,"nodeType":"45359","messageId":"45360","endLine":200,"endColumn":37,"suggestions":"48685"},{"ruleId":"45357","severity":2,"message":"45358","line":220,"column":30,"nodeType":"45359","messageId":"45360","endLine":220,"endColumn":33,"suggestions":"48686"},{"ruleId":"45357","severity":2,"message":"45358","line":221,"column":30,"nodeType":"45359","messageId":"45360","endLine":221,"endColumn":33,"suggestions":"48687"},{"ruleId":"45357","severity":2,"message":"45358","line":241,"column":30,"nodeType":"45359","messageId":"45360","endLine":241,"endColumn":33,"suggestions":"48688"},{"ruleId":"45357","severity":2,"message":"45358","line":258,"column":30,"nodeType":"45359","messageId":"45360","endLine":258,"endColumn":33,"suggestions":"48689"},{"ruleId":"45357","severity":2,"message":"45358","line":259,"column":30,"nodeType":"45359","messageId":"45360","endLine":259,"endColumn":33,"suggestions":"48690"},{"ruleId":"45357","severity":2,"message":"45358","line":277,"column":30,"nodeType":"45359","messageId":"45360","endLine":277,"endColumn":33,"suggestions":"48691"},{"ruleId":"45357","severity":2,"message":"45358","line":278,"column":30,"nodeType":"45359","messageId":"45360","endLine":278,"endColumn":33,"suggestions":"48692"},{"ruleId":"45357","severity":2,"message":"45358","line":279,"column":34,"nodeType":"45359","messageId":"45360","endLine":279,"endColumn":37,"suggestions":"48693"},{"ruleId":"45357","severity":2,"message":"45358","line":283,"column":19,"nodeType":"45359","messageId":"45360","endLine":283,"endColumn":22,"suggestions":"48694"},{"ruleId":"45357","severity":2,"message":"45358","line":305,"column":30,"nodeType":"45359","messageId":"45360","endLine":305,"endColumn":33,"suggestions":"48695"},{"ruleId":"45357","severity":2,"message":"45358","line":343,"column":30,"nodeType":"45359","messageId":"45360","endLine":343,"endColumn":33,"suggestions":"48696"},{"ruleId":"45357","severity":2,"message":"45358","line":344,"column":30,"nodeType":"45359","messageId":"45360","endLine":344,"endColumn":33,"suggestions":"48697"},{"ruleId":"45357","severity":2,"message":"45358","line":345,"column":30,"nodeType":"45359","messageId":"45360","endLine":345,"endColumn":33,"suggestions":"48698"},{"ruleId":"45357","severity":2,"message":"45358","line":346,"column":14,"nodeType":"45359","messageId":"45360","endLine":346,"endColumn":17,"suggestions":"48699"},{"ruleId":"45357","severity":2,"message":"45358","line":346,"column":39,"nodeType":"45359","messageId":"45360","endLine":346,"endColumn":42,"suggestions":"48700"},{"ruleId":"45357","severity":2,"message":"45358","line":347,"column":14,"nodeType":"45359","messageId":"45360","endLine":347,"endColumn":17,"suggestions":"48701"},{"ruleId":"45357","severity":2,"message":"45358","line":347,"column":39,"nodeType":"45359","messageId":"45360","endLine":347,"endColumn":42,"suggestions":"48702"},{"ruleId":"45357","severity":2,"message":"45358","line":348,"column":14,"nodeType":"45359","messageId":"45360","endLine":348,"endColumn":17,"suggestions":"48703"},{"ruleId":"45357","severity":2,"message":"45358","line":348,"column":39,"nodeType":"45359","messageId":"45360","endLine":348,"endColumn":42,"suggestions":"48704"},{"ruleId":"45357","severity":2,"message":"45358","line":349,"column":30,"nodeType":"45359","messageId":"45360","endLine":349,"endColumn":33,"suggestions":"48705"},{"ruleId":"45357","severity":2,"message":"45358","line":350,"column":31,"nodeType":"45359","messageId":"45360","endLine":350,"endColumn":34,"suggestions":"48706"},{"ruleId":"45357","severity":2,"message":"45358","line":350,"column":45,"nodeType":"45359","messageId":"45360","endLine":350,"endColumn":48,"suggestions":"48707"},{"ruleId":"45357","severity":2,"message":"45358","line":351,"column":30,"nodeType":"45359","messageId":"45360","endLine":351,"endColumn":33,"suggestions":"48708"},{"ruleId":"45357","severity":2,"message":"45358","line":352,"column":30,"nodeType":"45359","messageId":"45360","endLine":352,"endColumn":33,"suggestions":"48709"},{"ruleId":"45357","severity":2,"message":"45358","line":361,"column":9,"nodeType":"45359","messageId":"45360","endLine":361,"endColumn":12,"suggestions":"48710"},{"ruleId":"45357","severity":2,"message":"45358","line":379,"column":9,"nodeType":"45359","messageId":"45360","endLine":379,"endColumn":12,"suggestions":"48711"},{"ruleId":"45357","severity":2,"message":"45358","line":415,"column":30,"nodeType":"45359","messageId":"45360","endLine":415,"endColumn":33,"suggestions":"48712"},{"ruleId":"45357","severity":2,"message":"45358","line":416,"column":31,"nodeType":"45359","messageId":"45360","endLine":416,"endColumn":34,"suggestions":"48713"},{"ruleId":"45357","severity":2,"message":"45358","line":416,"column":49,"nodeType":"45359","messageId":"45360","endLine":416,"endColumn":52,"suggestions":"48714"},{"ruleId":"45357","severity":2,"message":"45358","line":417,"column":30,"nodeType":"45359","messageId":"45360","endLine":417,"endColumn":33,"suggestions":"48715"},{"ruleId":"45357","severity":2,"message":"45358","line":418,"column":30,"nodeType":"45359","messageId":"45360","endLine":418,"endColumn":33,"suggestions":"48716"},{"ruleId":"45357","severity":2,"message":"45358","line":419,"column":30,"nodeType":"45359","messageId":"45360","endLine":419,"endColumn":33,"suggestions":"48717"},{"ruleId":"45357","severity":2,"message":"45358","line":420,"column":14,"nodeType":"45359","messageId":"45360","endLine":420,"endColumn":17,"suggestions":"48718"},{"ruleId":"45357","severity":2,"message":"45358","line":420,"column":39,"nodeType":"45359","messageId":"45360","endLine":420,"endColumn":42,"suggestions":"48719"},{"ruleId":"45357","severity":2,"message":"45358","line":421,"column":30,"nodeType":"45359","messageId":"45360","endLine":421,"endColumn":33,"suggestions":"48720"},{"ruleId":"45357","severity":2,"message":"45358","line":422,"column":30,"nodeType":"45359","messageId":"45360","endLine":422,"endColumn":33,"suggestions":"48721"},{"ruleId":"45357","severity":2,"message":"45358","line":423,"column":30,"nodeType":"45359","messageId":"45360","endLine":423,"endColumn":33,"suggestions":"48722"},{"ruleId":"45357","severity":2,"message":"45358","line":488,"column":30,"nodeType":"45359","messageId":"45360","endLine":488,"endColumn":33,"suggestions":"48723"},{"ruleId":"45357","severity":2,"message":"45358","line":489,"column":34,"nodeType":"45359","messageId":"45360","endLine":489,"endColumn":37,"suggestions":"48724"},{"ruleId":"45357","severity":2,"message":"45358","line":506,"column":30,"nodeType":"45359","messageId":"45360","endLine":506,"endColumn":33,"suggestions":"48725"},{"ruleId":"45357","severity":2,"message":"45358","line":507,"column":30,"nodeType":"45359","messageId":"45360","endLine":507,"endColumn":33,"suggestions":"48726"},{"ruleId":"45357","severity":2,"message":"45358","line":521,"column":30,"nodeType":"45359","messageId":"45360","endLine":521,"endColumn":33,"suggestions":"48727"},{"ruleId":"45357","severity":2,"message":"45358","line":522,"column":30,"nodeType":"45359","messageId":"45360","endLine":522,"endColumn":33,"suggestions":"48728"},{"ruleId":"45357","severity":2,"message":"45358","line":548,"column":30,"nodeType":"45359","messageId":"45360","endLine":548,"endColumn":33,"suggestions":"48729"},{"ruleId":"45357","severity":2,"message":"45358","line":549,"column":30,"nodeType":"45359","messageId":"45360","endLine":549,"endColumn":33,"suggestions":"48730"},{"ruleId":"45357","severity":2,"message":"45358","line":550,"column":30,"nodeType":"45359","messageId":"45360","endLine":550,"endColumn":33,"suggestions":"48731"},{"ruleId":"45357","severity":2,"message":"45358","line":565,"column":30,"nodeType":"45359","messageId":"45360","endLine":565,"endColumn":33,"suggestions":"48732"},{"ruleId":"45357","severity":2,"message":"45358","line":566,"column":40,"nodeType":"45359","messageId":"45360","endLine":566,"endColumn":43,"suggestions":"48733"},{"ruleId":"45357","severity":2,"message":"45358","line":597,"column":33,"nodeType":"45359","messageId":"45360","endLine":597,"endColumn":36,"suggestions":"48734"},{"ruleId":"45357","severity":2,"message":"45358","line":622,"column":33,"nodeType":"45359","messageId":"45360","endLine":622,"endColumn":36,"suggestions":"48735"},{"ruleId":"45357","severity":2,"message":"45358","line":642,"column":33,"nodeType":"45359","messageId":"45360","endLine":642,"endColumn":36,"suggestions":"48736"},{"ruleId":"45357","severity":2,"message":"45358","line":686,"column":9,"nodeType":"45359","messageId":"45360","endLine":686,"endColumn":12,"suggestions":"48737"},{"ruleId":"45357","severity":2,"message":"45358","line":717,"column":9,"nodeType":"45359","messageId":"45360","endLine":717,"endColumn":12,"suggestions":"48738"},{"ruleId":"45357","severity":2,"message":"45358","line":744,"column":9,"nodeType":"45359","messageId":"45360","endLine":744,"endColumn":12,"suggestions":"48739"},{"ruleId":"45357","severity":2,"message":"45358","line":773,"column":9,"nodeType":"45359","messageId":"45360","endLine":773,"endColumn":12,"suggestions":"48740"},{"ruleId":"45357","severity":2,"message":"45358","line":791,"column":9,"nodeType":"45359","messageId":"45360","endLine":791,"endColumn":12,"suggestions":"48741"},{"ruleId":"45357","severity":2,"message":"45358","line":808,"column":9,"nodeType":"45359","messageId":"45360","endLine":808,"endColumn":12,"suggestions":"48742"},{"ruleId":"45357","severity":2,"message":"45358","line":825,"column":9,"nodeType":"45359","messageId":"45360","endLine":825,"endColumn":12,"suggestions":"48743"},{"ruleId":"45357","severity":2,"message":"45358","line":842,"column":9,"nodeType":"45359","messageId":"45360","endLine":842,"endColumn":12,"suggestions":"48744"},{"ruleId":"45357","severity":2,"message":"45358","line":857,"column":9,"nodeType":"45359","messageId":"45360","endLine":857,"endColumn":12,"suggestions":"48745"},{"ruleId":"45357","severity":2,"message":"45358","line":868,"column":9,"nodeType":"45359","messageId":"45360","endLine":868,"endColumn":12,"suggestions":"48746"},{"ruleId":"45357","severity":2,"message":"45358","line":879,"column":9,"nodeType":"45359","messageId":"45360","endLine":879,"endColumn":12,"suggestions":"48747"},{"ruleId":"45357","severity":2,"message":"45358","line":890,"column":9,"nodeType":"45359","messageId":"45360","endLine":890,"endColumn":12,"suggestions":"48748"},{"ruleId":"45357","severity":2,"message":"45358","line":21,"column":41,"nodeType":"45359","messageId":"45360","endLine":21,"endColumn":44,"suggestions":"48749"},{"ruleId":"45357","severity":2,"message":"45358","line":21,"column":56,"nodeType":"45359","messageId":"45360","endLine":21,"endColumn":59,"suggestions":"48750"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":41,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":44,"suggestions":"48751"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":56,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":59,"suggestions":"48752"},{"ruleId":"45357","severity":2,"message":"45358","line":188,"column":37,"nodeType":"45359","messageId":"45360","endLine":188,"endColumn":40,"suggestions":"48753"},{"ruleId":"45357","severity":2,"message":"45358","line":188,"column":48,"nodeType":"45359","messageId":"45360","endLine":188,"endColumn":51,"suggestions":"48754"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":31,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":34,"suggestions":"48755"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":36,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":39,"suggestions":"48756"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":30,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":33,"suggestions":"48757"},{"ruleId":"45357","severity":2,"message":"45358","line":70,"column":27,"nodeType":"45359","messageId":"45360","endLine":70,"endColumn":30,"suggestions":"48758"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":27,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":30,"suggestions":"48759"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":27,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":30,"suggestions":"48760"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":31,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":34,"suggestions":"48761"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":27,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":30,"suggestions":"48762"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":27,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":30,"suggestions":"48763"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":31,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":34,"suggestions":"48764"},{"ruleId":"45357","severity":2,"message":"45358","line":99,"column":27,"nodeType":"45359","messageId":"45360","endLine":99,"endColumn":30,"suggestions":"48765"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":27,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":30,"suggestions":"48766"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":27,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":30,"suggestions":"48767"},{"ruleId":"45357","severity":2,"message":"45358","line":222,"column":30,"nodeType":"45359","messageId":"45360","endLine":222,"endColumn":33,"suggestions":"48768"},{"ruleId":"45357","severity":2,"message":"45358","line":243,"column":31,"nodeType":"45359","messageId":"45360","endLine":243,"endColumn":34,"suggestions":"48769"},{"ruleId":"45357","severity":2,"message":"45358","line":261,"column":31,"nodeType":"45359","messageId":"45360","endLine":261,"endColumn":34,"suggestions":"48770"},{"ruleId":"45357","severity":2,"message":"45358","line":279,"column":30,"nodeType":"45359","messageId":"45360","endLine":279,"endColumn":33,"suggestions":"48771"},{"ruleId":"45357","severity":2,"message":"45358","line":297,"column":31,"nodeType":"45359","messageId":"45360","endLine":297,"endColumn":34,"suggestions":"48772"},{"ruleId":"45357","severity":2,"message":"45358","line":312,"column":14,"nodeType":"45359","messageId":"45360","endLine":312,"endColumn":17,"suggestions":"48773"},{"ruleId":"45357","severity":2,"message":"45358","line":312,"column":40,"nodeType":"45359","messageId":"45360","endLine":312,"endColumn":43,"suggestions":"48774"},{"ruleId":"45357","severity":2,"message":"45358","line":326,"column":14,"nodeType":"45359","messageId":"45360","endLine":326,"endColumn":17,"suggestions":"48775"},{"ruleId":"45357","severity":2,"message":"45358","line":326,"column":40,"nodeType":"45359","messageId":"45360","endLine":326,"endColumn":43,"suggestions":"48776"},{"ruleId":"45357","severity":2,"message":"45358","line":335,"column":27,"nodeType":"45359","messageId":"45360","endLine":335,"endColumn":30,"suggestions":"48777"},{"ruleId":"45357","severity":2,"message":"45358","line":345,"column":27,"nodeType":"45359","messageId":"45360","endLine":345,"endColumn":30,"suggestions":"48778"},{"ruleId":"45357","severity":2,"message":"45358","line":356,"column":22,"nodeType":"45359","messageId":"45360","endLine":356,"endColumn":25,"suggestions":"48779"},{"ruleId":"45357","severity":2,"message":"45358","line":373,"column":22,"nodeType":"45359","messageId":"45360","endLine":373,"endColumn":25,"suggestions":"48780"},{"ruleId":"45357","severity":2,"message":"45358","line":385,"column":22,"nodeType":"45359","messageId":"45360","endLine":385,"endColumn":25,"suggestions":"48781"},{"ruleId":"45357","severity":2,"message":"45358","line":397,"column":22,"nodeType":"45359","messageId":"45360","endLine":397,"endColumn":25,"suggestions":"48782"},{"ruleId":"45357","severity":2,"message":"45358","line":410,"column":35,"nodeType":"45359","messageId":"45360","endLine":410,"endColumn":38,"suggestions":"48783"},{"ruleId":"45357","severity":2,"message":"45358","line":433,"column":33,"nodeType":"45359","messageId":"45360","endLine":433,"endColumn":36,"suggestions":"48784"},{"ruleId":"45357","severity":2,"message":"45358","line":446,"column":27,"nodeType":"45359","messageId":"45360","endLine":446,"endColumn":30,"suggestions":"48785"},{"ruleId":"45357","severity":2,"message":"45358","line":447,"column":27,"nodeType":"45359","messageId":"45360","endLine":447,"endColumn":30,"suggestions":"48786"},{"ruleId":"45357","severity":2,"message":"45358","line":463,"column":29,"nodeType":"45359","messageId":"45360","endLine":463,"endColumn":32,"suggestions":"48787"},{"ruleId":"45357","severity":2,"message":"45358","line":484,"column":31,"nodeType":"45359","messageId":"45360","endLine":484,"endColumn":34,"suggestions":"48788"},{"ruleId":"45357","severity":2,"message":"45358","line":488,"column":29,"nodeType":"45359","messageId":"45360","endLine":488,"endColumn":32,"suggestions":"48789"},{"ruleId":"45357","severity":2,"message":"45358","line":168,"column":51,"nodeType":"45359","messageId":"45360","endLine":168,"endColumn":54,"suggestions":"48790"},{"ruleId":"45357","severity":2,"message":"45358","line":178,"column":67,"nodeType":"45359","messageId":"45360","endLine":178,"endColumn":70,"suggestions":"48791"},{"ruleId":"45357","severity":2,"message":"45358","line":179,"column":61,"nodeType":"45359","messageId":"45360","endLine":179,"endColumn":64,"suggestions":"48792"},{"ruleId":"45357","severity":2,"message":"45358","line":180,"column":47,"nodeType":"45359","messageId":"45360","endLine":180,"endColumn":50,"suggestions":"48793"},{"ruleId":"45357","severity":2,"message":"45358","line":224,"column":53,"nodeType":"45359","messageId":"45360","endLine":224,"endColumn":56,"suggestions":"48794"},{"ruleId":"45357","severity":2,"message":"45358","line":323,"column":57,"nodeType":"45359","messageId":"45360","endLine":323,"endColumn":60,"suggestions":"48795"},{"ruleId":"45357","severity":2,"message":"45358","line":324,"column":60,"nodeType":"45359","messageId":"45360","endLine":324,"endColumn":63,"suggestions":"48796"},{"ruleId":"45357","severity":2,"message":"45358","line":325,"column":51,"nodeType":"45359","messageId":"45360","endLine":325,"endColumn":54,"suggestions":"48797"},{"ruleId":"45357","severity":2,"message":"45358","line":326,"column":53,"nodeType":"45359","messageId":"45360","endLine":326,"endColumn":56,"suggestions":"48798"},{"ruleId":"45357","severity":2,"message":"45358","line":327,"column":57,"nodeType":"45359","messageId":"45360","endLine":327,"endColumn":60,"suggestions":"48799"},{"ruleId":"45357","severity":2,"message":"45358","line":328,"column":52,"nodeType":"45359","messageId":"45360","endLine":328,"endColumn":55,"suggestions":"48800"},{"ruleId":"45357","severity":2,"message":"45358","line":329,"column":55,"nodeType":"45359","messageId":"45360","endLine":329,"endColumn":58,"suggestions":"48801"},{"ruleId":"45357","severity":2,"message":"45358","line":330,"column":73,"nodeType":"45359","messageId":"45360","endLine":330,"endColumn":76,"suggestions":"48802"},{"ruleId":"45357","severity":2,"message":"45358","line":331,"column":95,"nodeType":"45359","messageId":"45360","endLine":331,"endColumn":98,"suggestions":"48803"},{"ruleId":"45357","severity":2,"message":"45358","line":332,"column":49,"nodeType":"45359","messageId":"45360","endLine":332,"endColumn":52,"suggestions":"48804"},{"ruleId":"45357","severity":2,"message":"45358","line":333,"column":71,"nodeType":"45359","messageId":"45360","endLine":333,"endColumn":74,"suggestions":"48805"},{"ruleId":"45357","severity":2,"message":"45358","line":334,"column":59,"nodeType":"45359","messageId":"45360","endLine":334,"endColumn":62,"suggestions":"48806"},{"ruleId":"45357","severity":2,"message":"45358","line":415,"column":53,"nodeType":"45359","messageId":"45360","endLine":415,"endColumn":56,"suggestions":"48807"},{"ruleId":"45357","severity":2,"message":"45358","line":416,"column":60,"nodeType":"45359","messageId":"45360","endLine":416,"endColumn":63,"suggestions":"48808"},{"ruleId":"45357","severity":2,"message":"45358","line":417,"column":56,"nodeType":"45359","messageId":"45360","endLine":417,"endColumn":59,"suggestions":"48809"},{"ruleId":"45357","severity":2,"message":"45358","line":418,"column":64,"nodeType":"45359","messageId":"45360","endLine":418,"endColumn":67,"suggestions":"48810"},{"ruleId":"45357","severity":2,"message":"45358","line":419,"column":60,"nodeType":"45359","messageId":"45360","endLine":419,"endColumn":63,"suggestions":"48811"},{"ruleId":"45357","severity":2,"message":"45358","line":456,"column":63,"nodeType":"45359","messageId":"45360","endLine":456,"endColumn":66,"suggestions":"48812"},{"ruleId":"45357","severity":2,"message":"45358","line":480,"column":61,"nodeType":"45359","messageId":"45360","endLine":480,"endColumn":64,"suggestions":"48813"},{"ruleId":"45357","severity":2,"message":"45358","line":481,"column":59,"nodeType":"45359","messageId":"45360","endLine":481,"endColumn":62,"suggestions":"48814"},{"ruleId":"45357","severity":2,"message":"45358","line":503,"column":60,"nodeType":"45359","messageId":"45360","endLine":503,"endColumn":63,"suggestions":"48815"},{"ruleId":"45357","severity":2,"message":"45358","line":516,"column":54,"nodeType":"45359","messageId":"45360","endLine":516,"endColumn":57,"suggestions":"48816"},{"ruleId":"45357","severity":2,"message":"45358","line":551,"column":47,"nodeType":"45359","messageId":"45360","endLine":551,"endColumn":50,"suggestions":"48817"},{"ruleId":"45357","severity":2,"message":"45358","line":583,"column":47,"nodeType":"45359","messageId":"45360","endLine":583,"endColumn":50,"suggestions":"48818"},{"ruleId":"45357","severity":2,"message":"45358","line":628,"column":53,"nodeType":"45359","messageId":"45360","endLine":628,"endColumn":56,"suggestions":"48819"},{"ruleId":"45357","severity":2,"message":"45358","line":690,"column":65,"nodeType":"45359","messageId":"45360","endLine":690,"endColumn":68,"suggestions":"48820"},{"ruleId":"45357","severity":2,"message":"45358","line":691,"column":59,"nodeType":"45359","messageId":"45360","endLine":691,"endColumn":62,"suggestions":"48821"},{"ruleId":"45357","severity":2,"message":"45358","line":692,"column":53,"nodeType":"45359","messageId":"45360","endLine":692,"endColumn":56,"suggestions":"48822"},{"ruleId":"45357","severity":2,"message":"45358","line":693,"column":43,"nodeType":"45359","messageId":"45360","endLine":693,"endColumn":46,"suggestions":"48823"},{"ruleId":"45357","severity":2,"message":"45358","line":694,"column":53,"nodeType":"45359","messageId":"45360","endLine":694,"endColumn":56,"suggestions":"48824"},{"ruleId":"45357","severity":2,"message":"45358","line":695,"column":55,"nodeType":"45359","messageId":"45360","endLine":695,"endColumn":58,"suggestions":"48825"},{"ruleId":"45357","severity":2,"message":"45358","line":696,"column":67,"nodeType":"45359","messageId":"45360","endLine":696,"endColumn":70,"suggestions":"48826"},{"ruleId":"45357","severity":2,"message":"45358","line":697,"column":59,"nodeType":"45359","messageId":"45360","endLine":697,"endColumn":62,"suggestions":"48827"},{"ruleId":"45357","severity":2,"message":"45358","line":698,"column":49,"nodeType":"45359","messageId":"45360","endLine":698,"endColumn":52,"suggestions":"48828"},{"ruleId":"45357","severity":2,"message":"45358","line":699,"column":61,"nodeType":"45359","messageId":"45360","endLine":699,"endColumn":64,"suggestions":"48829"},{"ruleId":"45357","severity":2,"message":"45358","line":700,"column":63,"nodeType":"45359","messageId":"45360","endLine":700,"endColumn":66,"suggestions":"48830"},{"ruleId":"45357","severity":2,"message":"45358","line":701,"column":59,"nodeType":"45359","messageId":"45360","endLine":701,"endColumn":62,"suggestions":"48831"},{"ruleId":"45357","severity":2,"message":"45358","line":744,"column":49,"nodeType":"45359","messageId":"45360","endLine":744,"endColumn":52,"suggestions":"48832"},{"ruleId":"45357","severity":2,"message":"45358","line":767,"column":57,"nodeType":"45359","messageId":"45360","endLine":767,"endColumn":60,"suggestions":"48833"},{"ruleId":"45357","severity":2,"message":"45358","line":768,"column":69,"nodeType":"45359","messageId":"45360","endLine":768,"endColumn":72,"suggestions":"48834"},{"ruleId":"45357","severity":2,"message":"45358","line":769,"column":59,"nodeType":"45359","messageId":"45360","endLine":769,"endColumn":62,"suggestions":"48835"},{"ruleId":"45357","severity":2,"message":"45358","line":818,"column":71,"nodeType":"45359","messageId":"45360","endLine":818,"endColumn":74,"suggestions":"48836"},{"ruleId":"45357","severity":2,"message":"45358","line":819,"column":63,"nodeType":"45359","messageId":"45360","endLine":819,"endColumn":66,"suggestions":"48837"},{"ruleId":"45357","severity":2,"message":"45358","line":897,"column":45,"nodeType":"45359","messageId":"45360","endLine":897,"endColumn":48,"suggestions":"48838"},{"ruleId":"45357","severity":2,"message":"45358","line":920,"column":49,"nodeType":"45359","messageId":"45360","endLine":920,"endColumn":52,"suggestions":"48839"},{"ruleId":"45357","severity":2,"message":"45358","line":937,"column":49,"nodeType":"45359","messageId":"45360","endLine":937,"endColumn":52,"suggestions":"48840"},{"ruleId":"45357","severity":2,"message":"45358","line":983,"column":55,"nodeType":"45359","messageId":"45360","endLine":983,"endColumn":58,"suggestions":"48841"},{"ruleId":"45357","severity":2,"message":"45358","line":1012,"column":53,"nodeType":"45359","messageId":"45360","endLine":1012,"endColumn":56,"suggestions":"48842"},{"ruleId":"45357","severity":2,"message":"45358","line":1034,"column":45,"nodeType":"45359","messageId":"45360","endLine":1034,"endColumn":48,"suggestions":"48843"},{"ruleId":"45357","severity":2,"message":"45358","line":1075,"column":43,"nodeType":"45359","messageId":"45360","endLine":1075,"endColumn":46,"suggestions":"48844"},{"ruleId":"45357","severity":2,"message":"45358","line":1144,"column":65,"nodeType":"45359","messageId":"45360","endLine":1144,"endColumn":68,"suggestions":"48845"},{"ruleId":"45357","severity":2,"message":"45358","line":1231,"column":57,"nodeType":"45359","messageId":"45360","endLine":1231,"endColumn":60,"suggestions":"48846"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":30,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":33,"suggestions":"48847"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":18,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":21,"suggestions":"48848"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":39,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":42,"suggestions":"48849"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":18,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":21,"suggestions":"48850"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":39,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":42,"suggestions":"48851"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":30,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":33,"suggestions":"48852"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":30,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":33,"suggestions":"48853"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":30,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":33,"suggestions":"48854"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":30,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":33,"suggestions":"48855"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":33,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":36,"suggestions":"48856"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":14,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":17,"suggestions":"48857"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":42,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":45,"suggestions":"48858"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":14,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":17,"suggestions":"48859"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":42,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":45,"suggestions":"48860"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":14,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":17,"suggestions":"48861"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":42,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":45,"suggestions":"48862"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":33,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":36,"suggestions":"48863"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":27,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":30,"suggestions":"48864"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":27,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":30,"suggestions":"48865"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":27,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":30,"suggestions":"48866"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":27,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":30,"suggestions":"48867"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":43,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":46,"suggestions":"48868"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":45,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":48,"suggestions":"48869"},{"ruleId":"45357","severity":2,"message":"45358","line":246,"column":45,"nodeType":"45359","messageId":"45360","endLine":246,"endColumn":48,"suggestions":"48870"},{"ruleId":"45357","severity":2,"message":"45358","line":303,"column":45,"nodeType":"45359","messageId":"45360","endLine":303,"endColumn":48,"suggestions":"48871"},{"ruleId":"45357","severity":2,"message":"45358","line":351,"column":45,"nodeType":"45359","messageId":"45360","endLine":351,"endColumn":48,"suggestions":"48872"},{"ruleId":"45357","severity":2,"message":"45358","line":406,"column":45,"nodeType":"45359","messageId":"45360","endLine":406,"endColumn":48,"suggestions":"48873"},{"ruleId":"45357","severity":2,"message":"45358","line":452,"column":45,"nodeType":"45359","messageId":"45360","endLine":452,"endColumn":48,"suggestions":"48874"},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":24,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":27,"suggestions":"48875"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":24,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":27,"suggestions":"48876"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":24,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":27,"suggestions":"48877"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":25,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":28,"suggestions":"48878"},{"ruleId":"45357","severity":2,"message":"45358","line":49,"column":26,"nodeType":"45359","messageId":"45360","endLine":49,"endColumn":29,"suggestions":"48879"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":63,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":66,"suggestions":"48880"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":50,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":53,"suggestions":"48881"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":57,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":60,"suggestions":"48882"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":63,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":66,"suggestions":"48883"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":73,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":76,"suggestions":"48884"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":33,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":36,"suggestions":"48885"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":33,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":36,"suggestions":"48886"},{"ruleId":"45357","severity":2,"message":"45358","line":157,"column":33,"nodeType":"45359","messageId":"45360","endLine":157,"endColumn":36,"suggestions":"48887"},{"ruleId":"45357","severity":2,"message":"45358","line":184,"column":33,"nodeType":"45359","messageId":"45360","endLine":184,"endColumn":36,"suggestions":"48888"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":33,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":36,"suggestions":"48889"},{"ruleId":"45357","severity":2,"message":"45358","line":225,"column":33,"nodeType":"45359","messageId":"45360","endLine":225,"endColumn":36,"suggestions":"48890"},{"ruleId":"45357","severity":2,"message":"45358","line":247,"column":33,"nodeType":"45359","messageId":"45360","endLine":247,"endColumn":36,"suggestions":"48891"},{"ruleId":"45357","severity":2,"message":"45358","line":233,"column":61,"nodeType":"45359","messageId":"45360","endLine":233,"endColumn":64,"suggestions":"48892"},{"ruleId":"45357","severity":2,"message":"45358","line":14,"column":26,"nodeType":"45359","messageId":"45360","endLine":14,"endColumn":29,"suggestions":"48893"},{"ruleId":"45357","severity":2,"message":"45358","line":15,"column":35,"nodeType":"45359","messageId":"45360","endLine":15,"endColumn":38,"suggestions":"48894"},{"ruleId":"45357","severity":2,"message":"45358","line":18,"column":34,"nodeType":"45359","messageId":"45360","endLine":18,"endColumn":37,"suggestions":"48895"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":86,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":89,"suggestions":"48896"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":29,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":32,"suggestions":"48897"},{"ruleId":"45357","severity":2,"message":"45358","line":62,"column":20,"nodeType":"45359","messageId":"45360","endLine":62,"endColumn":23,"suggestions":"48898"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":30,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":33,"suggestions":"48899"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":18,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":21,"suggestions":"48900"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":39,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":42,"suggestions":"48901"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":18,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":21,"suggestions":"48902"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":43,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":46,"suggestions":"48903"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":30,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":33,"suggestions":"48904"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":30,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":33,"suggestions":"48905"},{"ruleId":"45357","severity":2,"message":"45358","line":126,"column":30,"nodeType":"45359","messageId":"45360","endLine":126,"endColumn":33,"suggestions":"48906"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":44,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":47,"suggestions":"48907"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":44,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":47,"suggestions":"48908"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":58,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":61,"suggestions":"48909"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":44,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":47,"suggestions":"48910"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":45,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":48,"suggestions":"48911"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":56,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":59,"suggestions":"48912"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":45,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":48,"suggestions":"48913"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":64,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":67,"suggestions":"48914"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":36,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":39,"suggestions":"48915"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":62,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":65,"suggestions":"48916"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":57,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":60,"suggestions":"48917"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":83,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":86,"suggestions":"48918"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":33,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":36,"suggestions":"48919"},{"ruleId":"45357","severity":2,"message":"45358","line":74,"column":43,"nodeType":"45359","messageId":"45360","endLine":74,"endColumn":46,"suggestions":"48920"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":45,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":48,"suggestions":"48921"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":49,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":52,"suggestions":"48922"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":49,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":52,"suggestions":"48923"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":49,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":52,"suggestions":"48924"},{"ruleId":"45357","severity":2,"message":"45358","line":170,"column":49,"nodeType":"45359","messageId":"45360","endLine":170,"endColumn":52,"suggestions":"48925"},{"ruleId":"45357","severity":2,"message":"45358","line":171,"column":49,"nodeType":"45359","messageId":"45360","endLine":171,"endColumn":52,"suggestions":"48926"},{"ruleId":"45357","severity":2,"message":"45358","line":172,"column":53,"nodeType":"45359","messageId":"45360","endLine":172,"endColumn":56,"suggestions":"48927"},{"ruleId":"45357","severity":2,"message":"45358","line":177,"column":57,"nodeType":"45359","messageId":"45360","endLine":177,"endColumn":60,"suggestions":"48928"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":22,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":25,"suggestions":"48929"},{"ruleId":"45357","severity":2,"message":"45358","line":153,"column":22,"nodeType":"45359","messageId":"45360","endLine":153,"endColumn":25,"suggestions":"48930"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":38,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":41,"suggestions":"48931"},{"ruleId":"45357","severity":2,"message":"45358","line":200,"column":38,"nodeType":"45359","messageId":"45360","endLine":200,"endColumn":41,"suggestions":"48932"},{"ruleId":"45357","severity":2,"message":"45358","line":231,"column":38,"nodeType":"45359","messageId":"45360","endLine":231,"endColumn":41,"suggestions":"48933"},{"ruleId":"45357","severity":2,"message":"45358","line":277,"column":38,"nodeType":"45359","messageId":"45360","endLine":277,"endColumn":41,"suggestions":"48934"},{"ruleId":"45357","severity":2,"message":"45358","line":303,"column":38,"nodeType":"45359","messageId":"45360","endLine":303,"endColumn":41,"suggestions":"48935"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":21,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":24,"suggestions":"48936"},{"ruleId":"45357","severity":2,"message":"45358","line":30,"column":60,"nodeType":"45359","messageId":"45360","endLine":30,"endColumn":63,"suggestions":"48937"},{"ruleId":"45357","severity":2,"message":"45358","line":279,"column":29,"nodeType":"45359","messageId":"45360","endLine":279,"endColumn":32,"suggestions":"48938"},{"ruleId":"45357","severity":2,"message":"45358","line":298,"column":34,"nodeType":"45359","messageId":"45360","endLine":298,"endColumn":37,"suggestions":"48939"},{"ruleId":"45357","severity":2,"message":"45358","line":324,"column":37,"nodeType":"45359","messageId":"45360","endLine":324,"endColumn":40,"suggestions":"48940"},{"ruleId":"45357","severity":2,"message":"45358","line":357,"column":29,"nodeType":"45359","messageId":"45360","endLine":357,"endColumn":32,"suggestions":"48941"},{"ruleId":"45357","severity":2,"message":"45358","line":418,"column":17,"nodeType":"45359","messageId":"45360","endLine":418,"endColumn":20,"suggestions":"48942"},{"ruleId":"45357","severity":2,"message":"45358","line":424,"column":19,"nodeType":"45359","messageId":"45360","endLine":424,"endColumn":22,"suggestions":"48943"},{"ruleId":"45357","severity":2,"message":"45358","line":485,"column":18,"nodeType":"45359","messageId":"45360","endLine":485,"endColumn":21,"suggestions":"48944"},{"ruleId":"45357","severity":2,"message":"45358","line":614,"column":76,"nodeType":"45359","messageId":"45360","endLine":614,"endColumn":79,"suggestions":"48945"},{"ruleId":"45357","severity":2,"message":"45358","line":673,"column":88,"nodeType":"45359","messageId":"45360","endLine":673,"endColumn":91,"suggestions":"48946"},{"ruleId":"45357","severity":2,"message":"45358","line":693,"column":40,"nodeType":"45359","messageId":"45360","endLine":693,"endColumn":43,"suggestions":"48947"},{"ruleId":"45357","severity":2,"message":"45358","line":713,"column":22,"nodeType":"45359","messageId":"45360","endLine":713,"endColumn":25,"suggestions":"48948"},{"ruleId":"45357","severity":2,"message":"45358","line":716,"column":43,"nodeType":"45359","messageId":"45360","endLine":716,"endColumn":46,"suggestions":"48949"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":21,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":24,"suggestions":"48950"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":68,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":71,"suggestions":"48951"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":68,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":71,"suggestions":"48952"},{"ruleId":"45357","severity":2,"message":"45358","line":1206,"column":28,"nodeType":"45359","messageId":"45360","endLine":1206,"endColumn":31,"suggestions":"48953"},{"ruleId":"45357","severity":2,"message":"45358","line":1207,"column":28,"nodeType":"45359","messageId":"45360","endLine":1207,"endColumn":31,"suggestions":"48954"},{"ruleId":"45357","severity":2,"message":"45358","line":1208,"column":28,"nodeType":"45359","messageId":"45360","endLine":1208,"endColumn":31,"suggestions":"48955"},{"ruleId":"45357","severity":2,"message":"45358","line":1209,"column":28,"nodeType":"45359","messageId":"45360","endLine":1209,"endColumn":31,"suggestions":"48956"},{"ruleId":"45357","severity":2,"message":"45358","line":1210,"column":28,"nodeType":"45359","messageId":"45360","endLine":1210,"endColumn":31,"suggestions":"48957"},{"ruleId":"45357","severity":2,"message":"45358","line":1839,"column":28,"nodeType":"45359","messageId":"45360","endLine":1839,"endColumn":31,"suggestions":"48958"},{"ruleId":"45357","severity":2,"message":"45358","line":1840,"column":28,"nodeType":"45359","messageId":"45360","endLine":1840,"endColumn":31,"suggestions":"48959"},{"ruleId":"45357","severity":2,"message":"45358","line":1841,"column":28,"nodeType":"45359","messageId":"45360","endLine":1841,"endColumn":31,"suggestions":"48960"},{"ruleId":"45357","severity":2,"message":"45358","line":1842,"column":32,"nodeType":"45359","messageId":"45360","endLine":1842,"endColumn":35,"suggestions":"48961"},{"ruleId":"45357","severity":2,"message":"45358","line":1892,"column":28,"nodeType":"45359","messageId":"45360","endLine":1892,"endColumn":31,"suggestions":"48962"},{"ruleId":"45357","severity":2,"message":"45358","line":1893,"column":28,"nodeType":"45359","messageId":"45360","endLine":1893,"endColumn":31,"suggestions":"48963"},{"ruleId":"45357","severity":2,"message":"45358","line":1894,"column":28,"nodeType":"45359","messageId":"45360","endLine":1894,"endColumn":31,"suggestions":"48964"},{"ruleId":"45357","severity":2,"message":"45358","line":1895,"column":32,"nodeType":"45359","messageId":"45360","endLine":1895,"endColumn":35,"suggestions":"48965"},{"ruleId":"45357","severity":2,"message":"45358","line":1898,"column":32,"nodeType":"45359","messageId":"45360","endLine":1898,"endColumn":35,"suggestions":"48966"},{"ruleId":"45357","severity":2,"message":"45358","line":162,"column":47,"nodeType":"45359","messageId":"45360","endLine":162,"endColumn":50,"suggestions":"48967"},{"ruleId":"45357","severity":2,"message":"45358","line":185,"column":47,"nodeType":"45359","messageId":"45360","endLine":185,"endColumn":50,"suggestions":"48968"},{"ruleId":"45357","severity":2,"message":"45358","line":200,"column":47,"nodeType":"45359","messageId":"45360","endLine":200,"endColumn":50,"suggestions":"48969"},{"ruleId":"45357","severity":2,"message":"45358","line":213,"column":47,"nodeType":"45359","messageId":"45360","endLine":213,"endColumn":50,"suggestions":"48970"},{"ruleId":"45357","severity":2,"message":"45358","line":231,"column":47,"nodeType":"45359","messageId":"45360","endLine":231,"endColumn":50,"suggestions":"48971"},{"ruleId":"45357","severity":2,"message":"45358","line":243,"column":47,"nodeType":"45359","messageId":"45360","endLine":243,"endColumn":50,"suggestions":"48972"},{"ruleId":"45357","severity":2,"message":"45358","line":295,"column":47,"nodeType":"45359","messageId":"45360","endLine":295,"endColumn":50,"suggestions":"48973"},{"ruleId":"45357","severity":2,"message":"45358","line":311,"column":47,"nodeType":"45359","messageId":"45360","endLine":311,"endColumn":50,"suggestions":"48974"},{"ruleId":"45357","severity":2,"message":"45358","line":329,"column":47,"nodeType":"45359","messageId":"45360","endLine":329,"endColumn":50,"suggestions":"48975"},{"ruleId":"45357","severity":2,"message":"45358","line":348,"column":47,"nodeType":"45359","messageId":"45360","endLine":348,"endColumn":50,"suggestions":"48976"},{"ruleId":"45357","severity":2,"message":"45358","line":384,"column":47,"nodeType":"45359","messageId":"45360","endLine":384,"endColumn":50,"suggestions":"48977"},{"ruleId":"45357","severity":2,"message":"45358","line":400,"column":47,"nodeType":"45359","messageId":"45360","endLine":400,"endColumn":50,"suggestions":"48978"},{"ruleId":"45357","severity":2,"message":"45358","line":426,"column":47,"nodeType":"45359","messageId":"45360","endLine":426,"endColumn":50,"suggestions":"48979"},{"ruleId":"45357","severity":2,"message":"45358","line":435,"column":47,"nodeType":"45359","messageId":"45360","endLine":435,"endColumn":50,"suggestions":"48980"},{"ruleId":"45357","severity":2,"message":"45358","line":447,"column":47,"nodeType":"45359","messageId":"45360","endLine":447,"endColumn":50,"suggestions":"48981"},{"ruleId":"45357","severity":2,"message":"45358","line":459,"column":47,"nodeType":"45359","messageId":"45360","endLine":459,"endColumn":50,"suggestions":"48982"},{"ruleId":"45357","severity":2,"message":"45358","line":481,"column":47,"nodeType":"45359","messageId":"45360","endLine":481,"endColumn":50,"suggestions":"48983"},{"ruleId":"45357","severity":2,"message":"45358","line":507,"column":47,"nodeType":"45359","messageId":"45360","endLine":507,"endColumn":50,"suggestions":"48984"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":61,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":64,"suggestions":"48985"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":61,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":64,"suggestions":"48986"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":56,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":59,"suggestions":"48987"},{"ruleId":"45357","severity":2,"message":"45358","line":100,"column":49,"nodeType":"45359","messageId":"45360","endLine":100,"endColumn":52,"suggestions":"48988"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":58,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":61,"suggestions":"48989"},{"ruleId":"45357","severity":2,"message":"45358","line":125,"column":63,"nodeType":"45359","messageId":"45360","endLine":125,"endColumn":66,"suggestions":"48990"},{"ruleId":"45357","severity":2,"message":"45358","line":154,"column":55,"nodeType":"45359","messageId":"45360","endLine":154,"endColumn":58,"suggestions":"48991"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":31,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":34,"suggestions":"48992"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":31,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":34,"suggestions":"48993"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":14,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":17,"suggestions":"48994"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":40,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":43,"suggestions":"48995"},{"ruleId":"45357","severity":2,"message":"45358","line":150,"column":41,"nodeType":"45359","messageId":"45360","endLine":150,"endColumn":44,"suggestions":"48996"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":9,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":12,"suggestions":"48997"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":59,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":62,"suggestions":"48998"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":89,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":92,"suggestions":"48999"},{"ruleId":"45357","severity":2,"message":"45358","line":130,"column":56,"nodeType":"45359","messageId":"45360","endLine":130,"endColumn":59,"suggestions":"49000"},{"ruleId":"45357","severity":2,"message":"45358","line":130,"column":83,"nodeType":"45359","messageId":"45360","endLine":130,"endColumn":86,"suggestions":"49001"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":46,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":49,"suggestions":"49002"},{"ruleId":"45357","severity":2,"message":"45358","line":28,"column":46,"nodeType":"45359","messageId":"45360","endLine":28,"endColumn":49,"suggestions":"49003"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":39,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":42,"suggestions":"49004"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":60,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":63,"suggestions":"49005"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":32,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":35,"suggestions":"49006"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":21,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":24,"suggestions":"49007"},{"ruleId":"45357","severity":2,"message":"45358","line":254,"column":69,"nodeType":"45359","messageId":"45360","endLine":254,"endColumn":72,"suggestions":"49008"},{"ruleId":"45357","severity":2,"message":"45358","line":262,"column":88,"nodeType":"45359","messageId":"45360","endLine":262,"endColumn":91,"suggestions":"49009"},{"ruleId":"45357","severity":2,"message":"45358","line":328,"column":69,"nodeType":"45359","messageId":"45360","endLine":328,"endColumn":72,"suggestions":"49010"},{"ruleId":"45357","severity":2,"message":"45358","line":335,"column":86,"nodeType":"45359","messageId":"45360","endLine":335,"endColumn":89,"suggestions":"49011"},{"ruleId":"45357","severity":2,"message":"45358","line":385,"column":69,"nodeType":"45359","messageId":"45360","endLine":385,"endColumn":72,"suggestions":"49012"},{"ruleId":"45357","severity":2,"message":"45358","line":391,"column":86,"nodeType":"45359","messageId":"45360","endLine":391,"endColumn":89,"suggestions":"49013"},{"ruleId":"45357","severity":2,"message":"45358","line":461,"column":89,"nodeType":"45359","messageId":"45360","endLine":461,"endColumn":92,"suggestions":"49014"},{"ruleId":"45357","severity":2,"message":"45358","line":515,"column":86,"nodeType":"45359","messageId":"45360","endLine":515,"endColumn":89,"suggestions":"49015"},{"ruleId":"45357","severity":2,"message":"45358","line":572,"column":86,"nodeType":"45359","messageId":"45360","endLine":572,"endColumn":89,"suggestions":"49016"},{"ruleId":"45357","severity":2,"message":"45358","line":34,"column":21,"nodeType":"45359","messageId":"45360","endLine":34,"endColumn":24,"suggestions":"49017"},{"ruleId":"45357","severity":2,"message":"45358","line":278,"column":79,"nodeType":"45359","messageId":"45360","endLine":278,"endColumn":82,"suggestions":"49018"},{"ruleId":"45357","severity":2,"message":"45358","line":284,"column":77,"nodeType":"45359","messageId":"45360","endLine":284,"endColumn":80,"suggestions":"49019"},{"ruleId":"45357","severity":2,"message":"45358","line":339,"column":73,"nodeType":"45359","messageId":"45360","endLine":339,"endColumn":76,"suggestions":"49020"},{"ruleId":"45357","severity":2,"message":"45358","line":346,"column":48,"nodeType":"45359","messageId":"45360","endLine":346,"endColumn":51,"suggestions":"49021"},{"ruleId":"45357","severity":2,"message":"45358","line":358,"column":76,"nodeType":"45359","messageId":"45360","endLine":358,"endColumn":79,"suggestions":"49022"},{"ruleId":"45357","severity":2,"message":"45358","line":397,"column":41,"nodeType":"45359","messageId":"45360","endLine":397,"endColumn":44,"suggestions":"49023"},{"ruleId":"45357","severity":2,"message":"45358","line":450,"column":83,"nodeType":"45359","messageId":"45360","endLine":450,"endColumn":86,"suggestions":"49024"},{"ruleId":"45357","severity":2,"message":"45358","line":493,"column":83,"nodeType":"45359","messageId":"45360","endLine":493,"endColumn":86,"suggestions":"49025"},{"ruleId":"45357","severity":2,"message":"45358","line":497,"column":33,"nodeType":"45359","messageId":"45360","endLine":497,"endColumn":36,"suggestions":"49026"},{"ruleId":"45357","severity":2,"message":"45358","line":498,"column":33,"nodeType":"45359","messageId":"45360","endLine":498,"endColumn":36,"suggestions":"49027"},{"ruleId":"45357","severity":2,"message":"45358","line":68,"column":29,"nodeType":"45359","messageId":"45360","endLine":68,"endColumn":32,"suggestions":"49028"},{"ruleId":"45357","severity":2,"message":"45358","line":75,"column":29,"nodeType":"45359","messageId":"45360","endLine":75,"endColumn":32,"suggestions":"49029"},{"ruleId":"45357","severity":2,"message":"45358","line":183,"column":16,"nodeType":"45359","messageId":"45360","endLine":183,"endColumn":19,"suggestions":"49030"},{"ruleId":"45357","severity":2,"message":"45358","line":251,"column":16,"nodeType":"45359","messageId":"45360","endLine":251,"endColumn":19,"suggestions":"49031"},{"ruleId":"45357","severity":2,"message":"45358","line":284,"column":16,"nodeType":"45359","messageId":"45360","endLine":284,"endColumn":19,"suggestions":"49032"},{"ruleId":"45357","severity":2,"message":"45358","line":324,"column":16,"nodeType":"45359","messageId":"45360","endLine":324,"endColumn":19,"suggestions":"49033"},{"ruleId":"45357","severity":2,"message":"45358","line":353,"column":16,"nodeType":"45359","messageId":"45360","endLine":353,"endColumn":19,"suggestions":"49034"},{"ruleId":"45357","severity":2,"message":"45358","line":429,"column":16,"nodeType":"45359","messageId":"45360","endLine":429,"endColumn":19,"suggestions":"49035"},{"ruleId":"45357","severity":2,"message":"45358","line":471,"column":16,"nodeType":"45359","messageId":"45360","endLine":471,"endColumn":19,"suggestions":"49036"},{"ruleId":"45357","severity":2,"message":"45358","line":512,"column":16,"nodeType":"45359","messageId":"45360","endLine":512,"endColumn":19,"suggestions":"49037"},{"ruleId":"45357","severity":2,"message":"45358","line":544,"column":16,"nodeType":"45359","messageId":"45360","endLine":544,"endColumn":19,"suggestions":"49038"},{"ruleId":"45357","severity":2,"message":"45358","line":599,"column":16,"nodeType":"45359","messageId":"45360","endLine":599,"endColumn":19,"suggestions":"49039"},{"ruleId":"45357","severity":2,"message":"45358","line":636,"column":16,"nodeType":"45359","messageId":"45360","endLine":636,"endColumn":19,"suggestions":"49040"},{"ruleId":"45357","severity":2,"message":"45358","line":686,"column":16,"nodeType":"45359","messageId":"45360","endLine":686,"endColumn":19,"suggestions":"49041"},{"ruleId":"45357","severity":2,"message":"45358","line":719,"column":16,"nodeType":"45359","messageId":"45360","endLine":719,"endColumn":19,"suggestions":"49042"},{"ruleId":"45357","severity":2,"message":"45358","line":1356,"column":31,"nodeType":"45359","messageId":"45360","endLine":1356,"endColumn":34,"suggestions":"49043"},{"ruleId":"45357","severity":2,"message":"45358","line":1357,"column":31,"nodeType":"45359","messageId":"45360","endLine":1357,"endColumn":34,"suggestions":"49044"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":27,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":30,"suggestions":"49045"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":14,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":17,"suggestions":"49046"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":36,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":39,"suggestions":"49047"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":14,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":17,"suggestions":"49048"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":36,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":39,"suggestions":"49049"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":27,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":30,"suggestions":"49050"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":27,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":30,"suggestions":"49051"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":14,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":17,"suggestions":"49052"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":41,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":44,"suggestions":"49053"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":58,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":61,"suggestions":"49054"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":31,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":34,"suggestions":"49055"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":31,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":34,"suggestions":"49056"},{"ruleId":"45357","severity":2,"message":"45358","line":51,"column":32,"nodeType":"45359","messageId":"45360","endLine":51,"endColumn":35,"suggestions":"49057"},{"ruleId":"45357","severity":2,"message":"45358","line":54,"column":37,"nodeType":"45359","messageId":"45360","endLine":54,"endColumn":40,"suggestions":"49058"},{"ruleId":"45357","severity":2,"message":"45358","line":54,"column":48,"nodeType":"45359","messageId":"45360","endLine":54,"endColumn":51,"suggestions":"49059"},{"ruleId":"45357","severity":2,"message":"45358","line":273,"column":46,"nodeType":"45359","messageId":"45360","endLine":273,"endColumn":49,"suggestions":"49060"},{"ruleId":"45357","severity":2,"message":"45358","line":274,"column":39,"nodeType":"45359","messageId":"45360","endLine":274,"endColumn":42,"suggestions":"49061"},{"ruleId":"45357","severity":2,"message":"45358","line":276,"column":37,"nodeType":"45359","messageId":"45360","endLine":276,"endColumn":40,"suggestions":"49062"},{"ruleId":"45357","severity":2,"message":"45358","line":276,"column":48,"nodeType":"45359","messageId":"45360","endLine":276,"endColumn":51,"suggestions":"49063"},{"ruleId":"45357","severity":2,"message":"45358","line":212,"column":31,"nodeType":"45359","messageId":"45360","endLine":212,"endColumn":34,"suggestions":"49064"},{"ruleId":"45357","severity":2,"message":"45358","line":226,"column":31,"nodeType":"45359","messageId":"45360","endLine":226,"endColumn":34,"suggestions":"49065"},{"ruleId":"45357","severity":2,"message":"45358","line":252,"column":36,"nodeType":"45359","messageId":"45360","endLine":252,"endColumn":39,"suggestions":"49066"},{"ruleId":"45357","severity":2,"message":"45358","line":253,"column":36,"nodeType":"45359","messageId":"45360","endLine":253,"endColumn":39,"suggestions":"49067"},{"ruleId":"45357","severity":2,"message":"45358","line":254,"column":47,"nodeType":"45359","messageId":"45360","endLine":254,"endColumn":50,"suggestions":"49068"},{"ruleId":"45357","severity":2,"message":"45358","line":252,"column":49,"nodeType":"45359","messageId":"45360","endLine":252,"endColumn":52,"suggestions":"49069"},{"ruleId":"45357","severity":2,"message":"45358","line":301,"column":51,"nodeType":"45359","messageId":"45360","endLine":301,"endColumn":54,"suggestions":"49070"},{"ruleId":"45357","severity":2,"message":"45358","line":352,"column":47,"nodeType":"45359","messageId":"45360","endLine":352,"endColumn":50,"suggestions":"49071"},{"ruleId":"45357","severity":2,"message":"45358","line":388,"column":47,"nodeType":"45359","messageId":"45360","endLine":388,"endColumn":50,"suggestions":"49072"},{"ruleId":"45357","severity":2,"message":"45358","line":51,"column":47,"nodeType":"45359","messageId":"45360","endLine":51,"endColumn":50,"suggestions":"49073"},{"ruleId":"45357","severity":2,"message":"45358","line":52,"column":30,"nodeType":"45359","messageId":"45360","endLine":52,"endColumn":33,"suggestions":"49074"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":15,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":18,"suggestions":"49075"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":47,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":50,"suggestions":"49076"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":30,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":33,"suggestions":"49077"},{"ruleId":"45357","severity":2,"message":"45358","line":120,"column":47,"nodeType":"45359","messageId":"45360","endLine":120,"endColumn":50,"suggestions":"49078"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":30,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":33,"suggestions":"49079"},{"ruleId":"45357","severity":2,"message":"45358","line":139,"column":47,"nodeType":"45359","messageId":"45360","endLine":139,"endColumn":50,"suggestions":"49080"},{"ruleId":"45357","severity":2,"message":"45358","line":140,"column":30,"nodeType":"45359","messageId":"45360","endLine":140,"endColumn":33,"suggestions":"49081"},{"ruleId":"45357","severity":2,"message":"45358","line":148,"column":47,"nodeType":"45359","messageId":"45360","endLine":148,"endColumn":50,"suggestions":"49082"},{"ruleId":"45357","severity":2,"message":"45358","line":149,"column":30,"nodeType":"45359","messageId":"45360","endLine":149,"endColumn":33,"suggestions":"49083"},{"ruleId":"45357","severity":2,"message":"45358","line":181,"column":47,"nodeType":"45359","messageId":"45360","endLine":181,"endColumn":50,"suggestions":"49084"},{"ruleId":"45357","severity":2,"message":"45358","line":182,"column":30,"nodeType":"45359","messageId":"45360","endLine":182,"endColumn":33,"suggestions":"49085"},{"ruleId":"45357","severity":2,"message":"45358","line":207,"column":47,"nodeType":"45359","messageId":"45360","endLine":207,"endColumn":50,"suggestions":"49086"},{"ruleId":"45357","severity":2,"message":"45358","line":208,"column":30,"nodeType":"45359","messageId":"45360","endLine":208,"endColumn":33,"suggestions":"49087"},{"ruleId":"45357","severity":2,"message":"45358","line":225,"column":49,"nodeType":"45359","messageId":"45360","endLine":225,"endColumn":52,"suggestions":"49088"},{"ruleId":"45357","severity":2,"message":"45358","line":226,"column":32,"nodeType":"45359","messageId":"45360","endLine":226,"endColumn":35,"suggestions":"49089"},{"ruleId":"45357","severity":2,"message":"45358","line":238,"column":49,"nodeType":"45359","messageId":"45360","endLine":238,"endColumn":52,"suggestions":"49090"},{"ruleId":"45357","severity":2,"message":"45358","line":239,"column":32,"nodeType":"45359","messageId":"45360","endLine":239,"endColumn":35,"suggestions":"49091"},{"ruleId":"45357","severity":2,"message":"45358","line":249,"column":15,"nodeType":"45359","messageId":"45360","endLine":249,"endColumn":18,"suggestions":"49092"},{"ruleId":"45357","severity":2,"message":"45358","line":294,"column":15,"nodeType":"45359","messageId":"45360","endLine":294,"endColumn":18,"suggestions":"49093"},{"ruleId":"45357","severity":2,"message":"45358","line":97,"column":51,"nodeType":"45359","messageId":"45360","endLine":97,"endColumn":54,"suggestions":"49094"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":51,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":54,"suggestions":"49095"},{"ruleId":"45357","severity":2,"message":"45358","line":102,"column":51,"nodeType":"45359","messageId":"45360","endLine":102,"endColumn":54,"suggestions":"49096"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":27,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":30,"suggestions":"49097"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":31,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":34,"suggestions":"49098"},{"ruleId":"45357","severity":2,"message":"45358","line":244,"column":40,"nodeType":"45359","messageId":"45360","endLine":244,"endColumn":43,"suggestions":"49099"},{"ruleId":"45357","severity":2,"message":"45358","line":246,"column":16,"nodeType":"45359","messageId":"45360","endLine":246,"endColumn":19,"suggestions":"49100"},{"ruleId":"45357","severity":2,"message":"45358","line":250,"column":27,"nodeType":"45359","messageId":"45360","endLine":250,"endColumn":30,"suggestions":"49101"},{"ruleId":"45357","severity":2,"message":"45358","line":251,"column":63,"nodeType":"45359","messageId":"45360","endLine":251,"endColumn":66,"suggestions":"49102"},{"ruleId":"45357","severity":2,"message":"45358","line":252,"column":67,"nodeType":"45359","messageId":"45360","endLine":252,"endColumn":70,"suggestions":"49103"},{"ruleId":"45357","severity":2,"message":"45358","line":310,"column":46,"nodeType":"45359","messageId":"45360","endLine":310,"endColumn":49,"suggestions":"49104"},{"ruleId":"45357","severity":2,"message":"45358","line":342,"column":44,"nodeType":"45359","messageId":"45360","endLine":342,"endColumn":47,"suggestions":"49105"},{"ruleId":"45357","severity":2,"message":"45358","line":395,"column":33,"nodeType":"45359","messageId":"45360","endLine":395,"endColumn":36,"suggestions":"49106"},{"ruleId":"45357","severity":2,"message":"45358","line":413,"column":33,"nodeType":"45359","messageId":"45360","endLine":413,"endColumn":36,"suggestions":"49107"},{"ruleId":"45357","severity":2,"message":"45358","line":460,"column":61,"nodeType":"45359","messageId":"45360","endLine":460,"endColumn":64,"suggestions":"49108"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":33,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":36,"suggestions":"49109"},{"ruleId":"45357","severity":2,"message":"45358","line":79,"column":27,"nodeType":"45359","messageId":"45360","endLine":79,"endColumn":30,"suggestions":"49110"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":14,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":17,"suggestions":"49111"},{"ruleId":"45357","severity":2,"message":"45358","line":80,"column":36,"nodeType":"45359","messageId":"45360","endLine":80,"endColumn":39,"suggestions":"49112"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":14,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":17,"suggestions":"49113"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":36,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":39,"suggestions":"49114"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":27,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":30,"suggestions":"49115"},{"ruleId":"45357","severity":2,"message":"45358","line":83,"column":27,"nodeType":"45359","messageId":"45360","endLine":83,"endColumn":30,"suggestions":"49116"},{"ruleId":"45357","severity":2,"message":"45358","line":84,"column":27,"nodeType":"45359","messageId":"45360","endLine":84,"endColumn":30,"suggestions":"49117"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":27,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":30,"suggestions":"49118"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":27,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":30,"suggestions":"49119"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":27,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":30,"suggestions":"49120"},{"ruleId":"45357","severity":2,"message":"45358","line":88,"column":27,"nodeType":"45359","messageId":"45360","endLine":88,"endColumn":30,"suggestions":"49121"},{"ruleId":"45357","severity":2,"message":"45358","line":89,"column":27,"nodeType":"45359","messageId":"45360","endLine":89,"endColumn":30,"suggestions":"49122"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":27,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":30,"suggestions":"49123"},{"ruleId":"45357","severity":2,"message":"45358","line":91,"column":27,"nodeType":"45359","messageId":"45360","endLine":91,"endColumn":30,"suggestions":"49124"},{"ruleId":"45357","severity":2,"message":"45358","line":92,"column":27,"nodeType":"45359","messageId":"45360","endLine":92,"endColumn":30,"suggestions":"49125"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":27,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":30,"suggestions":"49126"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":27,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":30,"suggestions":"49127"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":27,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":30,"suggestions":"49128"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":27,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":30,"suggestions":"49129"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":14,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":17,"suggestions":"49130"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":45,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":48,"suggestions":"49131"},{"ruleId":"45357","severity":2,"message":"45358","line":116,"column":36,"nodeType":"45359","messageId":"45360","endLine":116,"endColumn":39,"suggestions":"49132"},{"ruleId":"45357","severity":2,"message":"45358","line":121,"column":36,"nodeType":"45359","messageId":"45360","endLine":121,"endColumn":39,"suggestions":"49133"},{"ruleId":"45357","severity":2,"message":"45358","line":122,"column":36,"nodeType":"45359","messageId":"45360","endLine":122,"endColumn":39,"suggestions":"49134"},{"ruleId":"45357","severity":2,"message":"45358","line":48,"column":31,"nodeType":"45359","messageId":"45360","endLine":48,"endColumn":34,"suggestions":"49135"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":14,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":17,"suggestions":"49136"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":40,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":43,"suggestions":"49137"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":14,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":17,"suggestions":"49138"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":40,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":43,"suggestions":"49139"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":27,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":30,"suggestions":"49140"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":27,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":30,"suggestions":"49141"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":27,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":30,"suggestions":"49142"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":14,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":17,"suggestions":"49143"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":40,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":43,"suggestions":"49144"},{"ruleId":"45357","severity":2,"message":"45358","line":127,"column":13,"nodeType":"45359","messageId":"45360","endLine":127,"endColumn":16,"suggestions":"49145"},{"ruleId":"45357","severity":2,"message":"45358","line":145,"column":33,"nodeType":"45359","messageId":"45360","endLine":145,"endColumn":36,"suggestions":"49146"},{"ruleId":"45357","severity":2,"message":"45358","line":284,"column":8,"nodeType":"45359","messageId":"45360","endLine":284,"endColumn":11,"suggestions":"49147"},{"ruleId":"45357","severity":2,"message":"45358","line":286,"column":54,"nodeType":"45359","messageId":"45360","endLine":286,"endColumn":57,"suggestions":"49148"},{"ruleId":"45357","severity":2,"message":"45358","line":350,"column":27,"nodeType":"45359","messageId":"45360","endLine":350,"endColumn":30,"suggestions":"49149"},{"ruleId":"45357","severity":2,"message":"45358","line":351,"column":27,"nodeType":"45359","messageId":"45360","endLine":351,"endColumn":30,"suggestions":"49150"},{"ruleId":"45357","severity":2,"message":"45358","line":352,"column":27,"nodeType":"45359","messageId":"45360","endLine":352,"endColumn":30,"suggestions":"49151"},{"ruleId":"45357","severity":2,"message":"45358","line":353,"column":27,"nodeType":"45359","messageId":"45360","endLine":353,"endColumn":30,"suggestions":"49152"},{"ruleId":"45357","severity":2,"message":"45358","line":354,"column":31,"nodeType":"45359","messageId":"45360","endLine":354,"endColumn":34,"suggestions":"49153"},{"ruleId":"45357","severity":2,"message":"45358","line":385,"column":31,"nodeType":"45359","messageId":"45360","endLine":385,"endColumn":34,"suggestions":"49154"},{"ruleId":"45357","severity":2,"message":"45358","line":394,"column":31,"nodeType":"45359","messageId":"45360","endLine":394,"endColumn":34,"suggestions":"49155"},{"ruleId":"45357","severity":2,"message":"45358","line":395,"column":27,"nodeType":"45359","messageId":"45360","endLine":395,"endColumn":30,"suggestions":"49156"},{"ruleId":"45357","severity":2,"message":"45358","line":396,"column":27,"nodeType":"45359","messageId":"45360","endLine":396,"endColumn":30,"suggestions":"49157"},{"ruleId":"45357","severity":2,"message":"45358","line":397,"column":27,"nodeType":"45359","messageId":"45360","endLine":397,"endColumn":30,"suggestions":"49158"},{"ruleId":"45357","severity":2,"message":"45358","line":424,"column":8,"nodeType":"45359","messageId":"45360","endLine":424,"endColumn":11,"suggestions":"49159"},{"ruleId":"45357","severity":2,"message":"45358","line":454,"column":8,"nodeType":"45359","messageId":"45360","endLine":454,"endColumn":11,"suggestions":"49160"},{"ruleId":"45357","severity":2,"message":"45358","line":470,"column":8,"nodeType":"45359","messageId":"45360","endLine":470,"endColumn":11,"suggestions":"49161"},{"ruleId":"45357","severity":2,"message":"45358","line":496,"column":27,"nodeType":"45359","messageId":"45360","endLine":496,"endColumn":30,"suggestions":"49162"},{"ruleId":"45357","severity":2,"message":"45358","line":497,"column":27,"nodeType":"45359","messageId":"45360","endLine":497,"endColumn":30,"suggestions":"49163"},{"ruleId":"45357","severity":2,"message":"45358","line":498,"column":27,"nodeType":"45359","messageId":"45360","endLine":498,"endColumn":30,"suggestions":"49164"},{"ruleId":"45357","severity":2,"message":"45358","line":519,"column":31,"nodeType":"45359","messageId":"45360","endLine":519,"endColumn":34,"suggestions":"49165"},{"ruleId":"45357","severity":2,"message":"45358","line":546,"column":14,"nodeType":"45359","messageId":"45360","endLine":546,"endColumn":17,"suggestions":"49166"},{"ruleId":"45357","severity":2,"message":"45358","line":546,"column":36,"nodeType":"45359","messageId":"45360","endLine":546,"endColumn":39,"suggestions":"49167"},{"ruleId":"45357","severity":2,"message":"45358","line":547,"column":14,"nodeType":"45359","messageId":"45360","endLine":547,"endColumn":17,"suggestions":"49168"},{"ruleId":"45357","severity":2,"message":"45358","line":547,"column":36,"nodeType":"45359","messageId":"45360","endLine":547,"endColumn":39,"suggestions":"49169"},{"ruleId":"45357","severity":2,"message":"45358","line":548,"column":27,"nodeType":"45359","messageId":"45360","endLine":548,"endColumn":30,"suggestions":"49170"},{"ruleId":"45357","severity":2,"message":"45358","line":549,"column":27,"nodeType":"45359","messageId":"45360","endLine":549,"endColumn":30,"suggestions":"49171"},{"ruleId":"45357","severity":2,"message":"45358","line":563,"column":31,"nodeType":"45359","messageId":"45360","endLine":563,"endColumn":34,"suggestions":"49172"},{"ruleId":"45357","severity":2,"message":"45358","line":564,"column":27,"nodeType":"45359","messageId":"45360","endLine":564,"endColumn":30,"suggestions":"49173"},{"ruleId":"45357","severity":2,"message":"45358","line":579,"column":31,"nodeType":"45359","messageId":"45360","endLine":579,"endColumn":34,"suggestions":"49174"},{"ruleId":"45357","severity":2,"message":"45358","line":593,"column":27,"nodeType":"45359","messageId":"45360","endLine":593,"endColumn":30,"suggestions":"49175"},{"ruleId":"45357","severity":2,"message":"45358","line":610,"column":31,"nodeType":"45359","messageId":"45360","endLine":610,"endColumn":34,"suggestions":"49176"},{"ruleId":"45357","severity":2,"message":"45358","line":612,"column":27,"nodeType":"45359","messageId":"45360","endLine":612,"endColumn":30,"suggestions":"49177"},{"ruleId":"45357","severity":2,"message":"45358","line":613,"column":27,"nodeType":"45359","messageId":"45360","endLine":613,"endColumn":30,"suggestions":"49178"},{"ruleId":"45357","severity":2,"message":"45358","line":646,"column":31,"nodeType":"45359","messageId":"45360","endLine":646,"endColumn":34,"suggestions":"49179"},{"ruleId":"45357","severity":2,"message":"45358","line":647,"column":27,"nodeType":"45359","messageId":"45360","endLine":647,"endColumn":30,"suggestions":"49180"},{"ruleId":"45357","severity":2,"message":"45358","line":674,"column":27,"nodeType":"45359","messageId":"45360","endLine":674,"endColumn":30,"suggestions":"49181"},{"ruleId":"45357","severity":2,"message":"45358","line":676,"column":16,"nodeType":"45359","messageId":"45360","endLine":676,"endColumn":19,"suggestions":"49182"},{"ruleId":"45357","severity":2,"message":"45358","line":680,"column":16,"nodeType":"45359","messageId":"45360","endLine":680,"endColumn":19,"suggestions":"49183"},{"ruleId":"45357","severity":2,"message":"45358","line":684,"column":16,"nodeType":"45359","messageId":"45360","endLine":684,"endColumn":19,"suggestions":"49184"},{"ruleId":"45357","severity":2,"message":"45358","line":700,"column":14,"nodeType":"45359","messageId":"45360","endLine":700,"endColumn":17,"suggestions":"49185"},{"ruleId":"45357","severity":2,"message":"45358","line":700,"column":36,"nodeType":"45359","messageId":"45360","endLine":700,"endColumn":39,"suggestions":"49186"},{"ruleId":"45357","severity":2,"message":"45358","line":701,"column":27,"nodeType":"45359","messageId":"45360","endLine":701,"endColumn":30,"suggestions":"49187"},{"ruleId":"45357","severity":2,"message":"45358","line":702,"column":27,"nodeType":"45359","messageId":"45360","endLine":702,"endColumn":30,"suggestions":"49188"},{"ruleId":"45357","severity":2,"message":"45358","line":716,"column":27,"nodeType":"45359","messageId":"45360","endLine":716,"endColumn":30,"suggestions":"49189"},{"ruleId":"45357","severity":2,"message":"45358","line":717,"column":27,"nodeType":"45359","messageId":"45360","endLine":717,"endColumn":30,"suggestions":"49190"},{"ruleId":"45357","severity":2,"message":"45358","line":732,"column":14,"nodeType":"45359","messageId":"45360","endLine":732,"endColumn":17,"suggestions":"49191"},{"ruleId":"45357","severity":2,"message":"45358","line":732,"column":36,"nodeType":"45359","messageId":"45360","endLine":732,"endColumn":39,"suggestions":"49192"},{"ruleId":"45357","severity":2,"message":"45358","line":733,"column":27,"nodeType":"45359","messageId":"45360","endLine":733,"endColumn":30,"suggestions":"49193"},{"ruleId":"45357","severity":2,"message":"45358","line":734,"column":27,"nodeType":"45359","messageId":"45360","endLine":734,"endColumn":30,"suggestions":"49194"},{"ruleId":"45357","severity":2,"message":"45358","line":838,"column":33,"nodeType":"45359","messageId":"45360","endLine":838,"endColumn":36,"suggestions":"49195"},{"ruleId":"45357","severity":2,"message":"45358","line":877,"column":33,"nodeType":"45359","messageId":"45360","endLine":877,"endColumn":36,"suggestions":"49196"},{"ruleId":"45357","severity":2,"message":"45358","line":896,"column":13,"nodeType":"45359","messageId":"45360","endLine":896,"endColumn":16,"suggestions":"49197"},{"ruleId":"45357","severity":2,"message":"45358","line":935,"column":33,"nodeType":"45359","messageId":"45360","endLine":935,"endColumn":36,"suggestions":"49198"},{"ruleId":"45357","severity":2,"message":"45358","line":983,"column":33,"nodeType":"45359","messageId":"45360","endLine":983,"endColumn":36,"suggestions":"49199"},{"ruleId":"45357","severity":2,"message":"45358","line":1022,"column":33,"nodeType":"45359","messageId":"45360","endLine":1022,"endColumn":36,"suggestions":"49200"},{"ruleId":"45357","severity":2,"message":"45358","line":1067,"column":33,"nodeType":"45359","messageId":"45360","endLine":1067,"endColumn":36,"suggestions":"49201"},{"ruleId":"45357","severity":2,"message":"45358","line":1068,"column":33,"nodeType":"45359","messageId":"45360","endLine":1068,"endColumn":36,"suggestions":"49202"},{"ruleId":"45357","severity":2,"message":"45358","line":1069,"column":33,"nodeType":"45359","messageId":"45360","endLine":1069,"endColumn":36,"suggestions":"49203"},{"ruleId":"45357","severity":2,"message":"45358","line":1070,"column":37,"nodeType":"45359","messageId":"45360","endLine":1070,"endColumn":40,"suggestions":"49204"},{"ruleId":"45357","severity":2,"message":"45358","line":1090,"column":39,"nodeType":"45359","messageId":"45360","endLine":1090,"endColumn":42,"suggestions":"49205"},{"ruleId":"45357","severity":2,"message":"45358","line":1100,"column":30,"nodeType":"45359","messageId":"45360","endLine":1100,"endColumn":33,"suggestions":"49206"},{"ruleId":"45357","severity":2,"message":"45358","line":1118,"column":39,"nodeType":"45359","messageId":"45360","endLine":1118,"endColumn":42,"suggestions":"49207"},{"ruleId":"45357","severity":2,"message":"45358","line":1139,"column":39,"nodeType":"45359","messageId":"45360","endLine":1139,"endColumn":42,"suggestions":"49208"},{"ruleId":"45357","severity":2,"message":"45358","line":1171,"column":33,"nodeType":"45359","messageId":"45360","endLine":1171,"endColumn":36,"suggestions":"49209"},{"ruleId":"45357","severity":2,"message":"45358","line":1187,"column":33,"nodeType":"45359","messageId":"45360","endLine":1187,"endColumn":36,"suggestions":"49210"},{"ruleId":"45357","severity":2,"message":"45358","line":307,"column":16,"nodeType":"45359","messageId":"45360","endLine":307,"endColumn":19,"suggestions":"49211"},{"ruleId":"45357","severity":2,"message":"45358","line":332,"column":27,"nodeType":"45359","messageId":"45360","endLine":332,"endColumn":30,"suggestions":"49212"},{"ruleId":"45357","severity":2,"message":"45358","line":374,"column":27,"nodeType":"45359","messageId":"45360","endLine":374,"endColumn":30,"suggestions":"49213"},{"ruleId":"45357","severity":2,"message":"45358","line":375,"column":24,"nodeType":"45359","messageId":"45360","endLine":375,"endColumn":27,"suggestions":"49214"},{"ruleId":"45357","severity":2,"message":"45358","line":376,"column":27,"nodeType":"45359","messageId":"45360","endLine":376,"endColumn":30,"suggestions":"49215"},{"ruleId":"45357","severity":2,"message":"45358","line":377,"column":27,"nodeType":"45359","messageId":"45360","endLine":377,"endColumn":30,"suggestions":"49216"},{"ruleId":"45357","severity":2,"message":"45358","line":437,"column":40,"nodeType":"45359","messageId":"45360","endLine":437,"endColumn":43,"suggestions":"49217"},{"ruleId":"45357","severity":2,"message":"45358","line":441,"column":27,"nodeType":"45359","messageId":"45360","endLine":441,"endColumn":30,"suggestions":"49218"},{"ruleId":"45357","severity":2,"message":"45358","line":453,"column":16,"nodeType":"45359","messageId":"45360","endLine":453,"endColumn":19,"suggestions":"49219"},{"ruleId":"45357","severity":2,"message":"45358","line":486,"column":31,"nodeType":"45359","messageId":"45360","endLine":486,"endColumn":34,"suggestions":"49220"},{"ruleId":"45357","severity":2,"message":"45358","line":506,"column":37,"nodeType":"45359","messageId":"45360","endLine":506,"endColumn":40,"suggestions":"49221"},{"ruleId":"45357","severity":2,"message":"45358","line":509,"column":31,"nodeType":"45359","messageId":"45360","endLine":509,"endColumn":34,"suggestions":"49222"},{"ruleId":"45357","severity":2,"message":"45358","line":517,"column":50,"nodeType":"45359","messageId":"45360","endLine":517,"endColumn":53,"suggestions":"49223"},{"ruleId":"45357","severity":2,"message":"45358","line":544,"column":8,"nodeType":"45359","messageId":"45360","endLine":544,"endColumn":11,"suggestions":"49224"},{"ruleId":"45357","severity":2,"message":"45358","line":574,"column":32,"nodeType":"45359","messageId":"45360","endLine":574,"endColumn":35,"suggestions":"49225"},{"ruleId":"45357","severity":2,"message":"45358","line":594,"column":16,"nodeType":"45359","messageId":"45360","endLine":594,"endColumn":19,"suggestions":"49226"},{"ruleId":"45357","severity":2,"message":"45358","line":635,"column":49,"nodeType":"45359","messageId":"45360","endLine":635,"endColumn":52,"suggestions":"49227"},{"ruleId":"45357","severity":2,"message":"45358","line":716,"column":49,"nodeType":"45359","messageId":"45360","endLine":716,"endColumn":52,"suggestions":"49228"},{"ruleId":"45357","severity":2,"message":"45358","line":762,"column":74,"nodeType":"45359","messageId":"45360","endLine":762,"endColumn":77,"suggestions":"49229"},{"ruleId":"45357","severity":2,"message":"45358","line":806,"column":49,"nodeType":"45359","messageId":"45360","endLine":806,"endColumn":52,"suggestions":"49230"},{"ruleId":"45357","severity":2,"message":"45358","line":855,"column":37,"nodeType":"45359","messageId":"45360","endLine":855,"endColumn":40,"suggestions":"49231"},{"ruleId":"45357","severity":2,"message":"45358","line":864,"column":27,"nodeType":"45359","messageId":"45360","endLine":864,"endColumn":30,"suggestions":"49232"},{"ruleId":"45357","severity":2,"message":"45358","line":865,"column":27,"nodeType":"45359","messageId":"45360","endLine":865,"endColumn":30,"suggestions":"49233"},{"ruleId":"45357","severity":2,"message":"45358","line":866,"column":27,"nodeType":"45359","messageId":"45360","endLine":866,"endColumn":30,"suggestions":"49234"},{"ruleId":"45357","severity":2,"message":"45358","line":867,"column":27,"nodeType":"45359","messageId":"45360","endLine":867,"endColumn":30,"suggestions":"49235"},{"ruleId":"45357","severity":2,"message":"45358","line":868,"column":27,"nodeType":"45359","messageId":"45360","endLine":868,"endColumn":30,"suggestions":"49236"},{"ruleId":"45357","severity":2,"message":"45358","line":884,"column":27,"nodeType":"45359","messageId":"45360","endLine":884,"endColumn":30,"suggestions":"49237"},{"ruleId":"45357","severity":2,"message":"45358","line":926,"column":41,"nodeType":"45359","messageId":"45360","endLine":926,"endColumn":44,"suggestions":"49238"},{"ruleId":"45357","severity":2,"message":"45358","line":929,"column":40,"nodeType":"45359","messageId":"45360","endLine":929,"endColumn":43,"suggestions":"49239"},{"ruleId":"45357","severity":2,"message":"45358","line":966,"column":46,"nodeType":"45359","messageId":"45360","endLine":966,"endColumn":49,"suggestions":"49240"},{"ruleId":"45357","severity":2,"message":"45358","line":969,"column":27,"nodeType":"45359","messageId":"45360","endLine":969,"endColumn":30,"suggestions":"49241"},{"ruleId":"45357","severity":2,"message":"45358","line":972,"column":27,"nodeType":"45359","messageId":"45360","endLine":972,"endColumn":30,"suggestions":"49242"},{"ruleId":"45357","severity":2,"message":"45358","line":973,"column":27,"nodeType":"45359","messageId":"45360","endLine":973,"endColumn":30,"suggestions":"49243"},{"ruleId":"45357","severity":2,"message":"45358","line":974,"column":27,"nodeType":"45359","messageId":"45360","endLine":974,"endColumn":30,"suggestions":"49244"},{"ruleId":"45357","severity":2,"message":"45358","line":986,"column":43,"nodeType":"45359","messageId":"45360","endLine":986,"endColumn":46,"suggestions":"49245"},{"ruleId":"45357","severity":2,"message":"45358","line":989,"column":27,"nodeType":"45359","messageId":"45360","endLine":989,"endColumn":30,"suggestions":"49246"},{"ruleId":"45357","severity":2,"message":"45358","line":990,"column":27,"nodeType":"45359","messageId":"45360","endLine":990,"endColumn":30,"suggestions":"49247"},{"ruleId":"45357","severity":2,"message":"45358","line":991,"column":27,"nodeType":"45359","messageId":"45360","endLine":991,"endColumn":30,"suggestions":"49248"},{"ruleId":"45357","severity":2,"message":"45358","line":992,"column":27,"nodeType":"45359","messageId":"45360","endLine":992,"endColumn":30,"suggestions":"49249"},{"ruleId":"45357","severity":2,"message":"45358","line":1007,"column":46,"nodeType":"45359","messageId":"45360","endLine":1007,"endColumn":49,"suggestions":"49250"},{"ruleId":"45357","severity":2,"message":"45358","line":1013,"column":16,"nodeType":"45359","messageId":"45360","endLine":1013,"endColumn":19,"suggestions":"49251"},{"ruleId":"45357","severity":2,"message":"45358","line":1016,"column":27,"nodeType":"45359","messageId":"45360","endLine":1016,"endColumn":30,"suggestions":"49252"},{"ruleId":"45357","severity":2,"message":"45358","line":1017,"column":27,"nodeType":"45359","messageId":"45360","endLine":1017,"endColumn":30,"suggestions":"49253"},{"ruleId":"45357","severity":2,"message":"45358","line":1028,"column":65,"nodeType":"45359","messageId":"45360","endLine":1028,"endColumn":68,"suggestions":"49254"},{"ruleId":"45357","severity":2,"message":"45358","line":1038,"column":83,"nodeType":"45359","messageId":"45360","endLine":1038,"endColumn":86,"suggestions":"49255"},{"ruleId":"45357","severity":2,"message":"45358","line":1049,"column":42,"nodeType":"45359","messageId":"45360","endLine":1049,"endColumn":45,"suggestions":"49256"},{"ruleId":"45357","severity":2,"message":"45358","line":1051,"column":27,"nodeType":"45359","messageId":"45360","endLine":1051,"endColumn":30,"suggestions":"49257"},{"ruleId":"45357","severity":2,"message":"45358","line":1058,"column":42,"nodeType":"45359","messageId":"45360","endLine":1058,"endColumn":45,"suggestions":"49258"},{"ruleId":"45357","severity":2,"message":"45358","line":1060,"column":27,"nodeType":"45359","messageId":"45360","endLine":1060,"endColumn":30,"suggestions":"49259"},{"ruleId":"45357","severity":2,"message":"45358","line":1061,"column":27,"nodeType":"45359","messageId":"45360","endLine":1061,"endColumn":30,"suggestions":"49260"},{"ruleId":"45357","severity":2,"message":"45358","line":1069,"column":42,"nodeType":"45359","messageId":"45360","endLine":1069,"endColumn":45,"suggestions":"49261"},{"ruleId":"45357","severity":2,"message":"45358","line":1074,"column":27,"nodeType":"45359","messageId":"45360","endLine":1074,"endColumn":30,"suggestions":"49262"},{"ruleId":"45357","severity":2,"message":"45358","line":1075,"column":27,"nodeType":"45359","messageId":"45360","endLine":1075,"endColumn":30,"suggestions":"49263"},{"ruleId":"45357","severity":2,"message":"45358","line":1086,"column":29,"nodeType":"45359","messageId":"45360","endLine":1086,"endColumn":32,"suggestions":"49264"},{"ruleId":"45357","severity":2,"message":"45358","line":1103,"column":29,"nodeType":"45359","messageId":"45360","endLine":1103,"endColumn":32,"suggestions":"49265"},{"ruleId":"45357","severity":2,"message":"45358","line":1121,"column":17,"nodeType":"45359","messageId":"45360","endLine":1121,"endColumn":20,"suggestions":"49266"},{"ruleId":"45357","severity":2,"message":"45358","line":1155,"column":24,"nodeType":"45359","messageId":"45360","endLine":1155,"endColumn":27,"suggestions":"49267"},{"ruleId":"45357","severity":2,"message":"45358","line":1156,"column":27,"nodeType":"45359","messageId":"45360","endLine":1156,"endColumn":30,"suggestions":"49268"},{"ruleId":"45357","severity":2,"message":"45358","line":1159,"column":27,"nodeType":"45359","messageId":"45360","endLine":1159,"endColumn":30,"suggestions":"49269"},{"ruleId":"45357","severity":2,"message":"45358","line":1174,"column":8,"nodeType":"45359","messageId":"45360","endLine":1174,"endColumn":11,"suggestions":"49270"},{"ruleId":"45357","severity":2,"message":"45358","line":1190,"column":38,"nodeType":"45359","messageId":"45360","endLine":1190,"endColumn":41,"suggestions":"49271"},{"ruleId":"45357","severity":2,"message":"45358","line":1192,"column":16,"nodeType":"45359","messageId":"45360","endLine":1192,"endColumn":19,"suggestions":"49272"},{"ruleId":"45357","severity":2,"message":"45358","line":1192,"column":36,"nodeType":"45359","messageId":"45360","endLine":1192,"endColumn":39,"suggestions":"49273"},{"ruleId":"45357","severity":2,"message":"45358","line":1366,"column":8,"nodeType":"45359","messageId":"45360","endLine":1366,"endColumn":11,"suggestions":"49274"},{"ruleId":"45357","severity":2,"message":"45358","line":1440,"column":8,"nodeType":"45359","messageId":"45360","endLine":1440,"endColumn":11,"suggestions":"49275"},{"ruleId":"45357","severity":2,"message":"45358","line":1448,"column":9,"nodeType":"45359","messageId":"45360","endLine":1448,"endColumn":12,"suggestions":"49276"},{"ruleId":"45357","severity":2,"message":"45358","line":1448,"column":57,"nodeType":"45359","messageId":"45360","endLine":1448,"endColumn":60,"suggestions":"49277"},{"ruleId":"45357","severity":2,"message":"45358","line":1501,"column":8,"nodeType":"45359","messageId":"45360","endLine":1501,"endColumn":11,"suggestions":"49278"},{"ruleId":"45357","severity":2,"message":"45358","line":1536,"column":8,"nodeType":"45359","messageId":"45360","endLine":1536,"endColumn":11,"suggestions":"49279"},{"ruleId":"45357","severity":2,"message":"45358","line":1549,"column":8,"nodeType":"45359","messageId":"45360","endLine":1549,"endColumn":11,"suggestions":"49280"},{"ruleId":"45357","severity":2,"message":"45358","line":1562,"column":8,"nodeType":"45359","messageId":"45360","endLine":1562,"endColumn":11,"suggestions":"49281"},{"ruleId":"45357","severity":2,"message":"45358","line":1577,"column":8,"nodeType":"45359","messageId":"45360","endLine":1577,"endColumn":11,"suggestions":"49282"},{"ruleId":"45357","severity":2,"message":"45358","line":1598,"column":8,"nodeType":"45359","messageId":"45360","endLine":1598,"endColumn":11,"suggestions":"49283"},{"ruleId":"45357","severity":2,"message":"45358","line":1612,"column":8,"nodeType":"45359","messageId":"45360","endLine":1612,"endColumn":11,"suggestions":"49284"},{"ruleId":"45357","severity":2,"message":"45358","line":105,"column":40,"nodeType":"45359","messageId":"45360","endLine":105,"endColumn":43,"suggestions":"49285"},{"ruleId":"45357","severity":2,"message":"45358","line":147,"column":52,"nodeType":"45359","messageId":"45360","endLine":147,"endColumn":55,"suggestions":"49286"},{"ruleId":"45357","severity":2,"message":"45358","line":174,"column":50,"nodeType":"45359","messageId":"45360","endLine":174,"endColumn":53,"suggestions":"49287"},{"ruleId":"45357","severity":2,"message":"45358","line":202,"column":52,"nodeType":"45359","messageId":"45360","endLine":202,"endColumn":55,"suggestions":"49288"},{"ruleId":"45357","severity":2,"message":"45358","line":237,"column":33,"nodeType":"45359","messageId":"45360","endLine":237,"endColumn":36,"suggestions":"49289"},{"ruleId":"45357","severity":2,"message":"45358","line":241,"column":16,"nodeType":"45359","messageId":"45360","endLine":241,"endColumn":19,"suggestions":"49290"},{"ruleId":"45357","severity":2,"message":"45358","line":486,"column":59,"nodeType":"45359","messageId":"45360","endLine":486,"endColumn":62,"suggestions":"49291"},{"ruleId":"45357","severity":2,"message":"45358","line":522,"column":55,"nodeType":"45359","messageId":"45360","endLine":522,"endColumn":58,"suggestions":"49292"},{"ruleId":"45357","severity":2,"message":"45358","line":541,"column":55,"nodeType":"45359","messageId":"45360","endLine":541,"endColumn":58,"suggestions":"49293"},{"ruleId":"45357","severity":2,"message":"45358","line":586,"column":55,"nodeType":"45359","messageId":"45360","endLine":586,"endColumn":58,"suggestions":"49294"},{"ruleId":"45357","severity":2,"message":"45358","line":824,"column":65,"nodeType":"45359","messageId":"45360","endLine":824,"endColumn":68,"suggestions":"49295"},{"ruleId":"45357","severity":2,"message":"45358","line":907,"column":59,"nodeType":"45359","messageId":"45360","endLine":907,"endColumn":62,"suggestions":"49296"},{"ruleId":"45357","severity":2,"message":"45358","line":911,"column":59,"nodeType":"45359","messageId":"45360","endLine":911,"endColumn":62,"suggestions":"49297"},{"ruleId":"45357","severity":2,"message":"45358","line":953,"column":42,"nodeType":"45359","messageId":"45360","endLine":953,"endColumn":45,"suggestions":"49298"},{"ruleId":"45357","severity":2,"message":"45358","line":956,"column":23,"nodeType":"45359","messageId":"45360","endLine":956,"endColumn":26,"suggestions":"49299"},{"ruleId":"45357","severity":2,"message":"45358","line":960,"column":52,"nodeType":"45359","messageId":"45360","endLine":960,"endColumn":55,"suggestions":"49300"},{"ruleId":"45357","severity":2,"message":"45358","line":962,"column":40,"nodeType":"45359","messageId":"45360","endLine":962,"endColumn":43,"suggestions":"49301"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":41,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":44,"suggestions":"49302"},{"ruleId":"45357","severity":2,"message":"45358","line":50,"column":30,"nodeType":"45359","messageId":"45360","endLine":50,"endColumn":33,"suggestions":"49303"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":41,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":44,"suggestions":"49304"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":30,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":33,"suggestions":"49305"},{"ruleId":"45357","severity":2,"message":"45358","line":69,"column":75,"nodeType":"45359","messageId":"45360","endLine":69,"endColumn":78,"suggestions":"49306"},{"ruleId":"45357","severity":2,"message":"45358","line":70,"column":30,"nodeType":"45359","messageId":"45360","endLine":70,"endColumn":33,"suggestions":"49307"},{"ruleId":"45357","severity":2,"message":"45358","line":36,"column":52,"nodeType":"45359","messageId":"45360","endLine":36,"endColumn":55,"suggestions":"49308"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":27,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":30,"suggestions":"49309"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":62,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":65,"suggestions":"49310"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":25,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":28,"suggestions":"49311"},{"ruleId":"45357","severity":2,"message":"45358","line":67,"column":25,"nodeType":"45359","messageId":"45360","endLine":67,"endColumn":28,"suggestions":"49312"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":25,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":28,"suggestions":"49313"},{"ruleId":"45357","severity":2,"message":"45358","line":54,"column":27,"nodeType":"45359","messageId":"45360","endLine":54,"endColumn":30,"suggestions":"49314"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":14,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":17,"suggestions":"49315"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":36,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":39,"suggestions":"49316"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":14,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":17,"suggestions":"49317"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":36,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":39,"suggestions":"49318"},{"ruleId":"45357","severity":2,"message":"45358","line":57,"column":27,"nodeType":"45359","messageId":"45360","endLine":57,"endColumn":30,"suggestions":"49319"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":27,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":30,"suggestions":"49320"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":27,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":30,"suggestions":"49321"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":14,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":17,"suggestions":"49322"},{"ruleId":"45357","severity":2,"message":"45358","line":61,"column":16,"nodeType":"45359","messageId":"45360","endLine":61,"endColumn":19,"suggestions":"49323"},{"ruleId":"45357","severity":2,"message":"45358","line":64,"column":27,"nodeType":"45359","messageId":"45360","endLine":64,"endColumn":30,"suggestions":"49324"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":31,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":34,"suggestions":"49325"},{"ruleId":"45357","severity":2,"message":"45358","line":82,"column":17,"nodeType":"45359","messageId":"45360","endLine":82,"endColumn":20,"suggestions":"49326"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":28,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":31,"suggestions":"49327"},{"ruleId":"45357","severity":2,"message":"45358","line":85,"column":47,"nodeType":"45359","messageId":"45360","endLine":85,"endColumn":50,"suggestions":"49328"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":27,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":30,"suggestions":"49329"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":27,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":30,"suggestions":"49330"},{"ruleId":"45357","severity":2,"message":"45358","line":40,"column":27,"nodeType":"45359","messageId":"45360","endLine":40,"endColumn":30,"suggestions":"49331"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":14,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":17,"suggestions":"49332"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":36,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":39,"suggestions":"49333"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":14,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":17,"suggestions":"49334"},{"ruleId":"45357","severity":2,"message":"45358","line":42,"column":36,"nodeType":"45359","messageId":"45360","endLine":42,"endColumn":39,"suggestions":"49335"},{"ruleId":"45357","severity":2,"message":"45358","line":43,"column":27,"nodeType":"45359","messageId":"45360","endLine":43,"endColumn":30,"suggestions":"49336"},{"ruleId":"45357","severity":2,"message":"45358","line":44,"column":27,"nodeType":"45359","messageId":"45360","endLine":44,"endColumn":30,"suggestions":"49337"},{"ruleId":"45357","severity":2,"message":"45358","line":45,"column":27,"nodeType":"45359","messageId":"45360","endLine":45,"endColumn":30,"suggestions":"49338"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":27,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":30,"suggestions":"49339"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":14,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":17,"suggestions":"49340"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":40,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":43,"suggestions":"49341"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":17,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":20,"suggestions":"49342"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":27,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":30,"suggestions":"49343"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":28,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":31,"suggestions":"49344"},{"ruleId":"45357","severity":2,"message":"45358","line":94,"column":44,"nodeType":"45359","messageId":"45360","endLine":94,"endColumn":47,"suggestions":"49345"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":28,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":31,"suggestions":"49346"},{"ruleId":"45357","severity":2,"message":"45358","line":95,"column":47,"nodeType":"45359","messageId":"45360","endLine":95,"endColumn":50,"suggestions":"49347"},{"ruleId":"45357","severity":2,"message":"45358","line":96,"column":27,"nodeType":"45359","messageId":"45360","endLine":96,"endColumn":30,"suggestions":"49348"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":17,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":20,"suggestions":"49349"},{"ruleId":"45357","severity":2,"message":"45358","line":98,"column":44,"nodeType":"45359","messageId":"45360","endLine":98,"endColumn":47,"suggestions":"49350"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":27,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":30,"suggestions":"49351"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":17,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":20,"suggestions":"49352"},{"ruleId":"45357","severity":2,"message":"45358","line":103,"column":44,"nodeType":"45359","messageId":"45360","endLine":103,"endColumn":47,"suggestions":"49353"},{"ruleId":"45357","severity":2,"message":"45358","line":106,"column":27,"nodeType":"45359","messageId":"45360","endLine":106,"endColumn":30,"suggestions":"49354"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":28,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":31,"suggestions":"49355"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":55,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":58,"suggestions":"49356"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":14,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":17,"suggestions":"49357"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":36,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":39,"suggestions":"49358"},{"ruleId":"45357","severity":2,"message":"45358","line":109,"column":27,"nodeType":"45359","messageId":"45360","endLine":109,"endColumn":30,"suggestions":"49359"},{"ruleId":"45357","severity":2,"message":"45358","line":110,"column":27,"nodeType":"45359","messageId":"45360","endLine":110,"endColumn":30,"suggestions":"49360"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":14,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":17,"suggestions":"49361"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":36,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":39,"suggestions":"49362"},{"ruleId":"45357","severity":2,"message":"45358","line":112,"column":27,"nodeType":"45359","messageId":"45360","endLine":112,"endColumn":30,"suggestions":"49363"},{"ruleId":"45357","severity":2,"message":"45358","line":113,"column":27,"nodeType":"45359","messageId":"45360","endLine":113,"endColumn":30,"suggestions":"49364"},{"ruleId":"45357","severity":2,"message":"45358","line":124,"column":17,"nodeType":"45359","messageId":"45360","endLine":124,"endColumn":20,"suggestions":"49365"},{"ruleId":"45357","severity":2,"message":"45358","line":127,"column":27,"nodeType":"45359","messageId":"45360","endLine":127,"endColumn":30,"suggestions":"49366"},{"ruleId":"45357","severity":2,"message":"45358","line":128,"column":27,"nodeType":"45359","messageId":"45360","endLine":128,"endColumn":30,"suggestions":"49367"},{"ruleId":"45357","severity":2,"message":"45358","line":129,"column":27,"nodeType":"45359","messageId":"45360","endLine":129,"endColumn":30,"suggestions":"49368"},{"ruleId":"45357","severity":2,"message":"45358","line":130,"column":27,"nodeType":"45359","messageId":"45360","endLine":130,"endColumn":30,"suggestions":"49369"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":27,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":30,"suggestions":"49370"},{"ruleId":"45357","severity":2,"message":"45358","line":193,"column":27,"nodeType":"45359","messageId":"45360","endLine":193,"endColumn":30,"suggestions":"49371"},{"ruleId":"45357","severity":2,"message":"45358","line":337,"column":40,"nodeType":"45359","messageId":"45360","endLine":337,"endColumn":43,"suggestions":"49372"},{"ruleId":"45357","severity":2,"message":"45358","line":366,"column":40,"nodeType":"45359","messageId":"45360","endLine":366,"endColumn":43,"suggestions":"49373"},{"ruleId":"45357","severity":2,"message":"45358","line":378,"column":25,"nodeType":"45359","messageId":"45360","endLine":378,"endColumn":28,"suggestions":"49374"},{"ruleId":"45357","severity":2,"message":"45358","line":414,"column":25,"nodeType":"45359","messageId":"45360","endLine":414,"endColumn":28,"suggestions":"49375"},{"ruleId":"45357","severity":2,"message":"45358","line":418,"column":25,"nodeType":"45359","messageId":"45360","endLine":418,"endColumn":28,"suggestions":"49376"},{"ruleId":"45357","severity":2,"message":"45358","line":422,"column":40,"nodeType":"45359","messageId":"45360","endLine":422,"endColumn":43,"suggestions":"49377"},{"ruleId":"45357","severity":2,"message":"45358","line":440,"column":24,"nodeType":"45359","messageId":"45360","endLine":440,"endColumn":27,"suggestions":"49378"},{"ruleId":"45357","severity":2,"message":"45358","line":453,"column":33,"nodeType":"45359","messageId":"45360","endLine":453,"endColumn":36,"suggestions":"49379"},{"ruleId":"45357","severity":2,"message":"45358","line":468,"column":32,"nodeType":"45359","messageId":"45360","endLine":468,"endColumn":35,"suggestions":"49380"},{"ruleId":"45357","severity":2,"message":"45358","line":482,"column":15,"nodeType":"45359","messageId":"45360","endLine":482,"endColumn":18,"suggestions":"49381"},{"ruleId":"45357","severity":2,"message":"45358","line":487,"column":25,"nodeType":"45359","messageId":"45360","endLine":487,"endColumn":28,"suggestions":"49382"},{"ruleId":"45357","severity":2,"message":"45358","line":491,"column":25,"nodeType":"45359","messageId":"45360","endLine":491,"endColumn":28,"suggestions":"49383"},{"ruleId":"45357","severity":2,"message":"45358","line":518,"column":40,"nodeType":"45359","messageId":"45360","endLine":518,"endColumn":43,"suggestions":"49384"},{"ruleId":"45357","severity":2,"message":"45358","line":529,"column":25,"nodeType":"45359","messageId":"45360","endLine":529,"endColumn":28,"suggestions":"49385"},{"ruleId":"45357","severity":2,"message":"45358","line":637,"column":40,"nodeType":"45359","messageId":"45360","endLine":637,"endColumn":43,"suggestions":"49386"},{"ruleId":"45357","severity":2,"message":"45358","line":668,"column":40,"nodeType":"45359","messageId":"45360","endLine":668,"endColumn":43,"suggestions":"49387"},{"ruleId":"45357","severity":2,"message":"45358","line":677,"column":25,"nodeType":"45359","messageId":"45360","endLine":677,"endColumn":28,"suggestions":"49388"},{"ruleId":"45357","severity":2,"message":"45358","line":706,"column":25,"nodeType":"45359","messageId":"45360","endLine":706,"endColumn":28,"suggestions":"49389"},{"ruleId":"45357","severity":2,"message":"45358","line":710,"column":25,"nodeType":"45359","messageId":"45360","endLine":710,"endColumn":28,"suggestions":"49390"},{"ruleId":"45357","severity":2,"message":"45358","line":842,"column":43,"nodeType":"45359","messageId":"45360","endLine":842,"endColumn":46,"suggestions":"49391"},{"ruleId":"45357","severity":2,"message":"45358","line":884,"column":43,"nodeType":"45359","messageId":"45360","endLine":884,"endColumn":46,"suggestions":"49392"},{"ruleId":"45357","severity":2,"message":"45358","line":925,"column":19,"nodeType":"45359","messageId":"45360","endLine":925,"endColumn":22,"suggestions":"49393"},{"ruleId":"45357","severity":2,"message":"45358","line":953,"column":18,"nodeType":"45359","messageId":"45360","endLine":953,"endColumn":21,"suggestions":"49394"},{"ruleId":"45357","severity":2,"message":"45358","line":957,"column":44,"nodeType":"45359","messageId":"45360","endLine":957,"endColumn":47,"suggestions":"49395"},{"ruleId":"45357","severity":2,"message":"45358","line":1005,"column":19,"nodeType":"45359","messageId":"45360","endLine":1005,"endColumn":22,"suggestions":"49396"},{"ruleId":"45357","severity":2,"message":"45358","line":1011,"column":43,"nodeType":"45359","messageId":"45360","endLine":1011,"endColumn":46,"suggestions":"49397"},{"ruleId":"45357","severity":2,"message":"45358","line":1052,"column":19,"nodeType":"45359","messageId":"45360","endLine":1052,"endColumn":22,"suggestions":"49398"},{"ruleId":"45357","severity":2,"message":"45358","line":1058,"column":43,"nodeType":"45359","messageId":"45360","endLine":1058,"endColumn":46,"suggestions":"49399"},{"ruleId":"45357","severity":2,"message":"45358","line":1121,"column":19,"nodeType":"45359","messageId":"45360","endLine":1121,"endColumn":22,"suggestions":"49400"},{"ruleId":"45357","severity":2,"message":"45358","line":1143,"column":18,"nodeType":"45359","messageId":"45360","endLine":1143,"endColumn":21,"suggestions":"49401"},{"ruleId":"45357","severity":2,"message":"45358","line":1169,"column":41,"nodeType":"45359","messageId":"45360","endLine":1169,"endColumn":44,"suggestions":"49402"},{"ruleId":"45357","severity":2,"message":"45358","line":1170,"column":36,"nodeType":"45359","messageId":"45360","endLine":1170,"endColumn":39,"suggestions":"49403"},{"ruleId":"45357","severity":2,"message":"45358","line":1209,"column":17,"nodeType":"45359","messageId":"45360","endLine":1209,"endColumn":20,"suggestions":"49404"},{"ruleId":"45357","severity":2,"message":"45358","line":1229,"column":32,"nodeType":"45359","messageId":"45360","endLine":1229,"endColumn":35,"suggestions":"49405"},{"ruleId":"45357","severity":2,"message":"45358","line":381,"column":27,"nodeType":"45359","messageId":"45360","endLine":381,"endColumn":30,"suggestions":"49406"},{"ruleId":"45357","severity":2,"message":"45358","line":382,"column":14,"nodeType":"45359","messageId":"45360","endLine":382,"endColumn":17,"suggestions":"49407"},{"ruleId":"45357","severity":2,"message":"45358","line":382,"column":36,"nodeType":"45359","messageId":"45360","endLine":382,"endColumn":39,"suggestions":"49408"},{"ruleId":"45357","severity":2,"message":"45358","line":383,"column":14,"nodeType":"45359","messageId":"45360","endLine":383,"endColumn":17,"suggestions":"49409"},{"ruleId":"45357","severity":2,"message":"45358","line":383,"column":36,"nodeType":"45359","messageId":"45360","endLine":383,"endColumn":39,"suggestions":"49410"},{"ruleId":"45357","severity":2,"message":"45358","line":384,"column":27,"nodeType":"45359","messageId":"45360","endLine":384,"endColumn":30,"suggestions":"49411"},{"ruleId":"45357","severity":2,"message":"45358","line":385,"column":27,"nodeType":"45359","messageId":"45360","endLine":385,"endColumn":30,"suggestions":"49412"},{"ruleId":"45357","severity":2,"message":"45358","line":386,"column":27,"nodeType":"45359","messageId":"45360","endLine":386,"endColumn":30,"suggestions":"49413"},{"ruleId":"45357","severity":2,"message":"45358","line":387,"column":27,"nodeType":"45359","messageId":"45360","endLine":387,"endColumn":30,"suggestions":"49414"},{"ruleId":"45357","severity":2,"message":"45358","line":388,"column":27,"nodeType":"45359","messageId":"45360","endLine":388,"endColumn":30,"suggestions":"49415"},{"ruleId":"45357","severity":2,"message":"45358","line":389,"column":14,"nodeType":"45359","messageId":"45360","endLine":389,"endColumn":17,"suggestions":"49416"},{"ruleId":"45357","severity":2,"message":"45358","line":389,"column":40,"nodeType":"45359","messageId":"45360","endLine":389,"endColumn":43,"suggestions":"49417"},{"ruleId":"45357","severity":2,"message":"45358","line":390,"column":27,"nodeType":"45359","messageId":"45360","endLine":390,"endColumn":30,"suggestions":"49418"},{"ruleId":"45357","severity":2,"message":"45358","line":391,"column":31,"nodeType":"45359","messageId":"45360","endLine":391,"endColumn":34,"suggestions":"49419"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":44,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":47,"suggestions":"49420"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":29,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":32,"suggestions":"49421"},{"ruleId":"45357","severity":2,"message":"45358","line":39,"column":52,"nodeType":"45359","messageId":"45360","endLine":39,"endColumn":55,"suggestions":"49422"},{"ruleId":"45357","severity":2,"message":"45358","line":72,"column":44,"nodeType":"45359","messageId":"45360","endLine":72,"endColumn":47,"suggestions":"49423"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":29,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":32,"suggestions":"49424"},{"ruleId":"45357","severity":2,"message":"45358","line":73,"column":52,"nodeType":"45359","messageId":"45360","endLine":73,"endColumn":55,"suggestions":"49425"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":44,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":47,"suggestions":"49426"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":29,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":32,"suggestions":"49427"},{"ruleId":"45357","severity":2,"message":"45358","line":108,"column":52,"nodeType":"45359","messageId":"45360","endLine":108,"endColumn":55,"suggestions":"49428"},{"ruleId":"45357","severity":2,"message":"45358","line":133,"column":8,"nodeType":"45359","messageId":"45360","endLine":133,"endColumn":11,"suggestions":"49429"},{"ruleId":"45357","severity":2,"message":"45358","line":159,"column":8,"nodeType":"45359","messageId":"45360","endLine":159,"endColumn":11,"suggestions":"49430"},{"ruleId":"45357","severity":2,"message":"45358","line":178,"column":8,"nodeType":"45359","messageId":"45360","endLine":178,"endColumn":11,"suggestions":"49431"},{"ruleId":"45357","severity":2,"message":"45358","line":252,"column":31,"nodeType":"45359","messageId":"45360","endLine":252,"endColumn":34,"suggestions":"49432"},{"ruleId":"45357","severity":2,"message":"45358","line":252,"column":45,"nodeType":"45359","messageId":"45360","endLine":252,"endColumn":48,"suggestions":"49433"},{"ruleId":"45357","severity":2,"message":"45358","line":252,"column":51,"nodeType":"45359","messageId":"45360","endLine":252,"endColumn":54,"suggestions":"49434"},{"ruleId":"45357","severity":2,"message":"45358","line":253,"column":14,"nodeType":"45359","messageId":"45360","endLine":253,"endColumn":17,"suggestions":"49435"},{"ruleId":"45357","severity":2,"message":"45358","line":55,"column":49,"nodeType":"45359","messageId":"45360","endLine":55,"endColumn":52,"suggestions":"49436"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":44,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":47,"suggestions":"49437"},{"ruleId":"45357","severity":2,"message":"45358","line":60,"column":81,"nodeType":"45359","messageId":"45360","endLine":60,"endColumn":84,"suggestions":"49438"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":43,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":46,"suggestions":"49439"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":80,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":83,"suggestions":"49440"},{"ruleId":"45357","severity":2,"message":"45358","line":104,"column":49,"nodeType":"45359","messageId":"45360","endLine":104,"endColumn":52,"suggestions":"49441"},{"ruleId":"45357","severity":2,"message":"45358","line":107,"column":46,"nodeType":"45359","messageId":"45360","endLine":107,"endColumn":49,"suggestions":"49442"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":43,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":46,"suggestions":"49443"},{"ruleId":"45357","severity":2,"message":"45358","line":111,"column":80,"nodeType":"45359","messageId":"45360","endLine":111,"endColumn":83,"suggestions":"49444"},{"ruleId":"45568","severity":1,"message":"45569","line":29,"column":5,"nodeType":"45570","endLine":29,"endColumn":43,"suppressions":"49445"},{"ruleId":"45568","severity":1,"message":"45569","line":17,"column":12,"nodeType":"45570","endLine":17,"endColumn":88,"suppressions":"49446"},{"ruleId":"45568","severity":1,"message":"45569","line":21,"column":12,"nodeType":"45570","endLine":21,"endColumn":88,"suppressions":"49447"},{"ruleId":"49448","severity":2,"message":"49449","line":30,"column":5,"nodeType":null,"endLine":30,"endColumn":12,"suppressions":"49450"},{"ruleId":"49448","severity":2,"message":"49451","line":30,"column":5,"nodeType":null,"endLine":30,"endColumn":12,"suppressions":"49452"},{"ruleId":"49448","severity":2,"message":"49453","line":34,"column":5,"nodeType":null,"endLine":34,"endColumn":12,"suppressions":"49454"},{"ruleId":"49448","severity":2,"message":"49455","line":29,"column":5,"nodeType":null,"endLine":29,"endColumn":12,"suppressions":"49456"},{"ruleId":"49448","severity":2,"message":"49457","line":30,"column":5,"nodeType":null,"endLine":30,"endColumn":12,"suppressions":"49458"},{"ruleId":"45357","severity":2,"message":"45358","line":23,"column":61,"nodeType":"45359","messageId":"45360","endLine":23,"endColumn":64,"suggestions":"49459"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":8,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":11,"suggestions":"49460"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":64,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":67,"suggestions":"49461"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":91,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":94,"suggestions":"49462"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":67,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":70,"suggestions":"49463"},{"ruleId":"45357","severity":2,"message":"45358","line":51,"column":70,"nodeType":"45359","messageId":"45360","endLine":51,"endColumn":73,"suggestions":"49464"},{"ruleId":"45357","severity":2,"message":"45358","line":56,"column":66,"nodeType":"45359","messageId":"45360","endLine":56,"endColumn":69,"suggestions":"49465"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":71,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":74,"suggestions":"49466"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":77,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":80,"suggestions":"49467"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":80,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":83,"suggestions":"49468"},{"ruleId":"45357","severity":2,"message":"45358","line":71,"column":55,"nodeType":"45359","messageId":"45360","endLine":71,"endColumn":58,"suggestions":"49469"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":48,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":51,"suggestions":"49470"},{"ruleId":"45357","severity":2,"message":"45358","line":193,"column":47,"nodeType":"45359","messageId":"45360","endLine":193,"endColumn":50,"suggestions":"49471"},{"ruleId":"45357","severity":2,"message":"45358","line":196,"column":64,"nodeType":"45359","messageId":"45360","endLine":196,"endColumn":67,"suggestions":"49472"},{"ruleId":"45357","severity":2,"message":"45358","line":197,"column":48,"nodeType":"45359","messageId":"45360","endLine":197,"endColumn":51,"suggestions":"49473"},{"ruleId":"45357","severity":2,"message":"45358","line":200,"column":34,"nodeType":"45359","messageId":"45360","endLine":200,"endColumn":37,"suggestions":"49474"},{"ruleId":"45357","severity":2,"message":"45358","line":250,"column":20,"nodeType":"45359","messageId":"45360","endLine":250,"endColumn":23,"suggestions":"49475"},{"ruleId":"45357","severity":2,"message":"45358","line":255,"column":27,"nodeType":"45359","messageId":"45360","endLine":255,"endColumn":30,"suggestions":"49476"},{"ruleId":"45357","severity":2,"message":"45358","line":256,"column":20,"nodeType":"45359","messageId":"45360","endLine":256,"endColumn":23,"suggestions":"49477"},{"ruleId":"45357","severity":2,"message":"45358","line":261,"column":27,"nodeType":"45359","messageId":"45360","endLine":261,"endColumn":30,"suggestions":"49478"},{"ruleId":"45357","severity":2,"message":"45358","line":262,"column":20,"nodeType":"45359","messageId":"45360","endLine":262,"endColumn":23,"suggestions":"49479"},{"ruleId":"45357","severity":2,"message":"45358","line":324,"column":37,"nodeType":"45359","messageId":"45360","endLine":324,"endColumn":40,"suggestions":"49480"},{"ruleId":"45357","severity":2,"message":"45358","line":331,"column":28,"nodeType":"45359","messageId":"45360","endLine":331,"endColumn":31,"suggestions":"49481"},{"ruleId":"45357","severity":2,"message":"45358","line":332,"column":28,"nodeType":"45359","messageId":"45360","endLine":332,"endColumn":31,"suggestions":"49482"},{"ruleId":"45357","severity":2,"message":"45358","line":333,"column":28,"nodeType":"45359","messageId":"45360","endLine":333,"endColumn":31,"suggestions":"49483"},{"ruleId":"45357","severity":2,"message":"45358","line":334,"column":28,"nodeType":"45359","messageId":"45360","endLine":334,"endColumn":31,"suggestions":"49484"},{"ruleId":"45357","severity":2,"message":"45358","line":335,"column":28,"nodeType":"45359","messageId":"45360","endLine":335,"endColumn":31,"suggestions":"49485"},{"ruleId":"45357","severity":2,"message":"45358","line":336,"column":28,"nodeType":"45359","messageId":"45360","endLine":336,"endColumn":31,"suggestions":"49486"},{"ruleId":"45357","severity":2,"message":"45358","line":337,"column":28,"nodeType":"45359","messageId":"45360","endLine":337,"endColumn":31,"suggestions":"49487"},{"ruleId":"45357","severity":2,"message":"45358","line":338,"column":28,"nodeType":"45359","messageId":"45360","endLine":338,"endColumn":31,"suggestions":"49488"},{"ruleId":"45357","severity":2,"message":"45358","line":339,"column":28,"nodeType":"45359","messageId":"45360","endLine":339,"endColumn":31,"suggestions":"49489"},{"ruleId":"45357","severity":2,"message":"45358","line":340,"column":28,"nodeType":"45359","messageId":"45360","endLine":340,"endColumn":31,"suggestions":"49490"},{"ruleId":"45357","severity":2,"message":"45358","line":341,"column":28,"nodeType":"45359","messageId":"45360","endLine":341,"endColumn":31,"suggestions":"49491"},{"ruleId":"45357","severity":2,"message":"45358","line":351,"column":54,"nodeType":"45359","messageId":"45360","endLine":351,"endColumn":57,"suggestions":"49492"},{"ruleId":"45357","severity":2,"message":"45358","line":369,"column":84,"nodeType":"45359","messageId":"45360","endLine":369,"endColumn":87,"suggestions":"49493"},{"ruleId":"45357","severity":2,"message":"45358","line":370,"column":80,"nodeType":"45359","messageId":"45360","endLine":370,"endColumn":83,"suggestions":"49494"},{"ruleId":"45357","severity":2,"message":"45358","line":396,"column":84,"nodeType":"45359","messageId":"45360","endLine":396,"endColumn":87,"suggestions":"49495"},{"ruleId":"45357","severity":2,"message":"45358","line":397,"column":80,"nodeType":"45359","messageId":"45360","endLine":397,"endColumn":83,"suggestions":"49496"},{"ruleId":"45357","severity":2,"message":"45358","line":16,"column":41,"nodeType":"45359","messageId":"45360","endLine":16,"endColumn":44,"suggestions":"49497"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":16,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":19,"suggestions":"49498"},{"ruleId":"45357","severity":2,"message":"45358","line":22,"column":41,"nodeType":"45359","messageId":"45360","endLine":22,"endColumn":44,"suggestions":"49499"},{"ruleId":"45357","severity":2,"message":"45358","line":31,"column":16,"nodeType":"45359","messageId":"45360","endLine":31,"endColumn":19,"suggestions":"49500"},{"ruleId":"45357","severity":2,"message":"45358","line":53,"column":20,"nodeType":"45359","messageId":"45360","endLine":53,"endColumn":23,"suggestions":"49501"},{"ruleId":"45357","severity":2,"message":"45358","line":81,"column":20,"nodeType":"45359","messageId":"45360","endLine":81,"endColumn":23,"suggestions":"49502"},{"ruleId":"45357","severity":2,"message":"45358","line":87,"column":22,"nodeType":"45359","messageId":"45360","endLine":87,"endColumn":25,"suggestions":"49503"},{"ruleId":"45357","severity":2,"message":"45358","line":118,"column":20,"nodeType":"45359","messageId":"45360","endLine":118,"endColumn":23,"suggestions":"49504"},{"ruleId":"45357","severity":2,"message":"45358","line":130,"column":30,"nodeType":"45359","messageId":"45360","endLine":130,"endColumn":33,"suggestions":"49505"},{"ruleId":"45357","severity":2,"message":"45358","line":157,"column":16,"nodeType":"45359","messageId":"45360","endLine":157,"endColumn":19,"suggestions":"49506"},{"ruleId":"45357","severity":2,"message":"45358","line":204,"column":16,"nodeType":"45359","messageId":"45360","endLine":204,"endColumn":19,"suggestions":"49507"},{"ruleId":"45357","severity":2,"message":"45358","line":237,"column":20,"nodeType":"45359","messageId":"45360","endLine":237,"endColumn":23,"suggestions":"49508"},{"ruleId":"45357","severity":2,"message":"45358","line":292,"column":16,"nodeType":"45359","messageId":"45360","endLine":292,"endColumn":19,"suggestions":"49509"},{"ruleId":"45357","severity":2,"message":"45358","line":345,"column":16,"nodeType":"45359","messageId":"45360","endLine":345,"endColumn":19,"suggestions":"49510"},{"ruleId":"45357","severity":2,"message":"45358","line":358,"column":16,"nodeType":"45359","messageId":"45360","endLine":358,"endColumn":19,"suggestions":"49511"},{"ruleId":"45357","severity":2,"message":"45358","line":395,"column":16,"nodeType":"45359","messageId":"45360","endLine":395,"endColumn":19,"suggestions":"49512"},{"ruleId":"45357","severity":2,"message":"45358","line":474,"column":16,"nodeType":"45359","messageId":"45360","endLine":474,"endColumn":19,"suggestions":"49513"},{"ruleId":"45357","severity":2,"message":"45358","line":497,"column":22,"nodeType":"45359","messageId":"45360","endLine":497,"endColumn":25,"suggestions":"49514"},{"ruleId":"45357","severity":2,"message":"45358","line":524,"column":21,"nodeType":"45359","messageId":"45360","endLine":524,"endColumn":24,"suggestions":"49515"},{"ruleId":"45357","severity":2,"message":"45358","line":554,"column":22,"nodeType":"45359","messageId":"45360","endLine":554,"endColumn":25,"suggestions":"49516"},{"ruleId":"45357","severity":2,"message":"45358","line":569,"column":29,"nodeType":"45359","messageId":"45360","endLine":569,"endColumn":32,"suggestions":"49517"},{"ruleId":"45357","severity":2,"message":"45358","line":589,"column":22,"nodeType":"45359","messageId":"45360","endLine":589,"endColumn":25,"suggestions":"49518"},{"ruleId":"45357","severity":2,"message":"45358","line":613,"column":20,"nodeType":"45359","messageId":"45360","endLine":613,"endColumn":23,"suggestions":"49519"},{"ruleId":"45357","severity":2,"message":"45358","line":623,"column":23,"nodeType":"45359","messageId":"45360","endLine":623,"endColumn":26,"suggestions":"49520"},{"ruleId":"45357","severity":2,"message":"45358","line":633,"column":29,"nodeType":"45359","messageId":"45360","endLine":633,"endColumn":32,"suggestions":"49521"},{"ruleId":"45357","severity":2,"message":"45358","line":729,"column":16,"nodeType":"45359","messageId":"45360","endLine":729,"endColumn":19,"suggestions":"49522"},{"ruleId":"45357","severity":2,"message":"45358","line":743,"column":20,"nodeType":"45359","messageId":"45360","endLine":743,"endColumn":23,"suggestions":"49523"},{"ruleId":"45357","severity":2,"message":"45358","line":752,"column":15,"nodeType":"45359","messageId":"45360","endLine":752,"endColumn":18,"suggestions":"49524"},{"ruleId":"45357","severity":2,"message":"45358","line":761,"column":18,"nodeType":"45359","messageId":"45360","endLine":761,"endColumn":21,"suggestions":"49525"},{"ruleId":"45357","severity":2,"message":"45358","line":770,"column":15,"nodeType":"45359","messageId":"45360","endLine":770,"endColumn":18,"suggestions":"49526"},{"ruleId":"45357","severity":2,"message":"45358","line":786,"column":20,"nodeType":"45359","messageId":"45360","endLine":786,"endColumn":23,"suggestions":"49527"},{"ruleId":"45357","severity":2,"message":"45358","line":799,"column":26,"nodeType":"45359","messageId":"45360","endLine":799,"endColumn":29,"suggestions":"49528"},{"ruleId":"45357","severity":2,"message":"45358","line":813,"column":22,"nodeType":"45359","messageId":"45360","endLine":813,"endColumn":25,"suggestions":"49529"},{"ruleId":"45357","severity":2,"message":"45358","line":825,"column":22,"nodeType":"45359","messageId":"45360","endLine":825,"endColumn":25,"suggestions":"49530"},{"ruleId":"45357","severity":2,"message":"45358","line":858,"column":22,"nodeType":"45359","messageId":"45360","endLine":858,"endColumn":25,"suggestions":"49531"},{"ruleId":"45357","severity":2,"message":"45358","line":868,"column":22,"nodeType":"45359","messageId":"45360","endLine":868,"endColumn":25,"suggestions":"49532"},{"ruleId":"45357","severity":2,"message":"45358","line":878,"column":16,"nodeType":"45359","messageId":"45360","endLine":878,"endColumn":19,"suggestions":"49533"},{"ruleId":"45357","severity":2,"message":"45358","line":884,"column":24,"nodeType":"45359","messageId":"45360","endLine":884,"endColumn":27,"suggestions":"49534"},{"ruleId":"45357","severity":2,"message":"45358","line":895,"column":29,"nodeType":"45359","messageId":"45360","endLine":895,"endColumn":32,"suggestions":"49535"},{"ruleId":"45357","severity":2,"message":"45358","line":942,"column":14,"nodeType":"45359","messageId":"45360","endLine":942,"endColumn":17,"suggestions":"49536"},{"ruleId":"45357","severity":2,"message":"45358","line":962,"column":15,"nodeType":"45359","messageId":"45360","endLine":962,"endColumn":18,"suggestions":"49537"},{"ruleId":"45357","severity":2,"message":"45358","line":986,"column":16,"nodeType":"45359","messageId":"45360","endLine":986,"endColumn":19,"suggestions":"49538"},{"ruleId":"45357","severity":2,"message":"45358","line":1027,"column":16,"nodeType":"45359","messageId":"45360","endLine":1027,"endColumn":19,"suggestions":"49539"},{"ruleId":"45357","severity":2,"message":"45358","line":1040,"column":16,"nodeType":"45359","messageId":"45360","endLine":1040,"endColumn":19,"suggestions":"49540"},{"ruleId":"45357","severity":2,"message":"45358","line":1051,"column":29,"nodeType":"45359","messageId":"45360","endLine":1051,"endColumn":32,"suggestions":"49541"},{"ruleId":"45357","severity":2,"message":"45358","line":1052,"column":29,"nodeType":"45359","messageId":"45360","endLine":1052,"endColumn":32,"suggestions":"49542"},{"ruleId":"45357","severity":2,"message":"45358","line":1095,"column":16,"nodeType":"45359","messageId":"45360","endLine":1095,"endColumn":19,"suggestions":"49543"},{"ruleId":"45357","severity":2,"message":"45358","line":1116,"column":18,"nodeType":"45359","messageId":"45360","endLine":1116,"endColumn":21,"suggestions":"49544"},{"ruleId":"45357","severity":2,"message":"45358","line":1128,"column":27,"nodeType":"45359","messageId":"45360","endLine":1128,"endColumn":30,"suggestions":"49545"},{"ruleId":"45357","severity":2,"message":"45358","line":1149,"column":16,"nodeType":"45359","messageId":"45360","endLine":1149,"endColumn":19,"suggestions":"49546"},{"ruleId":"45357","severity":2,"message":"45358","line":1323,"column":27,"nodeType":"45359","messageId":"45360","endLine":1323,"endColumn":30,"suggestions":"49547"},{"ruleId":"45357","severity":2,"message":"45358","line":1351,"column":19,"nodeType":"45359","messageId":"45360","endLine":1351,"endColumn":22,"suggestions":"49548"},{"ruleId":"45357","severity":2,"message":"45358","line":1369,"column":27,"nodeType":"45359","messageId":"45360","endLine":1369,"endColumn":30,"suggestions":"49549"},{"ruleId":"45357","severity":2,"message":"45358","line":1380,"column":20,"nodeType":"45359","messageId":"45360","endLine":1380,"endColumn":23,"suggestions":"49550"},{"ruleId":"45357","severity":2,"message":"45358","line":1388,"column":16,"nodeType":"45359","messageId":"45360","endLine":1388,"endColumn":19,"suggestions":"49551"},{"ruleId":"45357","severity":2,"message":"45358","line":1395,"column":21,"nodeType":"45359","messageId":"45360","endLine":1395,"endColumn":24,"suggestions":"49552"},{"ruleId":"45357","severity":2,"message":"45358","line":1404,"column":21,"nodeType":"45359","messageId":"45360","endLine":1404,"endColumn":24,"suggestions":"49553"},{"ruleId":"45357","severity":2,"message":"45358","line":1424,"column":17,"nodeType":"45359","messageId":"45360","endLine":1424,"endColumn":20,"suggestions":"49554"},{"ruleId":"45357","severity":2,"message":"45358","line":1439,"column":17,"nodeType":"45359","messageId":"45360","endLine":1439,"endColumn":20,"suggestions":"49555"},{"ruleId":"45357","severity":2,"message":"45358","line":46,"column":23,"nodeType":"45359","messageId":"45360","endLine":46,"endColumn":26,"suggestions":"49556"},{"ruleId":"45357","severity":2,"message":"45358","line":65,"column":64,"nodeType":"45359","messageId":"45360","endLine":65,"endColumn":67,"suggestions":"49557"},{"ruleId":"45357","severity":2,"message":"45358","line":63,"column":43,"nodeType":"45359","messageId":"45360","endLine":63,"endColumn":46,"suggestions":"49558"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":43,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":46,"suggestions":"49559"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":43,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":46,"suggestions":"49560"},{"ruleId":"45357","severity":2,"message":"45358","line":101,"column":43,"nodeType":"45359","messageId":"45360","endLine":101,"endColumn":46,"suggestions":"49561"},{"ruleId":"45357","severity":2,"message":"45358","line":41,"column":21,"nodeType":"45359","messageId":"45360","endLine":41,"endColumn":24,"suggestions":"49562"},{"ruleId":"45357","severity":2,"message":"45358","line":38,"column":19,"nodeType":"45359","messageId":"45360","endLine":38,"endColumn":22,"suggestions":"49563"},{"ruleId":"45357","severity":2,"message":"45358","line":47,"column":19,"nodeType":"45359","messageId":"45360","endLine":47,"endColumn":22,"suggestions":"49564"},{"ruleId":"45357","severity":2,"message":"45358","line":76,"column":34,"nodeType":"45359","messageId":"45360","endLine":76,"endColumn":37,"suggestions":"49565"},{"ruleId":"45357","severity":2,"message":"45358","line":90,"column":10,"nodeType":"45359","messageId":"45360","endLine":90,"endColumn":13,"suggestions":"49566"},{"ruleId":"45357","severity":2,"message":"45358","line":29,"column":9,"nodeType":"45359","messageId":"45360","endLine":29,"endColumn":12,"suggestions":"49567"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":18,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":21,"suggestions":"49568"},{"ruleId":"45357","severity":2,"message":"45358","line":35,"column":57,"nodeType":"45359","messageId":"45360","endLine":35,"endColumn":60,"suggestions":"49569"},{"ruleId":"45357","severity":2,"message":"45358","line":86,"column":43,"nodeType":"45359","messageId":"45360","endLine":86,"endColumn":46,"suggestions":"49570"},{"ruleId":"45357","severity":2,"message":"45358","line":93,"column":15,"nodeType":"45359","messageId":"45360","endLine":93,"endColumn":18,"suggestions":"49571"},{"ruleId":"45357","severity":2,"message":"45358","line":114,"column":43,"nodeType":"45359","messageId":"45360","endLine":114,"endColumn":46,"suggestions":"49572"},{"ruleId":"45357","severity":2,"message":"45358","line":115,"column":48,"nodeType":"45359","messageId":"45360","endLine":115,"endColumn":51,"suggestions":"49573"},{"ruleId":"45357","severity":2,"message":"45358","line":134,"column":43,"nodeType":"45359","messageId":"45360","endLine":134,"endColumn":46,"suggestions":"49574"},{"ruleId":"45357","severity":2,"message":"45358","line":163,"column":43,"nodeType":"45359","messageId":"45360","endLine":163,"endColumn":46,"suggestions":"49575"},{"ruleId":"45357","severity":2,"message":"45358","line":169,"column":28,"nodeType":"45359","messageId":"45360","endLine":169,"endColumn":31,"suggestions":"49576"},{"ruleId":"45357","severity":2,"message":"45358","line":187,"column":43,"nodeType":"45359","messageId":"45360","endLine":187,"endColumn":46,"suggestions":"49577"},{"ruleId":"45357","severity":2,"message":"45358","line":216,"column":43,"nodeType":"45359","messageId":"45360","endLine":216,"endColumn":46,"suggestions":"49578"},{"ruleId":"45357","severity":2,"message":"45358","line":220,"column":42,"nodeType":"45359","messageId":"45360","endLine":220,"endColumn":45,"suggestions":"49579"},{"ruleId":"45357","severity":2,"message":"45358","line":252,"column":43,"nodeType":"45359","messageId":"45360","endLine":252,"endColumn":46,"suggestions":"49580"},{"ruleId":"45357","severity":2,"message":"45358","line":287,"column":43,"nodeType":"45359","messageId":"45360","endLine":287,"endColumn":46,"suggestions":"49581"},{"ruleId":"45357","severity":2,"message":"45358","line":288,"column":40,"nodeType":"45359","messageId":"45360","endLine":288,"endColumn":43,"suggestions":"49582"},{"ruleId":"45357","severity":2,"message":"45358","line":318,"column":43,"nodeType":"45359","messageId":"45360","endLine":318,"endColumn":46,"suggestions":"49583"},{"ruleId":"45357","severity":2,"message":"45358","line":319,"column":48,"nodeType":"45359","messageId":"45360","endLine":319,"endColumn":51,"suggestions":"49584"},{"ruleId":"45357","severity":2,"message":"45358","line":355,"column":43,"nodeType":"45359","messageId":"45360","endLine":355,"endColumn":46,"suggestions":"49585"},{"ruleId":"45357","severity":2,"message":"45358","line":356,"column":48,"nodeType":"45359","messageId":"45360","endLine":356,"endColumn":51,"suggestions":"49586"},{"ruleId":"45357","severity":2,"message":"45358","line":358,"column":13,"nodeType":"45359","messageId":"45360","endLine":358,"endColumn":16,"suggestions":"49587"},{"ruleId":"45357","severity":2,"message":"45358","line":361,"column":13,"nodeType":"45359","messageId":"45360","endLine":361,"endColumn":16,"suggestions":"49588"},{"ruleId":"45357","severity":2,"message":"45358","line":405,"column":61,"nodeType":"45359","messageId":"45360","endLine":405,"endColumn":64,"suggestions":"49589"},{"ruleId":"45357","severity":2,"message":"45358","line":445,"column":43,"nodeType":"45359","messageId":"45360","endLine":445,"endColumn":46,"suggestions":"49590"},{"ruleId":"45357","severity":2,"message":"45358","line":449,"column":36,"nodeType":"45359","messageId":"45360","endLine":449,"endColumn":39,"suggestions":"49591"},{"ruleId":"45357","severity":2,"message":"45358","line":450,"column":36,"nodeType":"45359","messageId":"45360","endLine":450,"endColumn":39,"suggestions":"49592"},{"ruleId":"45357","severity":2,"message":"45358","line":474,"column":43,"nodeType":"45359","messageId":"45360","endLine":474,"endColumn":46,"suggestions":"49593"},{"ruleId":"45357","severity":2,"message":"45358","line":480,"column":15,"nodeType":"45359","messageId":"45360","endLine":480,"endColumn":18,"suggestions":"49594"},{"ruleId":"45357","severity":2,"message":"45358","line":507,"column":43,"nodeType":"45359","messageId":"45360","endLine":507,"endColumn":46,"suggestions":"49595"},{"ruleId":"45357","severity":2,"message":"45358","line":512,"column":30,"nodeType":"45359","messageId":"45360","endLine":512,"endColumn":33,"suggestions":"49596"},{"ruleId":"45357","severity":2,"message":"45358","line":537,"column":43,"nodeType":"45359","messageId":"45360","endLine":537,"endColumn":46,"suggestions":"49597"},{"ruleId":"45357","severity":2,"message":"45358","line":573,"column":43,"nodeType":"45359","messageId":"45360","endLine":573,"endColumn":46,"suggestions":"49598"},{"ruleId":"45357","severity":2,"message":"45358","line":581,"column":43,"nodeType":"45359","messageId":"45360","endLine":581,"endColumn":46,"suggestions":"49599"},{"ruleId":"45357","severity":2,"message":"45358","line":602,"column":43,"nodeType":"45359","messageId":"45360","endLine":602,"endColumn":46,"suggestions":"49600"},{"ruleId":"45357","severity":2,"message":"45358","line":603,"column":48,"nodeType":"45359","messageId":"45360","endLine":603,"endColumn":51,"suggestions":"49601"},{"ruleId":"45357","severity":2,"message":"45358","line":622,"column":43,"nodeType":"45359","messageId":"45360","endLine":622,"endColumn":46,"suggestions":"49602"},{"ruleId":"45357","severity":2,"message":"45358","line":645,"column":43,"nodeType":"45359","messageId":"45360","endLine":645,"endColumn":46,"suggestions":"49603"},{"ruleId":"45357","severity":2,"message":"45358","line":646,"column":50,"nodeType":"45359","messageId":"45360","endLine":646,"endColumn":53,"suggestions":"49604"},{"ruleId":"45357","severity":2,"message":"45358","line":705,"column":39,"nodeType":"45359","messageId":"45360","endLine":705,"endColumn":42,"suggestions":"49605"},{"ruleId":"45357","severity":2,"message":"45358","line":709,"column":39,"nodeType":"45359","messageId":"45360","endLine":709,"endColumn":42,"suggestions":"49606"},{"ruleId":"45357","severity":2,"message":"45358","line":714,"column":15,"nodeType":"45359","messageId":"45360","endLine":714,"endColumn":18,"suggestions":"49607"},{"ruleId":"45357","severity":2,"message":"45358","line":718,"column":38,"nodeType":"45359","messageId":"45360","endLine":718,"endColumn":41,"suggestions":"49608"},{"ruleId":"45357","severity":2,"message":"45358","line":734,"column":51,"nodeType":"45359","messageId":"45360","endLine":734,"endColumn":54,"suggestions":"49609"},{"ruleId":"45357","severity":2,"message":"45358","line":739,"column":55,"nodeType":"45359","messageId":"45360","endLine":739,"endColumn":58,"suggestions":"49610"},{"ruleId":"45357","severity":2,"message":"45358","line":743,"column":61,"nodeType":"45359","messageId":"45360","endLine":743,"endColumn":64,"suggestions":"49611"},{"ruleId":"45357","severity":2,"message":"45358","line":749,"column":67,"nodeType":"45359","messageId":"45360","endLine":749,"endColumn":70,"suggestions":"49612"},{"ruleId":"45357","severity":2,"message":"45358","line":750,"column":73,"nodeType":"45359","messageId":"45360","endLine":750,"endColumn":76,"suggestions":"49613"},{"ruleId":"45357","severity":2,"message":"45358","line":789,"column":13,"nodeType":"45359","messageId":"45360","endLine":789,"endColumn":16,"suggestions":"49614"},{"ruleId":"45357","severity":2,"message":"45358","line":799,"column":64,"nodeType":"45359","messageId":"45360","endLine":799,"endColumn":67,"suggestions":"49615"},{"ruleId":"45357","severity":2,"message":"45358","line":826,"column":43,"nodeType":"45359","messageId":"45360","endLine":826,"endColumn":46,"suggestions":"49616"},{"ruleId":"45357","severity":2,"message":"45358","line":831,"column":30,"nodeType":"45359","messageId":"45360","endLine":831,"endColumn":33,"suggestions":"49617"},{"ruleId":"45357","severity":2,"message":"45358","line":851,"column":43,"nodeType":"45359","messageId":"45360","endLine":851,"endColumn":46,"suggestions":"49618"},{"ruleId":"45357","severity":2,"message":"45358","line":852,"column":52,"nodeType":"45359","messageId":"45360","endLine":852,"endColumn":55,"suggestions":"49619"},{"ruleId":"45357","severity":2,"message":"45358","line":874,"column":43,"nodeType":"45359","messageId":"45360","endLine":874,"endColumn":46,"suggestions":"49620"},{"ruleId":"45357","severity":2,"message":"45358","line":882,"column":43,"nodeType":"45359","messageId":"45360","endLine":882,"endColumn":46,"suggestions":"49621"},{"ruleId":"45357","severity":2,"message":"45358","line":900,"column":55,"nodeType":"45359","messageId":"45360","endLine":900,"endColumn":58,"suggestions":"49622"},{"ruleId":"45357","severity":2,"message":"45358","line":913,"column":43,"nodeType":"45359","messageId":"45360","endLine":913,"endColumn":46,"suggestions":"49623"},{"ruleId":"45357","severity":2,"message":"45358","line":933,"column":51,"nodeType":"45359","messageId":"45360","endLine":933,"endColumn":54,"suggestions":"49624"},{"ruleId":"45357","severity":2,"message":"45358","line":946,"column":51,"nodeType":"45359","messageId":"45360","endLine":946,"endColumn":54,"suggestions":"49625"},{"ruleId":"45357","severity":2,"message":"45358","line":976,"column":43,"nodeType":"45359","messageId":"45360","endLine":976,"endColumn":46,"suggestions":"49626"},{"ruleId":"45357","severity":2,"message":"45358","line":995,"column":51,"nodeType":"45359","messageId":"45360","endLine":995,"endColumn":54,"suggestions":"49627"},{"ruleId":"45357","severity":2,"message":"45358","line":1009,"column":51,"nodeType":"45359","messageId":"45360","endLine":1009,"endColumn":54,"suggestions":"49628"},{"ruleId":"45357","severity":2,"message":"45358","line":1034,"column":43,"nodeType":"45359","messageId":"45360","endLine":1034,"endColumn":46,"suggestions":"49629"},{"ruleId":"45357","severity":2,"message":"45358","line":1117,"column":43,"nodeType":"45359","messageId":"45360","endLine":1117,"endColumn":46,"suggestions":"49630"},{"ruleId":"45357","severity":2,"message":"45358","line":1157,"column":43,"nodeType":"45359","messageId":"45360","endLine":1157,"endColumn":46,"suggestions":"49631"},{"ruleId":"45357","severity":2,"message":"45358","line":1190,"column":43,"nodeType":"45359","messageId":"45360","endLine":1190,"endColumn":46,"suggestions":"49632"},{"ruleId":"45357","severity":2,"message":"45358","line":1217,"column":43,"nodeType":"45359","messageId":"45360","endLine":1217,"endColumn":46,"suggestions":"49633"},{"ruleId":"45357","severity":2,"message":"45358","line":1243,"column":43,"nodeType":"45359","messageId":"45360","endLine":1243,"endColumn":46,"suggestions":"49634"},{"ruleId":"45357","severity":2,"message":"45358","line":70,"column":13,"nodeType":"45359","messageId":"45360","endLine":70,"endColumn":16,"suggestions":"49635"},{"ruleId":"45357","severity":2,"message":"45358","line":267,"column":47,"nodeType":"45359","messageId":"45360","endLine":267,"endColumn":50,"suggestions":"49636"},{"ruleId":"45357","severity":2,"message":"45358","line":58,"column":43,"nodeType":"45359","messageId":"45360","endLine":58,"endColumn":46,"suggestions":"49637"},{"ruleId":"45357","severity":2,"message":"45358","line":59,"column":61,"nodeType":"45359","messageId":"45360","endLine":59,"endColumn":64,"suggestions":"49638"},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":33,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":36,"suggestions":"49639"},{"ruleId":"45357","severity":2,"message":"45358","line":20,"column":63,"nodeType":"45359","messageId":"45360","endLine":20,"endColumn":66,"suggestions":"49640"},{"ruleId":"45357","severity":2,"message":"45358","line":21,"column":44,"nodeType":"45359","messageId":"45360","endLine":21,"endColumn":47,"suggestions":"49641"},{"ruleId":"45357","severity":2,"message":"45358","line":25,"column":35,"nodeType":"45359","messageId":"45360","endLine":25,"endColumn":38,"suggestions":"49642"},{"ruleId":"45357","severity":2,"message":"45358","line":37,"column":32,"nodeType":"45359","messageId":"45360","endLine":37,"endColumn":35,"suggestions":"49643"},"@typescript-eslint/no-explicit-any","Unexpected any. Specify a different type.","TSAnyKeyword","unexpectedAny",["49644","49645"],["49646","49647"],["49648","49649"],["49650","49651"],["49652","49653"],["49654","49655"],["49656","49657"],["49658","49659"],["49660","49661"],["49662","49663"],["49664","49665"],["49666","49667"],["49668","49669"],["49670","49671"],["49672","49673"],["49674","49675"],["49676","49677"],["49678","49679"],["49680","49681"],["49682","49683"],["49684","49685"],["49686","49687"],["49688","49689"],["49690","49691"],["49692","49693"],["49694","49695"],["49696","49697"],["49698","49699"],["49700","49701"],["49702","49703"],["49704","49705"],["49706","49707"],["49708","49709"],["49710","49711"],["49712","49713"],["49714","49715"],["49716","49717"],["49718","49719"],["49720","49721"],["49722","49723"],["49724","49725"],["49726","49727"],["49728","49729"],["49730","49731"],["49732","49733"],["49734","49735"],["49736","49737"],["49738","49739"],["49740","49741"],["49742","49743"],["49744","49745"],["49746","49747"],["49748","49749"],["49750","49751"],["49752","49753"],["49754","49755"],["49756","49757"],"no-restricted-imports","'@/lib/localDb' import is restricted from being used by a pattern. The localDb compatibility barrel is restricted — import the owning domain module from `@/lib/db/` instead.","ImportDeclaration","patternWithCustomMessage",["49758","49759"],"no-restricted-syntax","New local `toNumber` definitions are barred — import `toNumber` from `@/shared/utils/numeric` instead (#7879). See that module's JSDoc for the canonical coercion shape and the `toNumberOrNull`/`toNumberArray` variants.","FunctionDeclaration","restrictedSyntax",["49760","49761"],["49762","49763"],["49764","49765"],["49766","49767"],["49768","49769"],["49770","49771"],["49772","49773"],["49774","49775"],["49776","49777"],["49778","49779"],["49780","49781"],["49782","49783"],["49784","49785"],["49786","49787"],["49788","49789"],["49790","49791"],["49792","49793"],["49794","49795"],["49796","49797"],["49798","49799"],["49800","49801"],["49802","49803"],["49804","49805"],["49806","49807"],["49808","49809"],["49810","49811"],["49812","49813"],["49814","49815"],["49816","49817"],["49818","49819"],["49820","49821"],["49822","49823"],["49824","49825"],["49826","49827"],["49828","49829"],["49830","49831"],["49832","49833"],["49834","49835"],["49836","49837"],["49838","49839"],["49840","49841"],["49842","49843"],["49844","49845"],["49846","49847"],["49848","49849"],["49850","49851"],["49852","49853"],["49854","49855"],["49856","49857"],["49858","49859"],["49860","49861"],["49862","49863"],["49864","49865"],["49866","49867"],"VariableDeclarator",["49868","49869"],["49870","49871"],["49872","49873"],["49874","49875"],["49876","49877"],["49878","49879"],["49880","49881"],["49882","49883"],["49884","49885"],["49886","49887"],["49888","49889"],["49890","49891"],["49892","49893"],["49894","49895"],["49896","49897"],["49898","49899"],["49900","49901"],["49902","49903"],["49904","49905"],["49906","49907"],["49908","49909"],["49910","49911"],["49912","49913"],["49914","49915"],["49916","49917"],["49918","49919"],["49920","49921"],["49922","49923"],["49924","49925"],["49926","49927"],["49928","49929"],["49930","49931"],["49932","49933"],["49934","49935"],["49936","49937"],["49938","49939"],["49940","49941"],["49942","49943"],["49944","49945"],["49946","49947"],["49948"],["49949","49950"],["49951"],["49952","49953"],["49954"],["49955","49956"],["49957"],["49958","49959"],["49960","49961"],["49962","49963"],["49964","49965"],["49966","49967"],["49968","49969"],["49970","49971"],["49972","49973"],["49974","49975"],["49976","49977"],["49978","49979"],["49980","49981"],["49982","49983"],["49984","49985"],["49986","49987"],["49988","49989"],["49990","49991"],"react-hooks/exhaustive-deps","React Hook useMemo has a missing dependency: 'versionInfo'. Either include it or remove the dependency array. Mutable values like 'versionInfo.current' aren't valid dependencies because mutating them doesn't re-render the component.","ArrayExpression",["49992"],"React Hook useEffect has a missing dependency: 'fetchData'. Either include it or remove the dependency array.",["49993"],["49994"],"react-hooks/set-state-in-effect","Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:\n* Update external systems with the latest state from React.\n* Subscribe for updates from some external system, calling setState in a callback function when external state changes.\n\nCalling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/BatchConceptCard.tsx:23:9\n 21 | if (stored !== null) {\n 22 | // eslint-disable-next-line react-hooks/set-state-in-effect -- localStorage hydration, runs once\n> 23 | setCollapsed(stored === \"true\");\n | ^^^^^^^^^^^^ Avoid calling setState() directly within an effect\n 24 | }\n 25 | } catch {\n 26 | // localStorage unavailable (SSR/private mode) — keep default",["49995"],"Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:\n* Update external systems with the latest state from React.\n* Subscribe for updates from some external system, calling setState in a callback function when external state changes.\n\nCalling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/batch/components/FilesConceptCard.tsx:32:9\n 30 | if (stored !== null) {\n 31 | // eslint-disable-next-line react-hooks/set-state-in-effect -- localStorage hydration, runs once\n> 32 | setCollapsed(stored === \"true\");\n | ^^^^^^^^^^^^ Avoid calling setState() directly within an effect\n 33 | }\n 34 | } catch {\n 35 | // localStorage unavailable — keep default",["49996"],"React Hook useEffect has missing dependencies: 'onResult' and 't'. Either include them or remove the dependency array. If 'onResult' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["49997"],["49998"],"Türkçe-güvenli arama için matchesSearch() kullan (@/shared/utils/turkishText). Ham toLowerCase().includes() İ/ı karakterlerini bozar.","CallExpression",["49999"],["50000"],["50001"],["50002"],["50003"],"@next/next/no-img-element","Using `` could result in slower LCP and higher bandwidth. Consider using `` from `next/image` or a custom image loader to automatically optimize images. This may incur additional usage or cost from your provider. See: https://nextjs.org/docs/messages/no-img-element","JSXOpeningElement",["50004"],"React Hook useEffect has a missing dependency: 'LOCAL_PROVIDERS'. Either include it or remove the dependency array.",["50005"],["50006"],"React Hook useEffect has a missing dependency: 'loadSavedMappings'. Either include it or remove the dependency array.",["50007"],["50008"],"Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:\n* Update external systems with the latest state from React.\n* Subscribe for updates from some external system, calling setState in a callback function when external state changes.\n\nCalling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/cli-code/components/ToolDetailClient.tsx:97:7\n 95 | /* eslint-disable react-hooks/set-state-in-effect */\n 96 | Promise.all([\n> 97 | fetchConnections(),\n | ^^^^^^^^^^^^^^^^ Avoid calling setState() directly within an effect\n 98 | fetchApiKeys(),\n 99 | fetchCloudSettings(),\n 100 | fetchDynamicModels(),",["50009"],["50010"],"React Hook useEffect has missing dependencies: 'plans' and 'selectedConn'. Either include them or remove the dependency array.",["50011"],["50012"],"React Hook useEffect has missing dependencies: 'editPoolExclusive' and 'plans'. Either include them or remove the dependency array. If 'setExclusive' needs the current value of 'editPoolExclusive', you can also switch to useReducer instead of useState and read 'editPoolExclusive' in the reducer.",["50013"],["50014"],"React Hook useEffect has a missing dependency: 'groupId'. Either include it or remove the dependency array.",["50015"],["50016"],"React Hook useEffect has a missing dependency: 'pools'. Either include it or remove the dependency array.",["50017"],["50018"],"React Hook useEffect has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked.",["50019"],"React Hook useEffect has missing dependencies: 'configState' and 'setConfigState'. Either include them or remove the dependency array. If 'setConfigState' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["50020"],["50021"],"React Hook useEffect has missing dependencies: 'configState', 'reasoningSpec', and 'setConfigState'. Either include them or remove the dependency array. If 'setConfigState' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["50022"],["50023"],["50024"],"The 'clearResults' function makes the dependencies of useCallback Hook (at line 476) change on every render. To fix this, wrap the definition of 'clearResults' in its own useCallback() Hook.",["50025"],["50026"],["50027"],"React Hook useEffect has a missing dependency: 'getUpstreamHeadersRecord'. Either include it or remove the dependency array. If 'getUpstreamHeadersRecord' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["50028"],["50029"],"React Hook useEffect has a missing dependency: 'setProviderDisplayMode'. Either include it or remove the dependency array. If 'setProviderDisplayMode' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["50030"],["50031"],"React Hook useEffect has missing dependencies: 'setActiveCategory', 'setActiveServiceKind', 'setModelSearchQuery', 'setSearchQuery', and 'setShowFreeOnly'. Either include them or remove the dependency array. If 'setSearchQuery' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["50032"],["50033"],["50034"],"React Hook useCallback has a missing dependency: 'L'. Either include it or remove the dependency array.",["50035"],["50036"],"React Hook useEffect has a missing dependency: 'customThemeColor'. Either include it or remove the dependency array.",["50037"],["50038"],"React Hook useEffect has missing dependencies: 'notify' and 't'. Either include them or remove the dependency array.",["50039"],["50040"],"@next/next/no-html-link-for-pages","Do not use an `` element to navigate to `/api/settings/mitm/`. Use `` from `next/link` instead. See: https://nextjs.org/docs/messages/no-html-link-for-pages","React Hook useCallback has a missing dependency: 'load'. Either include it or remove the dependency array.",["50041"],"React Hook useEffect has a missing dependency: 't'. Either include it or remove the dependency array.",["50042"],"Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:\n* Update external systems with the latest state from React.\n* Subscribe for updates from some external system, calling setState in a callback function when external state changes.\n\nCalling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx:52:16\n 50 | const saved = loadDisabledSources();\n 51 | // eslint-disable-next-line react-hooks/set-state-in-effect -- localStorage hydration, runs once\n> 52 | if (saved) setDisabledSources(saved);\n | ^^^^^^^^^^^^^^^^^^ Avoid calling setState() directly within an effect\n 53 | }, []);\n 54 | // Wrapper setters that also reset page to 1\n 55 | const setFilterProtocol = (v: string) => {",["50043"],"Error: Calling setState synchronously within an effect can trigger cascading renders\n\nEffects are intended to synchronize state between React and external systems such as manually updating the DOM, state management libraries, or other platform APIs. In general, the body of an effect should do one or both of the following:\n* Update external systems with the latest state from React.\n* Subscribe for updates from some external system, calling setState in a callback function when external state changes.\n\nCalling setState synchronously within an effect body causes cascading renders that can hurt performance, and is not recommended. (https://react.dev/learn/you-might-not-need-an-effect).\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx:101:5\n 99 | useEffect(() => {\n 100 | // eslint-disable-next-line react-hooks/set-state-in-effect -- async data fetch on filter change\n> 101 | loadData();\n | ^^^^^^^^ Avoid calling setState() directly within an effect\n 102 | }, [loadData]);\n 103 |\n 104 | const handleSync = async () => {",["50044"],"React Hook useEffect has missing dependencies: 'forceOpen' and 'onOpenChange'. Either include them or remove the dependency array. If 'onOpenChange' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["50045"],["50046"],"React Hook useEffect has missing dependencies: 'defaultOpen', 'forceOpen', and 'onOpenChange'. Either include them or remove the dependency array. If 'onOpenChange' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["50047"],["50048"],"React Hook useEffect has a missing dependency: 'onFirstOpen'. Either include it or remove the dependency array. If 'onFirstOpen' changes too often, find the parent component that defines it and wrap that definition in useCallback.",["50049"],["50050"],["50051"],["50052"],"React Hook useMemo has missing dependencies: 'errorSet' and 'lastSet'. Either include them or remove the dependency array.",["50053"],["50054"],["50055"],"'@omniroute/open-sse/executors/base' import is restricted from being used by a pattern. Executor implementations must stay behind an open-sse handler or service boundary.","'@omniroute/open-sse/executors/codex.ts' import is restricted from being used by a pattern. Executor implementations must stay behind an open-sse handler or service boundary.","'@omniroute/open-sse/executors/zai-web.ts' import is restricted from being used by a pattern. Executor implementations must stay behind an open-sse handler or service boundary.","'../../../../lib/localDb' import is restricted from being used by a pattern. The localDb compatibility barrel is restricted — import the owning domain module from `@/lib/db/` instead.","'@omniroute/open-sse/executors/cliproxyapi.ts' import is restricted from being used by a pattern. Executor implementations must stay behind an open-sse handler or service boundary.","'@omniroute/open-sse/executors/codex/tools.ts' import is restricted from being used by a pattern. Executor implementations must stay behind an open-sse handler or service boundary.","'@omniroute/open-sse/executors/index.ts' import is restricted from being used by a pattern. Executor implementations must stay behind an open-sse handler or service boundary.",["50056"],"React Hook useCallback has a missing dependency: 'channels'. Either include it or remove the dependency array.",["50057"],"React Hook useCallback has a complex expression in the dependency array. Extract it to a separate variable so it can be statically checked.","'./localDb.ts' import is restricted from being used by a pattern. The localDb compatibility barrel is restricted — import the owning domain module from `@/lib/db/` instead.","'../localDb' import is restricted from being used by a pattern. The localDb compatibility barrel is restricted — import the owning domain module from `@/lib/db/` instead.","ExportNamedDeclaration",["50058"],"React Hook useEffect has a missing dependency: 'router'. Either include it or remove the dependency array.",["50059"],["50060"],"React Hook useEffect has a missing dependency: 'fetchProviderModels'. Either include it or remove the dependency array.",["50061"],["50062"],["50063"],["50064"],"React Hook useEffect has missing dependencies: 'resetFields' and 't'. Either include them or remove the dependency array.",["50065"],"React Hook useCallback has a missing dependency: 'columnSortMap'. Either include it or remove the dependency array.",["50066"],["50067"],"The 'openDetail' function makes the dependencies of useImperativeHandle Hook (at line 633) change on every render. To fix this, wrap the definition of 'openDetail' in its own useCallback() Hook.",["50068"],"React Hook useEffect has a missing dependency: 'openDetail'. Either include it or remove the dependency array.",["50069"],"React Hook useCallback has missing dependencies: 'closeDetail' and 'openDetail'. Either include them or remove the dependency array.",["50070"],["50071"],"React Hook useEffect has a missing dependency: 'visibleSections'. Either include it or remove the dependency array.",["50072"],["50073"],["50074","50075"],["50076","50077"],["50078","50079"],["50080","50081"],["50082","50083"],["50084","50085"],["50086","50087"],["50088","50089"],["50090","50091"],["50092","50093"],["50094","50095"],["50096","50097"],["50098","50099"],["50100","50101"],["50102","50103"],["50104","50105"],["50106","50107"],["50108","50109"],["50110","50111"],["50112","50113"],["50114","50115"],["50116","50117"],["50118","50119"],["50120","50121"],["50122","50123"],["50124","50125"],["50126","50127"],["50128","50129"],["50130","50131"],["50132","50133"],["50134","50135"],["50136","50137"],["50138","50139"],["50140","50141"],["50142","50143"],["50144","50145"],["50146","50147"],["50148","50149"],["50150","50151"],["50152","50153"],["50154","50155"],["50156","50157"],["50158","50159"],["50160","50161"],["50162","50163"],["50164","50165"],["50166","50167"],["50168","50169"],["50170","50171"],["50172","50173"],["50174","50175"],["50176","50177"],["50178","50179"],["50180","50181"],["50182","50183"],["50184","50185"],["50186","50187"],["50188","50189"],["50190","50191"],["50192","50193"],["50194","50195"],["50196","50197"],["50198","50199"],["50200","50201"],["50202","50203"],["50204","50205"],["50206","50207"],["50208","50209"],["50210","50211"],["50212","50213"],["50214","50215"],["50216","50217"],["50218","50219"],["50220","50221"],["50222","50223"],["50224","50225"],["50226","50227"],["50228","50229"],["50230","50231"],["50232","50233"],["50234","50235"],["50236","50237"],["50238","50239"],["50240","50241"],["50242","50243"],["50244","50245"],["50246","50247"],["50248","50249"],["50250","50251"],["50252","50253"],["50254","50255"],["50256","50257"],["50258","50259"],["50260","50261"],["50262","50263"],["50264","50265"],["50266","50267"],["50268","50269"],["50270","50271"],["50272","50273"],["50274","50275"],["50276","50277"],["50278","50279"],["50280","50281"],["50282","50283"],["50284","50285"],["50286","50287"],["50288","50289"],["50290","50291"],["50292","50293"],["50294","50295"],["50296","50297"],["50298","50299"],["50300","50301"],["50302","50303"],["50304","50305"],["50306","50307"],["50308","50309"],["50310","50311"],["50312","50313"],["50314","50315"],["50316","50317"],["50318","50319"],["50320","50321"],["50322","50323"],["50324","50325"],["50326","50327"],["50328","50329"],["50330","50331"],["50332","50333"],["50334","50335"],["50336","50337"],["50338","50339"],["50340","50341"],["50342","50343"],["50344","50345"],["50346","50347"],["50348","50349"],["50350","50351"],["50352","50353"],["50354","50355"],["50356","50357"],["50358","50359"],["50360","50361"],["50362","50363"],["50364","50365"],["50366","50367"],["50368","50369"],["50370","50371"],["50372","50373"],["50374","50375"],["50376","50377"],["50378","50379"],["50380","50381"],["50382","50383"],["50384","50385"],["50386","50387"],["50388","50389"],["50390","50391"],["50392","50393"],["50394","50395"],["50396","50397"],["50398","50399"],["50400","50401"],["50402","50403"],["50404","50405"],["50406","50407"],["50408","50409"],["50410","50411"],["50412","50413"],["50414","50415"],["50416","50417"],["50418","50419"],["50420","50421"],["50422","50423"],["50424","50425"],["50426","50427"],["50428","50429"],["50430","50431"],["50432","50433"],["50434","50435"],["50436","50437"],["50438","50439"],["50440","50441"],["50442","50443"],["50444","50445"],["50446","50447"],["50448","50449"],["50450","50451"],["50452","50453"],["50454","50455"],["50456","50457"],["50458","50459"],["50460","50461"],["50462","50463"],["50464","50465"],["50466","50467"],["50468","50469"],["50470","50471"],["50472","50473"],["50474","50475"],["50476","50477"],["50478","50479"],["50480","50481"],["50482","50483"],["50484","50485"],["50486","50487"],["50488","50489"],["50490","50491"],["50492","50493"],["50494","50495"],["50496","50497"],["50498","50499"],["50500","50501"],["50502","50503"],["50504","50505"],["50506","50507"],["50508","50509"],["50510","50511"],["50512","50513"],["50514","50515"],["50516","50517"],["50518","50519"],["50520","50521"],["50522","50523"],["50524","50525"],["50526","50527"],["50528","50529"],["50530","50531"],["50532","50533"],["50534","50535"],["50536","50537"],["50538","50539"],["50540","50541"],["50542","50543"],["50544","50545"],["50546","50547"],["50548","50549"],["50550","50551"],["50552","50553"],["50554","50555"],["50556","50557"],["50558","50559"],["50560","50561"],["50562","50563"],["50564","50565"],["50566","50567"],["50568","50569"],["50570","50571"],["50572","50573"],["50574","50575"],["50576","50577"],["50578","50579"],["50580","50581"],["50582","50583"],["50584","50585"],["50586","50587"],["50588","50589"],["50590","50591"],["50592","50593"],["50594","50595"],["50596","50597"],["50598","50599"],["50600","50601"],["50602","50603"],["50604","50605"],["50606","50607"],["50608","50609"],["50610","50611"],["50612","50613"],["50614","50615"],["50616","50617"],["50618","50619"],["50620","50621"],["50622","50623"],["50624","50625"],["50626","50627"],["50628","50629"],["50630","50631"],["50632","50633"],["50634","50635"],["50636","50637"],["50638","50639"],["50640","50641"],["50642","50643"],["50644","50645"],["50646","50647"],["50648","50649"],["50650","50651"],["50652","50653"],["50654","50655"],["50656","50657"],["50658","50659"],["50660","50661"],["50662","50663"],["50664","50665"],["50666","50667"],["50668","50669"],["50670","50671"],["50672","50673"],["50674","50675"],["50676","50677"],["50678","50679"],["50680","50681"],["50682","50683"],["50684","50685"],["50686","50687"],["50688","50689"],["50690","50691"],["50692","50693"],["50694","50695"],["50696","50697"],["50698","50699"],["50700","50701"],["50702","50703"],["50704","50705"],["50706","50707"],["50708","50709"],["50710","50711"],["50712","50713"],["50714","50715"],["50716","50717"],["50718","50719"],["50720","50721"],["50722","50723"],["50724","50725"],["50726","50727"],["50728","50729"],["50730","50731"],["50732","50733"],["50734","50735"],["50736","50737"],["50738","50739"],["50740"],["50741","50742"],["50743","50744"],["50745","50746"],["50747","50748"],["50749","50750"],["50751","50752"],["50753","50754"],["50755","50756"],["50757","50758"],["50759","50760"],["50761","50762"],["50763","50764"],["50765","50766"],["50767","50768"],["50769","50770"],["50771","50772"],["50773","50774"],["50775","50776"],["50777","50778"],["50779","50780"],["50781","50782"],["50783","50784"],["50785","50786"],["50787","50788"],["50789","50790"],["50791","50792"],["50793","50794"],["50795","50796"],["50797","50798"],["50799","50800"],["50801","50802"],["50803","50804"],["50805","50806"],["50807"],["50808","50809"],["50810","50811"],["50812","50813"],["50814","50815"],["50816","50817"],["50818","50819"],["50820","50821"],["50822","50823"],["50824","50825"],["50826","50827"],["50828","50829"],["50830","50831"],["50832","50833"],["50834","50835"],["50836","50837"],["50838","50839"],["50840","50841"],["50842","50843"],["50844","50845"],["50846","50847"],["50848","50849"],["50850","50851"],["50852","50853"],["50854","50855"],["50856","50857"],["50858","50859"],["50860","50861"],["50862","50863"],["50864","50865"],["50866","50867"],["50868","50869"],["50870","50871"],["50872","50873"],["50874","50875"],["50876","50877"],["50878","50879"],["50880","50881"],["50882","50883"],["50884","50885"],["50886","50887"],["50888","50889"],["50890","50891"],["50892","50893"],["50894","50895"],["50896","50897"],["50898","50899"],["50900","50901"],["50902","50903"],["50904","50905"],["50906","50907"],["50908","50909"],["50910","50911"],["50912","50913"],["50914","50915"],["50916","50917"],["50918","50919"],["50920","50921"],["50922","50923"],["50924","50925"],["50926","50927"],["50928","50929"],["50930","50931"],["50932","50933"],["50934","50935"],["50936","50937"],["50938","50939"],["50940","50941"],["50942","50943"],["50944","50945"],["50946","50947"],["50948","50949"],["50950","50951"],["50952","50953"],["50954","50955"],["50956","50957"],["50958","50959"],["50960","50961"],["50962","50963"],["50964","50965"],["50966","50967"],["50968","50969"],["50970","50971"],["50972","50973"],["50974","50975"],["50976","50977"],["50978","50979"],["50980","50981"],["50982","50983"],["50984","50985"],["50986","50987"],["50988","50989"],["50990","50991"],["50992","50993"],["50994","50995"],["50996","50997"],["50998","50999"],["51000","51001"],["51002","51003"],["51004","51005"],["51006","51007"],["51008","51009"],["51010","51011"],["51012","51013"],["51014","51015"],["51016","51017"],["51018","51019"],["51020","51021"],["51022","51023"],["51024","51025"],["51026","51027"],["51028","51029"],["51030","51031"],["51032","51033"],["51034","51035"],["51036","51037"],["51038","51039"],["51040","51041"],["51042","51043"],["51044","51045"],["51046","51047"],["51048","51049"],["51050","51051"],["51052","51053"],["51054","51055"],["51056","51057"],["51058","51059"],["51060","51061"],["51062","51063"],["51064","51065"],["51066","51067"],["51068","51069"],["51070","51071"],["51072","51073"],["51074","51075"],["51076","51077"],["51078","51079"],["51080","51081"],["51082","51083"],["51084","51085"],["51086","51087"],["51088","51089"],["51090","51091"],["51092","51093"],["51094","51095"],["51096","51097"],["51098","51099"],["51100","51101"],["51102","51103"],["51104","51105"],["51106","51107"],["51108","51109"],["51110","51111"],["51112","51113"],["51114","51115"],["51116","51117"],["51118","51119"],["51120","51121"],["51122","51123"],["51124","51125"],["51126","51127"],["51128","51129"],["51130","51131"],["51132","51133"],["51134","51135"],["51136","51137"],["51138","51139"],["51140","51141"],["51142","51143"],["51144","51145"],["51146","51147"],["51148","51149"],["51150","51151"],["51152","51153"],["51154","51155"],["51156","51157"],["51158","51159"],["51160","51161"],["51162","51163"],["51164","51165"],["51166","51167"],["51168","51169"],["51170","51171"],["51172","51173"],["51174","51175"],["51176","51177"],["51178","51179"],["51180","51181"],["51182","51183"],["51184","51185"],["51186","51187"],["51188","51189"],["51190","51191"],["51192","51193"],["51194","51195"],["51196","51197"],["51198","51199"],["51200","51201"],["51202","51203"],["51204","51205"],["51206","51207"],["51208","51209"],["51210","51211"],["51212","51213"],["51214","51215"],["51216","51217"],["51218","51219"],["51220","51221"],["51222","51223"],["51224","51225"],["51226","51227"],["51228","51229"],["51230","51231"],["51232","51233"],["51234","51235"],["51236","51237"],["51238","51239"],["51240","51241"],["51242","51243"],["51244","51245"],["51246","51247"],["51248","51249"],["51250","51251"],["51252","51253"],["51254","51255"],["51256","51257"],["51258","51259"],["51260","51261"],["51262","51263"],["51264","51265"],["51266","51267"],["51268","51269"],["51270","51271"],["51272","51273"],["51274","51275"],["51276","51277"],["51278","51279"],["51280","51281"],["51282","51283"],["51284","51285"],["51286","51287"],["51288","51289"],["51290","51291"],["51292","51293"],["51294","51295"],["51296","51297"],["51298","51299"],["51300","51301"],["51302","51303"],["51304","51305"],["51306","51307"],["51308","51309"],["51310","51311"],["51312","51313"],["51314","51315"],["51316","51317"],["51318","51319"],["51320","51321"],["51322","51323"],["51324","51325"],["51326","51327"],["51328","51329"],["51330","51331"],["51332","51333"],["51334","51335"],["51336","51337"],["51338","51339"],["51340","51341"],["51342","51343"],["51344","51345"],["51346","51347"],["51348","51349"],["51350","51351"],["51352","51353"],["51354","51355"],["51356","51357"],["51358","51359"],["51360","51361"],["51362","51363"],["51364","51365"],["51366","51367"],["51368","51369"],["51370","51371"],["51372","51373"],["51374","51375"],["51376","51377"],["51378","51379"],["51380","51381"],["51382","51383"],["51384","51385"],["51386","51387"],["51388","51389"],["51390","51391"],["51392","51393"],["51394","51395"],["51396","51397"],["51398","51399"],["51400","51401"],["51402","51403"],["51404","51405"],["51406","51407"],["51408","51409"],["51410","51411"],["51412","51413"],["51414","51415"],["51416","51417"],["51418","51419"],["51420","51421"],["51422","51423"],["51424","51425"],["51426","51427"],["51428","51429"],["51430","51431"],["51432","51433"],["51434","51435"],["51436","51437"],["51438","51439"],["51440","51441"],["51442","51443"],["51444","51445"],["51446","51447"],["51448","51449"],["51450","51451"],["51452","51453"],["51454","51455"],["51456","51457"],["51458","51459"],["51460","51461"],["51462","51463"],["51464","51465"],["51466","51467"],["51468","51469"],["51470","51471"],["51472","51473"],["51474","51475"],["51476","51477"],["51478","51479"],["51480","51481"],["51482","51483"],["51484","51485"],["51486","51487"],["51488","51489"],["51490","51491"],["51492","51493"],["51494","51495"],["51496","51497"],["51498","51499"],["51500","51501"],["51502","51503"],["51504","51505"],["51506","51507"],["51508","51509"],["51510","51511"],["51512","51513"],["51514","51515"],["51516","51517"],["51518","51519"],["51520","51521"],["51522","51523"],["51524","51525"],["51526","51527"],["51528","51529"],["51530","51531"],["51532","51533"],["51534","51535"],["51536","51537"],["51538","51539"],["51540","51541"],["51542","51543"],["51544","51545"],["51546","51547"],["51548","51549"],["51550","51551"],["51552","51553"],["51554","51555"],["51556","51557"],["51558","51559"],["51560","51561"],["51562","51563"],["51564","51565"],["51566","51567"],["51568","51569"],["51570","51571"],["51572","51573"],["51574","51575"],["51576","51577"],["51578","51579"],["51580","51581"],["51582","51583"],["51584","51585"],["51586","51587"],["51588","51589"],["51590","51591"],["51592","51593"],["51594","51595"],["51596","51597"],["51598","51599"],["51600","51601"],["51602","51603"],["51604","51605"],["51606","51607"],["51608","51609"],["51610","51611"],["51612","51613"],["51614","51615"],["51616","51617"],["51618","51619"],["51620","51621"],["51622","51623"],["51624","51625"],["51626","51627"],["51628","51629"],["51630","51631"],["51632","51633"],["51634","51635"],["51636","51637"],["51638","51639"],["51640","51641"],["51642","51643"],["51644","51645"],["51646","51647"],["51648","51649"],["51650","51651"],["51652","51653"],["51654","51655"],["51656","51657"],["51658","51659"],["51660","51661"],["51662","51663"],["51664","51665"],["51666","51667"],["51668","51669"],["51670","51671"],["51672","51673"],["51674","51675"],["51676","51677"],["51678","51679"],["51680","51681"],["51682","51683"],["51684","51685"],["51686","51687"],["51688","51689"],["51690","51691"],["51692","51693"],["51694","51695"],["51696","51697"],["51698","51699"],["51700","51701"],["51702","51703"],["51704","51705"],["51706","51707"],["51708","51709"],["51710","51711"],["51712","51713"],["51714","51715"],["51716","51717"],["51718","51719"],["51720","51721"],["51722","51723"],["51724","51725"],["51726","51727"],["51728","51729"],["51730","51731"],["51732","51733"],["51734","51735"],["51736","51737"],["51738","51739"],["51740","51741"],["51742","51743"],["51744","51745"],["51746","51747"],["51748","51749"],["51750","51751"],["51752","51753"],["51754","51755"],["51756","51757"],["51758","51759"],["51760","51761"],["51762","51763"],["51764","51765"],["51766","51767"],["51768","51769"],["51770","51771"],["51772","51773"],["51774","51775"],["51776","51777"],["51778","51779"],["51780","51781"],["51782","51783"],["51784","51785"],["51786","51787"],["51788","51789"],["51790","51791"],["51792","51793"],["51794","51795"],["51796","51797"],["51798","51799"],["51800","51801"],["51802","51803"],["51804","51805"],["51806","51807"],["51808","51809"],["51810","51811"],["51812","51813"],["51814","51815"],["51816","51817"],["51818","51819"],["51820","51821"],["51822","51823"],["51824","51825"],["51826","51827"],["51828","51829"],["51830","51831"],["51832","51833"],["51834","51835"],["51836","51837"],["51838","51839"],["51840","51841"],["51842","51843"],["51844","51845"],["51846","51847"],["51848","51849"],["51850","51851"],["51852","51853"],["51854","51855"],["51856","51857"],["51858","51859"],["51860","51861"],["51862","51863"],["51864","51865"],["51866","51867"],["51868","51869"],["51870","51871"],["51872","51873"],["51874","51875"],["51876","51877"],["51878","51879"],["51880","51881"],["51882","51883"],["51884","51885"],["51886","51887"],["51888","51889"],["51890","51891"],["51892","51893"],["51894","51895"],["51896","51897"],["51898","51899"],["51900","51901"],["51902","51903"],["51904","51905"],["51906","51907"],["51908","51909"],["51910","51911"],["51912","51913"],["51914","51915"],["51916","51917"],["51918","51919"],["51920","51921"],["51922","51923"],["51924","51925"],["51926","51927"],["51928","51929"],["51930","51931"],["51932","51933"],["51934","51935"],["51936","51937"],["51938","51939"],["51940","51941"],["51942","51943"],["51944","51945"],["51946","51947"],["51948","51949"],["51950","51951"],["51952","51953"],["51954","51955"],["51956","51957"],["51958","51959"],["51960","51961"],["51962","51963"],["51964","51965"],["51966","51967"],["51968","51969"],["51970","51971"],["51972","51973"],["51974","51975"],["51976","51977"],["51978","51979"],["51980","51981"],["51982","51983"],["51984","51985"],["51986","51987"],["51988","51989"],["51990","51991"],["51992","51993"],["51994","51995"],["51996","51997"],["51998","51999"],["52000","52001"],["52002","52003"],["52004","52005"],["52006","52007"],["52008","52009"],["52010","52011"],["52012","52013"],["52014","52015"],["52016","52017"],["52018","52019"],["52020","52021"],["52022","52023"],["52024","52025"],["52026","52027"],["52028","52029"],["52030","52031"],["52032","52033"],["52034","52035"],["52036","52037"],["52038","52039"],["52040","52041"],["52042"],["52043","52044"],["52045"],["52046","52047"],["52048","52049"],["52050","52051"],["52052","52053"],["52054","52055"],["52056","52057"],["52058","52059"],["52060","52061"],["52062","52063"],["52064","52065"],["52066","52067"],["52068","52069"],["52070","52071"],["52072","52073"],["52074","52075"],["52076","52077"],["52078","52079"],["52080","52081"],["52082","52083"],["52084","52085"],["52086","52087"],["52088","52089"],["52090","52091"],["52092","52093"],["52094","52095"],["52096","52097"],["52098","52099"],["52100","52101"],["52102","52103"],["52104","52105"],["52106","52107"],["52108","52109"],["52110","52111"],["52112","52113"],["52114","52115"],["52116","52117"],["52118","52119"],["52120","52121"],["52122","52123"],["52124","52125"],["52126","52127"],["52128","52129"],["52130","52131"],["52132","52133"],["52134","52135"],["52136","52137"],["52138","52139"],["52140","52141"],["52142","52143"],["52144","52145"],["52146","52147"],["52148","52149"],["52150","52151"],["52152","52153"],["52154","52155"],["52156","52157"],["52158","52159"],["52160","52161"],["52162","52163"],["52164","52165"],["52166","52167"],["52168","52169"],["52170","52171"],["52172","52173"],["52174","52175"],["52176","52177"],["52178","52179"],["52180","52181"],["52182","52183"],["52184","52185"],["52186","52187"],["52188","52189"],["52190","52191"],["52192","52193"],["52194","52195"],["52196","52197"],["52198","52199"],["52200","52201"],["52202","52203"],["52204","52205"],["52206","52207"],["52208","52209"],["52210","52211"],["52212","52213"],["52214","52215"],["52216","52217"],["52218","52219"],["52220","52221"],["52222","52223"],["52224","52225"],["52226","52227"],["52228","52229"],["52230","52231"],["52232","52233"],["52234","52235"],["52236","52237"],["52238","52239"],["52240","52241"],["52242","52243"],["52244","52245"],["52246","52247"],["52248","52249"],["52250","52251"],["52252","52253"],["52254","52255"],["52256","52257"],["52258","52259"],["52260","52261"],["52262","52263"],["52264","52265"],["52266","52267"],["52268","52269"],["52270","52271"],["52272","52273"],["52274","52275"],["52276","52277"],["52278","52279"],["52280","52281"],["52282","52283"],["52284","52285"],["52286","52287"],["52288","52289"],["52290","52291"],["52292","52293"],["52294","52295"],["52296","52297"],["52298","52299"],["52300","52301"],["52302","52303"],["52304","52305"],["52306","52307"],["52308","52309"],["52310","52311"],["52312","52313"],["52314","52315"],["52316","52317"],["52318","52319"],["52320","52321"],["52322","52323"],["52324","52325"],["52326","52327"],["52328","52329"],["52330","52331"],["52332","52333"],["52334","52335"],["52336","52337"],["52338","52339"],["52340","52341"],["52342","52343"],["52344","52345"],["52346","52347"],["52348","52349"],["52350","52351"],["52352","52353"],["52354","52355"],["52356","52357"],["52358","52359"],["52360","52361"],["52362","52363"],["52364","52365"],["52366","52367"],["52368","52369"],["52370","52371"],["52372","52373"],["52374","52375"],["52376","52377"],["52378","52379"],["52380","52381"],["52382","52383"],["52384","52385"],["52386","52387"],["52388","52389"],["52390","52391"],["52392","52393"],["52394","52395"],["52396","52397"],["52398","52399"],["52400","52401"],["52402","52403"],["52404","52405"],["52406","52407"],["52408","52409"],["52410","52411"],["52412","52413"],["52414","52415"],["52416","52417"],["52418","52419"],["52420","52421"],["52422","52423"],["52424","52425"],["52426","52427"],["52428","52429"],["52430","52431"],["52432","52433"],["52434","52435"],["52436","52437"],["52438","52439"],["52440","52441"],["52442","52443"],["52444","52445"],["52446","52447"],["52448","52449"],["52450","52451"],["52452","52453"],["52454","52455"],["52456","52457"],["52458","52459"],["52460","52461"],["52462","52463"],["52464","52465"],["52466","52467"],["52468","52469"],["52470","52471"],["52472","52473"],["52474","52475"],["52476","52477"],["52478","52479"],["52480","52481"],["52482","52483"],["52484","52485"],["52486","52487"],["52488","52489"],["52490","52491"],["52492","52493"],["52494","52495"],["52496","52497"],["52498","52499"],["52500","52501"],["52502","52503"],["52504","52505"],["52506","52507"],["52508","52509"],["52510","52511"],["52512","52513"],["52514","52515"],["52516","52517"],["52518","52519"],["52520","52521"],["52522","52523"],["52524","52525"],["52526","52527"],["52528","52529"],["52530","52531"],["52532","52533"],["52534","52535"],["52536","52537"],["52538","52539"],["52540","52541"],["52542","52543"],["52544","52545"],["52546","52547"],["52548","52549"],["52550","52551"],["52552","52553"],["52554","52555"],["52556","52557"],["52558","52559"],["52560","52561"],["52562","52563"],["52564","52565"],["52566","52567"],["52568","52569"],["52570","52571"],["52572","52573"],["52574","52575"],["52576","52577"],["52578","52579"],["52580","52581"],["52582","52583"],["52584","52585"],["52586","52587"],["52588","52589"],["52590","52591"],["52592","52593"],["52594","52595"],["52596","52597"],["52598","52599"],["52600","52601"],["52602","52603"],["52604","52605"],["52606","52607"],["52608","52609"],["52610","52611"],["52612","52613"],["52614","52615"],["52616","52617"],["52618","52619"],["52620","52621"],["52622","52623"],["52624","52625"],["52626","52627"],["52628","52629"],["52630","52631"],["52632","52633"],["52634","52635"],["52636","52637"],["52638","52639"],["52640","52641"],["52642","52643"],["52644","52645"],["52646","52647"],["52648","52649"],["52650","52651"],["52652","52653"],["52654","52655"],["52656","52657"],["52658","52659"],["52660","52661"],["52662","52663"],["52664","52665"],["52666","52667"],["52668","52669"],["52670","52671"],["52672","52673"],["52674","52675"],["52676","52677"],["52678","52679"],["52680","52681"],["52682","52683"],["52684","52685"],["52686","52687"],["52688","52689"],["52690","52691"],["52692","52693"],["52694","52695"],["52696","52697"],["52698","52699"],["52700","52701"],["52702","52703"],["52704","52705"],["52706","52707"],["52708","52709"],["52710","52711"],["52712","52713"],["52714","52715"],["52716","52717"],["52718","52719"],["52720","52721"],["52722","52723"],["52724","52725"],["52726","52727"],["52728","52729"],["52730","52731"],["52732","52733"],["52734","52735"],["52736","52737"],["52738","52739"],["52740","52741"],["52742","52743"],["52744","52745"],["52746","52747"],["52748","52749"],["52750","52751"],["52752","52753"],["52754","52755"],["52756","52757"],["52758","52759"],["52760","52761"],["52762","52763"],["52764","52765"],["52766","52767"],["52768","52769"],["52770","52771"],["52772","52773"],["52774","52775"],["52776","52777"],["52778","52779"],["52780","52781"],["52782","52783"],["52784","52785"],["52786","52787"],["52788","52789"],["52790","52791"],["52792","52793"],["52794","52795"],["52796","52797"],["52798","52799"],["52800","52801"],["52802","52803"],["52804","52805"],["52806","52807"],["52808","52809"],["52810","52811"],["52812","52813"],["52814","52815"],["52816","52817"],["52818","52819"],["52820","52821"],["52822","52823"],["52824","52825"],["52826","52827"],["52828","52829"],["52830","52831"],["52832","52833"],["52834","52835"],["52836","52837"],["52838","52839"],["52840","52841"],["52842","52843"],["52844","52845"],["52846","52847"],["52848","52849"],["52850","52851"],["52852","52853"],["52854","52855"],["52856","52857"],["52858","52859"],["52860","52861"],["52862","52863"],["52864","52865"],["52866","52867"],["52868","52869"],["52870","52871"],["52872","52873"],["52874","52875"],["52876","52877"],["52878","52879"],["52880","52881"],["52882","52883"],["52884","52885"],["52886","52887"],["52888","52889"],["52890","52891"],["52892","52893"],["52894","52895"],["52896","52897"],["52898","52899"],["52900","52901"],["52902","52903"],["52904","52905"],["52906","52907"],["52908","52909"],["52910"],["52911","52912"],["52913","52914"],["52915","52916"],["52917","52918"],["52919","52920"],["52921","52922"],["52923","52924"],["52925","52926"],["52927","52928"],["52929","52930"],["52931","52932"],["52933","52934"],["52935","52936"],["52937","52938"],["52939","52940"],["52941","52942"],["52943","52944"],["52945","52946"],["52947","52948"],["52949","52950"],["52951","52952"],["52953","52954"],["52955","52956"],["52957","52958"],["52959","52960"],["52961","52962"],["52963","52964"],["52965","52966"],["52967","52968"],["52969","52970"],["52971","52972"],["52973","52974"],["52975","52976"],["52977","52978"],["52979","52980"],["52981","52982"],["52983","52984"],["52985","52986"],["52987","52988"],["52989","52990"],["52991","52992"],["52993","52994"],["52995","52996"],["52997","52998"],["52999","53000"],["53001","53002"],["53003","53004"],["53005","53006"],["53007","53008"],["53009","53010"],["53011","53012"],["53013","53014"],["53015","53016"],["53017","53018"],["53019","53020"],["53021","53022"],["53023","53024"],["53025","53026"],["53027","53028"],["53029","53030"],["53031","53032"],["53033","53034"],["53035","53036"],["53037","53038"],["53039","53040"],["53041","53042"],["53043","53044"],["53045","53046"],["53047","53048"],["53049","53050"],["53051","53052"],["53053","53054"],["53055","53056"],["53057","53058"],["53059","53060"],["53061","53062"],["53063","53064"],["53065","53066"],["53067","53068"],["53069","53070"],["53071","53072"],["53073","53074"],["53075","53076"],["53077","53078"],["53079","53080"],["53081","53082"],["53083","53084"],["53085","53086"],["53087","53088"],["53089","53090"],["53091","53092"],["53093","53094"],["53095","53096"],["53097","53098"],["53099","53100"],["53101","53102"],["53103","53104"],["53105","53106"],["53107","53108"],["53109","53110"],["53111","53112"],["53113","53114"],["53115","53116"],["53117","53118"],["53119","53120"],["53121","53122"],["53123","53124"],["53125","53126"],["53127","53128"],["53129","53130"],["53131","53132"],["53133","53134"],["53135","53136"],["53137","53138"],["53139","53140"],["53141","53142"],["53143","53144"],["53145","53146"],["53147","53148"],["53149","53150"],["53151","53152"],["53153","53154"],["53155","53156"],["53157","53158"],["53159","53160"],["53161","53162"],["53163","53164"],["53165","53166"],["53167","53168"],["53169","53170"],["53171","53172"],["53173","53174"],["53175","53176"],["53177","53178"],["53179","53180"],["53181","53182"],["53183","53184"],["53185","53186"],["53187","53188"],["53189","53190"],["53191","53192"],["53193","53194"],["53195","53196"],["53197","53198"],["53199","53200"],["53201","53202"],["53203","53204"],["53205","53206"],["53207","53208"],["53209","53210"],["53211","53212"],["53213","53214"],["53215","53216"],["53217","53218"],["53219","53220"],["53221","53222"],["53223","53224"],["53225","53226"],["53227","53228"],["53229","53230"],["53231","53232"],["53233","53234"],["53235","53236"],["53237","53238"],["53239","53240"],["53241","53242"],["53243","53244"],["53245","53246"],["53247","53248"],["53249","53250"],["53251","53252"],["53253","53254"],["53255","53256"],["53257","53258"],["53259","53260"],["53261","53262"],["53263","53264"],["53265","53266"],["53267","53268"],["53269","53270"],["53271","53272"],["53273","53274"],["53275","53276"],["53277","53278"],["53279","53280"],["53281","53282"],["53283","53284"],["53285","53286"],["53287","53288"],["53289","53290"],["53291","53292"],["53293","53294"],["53295","53296"],["53297","53298"],["53299","53300"],["53301","53302"],["53303","53304"],["53305","53306"],["53307","53308"],["53309","53310"],["53311","53312"],["53313","53314"],["53315","53316"],["53317","53318"],["53319","53320"],["53321","53322"],["53323","53324"],["53325","53326"],["53327","53328"],["53329","53330"],["53331","53332"],["53333","53334"],["53335","53336"],["53337","53338"],["53339","53340"],["53341","53342"],["53343","53344"],["53345","53346"],["53347","53348"],["53349","53350"],["53351","53352"],["53353","53354"],["53355","53356"],["53357","53358"],["53359","53360"],["53361","53362"],["53363","53364"],["53365","53366"],["53367","53368"],["53369","53370"],["53371","53372"],["53373","53374"],["53375","53376"],["53377","53378"],["53379","53380"],["53381","53382"],["53383","53384"],["53385","53386"],["53387","53388"],["53389","53390"],["53391","53392"],["53393","53394"],["53395","53396"],["53397","53398"],["53399","53400"],["53401","53402"],["53403","53404"],["53405","53406"],["53407","53408"],["53409","53410"],["53411","53412"],["53413","53414"],["53415","53416"],["53417","53418"],["53419","53420"],["53421","53422"],["53423","53424"],["53425","53426"],["53427","53428"],["53429","53430"],["53431","53432"],["53433","53434"],["53435","53436"],["53437","53438"],["53439","53440"],["53441","53442"],["53443","53444"],["53445","53446"],["53447","53448"],["53449","53450"],["53451","53452"],["53453","53454"],["53455","53456"],["53457","53458"],["53459","53460"],["53461","53462"],["53463","53464"],["53465","53466"],["53467","53468"],["53469","53470"],["53471","53472"],["53473","53474"],["53475","53476"],["53477","53478"],["53479","53480"],["53481","53482"],["53483","53484"],["53485","53486"],["53487","53488"],["53489","53490"],["53491","53492"],["53493","53494"],["53495","53496"],["53497","53498"],["53499","53500"],["53501","53502"],["53503","53504"],["53505","53506"],["53507","53508"],["53509","53510"],["53511","53512"],["53513","53514"],["53515","53516"],["53517","53518"],["53519","53520"],["53521","53522"],["53523","53524"],["53525","53526"],["53527","53528"],["53529","53530"],["53531","53532"],["53533","53534"],["53535","53536"],["53537","53538"],["53539"],["53540","53541"],["53542"],["53543","53544"],["53545"],["53546","53547"],["53548"],["53549","53550"],["53551"],["53552","53553"],["53554"],["53555","53556"],["53557"],["53558","53559"],["53560"],["53561","53562"],["53563"],["53564","53565"],["53566"],["53567","53568"],["53569"],["53570","53571"],["53572"],["53573","53574"],["53575","53576"],["53577","53578"],["53579","53580"],["53581","53582"],["53583","53584"],["53585","53586"],["53587","53588"],["53589","53590"],["53591","53592"],["53593","53594"],["53595","53596"],["53597","53598"],["53599","53600"],["53601","53602"],["53603","53604"],["53605","53606"],["53607","53608"],["53609","53610"],["53611","53612"],["53613","53614"],["53615","53616"],["53617","53618"],["53619","53620"],["53621","53622"],["53623","53624"],["53625","53626"],["53627","53628"],["53629","53630"],["53631","53632"],["53633","53634"],["53635","53636"],["53637","53638"],["53639","53640"],["53641","53642"],["53643","53644"],["53645","53646"],["53647","53648"],["53649","53650"],["53651","53652"],["53653","53654"],["53655","53656"],["53657","53658"],["53659","53660"],["53661","53662"],["53663","53664"],["53665","53666"],["53667","53668"],["53669","53670"],["53671","53672"],["53673","53674"],["53675","53676"],["53677","53678"],["53679","53680"],["53681","53682"],["53683","53684"],["53685","53686"],["53687","53688"],["53689","53690"],["53691","53692"],["53693","53694"],["53695","53696"],["53697","53698"],["53699","53700"],["53701","53702"],["53703","53704"],["53705","53706"],["53707","53708"],["53709","53710"],["53711","53712"],["53713","53714"],["53715","53716"],["53717","53718"],["53719","53720"],["53721","53722"],["53723","53724"],["53725","53726"],["53727","53728"],["53729","53730"],["53731","53732"],["53733","53734"],["53735","53736"],["53737","53738"],["53739","53740"],["53741","53742"],["53743","53744"],["53745","53746"],["53747","53748"],["53749","53750"],["53751","53752"],["53753","53754"],["53755","53756"],["53757","53758"],["53759","53760"],["53761","53762"],["53763","53764"],["53765","53766"],["53767","53768"],["53769","53770"],["53771","53772"],["53773","53774"],["53775","53776"],["53777","53778"],["53779","53780"],["53781","53782"],["53783","53784"],["53785","53786"],["53787","53788"],["53789","53790"],["53791","53792"],["53793","53794"],["53795"],["53796","53797"],["53798"],["53799","53800"],["53801"],["53802","53803"],["53804","53805"],["53806","53807"],["53808","53809"],["53810","53811"],["53812","53813"],["53814","53815"],["53816","53817"],["53818","53819"],["53820","53821"],["53822","53823"],["53824","53825"],["53826","53827"],["53828","53829"],["53830","53831"],["53832","53833"],["53834","53835"],["53836","53837"],["53838","53839"],["53840","53841"],["53842"],["53843","53844"],["53845"],["53846","53847"],["53848","53849"],["53850","53851"],["53852","53853"],["53854","53855"],["53856","53857"],["53858","53859"],["53860","53861"],["53862"],["53863","53864"],["53865"],["53866","53867"],["53868","53869"],["53870","53871"],["53872","53873"],["53874","53875"],["53876","53877"],["53878","53879"],["53880","53881"],["53882","53883"],["53884","53885"],["53886","53887"],["53888","53889"],["53890","53891"],["53892","53893"],["53894","53895"],["53896","53897"],["53898","53899"],["53900","53901"],["53902","53903"],["53904","53905"],["53906","53907"],["53908","53909"],["53910","53911"],["53912","53913"],["53914","53915"],["53916","53917"],["53918","53919"],["53920","53921"],["53922","53923"],["53924","53925"],["53926","53927"],["53928","53929"],["53930","53931"],["53932","53933"],["53934","53935"],["53936","53937"],["53938","53939"],["53940","53941"],["53942","53943"],["53944","53945"],["53946","53947"],["53948","53949"],["53950","53951"],["53952","53953"],["53954","53955"],["53956","53957"],["53958","53959"],["53960","53961"],["53962","53963"],["53964","53965"],["53966","53967"],["53968","53969"],["53970","53971"],["53972","53973"],["53974","53975"],["53976","53977"],["53978","53979"],["53980","53981"],["53982","53983"],["53984","53985"],["53986","53987"],["53988","53989"],["53990","53991"],["53992","53993"],["53994","53995"],["53996","53997"],["53998","53999"],["54000","54001"],["54002","54003"],["54004","54005"],["54006","54007"],["54008","54009"],["54010","54011"],["54012","54013"],["54014","54015"],["54016","54017"],["54018","54019"],["54020","54021"],["54022","54023"],["54024","54025"],["54026","54027"],["54028","54029"],["54030","54031"],["54032","54033"],["54034","54035"],["54036","54037"],["54038","54039"],["54040","54041"],["54042","54043"],["54044","54045"],["54046","54047"],["54048","54049"],["54050","54051"],["54052","54053"],["54054","54055"],["54056","54057"],["54058","54059"],["54060","54061"],["54062","54063"],["54064","54065"],["54066","54067"],["54068","54069"],["54070","54071"],["54072","54073"],["54074","54075"],["54076","54077"],["54078","54079"],["54080","54081"],["54082","54083"],["54084","54085"],["54086","54087"],["54088","54089"],["54090","54091"],["54092","54093"],["54094","54095"],["54096","54097"],["54098","54099"],["54100","54101"],["54102","54103"],["54104","54105"],["54106","54107"],["54108","54109"],["54110","54111"],["54112","54113"],["54114","54115"],["54116","54117"],["54118","54119"],["54120","54121"],["54122","54123"],["54124","54125"],["54126","54127"],["54128","54129"],["54130","54131"],["54132","54133"],["54134","54135"],["54136","54137"],["54138","54139"],["54140","54141"],["54142","54143"],["54144","54145"],["54146","54147"],["54148","54149"],["54150","54151"],["54152","54153"],["54154","54155"],["54156","54157"],["54158","54159"],["54160","54161"],["54162","54163"],["54164","54165"],["54166","54167"],["54168","54169"],["54170","54171"],["54172","54173"],["54174","54175"],["54176","54177"],["54178","54179"],["54180","54181"],["54182","54183"],["54184","54185"],["54186","54187"],["54188","54189"],["54190"],["54191","54192"],["54193","54194"],["54195","54196"],["54197","54198"],["54199","54200"],["54201","54202"],["54203","54204"],["54205","54206"],["54207","54208"],["54209","54210"],["54211","54212"],["54213","54214"],["54215","54216"],["54217","54218"],["54219","54220"],["54221","54222"],["54223","54224"],["54225","54226"],["54227","54228"],["54229","54230"],["54231","54232"],["54233","54234"],["54235","54236"],["54237","54238"],["54239","54240"],["54241","54242"],["54243","54244"],["54245","54246"],["54247","54248"],["54249","54250"],["54251","54252"],["54253","54254"],["54255","54256"],["54257","54258"],["54259","54260"],["54261","54262"],["54263","54264"],["54265","54266"],["54267","54268"],["54269","54270"],["54271","54272"],["54273","54274"],["54275","54276"],["54277","54278"],["54279","54280"],["54281","54282"],["54283","54284"],["54285","54286"],["54287","54288"],["54289","54290"],["54291","54292"],["54293","54294"],["54295","54296"],["54297","54298"],["54299","54300"],["54301","54302"],["54303","54304"],["54305","54306"],["54307","54308"],["54309","54310"],["54311","54312"],["54313","54314"],["54315","54316"],["54317","54318"],["54319","54320"],["54321","54322"],["54323","54324"],["54325","54326"],["54327","54328"],["54329","54330"],["54331","54332"],["54333","54334"],["54335","54336"],["54337","54338"],["54339","54340"],["54341","54342"],["54343","54344"],["54345","54346"],["54347","54348"],["54349","54350"],["54351","54352"],["54353","54354"],["54355","54356"],["54357","54358"],["54359","54360"],["54361","54362"],["54363","54364"],["54365","54366"],["54367","54368"],["54369","54370"],["54371","54372"],["54373","54374"],["54375","54376"],["54377","54378"],["54379","54380"],["54381","54382"],["54383","54384"],["54385","54386"],["54387","54388"],["54389","54390"],["54391","54392"],["54393","54394"],["54395","54396"],["54397","54398"],["54399","54400"],["54401","54402"],["54403","54404"],["54405","54406"],["54407","54408"],["54409","54410"],["54411","54412"],["54413","54414"],["54415","54416"],["54417","54418"],["54419","54420"],["54421","54422"],["54423","54424"],["54425","54426"],["54427","54428"],["54429","54430"],["54431","54432"],["54433","54434"],["54435","54436"],["54437","54438"],["54439","54440"],["54441","54442"],["54443","54444"],["54445","54446"],["54447","54448"],["54449","54450"],["54451","54452"],["54453","54454"],["54455","54456"],["54457","54458"],["54459","54460"],["54461","54462"],["54463","54464"],["54465","54466"],["54467","54468"],["54469","54470"],["54471","54472"],["54473","54474"],["54475","54476"],["54477","54478"],["54479","54480"],["54481","54482"],["54483","54484"],["54485","54486"],["54487","54488"],["54489","54490"],["54491","54492"],["54493","54494"],["54495","54496"],["54497","54498"],["54499","54500"],["54501","54502"],["54503","54504"],["54505","54506"],["54507","54508"],["54509","54510"],["54511","54512"],["54513","54514"],["54515","54516"],["54517","54518"],["54519","54520"],["54521","54522"],["54523","54524"],["54525","54526"],["54527","54528"],["54529","54530"],["54531","54532"],["54533","54534"],["54535","54536"],["54537","54538"],["54539","54540"],["54541","54542"],["54543","54544"],["54545","54546"],["54547","54548"],["54549","54550"],["54551","54552"],["54553","54554"],["54555","54556"],["54557","54558"],["54559","54560"],["54561","54562"],["54563","54564"],["54565","54566"],["54567","54568"],["54569","54570"],["54571","54572"],["54573","54574"],["54575","54576"],["54577","54578"],["54579","54580"],["54581","54582"],["54583","54584"],["54585","54586"],["54587","54588"],["54589","54590"],["54591","54592"],["54593","54594"],["54595","54596"],["54597","54598"],["54599","54600"],["54601","54602"],["54603","54604"],["54605","54606"],["54607","54608"],["54609","54610"],["54611","54612"],["54613","54614"],["54615","54616"],["54617","54618"],["54619","54620"],["54621","54622"],["54623","54624"],["54625","54626"],["54627","54628"],["54629","54630"],["54631","54632"],["54633","54634"],["54635","54636"],["54637","54638"],["54639","54640"],["54641","54642"],["54643","54644"],["54645","54646"],["54647","54648"],["54649","54650"],["54651","54652"],["54653","54654"],["54655","54656"],["54657","54658"],["54659","54660"],["54661","54662"],["54663","54664"],["54665","54666"],["54667","54668"],["54669","54670"],["54671","54672"],["54673","54674"],["54675","54676"],["54677","54678"],["54679","54680"],["54681","54682"],["54683","54684"],["54685","54686"],["54687","54688"],["54689","54690"],["54691","54692"],["54693","54694"],["54695","54696"],["54697","54698"],["54699","54700"],["54701","54702"],["54703","54704"],["54705","54706"],["54707","54708"],["54709","54710"],["54711","54712"],["54713","54714"],["54715","54716"],["54717","54718"],["54719","54720"],["54721","54722"],["54723","54724"],["54725","54726"],["54727","54728"],["54729","54730"],["54731","54732"],["54733","54734"],["54735","54736"],["54737","54738"],["54739","54740"],["54741","54742"],["54743","54744"],["54745","54746"],["54747","54748"],["54749","54750"],["54751","54752"],["54753","54754"],["54755","54756"],["54757","54758"],["54759","54760"],["54761","54762"],["54763","54764"],["54765","54766"],["54767","54768"],["54769","54770"],["54771","54772"],["54773","54774"],["54775","54776"],["54777","54778"],["54779","54780"],["54781","54782"],["54783","54784"],["54785"],["54786","54787"],["54788","54789"],["54790","54791"],["54792","54793"],["54794","54795"],["54796","54797"],["54798","54799"],["54800","54801"],["54802","54803"],["54804","54805"],["54806","54807"],["54808","54809"],["54810","54811"],["54812","54813"],["54814","54815"],["54816","54817"],["54818","54819"],["54820","54821"],["54822","54823"],["54824","54825"],["54826","54827"],["54828","54829"],["54830","54831"],["54832","54833"],["54834","54835"],["54836","54837"],["54838","54839"],["54840","54841"],["54842","54843"],["54844","54845"],["54846","54847"],["54848","54849"],["54850","54851"],["54852","54853"],["54854","54855"],["54856","54857"],["54858","54859"],["54860","54861"],["54862","54863"],["54864","54865"],["54866","54867"],["54868","54869"],["54870","54871"],["54872","54873"],["54874","54875"],["54876","54877"],["54878","54879"],["54880","54881"],["54882","54883"],["54884","54885"],["54886","54887"],["54888","54889"],["54890","54891"],["54892","54893"],["54894","54895"],["54896","54897"],["54898","54899"],["54900","54901"],["54902","54903"],["54904","54905"],["54906","54907"],["54908","54909"],["54910","54911"],["54912","54913"],["54914","54915"],["54916","54917"],["54918","54919"],["54920","54921"],["54922","54923"],["54924","54925"],["54926","54927"],["54928","54929"],["54930","54931"],["54932","54933"],["54934","54935"],["54936","54937"],["54938","54939"],["54940","54941"],["54942","54943"],["54944","54945"],["54946","54947"],["54948","54949"],["54950","54951"],["54952","54953"],["54954","54955"],["54956","54957"],["54958","54959"],["54960","54961"],["54962","54963"],["54964","54965"],["54966","54967"],["54968","54969"],["54970","54971"],["54972","54973"],["54974","54975"],["54976","54977"],["54978","54979"],["54980","54981"],["54982","54983"],["54984","54985"],["54986","54987"],["54988","54989"],["54990","54991"],["54992","54993"],["54994","54995"],["54996","54997"],["54998","54999"],["55000","55001"],["55002","55003"],["55004","55005"],["55006","55007"],["55008","55009"],["55010","55011"],["55012","55013"],["55014","55015"],["55016","55017"],["55018","55019"],["55020","55021"],["55022","55023"],["55024","55025"],["55026","55027"],["55028","55029"],["55030","55031"],["55032","55033"],["55034","55035"],["55036","55037"],["55038","55039"],["55040","55041"],["55042","55043"],["55044","55045"],["55046","55047"],["55048","55049"],["55050","55051"],["55052","55053"],["55054","55055"],["55056","55057"],["55058","55059"],["55060","55061"],["55062","55063"],["55064","55065"],["55066","55067"],["55068","55069"],["55070","55071"],["55072","55073"],["55074","55075"],["55076","55077"],["55078","55079"],["55080","55081"],["55082","55083"],["55084","55085"],["55086","55087"],["55088","55089"],["55090","55091"],["55092","55093"],["55094","55095"],["55096","55097"],["55098","55099"],["55100","55101"],["55102","55103"],["55104","55105"],["55106","55107"],["55108","55109"],["55110","55111"],["55112","55113"],["55114","55115"],["55116","55117"],["55118","55119"],["55120","55121"],["55122","55123"],["55124","55125"],["55126","55127"],["55128","55129"],["55130","55131"],["55132","55133"],["55134","55135"],["55136","55137"],["55138","55139"],["55140","55141"],["55142","55143"],["55144","55145"],["55146","55147"],["55148","55149"],["55150","55151"],["55152","55153"],["55154","55155"],["55156","55157"],["55158","55159"],["55160","55161"],["55162","55163"],["55164","55165"],["55166","55167"],["55168","55169"],["55170","55171"],["55172","55173"],["55174","55175"],["55176","55177"],["55178","55179"],["55180","55181"],["55182","55183"],["55184","55185"],["55186","55187"],["55188","55189"],["55190","55191"],["55192","55193"],["55194","55195"],["55196","55197"],["55198","55199"],["55200","55201"],["55202","55203"],["55204","55205"],["55206","55207"],["55208","55209"],["55210","55211"],["55212","55213"],["55214","55215"],["55216","55217"],["55218","55219"],["55220","55221"],["55222","55223"],["55224","55225"],["55226","55227"],["55228","55229"],["55230","55231"],["55232","55233"],["55234","55235"],["55236","55237"],["55238","55239"],["55240","55241"],["55242","55243"],["55244","55245"],["55246","55247"],["55248","55249"],["55250","55251"],["55252","55253"],["55254","55255"],["55256","55257"],["55258","55259"],["55260","55261"],["55262","55263"],["55264","55265"],["55266","55267"],["55268","55269"],["55270","55271"],["55272","55273"],["55274","55275"],["55276","55277"],["55278","55279"],["55280","55281"],["55282","55283"],["55284","55285"],["55286","55287"],["55288","55289"],["55290","55291"],["55292","55293"],["55294","55295"],["55296","55297"],["55298","55299"],["55300","55301"],["55302","55303"],["55304","55305"],["55306","55307"],["55308","55309"],["55310","55311"],["55312","55313"],["55314","55315"],["55316","55317"],["55318","55319"],["55320","55321"],["55322","55323"],["55324","55325"],["55326","55327"],["55328","55329"],["55330","55331"],["55332","55333"],["55334","55335"],["55336","55337"],["55338","55339"],["55340","55341"],["55342","55343"],["55344","55345"],["55346","55347"],["55348","55349"],["55350","55351"],["55352","55353"],["55354","55355"],["55356","55357"],["55358","55359"],["55360","55361"],["55362","55363"],["55364","55365"],["55366","55367"],["55368","55369"],["55370","55371"],["55372","55373"],["55374","55375"],["55376","55377"],["55378","55379"],["55380","55381"],["55382","55383"],["55384","55385"],["55386","55387"],["55388","55389"],["55390","55391"],["55392","55393"],["55394","55395"],["55396","55397"],["55398","55399"],["55400","55401"],["55402","55403"],["55404","55405"],["55406","55407"],["55408","55409"],["55410","55411"],["55412","55413"],["55414","55415"],["55416","55417"],["55418","55419"],["55420","55421"],["55422","55423"],["55424","55425"],["55426","55427"],["55428","55429"],["55430","55431"],["55432","55433"],["55434","55435"],["55436","55437"],["55438","55439"],["55440","55441"],["55442","55443"],["55444","55445"],["55446","55447"],["55448","55449"],["55450","55451"],["55452","55453"],["55454","55455"],["55456","55457"],["55458","55459"],["55460","55461"],["55462","55463"],["55464","55465"],["55466","55467"],["55468","55469"],["55470","55471"],["55472","55473"],["55474","55475"],["55476","55477"],["55478","55479"],["55480","55481"],["55482","55483"],["55484","55485"],["55486","55487"],["55488","55489"],["55490","55491"],["55492","55493"],["55494","55495"],["55496","55497"],["55498","55499"],["55500","55501"],["55502","55503"],["55504","55505"],["55506","55507"],["55508","55509"],["55510","55511"],["55512","55513"],["55514","55515"],["55516","55517"],["55518","55519"],["55520","55521"],["55522","55523"],["55524","55525"],["55526","55527"],["55528","55529"],["55530","55531"],["55532","55533"],["55534","55535"],["55536","55537"],["55538","55539"],["55540","55541"],["55542","55543"],["55544","55545"],["55546","55547"],["55548","55549"],["55550","55551"],["55552","55553"],["55554","55555"],["55556","55557"],["55558","55559"],["55560","55561"],["55562","55563"],["55564","55565"],["55566","55567"],["55568","55569"],["55570","55571"],["55572","55573"],["55574","55575"],["55576","55577"],["55578","55579"],["55580","55581"],["55582","55583"],["55584","55585"],["55586","55587"],["55588","55589"],["55590","55591"],["55592","55593"],["55594","55595"],["55596","55597"],["55598","55599"],["55600","55601"],["55602","55603"],["55604","55605"],["55606","55607"],["55608","55609"],["55610","55611"],["55612","55613"],["55614","55615"],["55616","55617"],["55618","55619"],["55620","55621"],["55622","55623"],["55624","55625"],["55626","55627"],["55628","55629"],["55630","55631"],["55632","55633"],["55634","55635"],["55636","55637"],["55638","55639"],["55640","55641"],["55642","55643"],["55644","55645"],["55646","55647"],["55648","55649"],["55650","55651"],["55652","55653"],["55654","55655"],["55656","55657"],["55658","55659"],["55660","55661"],["55662","55663"],["55664","55665"],["55666","55667"],["55668","55669"],["55670","55671"],["55672","55673"],["55674","55675"],["55676","55677"],["55678","55679"],["55680","55681"],["55682","55683"],["55684","55685"],["55686","55687"],["55688","55689"],["55690","55691"],["55692","55693"],["55694","55695"],["55696","55697"],["55698","55699"],["55700","55701"],["55702","55703"],["55704","55705"],["55706","55707"],["55708","55709"],["55710","55711"],["55712","55713"],["55714","55715"],["55716","55717"],["55718","55719"],["55720","55721"],["55722","55723"],["55724","55725"],["55726","55727"],["55728","55729"],["55730","55731"],["55732","55733"],["55734","55735"],["55736","55737"],["55738","55739"],["55740","55741"],["55742","55743"],["55744","55745"],["55746","55747"],["55748","55749"],["55750","55751"],["55752","55753"],["55754","55755"],["55756","55757"],["55758","55759"],["55760","55761"],["55762","55763"],["55764","55765"],["55766","55767"],["55768","55769"],["55770","55771"],["55772","55773"],["55774","55775"],["55776","55777"],["55778","55779"],["55780","55781"],["55782","55783"],["55784","55785"],["55786","55787"],["55788","55789"],["55790","55791"],["55792","55793"],["55794","55795"],["55796","55797"],["55798","55799"],["55800","55801"],["55802","55803"],["55804","55805"],["55806","55807"],["55808","55809"],["55810","55811"],["55812","55813"],["55814","55815"],["55816","55817"],["55818","55819"],["55820","55821"],["55822","55823"],["55824","55825"],["55826","55827"],["55828","55829"],["55830","55831"],["55832","55833"],["55834","55835"],["55836","55837"],["55838","55839"],["55840","55841"],["55842","55843"],["55844","55845"],["55846","55847"],["55848","55849"],["55850","55851"],["55852","55853"],["55854","55855"],["55856","55857"],["55858","55859"],["55860","55861"],["55862","55863"],["55864","55865"],["55866","55867"],["55868","55869"],["55870","55871"],["55872","55873"],["55874","55875"],["55876","55877"],["55878","55879"],["55880","55881"],["55882","55883"],["55884","55885"],["55886","55887"],["55888","55889"],["55890","55891"],["55892","55893"],["55894","55895"],["55896","55897"],["55898","55899"],["55900","55901"],["55902","55903"],["55904","55905"],["55906","55907"],["55908"],["55909","55910"],["55911"],["55912","55913"],["55914","55915"],["55916","55917"],["55918","55919"],["55920","55921"],["55922","55923"],["55924","55925"],["55926","55927"],["55928","55929"],["55930","55931"],["55932","55933"],["55934","55935"],["55936","55937"],["55938","55939"],["55940","55941"],["55942","55943"],["55944","55945"],["55946","55947"],["55948","55949"],["55950","55951"],["55952","55953"],["55954","55955"],["55956","55957"],["55958","55959"],["55960","55961"],["55962","55963"],["55964","55965"],["55966","55967"],["55968","55969"],["55970","55971"],["55972","55973"],["55974","55975"],["55976","55977"],["55978","55979"],["55980","55981"],["55982","55983"],["55984","55985"],["55986","55987"],["55988","55989"],["55990","55991"],["55992","55993"],["55994","55995"],["55996","55997"],["55998","55999"],["56000","56001"],["56002","56003"],["56004","56005"],["56006","56007"],["56008","56009"],["56010","56011"],["56012","56013"],["56014","56015"],["56016","56017"],["56018","56019"],["56020","56021"],["56022","56023"],["56024","56025"],["56026","56027"],["56028","56029"],["56030","56031"],["56032","56033"],["56034","56035"],["56036","56037"],["56038","56039"],["56040","56041"],["56042","56043"],["56044","56045"],["56046","56047"],["56048","56049"],["56050","56051"],["56052","56053"],["56054","56055"],["56056","56057"],["56058","56059"],["56060","56061"],["56062","56063"],["56064","56065"],["56066","56067"],["56068","56069"],["56070","56071"],["56072","56073"],["56074","56075"],["56076","56077"],["56078","56079"],["56080","56081"],["56082","56083"],["56084","56085"],["56086","56087"],["56088","56089"],["56090","56091"],["56092","56093"],["56094","56095"],["56096","56097"],["56098","56099"],["56100","56101"],["56102","56103"],["56104","56105"],["56106","56107"],["56108","56109"],["56110","56111"],["56112","56113"],["56114","56115"],["56116","56117"],["56118","56119"],["56120","56121"],["56122","56123"],["56124","56125"],["56126","56127"],["56128","56129"],["56130","56131"],["56132","56133"],["56134","56135"],["56136","56137"],["56138","56139"],["56140","56141"],["56142","56143"],["56144","56145"],["56146","56147"],["56148","56149"],["56150","56151"],["56152","56153"],["56154","56155"],["56156","56157"],["56158","56159"],["56160","56161"],["56162","56163"],["56164","56165"],["56166","56167"],["56168","56169"],["56170","56171"],["56172","56173"],["56174","56175"],["56176","56177"],["56178","56179"],["56180","56181"],["56182","56183"],["56184","56185"],["56186","56187"],["56188","56189"],["56190","56191"],["56192","56193"],["56194","56195"],["56196","56197"],["56198","56199"],["56200","56201"],["56202","56203"],["56204","56205"],["56206","56207"],["56208","56209"],["56210","56211"],["56212","56213"],["56214","56215"],["56216","56217"],["56218","56219"],["56220","56221"],["56222","56223"],["56224","56225"],["56226","56227"],["56228","56229"],["56230","56231"],["56232","56233"],["56234","56235"],["56236","56237"],["56238","56239"],["56240","56241"],["56242","56243"],["56244","56245"],["56246","56247"],["56248","56249"],["56250","56251"],["56252","56253"],["56254","56255"],["56256","56257"],["56258","56259"],["56260","56261"],["56262","56263"],["56264","56265"],["56266","56267"],["56268","56269"],["56270","56271"],["56272","56273"],["56274","56275"],["56276","56277"],["56278","56279"],["56280","56281"],["56282","56283"],["56284","56285"],["56286","56287"],["56288","56289"],["56290","56291"],["56292","56293"],["56294","56295"],["56296","56297"],["56298","56299"],["56300","56301"],["56302","56303"],["56304","56305"],["56306","56307"],["56308","56309"],["56310","56311"],["56312","56313"],["56314","56315"],["56316","56317"],["56318","56319"],["56320","56321"],["56322","56323"],["56324","56325"],["56326","56327"],["56328","56329"],["56330","56331"],["56332","56333"],["56334","56335"],["56336","56337"],["56338","56339"],["56340","56341"],["56342","56343"],["56344","56345"],["56346","56347"],["56348","56349"],["56350","56351"],["56352","56353"],["56354","56355"],["56356","56357"],["56358","56359"],["56360","56361"],["56362","56363"],["56364","56365"],["56366","56367"],["56368","56369"],["56370","56371"],["56372","56373"],["56374","56375"],["56376","56377"],["56378","56379"],["56380","56381"],["56382","56383"],["56384","56385"],["56386","56387"],["56388","56389"],["56390","56391"],["56392","56393"],["56394","56395"],["56396","56397"],["56398","56399"],["56400","56401"],["56402","56403"],["56404","56405"],["56406","56407"],["56408","56409"],["56410","56411"],["56412","56413"],["56414","56415"],["56416","56417"],["56418","56419"],["56420","56421"],["56422","56423"],["56424","56425"],["56426","56427"],["56428","56429"],["56430","56431"],["56432","56433"],["56434","56435"],["56436","56437"],["56438","56439"],["56440","56441"],["56442","56443"],["56444","56445"],["56446","56447"],["56448","56449"],["56450","56451"],["56452","56453"],["56454","56455"],["56456","56457"],["56458","56459"],["56460","56461"],["56462","56463"],["56464","56465"],["56466","56467"],["56468","56469"],["56470","56471"],["56472","56473"],["56474","56475"],["56476","56477"],["56478","56479"],["56480","56481"],["56482","56483"],["56484","56485"],["56486","56487"],["56488","56489"],["56490","56491"],["56492","56493"],["56494","56495"],["56496","56497"],["56498","56499"],["56500","56501"],["56502","56503"],["56504","56505"],["56506","56507"],["56508","56509"],["56510","56511"],["56512","56513"],["56514","56515"],["56516","56517"],["56518","56519"],["56520","56521"],["56522","56523"],["56524","56525"],["56526","56527"],["56528","56529"],["56530","56531"],["56532","56533"],["56534","56535"],["56536","56537"],["56538","56539"],["56540","56541"],["56542","56543"],["56544","56545"],["56546","56547"],["56548","56549"],["56550","56551"],["56552","56553"],["56554","56555"],["56556","56557"],["56558","56559"],["56560","56561"],["56562","56563"],["56564","56565"],["56566","56567"],["56568","56569"],["56570","56571"],["56572","56573"],["56574","56575"],["56576","56577"],["56578","56579"],["56580","56581"],["56582","56583"],["56584","56585"],["56586","56587"],["56588","56589"],["56590","56591"],["56592","56593"],["56594","56595"],["56596","56597"],["56598","56599"],["56600","56601"],["56602","56603"],["56604","56605"],["56606","56607"],["56608","56609"],["56610","56611"],["56612","56613"],["56614","56615"],["56616","56617"],["56618","56619"],["56620","56621"],["56622","56623"],["56624","56625"],["56626","56627"],["56628","56629"],["56630","56631"],["56632","56633"],["56634","56635"],["56636","56637"],["56638","56639"],["56640","56641"],["56642","56643"],["56644","56645"],["56646","56647"],["56648","56649"],["56650","56651"],["56652","56653"],["56654","56655"],["56656","56657"],["56658","56659"],["56660","56661"],["56662","56663"],["56664","56665"],["56666","56667"],["56668","56669"],["56670","56671"],["56672","56673"],["56674","56675"],["56676","56677"],["56678","56679"],["56680","56681"],["56682","56683"],["56684","56685"],["56686","56687"],["56688","56689"],["56690","56691"],["56692","56693"],["56694","56695"],["56696","56697"],["56698","56699"],["56700","56701"],["56702","56703"],["56704","56705"],["56706","56707"],["56708","56709"],["56710","56711"],["56712","56713"],["56714","56715"],["56716","56717"],["56718","56719"],["56720","56721"],["56722","56723"],["56724","56725"],["56726","56727"],["56728","56729"],["56730","56731"],["56732","56733"],["56734","56735"],["56736","56737"],["56738","56739"],["56740","56741"],["56742","56743"],["56744","56745"],["56746","56747"],["56748","56749"],["56750","56751"],["56752","56753"],["56754","56755"],["56756","56757"],["56758","56759"],["56760","56761"],["56762","56763"],["56764","56765"],["56766","56767"],["56768","56769"],["56770","56771"],["56772","56773"],["56774","56775"],["56776","56777"],["56778","56779"],["56780","56781"],["56782","56783"],["56784","56785"],["56786","56787"],["56788","56789"],["56790","56791"],["56792","56793"],["56794","56795"],["56796","56797"],["56798","56799"],["56800","56801"],["56802","56803"],["56804","56805"],["56806","56807"],["56808","56809"],["56810","56811"],["56812","56813"],["56814","56815"],["56816","56817"],["56818","56819"],["56820","56821"],["56822","56823"],["56824","56825"],["56826","56827"],["56828","56829"],["56830","56831"],["56832","56833"],["56834","56835"],["56836","56837"],["56838","56839"],["56840","56841"],["56842","56843"],["56844","56845"],["56846","56847"],["56848","56849"],["56850","56851"],["56852","56853"],["56854","56855"],["56856","56857"],["56858","56859"],["56860","56861"],["56862","56863"],["56864","56865"],["56866","56867"],["56868","56869"],["56870","56871"],["56872","56873"],["56874","56875"],["56876","56877"],["56878","56879"],["56880","56881"],["56882","56883"],["56884","56885"],["56886","56887"],["56888","56889"],["56890","56891"],["56892","56893"],["56894","56895"],["56896","56897"],["56898","56899"],["56900","56901"],["56902","56903"],["56904","56905"],["56906","56907"],["56908","56909"],["56910","56911"],["56912","56913"],["56914","56915"],["56916","56917"],["56918","56919"],["56920","56921"],["56922","56923"],["56924","56925"],["56926","56927"],["56928","56929"],["56930","56931"],["56932","56933"],["56934","56935"],["56936","56937"],["56938","56939"],["56940","56941"],["56942","56943"],["56944","56945"],["56946","56947"],["56948","56949"],["56950","56951"],["56952","56953"],["56954","56955"],["56956","56957"],["56958","56959"],["56960","56961"],["56962","56963"],["56964","56965"],["56966","56967"],["56968","56969"],["56970","56971"],["56972","56973"],["56974","56975"],["56976","56977"],["56978","56979"],["56980","56981"],["56982","56983"],["56984","56985"],["56986","56987"],["56988","56989"],["56990","56991"],["56992","56993"],["56994","56995"],["56996","56997"],["56998","56999"],["57000","57001"],["57002","57003"],["57004","57005"],["57006","57007"],["57008","57009"],["57010","57011"],["57012","57013"],["57014","57015"],["57016","57017"],["57018","57019"],["57020","57021"],["57022","57023"],["57024","57025"],["57026","57027"],["57028","57029"],["57030","57031"],["57032","57033"],["57034","57035"],["57036","57037"],["57038","57039"],["57040","57041"],["57042","57043"],["57044","57045"],["57046","57047"],["57048","57049"],["57050","57051"],["57052","57053"],["57054","57055"],["57056","57057"],["57058","57059"],["57060","57061"],["57062","57063"],["57064","57065"],["57066","57067"],["57068","57069"],["57070","57071"],["57072","57073"],["57074","57075"],["57076","57077"],["57078","57079"],["57080","57081"],["57082","57083"],["57084","57085"],["57086","57087"],["57088","57089"],["57090","57091"],["57092","57093"],["57094","57095"],["57096","57097"],["57098","57099"],["57100","57101"],["57102","57103"],["57104","57105"],["57106","57107"],["57108","57109"],["57110","57111"],["57112","57113"],["57114","57115"],["57116","57117"],["57118","57119"],["57120","57121"],["57122","57123"],["57124","57125"],["57126","57127"],["57128","57129"],["57130","57131"],["57132","57133"],["57134","57135"],["57136","57137"],["57138","57139"],["57140","57141"],["57142","57143"],["57144","57145"],["57146","57147"],["57148","57149"],["57150","57151"],["57152","57153"],["57154","57155"],["57156","57157"],["57158","57159"],["57160","57161"],["57162","57163"],["57164","57165"],["57166","57167"],["57168","57169"],["57170","57171"],["57172","57173"],["57174","57175"],["57176","57177"],["57178","57179"],["57180","57181"],["57182","57183"],["57184","57185"],["57186","57187"],["57188","57189"],["57190","57191"],["57192","57193"],["57194","57195"],["57196","57197"],["57198","57199"],["57200","57201"],["57202","57203"],["57204","57205"],["57206","57207"],["57208","57209"],["57210","57211"],["57212","57213"],["57214","57215"],["57216","57217"],["57218","57219"],["57220","57221"],["57222","57223"],["57224","57225"],["57226","57227"],["57228","57229"],["57230","57231"],["57232","57233"],["57234","57235"],["57236","57237"],["57238","57239"],["57240","57241"],["57242","57243"],["57244","57245"],["57246","57247"],["57248","57249"],["57250","57251"],["57252","57253"],["57254","57255"],["57256","57257"],["57258","57259"],["57260","57261"],["57262","57263"],["57264","57265"],["57266","57267"],["57268","57269"],["57270","57271"],["57272","57273"],["57274","57275"],["57276","57277"],["57278","57279"],["57280","57281"],["57282","57283"],["57284","57285"],["57286","57287"],["57288","57289"],["57290","57291"],["57292","57293"],["57294","57295"],["57296","57297"],["57298","57299"],["57300","57301"],["57302","57303"],["57304","57305"],["57306","57307"],["57308","57309"],["57310","57311"],["57312","57313"],["57314","57315"],["57316","57317"],["57318","57319"],["57320","57321"],["57322","57323"],["57324","57325"],["57326","57327"],["57328","57329"],["57330","57331"],["57332","57333"],["57334","57335"],["57336","57337"],["57338","57339"],["57340","57341"],["57342","57343"],["57344","57345"],["57346","57347"],["57348","57349"],["57350","57351"],["57352","57353"],["57354","57355"],["57356","57357"],["57358","57359"],["57360","57361"],["57362","57363"],["57364","57365"],["57366","57367"],["57368","57369"],["57370","57371"],["57372","57373"],["57374","57375"],["57376","57377"],["57378","57379"],["57380","57381"],["57382","57383"],["57384","57385"],["57386","57387"],["57388","57389"],["57390","57391"],["57392","57393"],["57394","57395"],["57396","57397"],["57398","57399"],["57400","57401"],["57402","57403"],["57404","57405"],["57406","57407"],["57408","57409"],["57410","57411"],["57412","57413"],["57414","57415"],["57416","57417"],["57418","57419"],["57420","57421"],["57422","57423"],["57424","57425"],["57426","57427"],["57428","57429"],["57430","57431"],["57432","57433"],["57434","57435"],["57436","57437"],["57438","57439"],["57440","57441"],["57442","57443"],["57444","57445"],["57446","57447"],["57448","57449"],["57450","57451"],["57452","57453"],["57454","57455"],["57456","57457"],["57458","57459"],["57460","57461"],["57462","57463"],["57464","57465"],["57466","57467"],["57468","57469"],["57470","57471"],["57472","57473"],["57474","57475"],["57476","57477"],["57478","57479"],["57480","57481"],["57482","57483"],["57484","57485"],["57486","57487"],["57488","57489"],["57490","57491"],["57492","57493"],["57494","57495"],["57496","57497"],["57498","57499"],["57500","57501"],["57502","57503"],["57504","57505"],["57506","57507"],["57508","57509"],["57510","57511"],["57512","57513"],["57514","57515"],["57516","57517"],["57518","57519"],["57520","57521"],["57522","57523"],["57524","57525"],["57526","57527"],["57528","57529"],["57530","57531"],["57532","57533"],["57534","57535"],["57536","57537"],["57538","57539"],["57540","57541"],["57542","57543"],["57544","57545"],["57546","57547"],["57548","57549"],["57550","57551"],["57552","57553"],["57554","57555"],["57556","57557"],["57558","57559"],["57560"],["57561"],["57562"],"react-hooks/immutability","Error: This value cannot be modified\n\nModifying a variable defined outside a component or hook is not allowed. Consider using an effect.\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-improve-prompt.test.tsx:30:5\n 28 | captureRef.current = useHook();\n 29 | // eslint-disable-next-line react-hooks/immutability -- test harness: intentionally writes to outer capture object from inside component\n> 30 | hookRef.current = captureRef.current;\n | ^^^^^^^ value cannot be modified\n 31 | return null;\n 32 | }\n 33 |\n\nHint: If this value is a Ref (value returned by `useRef()`), rename the variable to end in \"Ref\".",["57563"],"Error: This value cannot be modified\n\nModifying a variable defined outside a component or hook is not allowed. Consider using an effect.\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-presets.test.tsx:30:5\n 28 | captureRef.current = useHook();\n 29 | // eslint-disable-next-line react-hooks/immutability -- test harness: intentionally writes to outer capture object from inside component\n> 30 | hookRef.current = captureRef.current;\n | ^^^^^^^ value cannot be modified\n 31 | return null;\n 32 | }\n 33 |\n\nHint: If this value is a Ref (value returned by `useRef()`), rename the variable to end in \"Ref\".",["57564"],"Error: This value cannot be modified\n\nModifying a variable defined outside a component or hook is not allowed. Consider using an effect.\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-stream-metrics.test.tsx:34:5\n 32 | // This is safe because captureRef lives inside the component.\n 33 | // eslint-disable-next-line react-hooks/immutability -- test harness: intentionally writes to outer capture object from inside component\n> 34 | hookRef.current = captureRef.current;\n | ^^^^^^^ value cannot be modified\n 35 | return null;\n 36 | }\n 37 |\n\nHint: If this value is a Ref (value returned by `useRef()`), rename the variable to end in \"Ref\".",["57565"],"Error: This value cannot be modified\n\nModifying a variable defined outside a component or hook is not allowed. Consider using an effect.\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-structured-output.test.tsx:29:5\n 27 | captureRef.current = useHook();\n 28 | // eslint-disable-next-line react-hooks/immutability -- test harness: intentionally writes to outer capture object from inside component\n> 29 | hookRef.current = captureRef.current;\n | ^^^^^^^ value cannot be modified\n 30 | return null;\n 31 | }\n 32 |\n\nHint: If this value is a Ref (value returned by `useRef()`), rename the variable to end in \"Ref\".",["57566"],"Error: This value cannot be modified\n\nModifying a variable defined outside a component or hook is not allowed. Consider using an effect.\n\n/home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/sweep-reds-basereds-2/tests/unit/ui/use-tools-builder.test.tsx:30:5\n 28 | captureRef.current = useHook();\n 29 | // eslint-disable-next-line react-hooks/immutability -- test harness: intentionally writes to outer capture object from inside component\n> 30 | hookRef.current = captureRef.current;\n | ^^^^^^^ value cannot be modified\n 31 | return null;\n 32 | }\n 33 |\n\nHint: If this value is a Ref (value returned by `useRef()`), rename the variable to end in \"Ref\".",["57567"],["57568","57569"],["57570","57571"],["57572","57573"],["57574","57575"],["57576","57577"],["57578","57579"],["57580","57581"],["57582","57583"],["57584","57585"],["57586","57587"],["57588","57589"],["57590","57591"],["57592","57593"],["57594","57595"],["57596","57597"],["57598","57599"],["57600","57601"],["57602","57603"],["57604","57605"],["57606","57607"],["57608","57609"],["57610","57611"],["57612","57613"],["57614","57615"],["57616","57617"],["57618","57619"],["57620","57621"],["57622","57623"],["57624","57625"],["57626","57627"],["57628","57629"],["57630","57631"],["57632","57633"],["57634","57635"],["57636","57637"],["57638","57639"],["57640","57641"],["57642","57643"],["57644","57645"],["57646","57647"],["57648","57649"],["57650","57651"],["57652","57653"],["57654","57655"],["57656","57657"],["57658","57659"],["57660","57661"],["57662","57663"],["57664","57665"],["57666","57667"],["57668","57669"],["57670","57671"],["57672","57673"],["57674","57675"],["57676","57677"],["57678","57679"],["57680","57681"],["57682","57683"],["57684","57685"],["57686","57687"],["57688","57689"],["57690","57691"],["57692","57693"],["57694","57695"],["57696","57697"],["57698","57699"],["57700","57701"],["57702","57703"],["57704","57705"],["57706","57707"],["57708","57709"],["57710","57711"],["57712","57713"],["57714","57715"],["57716","57717"],["57718","57719"],["57720","57721"],["57722","57723"],["57724","57725"],["57726","57727"],["57728","57729"],["57730","57731"],["57732","57733"],["57734","57735"],["57736","57737"],["57738","57739"],["57740","57741"],["57742","57743"],["57744","57745"],["57746","57747"],["57748","57749"],["57750","57751"],["57752","57753"],["57754","57755"],["57756","57757"],["57758","57759"],["57760","57761"],["57762","57763"],["57764","57765"],["57766","57767"],["57768","57769"],["57770","57771"],["57772","57773"],["57774","57775"],["57776","57777"],["57778","57779"],["57780","57781"],["57782","57783"],["57784","57785"],["57786","57787"],["57788","57789"],["57790","57791"],["57792","57793"],["57794","57795"],["57796","57797"],["57798","57799"],["57800","57801"],["57802","57803"],["57804","57805"],["57806","57807"],["57808","57809"],["57810","57811"],["57812","57813"],["57814","57815"],["57816","57817"],["57818","57819"],["57820","57821"],["57822","57823"],["57824","57825"],["57826","57827"],["57828","57829"],["57830","57831"],["57832","57833"],["57834","57835"],["57836","57837"],["57838","57839"],["57840","57841"],["57842","57843"],["57844","57845"],["57846","57847"],["57848","57849"],["57850","57851"],["57852","57853"],["57854","57855"],["57856","57857"],["57858","57859"],["57860","57861"],["57862","57863"],["57864","57865"],["57866","57867"],["57868","57869"],["57870","57871"],["57872","57873"],["57874","57875"],["57876","57877"],["57878","57879"],["57880","57881"],["57882","57883"],["57884","57885"],["57886","57887"],["57888","57889"],["57890","57891"],["57892","57893"],["57894","57895"],["57896","57897"],["57898","57899"],["57900","57901"],["57902","57903"],["57904","57905"],["57906","57907"],["57908","57909"],["57910","57911"],["57912","57913"],["57914","57915"],["57916","57917"],["57918","57919"],["57920","57921"],["57922","57923"],["57924","57925"],["57926","57927"],["57928","57929"],["57930","57931"],["57932","57933"],["57934","57935"],["57936","57937"],{"messageId":"57938","fix":"57939","desc":"57940"},{"messageId":"57941","fix":"57942","desc":"57943"},{"messageId":"57938","fix":"57944","desc":"57940"},{"messageId":"57941","fix":"57945","desc":"57943"},{"messageId":"57938","fix":"57946","desc":"57940"},{"messageId":"57941","fix":"57947","desc":"57943"},{"messageId":"57938","fix":"57948","desc":"57940"},{"messageId":"57941","fix":"57949","desc":"57943"},{"messageId":"57938","fix":"57950","desc":"57940"},{"messageId":"57941","fix":"57951","desc":"57943"},{"messageId":"57938","fix":"57952","desc":"57940"},{"messageId":"57941","fix":"57953","desc":"57943"},{"messageId":"57938","fix":"57954","desc":"57940"},{"messageId":"57941","fix":"57955","desc":"57943"},{"messageId":"57938","fix":"57956","desc":"57940"},{"messageId":"57941","fix":"57957","desc":"57943"},{"messageId":"57938","fix":"57958","desc":"57940"},{"messageId":"57941","fix":"57959","desc":"57943"},{"messageId":"57938","fix":"57960","desc":"57940"},{"messageId":"57941","fix":"57961","desc":"57943"},{"messageId":"57938","fix":"57962","desc":"57940"},{"messageId":"57941","fix":"57963","desc":"57943"},{"messageId":"57938","fix":"57964","desc":"57940"},{"messageId":"57941","fix":"57965","desc":"57943"},{"messageId":"57938","fix":"57966","desc":"57940"},{"messageId":"57941","fix":"57967","desc":"57943"},{"messageId":"57938","fix":"57968","desc":"57940"},{"messageId":"57941","fix":"57969","desc":"57943"},{"messageId":"57938","fix":"57970","desc":"57940"},{"messageId":"57941","fix":"57971","desc":"57943"},{"messageId":"57938","fix":"57972","desc":"57940"},{"messageId":"57941","fix":"57973","desc":"57943"},{"messageId":"57938","fix":"57974","desc":"57940"},{"messageId":"57941","fix":"57975","desc":"57943"},{"messageId":"57938","fix":"57976","desc":"57940"},{"messageId":"57941","fix":"57977","desc":"57943"},{"messageId":"57938","fix":"57978","desc":"57940"},{"messageId":"57941","fix":"57979","desc":"57943"},{"messageId":"57938","fix":"57980","desc":"57940"},{"messageId":"57941","fix":"57981","desc":"57943"},{"messageId":"57938","fix":"57982","desc":"57940"},{"messageId":"57941","fix":"57983","desc":"57943"},{"messageId":"57938","fix":"57984","desc":"57940"},{"messageId":"57941","fix":"57985","desc":"57943"},{"messageId":"57938","fix":"57986","desc":"57940"},{"messageId":"57941","fix":"57987","desc":"57943"},{"messageId":"57938","fix":"57988","desc":"57940"},{"messageId":"57941","fix":"57989","desc":"57943"},{"messageId":"57938","fix":"57990","desc":"57940"},{"messageId":"57941","fix":"57991","desc":"57943"},{"messageId":"57938","fix":"57992","desc":"57940"},{"messageId":"57941","fix":"57993","desc":"57943"},{"messageId":"57938","fix":"57994","desc":"57940"},{"messageId":"57941","fix":"57995","desc":"57943"},{"messageId":"57938","fix":"57996","desc":"57940"},{"messageId":"57941","fix":"57997","desc":"57943"},{"messageId":"57938","fix":"57998","desc":"57940"},{"messageId":"57941","fix":"57999","desc":"57943"},{"messageId":"57938","fix":"58000","desc":"57940"},{"messageId":"57941","fix":"58001","desc":"57943"},{"messageId":"57938","fix":"58002","desc":"57940"},{"messageId":"57941","fix":"58003","desc":"57943"},{"messageId":"57938","fix":"58004","desc":"57940"},{"messageId":"57941","fix":"58005","desc":"57943"},{"messageId":"57938","fix":"58006","desc":"57940"},{"messageId":"57941","fix":"58007","desc":"57943"},{"messageId":"57938","fix":"58008","desc":"57940"},{"messageId":"57941","fix":"58009","desc":"57943"},{"messageId":"57938","fix":"58010","desc":"57940"},{"messageId":"57941","fix":"58011","desc":"57943"},{"messageId":"57938","fix":"58012","desc":"57940"},{"messageId":"57941","fix":"58013","desc":"57943"},{"messageId":"57938","fix":"58014","desc":"57940"},{"messageId":"57941","fix":"58015","desc":"57943"},{"messageId":"57938","fix":"58016","desc":"57940"},{"messageId":"57941","fix":"58017","desc":"57943"},{"messageId":"57938","fix":"58018","desc":"57940"},{"messageId":"57941","fix":"58019","desc":"57943"},{"messageId":"57938","fix":"58020","desc":"57940"},{"messageId":"57941","fix":"58021","desc":"57943"},{"messageId":"57938","fix":"58022","desc":"57940"},{"messageId":"57941","fix":"58023","desc":"57943"},{"messageId":"57938","fix":"58024","desc":"57940"},{"messageId":"57941","fix":"58025","desc":"57943"},{"messageId":"57938","fix":"58026","desc":"57940"},{"messageId":"57941","fix":"58027","desc":"57943"},{"messageId":"57938","fix":"58028","desc":"57940"},{"messageId":"57941","fix":"58029","desc":"57943"},{"messageId":"57938","fix":"58030","desc":"57940"},{"messageId":"57941","fix":"58031","desc":"57943"},{"messageId":"57938","fix":"58032","desc":"57940"},{"messageId":"57941","fix":"58033","desc":"57943"},{"messageId":"57938","fix":"58034","desc":"57940"},{"messageId":"57941","fix":"58035","desc":"57943"},{"messageId":"57938","fix":"58036","desc":"57940"},{"messageId":"57941","fix":"58037","desc":"57943"},{"messageId":"57938","fix":"58038","desc":"57940"},{"messageId":"57941","fix":"58039","desc":"57943"},{"messageId":"57938","fix":"58040","desc":"57940"},{"messageId":"57941","fix":"58041","desc":"57943"},{"messageId":"57938","fix":"58042","desc":"57940"},{"messageId":"57941","fix":"58043","desc":"57943"},{"messageId":"57938","fix":"58044","desc":"57940"},{"messageId":"57941","fix":"58045","desc":"57943"},{"messageId":"57938","fix":"58046","desc":"57940"},{"messageId":"57941","fix":"58047","desc":"57943"},{"messageId":"57938","fix":"58048","desc":"57940"},{"messageId":"57941","fix":"58049","desc":"57943"},{"messageId":"57938","fix":"58050","desc":"57940"},{"messageId":"57941","fix":"58051","desc":"57943"},{"messageId":"57938","fix":"58052","desc":"57940"},{"messageId":"57941","fix":"58053","desc":"57943"},{"messageId":"57938","fix":"58054","desc":"57940"},{"messageId":"57941","fix":"58055","desc":"57943"},{"messageId":"57938","fix":"58056","desc":"57940"},{"messageId":"57941","fix":"58057","desc":"57943"},{"messageId":"57938","fix":"58058","desc":"57940"},{"messageId":"57941","fix":"58059","desc":"57943"},{"messageId":"57938","fix":"58060","desc":"57940"},{"messageId":"57941","fix":"58061","desc":"57943"},{"messageId":"57938","fix":"58062","desc":"57940"},{"messageId":"57941","fix":"58063","desc":"57943"},{"messageId":"57938","fix":"58064","desc":"57940"},{"messageId":"57941","fix":"58065","desc":"57943"},{"messageId":"57938","fix":"58066","desc":"57940"},{"messageId":"57941","fix":"58067","desc":"57943"},{"messageId":"57938","fix":"58068","desc":"57940"},{"messageId":"57941","fix":"58069","desc":"57943"},{"messageId":"57938","fix":"58070","desc":"57940"},{"messageId":"57941","fix":"58071","desc":"57943"},{"messageId":"57938","fix":"58072","desc":"57940"},{"messageId":"57941","fix":"58073","desc":"57943"},{"messageId":"57938","fix":"58074","desc":"57940"},{"messageId":"57941","fix":"58075","desc":"57943"},{"messageId":"57938","fix":"58076","desc":"57940"},{"messageId":"57941","fix":"58077","desc":"57943"},{"messageId":"57938","fix":"58078","desc":"57940"},{"messageId":"57941","fix":"58079","desc":"57943"},{"messageId":"57938","fix":"58080","desc":"57940"},{"messageId":"57941","fix":"58081","desc":"57943"},{"messageId":"57938","fix":"58082","desc":"57940"},{"messageId":"57941","fix":"58083","desc":"57943"},{"messageId":"57938","fix":"58084","desc":"57940"},{"messageId":"57941","fix":"58085","desc":"57943"},{"messageId":"57938","fix":"58086","desc":"57940"},{"messageId":"57941","fix":"58087","desc":"57943"},{"messageId":"57938","fix":"58088","desc":"57940"},{"messageId":"57941","fix":"58089","desc":"57943"},{"messageId":"57938","fix":"58090","desc":"57940"},{"messageId":"57941","fix":"58091","desc":"57943"},{"messageId":"57938","fix":"58092","desc":"57940"},{"messageId":"57941","fix":"58093","desc":"57943"},{"messageId":"57938","fix":"58094","desc":"57940"},{"messageId":"57941","fix":"58095","desc":"57943"},{"messageId":"57938","fix":"58096","desc":"57940"},{"messageId":"57941","fix":"58097","desc":"57943"},{"messageId":"57938","fix":"58098","desc":"57940"},{"messageId":"57941","fix":"58099","desc":"57943"},{"messageId":"57938","fix":"58100","desc":"57940"},{"messageId":"57941","fix":"58101","desc":"57943"},{"messageId":"57938","fix":"58102","desc":"57940"},{"messageId":"57941","fix":"58103","desc":"57943"},{"messageId":"57938","fix":"58104","desc":"57940"},{"messageId":"57941","fix":"58105","desc":"57943"},{"messageId":"57938","fix":"58106","desc":"57940"},{"messageId":"57941","fix":"58107","desc":"57943"},{"messageId":"57938","fix":"58108","desc":"57940"},{"messageId":"57941","fix":"58109","desc":"57943"},{"messageId":"57938","fix":"58110","desc":"57940"},{"messageId":"57941","fix":"58111","desc":"57943"},{"messageId":"57938","fix":"58112","desc":"57940"},{"messageId":"57941","fix":"58113","desc":"57943"},{"messageId":"57938","fix":"58114","desc":"57940"},{"messageId":"57941","fix":"58115","desc":"57943"},{"messageId":"57938","fix":"58116","desc":"57940"},{"messageId":"57941","fix":"58117","desc":"57943"},{"messageId":"57938","fix":"58118","desc":"57940"},{"messageId":"57941","fix":"58119","desc":"57943"},{"messageId":"57938","fix":"58120","desc":"57940"},{"messageId":"57941","fix":"58121","desc":"57943"},{"messageId":"57938","fix":"58122","desc":"57940"},{"messageId":"57941","fix":"58123","desc":"57943"},{"messageId":"57938","fix":"58124","desc":"57940"},{"messageId":"57941","fix":"58125","desc":"57943"},{"messageId":"57938","fix":"58126","desc":"57940"},{"messageId":"57941","fix":"58127","desc":"57943"},{"messageId":"57938","fix":"58128","desc":"57940"},{"messageId":"57941","fix":"58129","desc":"57943"},{"messageId":"57938","fix":"58130","desc":"57940"},{"messageId":"57941","fix":"58131","desc":"57943"},{"messageId":"57938","fix":"58132","desc":"57940"},{"messageId":"57941","fix":"58133","desc":"57943"},{"messageId":"57938","fix":"58134","desc":"57940"},{"messageId":"57941","fix":"58135","desc":"57943"},{"messageId":"57938","fix":"58136","desc":"57940"},{"messageId":"57941","fix":"58137","desc":"57943"},{"messageId":"57938","fix":"58138","desc":"57940"},{"messageId":"57941","fix":"58139","desc":"57943"},{"messageId":"57938","fix":"58140","desc":"57940"},{"messageId":"57941","fix":"58141","desc":"57943"},{"messageId":"57938","fix":"58142","desc":"57940"},{"messageId":"57941","fix":"58143","desc":"57943"},{"messageId":"57938","fix":"58144","desc":"57940"},{"messageId":"57941","fix":"58145","desc":"57943"},{"messageId":"57938","fix":"58146","desc":"57940"},{"messageId":"57941","fix":"58147","desc":"57943"},{"messageId":"57938","fix":"58148","desc":"57940"},{"messageId":"57941","fix":"58149","desc":"57943"},{"messageId":"57938","fix":"58150","desc":"57940"},{"messageId":"57941","fix":"58151","desc":"57943"},{"messageId":"57938","fix":"58152","desc":"57940"},{"messageId":"57941","fix":"58153","desc":"57943"},{"messageId":"57938","fix":"58154","desc":"57940"},{"messageId":"57941","fix":"58155","desc":"57943"},{"messageId":"57938","fix":"58156","desc":"57940"},{"messageId":"57941","fix":"58157","desc":"57943"},{"messageId":"57938","fix":"58158","desc":"57940"},{"messageId":"57941","fix":"58159","desc":"57943"},{"messageId":"57938","fix":"58160","desc":"57940"},{"messageId":"57941","fix":"58161","desc":"57943"},{"messageId":"57938","fix":"58162","desc":"57940"},{"messageId":"57941","fix":"58163","desc":"57943"},{"messageId":"57938","fix":"58164","desc":"57940"},{"messageId":"57941","fix":"58165","desc":"57943"},{"messageId":"57938","fix":"58166","desc":"57940"},{"messageId":"57941","fix":"58167","desc":"57943"},{"messageId":"57938","fix":"58168","desc":"57940"},{"messageId":"57941","fix":"58169","desc":"57943"},{"messageId":"57938","fix":"58170","desc":"57940"},{"messageId":"57941","fix":"58171","desc":"57943"},{"messageId":"57938","fix":"58172","desc":"57940"},{"messageId":"57941","fix":"58173","desc":"57943"},{"messageId":"57938","fix":"58174","desc":"57940"},{"messageId":"57941","fix":"58175","desc":"57943"},{"messageId":"57938","fix":"58176","desc":"57940"},{"messageId":"57941","fix":"58177","desc":"57943"},{"messageId":"57938","fix":"58178","desc":"57940"},{"messageId":"57941","fix":"58179","desc":"57943"},{"messageId":"57938","fix":"58180","desc":"57940"},{"messageId":"57941","fix":"58181","desc":"57943"},{"messageId":"57938","fix":"58182","desc":"57940"},{"messageId":"57941","fix":"58183","desc":"57943"},{"messageId":"57938","fix":"58184","desc":"57940"},{"messageId":"57941","fix":"58185","desc":"57943"},{"messageId":"57938","fix":"58186","desc":"57940"},{"messageId":"57941","fix":"58187","desc":"57943"},{"messageId":"57938","fix":"58188","desc":"57940"},{"messageId":"57941","fix":"58189","desc":"57943"},{"messageId":"57938","fix":"58190","desc":"57940"},{"messageId":"57941","fix":"58191","desc":"57943"},{"messageId":"57938","fix":"58192","desc":"57940"},{"messageId":"57941","fix":"58193","desc":"57943"},{"messageId":"57938","fix":"58194","desc":"57940"},{"messageId":"57941","fix":"58195","desc":"57943"},{"messageId":"57938","fix":"58196","desc":"57940"},{"messageId":"57941","fix":"58197","desc":"57943"},{"messageId":"57938","fix":"58198","desc":"57940"},{"messageId":"57941","fix":"58199","desc":"57943"},{"messageId":"57938","fix":"58200","desc":"57940"},{"messageId":"57941","fix":"58201","desc":"57943"},{"messageId":"57938","fix":"58202","desc":"57940"},{"messageId":"57941","fix":"58203","desc":"57943"},{"messageId":"57938","fix":"58204","desc":"57940"},{"messageId":"57941","fix":"58205","desc":"57943"},{"messageId":"57938","fix":"58206","desc":"57940"},{"messageId":"57941","fix":"58207","desc":"57943"},{"messageId":"57938","fix":"58208","desc":"57940"},{"messageId":"57941","fix":"58209","desc":"57943"},{"messageId":"57938","fix":"58210","desc":"57940"},{"messageId":"57941","fix":"58211","desc":"57943"},{"messageId":"57938","fix":"58212","desc":"57940"},{"messageId":"57941","fix":"58213","desc":"57943"},{"messageId":"57938","fix":"58214","desc":"57940"},{"messageId":"57941","fix":"58215","desc":"57943"},{"messageId":"57938","fix":"58216","desc":"57940"},{"messageId":"57941","fix":"58217","desc":"57943"},{"messageId":"57938","fix":"58218","desc":"57940"},{"messageId":"57941","fix":"58219","desc":"57943"},{"messageId":"57938","fix":"58220","desc":"57940"},{"messageId":"57941","fix":"58221","desc":"57943"},{"messageId":"57938","fix":"58222","desc":"57940"},{"messageId":"57941","fix":"58223","desc":"57943"},{"messageId":"57938","fix":"58224","desc":"57940"},{"messageId":"57941","fix":"58225","desc":"57943"},{"messageId":"57938","fix":"58226","desc":"57940"},{"messageId":"57941","fix":"58227","desc":"57943"},{"messageId":"57938","fix":"58228","desc":"57940"},{"messageId":"57941","fix":"58229","desc":"57943"},{"messageId":"57938","fix":"58230","desc":"57940"},{"messageId":"57941","fix":"58231","desc":"57943"},{"messageId":"57938","fix":"58232","desc":"57940"},{"messageId":"57941","fix":"58233","desc":"57943"},{"messageId":"57938","fix":"58234","desc":"57940"},{"messageId":"57941","fix":"58235","desc":"57943"},{"messageId":"57938","fix":"58236","desc":"57940"},{"messageId":"57941","fix":"58237","desc":"57943"},{"messageId":"57938","fix":"58238","desc":"57940"},{"messageId":"57941","fix":"58239","desc":"57943"},{"messageId":"57938","fix":"58240","desc":"57940"},{"messageId":"57941","fix":"58241","desc":"57943"},{"messageId":"57938","fix":"58242","desc":"57940"},{"messageId":"57941","fix":"58243","desc":"57943"},{"messageId":"57938","fix":"58244","desc":"57940"},{"messageId":"57941","fix":"58245","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"58248","desc":"57940"},{"messageId":"57941","fix":"58249","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"58250","desc":"57940"},{"messageId":"57941","fix":"58251","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"58252","desc":"57940"},{"messageId":"57941","fix":"58253","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"58254","desc":"57940"},{"messageId":"57941","fix":"58255","desc":"57943"},{"messageId":"57938","fix":"58256","desc":"57940"},{"messageId":"57941","fix":"58257","desc":"57943"},{"messageId":"57938","fix":"58258","desc":"57940"},{"messageId":"57941","fix":"58259","desc":"57943"},{"messageId":"57938","fix":"58260","desc":"57940"},{"messageId":"57941","fix":"58261","desc":"57943"},{"messageId":"57938","fix":"58262","desc":"57940"},{"messageId":"57941","fix":"58263","desc":"57943"},{"messageId":"57938","fix":"58264","desc":"57940"},{"messageId":"57941","fix":"58265","desc":"57943"},{"messageId":"57938","fix":"58266","desc":"57940"},{"messageId":"57941","fix":"58267","desc":"57943"},{"messageId":"57938","fix":"58268","desc":"57940"},{"messageId":"57941","fix":"58269","desc":"57943"},{"messageId":"57938","fix":"58270","desc":"57940"},{"messageId":"57941","fix":"58271","desc":"57943"},{"messageId":"57938","fix":"58272","desc":"57940"},{"messageId":"57941","fix":"58273","desc":"57943"},{"messageId":"57938","fix":"58274","desc":"57940"},{"messageId":"57941","fix":"58275","desc":"57943"},{"messageId":"57938","fix":"58276","desc":"57940"},{"messageId":"57941","fix":"58277","desc":"57943"},{"messageId":"57938","fix":"58278","desc":"57940"},{"messageId":"57941","fix":"58279","desc":"57943"},{"messageId":"57938","fix":"58280","desc":"57940"},{"messageId":"57941","fix":"58281","desc":"57943"},{"messageId":"57938","fix":"58282","desc":"57940"},{"messageId":"57941","fix":"58283","desc":"57943"},{"messageId":"57938","fix":"58284","desc":"57940"},{"messageId":"57941","fix":"58285","desc":"57943"},{"messageId":"57938","fix":"58286","desc":"57940"},{"messageId":"57941","fix":"58287","desc":"57943"},{"desc":"58288","fix":"58289"},{"desc":"58290","fix":"58291"},{"kind":"58246","justification":"58292"},{"kind":"58246","justification":"58293"},{"kind":"58246","justification":"58293"},{"desc":"58294","fix":"58295"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"58296"},{"kind":"58246","justification":"58296"},{"kind":"58246","justification":"58296"},{"kind":"58246","justification":"58296"},{"kind":"58246","justification":"58296"},{"kind":"58246","justification":"58247"},{"desc":"58297","fix":"58298"},{"kind":"58246","justification":"58247"},{"desc":"58299","fix":"58300"},{"kind":"58246","justification":"58296"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"58301"},{"desc":"58302","fix":"58303"},{"kind":"58246","justification":"58247"},{"desc":"58304","fix":"58305"},{"kind":"58246","justification":"58247"},{"desc":"58306","fix":"58307"},{"kind":"58246","justification":"58247"},{"desc":"58308","fix":"58309"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"58247"},{"desc":"58310","fix":"58311"},{"kind":"58246","justification":"58247"},{"desc":"58312","fix":"58313"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"58247"},{"desc":"58314","fix":"58315"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"58247"},{"desc":"58316","fix":"58317"},{"kind":"58246","justification":"58318"},{"desc":"58319","fix":"58320"},{"kind":"58246","justification":"58247"},{"desc":"58321","fix":"58322"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"58296"},{"desc":"58323","fix":"58324"},{"kind":"58246","justification":"58247"},{"desc":"58325","fix":"58326"},{"kind":"58246","justification":"58247"},{"desc":"58327","fix":"58328"},{"kind":"58246","justification":"58247"},{"desc":"58329","fix":"58330"},{"desc":"58331","fix":"58332"},{"kind":"58246","justification":"58293"},{"kind":"58246","justification":"58333"},{"desc":"58334","fix":"58335"},{"kind":"58246","justification":"58247"},{"desc":"58336","fix":"58337"},{"kind":"58246","justification":"58247"},{"desc":"58338","fix":"58339"},{"kind":"58246","justification":"58247"},{"desc":"58327","fix":"58340"},{"kind":"58246","justification":"58247"},{"desc":"58341","fix":"58342"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"58296"},{"kind":"58246","justification":"58296"},{"desc":"58343","fix":"58344"},{"desc":"58345","fix":"58346"},{"desc":"58347","fix":"58348"},{"kind":"58246","justification":"58247"},{"desc":"58349","fix":"58350"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"58351"},{"kind":"58246","justification":"58352"},{"desc":"58353","fix":"58354"},{"desc":"58355","fix":"58356"},{"desc":"58357","fix":"58358"},{"desc":"58359","fix":"58360"},{"desc":"58361","fix":"58362"},{"desc":"58363","fix":"58364"},{"desc":"58363","fix":"58365"},{"desc":"58366","fix":"58367"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"58368","desc":"57940"},{"messageId":"57941","fix":"58369","desc":"57943"},{"messageId":"57938","fix":"58370","desc":"57940"},{"messageId":"57941","fix":"58371","desc":"57943"},{"messageId":"57938","fix":"58372","desc":"57940"},{"messageId":"57941","fix":"58373","desc":"57943"},{"messageId":"57938","fix":"58374","desc":"57940"},{"messageId":"57941","fix":"58375","desc":"57943"},{"messageId":"57938","fix":"58376","desc":"57940"},{"messageId":"57941","fix":"58377","desc":"57943"},{"messageId":"57938","fix":"58378","desc":"57940"},{"messageId":"57941","fix":"58379","desc":"57943"},{"messageId":"57938","fix":"58380","desc":"57940"},{"messageId":"57941","fix":"58381","desc":"57943"},{"messageId":"57938","fix":"58382","desc":"57940"},{"messageId":"57941","fix":"58383","desc":"57943"},{"messageId":"57938","fix":"58384","desc":"57940"},{"messageId":"57941","fix":"58385","desc":"57943"},{"messageId":"57938","fix":"58386","desc":"57940"},{"messageId":"57941","fix":"58387","desc":"57943"},{"messageId":"57938","fix":"58388","desc":"57940"},{"messageId":"57941","fix":"58389","desc":"57943"},{"messageId":"57938","fix":"58390","desc":"57940"},{"messageId":"57941","fix":"58391","desc":"57943"},{"messageId":"57938","fix":"58392","desc":"57940"},{"messageId":"57941","fix":"58393","desc":"57943"},{"messageId":"57938","fix":"58394","desc":"57940"},{"messageId":"57941","fix":"58395","desc":"57943"},{"messageId":"57938","fix":"58396","desc":"57940"},{"messageId":"57941","fix":"58397","desc":"57943"},{"messageId":"57938","fix":"58398","desc":"57940"},{"messageId":"57941","fix":"58399","desc":"57943"},{"messageId":"57938","fix":"58400","desc":"57940"},{"messageId":"57941","fix":"58401","desc":"57943"},{"messageId":"57938","fix":"58402","desc":"57940"},{"messageId":"57941","fix":"58403","desc":"57943"},{"messageId":"57938","fix":"58404","desc":"57940"},{"messageId":"57941","fix":"58405","desc":"57943"},{"messageId":"57938","fix":"58406","desc":"57940"},{"messageId":"57941","fix":"58407","desc":"57943"},{"messageId":"57938","fix":"58408","desc":"57940"},{"messageId":"57941","fix":"58409","desc":"57943"},{"messageId":"57938","fix":"58410","desc":"57940"},{"messageId":"57941","fix":"58411","desc":"57943"},{"messageId":"57938","fix":"58412","desc":"57940"},{"messageId":"57941","fix":"58413","desc":"57943"},{"messageId":"57938","fix":"58414","desc":"57940"},{"messageId":"57941","fix":"58415","desc":"57943"},{"messageId":"57938","fix":"58416","desc":"57940"},{"messageId":"57941","fix":"58417","desc":"57943"},{"messageId":"57938","fix":"58418","desc":"57940"},{"messageId":"57941","fix":"58419","desc":"57943"},{"messageId":"57938","fix":"58420","desc":"57940"},{"messageId":"57941","fix":"58421","desc":"57943"},{"messageId":"57938","fix":"58422","desc":"57940"},{"messageId":"57941","fix":"58423","desc":"57943"},{"messageId":"57938","fix":"58424","desc":"57940"},{"messageId":"57941","fix":"58425","desc":"57943"},{"messageId":"57938","fix":"58426","desc":"57940"},{"messageId":"57941","fix":"58427","desc":"57943"},{"messageId":"57938","fix":"58428","desc":"57940"},{"messageId":"57941","fix":"58429","desc":"57943"},{"messageId":"57938","fix":"58430","desc":"57940"},{"messageId":"57941","fix":"58431","desc":"57943"},{"messageId":"57938","fix":"58432","desc":"57940"},{"messageId":"57941","fix":"58433","desc":"57943"},{"messageId":"57938","fix":"58434","desc":"57940"},{"messageId":"57941","fix":"58435","desc":"57943"},{"messageId":"57938","fix":"58436","desc":"57940"},{"messageId":"57941","fix":"58437","desc":"57943"},{"messageId":"57938","fix":"58438","desc":"57940"},{"messageId":"57941","fix":"58439","desc":"57943"},{"messageId":"57938","fix":"58440","desc":"57940"},{"messageId":"57941","fix":"58441","desc":"57943"},{"messageId":"57938","fix":"58442","desc":"57940"},{"messageId":"57941","fix":"58443","desc":"57943"},{"messageId":"57938","fix":"58444","desc":"57940"},{"messageId":"57941","fix":"58445","desc":"57943"},{"messageId":"57938","fix":"58446","desc":"57940"},{"messageId":"57941","fix":"58447","desc":"57943"},{"messageId":"57938","fix":"58448","desc":"57940"},{"messageId":"57941","fix":"58449","desc":"57943"},{"messageId":"57938","fix":"58450","desc":"57940"},{"messageId":"57941","fix":"58451","desc":"57943"},{"messageId":"57938","fix":"58452","desc":"57940"},{"messageId":"57941","fix":"58453","desc":"57943"},{"messageId":"57938","fix":"58454","desc":"57940"},{"messageId":"57941","fix":"58455","desc":"57943"},{"messageId":"57938","fix":"58456","desc":"57940"},{"messageId":"57941","fix":"58457","desc":"57943"},{"messageId":"57938","fix":"58458","desc":"57940"},{"messageId":"57941","fix":"58459","desc":"57943"},{"messageId":"57938","fix":"58460","desc":"57940"},{"messageId":"57941","fix":"58461","desc":"57943"},{"messageId":"57938","fix":"58462","desc":"57940"},{"messageId":"57941","fix":"58463","desc":"57943"},{"messageId":"57938","fix":"58464","desc":"57940"},{"messageId":"57941","fix":"58465","desc":"57943"},{"messageId":"57938","fix":"58466","desc":"57940"},{"messageId":"57941","fix":"58467","desc":"57943"},{"messageId":"57938","fix":"58468","desc":"57940"},{"messageId":"57941","fix":"58469","desc":"57943"},{"messageId":"57938","fix":"58470","desc":"57940"},{"messageId":"57941","fix":"58471","desc":"57943"},{"messageId":"57938","fix":"58472","desc":"57940"},{"messageId":"57941","fix":"58473","desc":"57943"},{"messageId":"57938","fix":"58474","desc":"57940"},{"messageId":"57941","fix":"58475","desc":"57943"},{"messageId":"57938","fix":"58476","desc":"57940"},{"messageId":"57941","fix":"58477","desc":"57943"},{"messageId":"57938","fix":"58478","desc":"57940"},{"messageId":"57941","fix":"58479","desc":"57943"},{"messageId":"57938","fix":"58480","desc":"57940"},{"messageId":"57941","fix":"58481","desc":"57943"},{"messageId":"57938","fix":"58482","desc":"57940"},{"messageId":"57941","fix":"58483","desc":"57943"},{"messageId":"57938","fix":"58484","desc":"57940"},{"messageId":"57941","fix":"58485","desc":"57943"},{"messageId":"57938","fix":"58486","desc":"57940"},{"messageId":"57941","fix":"58487","desc":"57943"},{"messageId":"57938","fix":"58488","desc":"57940"},{"messageId":"57941","fix":"58489","desc":"57943"},{"messageId":"57938","fix":"58490","desc":"57940"},{"messageId":"57941","fix":"58491","desc":"57943"},{"messageId":"57938","fix":"58492","desc":"57940"},{"messageId":"57941","fix":"58493","desc":"57943"},{"messageId":"57938","fix":"58494","desc":"57940"},{"messageId":"57941","fix":"58495","desc":"57943"},{"messageId":"57938","fix":"58496","desc":"57940"},{"messageId":"57941","fix":"58497","desc":"57943"},{"messageId":"57938","fix":"58498","desc":"57940"},{"messageId":"57941","fix":"58499","desc":"57943"},{"messageId":"57938","fix":"58500","desc":"57940"},{"messageId":"57941","fix":"58501","desc":"57943"},{"messageId":"57938","fix":"58502","desc":"57940"},{"messageId":"57941","fix":"58503","desc":"57943"},{"messageId":"57938","fix":"58504","desc":"57940"},{"messageId":"57941","fix":"58505","desc":"57943"},{"messageId":"57938","fix":"58506","desc":"57940"},{"messageId":"57941","fix":"58507","desc":"57943"},{"messageId":"57938","fix":"58508","desc":"57940"},{"messageId":"57941","fix":"58509","desc":"57943"},{"messageId":"57938","fix":"58510","desc":"57940"},{"messageId":"57941","fix":"58511","desc":"57943"},{"messageId":"57938","fix":"58512","desc":"57940"},{"messageId":"57941","fix":"58513","desc":"57943"},{"messageId":"57938","fix":"58514","desc":"57940"},{"messageId":"57941","fix":"58515","desc":"57943"},{"messageId":"57938","fix":"58516","desc":"57940"},{"messageId":"57941","fix":"58517","desc":"57943"},{"messageId":"57938","fix":"58518","desc":"57940"},{"messageId":"57941","fix":"58519","desc":"57943"},{"messageId":"57938","fix":"58520","desc":"57940"},{"messageId":"57941","fix":"58521","desc":"57943"},{"messageId":"57938","fix":"58522","desc":"57940"},{"messageId":"57941","fix":"58523","desc":"57943"},{"messageId":"57938","fix":"58524","desc":"57940"},{"messageId":"57941","fix":"58525","desc":"57943"},{"messageId":"57938","fix":"58526","desc":"57940"},{"messageId":"57941","fix":"58527","desc":"57943"},{"messageId":"57938","fix":"58528","desc":"57940"},{"messageId":"57941","fix":"58529","desc":"57943"},{"messageId":"57938","fix":"58530","desc":"57940"},{"messageId":"57941","fix":"58531","desc":"57943"},{"messageId":"57938","fix":"58532","desc":"57940"},{"messageId":"57941","fix":"58533","desc":"57943"},{"messageId":"57938","fix":"58534","desc":"57940"},{"messageId":"57941","fix":"58535","desc":"57943"},{"messageId":"57938","fix":"58536","desc":"57940"},{"messageId":"57941","fix":"58537","desc":"57943"},{"messageId":"57938","fix":"58538","desc":"57940"},{"messageId":"57941","fix":"58539","desc":"57943"},{"messageId":"57938","fix":"58540","desc":"57940"},{"messageId":"57941","fix":"58541","desc":"57943"},{"messageId":"57938","fix":"58542","desc":"57940"},{"messageId":"57941","fix":"58543","desc":"57943"},{"messageId":"57938","fix":"58544","desc":"57940"},{"messageId":"57941","fix":"58545","desc":"57943"},{"messageId":"57938","fix":"58546","desc":"57940"},{"messageId":"57941","fix":"58547","desc":"57943"},{"messageId":"57938","fix":"58548","desc":"57940"},{"messageId":"57941","fix":"58549","desc":"57943"},{"messageId":"57938","fix":"58550","desc":"57940"},{"messageId":"57941","fix":"58551","desc":"57943"},{"messageId":"57938","fix":"58552","desc":"57940"},{"messageId":"57941","fix":"58553","desc":"57943"},{"messageId":"57938","fix":"58554","desc":"57940"},{"messageId":"57941","fix":"58555","desc":"57943"},{"messageId":"57938","fix":"58556","desc":"57940"},{"messageId":"57941","fix":"58557","desc":"57943"},{"messageId":"57938","fix":"58558","desc":"57940"},{"messageId":"57941","fix":"58559","desc":"57943"},{"messageId":"57938","fix":"58560","desc":"57940"},{"messageId":"57941","fix":"58561","desc":"57943"},{"messageId":"57938","fix":"58562","desc":"57940"},{"messageId":"57941","fix":"58563","desc":"57943"},{"messageId":"57938","fix":"58564","desc":"57940"},{"messageId":"57941","fix":"58565","desc":"57943"},{"messageId":"57938","fix":"58566","desc":"57940"},{"messageId":"57941","fix":"58567","desc":"57943"},{"messageId":"57938","fix":"58568","desc":"57940"},{"messageId":"57941","fix":"58569","desc":"57943"},{"messageId":"57938","fix":"58570","desc":"57940"},{"messageId":"57941","fix":"58571","desc":"57943"},{"messageId":"57938","fix":"58572","desc":"57940"},{"messageId":"57941","fix":"58573","desc":"57943"},{"messageId":"57938","fix":"58574","desc":"57940"},{"messageId":"57941","fix":"58575","desc":"57943"},{"messageId":"57938","fix":"58576","desc":"57940"},{"messageId":"57941","fix":"58577","desc":"57943"},{"messageId":"57938","fix":"58578","desc":"57940"},{"messageId":"57941","fix":"58579","desc":"57943"},{"messageId":"57938","fix":"58580","desc":"57940"},{"messageId":"57941","fix":"58581","desc":"57943"},{"messageId":"57938","fix":"58582","desc":"57940"},{"messageId":"57941","fix":"58583","desc":"57943"},{"messageId":"57938","fix":"58584","desc":"57940"},{"messageId":"57941","fix":"58585","desc":"57943"},{"messageId":"57938","fix":"58586","desc":"57940"},{"messageId":"57941","fix":"58587","desc":"57943"},{"messageId":"57938","fix":"58588","desc":"57940"},{"messageId":"57941","fix":"58589","desc":"57943"},{"messageId":"57938","fix":"58590","desc":"57940"},{"messageId":"57941","fix":"58591","desc":"57943"},{"messageId":"57938","fix":"58592","desc":"57940"},{"messageId":"57941","fix":"58593","desc":"57943"},{"messageId":"57938","fix":"58594","desc":"57940"},{"messageId":"57941","fix":"58595","desc":"57943"},{"messageId":"57938","fix":"58596","desc":"57940"},{"messageId":"57941","fix":"58597","desc":"57943"},{"messageId":"57938","fix":"58598","desc":"57940"},{"messageId":"57941","fix":"58599","desc":"57943"},{"messageId":"57938","fix":"58600","desc":"57940"},{"messageId":"57941","fix":"58601","desc":"57943"},{"messageId":"57938","fix":"58602","desc":"57940"},{"messageId":"57941","fix":"58603","desc":"57943"},{"messageId":"57938","fix":"58604","desc":"57940"},{"messageId":"57941","fix":"58605","desc":"57943"},{"messageId":"57938","fix":"58606","desc":"57940"},{"messageId":"57941","fix":"58607","desc":"57943"},{"messageId":"57938","fix":"58608","desc":"57940"},{"messageId":"57941","fix":"58609","desc":"57943"},{"messageId":"57938","fix":"58610","desc":"57940"},{"messageId":"57941","fix":"58611","desc":"57943"},{"messageId":"57938","fix":"58612","desc":"57940"},{"messageId":"57941","fix":"58613","desc":"57943"},{"messageId":"57938","fix":"58614","desc":"57940"},{"messageId":"57941","fix":"58615","desc":"57943"},{"messageId":"57938","fix":"58616","desc":"57940"},{"messageId":"57941","fix":"58617","desc":"57943"},{"messageId":"57938","fix":"58618","desc":"57940"},{"messageId":"57941","fix":"58619","desc":"57943"},{"messageId":"57938","fix":"58620","desc":"57940"},{"messageId":"57941","fix":"58621","desc":"57943"},{"messageId":"57938","fix":"58622","desc":"57940"},{"messageId":"57941","fix":"58623","desc":"57943"},{"messageId":"57938","fix":"58624","desc":"57940"},{"messageId":"57941","fix":"58625","desc":"57943"},{"messageId":"57938","fix":"58626","desc":"57940"},{"messageId":"57941","fix":"58627","desc":"57943"},{"messageId":"57938","fix":"58628","desc":"57940"},{"messageId":"57941","fix":"58629","desc":"57943"},{"messageId":"57938","fix":"58630","desc":"57940"},{"messageId":"57941","fix":"58631","desc":"57943"},{"messageId":"57938","fix":"58632","desc":"57940"},{"messageId":"57941","fix":"58633","desc":"57943"},{"messageId":"57938","fix":"58634","desc":"57940"},{"messageId":"57941","fix":"58635","desc":"57943"},{"messageId":"57938","fix":"58636","desc":"57940"},{"messageId":"57941","fix":"58637","desc":"57943"},{"messageId":"57938","fix":"58638","desc":"57940"},{"messageId":"57941","fix":"58639","desc":"57943"},{"messageId":"57938","fix":"58640","desc":"57940"},{"messageId":"57941","fix":"58641","desc":"57943"},{"messageId":"57938","fix":"58642","desc":"57940"},{"messageId":"57941","fix":"58643","desc":"57943"},{"messageId":"57938","fix":"58644","desc":"57940"},{"messageId":"57941","fix":"58645","desc":"57943"},{"messageId":"57938","fix":"58646","desc":"57940"},{"messageId":"57941","fix":"58647","desc":"57943"},{"messageId":"57938","fix":"58648","desc":"57940"},{"messageId":"57941","fix":"58649","desc":"57943"},{"messageId":"57938","fix":"58650","desc":"57940"},{"messageId":"57941","fix":"58651","desc":"57943"},{"messageId":"57938","fix":"58652","desc":"57940"},{"messageId":"57941","fix":"58653","desc":"57943"},{"messageId":"57938","fix":"58654","desc":"57940"},{"messageId":"57941","fix":"58655","desc":"57943"},{"messageId":"57938","fix":"58656","desc":"57940"},{"messageId":"57941","fix":"58657","desc":"57943"},{"messageId":"57938","fix":"58658","desc":"57940"},{"messageId":"57941","fix":"58659","desc":"57943"},{"messageId":"57938","fix":"58660","desc":"57940"},{"messageId":"57941","fix":"58661","desc":"57943"},{"messageId":"57938","fix":"58662","desc":"57940"},{"messageId":"57941","fix":"58663","desc":"57943"},{"messageId":"57938","fix":"58664","desc":"57940"},{"messageId":"57941","fix":"58665","desc":"57943"},{"messageId":"57938","fix":"58666","desc":"57940"},{"messageId":"57941","fix":"58667","desc":"57943"},{"messageId":"57938","fix":"58668","desc":"57940"},{"messageId":"57941","fix":"58669","desc":"57943"},{"messageId":"57938","fix":"58670","desc":"57940"},{"messageId":"57941","fix":"58671","desc":"57943"},{"messageId":"57938","fix":"58672","desc":"57940"},{"messageId":"57941","fix":"58673","desc":"57943"},{"messageId":"57938","fix":"58674","desc":"57940"},{"messageId":"57941","fix":"58675","desc":"57943"},{"messageId":"57938","fix":"58676","desc":"57940"},{"messageId":"57941","fix":"58677","desc":"57943"},{"messageId":"57938","fix":"58678","desc":"57940"},{"messageId":"57941","fix":"58679","desc":"57943"},{"messageId":"57938","fix":"58680","desc":"57940"},{"messageId":"57941","fix":"58681","desc":"57943"},{"messageId":"57938","fix":"58682","desc":"57940"},{"messageId":"57941","fix":"58683","desc":"57943"},{"messageId":"57938","fix":"58684","desc":"57940"},{"messageId":"57941","fix":"58685","desc":"57943"},{"messageId":"57938","fix":"58686","desc":"57940"},{"messageId":"57941","fix":"58687","desc":"57943"},{"messageId":"57938","fix":"58688","desc":"57940"},{"messageId":"57941","fix":"58689","desc":"57943"},{"messageId":"57938","fix":"58690","desc":"57940"},{"messageId":"57941","fix":"58691","desc":"57943"},{"messageId":"57938","fix":"58692","desc":"57940"},{"messageId":"57941","fix":"58693","desc":"57943"},{"messageId":"57938","fix":"58694","desc":"57940"},{"messageId":"57941","fix":"58695","desc":"57943"},{"messageId":"57938","fix":"58696","desc":"57940"},{"messageId":"57941","fix":"58697","desc":"57943"},{"messageId":"57938","fix":"58698","desc":"57940"},{"messageId":"57941","fix":"58699","desc":"57943"},{"messageId":"57938","fix":"58700","desc":"57940"},{"messageId":"57941","fix":"58701","desc":"57943"},{"messageId":"57938","fix":"58702","desc":"57940"},{"messageId":"57941","fix":"58703","desc":"57943"},{"messageId":"57938","fix":"58704","desc":"57940"},{"messageId":"57941","fix":"58705","desc":"57943"},{"messageId":"57938","fix":"58706","desc":"57940"},{"messageId":"57941","fix":"58707","desc":"57943"},{"messageId":"57938","fix":"58708","desc":"57940"},{"messageId":"57941","fix":"58709","desc":"57943"},{"messageId":"57938","fix":"58710","desc":"57940"},{"messageId":"57941","fix":"58711","desc":"57943"},{"messageId":"57938","fix":"58712","desc":"57940"},{"messageId":"57941","fix":"58713","desc":"57943"},{"messageId":"57938","fix":"58714","desc":"57940"},{"messageId":"57941","fix":"58715","desc":"57943"},{"messageId":"57938","fix":"58716","desc":"57940"},{"messageId":"57941","fix":"58717","desc":"57943"},{"messageId":"57938","fix":"58718","desc":"57940"},{"messageId":"57941","fix":"58719","desc":"57943"},{"messageId":"57938","fix":"58720","desc":"57940"},{"messageId":"57941","fix":"58721","desc":"57943"},{"messageId":"57938","fix":"58722","desc":"57940"},{"messageId":"57941","fix":"58723","desc":"57943"},{"messageId":"57938","fix":"58724","desc":"57940"},{"messageId":"57941","fix":"58725","desc":"57943"},{"messageId":"57938","fix":"58726","desc":"57940"},{"messageId":"57941","fix":"58727","desc":"57943"},{"messageId":"57938","fix":"58728","desc":"57940"},{"messageId":"57941","fix":"58729","desc":"57943"},{"messageId":"57938","fix":"58730","desc":"57940"},{"messageId":"57941","fix":"58731","desc":"57943"},{"messageId":"57938","fix":"58732","desc":"57940"},{"messageId":"57941","fix":"58733","desc":"57943"},{"messageId":"57938","fix":"58734","desc":"57940"},{"messageId":"57941","fix":"58735","desc":"57943"},{"messageId":"57938","fix":"58736","desc":"57940"},{"messageId":"57941","fix":"58737","desc":"57943"},{"messageId":"57938","fix":"58738","desc":"57940"},{"messageId":"57941","fix":"58739","desc":"57943"},{"messageId":"57938","fix":"58740","desc":"57940"},{"messageId":"57941","fix":"58741","desc":"57943"},{"messageId":"57938","fix":"58742","desc":"57940"},{"messageId":"57941","fix":"58743","desc":"57943"},{"messageId":"57938","fix":"58744","desc":"57940"},{"messageId":"57941","fix":"58745","desc":"57943"},{"messageId":"57938","fix":"58746","desc":"57940"},{"messageId":"57941","fix":"58747","desc":"57943"},{"messageId":"57938","fix":"58748","desc":"57940"},{"messageId":"57941","fix":"58749","desc":"57943"},{"messageId":"57938","fix":"58750","desc":"57940"},{"messageId":"57941","fix":"58751","desc":"57943"},{"messageId":"57938","fix":"58752","desc":"57940"},{"messageId":"57941","fix":"58753","desc":"57943"},{"messageId":"57938","fix":"58754","desc":"57940"},{"messageId":"57941","fix":"58755","desc":"57943"},{"messageId":"57938","fix":"58756","desc":"57940"},{"messageId":"57941","fix":"58757","desc":"57943"},{"messageId":"57938","fix":"58758","desc":"57940"},{"messageId":"57941","fix":"58759","desc":"57943"},{"messageId":"57938","fix":"58760","desc":"57940"},{"messageId":"57941","fix":"58761","desc":"57943"},{"messageId":"57938","fix":"58762","desc":"57940"},{"messageId":"57941","fix":"58763","desc":"57943"},{"messageId":"57938","fix":"58764","desc":"57940"},{"messageId":"57941","fix":"58765","desc":"57943"},{"messageId":"57938","fix":"58766","desc":"57940"},{"messageId":"57941","fix":"58767","desc":"57943"},{"messageId":"57938","fix":"58768","desc":"57940"},{"messageId":"57941","fix":"58769","desc":"57943"},{"messageId":"57938","fix":"58770","desc":"57940"},{"messageId":"57941","fix":"58771","desc":"57943"},{"messageId":"57938","fix":"58772","desc":"57940"},{"messageId":"57941","fix":"58773","desc":"57943"},{"messageId":"57938","fix":"58774","desc":"57940"},{"messageId":"57941","fix":"58775","desc":"57943"},{"messageId":"57938","fix":"58776","desc":"57940"},{"messageId":"57941","fix":"58777","desc":"57943"},{"messageId":"57938","fix":"58778","desc":"57940"},{"messageId":"57941","fix":"58779","desc":"57943"},{"messageId":"57938","fix":"58780","desc":"57940"},{"messageId":"57941","fix":"58781","desc":"57943"},{"messageId":"57938","fix":"58782","desc":"57940"},{"messageId":"57941","fix":"58783","desc":"57943"},{"messageId":"57938","fix":"58784","desc":"57940"},{"messageId":"57941","fix":"58785","desc":"57943"},{"messageId":"57938","fix":"58786","desc":"57940"},{"messageId":"57941","fix":"58787","desc":"57943"},{"messageId":"57938","fix":"58788","desc":"57940"},{"messageId":"57941","fix":"58789","desc":"57943"},{"messageId":"57938","fix":"58790","desc":"57940"},{"messageId":"57941","fix":"58791","desc":"57943"},{"messageId":"57938","fix":"58792","desc":"57940"},{"messageId":"57941","fix":"58793","desc":"57943"},{"messageId":"57938","fix":"58794","desc":"57940"},{"messageId":"57941","fix":"58795","desc":"57943"},{"messageId":"57938","fix":"58796","desc":"57940"},{"messageId":"57941","fix":"58797","desc":"57943"},{"messageId":"57938","fix":"58798","desc":"57940"},{"messageId":"57941","fix":"58799","desc":"57943"},{"messageId":"57938","fix":"58800","desc":"57940"},{"messageId":"57941","fix":"58801","desc":"57943"},{"messageId":"57938","fix":"58802","desc":"57940"},{"messageId":"57941","fix":"58803","desc":"57943"},{"messageId":"57938","fix":"58804","desc":"57940"},{"messageId":"57941","fix":"58805","desc":"57943"},{"messageId":"57938","fix":"58806","desc":"57940"},{"messageId":"57941","fix":"58807","desc":"57943"},{"messageId":"57938","fix":"58808","desc":"57940"},{"messageId":"57941","fix":"58809","desc":"57943"},{"messageId":"57938","fix":"58810","desc":"57940"},{"messageId":"57941","fix":"58811","desc":"57943"},{"messageId":"57938","fix":"58812","desc":"57940"},{"messageId":"57941","fix":"58813","desc":"57943"},{"messageId":"57938","fix":"58814","desc":"57940"},{"messageId":"57941","fix":"58815","desc":"57943"},{"messageId":"57938","fix":"58816","desc":"57940"},{"messageId":"57941","fix":"58817","desc":"57943"},{"messageId":"57938","fix":"58818","desc":"57940"},{"messageId":"57941","fix":"58819","desc":"57943"},{"messageId":"57938","fix":"58820","desc":"57940"},{"messageId":"57941","fix":"58821","desc":"57943"},{"messageId":"57938","fix":"58822","desc":"57940"},{"messageId":"57941","fix":"58823","desc":"57943"},{"messageId":"57938","fix":"58824","desc":"57940"},{"messageId":"57941","fix":"58825","desc":"57943"},{"messageId":"57938","fix":"58826","desc":"57940"},{"messageId":"57941","fix":"58827","desc":"57943"},{"messageId":"57938","fix":"58828","desc":"57940"},{"messageId":"57941","fix":"58829","desc":"57943"},{"messageId":"57938","fix":"58830","desc":"57940"},{"messageId":"57941","fix":"58831","desc":"57943"},{"messageId":"57938","fix":"58832","desc":"57940"},{"messageId":"57941","fix":"58833","desc":"57943"},{"messageId":"57938","fix":"58834","desc":"57940"},{"messageId":"57941","fix":"58835","desc":"57943"},{"messageId":"57938","fix":"58836","desc":"57940"},{"messageId":"57941","fix":"58837","desc":"57943"},{"messageId":"57938","fix":"58838","desc":"57940"},{"messageId":"57941","fix":"58839","desc":"57943"},{"messageId":"57938","fix":"58840","desc":"57940"},{"messageId":"57941","fix":"58841","desc":"57943"},{"messageId":"57938","fix":"58842","desc":"57940"},{"messageId":"57941","fix":"58843","desc":"57943"},{"messageId":"57938","fix":"58844","desc":"57940"},{"messageId":"57941","fix":"58845","desc":"57943"},{"messageId":"57938","fix":"58846","desc":"57940"},{"messageId":"57941","fix":"58847","desc":"57943"},{"messageId":"57938","fix":"58848","desc":"57940"},{"messageId":"57941","fix":"58849","desc":"57943"},{"messageId":"57938","fix":"58850","desc":"57940"},{"messageId":"57941","fix":"58851","desc":"57943"},{"messageId":"57938","fix":"58852","desc":"57940"},{"messageId":"57941","fix":"58853","desc":"57943"},{"messageId":"57938","fix":"58854","desc":"57940"},{"messageId":"57941","fix":"58855","desc":"57943"},{"messageId":"57938","fix":"58856","desc":"57940"},{"messageId":"57941","fix":"58857","desc":"57943"},{"messageId":"57938","fix":"58858","desc":"57940"},{"messageId":"57941","fix":"58859","desc":"57943"},{"messageId":"57938","fix":"58860","desc":"57940"},{"messageId":"57941","fix":"58861","desc":"57943"},{"messageId":"57938","fix":"58862","desc":"57940"},{"messageId":"57941","fix":"58863","desc":"57943"},{"messageId":"57938","fix":"58864","desc":"57940"},{"messageId":"57941","fix":"58865","desc":"57943"},{"messageId":"57938","fix":"58866","desc":"57940"},{"messageId":"57941","fix":"58867","desc":"57943"},{"messageId":"57938","fix":"58868","desc":"57940"},{"messageId":"57941","fix":"58869","desc":"57943"},{"messageId":"57938","fix":"58870","desc":"57940"},{"messageId":"57941","fix":"58871","desc":"57943"},{"messageId":"57938","fix":"58872","desc":"57940"},{"messageId":"57941","fix":"58873","desc":"57943"},{"messageId":"57938","fix":"58874","desc":"57940"},{"messageId":"57941","fix":"58875","desc":"57943"},{"messageId":"57938","fix":"58876","desc":"57940"},{"messageId":"57941","fix":"58877","desc":"57943"},{"messageId":"57938","fix":"58878","desc":"57940"},{"messageId":"57941","fix":"58879","desc":"57943"},{"messageId":"57938","fix":"58880","desc":"57940"},{"messageId":"57941","fix":"58881","desc":"57943"},{"messageId":"57938","fix":"58882","desc":"57940"},{"messageId":"57941","fix":"58883","desc":"57943"},{"messageId":"57938","fix":"58884","desc":"57940"},{"messageId":"57941","fix":"58885","desc":"57943"},{"messageId":"57938","fix":"58886","desc":"57940"},{"messageId":"57941","fix":"58887","desc":"57943"},{"messageId":"57938","fix":"58888","desc":"57940"},{"messageId":"57941","fix":"58889","desc":"57943"},{"messageId":"57938","fix":"58890","desc":"57940"},{"messageId":"57941","fix":"58891","desc":"57943"},{"messageId":"57938","fix":"58892","desc":"57940"},{"messageId":"57941","fix":"58893","desc":"57943"},{"messageId":"57938","fix":"58894","desc":"57940"},{"messageId":"57941","fix":"58895","desc":"57943"},{"messageId":"57938","fix":"58896","desc":"57940"},{"messageId":"57941","fix":"58897","desc":"57943"},{"messageId":"57938","fix":"58898","desc":"57940"},{"messageId":"57941","fix":"58899","desc":"57943"},{"messageId":"57938","fix":"58900","desc":"57940"},{"messageId":"57941","fix":"58901","desc":"57943"},{"messageId":"57938","fix":"58902","desc":"57940"},{"messageId":"57941","fix":"58903","desc":"57943"},{"messageId":"57938","fix":"58904","desc":"57940"},{"messageId":"57941","fix":"58905","desc":"57943"},{"messageId":"57938","fix":"58906","desc":"57940"},{"messageId":"57941","fix":"58907","desc":"57943"},{"messageId":"57938","fix":"58908","desc":"57940"},{"messageId":"57941","fix":"58909","desc":"57943"},{"messageId":"57938","fix":"58910","desc":"57940"},{"messageId":"57941","fix":"58911","desc":"57943"},{"messageId":"57938","fix":"58912","desc":"57940"},{"messageId":"57941","fix":"58913","desc":"57943"},{"messageId":"57938","fix":"58914","desc":"57940"},{"messageId":"57941","fix":"58915","desc":"57943"},{"messageId":"57938","fix":"58916","desc":"57940"},{"messageId":"57941","fix":"58917","desc":"57943"},{"messageId":"57938","fix":"58918","desc":"57940"},{"messageId":"57941","fix":"58919","desc":"57943"},{"messageId":"57938","fix":"58920","desc":"57940"},{"messageId":"57941","fix":"58921","desc":"57943"},{"messageId":"57938","fix":"58922","desc":"57940"},{"messageId":"57941","fix":"58923","desc":"57943"},{"messageId":"57938","fix":"58924","desc":"57940"},{"messageId":"57941","fix":"58925","desc":"57943"},{"messageId":"57938","fix":"58926","desc":"57940"},{"messageId":"57941","fix":"58927","desc":"57943"},{"messageId":"57938","fix":"58928","desc":"57940"},{"messageId":"57941","fix":"58929","desc":"57943"},{"messageId":"57938","fix":"58930","desc":"57940"},{"messageId":"57941","fix":"58931","desc":"57943"},{"messageId":"57938","fix":"58932","desc":"57940"},{"messageId":"57941","fix":"58933","desc":"57943"},{"messageId":"57938","fix":"58934","desc":"57940"},{"messageId":"57941","fix":"58935","desc":"57943"},{"messageId":"57938","fix":"58936","desc":"57940"},{"messageId":"57941","fix":"58937","desc":"57943"},{"messageId":"57938","fix":"58938","desc":"57940"},{"messageId":"57941","fix":"58939","desc":"57943"},{"messageId":"57938","fix":"58940","desc":"57940"},{"messageId":"57941","fix":"58941","desc":"57943"},{"messageId":"57938","fix":"58942","desc":"57940"},{"messageId":"57941","fix":"58943","desc":"57943"},{"messageId":"57938","fix":"58944","desc":"57940"},{"messageId":"57941","fix":"58945","desc":"57943"},{"messageId":"57938","fix":"58946","desc":"57940"},{"messageId":"57941","fix":"58947","desc":"57943"},{"messageId":"57938","fix":"58948","desc":"57940"},{"messageId":"57941","fix":"58949","desc":"57943"},{"messageId":"57938","fix":"58950","desc":"57940"},{"messageId":"57941","fix":"58951","desc":"57943"},{"messageId":"57938","fix":"58952","desc":"57940"},{"messageId":"57941","fix":"58953","desc":"57943"},{"messageId":"57938","fix":"58954","desc":"57940"},{"messageId":"57941","fix":"58955","desc":"57943"},{"messageId":"57938","fix":"58956","desc":"57940"},{"messageId":"57941","fix":"58957","desc":"57943"},{"messageId":"57938","fix":"58958","desc":"57940"},{"messageId":"57941","fix":"58959","desc":"57943"},{"messageId":"57938","fix":"58960","desc":"57940"},{"messageId":"57941","fix":"58961","desc":"57943"},{"messageId":"57938","fix":"58962","desc":"57940"},{"messageId":"57941","fix":"58963","desc":"57943"},{"messageId":"57938","fix":"58964","desc":"57940"},{"messageId":"57941","fix":"58965","desc":"57943"},{"messageId":"57938","fix":"58966","desc":"57940"},{"messageId":"57941","fix":"58967","desc":"57943"},{"messageId":"57938","fix":"58968","desc":"57940"},{"messageId":"57941","fix":"58969","desc":"57943"},{"messageId":"57938","fix":"58970","desc":"57940"},{"messageId":"57941","fix":"58971","desc":"57943"},{"messageId":"57938","fix":"58972","desc":"57940"},{"messageId":"57941","fix":"58973","desc":"57943"},{"messageId":"57938","fix":"58974","desc":"57940"},{"messageId":"57941","fix":"58975","desc":"57943"},{"messageId":"57938","fix":"58976","desc":"57940"},{"messageId":"57941","fix":"58977","desc":"57943"},{"messageId":"57938","fix":"58978","desc":"57940"},{"messageId":"57941","fix":"58979","desc":"57943"},{"messageId":"57938","fix":"58980","desc":"57940"},{"messageId":"57941","fix":"58981","desc":"57943"},{"messageId":"57938","fix":"58982","desc":"57940"},{"messageId":"57941","fix":"58983","desc":"57943"},{"messageId":"57938","fix":"58984","desc":"57940"},{"messageId":"57941","fix":"58985","desc":"57943"},{"messageId":"57938","fix":"58986","desc":"57940"},{"messageId":"57941","fix":"58987","desc":"57943"},{"messageId":"57938","fix":"58988","desc":"57940"},{"messageId":"57941","fix":"58989","desc":"57943"},{"messageId":"57938","fix":"58990","desc":"57940"},{"messageId":"57941","fix":"58991","desc":"57943"},{"messageId":"57938","fix":"58992","desc":"57940"},{"messageId":"57941","fix":"58993","desc":"57943"},{"messageId":"57938","fix":"58994","desc":"57940"},{"messageId":"57941","fix":"58995","desc":"57943"},{"messageId":"57938","fix":"58996","desc":"57940"},{"messageId":"57941","fix":"58997","desc":"57943"},{"messageId":"57938","fix":"58998","desc":"57940"},{"messageId":"57941","fix":"58999","desc":"57943"},{"messageId":"57938","fix":"59000","desc":"57940"},{"messageId":"57941","fix":"59001","desc":"57943"},{"messageId":"57938","fix":"59002","desc":"57940"},{"messageId":"57941","fix":"59003","desc":"57943"},{"messageId":"57938","fix":"59004","desc":"57940"},{"messageId":"57941","fix":"59005","desc":"57943"},{"messageId":"57938","fix":"59006","desc":"57940"},{"messageId":"57941","fix":"59007","desc":"57943"},{"messageId":"57938","fix":"59008","desc":"57940"},{"messageId":"57941","fix":"59009","desc":"57943"},{"messageId":"57938","fix":"59010","desc":"57940"},{"messageId":"57941","fix":"59011","desc":"57943"},{"messageId":"57938","fix":"59012","desc":"57940"},{"messageId":"57941","fix":"59013","desc":"57943"},{"messageId":"57938","fix":"59014","desc":"57940"},{"messageId":"57941","fix":"59015","desc":"57943"},{"messageId":"57938","fix":"59016","desc":"57940"},{"messageId":"57941","fix":"59017","desc":"57943"},{"messageId":"57938","fix":"59018","desc":"57940"},{"messageId":"57941","fix":"59019","desc":"57943"},{"messageId":"57938","fix":"59020","desc":"57940"},{"messageId":"57941","fix":"59021","desc":"57943"},{"messageId":"57938","fix":"59022","desc":"57940"},{"messageId":"57941","fix":"59023","desc":"57943"},{"messageId":"57938","fix":"59024","desc":"57940"},{"messageId":"57941","fix":"59025","desc":"57943"},{"messageId":"57938","fix":"59026","desc":"57940"},{"messageId":"57941","fix":"59027","desc":"57943"},{"messageId":"57938","fix":"59028","desc":"57940"},{"messageId":"57941","fix":"59029","desc":"57943"},{"messageId":"57938","fix":"59030","desc":"57940"},{"messageId":"57941","fix":"59031","desc":"57943"},{"messageId":"57938","fix":"59032","desc":"57940"},{"messageId":"57941","fix":"59033","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"59034","desc":"57940"},{"messageId":"57941","fix":"59035","desc":"57943"},{"messageId":"57938","fix":"59036","desc":"57940"},{"messageId":"57941","fix":"59037","desc":"57943"},{"messageId":"57938","fix":"59038","desc":"57940"},{"messageId":"57941","fix":"59039","desc":"57943"},{"messageId":"57938","fix":"59040","desc":"57940"},{"messageId":"57941","fix":"59041","desc":"57943"},{"messageId":"57938","fix":"59042","desc":"57940"},{"messageId":"57941","fix":"59043","desc":"57943"},{"messageId":"57938","fix":"59044","desc":"57940"},{"messageId":"57941","fix":"59045","desc":"57943"},{"messageId":"57938","fix":"59046","desc":"57940"},{"messageId":"57941","fix":"59047","desc":"57943"},{"messageId":"57938","fix":"59048","desc":"57940"},{"messageId":"57941","fix":"59049","desc":"57943"},{"messageId":"57938","fix":"59050","desc":"57940"},{"messageId":"57941","fix":"59051","desc":"57943"},{"messageId":"57938","fix":"59052","desc":"57940"},{"messageId":"57941","fix":"59053","desc":"57943"},{"messageId":"57938","fix":"59054","desc":"57940"},{"messageId":"57941","fix":"59055","desc":"57943"},{"messageId":"57938","fix":"59056","desc":"57940"},{"messageId":"57941","fix":"59057","desc":"57943"},{"messageId":"57938","fix":"59058","desc":"57940"},{"messageId":"57941","fix":"59059","desc":"57943"},{"messageId":"57938","fix":"59060","desc":"57940"},{"messageId":"57941","fix":"59061","desc":"57943"},{"messageId":"57938","fix":"59062","desc":"57940"},{"messageId":"57941","fix":"59063","desc":"57943"},{"messageId":"57938","fix":"59064","desc":"57940"},{"messageId":"57941","fix":"59065","desc":"57943"},{"messageId":"57938","fix":"59066","desc":"57940"},{"messageId":"57941","fix":"59067","desc":"57943"},{"messageId":"57938","fix":"59068","desc":"57940"},{"messageId":"57941","fix":"59069","desc":"57943"},{"messageId":"57938","fix":"59070","desc":"57940"},{"messageId":"57941","fix":"59071","desc":"57943"},{"messageId":"57938","fix":"59072","desc":"57940"},{"messageId":"57941","fix":"59073","desc":"57943"},{"messageId":"57938","fix":"59074","desc":"57940"},{"messageId":"57941","fix":"59075","desc":"57943"},{"messageId":"57938","fix":"59076","desc":"57940"},{"messageId":"57941","fix":"59077","desc":"57943"},{"messageId":"57938","fix":"59078","desc":"57940"},{"messageId":"57941","fix":"59079","desc":"57943"},{"messageId":"57938","fix":"59080","desc":"57940"},{"messageId":"57941","fix":"59081","desc":"57943"},{"messageId":"57938","fix":"59082","desc":"57940"},{"messageId":"57941","fix":"59083","desc":"57943"},{"messageId":"57938","fix":"59084","desc":"57940"},{"messageId":"57941","fix":"59085","desc":"57943"},{"messageId":"57938","fix":"59086","desc":"57940"},{"messageId":"57941","fix":"59087","desc":"57943"},{"messageId":"57938","fix":"59088","desc":"57940"},{"messageId":"57941","fix":"59089","desc":"57943"},{"messageId":"57938","fix":"59090","desc":"57940"},{"messageId":"57941","fix":"59091","desc":"57943"},{"messageId":"57938","fix":"59092","desc":"57940"},{"messageId":"57941","fix":"59093","desc":"57943"},{"messageId":"57938","fix":"59094","desc":"57940"},{"messageId":"57941","fix":"59095","desc":"57943"},{"messageId":"57938","fix":"59096","desc":"57940"},{"messageId":"57941","fix":"59097","desc":"57943"},{"messageId":"57938","fix":"59098","desc":"57940"},{"messageId":"57941","fix":"59099","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"59100","desc":"57940"},{"messageId":"57941","fix":"59101","desc":"57943"},{"messageId":"57938","fix":"59102","desc":"57940"},{"messageId":"57941","fix":"59103","desc":"57943"},{"messageId":"57938","fix":"59104","desc":"57940"},{"messageId":"57941","fix":"59105","desc":"57943"},{"messageId":"57938","fix":"59106","desc":"57940"},{"messageId":"57941","fix":"59107","desc":"57943"},{"messageId":"57938","fix":"59108","desc":"57940"},{"messageId":"57941","fix":"59109","desc":"57943"},{"messageId":"57938","fix":"59110","desc":"57940"},{"messageId":"57941","fix":"59111","desc":"57943"},{"messageId":"57938","fix":"59112","desc":"57940"},{"messageId":"57941","fix":"59113","desc":"57943"},{"messageId":"57938","fix":"59114","desc":"57940"},{"messageId":"57941","fix":"59115","desc":"57943"},{"messageId":"57938","fix":"59116","desc":"57940"},{"messageId":"57941","fix":"59117","desc":"57943"},{"messageId":"57938","fix":"59118","desc":"57940"},{"messageId":"57941","fix":"59119","desc":"57943"},{"messageId":"57938","fix":"59120","desc":"57940"},{"messageId":"57941","fix":"59121","desc":"57943"},{"messageId":"57938","fix":"59122","desc":"57940"},{"messageId":"57941","fix":"59123","desc":"57943"},{"messageId":"57938","fix":"59124","desc":"57940"},{"messageId":"57941","fix":"59125","desc":"57943"},{"messageId":"57938","fix":"59126","desc":"57940"},{"messageId":"57941","fix":"59127","desc":"57943"},{"messageId":"57938","fix":"59128","desc":"57940"},{"messageId":"57941","fix":"59129","desc":"57943"},{"messageId":"57938","fix":"59130","desc":"57940"},{"messageId":"57941","fix":"59131","desc":"57943"},{"messageId":"57938","fix":"59132","desc":"57940"},{"messageId":"57941","fix":"59133","desc":"57943"},{"messageId":"57938","fix":"59134","desc":"57940"},{"messageId":"57941","fix":"59135","desc":"57943"},{"messageId":"57938","fix":"59136","desc":"57940"},{"messageId":"57941","fix":"59137","desc":"57943"},{"messageId":"57938","fix":"59138","desc":"57940"},{"messageId":"57941","fix":"59139","desc":"57943"},{"messageId":"57938","fix":"59140","desc":"57940"},{"messageId":"57941","fix":"59141","desc":"57943"},{"messageId":"57938","fix":"59142","desc":"57940"},{"messageId":"57941","fix":"59143","desc":"57943"},{"messageId":"57938","fix":"59144","desc":"57940"},{"messageId":"57941","fix":"59145","desc":"57943"},{"messageId":"57938","fix":"59146","desc":"57940"},{"messageId":"57941","fix":"59147","desc":"57943"},{"messageId":"57938","fix":"59148","desc":"57940"},{"messageId":"57941","fix":"59149","desc":"57943"},{"messageId":"57938","fix":"59150","desc":"57940"},{"messageId":"57941","fix":"59151","desc":"57943"},{"messageId":"57938","fix":"59152","desc":"57940"},{"messageId":"57941","fix":"59153","desc":"57943"},{"messageId":"57938","fix":"59154","desc":"57940"},{"messageId":"57941","fix":"59155","desc":"57943"},{"messageId":"57938","fix":"59156","desc":"57940"},{"messageId":"57941","fix":"59157","desc":"57943"},{"messageId":"57938","fix":"59158","desc":"57940"},{"messageId":"57941","fix":"59159","desc":"57943"},{"messageId":"57938","fix":"59160","desc":"57940"},{"messageId":"57941","fix":"59161","desc":"57943"},{"messageId":"57938","fix":"59162","desc":"57940"},{"messageId":"57941","fix":"59163","desc":"57943"},{"messageId":"57938","fix":"59164","desc":"57940"},{"messageId":"57941","fix":"59165","desc":"57943"},{"messageId":"57938","fix":"59166","desc":"57940"},{"messageId":"57941","fix":"59167","desc":"57943"},{"messageId":"57938","fix":"59168","desc":"57940"},{"messageId":"57941","fix":"59169","desc":"57943"},{"messageId":"57938","fix":"59170","desc":"57940"},{"messageId":"57941","fix":"59171","desc":"57943"},{"messageId":"57938","fix":"59172","desc":"57940"},{"messageId":"57941","fix":"59173","desc":"57943"},{"messageId":"57938","fix":"59174","desc":"57940"},{"messageId":"57941","fix":"59175","desc":"57943"},{"messageId":"57938","fix":"59176","desc":"57940"},{"messageId":"57941","fix":"59177","desc":"57943"},{"messageId":"57938","fix":"59178","desc":"57940"},{"messageId":"57941","fix":"59179","desc":"57943"},{"messageId":"57938","fix":"59180","desc":"57940"},{"messageId":"57941","fix":"59181","desc":"57943"},{"messageId":"57938","fix":"59182","desc":"57940"},{"messageId":"57941","fix":"59183","desc":"57943"},{"messageId":"57938","fix":"59184","desc":"57940"},{"messageId":"57941","fix":"59185","desc":"57943"},{"messageId":"57938","fix":"59186","desc":"57940"},{"messageId":"57941","fix":"59187","desc":"57943"},{"messageId":"57938","fix":"59188","desc":"57940"},{"messageId":"57941","fix":"59189","desc":"57943"},{"messageId":"57938","fix":"59190","desc":"57940"},{"messageId":"57941","fix":"59191","desc":"57943"},{"messageId":"57938","fix":"59192","desc":"57940"},{"messageId":"57941","fix":"59193","desc":"57943"},{"messageId":"57938","fix":"59194","desc":"57940"},{"messageId":"57941","fix":"59195","desc":"57943"},{"messageId":"57938","fix":"59196","desc":"57940"},{"messageId":"57941","fix":"59197","desc":"57943"},{"messageId":"57938","fix":"59198","desc":"57940"},{"messageId":"57941","fix":"59199","desc":"57943"},{"messageId":"57938","fix":"59200","desc":"57940"},{"messageId":"57941","fix":"59201","desc":"57943"},{"messageId":"57938","fix":"59202","desc":"57940"},{"messageId":"57941","fix":"59203","desc":"57943"},{"messageId":"57938","fix":"59204","desc":"57940"},{"messageId":"57941","fix":"59205","desc":"57943"},{"messageId":"57938","fix":"59206","desc":"57940"},{"messageId":"57941","fix":"59207","desc":"57943"},{"messageId":"57938","fix":"59208","desc":"57940"},{"messageId":"57941","fix":"59209","desc":"57943"},{"messageId":"57938","fix":"59210","desc":"57940"},{"messageId":"57941","fix":"59211","desc":"57943"},{"messageId":"57938","fix":"59212","desc":"57940"},{"messageId":"57941","fix":"59213","desc":"57943"},{"messageId":"57938","fix":"59214","desc":"57940"},{"messageId":"57941","fix":"59215","desc":"57943"},{"messageId":"57938","fix":"59216","desc":"57940"},{"messageId":"57941","fix":"59217","desc":"57943"},{"messageId":"57938","fix":"59218","desc":"57940"},{"messageId":"57941","fix":"59219","desc":"57943"},{"messageId":"57938","fix":"59220","desc":"57940"},{"messageId":"57941","fix":"59221","desc":"57943"},{"messageId":"57938","fix":"59222","desc":"57940"},{"messageId":"57941","fix":"59223","desc":"57943"},{"messageId":"57938","fix":"59224","desc":"57940"},{"messageId":"57941","fix":"59225","desc":"57943"},{"messageId":"57938","fix":"59226","desc":"57940"},{"messageId":"57941","fix":"59227","desc":"57943"},{"messageId":"57938","fix":"59228","desc":"57940"},{"messageId":"57941","fix":"59229","desc":"57943"},{"messageId":"57938","fix":"59230","desc":"57940"},{"messageId":"57941","fix":"59231","desc":"57943"},{"messageId":"57938","fix":"59232","desc":"57940"},{"messageId":"57941","fix":"59233","desc":"57943"},{"messageId":"57938","fix":"59234","desc":"57940"},{"messageId":"57941","fix":"59235","desc":"57943"},{"messageId":"57938","fix":"59236","desc":"57940"},{"messageId":"57941","fix":"59237","desc":"57943"},{"messageId":"57938","fix":"59238","desc":"57940"},{"messageId":"57941","fix":"59239","desc":"57943"},{"messageId":"57938","fix":"59240","desc":"57940"},{"messageId":"57941","fix":"59241","desc":"57943"},{"messageId":"57938","fix":"59242","desc":"57940"},{"messageId":"57941","fix":"59243","desc":"57943"},{"messageId":"57938","fix":"59244","desc":"57940"},{"messageId":"57941","fix":"59245","desc":"57943"},{"messageId":"57938","fix":"59246","desc":"57940"},{"messageId":"57941","fix":"59247","desc":"57943"},{"messageId":"57938","fix":"59248","desc":"57940"},{"messageId":"57941","fix":"59249","desc":"57943"},{"messageId":"57938","fix":"59250","desc":"57940"},{"messageId":"57941","fix":"59251","desc":"57943"},{"messageId":"57938","fix":"59252","desc":"57940"},{"messageId":"57941","fix":"59253","desc":"57943"},{"messageId":"57938","fix":"59254","desc":"57940"},{"messageId":"57941","fix":"59255","desc":"57943"},{"messageId":"57938","fix":"59256","desc":"57940"},{"messageId":"57941","fix":"59257","desc":"57943"},{"messageId":"57938","fix":"59258","desc":"57940"},{"messageId":"57941","fix":"59259","desc":"57943"},{"messageId":"57938","fix":"59260","desc":"57940"},{"messageId":"57941","fix":"59261","desc":"57943"},{"messageId":"57938","fix":"59262","desc":"57940"},{"messageId":"57941","fix":"59263","desc":"57943"},{"messageId":"57938","fix":"59264","desc":"57940"},{"messageId":"57941","fix":"59265","desc":"57943"},{"messageId":"57938","fix":"59266","desc":"57940"},{"messageId":"57941","fix":"59267","desc":"57943"},{"messageId":"57938","fix":"59268","desc":"57940"},{"messageId":"57941","fix":"59269","desc":"57943"},{"messageId":"57938","fix":"59270","desc":"57940"},{"messageId":"57941","fix":"59271","desc":"57943"},{"messageId":"57938","fix":"59272","desc":"57940"},{"messageId":"57941","fix":"59273","desc":"57943"},{"messageId":"57938","fix":"59274","desc":"57940"},{"messageId":"57941","fix":"59275","desc":"57943"},{"messageId":"57938","fix":"59276","desc":"57940"},{"messageId":"57941","fix":"59277","desc":"57943"},{"messageId":"57938","fix":"59278","desc":"57940"},{"messageId":"57941","fix":"59279","desc":"57943"},{"messageId":"57938","fix":"59280","desc":"57940"},{"messageId":"57941","fix":"59281","desc":"57943"},{"messageId":"57938","fix":"59282","desc":"57940"},{"messageId":"57941","fix":"59283","desc":"57943"},{"messageId":"57938","fix":"59284","desc":"57940"},{"messageId":"57941","fix":"59285","desc":"57943"},{"messageId":"57938","fix":"59286","desc":"57940"},{"messageId":"57941","fix":"59287","desc":"57943"},{"messageId":"57938","fix":"59288","desc":"57940"},{"messageId":"57941","fix":"59289","desc":"57943"},{"messageId":"57938","fix":"59290","desc":"57940"},{"messageId":"57941","fix":"59291","desc":"57943"},{"messageId":"57938","fix":"59292","desc":"57940"},{"messageId":"57941","fix":"59293","desc":"57943"},{"messageId":"57938","fix":"59294","desc":"57940"},{"messageId":"57941","fix":"59295","desc":"57943"},{"messageId":"57938","fix":"59296","desc":"57940"},{"messageId":"57941","fix":"59297","desc":"57943"},{"messageId":"57938","fix":"59298","desc":"57940"},{"messageId":"57941","fix":"59299","desc":"57943"},{"messageId":"57938","fix":"59300","desc":"57940"},{"messageId":"57941","fix":"59301","desc":"57943"},{"messageId":"57938","fix":"59302","desc":"57940"},{"messageId":"57941","fix":"59303","desc":"57943"},{"messageId":"57938","fix":"59304","desc":"57940"},{"messageId":"57941","fix":"59305","desc":"57943"},{"messageId":"57938","fix":"59306","desc":"57940"},{"messageId":"57941","fix":"59307","desc":"57943"},{"messageId":"57938","fix":"59308","desc":"57940"},{"messageId":"57941","fix":"59309","desc":"57943"},{"messageId":"57938","fix":"59310","desc":"57940"},{"messageId":"57941","fix":"59311","desc":"57943"},{"messageId":"57938","fix":"59312","desc":"57940"},{"messageId":"57941","fix":"59313","desc":"57943"},{"messageId":"57938","fix":"59314","desc":"57940"},{"messageId":"57941","fix":"59315","desc":"57943"},{"messageId":"57938","fix":"59316","desc":"57940"},{"messageId":"57941","fix":"59317","desc":"57943"},{"messageId":"57938","fix":"59318","desc":"57940"},{"messageId":"57941","fix":"59319","desc":"57943"},{"messageId":"57938","fix":"59320","desc":"57940"},{"messageId":"57941","fix":"59321","desc":"57943"},{"messageId":"57938","fix":"59322","desc":"57940"},{"messageId":"57941","fix":"59323","desc":"57943"},{"messageId":"57938","fix":"59324","desc":"57940"},{"messageId":"57941","fix":"59325","desc":"57943"},{"messageId":"57938","fix":"59326","desc":"57940"},{"messageId":"57941","fix":"59327","desc":"57943"},{"messageId":"57938","fix":"59328","desc":"57940"},{"messageId":"57941","fix":"59329","desc":"57943"},{"messageId":"57938","fix":"59330","desc":"57940"},{"messageId":"57941","fix":"59331","desc":"57943"},{"messageId":"57938","fix":"59332","desc":"57940"},{"messageId":"57941","fix":"59333","desc":"57943"},{"messageId":"57938","fix":"59334","desc":"57940"},{"messageId":"57941","fix":"59335","desc":"57943"},{"messageId":"57938","fix":"59336","desc":"57940"},{"messageId":"57941","fix":"59337","desc":"57943"},{"messageId":"57938","fix":"59338","desc":"57940"},{"messageId":"57941","fix":"59339","desc":"57943"},{"messageId":"57938","fix":"59340","desc":"57940"},{"messageId":"57941","fix":"59341","desc":"57943"},{"messageId":"57938","fix":"59342","desc":"57940"},{"messageId":"57941","fix":"59343","desc":"57943"},{"messageId":"57938","fix":"59344","desc":"57940"},{"messageId":"57941","fix":"59345","desc":"57943"},{"messageId":"57938","fix":"59346","desc":"57940"},{"messageId":"57941","fix":"59347","desc":"57943"},{"messageId":"57938","fix":"59348","desc":"57940"},{"messageId":"57941","fix":"59349","desc":"57943"},{"messageId":"57938","fix":"59350","desc":"57940"},{"messageId":"57941","fix":"59351","desc":"57943"},{"messageId":"57938","fix":"59352","desc":"57940"},{"messageId":"57941","fix":"59353","desc":"57943"},{"messageId":"57938","fix":"59354","desc":"57940"},{"messageId":"57941","fix":"59355","desc":"57943"},{"messageId":"57938","fix":"59356","desc":"57940"},{"messageId":"57941","fix":"59357","desc":"57943"},{"messageId":"57938","fix":"59358","desc":"57940"},{"messageId":"57941","fix":"59359","desc":"57943"},{"messageId":"57938","fix":"59360","desc":"57940"},{"messageId":"57941","fix":"59361","desc":"57943"},{"messageId":"57938","fix":"59362","desc":"57940"},{"messageId":"57941","fix":"59363","desc":"57943"},{"messageId":"57938","fix":"59364","desc":"57940"},{"messageId":"57941","fix":"59365","desc":"57943"},{"messageId":"57938","fix":"59366","desc":"57940"},{"messageId":"57941","fix":"59367","desc":"57943"},{"messageId":"57938","fix":"59368","desc":"57940"},{"messageId":"57941","fix":"59369","desc":"57943"},{"messageId":"57938","fix":"59370","desc":"57940"},{"messageId":"57941","fix":"59371","desc":"57943"},{"messageId":"57938","fix":"59372","desc":"57940"},{"messageId":"57941","fix":"59373","desc":"57943"},{"messageId":"57938","fix":"59374","desc":"57940"},{"messageId":"57941","fix":"59375","desc":"57943"},{"messageId":"57938","fix":"59376","desc":"57940"},{"messageId":"57941","fix":"59377","desc":"57943"},{"messageId":"57938","fix":"59378","desc":"57940"},{"messageId":"57941","fix":"59379","desc":"57943"},{"messageId":"57938","fix":"59380","desc":"57940"},{"messageId":"57941","fix":"59381","desc":"57943"},{"messageId":"57938","fix":"59382","desc":"57940"},{"messageId":"57941","fix":"59383","desc":"57943"},{"messageId":"57938","fix":"59384","desc":"57940"},{"messageId":"57941","fix":"59385","desc":"57943"},{"messageId":"57938","fix":"59386","desc":"57940"},{"messageId":"57941","fix":"59387","desc":"57943"},{"messageId":"57938","fix":"59388","desc":"57940"},{"messageId":"57941","fix":"59389","desc":"57943"},{"messageId":"57938","fix":"59390","desc":"57940"},{"messageId":"57941","fix":"59391","desc":"57943"},{"messageId":"57938","fix":"59392","desc":"57940"},{"messageId":"57941","fix":"59393","desc":"57943"},{"messageId":"57938","fix":"59394","desc":"57940"},{"messageId":"57941","fix":"59395","desc":"57943"},{"messageId":"57938","fix":"59396","desc":"57940"},{"messageId":"57941","fix":"59397","desc":"57943"},{"messageId":"57938","fix":"59398","desc":"57940"},{"messageId":"57941","fix":"59399","desc":"57943"},{"messageId":"57938","fix":"59400","desc":"57940"},{"messageId":"57941","fix":"59401","desc":"57943"},{"messageId":"57938","fix":"59402","desc":"57940"},{"messageId":"57941","fix":"59403","desc":"57943"},{"messageId":"57938","fix":"59404","desc":"57940"},{"messageId":"57941","fix":"59405","desc":"57943"},{"messageId":"57938","fix":"59406","desc":"57940"},{"messageId":"57941","fix":"59407","desc":"57943"},{"messageId":"57938","fix":"59408","desc":"57940"},{"messageId":"57941","fix":"59409","desc":"57943"},{"messageId":"57938","fix":"59410","desc":"57940"},{"messageId":"57941","fix":"59411","desc":"57943"},{"messageId":"57938","fix":"59412","desc":"57940"},{"messageId":"57941","fix":"59413","desc":"57943"},{"messageId":"57938","fix":"59414","desc":"57940"},{"messageId":"57941","fix":"59415","desc":"57943"},{"messageId":"57938","fix":"59416","desc":"57940"},{"messageId":"57941","fix":"59417","desc":"57943"},{"messageId":"57938","fix":"59418","desc":"57940"},{"messageId":"57941","fix":"59419","desc":"57943"},{"messageId":"57938","fix":"59420","desc":"57940"},{"messageId":"57941","fix":"59421","desc":"57943"},{"messageId":"57938","fix":"59422","desc":"57940"},{"messageId":"57941","fix":"59423","desc":"57943"},{"messageId":"57938","fix":"59424","desc":"57940"},{"messageId":"57941","fix":"59425","desc":"57943"},{"messageId":"57938","fix":"59426","desc":"57940"},{"messageId":"57941","fix":"59427","desc":"57943"},{"messageId":"57938","fix":"59428","desc":"57940"},{"messageId":"57941","fix":"59429","desc":"57943"},{"messageId":"57938","fix":"59430","desc":"57940"},{"messageId":"57941","fix":"59431","desc":"57943"},{"messageId":"57938","fix":"59432","desc":"57940"},{"messageId":"57941","fix":"59433","desc":"57943"},{"messageId":"57938","fix":"59434","desc":"57940"},{"messageId":"57941","fix":"59435","desc":"57943"},{"messageId":"57938","fix":"59436","desc":"57940"},{"messageId":"57941","fix":"59437","desc":"57943"},{"messageId":"57938","fix":"59438","desc":"57940"},{"messageId":"57941","fix":"59439","desc":"57943"},{"messageId":"57938","fix":"59440","desc":"57940"},{"messageId":"57941","fix":"59441","desc":"57943"},{"messageId":"57938","fix":"59442","desc":"57940"},{"messageId":"57941","fix":"59443","desc":"57943"},{"messageId":"57938","fix":"59444","desc":"57940"},{"messageId":"57941","fix":"59445","desc":"57943"},{"messageId":"57938","fix":"59446","desc":"57940"},{"messageId":"57941","fix":"59447","desc":"57943"},{"messageId":"57938","fix":"59448","desc":"57940"},{"messageId":"57941","fix":"59449","desc":"57943"},{"messageId":"57938","fix":"59450","desc":"57940"},{"messageId":"57941","fix":"59451","desc":"57943"},{"messageId":"57938","fix":"59452","desc":"57940"},{"messageId":"57941","fix":"59453","desc":"57943"},{"messageId":"57938","fix":"59454","desc":"57940"},{"messageId":"57941","fix":"59455","desc":"57943"},{"messageId":"57938","fix":"59456","desc":"57940"},{"messageId":"57941","fix":"59457","desc":"57943"},{"messageId":"57938","fix":"59458","desc":"57940"},{"messageId":"57941","fix":"59459","desc":"57943"},{"messageId":"57938","fix":"59460","desc":"57940"},{"messageId":"57941","fix":"59461","desc":"57943"},{"messageId":"57938","fix":"59462","desc":"57940"},{"messageId":"57941","fix":"59463","desc":"57943"},{"messageId":"57938","fix":"59464","desc":"57940"},{"messageId":"57941","fix":"59465","desc":"57943"},{"messageId":"57938","fix":"59466","desc":"57940"},{"messageId":"57941","fix":"59467","desc":"57943"},{"messageId":"57938","fix":"59468","desc":"57940"},{"messageId":"57941","fix":"59469","desc":"57943"},{"messageId":"57938","fix":"59470","desc":"57940"},{"messageId":"57941","fix":"59471","desc":"57943"},{"messageId":"57938","fix":"59472","desc":"57940"},{"messageId":"57941","fix":"59473","desc":"57943"},{"messageId":"57938","fix":"59474","desc":"57940"},{"messageId":"57941","fix":"59475","desc":"57943"},{"messageId":"57938","fix":"59476","desc":"57940"},{"messageId":"57941","fix":"59477","desc":"57943"},{"messageId":"57938","fix":"59478","desc":"57940"},{"messageId":"57941","fix":"59479","desc":"57943"},{"messageId":"57938","fix":"59480","desc":"57940"},{"messageId":"57941","fix":"59481","desc":"57943"},{"messageId":"57938","fix":"59482","desc":"57940"},{"messageId":"57941","fix":"59483","desc":"57943"},{"messageId":"57938","fix":"59484","desc":"57940"},{"messageId":"57941","fix":"59485","desc":"57943"},{"messageId":"57938","fix":"59486","desc":"57940"},{"messageId":"57941","fix":"59487","desc":"57943"},{"messageId":"57938","fix":"59488","desc":"57940"},{"messageId":"57941","fix":"59489","desc":"57943"},{"messageId":"57938","fix":"59490","desc":"57940"},{"messageId":"57941","fix":"59491","desc":"57943"},{"messageId":"57938","fix":"59492","desc":"57940"},{"messageId":"57941","fix":"59493","desc":"57943"},{"messageId":"57938","fix":"59494","desc":"57940"},{"messageId":"57941","fix":"59495","desc":"57943"},{"messageId":"57938","fix":"59496","desc":"57940"},{"messageId":"57941","fix":"59497","desc":"57943"},{"messageId":"57938","fix":"59498","desc":"57940"},{"messageId":"57941","fix":"59499","desc":"57943"},{"messageId":"57938","fix":"59500","desc":"57940"},{"messageId":"57941","fix":"59501","desc":"57943"},{"messageId":"57938","fix":"59502","desc":"57940"},{"messageId":"57941","fix":"59503","desc":"57943"},{"messageId":"57938","fix":"59504","desc":"57940"},{"messageId":"57941","fix":"59505","desc":"57943"},{"messageId":"57938","fix":"59506","desc":"57940"},{"messageId":"57941","fix":"59507","desc":"57943"},{"messageId":"57938","fix":"59508","desc":"57940"},{"messageId":"57941","fix":"59509","desc":"57943"},{"messageId":"57938","fix":"59510","desc":"57940"},{"messageId":"57941","fix":"59511","desc":"57943"},{"messageId":"57938","fix":"59512","desc":"57940"},{"messageId":"57941","fix":"59513","desc":"57943"},{"messageId":"57938","fix":"59514","desc":"57940"},{"messageId":"57941","fix":"59515","desc":"57943"},{"messageId":"57938","fix":"59516","desc":"57940"},{"messageId":"57941","fix":"59517","desc":"57943"},{"messageId":"57938","fix":"59518","desc":"57940"},{"messageId":"57941","fix":"59519","desc":"57943"},{"messageId":"57938","fix":"59520","desc":"57940"},{"messageId":"57941","fix":"59521","desc":"57943"},{"messageId":"57938","fix":"59522","desc":"57940"},{"messageId":"57941","fix":"59523","desc":"57943"},{"messageId":"57938","fix":"59524","desc":"57940"},{"messageId":"57941","fix":"59525","desc":"57943"},{"messageId":"57938","fix":"59526","desc":"57940"},{"messageId":"57941","fix":"59527","desc":"57943"},{"messageId":"57938","fix":"59528","desc":"57940"},{"messageId":"57941","fix":"59529","desc":"57943"},{"messageId":"57938","fix":"59530","desc":"57940"},{"messageId":"57941","fix":"59531","desc":"57943"},{"messageId":"57938","fix":"59532","desc":"57940"},{"messageId":"57941","fix":"59533","desc":"57943"},{"messageId":"57938","fix":"59534","desc":"57940"},{"messageId":"57941","fix":"59535","desc":"57943"},{"messageId":"57938","fix":"59536","desc":"57940"},{"messageId":"57941","fix":"59537","desc":"57943"},{"messageId":"57938","fix":"59538","desc":"57940"},{"messageId":"57941","fix":"59539","desc":"57943"},{"messageId":"57938","fix":"59540","desc":"57940"},{"messageId":"57941","fix":"59541","desc":"57943"},{"messageId":"57938","fix":"59542","desc":"57940"},{"messageId":"57941","fix":"59543","desc":"57943"},{"messageId":"57938","fix":"59544","desc":"57940"},{"messageId":"57941","fix":"59545","desc":"57943"},{"messageId":"57938","fix":"59546","desc":"57940"},{"messageId":"57941","fix":"59547","desc":"57943"},{"messageId":"57938","fix":"59548","desc":"57940"},{"messageId":"57941","fix":"59549","desc":"57943"},{"messageId":"57938","fix":"59550","desc":"57940"},{"messageId":"57941","fix":"59551","desc":"57943"},{"messageId":"57938","fix":"59552","desc":"57940"},{"messageId":"57941","fix":"59553","desc":"57943"},{"messageId":"57938","fix":"59554","desc":"57940"},{"messageId":"57941","fix":"59555","desc":"57943"},{"messageId":"57938","fix":"59556","desc":"57940"},{"messageId":"57941","fix":"59557","desc":"57943"},{"messageId":"57938","fix":"59558","desc":"57940"},{"messageId":"57941","fix":"59559","desc":"57943"},{"messageId":"57938","fix":"59560","desc":"57940"},{"messageId":"57941","fix":"59561","desc":"57943"},{"messageId":"57938","fix":"59562","desc":"57940"},{"messageId":"57941","fix":"59563","desc":"57943"},{"messageId":"57938","fix":"59564","desc":"57940"},{"messageId":"57941","fix":"59565","desc":"57943"},{"messageId":"57938","fix":"59566","desc":"57940"},{"messageId":"57941","fix":"59567","desc":"57943"},{"messageId":"57938","fix":"59568","desc":"57940"},{"messageId":"57941","fix":"59569","desc":"57943"},{"messageId":"57938","fix":"59570","desc":"57940"},{"messageId":"57941","fix":"59571","desc":"57943"},{"messageId":"57938","fix":"59572","desc":"57940"},{"messageId":"57941","fix":"59573","desc":"57943"},{"messageId":"57938","fix":"59574","desc":"57940"},{"messageId":"57941","fix":"59575","desc":"57943"},{"messageId":"57938","fix":"59576","desc":"57940"},{"messageId":"57941","fix":"59577","desc":"57943"},{"messageId":"57938","fix":"59578","desc":"57940"},{"messageId":"57941","fix":"59579","desc":"57943"},{"messageId":"57938","fix":"59580","desc":"57940"},{"messageId":"57941","fix":"59581","desc":"57943"},{"messageId":"57938","fix":"59582","desc":"57940"},{"messageId":"57941","fix":"59583","desc":"57943"},{"messageId":"57938","fix":"59584","desc":"57940"},{"messageId":"57941","fix":"59585","desc":"57943"},{"messageId":"57938","fix":"59586","desc":"57940"},{"messageId":"57941","fix":"59587","desc":"57943"},{"messageId":"57938","fix":"59588","desc":"57940"},{"messageId":"57941","fix":"59589","desc":"57943"},{"messageId":"57938","fix":"59590","desc":"57940"},{"messageId":"57941","fix":"59591","desc":"57943"},{"messageId":"57938","fix":"59592","desc":"57940"},{"messageId":"57941","fix":"59593","desc":"57943"},{"messageId":"57938","fix":"59594","desc":"57940"},{"messageId":"57941","fix":"59595","desc":"57943"},{"messageId":"57938","fix":"59596","desc":"57940"},{"messageId":"57941","fix":"59597","desc":"57943"},{"messageId":"57938","fix":"59598","desc":"57940"},{"messageId":"57941","fix":"59599","desc":"57943"},{"messageId":"57938","fix":"59600","desc":"57940"},{"messageId":"57941","fix":"59601","desc":"57943"},{"messageId":"57938","fix":"59602","desc":"57940"},{"messageId":"57941","fix":"59603","desc":"57943"},{"messageId":"57938","fix":"59604","desc":"57940"},{"messageId":"57941","fix":"59605","desc":"57943"},{"messageId":"57938","fix":"59606","desc":"57940"},{"messageId":"57941","fix":"59607","desc":"57943"},{"messageId":"57938","fix":"59608","desc":"57940"},{"messageId":"57941","fix":"59609","desc":"57943"},{"messageId":"57938","fix":"59610","desc":"57940"},{"messageId":"57941","fix":"59611","desc":"57943"},{"messageId":"57938","fix":"59612","desc":"57940"},{"messageId":"57941","fix":"59613","desc":"57943"},{"messageId":"57938","fix":"59614","desc":"57940"},{"messageId":"57941","fix":"59615","desc":"57943"},{"messageId":"57938","fix":"59616","desc":"57940"},{"messageId":"57941","fix":"59617","desc":"57943"},{"messageId":"57938","fix":"59618","desc":"57940"},{"messageId":"57941","fix":"59619","desc":"57943"},{"messageId":"57938","fix":"59620","desc":"57940"},{"messageId":"57941","fix":"59621","desc":"57943"},{"messageId":"57938","fix":"59622","desc":"57940"},{"messageId":"57941","fix":"59623","desc":"57943"},{"messageId":"57938","fix":"59624","desc":"57940"},{"messageId":"57941","fix":"59625","desc":"57943"},{"messageId":"57938","fix":"59626","desc":"57940"},{"messageId":"57941","fix":"59627","desc":"57943"},{"messageId":"57938","fix":"59628","desc":"57940"},{"messageId":"57941","fix":"59629","desc":"57943"},{"messageId":"57938","fix":"59630","desc":"57940"},{"messageId":"57941","fix":"59631","desc":"57943"},{"messageId":"57938","fix":"59632","desc":"57940"},{"messageId":"57941","fix":"59633","desc":"57943"},{"messageId":"57938","fix":"59634","desc":"57940"},{"messageId":"57941","fix":"59635","desc":"57943"},{"messageId":"57938","fix":"59636","desc":"57940"},{"messageId":"57941","fix":"59637","desc":"57943"},{"messageId":"57938","fix":"59638","desc":"57940"},{"messageId":"57941","fix":"59639","desc":"57943"},{"messageId":"57938","fix":"59640","desc":"57940"},{"messageId":"57941","fix":"59641","desc":"57943"},{"messageId":"57938","fix":"59642","desc":"57940"},{"messageId":"57941","fix":"59643","desc":"57943"},{"messageId":"57938","fix":"59644","desc":"57940"},{"messageId":"57941","fix":"59645","desc":"57943"},{"messageId":"57938","fix":"59646","desc":"57940"},{"messageId":"57941","fix":"59647","desc":"57943"},{"messageId":"57938","fix":"59648","desc":"57940"},{"messageId":"57941","fix":"59649","desc":"57943"},{"messageId":"57938","fix":"59650","desc":"57940"},{"messageId":"57941","fix":"59651","desc":"57943"},{"messageId":"57938","fix":"59652","desc":"57940"},{"messageId":"57941","fix":"59653","desc":"57943"},{"messageId":"57938","fix":"59654","desc":"57940"},{"messageId":"57941","fix":"59655","desc":"57943"},{"messageId":"57938","fix":"59656","desc":"57940"},{"messageId":"57941","fix":"59657","desc":"57943"},{"messageId":"57938","fix":"59658","desc":"57940"},{"messageId":"57941","fix":"59659","desc":"57943"},{"messageId":"57938","fix":"59660","desc":"57940"},{"messageId":"57941","fix":"59661","desc":"57943"},{"messageId":"57938","fix":"59662","desc":"57940"},{"messageId":"57941","fix":"59663","desc":"57943"},{"messageId":"57938","fix":"59664","desc":"57940"},{"messageId":"57941","fix":"59665","desc":"57943"},{"messageId":"57938","fix":"59666","desc":"57940"},{"messageId":"57941","fix":"59667","desc":"57943"},{"messageId":"57938","fix":"59668","desc":"57940"},{"messageId":"57941","fix":"59669","desc":"57943"},{"messageId":"57938","fix":"59670","desc":"57940"},{"messageId":"57941","fix":"59671","desc":"57943"},{"messageId":"57938","fix":"59672","desc":"57940"},{"messageId":"57941","fix":"59673","desc":"57943"},{"messageId":"57938","fix":"59674","desc":"57940"},{"messageId":"57941","fix":"59675","desc":"57943"},{"messageId":"57938","fix":"59676","desc":"57940"},{"messageId":"57941","fix":"59677","desc":"57943"},{"messageId":"57938","fix":"59678","desc":"57940"},{"messageId":"57941","fix":"59679","desc":"57943"},{"messageId":"57938","fix":"59680","desc":"57940"},{"messageId":"57941","fix":"59681","desc":"57943"},{"messageId":"57938","fix":"59682","desc":"57940"},{"messageId":"57941","fix":"59683","desc":"57943"},{"messageId":"57938","fix":"59684","desc":"57940"},{"messageId":"57941","fix":"59685","desc":"57943"},{"messageId":"57938","fix":"59686","desc":"57940"},{"messageId":"57941","fix":"59687","desc":"57943"},{"messageId":"57938","fix":"59688","desc":"57940"},{"messageId":"57941","fix":"59689","desc":"57943"},{"messageId":"57938","fix":"59690","desc":"57940"},{"messageId":"57941","fix":"59691","desc":"57943"},{"messageId":"57938","fix":"59692","desc":"57940"},{"messageId":"57941","fix":"59693","desc":"57943"},{"messageId":"57938","fix":"59694","desc":"57940"},{"messageId":"57941","fix":"59695","desc":"57943"},{"messageId":"57938","fix":"59696","desc":"57940"},{"messageId":"57941","fix":"59697","desc":"57943"},{"messageId":"57938","fix":"59698","desc":"57940"},{"messageId":"57941","fix":"59699","desc":"57943"},{"messageId":"57938","fix":"59700","desc":"57940"},{"messageId":"57941","fix":"59701","desc":"57943"},{"messageId":"57938","fix":"59702","desc":"57940"},{"messageId":"57941","fix":"59703","desc":"57943"},{"messageId":"57938","fix":"59704","desc":"57940"},{"messageId":"57941","fix":"59705","desc":"57943"},{"messageId":"57938","fix":"59706","desc":"57940"},{"messageId":"57941","fix":"59707","desc":"57943"},{"messageId":"57938","fix":"59708","desc":"57940"},{"messageId":"57941","fix":"59709","desc":"57943"},{"messageId":"57938","fix":"59710","desc":"57940"},{"messageId":"57941","fix":"59711","desc":"57943"},{"messageId":"57938","fix":"59712","desc":"57940"},{"messageId":"57941","fix":"59713","desc":"57943"},{"messageId":"57938","fix":"59714","desc":"57940"},{"messageId":"57941","fix":"59715","desc":"57943"},{"messageId":"57938","fix":"59716","desc":"57940"},{"messageId":"57941","fix":"59717","desc":"57943"},{"messageId":"57938","fix":"59718","desc":"57940"},{"messageId":"57941","fix":"59719","desc":"57943"},{"messageId":"57938","fix":"59720","desc":"57940"},{"messageId":"57941","fix":"59721","desc":"57943"},{"messageId":"57938","fix":"59722","desc":"57940"},{"messageId":"57941","fix":"59723","desc":"57943"},{"messageId":"57938","fix":"59724","desc":"57940"},{"messageId":"57941","fix":"59725","desc":"57943"},{"messageId":"57938","fix":"59726","desc":"57940"},{"messageId":"57941","fix":"59727","desc":"57943"},{"messageId":"57938","fix":"59728","desc":"57940"},{"messageId":"57941","fix":"59729","desc":"57943"},{"messageId":"57938","fix":"59730","desc":"57940"},{"messageId":"57941","fix":"59731","desc":"57943"},{"messageId":"57938","fix":"59732","desc":"57940"},{"messageId":"57941","fix":"59733","desc":"57943"},{"messageId":"57938","fix":"59734","desc":"57940"},{"messageId":"57941","fix":"59735","desc":"57943"},{"messageId":"57938","fix":"59736","desc":"57940"},{"messageId":"57941","fix":"59737","desc":"57943"},{"messageId":"57938","fix":"59738","desc":"57940"},{"messageId":"57941","fix":"59739","desc":"57943"},{"messageId":"57938","fix":"59740","desc":"57940"},{"messageId":"57941","fix":"59741","desc":"57943"},{"messageId":"57938","fix":"59742","desc":"57940"},{"messageId":"57941","fix":"59743","desc":"57943"},{"messageId":"57938","fix":"59744","desc":"57940"},{"messageId":"57941","fix":"59745","desc":"57943"},{"messageId":"57938","fix":"59746","desc":"57940"},{"messageId":"57941","fix":"59747","desc":"57943"},{"messageId":"57938","fix":"59748","desc":"57940"},{"messageId":"57941","fix":"59749","desc":"57943"},{"messageId":"57938","fix":"59750","desc":"57940"},{"messageId":"57941","fix":"59751","desc":"57943"},{"messageId":"57938","fix":"59752","desc":"57940"},{"messageId":"57941","fix":"59753","desc":"57943"},{"messageId":"57938","fix":"59754","desc":"57940"},{"messageId":"57941","fix":"59755","desc":"57943"},{"messageId":"57938","fix":"59756","desc":"57940"},{"messageId":"57941","fix":"59757","desc":"57943"},{"messageId":"57938","fix":"59758","desc":"57940"},{"messageId":"57941","fix":"59759","desc":"57943"},{"messageId":"57938","fix":"59760","desc":"57940"},{"messageId":"57941","fix":"59761","desc":"57943"},{"messageId":"57938","fix":"59762","desc":"57940"},{"messageId":"57941","fix":"59763","desc":"57943"},{"messageId":"57938","fix":"59764","desc":"57940"},{"messageId":"57941","fix":"59765","desc":"57943"},{"messageId":"57938","fix":"59766","desc":"57940"},{"messageId":"57941","fix":"59767","desc":"57943"},{"messageId":"57938","fix":"59768","desc":"57940"},{"messageId":"57941","fix":"59769","desc":"57943"},{"messageId":"57938","fix":"59770","desc":"57940"},{"messageId":"57941","fix":"59771","desc":"57943"},{"messageId":"57938","fix":"59772","desc":"57940"},{"messageId":"57941","fix":"59773","desc":"57943"},{"messageId":"57938","fix":"59774","desc":"57940"},{"messageId":"57941","fix":"59775","desc":"57943"},{"messageId":"57938","fix":"59776","desc":"57940"},{"messageId":"57941","fix":"59777","desc":"57943"},{"messageId":"57938","fix":"59778","desc":"57940"},{"messageId":"57941","fix":"59779","desc":"57943"},{"messageId":"57938","fix":"59780","desc":"57940"},{"messageId":"57941","fix":"59781","desc":"57943"},{"messageId":"57938","fix":"59782","desc":"57940"},{"messageId":"57941","fix":"59783","desc":"57943"},{"messageId":"57938","fix":"59784","desc":"57940"},{"messageId":"57941","fix":"59785","desc":"57943"},{"messageId":"57938","fix":"59786","desc":"57940"},{"messageId":"57941","fix":"59787","desc":"57943"},{"messageId":"57938","fix":"59788","desc":"57940"},{"messageId":"57941","fix":"59789","desc":"57943"},{"messageId":"57938","fix":"59790","desc":"57940"},{"messageId":"57941","fix":"59791","desc":"57943"},{"messageId":"57938","fix":"59792","desc":"57940"},{"messageId":"57941","fix":"59793","desc":"57943"},{"messageId":"57938","fix":"59794","desc":"57940"},{"messageId":"57941","fix":"59795","desc":"57943"},{"messageId":"57938","fix":"59796","desc":"57940"},{"messageId":"57941","fix":"59797","desc":"57943"},{"messageId":"57938","fix":"59798","desc":"57940"},{"messageId":"57941","fix":"59799","desc":"57943"},{"messageId":"57938","fix":"59800","desc":"57940"},{"messageId":"57941","fix":"59801","desc":"57943"},{"messageId":"57938","fix":"59802","desc":"57940"},{"messageId":"57941","fix":"59803","desc":"57943"},{"messageId":"57938","fix":"59804","desc":"57940"},{"messageId":"57941","fix":"59805","desc":"57943"},{"messageId":"57938","fix":"59806","desc":"57940"},{"messageId":"57941","fix":"59807","desc":"57943"},{"messageId":"57938","fix":"59808","desc":"57940"},{"messageId":"57941","fix":"59809","desc":"57943"},{"messageId":"57938","fix":"59810","desc":"57940"},{"messageId":"57941","fix":"59811","desc":"57943"},{"messageId":"57938","fix":"59812","desc":"57940"},{"messageId":"57941","fix":"59813","desc":"57943"},{"messageId":"57938","fix":"59814","desc":"57940"},{"messageId":"57941","fix":"59815","desc":"57943"},{"messageId":"57938","fix":"59816","desc":"57940"},{"messageId":"57941","fix":"59817","desc":"57943"},{"messageId":"57938","fix":"59818","desc":"57940"},{"messageId":"57941","fix":"59819","desc":"57943"},{"messageId":"57938","fix":"59820","desc":"57940"},{"messageId":"57941","fix":"59821","desc":"57943"},{"messageId":"57938","fix":"59822","desc":"57940"},{"messageId":"57941","fix":"59823","desc":"57943"},{"messageId":"57938","fix":"59824","desc":"57940"},{"messageId":"57941","fix":"59825","desc":"57943"},{"messageId":"57938","fix":"59826","desc":"57940"},{"messageId":"57941","fix":"59827","desc":"57943"},{"messageId":"57938","fix":"59828","desc":"57940"},{"messageId":"57941","fix":"59829","desc":"57943"},{"messageId":"57938","fix":"59830","desc":"57940"},{"messageId":"57941","fix":"59831","desc":"57943"},{"messageId":"57938","fix":"59832","desc":"57940"},{"messageId":"57941","fix":"59833","desc":"57943"},{"messageId":"57938","fix":"59834","desc":"57940"},{"messageId":"57941","fix":"59835","desc":"57943"},{"messageId":"57938","fix":"59836","desc":"57940"},{"messageId":"57941","fix":"59837","desc":"57943"},{"messageId":"57938","fix":"59838","desc":"57940"},{"messageId":"57941","fix":"59839","desc":"57943"},{"messageId":"57938","fix":"59840","desc":"57940"},{"messageId":"57941","fix":"59841","desc":"57943"},{"messageId":"57938","fix":"59842","desc":"57940"},{"messageId":"57941","fix":"59843","desc":"57943"},{"messageId":"57938","fix":"59844","desc":"57940"},{"messageId":"57941","fix":"59845","desc":"57943"},{"messageId":"57938","fix":"59846","desc":"57940"},{"messageId":"57941","fix":"59847","desc":"57943"},{"messageId":"57938","fix":"59848","desc":"57940"},{"messageId":"57941","fix":"59849","desc":"57943"},{"messageId":"57938","fix":"59850","desc":"57940"},{"messageId":"57941","fix":"59851","desc":"57943"},{"messageId":"57938","fix":"59852","desc":"57940"},{"messageId":"57941","fix":"59853","desc":"57943"},{"messageId":"57938","fix":"59854","desc":"57940"},{"messageId":"57941","fix":"59855","desc":"57943"},{"messageId":"57938","fix":"59856","desc":"57940"},{"messageId":"57941","fix":"59857","desc":"57943"},{"messageId":"57938","fix":"59858","desc":"57940"},{"messageId":"57941","fix":"59859","desc":"57943"},{"messageId":"57938","fix":"59860","desc":"57940"},{"messageId":"57941","fix":"59861","desc":"57943"},{"messageId":"57938","fix":"59862","desc":"57940"},{"messageId":"57941","fix":"59863","desc":"57943"},{"messageId":"57938","fix":"59864","desc":"57940"},{"messageId":"57941","fix":"59865","desc":"57943"},{"messageId":"57938","fix":"59866","desc":"57940"},{"messageId":"57941","fix":"59867","desc":"57943"},{"messageId":"57938","fix":"59868","desc":"57940"},{"messageId":"57941","fix":"59869","desc":"57943"},{"messageId":"57938","fix":"59870","desc":"57940"},{"messageId":"57941","fix":"59871","desc":"57943"},{"messageId":"57938","fix":"59872","desc":"57940"},{"messageId":"57941","fix":"59873","desc":"57943"},{"messageId":"57938","fix":"59874","desc":"57940"},{"messageId":"57941","fix":"59875","desc":"57943"},{"messageId":"57938","fix":"59876","desc":"57940"},{"messageId":"57941","fix":"59877","desc":"57943"},{"messageId":"57938","fix":"59878","desc":"57940"},{"messageId":"57941","fix":"59879","desc":"57943"},{"messageId":"57938","fix":"59880","desc":"57940"},{"messageId":"57941","fix":"59881","desc":"57943"},{"messageId":"57938","fix":"59882","desc":"57940"},{"messageId":"57941","fix":"59883","desc":"57943"},{"messageId":"57938","fix":"59884","desc":"57940"},{"messageId":"57941","fix":"59885","desc":"57943"},{"messageId":"57938","fix":"59886","desc":"57940"},{"messageId":"57941","fix":"59887","desc":"57943"},{"messageId":"57938","fix":"59888","desc":"57940"},{"messageId":"57941","fix":"59889","desc":"57943"},{"messageId":"57938","fix":"59890","desc":"57940"},{"messageId":"57941","fix":"59891","desc":"57943"},{"messageId":"57938","fix":"59892","desc":"57940"},{"messageId":"57941","fix":"59893","desc":"57943"},{"messageId":"57938","fix":"59894","desc":"57940"},{"messageId":"57941","fix":"59895","desc":"57943"},{"messageId":"57938","fix":"59896","desc":"57940"},{"messageId":"57941","fix":"59897","desc":"57943"},{"messageId":"57938","fix":"59898","desc":"57940"},{"messageId":"57941","fix":"59899","desc":"57943"},{"messageId":"57938","fix":"59900","desc":"57940"},{"messageId":"57941","fix":"59901","desc":"57943"},{"messageId":"57938","fix":"59902","desc":"57940"},{"messageId":"57941","fix":"59903","desc":"57943"},{"messageId":"57938","fix":"59904","desc":"57940"},{"messageId":"57941","fix":"59905","desc":"57943"},{"messageId":"57938","fix":"59906","desc":"57940"},{"messageId":"57941","fix":"59907","desc":"57943"},{"messageId":"57938","fix":"59908","desc":"57940"},{"messageId":"57941","fix":"59909","desc":"57943"},{"messageId":"57938","fix":"59910","desc":"57940"},{"messageId":"57941","fix":"59911","desc":"57943"},{"messageId":"57938","fix":"59912","desc":"57940"},{"messageId":"57941","fix":"59913","desc":"57943"},{"messageId":"57938","fix":"59914","desc":"57940"},{"messageId":"57941","fix":"59915","desc":"57943"},{"messageId":"57938","fix":"59916","desc":"57940"},{"messageId":"57941","fix":"59917","desc":"57943"},{"messageId":"57938","fix":"59918","desc":"57940"},{"messageId":"57941","fix":"59919","desc":"57943"},{"messageId":"57938","fix":"59920","desc":"57940"},{"messageId":"57941","fix":"59921","desc":"57943"},{"messageId":"57938","fix":"59922","desc":"57940"},{"messageId":"57941","fix":"59923","desc":"57943"},{"messageId":"57938","fix":"59924","desc":"57940"},{"messageId":"57941","fix":"59925","desc":"57943"},{"messageId":"57938","fix":"59926","desc":"57940"},{"messageId":"57941","fix":"59927","desc":"57943"},{"messageId":"57938","fix":"59928","desc":"57940"},{"messageId":"57941","fix":"59929","desc":"57943"},{"messageId":"57938","fix":"59930","desc":"57940"},{"messageId":"57941","fix":"59931","desc":"57943"},{"messageId":"57938","fix":"59932","desc":"57940"},{"messageId":"57941","fix":"59933","desc":"57943"},{"messageId":"57938","fix":"59934","desc":"57940"},{"messageId":"57941","fix":"59935","desc":"57943"},{"messageId":"57938","fix":"59936","desc":"57940"},{"messageId":"57941","fix":"59937","desc":"57943"},{"messageId":"57938","fix":"59938","desc":"57940"},{"messageId":"57941","fix":"59939","desc":"57943"},{"messageId":"57938","fix":"59940","desc":"57940"},{"messageId":"57941","fix":"59941","desc":"57943"},{"messageId":"57938","fix":"59942","desc":"57940"},{"messageId":"57941","fix":"59943","desc":"57943"},{"messageId":"57938","fix":"59944","desc":"57940"},{"messageId":"57941","fix":"59945","desc":"57943"},{"messageId":"57938","fix":"59946","desc":"57940"},{"messageId":"57941","fix":"59947","desc":"57943"},{"messageId":"57938","fix":"59948","desc":"57940"},{"messageId":"57941","fix":"59949","desc":"57943"},{"messageId":"57938","fix":"59950","desc":"57940"},{"messageId":"57941","fix":"59951","desc":"57943"},{"messageId":"57938","fix":"59952","desc":"57940"},{"messageId":"57941","fix":"59953","desc":"57943"},{"messageId":"57938","fix":"59954","desc":"57940"},{"messageId":"57941","fix":"59955","desc":"57943"},{"messageId":"57938","fix":"59956","desc":"57940"},{"messageId":"57941","fix":"59957","desc":"57943"},{"messageId":"57938","fix":"59958","desc":"57940"},{"messageId":"57941","fix":"59959","desc":"57943"},{"messageId":"57938","fix":"59960","desc":"57940"},{"messageId":"57941","fix":"59961","desc":"57943"},{"messageId":"57938","fix":"59962","desc":"57940"},{"messageId":"57941","fix":"59963","desc":"57943"},{"messageId":"57938","fix":"59964","desc":"57940"},{"messageId":"57941","fix":"59965","desc":"57943"},{"messageId":"57938","fix":"59966","desc":"57940"},{"messageId":"57941","fix":"59967","desc":"57943"},{"messageId":"57938","fix":"59968","desc":"57940"},{"messageId":"57941","fix":"59969","desc":"57943"},{"messageId":"57938","fix":"59970","desc":"57940"},{"messageId":"57941","fix":"59971","desc":"57943"},{"messageId":"57938","fix":"59972","desc":"57940"},{"messageId":"57941","fix":"59973","desc":"57943"},{"messageId":"57938","fix":"59974","desc":"57940"},{"messageId":"57941","fix":"59975","desc":"57943"},{"messageId":"57938","fix":"59976","desc":"57940"},{"messageId":"57941","fix":"59977","desc":"57943"},{"messageId":"57938","fix":"59978","desc":"57940"},{"messageId":"57941","fix":"59979","desc":"57943"},{"messageId":"57938","fix":"59980","desc":"57940"},{"messageId":"57941","fix":"59981","desc":"57943"},{"messageId":"57938","fix":"59982","desc":"57940"},{"messageId":"57941","fix":"59983","desc":"57943"},{"messageId":"57938","fix":"59984","desc":"57940"},{"messageId":"57941","fix":"59985","desc":"57943"},{"messageId":"57938","fix":"59986","desc":"57940"},{"messageId":"57941","fix":"59987","desc":"57943"},{"messageId":"57938","fix":"59988","desc":"57940"},{"messageId":"57941","fix":"59989","desc":"57943"},{"messageId":"57938","fix":"59990","desc":"57940"},{"messageId":"57941","fix":"59991","desc":"57943"},{"messageId":"57938","fix":"59992","desc":"57940"},{"messageId":"57941","fix":"59993","desc":"57943"},{"messageId":"57938","fix":"59994","desc":"57940"},{"messageId":"57941","fix":"59995","desc":"57943"},{"messageId":"57938","fix":"59996","desc":"57940"},{"messageId":"57941","fix":"59997","desc":"57943"},{"messageId":"57938","fix":"59998","desc":"57940"},{"messageId":"57941","fix":"59999","desc":"57943"},{"messageId":"57938","fix":"60000","desc":"57940"},{"messageId":"57941","fix":"60001","desc":"57943"},{"messageId":"57938","fix":"60002","desc":"57940"},{"messageId":"57941","fix":"60003","desc":"57943"},{"messageId":"57938","fix":"60004","desc":"57940"},{"messageId":"57941","fix":"60005","desc":"57943"},{"messageId":"57938","fix":"60006","desc":"57940"},{"messageId":"57941","fix":"60007","desc":"57943"},{"messageId":"57938","fix":"60008","desc":"57940"},{"messageId":"57941","fix":"60009","desc":"57943"},{"messageId":"57938","fix":"60010","desc":"57940"},{"messageId":"57941","fix":"60011","desc":"57943"},{"messageId":"57938","fix":"60012","desc":"57940"},{"messageId":"57941","fix":"60013","desc":"57943"},{"messageId":"57938","fix":"60014","desc":"57940"},{"messageId":"57941","fix":"60015","desc":"57943"},{"messageId":"57938","fix":"60016","desc":"57940"},{"messageId":"57941","fix":"60017","desc":"57943"},{"messageId":"57938","fix":"60018","desc":"57940"},{"messageId":"57941","fix":"60019","desc":"57943"},{"messageId":"57938","fix":"60020","desc":"57940"},{"messageId":"57941","fix":"60021","desc":"57943"},{"messageId":"57938","fix":"60022","desc":"57940"},{"messageId":"57941","fix":"60023","desc":"57943"},{"messageId":"57938","fix":"60024","desc":"57940"},{"messageId":"57941","fix":"60025","desc":"57943"},{"messageId":"57938","fix":"60026","desc":"57940"},{"messageId":"57941","fix":"60027","desc":"57943"},{"messageId":"57938","fix":"60028","desc":"57940"},{"messageId":"57941","fix":"60029","desc":"57943"},{"messageId":"57938","fix":"60030","desc":"57940"},{"messageId":"57941","fix":"60031","desc":"57943"},{"messageId":"57938","fix":"60032","desc":"57940"},{"messageId":"57941","fix":"60033","desc":"57943"},{"messageId":"57938","fix":"60034","desc":"57940"},{"messageId":"57941","fix":"60035","desc":"57943"},{"messageId":"57938","fix":"60036","desc":"57940"},{"messageId":"57941","fix":"60037","desc":"57943"},{"messageId":"57938","fix":"60038","desc":"57940"},{"messageId":"57941","fix":"60039","desc":"57943"},{"messageId":"57938","fix":"60040","desc":"57940"},{"messageId":"57941","fix":"60041","desc":"57943"},{"messageId":"57938","fix":"60042","desc":"57940"},{"messageId":"57941","fix":"60043","desc":"57943"},{"messageId":"57938","fix":"60044","desc":"57940"},{"messageId":"57941","fix":"60045","desc":"57943"},{"messageId":"57938","fix":"60046","desc":"57940"},{"messageId":"57941","fix":"60047","desc":"57943"},{"messageId":"57938","fix":"60048","desc":"57940"},{"messageId":"57941","fix":"60049","desc":"57943"},{"messageId":"57938","fix":"60050","desc":"57940"},{"messageId":"57941","fix":"60051","desc":"57943"},{"messageId":"57938","fix":"60052","desc":"57940"},{"messageId":"57941","fix":"60053","desc":"57943"},{"messageId":"57938","fix":"60054","desc":"57940"},{"messageId":"57941","fix":"60055","desc":"57943"},{"messageId":"57938","fix":"60056","desc":"57940"},{"messageId":"57941","fix":"60057","desc":"57943"},{"messageId":"57938","fix":"60058","desc":"57940"},{"messageId":"57941","fix":"60059","desc":"57943"},{"messageId":"57938","fix":"60060","desc":"57940"},{"messageId":"57941","fix":"60061","desc":"57943"},{"messageId":"57938","fix":"60062","desc":"57940"},{"messageId":"57941","fix":"60063","desc":"57943"},{"messageId":"57938","fix":"60064","desc":"57940"},{"messageId":"57941","fix":"60065","desc":"57943"},{"messageId":"57938","fix":"60066","desc":"57940"},{"messageId":"57941","fix":"60067","desc":"57943"},{"messageId":"57938","fix":"60068","desc":"57940"},{"messageId":"57941","fix":"60069","desc":"57943"},{"messageId":"57938","fix":"60070","desc":"57940"},{"messageId":"57941","fix":"60071","desc":"57943"},{"messageId":"57938","fix":"60072","desc":"57940"},{"messageId":"57941","fix":"60073","desc":"57943"},{"messageId":"57938","fix":"60074","desc":"57940"},{"messageId":"57941","fix":"60075","desc":"57943"},{"messageId":"57938","fix":"60076","desc":"57940"},{"messageId":"57941","fix":"60077","desc":"57943"},{"messageId":"57938","fix":"60078","desc":"57940"},{"messageId":"57941","fix":"60079","desc":"57943"},{"messageId":"57938","fix":"60080","desc":"57940"},{"messageId":"57941","fix":"60081","desc":"57943"},{"messageId":"57938","fix":"60082","desc":"57940"},{"messageId":"57941","fix":"60083","desc":"57943"},{"messageId":"57938","fix":"60084","desc":"57940"},{"messageId":"57941","fix":"60085","desc":"57943"},{"messageId":"57938","fix":"60086","desc":"57940"},{"messageId":"57941","fix":"60087","desc":"57943"},{"messageId":"57938","fix":"60088","desc":"57940"},{"messageId":"57941","fix":"60089","desc":"57943"},{"messageId":"57938","fix":"60090","desc":"57940"},{"messageId":"57941","fix":"60091","desc":"57943"},{"messageId":"57938","fix":"60092","desc":"57940"},{"messageId":"57941","fix":"60093","desc":"57943"},{"messageId":"57938","fix":"60094","desc":"57940"},{"messageId":"57941","fix":"60095","desc":"57943"},{"messageId":"57938","fix":"60096","desc":"57940"},{"messageId":"57941","fix":"60097","desc":"57943"},{"messageId":"57938","fix":"60098","desc":"57940"},{"messageId":"57941","fix":"60099","desc":"57943"},{"messageId":"57938","fix":"60100","desc":"57940"},{"messageId":"57941","fix":"60101","desc":"57943"},{"messageId":"57938","fix":"60102","desc":"57940"},{"messageId":"57941","fix":"60103","desc":"57943"},{"messageId":"57938","fix":"60104","desc":"57940"},{"messageId":"57941","fix":"60105","desc":"57943"},{"messageId":"57938","fix":"60106","desc":"57940"},{"messageId":"57941","fix":"60107","desc":"57943"},{"messageId":"57938","fix":"60108","desc":"57940"},{"messageId":"57941","fix":"60109","desc":"57943"},{"messageId":"57938","fix":"60110","desc":"57940"},{"messageId":"57941","fix":"60111","desc":"57943"},{"messageId":"57938","fix":"60112","desc":"57940"},{"messageId":"57941","fix":"60113","desc":"57943"},{"messageId":"57938","fix":"60114","desc":"57940"},{"messageId":"57941","fix":"60115","desc":"57943"},{"messageId":"57938","fix":"60116","desc":"57940"},{"messageId":"57941","fix":"60117","desc":"57943"},{"messageId":"57938","fix":"60118","desc":"57940"},{"messageId":"57941","fix":"60119","desc":"57943"},{"messageId":"57938","fix":"60120","desc":"57940"},{"messageId":"57941","fix":"60121","desc":"57943"},{"messageId":"57938","fix":"60122","desc":"57940"},{"messageId":"57941","fix":"60123","desc":"57943"},{"messageId":"57938","fix":"60124","desc":"57940"},{"messageId":"57941","fix":"60125","desc":"57943"},{"messageId":"57938","fix":"60126","desc":"57940"},{"messageId":"57941","fix":"60127","desc":"57943"},{"messageId":"57938","fix":"60128","desc":"57940"},{"messageId":"57941","fix":"60129","desc":"57943"},{"messageId":"57938","fix":"60130","desc":"57940"},{"messageId":"57941","fix":"60131","desc":"57943"},{"messageId":"57938","fix":"60132","desc":"57940"},{"messageId":"57941","fix":"60133","desc":"57943"},{"messageId":"57938","fix":"60134","desc":"57940"},{"messageId":"57941","fix":"60135","desc":"57943"},{"messageId":"57938","fix":"60136","desc":"57940"},{"messageId":"57941","fix":"60137","desc":"57943"},{"messageId":"57938","fix":"60138","desc":"57940"},{"messageId":"57941","fix":"60139","desc":"57943"},{"messageId":"57938","fix":"60140","desc":"57940"},{"messageId":"57941","fix":"60141","desc":"57943"},{"messageId":"57938","fix":"60142","desc":"57940"},{"messageId":"57941","fix":"60143","desc":"57943"},{"messageId":"57938","fix":"60144","desc":"57940"},{"messageId":"57941","fix":"60145","desc":"57943"},{"messageId":"57938","fix":"60146","desc":"57940"},{"messageId":"57941","fix":"60147","desc":"57943"},{"messageId":"57938","fix":"60148","desc":"57940"},{"messageId":"57941","fix":"60149","desc":"57943"},{"messageId":"57938","fix":"60150","desc":"57940"},{"messageId":"57941","fix":"60151","desc":"57943"},{"messageId":"57938","fix":"60152","desc":"57940"},{"messageId":"57941","fix":"60153","desc":"57943"},{"messageId":"57938","fix":"60154","desc":"57940"},{"messageId":"57941","fix":"60155","desc":"57943"},{"messageId":"57938","fix":"60156","desc":"57940"},{"messageId":"57941","fix":"60157","desc":"57943"},{"messageId":"57938","fix":"60158","desc":"57940"},{"messageId":"57941","fix":"60159","desc":"57943"},{"messageId":"57938","fix":"60160","desc":"57940"},{"messageId":"57941","fix":"60161","desc":"57943"},{"messageId":"57938","fix":"60162","desc":"57940"},{"messageId":"57941","fix":"60163","desc":"57943"},{"messageId":"57938","fix":"60164","desc":"57940"},{"messageId":"57941","fix":"60165","desc":"57943"},{"messageId":"57938","fix":"60166","desc":"57940"},{"messageId":"57941","fix":"60167","desc":"57943"},{"messageId":"57938","fix":"60168","desc":"57940"},{"messageId":"57941","fix":"60169","desc":"57943"},{"messageId":"57938","fix":"60170","desc":"57940"},{"messageId":"57941","fix":"60171","desc":"57943"},{"messageId":"57938","fix":"60172","desc":"57940"},{"messageId":"57941","fix":"60173","desc":"57943"},{"messageId":"57938","fix":"60174","desc":"57940"},{"messageId":"57941","fix":"60175","desc":"57943"},{"messageId":"57938","fix":"60176","desc":"57940"},{"messageId":"57941","fix":"60177","desc":"57943"},{"messageId":"57938","fix":"60178","desc":"57940"},{"messageId":"57941","fix":"60179","desc":"57943"},{"messageId":"57938","fix":"60180","desc":"57940"},{"messageId":"57941","fix":"60181","desc":"57943"},{"messageId":"57938","fix":"60182","desc":"57940"},{"messageId":"57941","fix":"60183","desc":"57943"},{"messageId":"57938","fix":"60184","desc":"57940"},{"messageId":"57941","fix":"60185","desc":"57943"},{"messageId":"57938","fix":"60186","desc":"57940"},{"messageId":"57941","fix":"60187","desc":"57943"},{"messageId":"57938","fix":"60188","desc":"57940"},{"messageId":"57941","fix":"60189","desc":"57943"},{"messageId":"57938","fix":"60190","desc":"57940"},{"messageId":"57941","fix":"60191","desc":"57943"},{"messageId":"57938","fix":"60192","desc":"57940"},{"messageId":"57941","fix":"60193","desc":"57943"},{"messageId":"57938","fix":"60194","desc":"57940"},{"messageId":"57941","fix":"60195","desc":"57943"},{"messageId":"57938","fix":"60196","desc":"57940"},{"messageId":"57941","fix":"60197","desc":"57943"},{"messageId":"57938","fix":"60198","desc":"57940"},{"messageId":"57941","fix":"60199","desc":"57943"},{"messageId":"57938","fix":"60200","desc":"57940"},{"messageId":"57941","fix":"60201","desc":"57943"},{"messageId":"57938","fix":"60202","desc":"57940"},{"messageId":"57941","fix":"60203","desc":"57943"},{"messageId":"57938","fix":"60204","desc":"57940"},{"messageId":"57941","fix":"60205","desc":"57943"},{"messageId":"57938","fix":"60206","desc":"57940"},{"messageId":"57941","fix":"60207","desc":"57943"},{"messageId":"57938","fix":"60208","desc":"57940"},{"messageId":"57941","fix":"60209","desc":"57943"},{"messageId":"57938","fix":"60210","desc":"57940"},{"messageId":"57941","fix":"60211","desc":"57943"},{"messageId":"57938","fix":"60212","desc":"57940"},{"messageId":"57941","fix":"60213","desc":"57943"},{"messageId":"57938","fix":"60214","desc":"57940"},{"messageId":"57941","fix":"60215","desc":"57943"},{"messageId":"57938","fix":"60216","desc":"57940"},{"messageId":"57941","fix":"60217","desc":"57943"},{"messageId":"57938","fix":"60218","desc":"57940"},{"messageId":"57941","fix":"60219","desc":"57943"},{"messageId":"57938","fix":"60220","desc":"57940"},{"messageId":"57941","fix":"60221","desc":"57943"},{"messageId":"57938","fix":"60222","desc":"57940"},{"messageId":"57941","fix":"60223","desc":"57943"},{"messageId":"57938","fix":"60224","desc":"57940"},{"messageId":"57941","fix":"60225","desc":"57943"},{"messageId":"57938","fix":"60226","desc":"57940"},{"messageId":"57941","fix":"60227","desc":"57943"},{"messageId":"57938","fix":"60228","desc":"57940"},{"messageId":"57941","fix":"60229","desc":"57943"},{"messageId":"57938","fix":"60230","desc":"57940"},{"messageId":"57941","fix":"60231","desc":"57943"},{"messageId":"57938","fix":"60232","desc":"57940"},{"messageId":"57941","fix":"60233","desc":"57943"},{"messageId":"57938","fix":"60234","desc":"57940"},{"messageId":"57941","fix":"60235","desc":"57943"},{"messageId":"57938","fix":"60236","desc":"57940"},{"messageId":"57941","fix":"60237","desc":"57943"},{"messageId":"57938","fix":"60238","desc":"57940"},{"messageId":"57941","fix":"60239","desc":"57943"},{"messageId":"57938","fix":"60240","desc":"57940"},{"messageId":"57941","fix":"60241","desc":"57943"},{"messageId":"57938","fix":"60242","desc":"57940"},{"messageId":"57941","fix":"60243","desc":"57943"},{"messageId":"57938","fix":"60244","desc":"57940"},{"messageId":"57941","fix":"60245","desc":"57943"},{"messageId":"57938","fix":"60246","desc":"57940"},{"messageId":"57941","fix":"60247","desc":"57943"},{"messageId":"57938","fix":"60248","desc":"57940"},{"messageId":"57941","fix":"60249","desc":"57943"},{"messageId":"57938","fix":"60250","desc":"57940"},{"messageId":"57941","fix":"60251","desc":"57943"},{"messageId":"57938","fix":"60252","desc":"57940"},{"messageId":"57941","fix":"60253","desc":"57943"},{"messageId":"57938","fix":"60254","desc":"57940"},{"messageId":"57941","fix":"60255","desc":"57943"},{"messageId":"57938","fix":"60256","desc":"57940"},{"messageId":"57941","fix":"60257","desc":"57943"},{"messageId":"57938","fix":"60258","desc":"57940"},{"messageId":"57941","fix":"60259","desc":"57943"},{"messageId":"57938","fix":"60260","desc":"57940"},{"messageId":"57941","fix":"60261","desc":"57943"},{"messageId":"57938","fix":"60262","desc":"57940"},{"messageId":"57941","fix":"60263","desc":"57943"},{"messageId":"57938","fix":"60264","desc":"57940"},{"messageId":"57941","fix":"60265","desc":"57943"},{"messageId":"57938","fix":"60266","desc":"57940"},{"messageId":"57941","fix":"60267","desc":"57943"},{"messageId":"57938","fix":"60268","desc":"57940"},{"messageId":"57941","fix":"60269","desc":"57943"},{"messageId":"57938","fix":"60270","desc":"57940"},{"messageId":"57941","fix":"60271","desc":"57943"},{"messageId":"57938","fix":"60272","desc":"57940"},{"messageId":"57941","fix":"60273","desc":"57943"},{"messageId":"57938","fix":"60274","desc":"57940"},{"messageId":"57941","fix":"60275","desc":"57943"},{"messageId":"57938","fix":"60276","desc":"57940"},{"messageId":"57941","fix":"60277","desc":"57943"},{"messageId":"57938","fix":"60278","desc":"57940"},{"messageId":"57941","fix":"60279","desc":"57943"},{"messageId":"57938","fix":"60280","desc":"57940"},{"messageId":"57941","fix":"60281","desc":"57943"},{"messageId":"57938","fix":"60282","desc":"57940"},{"messageId":"57941","fix":"60283","desc":"57943"},{"messageId":"57938","fix":"60284","desc":"57940"},{"messageId":"57941","fix":"60285","desc":"57943"},{"messageId":"57938","fix":"60286","desc":"57940"},{"messageId":"57941","fix":"60287","desc":"57943"},{"messageId":"57938","fix":"60288","desc":"57940"},{"messageId":"57941","fix":"60289","desc":"57943"},{"messageId":"57938","fix":"60290","desc":"57940"},{"messageId":"57941","fix":"60291","desc":"57943"},{"messageId":"57938","fix":"60292","desc":"57940"},{"messageId":"57941","fix":"60293","desc":"57943"},{"messageId":"57938","fix":"60294","desc":"57940"},{"messageId":"57941","fix":"60295","desc":"57943"},{"messageId":"57938","fix":"60296","desc":"57940"},{"messageId":"57941","fix":"60297","desc":"57943"},{"messageId":"57938","fix":"60298","desc":"57940"},{"messageId":"57941","fix":"60299","desc":"57943"},{"messageId":"57938","fix":"60300","desc":"57940"},{"messageId":"57941","fix":"60301","desc":"57943"},{"messageId":"57938","fix":"60302","desc":"57940"},{"messageId":"57941","fix":"60303","desc":"57943"},{"messageId":"57938","fix":"60304","desc":"57940"},{"messageId":"57941","fix":"60305","desc":"57943"},{"messageId":"57938","fix":"60306","desc":"57940"},{"messageId":"57941","fix":"60307","desc":"57943"},{"messageId":"57938","fix":"60308","desc":"57940"},{"messageId":"57941","fix":"60309","desc":"57943"},{"messageId":"57938","fix":"60310","desc":"57940"},{"messageId":"57941","fix":"60311","desc":"57943"},{"messageId":"57938","fix":"60312","desc":"57940"},{"messageId":"57941","fix":"60313","desc":"57943"},{"messageId":"57938","fix":"60314","desc":"57940"},{"messageId":"57941","fix":"60315","desc":"57943"},{"messageId":"57938","fix":"60316","desc":"57940"},{"messageId":"57941","fix":"60317","desc":"57943"},{"messageId":"57938","fix":"60318","desc":"57940"},{"messageId":"57941","fix":"60319","desc":"57943"},{"messageId":"57938","fix":"60320","desc":"57940"},{"messageId":"57941","fix":"60321","desc":"57943"},{"messageId":"57938","fix":"60322","desc":"57940"},{"messageId":"57941","fix":"60323","desc":"57943"},{"messageId":"57938","fix":"60324","desc":"57940"},{"messageId":"57941","fix":"60325","desc":"57943"},{"messageId":"57938","fix":"60326","desc":"57940"},{"messageId":"57941","fix":"60327","desc":"57943"},{"messageId":"57938","fix":"60328","desc":"57940"},{"messageId":"57941","fix":"60329","desc":"57943"},{"messageId":"57938","fix":"60330","desc":"57940"},{"messageId":"57941","fix":"60331","desc":"57943"},{"messageId":"57938","fix":"60332","desc":"57940"},{"messageId":"57941","fix":"60333","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"60334","desc":"57940"},{"messageId":"57941","fix":"60335","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"60336","desc":"57940"},{"messageId":"57941","fix":"60337","desc":"57943"},{"messageId":"57938","fix":"60338","desc":"57940"},{"messageId":"57941","fix":"60339","desc":"57943"},{"messageId":"57938","fix":"60340","desc":"57940"},{"messageId":"57941","fix":"60341","desc":"57943"},{"messageId":"57938","fix":"60342","desc":"57940"},{"messageId":"57941","fix":"60343","desc":"57943"},{"messageId":"57938","fix":"60344","desc":"57940"},{"messageId":"57941","fix":"60345","desc":"57943"},{"messageId":"57938","fix":"60346","desc":"57940"},{"messageId":"57941","fix":"60347","desc":"57943"},{"messageId":"57938","fix":"60348","desc":"57940"},{"messageId":"57941","fix":"60349","desc":"57943"},{"messageId":"57938","fix":"60350","desc":"57940"},{"messageId":"57941","fix":"60351","desc":"57943"},{"messageId":"57938","fix":"60352","desc":"57940"},{"messageId":"57941","fix":"60353","desc":"57943"},{"messageId":"57938","fix":"60354","desc":"57940"},{"messageId":"57941","fix":"60355","desc":"57943"},{"messageId":"57938","fix":"60356","desc":"57940"},{"messageId":"57941","fix":"60357","desc":"57943"},{"messageId":"57938","fix":"60358","desc":"57940"},{"messageId":"57941","fix":"60359","desc":"57943"},{"messageId":"57938","fix":"60360","desc":"57940"},{"messageId":"57941","fix":"60361","desc":"57943"},{"messageId":"57938","fix":"60362","desc":"57940"},{"messageId":"57941","fix":"60363","desc":"57943"},{"messageId":"57938","fix":"60364","desc":"57940"},{"messageId":"57941","fix":"60365","desc":"57943"},{"messageId":"57938","fix":"60366","desc":"57940"},{"messageId":"57941","fix":"60367","desc":"57943"},{"messageId":"57938","fix":"60368","desc":"57940"},{"messageId":"57941","fix":"60369","desc":"57943"},{"messageId":"57938","fix":"60370","desc":"57940"},{"messageId":"57941","fix":"60371","desc":"57943"},{"messageId":"57938","fix":"60372","desc":"57940"},{"messageId":"57941","fix":"60373","desc":"57943"},{"messageId":"57938","fix":"60374","desc":"57940"},{"messageId":"57941","fix":"60375","desc":"57943"},{"messageId":"57938","fix":"60376","desc":"57940"},{"messageId":"57941","fix":"60377","desc":"57943"},{"messageId":"57938","fix":"60378","desc":"57940"},{"messageId":"57941","fix":"60379","desc":"57943"},{"messageId":"57938","fix":"60380","desc":"57940"},{"messageId":"57941","fix":"60381","desc":"57943"},{"messageId":"57938","fix":"60382","desc":"57940"},{"messageId":"57941","fix":"60383","desc":"57943"},{"messageId":"57938","fix":"60384","desc":"57940"},{"messageId":"57941","fix":"60385","desc":"57943"},{"messageId":"57938","fix":"60386","desc":"57940"},{"messageId":"57941","fix":"60387","desc":"57943"},{"messageId":"57938","fix":"60388","desc":"57940"},{"messageId":"57941","fix":"60389","desc":"57943"},{"messageId":"57938","fix":"60390","desc":"57940"},{"messageId":"57941","fix":"60391","desc":"57943"},{"messageId":"57938","fix":"60392","desc":"57940"},{"messageId":"57941","fix":"60393","desc":"57943"},{"messageId":"57938","fix":"60394","desc":"57940"},{"messageId":"57941","fix":"60395","desc":"57943"},{"messageId":"57938","fix":"60396","desc":"57940"},{"messageId":"57941","fix":"60397","desc":"57943"},{"messageId":"57938","fix":"60398","desc":"57940"},{"messageId":"57941","fix":"60399","desc":"57943"},{"messageId":"57938","fix":"60400","desc":"57940"},{"messageId":"57941","fix":"60401","desc":"57943"},{"messageId":"57938","fix":"60402","desc":"57940"},{"messageId":"57941","fix":"60403","desc":"57943"},{"messageId":"57938","fix":"60404","desc":"57940"},{"messageId":"57941","fix":"60405","desc":"57943"},{"messageId":"57938","fix":"60406","desc":"57940"},{"messageId":"57941","fix":"60407","desc":"57943"},{"messageId":"57938","fix":"60408","desc":"57940"},{"messageId":"57941","fix":"60409","desc":"57943"},{"messageId":"57938","fix":"60410","desc":"57940"},{"messageId":"57941","fix":"60411","desc":"57943"},{"messageId":"57938","fix":"60412","desc":"57940"},{"messageId":"57941","fix":"60413","desc":"57943"},{"messageId":"57938","fix":"60414","desc":"57940"},{"messageId":"57941","fix":"60415","desc":"57943"},{"messageId":"57938","fix":"60416","desc":"57940"},{"messageId":"57941","fix":"60417","desc":"57943"},{"messageId":"57938","fix":"60418","desc":"57940"},{"messageId":"57941","fix":"60419","desc":"57943"},{"messageId":"57938","fix":"60420","desc":"57940"},{"messageId":"57941","fix":"60421","desc":"57943"},{"messageId":"57938","fix":"60422","desc":"57940"},{"messageId":"57941","fix":"60423","desc":"57943"},{"messageId":"57938","fix":"60424","desc":"57940"},{"messageId":"57941","fix":"60425","desc":"57943"},{"messageId":"57938","fix":"60426","desc":"57940"},{"messageId":"57941","fix":"60427","desc":"57943"},{"messageId":"57938","fix":"60428","desc":"57940"},{"messageId":"57941","fix":"60429","desc":"57943"},{"messageId":"57938","fix":"60430","desc":"57940"},{"messageId":"57941","fix":"60431","desc":"57943"},{"messageId":"57938","fix":"60432","desc":"57940"},{"messageId":"57941","fix":"60433","desc":"57943"},{"messageId":"57938","fix":"60434","desc":"57940"},{"messageId":"57941","fix":"60435","desc":"57943"},{"messageId":"57938","fix":"60436","desc":"57940"},{"messageId":"57941","fix":"60437","desc":"57943"},{"messageId":"57938","fix":"60438","desc":"57940"},{"messageId":"57941","fix":"60439","desc":"57943"},{"messageId":"57938","fix":"60440","desc":"57940"},{"messageId":"57941","fix":"60441","desc":"57943"},{"messageId":"57938","fix":"60442","desc":"57940"},{"messageId":"57941","fix":"60443","desc":"57943"},{"messageId":"57938","fix":"60444","desc":"57940"},{"messageId":"57941","fix":"60445","desc":"57943"},{"messageId":"57938","fix":"60446","desc":"57940"},{"messageId":"57941","fix":"60447","desc":"57943"},{"messageId":"57938","fix":"60448","desc":"57940"},{"messageId":"57941","fix":"60449","desc":"57943"},{"messageId":"57938","fix":"60450","desc":"57940"},{"messageId":"57941","fix":"60451","desc":"57943"},{"messageId":"57938","fix":"60452","desc":"57940"},{"messageId":"57941","fix":"60453","desc":"57943"},{"messageId":"57938","fix":"60454","desc":"57940"},{"messageId":"57941","fix":"60455","desc":"57943"},{"messageId":"57938","fix":"60456","desc":"57940"},{"messageId":"57941","fix":"60457","desc":"57943"},{"messageId":"57938","fix":"60458","desc":"57940"},{"messageId":"57941","fix":"60459","desc":"57943"},{"messageId":"57938","fix":"60460","desc":"57940"},{"messageId":"57941","fix":"60461","desc":"57943"},{"messageId":"57938","fix":"60462","desc":"57940"},{"messageId":"57941","fix":"60463","desc":"57943"},{"messageId":"57938","fix":"60464","desc":"57940"},{"messageId":"57941","fix":"60465","desc":"57943"},{"messageId":"57938","fix":"60466","desc":"57940"},{"messageId":"57941","fix":"60467","desc":"57943"},{"messageId":"57938","fix":"60468","desc":"57940"},{"messageId":"57941","fix":"60469","desc":"57943"},{"messageId":"57938","fix":"60470","desc":"57940"},{"messageId":"57941","fix":"60471","desc":"57943"},{"messageId":"57938","fix":"60472","desc":"57940"},{"messageId":"57941","fix":"60473","desc":"57943"},{"messageId":"57938","fix":"60474","desc":"57940"},{"messageId":"57941","fix":"60475","desc":"57943"},{"messageId":"57938","fix":"60476","desc":"57940"},{"messageId":"57941","fix":"60477","desc":"57943"},{"messageId":"57938","fix":"60478","desc":"57940"},{"messageId":"57941","fix":"60479","desc":"57943"},{"messageId":"57938","fix":"60480","desc":"57940"},{"messageId":"57941","fix":"60481","desc":"57943"},{"messageId":"57938","fix":"60482","desc":"57940"},{"messageId":"57941","fix":"60483","desc":"57943"},{"messageId":"57938","fix":"60484","desc":"57940"},{"messageId":"57941","fix":"60485","desc":"57943"},{"messageId":"57938","fix":"60486","desc":"57940"},{"messageId":"57941","fix":"60487","desc":"57943"},{"messageId":"57938","fix":"60488","desc":"57940"},{"messageId":"57941","fix":"60489","desc":"57943"},{"messageId":"57938","fix":"60490","desc":"57940"},{"messageId":"57941","fix":"60491","desc":"57943"},{"messageId":"57938","fix":"60492","desc":"57940"},{"messageId":"57941","fix":"60493","desc":"57943"},{"messageId":"57938","fix":"60494","desc":"57940"},{"messageId":"57941","fix":"60495","desc":"57943"},{"messageId":"57938","fix":"60496","desc":"57940"},{"messageId":"57941","fix":"60497","desc":"57943"},{"messageId":"57938","fix":"60498","desc":"57940"},{"messageId":"57941","fix":"60499","desc":"57943"},{"messageId":"57938","fix":"60500","desc":"57940"},{"messageId":"57941","fix":"60501","desc":"57943"},{"messageId":"57938","fix":"60502","desc":"57940"},{"messageId":"57941","fix":"60503","desc":"57943"},{"messageId":"57938","fix":"60504","desc":"57940"},{"messageId":"57941","fix":"60505","desc":"57943"},{"messageId":"57938","fix":"60506","desc":"57940"},{"messageId":"57941","fix":"60507","desc":"57943"},{"messageId":"57938","fix":"60508","desc":"57940"},{"messageId":"57941","fix":"60509","desc":"57943"},{"messageId":"57938","fix":"60510","desc":"57940"},{"messageId":"57941","fix":"60511","desc":"57943"},{"messageId":"57938","fix":"60512","desc":"57940"},{"messageId":"57941","fix":"60513","desc":"57943"},{"messageId":"57938","fix":"60514","desc":"57940"},{"messageId":"57941","fix":"60515","desc":"57943"},{"messageId":"57938","fix":"60516","desc":"57940"},{"messageId":"57941","fix":"60517","desc":"57943"},{"messageId":"57938","fix":"60518","desc":"57940"},{"messageId":"57941","fix":"60519","desc":"57943"},{"messageId":"57938","fix":"60520","desc":"57940"},{"messageId":"57941","fix":"60521","desc":"57943"},{"messageId":"57938","fix":"60522","desc":"57940"},{"messageId":"57941","fix":"60523","desc":"57943"},{"messageId":"57938","fix":"60524","desc":"57940"},{"messageId":"57941","fix":"60525","desc":"57943"},{"messageId":"57938","fix":"60526","desc":"57940"},{"messageId":"57941","fix":"60527","desc":"57943"},{"messageId":"57938","fix":"60528","desc":"57940"},{"messageId":"57941","fix":"60529","desc":"57943"},{"messageId":"57938","fix":"60530","desc":"57940"},{"messageId":"57941","fix":"60531","desc":"57943"},{"messageId":"57938","fix":"60532","desc":"57940"},{"messageId":"57941","fix":"60533","desc":"57943"},{"messageId":"57938","fix":"60534","desc":"57940"},{"messageId":"57941","fix":"60535","desc":"57943"},{"messageId":"57938","fix":"60536","desc":"57940"},{"messageId":"57941","fix":"60537","desc":"57943"},{"messageId":"57938","fix":"60538","desc":"57940"},{"messageId":"57941","fix":"60539","desc":"57943"},{"messageId":"57938","fix":"60540","desc":"57940"},{"messageId":"57941","fix":"60541","desc":"57943"},{"messageId":"57938","fix":"60542","desc":"57940"},{"messageId":"57941","fix":"60543","desc":"57943"},{"messageId":"57938","fix":"60544","desc":"57940"},{"messageId":"57941","fix":"60545","desc":"57943"},{"messageId":"57938","fix":"60546","desc":"57940"},{"messageId":"57941","fix":"60547","desc":"57943"},{"messageId":"57938","fix":"60548","desc":"57940"},{"messageId":"57941","fix":"60549","desc":"57943"},{"messageId":"57938","fix":"60550","desc":"57940"},{"messageId":"57941","fix":"60551","desc":"57943"},{"messageId":"57938","fix":"60552","desc":"57940"},{"messageId":"57941","fix":"60553","desc":"57943"},{"messageId":"57938","fix":"60554","desc":"57940"},{"messageId":"57941","fix":"60555","desc":"57943"},{"messageId":"57938","fix":"60556","desc":"57940"},{"messageId":"57941","fix":"60557","desc":"57943"},{"messageId":"57938","fix":"60558","desc":"57940"},{"messageId":"57941","fix":"60559","desc":"57943"},{"messageId":"57938","fix":"60560","desc":"57940"},{"messageId":"57941","fix":"60561","desc":"57943"},{"messageId":"57938","fix":"60562","desc":"57940"},{"messageId":"57941","fix":"60563","desc":"57943"},{"messageId":"57938","fix":"60564","desc":"57940"},{"messageId":"57941","fix":"60565","desc":"57943"},{"messageId":"57938","fix":"60566","desc":"57940"},{"messageId":"57941","fix":"60567","desc":"57943"},{"messageId":"57938","fix":"60568","desc":"57940"},{"messageId":"57941","fix":"60569","desc":"57943"},{"messageId":"57938","fix":"60570","desc":"57940"},{"messageId":"57941","fix":"60571","desc":"57943"},{"messageId":"57938","fix":"60572","desc":"57940"},{"messageId":"57941","fix":"60573","desc":"57943"},{"messageId":"57938","fix":"60574","desc":"57940"},{"messageId":"57941","fix":"60575","desc":"57943"},{"messageId":"57938","fix":"60576","desc":"57940"},{"messageId":"57941","fix":"60577","desc":"57943"},{"messageId":"57938","fix":"60578","desc":"57940"},{"messageId":"57941","fix":"60579","desc":"57943"},{"messageId":"57938","fix":"60580","desc":"57940"},{"messageId":"57941","fix":"60581","desc":"57943"},{"messageId":"57938","fix":"60582","desc":"57940"},{"messageId":"57941","fix":"60583","desc":"57943"},{"messageId":"57938","fix":"60584","desc":"57940"},{"messageId":"57941","fix":"60585","desc":"57943"},{"messageId":"57938","fix":"60586","desc":"57940"},{"messageId":"57941","fix":"60587","desc":"57943"},{"messageId":"57938","fix":"60588","desc":"57940"},{"messageId":"57941","fix":"60589","desc":"57943"},{"messageId":"57938","fix":"60590","desc":"57940"},{"messageId":"57941","fix":"60591","desc":"57943"},{"messageId":"57938","fix":"60592","desc":"57940"},{"messageId":"57941","fix":"60593","desc":"57943"},{"messageId":"57938","fix":"60594","desc":"57940"},{"messageId":"57941","fix":"60595","desc":"57943"},{"messageId":"57938","fix":"60596","desc":"57940"},{"messageId":"57941","fix":"60597","desc":"57943"},{"messageId":"57938","fix":"60598","desc":"57940"},{"messageId":"57941","fix":"60599","desc":"57943"},{"messageId":"57938","fix":"60600","desc":"57940"},{"messageId":"57941","fix":"60601","desc":"57943"},{"messageId":"57938","fix":"60602","desc":"57940"},{"messageId":"57941","fix":"60603","desc":"57943"},{"messageId":"57938","fix":"60604","desc":"57940"},{"messageId":"57941","fix":"60605","desc":"57943"},{"messageId":"57938","fix":"60606","desc":"57940"},{"messageId":"57941","fix":"60607","desc":"57943"},{"messageId":"57938","fix":"60608","desc":"57940"},{"messageId":"57941","fix":"60609","desc":"57943"},{"messageId":"57938","fix":"60610","desc":"57940"},{"messageId":"57941","fix":"60611","desc":"57943"},{"messageId":"57938","fix":"60612","desc":"57940"},{"messageId":"57941","fix":"60613","desc":"57943"},{"messageId":"57938","fix":"60614","desc":"57940"},{"messageId":"57941","fix":"60615","desc":"57943"},{"messageId":"57938","fix":"60616","desc":"57940"},{"messageId":"57941","fix":"60617","desc":"57943"},{"messageId":"57938","fix":"60618","desc":"57940"},{"messageId":"57941","fix":"60619","desc":"57943"},{"messageId":"57938","fix":"60620","desc":"57940"},{"messageId":"57941","fix":"60621","desc":"57943"},{"messageId":"57938","fix":"60622","desc":"57940"},{"messageId":"57941","fix":"60623","desc":"57943"},{"messageId":"57938","fix":"60624","desc":"57940"},{"messageId":"57941","fix":"60625","desc":"57943"},{"messageId":"57938","fix":"60626","desc":"57940"},{"messageId":"57941","fix":"60627","desc":"57943"},{"messageId":"57938","fix":"60628","desc":"57940"},{"messageId":"57941","fix":"60629","desc":"57943"},{"messageId":"57938","fix":"60630","desc":"57940"},{"messageId":"57941","fix":"60631","desc":"57943"},{"messageId":"57938","fix":"60632","desc":"57940"},{"messageId":"57941","fix":"60633","desc":"57943"},{"messageId":"57938","fix":"60634","desc":"57940"},{"messageId":"57941","fix":"60635","desc":"57943"},{"messageId":"57938","fix":"60636","desc":"57940"},{"messageId":"57941","fix":"60637","desc":"57943"},{"messageId":"57938","fix":"60638","desc":"57940"},{"messageId":"57941","fix":"60639","desc":"57943"},{"messageId":"57938","fix":"60640","desc":"57940"},{"messageId":"57941","fix":"60641","desc":"57943"},{"messageId":"57938","fix":"60642","desc":"57940"},{"messageId":"57941","fix":"60643","desc":"57943"},{"messageId":"57938","fix":"60644","desc":"57940"},{"messageId":"57941","fix":"60645","desc":"57943"},{"messageId":"57938","fix":"60646","desc":"57940"},{"messageId":"57941","fix":"60647","desc":"57943"},{"messageId":"57938","fix":"60648","desc":"57940"},{"messageId":"57941","fix":"60649","desc":"57943"},{"messageId":"57938","fix":"60650","desc":"57940"},{"messageId":"57941","fix":"60651","desc":"57943"},{"messageId":"57938","fix":"60652","desc":"57940"},{"messageId":"57941","fix":"60653","desc":"57943"},{"messageId":"57938","fix":"60654","desc":"57940"},{"messageId":"57941","fix":"60655","desc":"57943"},{"messageId":"57938","fix":"60656","desc":"57940"},{"messageId":"57941","fix":"60657","desc":"57943"},{"messageId":"57938","fix":"60658","desc":"57940"},{"messageId":"57941","fix":"60659","desc":"57943"},{"messageId":"57938","fix":"60660","desc":"57940"},{"messageId":"57941","fix":"60661","desc":"57943"},{"messageId":"57938","fix":"60662","desc":"57940"},{"messageId":"57941","fix":"60663","desc":"57943"},{"messageId":"57938","fix":"60664","desc":"57940"},{"messageId":"57941","fix":"60665","desc":"57943"},{"messageId":"57938","fix":"60666","desc":"57940"},{"messageId":"57941","fix":"60667","desc":"57943"},{"messageId":"57938","fix":"60668","desc":"57940"},{"messageId":"57941","fix":"60669","desc":"57943"},{"messageId":"57938","fix":"60670","desc":"57940"},{"messageId":"57941","fix":"60671","desc":"57943"},{"messageId":"57938","fix":"60672","desc":"57940"},{"messageId":"57941","fix":"60673","desc":"57943"},{"messageId":"57938","fix":"60674","desc":"57940"},{"messageId":"57941","fix":"60675","desc":"57943"},{"messageId":"57938","fix":"60676","desc":"57940"},{"messageId":"57941","fix":"60677","desc":"57943"},{"messageId":"57938","fix":"60678","desc":"57940"},{"messageId":"57941","fix":"60679","desc":"57943"},{"messageId":"57938","fix":"60680","desc":"57940"},{"messageId":"57941","fix":"60681","desc":"57943"},{"messageId":"57938","fix":"60682","desc":"57940"},{"messageId":"57941","fix":"60683","desc":"57943"},{"messageId":"57938","fix":"60684","desc":"57940"},{"messageId":"57941","fix":"60685","desc":"57943"},{"messageId":"57938","fix":"60686","desc":"57940"},{"messageId":"57941","fix":"60687","desc":"57943"},{"messageId":"57938","fix":"60688","desc":"57940"},{"messageId":"57941","fix":"60689","desc":"57943"},{"messageId":"57938","fix":"60690","desc":"57940"},{"messageId":"57941","fix":"60691","desc":"57943"},{"messageId":"57938","fix":"60692","desc":"57940"},{"messageId":"57941","fix":"60693","desc":"57943"},{"messageId":"57938","fix":"60694","desc":"57940"},{"messageId":"57941","fix":"60695","desc":"57943"},{"messageId":"57938","fix":"60696","desc":"57940"},{"messageId":"57941","fix":"60697","desc":"57943"},{"messageId":"57938","fix":"60698","desc":"57940"},{"messageId":"57941","fix":"60699","desc":"57943"},{"messageId":"57938","fix":"60700","desc":"57940"},{"messageId":"57941","fix":"60701","desc":"57943"},{"messageId":"57938","fix":"60702","desc":"57940"},{"messageId":"57941","fix":"60703","desc":"57943"},{"messageId":"57938","fix":"60704","desc":"57940"},{"messageId":"57941","fix":"60705","desc":"57943"},{"messageId":"57938","fix":"60706","desc":"57940"},{"messageId":"57941","fix":"60707","desc":"57943"},{"messageId":"57938","fix":"60708","desc":"57940"},{"messageId":"57941","fix":"60709","desc":"57943"},{"messageId":"57938","fix":"60710","desc":"57940"},{"messageId":"57941","fix":"60711","desc":"57943"},{"messageId":"57938","fix":"60712","desc":"57940"},{"messageId":"57941","fix":"60713","desc":"57943"},{"messageId":"57938","fix":"60714","desc":"57940"},{"messageId":"57941","fix":"60715","desc":"57943"},{"messageId":"57938","fix":"60716","desc":"57940"},{"messageId":"57941","fix":"60717","desc":"57943"},{"messageId":"57938","fix":"60718","desc":"57940"},{"messageId":"57941","fix":"60719","desc":"57943"},{"messageId":"57938","fix":"60720","desc":"57940"},{"messageId":"57941","fix":"60721","desc":"57943"},{"messageId":"57938","fix":"60722","desc":"57940"},{"messageId":"57941","fix":"60723","desc":"57943"},{"messageId":"57938","fix":"60724","desc":"57940"},{"messageId":"57941","fix":"60725","desc":"57943"},{"messageId":"57938","fix":"60726","desc":"57940"},{"messageId":"57941","fix":"60727","desc":"57943"},{"messageId":"57938","fix":"60728","desc":"57940"},{"messageId":"57941","fix":"60729","desc":"57943"},{"messageId":"57938","fix":"60730","desc":"57940"},{"messageId":"57941","fix":"60731","desc":"57943"},{"messageId":"57938","fix":"60732","desc":"57940"},{"messageId":"57941","fix":"60733","desc":"57943"},{"messageId":"57938","fix":"60734","desc":"57940"},{"messageId":"57941","fix":"60735","desc":"57943"},{"messageId":"57938","fix":"60736","desc":"57940"},{"messageId":"57941","fix":"60737","desc":"57943"},{"messageId":"57938","fix":"60738","desc":"57940"},{"messageId":"57941","fix":"60739","desc":"57943"},{"messageId":"57938","fix":"60740","desc":"57940"},{"messageId":"57941","fix":"60741","desc":"57943"},{"messageId":"57938","fix":"60742","desc":"57940"},{"messageId":"57941","fix":"60743","desc":"57943"},{"messageId":"57938","fix":"60744","desc":"57940"},{"messageId":"57941","fix":"60745","desc":"57943"},{"messageId":"57938","fix":"60746","desc":"57940"},{"messageId":"57941","fix":"60747","desc":"57943"},{"messageId":"57938","fix":"60748","desc":"57940"},{"messageId":"57941","fix":"60749","desc":"57943"},{"messageId":"57938","fix":"60750","desc":"57940"},{"messageId":"57941","fix":"60751","desc":"57943"},{"messageId":"57938","fix":"60752","desc":"57940"},{"messageId":"57941","fix":"60753","desc":"57943"},{"messageId":"57938","fix":"60754","desc":"57940"},{"messageId":"57941","fix":"60755","desc":"57943"},{"messageId":"57938","fix":"60756","desc":"57940"},{"messageId":"57941","fix":"60757","desc":"57943"},{"messageId":"57938","fix":"60758","desc":"57940"},{"messageId":"57941","fix":"60759","desc":"57943"},{"messageId":"57938","fix":"60760","desc":"57940"},{"messageId":"57941","fix":"60761","desc":"57943"},{"messageId":"57938","fix":"60762","desc":"57940"},{"messageId":"57941","fix":"60763","desc":"57943"},{"messageId":"57938","fix":"60764","desc":"57940"},{"messageId":"57941","fix":"60765","desc":"57943"},{"messageId":"57938","fix":"60766","desc":"57940"},{"messageId":"57941","fix":"60767","desc":"57943"},{"messageId":"57938","fix":"60768","desc":"57940"},{"messageId":"57941","fix":"60769","desc":"57943"},{"messageId":"57938","fix":"60770","desc":"57940"},{"messageId":"57941","fix":"60771","desc":"57943"},{"messageId":"57938","fix":"60772","desc":"57940"},{"messageId":"57941","fix":"60773","desc":"57943"},{"messageId":"57938","fix":"60774","desc":"57940"},{"messageId":"57941","fix":"60775","desc":"57943"},{"messageId":"57938","fix":"60776","desc":"57940"},{"messageId":"57941","fix":"60777","desc":"57943"},{"messageId":"57938","fix":"60778","desc":"57940"},{"messageId":"57941","fix":"60779","desc":"57943"},{"messageId":"57938","fix":"60780","desc":"57940"},{"messageId":"57941","fix":"60781","desc":"57943"},{"messageId":"57938","fix":"60782","desc":"57940"},{"messageId":"57941","fix":"60783","desc":"57943"},{"messageId":"57938","fix":"60784","desc":"57940"},{"messageId":"57941","fix":"60785","desc":"57943"},{"messageId":"57938","fix":"60786","desc":"57940"},{"messageId":"57941","fix":"60787","desc":"57943"},{"messageId":"57938","fix":"60788","desc":"57940"},{"messageId":"57941","fix":"60789","desc":"57943"},{"messageId":"57938","fix":"60790","desc":"57940"},{"messageId":"57941","fix":"60791","desc":"57943"},{"messageId":"57938","fix":"60792","desc":"57940"},{"messageId":"57941","fix":"60793","desc":"57943"},{"messageId":"57938","fix":"60794","desc":"57940"},{"messageId":"57941","fix":"60795","desc":"57943"},{"messageId":"57938","fix":"60796","desc":"57940"},{"messageId":"57941","fix":"60797","desc":"57943"},{"messageId":"57938","fix":"60798","desc":"57940"},{"messageId":"57941","fix":"60799","desc":"57943"},{"messageId":"57938","fix":"60800","desc":"57940"},{"messageId":"57941","fix":"60801","desc":"57943"},{"messageId":"57938","fix":"60802","desc":"57940"},{"messageId":"57941","fix":"60803","desc":"57943"},{"messageId":"57938","fix":"60804","desc":"57940"},{"messageId":"57941","fix":"60805","desc":"57943"},{"messageId":"57938","fix":"60806","desc":"57940"},{"messageId":"57941","fix":"60807","desc":"57943"},{"messageId":"57938","fix":"60808","desc":"57940"},{"messageId":"57941","fix":"60809","desc":"57943"},{"messageId":"57938","fix":"60810","desc":"57940"},{"messageId":"57941","fix":"60811","desc":"57943"},{"messageId":"57938","fix":"60812","desc":"57940"},{"messageId":"57941","fix":"60813","desc":"57943"},{"messageId":"57938","fix":"60814","desc":"57940"},{"messageId":"57941","fix":"60815","desc":"57943"},{"messageId":"57938","fix":"60816","desc":"57940"},{"messageId":"57941","fix":"60817","desc":"57943"},{"messageId":"57938","fix":"60818","desc":"57940"},{"messageId":"57941","fix":"60819","desc":"57943"},{"messageId":"57938","fix":"60820","desc":"57940"},{"messageId":"57941","fix":"60821","desc":"57943"},{"messageId":"57938","fix":"60822","desc":"57940"},{"messageId":"57941","fix":"60823","desc":"57943"},{"messageId":"57938","fix":"60824","desc":"57940"},{"messageId":"57941","fix":"60825","desc":"57943"},{"messageId":"57938","fix":"60826","desc":"57940"},{"messageId":"57941","fix":"60827","desc":"57943"},{"messageId":"57938","fix":"60828","desc":"57940"},{"messageId":"57941","fix":"60829","desc":"57943"},{"messageId":"57938","fix":"60830","desc":"57940"},{"messageId":"57941","fix":"60831","desc":"57943"},{"messageId":"57938","fix":"60832","desc":"57940"},{"messageId":"57941","fix":"60833","desc":"57943"},{"messageId":"57938","fix":"60834","desc":"57940"},{"messageId":"57941","fix":"60835","desc":"57943"},{"messageId":"57938","fix":"60836","desc":"57940"},{"messageId":"57941","fix":"60837","desc":"57943"},{"messageId":"57938","fix":"60838","desc":"57940"},{"messageId":"57941","fix":"60839","desc":"57943"},{"messageId":"57938","fix":"60840","desc":"57940"},{"messageId":"57941","fix":"60841","desc":"57943"},{"messageId":"57938","fix":"60842","desc":"57940"},{"messageId":"57941","fix":"60843","desc":"57943"},{"messageId":"57938","fix":"60844","desc":"57940"},{"messageId":"57941","fix":"60845","desc":"57943"},{"messageId":"57938","fix":"60846","desc":"57940"},{"messageId":"57941","fix":"60847","desc":"57943"},{"messageId":"57938","fix":"60848","desc":"57940"},{"messageId":"57941","fix":"60849","desc":"57943"},{"messageId":"57938","fix":"60850","desc":"57940"},{"messageId":"57941","fix":"60851","desc":"57943"},{"messageId":"57938","fix":"60852","desc":"57940"},{"messageId":"57941","fix":"60853","desc":"57943"},{"messageId":"57938","fix":"60854","desc":"57940"},{"messageId":"57941","fix":"60855","desc":"57943"},{"messageId":"57938","fix":"60856","desc":"57940"},{"messageId":"57941","fix":"60857","desc":"57943"},{"messageId":"57938","fix":"60858","desc":"57940"},{"messageId":"57941","fix":"60859","desc":"57943"},{"messageId":"57938","fix":"60860","desc":"57940"},{"messageId":"57941","fix":"60861","desc":"57943"},{"messageId":"57938","fix":"60862","desc":"57940"},{"messageId":"57941","fix":"60863","desc":"57943"},{"messageId":"57938","fix":"60864","desc":"57940"},{"messageId":"57941","fix":"60865","desc":"57943"},{"messageId":"57938","fix":"60866","desc":"57940"},{"messageId":"57941","fix":"60867","desc":"57943"},{"messageId":"57938","fix":"60868","desc":"57940"},{"messageId":"57941","fix":"60869","desc":"57943"},{"messageId":"57938","fix":"60870","desc":"57940"},{"messageId":"57941","fix":"60871","desc":"57943"},{"messageId":"57938","fix":"60872","desc":"57940"},{"messageId":"57941","fix":"60873","desc":"57943"},{"messageId":"57938","fix":"60874","desc":"57940"},{"messageId":"57941","fix":"60875","desc":"57943"},{"messageId":"57938","fix":"60876","desc":"57940"},{"messageId":"57941","fix":"60877","desc":"57943"},{"messageId":"57938","fix":"60878","desc":"57940"},{"messageId":"57941","fix":"60879","desc":"57943"},{"messageId":"57938","fix":"60880","desc":"57940"},{"messageId":"57941","fix":"60881","desc":"57943"},{"messageId":"57938","fix":"60882","desc":"57940"},{"messageId":"57941","fix":"60883","desc":"57943"},{"messageId":"57938","fix":"60884","desc":"57940"},{"messageId":"57941","fix":"60885","desc":"57943"},{"messageId":"57938","fix":"60886","desc":"57940"},{"messageId":"57941","fix":"60887","desc":"57943"},{"messageId":"57938","fix":"60888","desc":"57940"},{"messageId":"57941","fix":"60889","desc":"57943"},{"messageId":"57938","fix":"60890","desc":"57940"},{"messageId":"57941","fix":"60891","desc":"57943"},{"messageId":"57938","fix":"60892","desc":"57940"},{"messageId":"57941","fix":"60893","desc":"57943"},{"messageId":"57938","fix":"60894","desc":"57940"},{"messageId":"57941","fix":"60895","desc":"57943"},{"messageId":"57938","fix":"60896","desc":"57940"},{"messageId":"57941","fix":"60897","desc":"57943"},{"messageId":"57938","fix":"60898","desc":"57940"},{"messageId":"57941","fix":"60899","desc":"57943"},{"messageId":"57938","fix":"60900","desc":"57940"},{"messageId":"57941","fix":"60901","desc":"57943"},{"messageId":"57938","fix":"60902","desc":"57940"},{"messageId":"57941","fix":"60903","desc":"57943"},{"messageId":"57938","fix":"60904","desc":"57940"},{"messageId":"57941","fix":"60905","desc":"57943"},{"messageId":"57938","fix":"60906","desc":"57940"},{"messageId":"57941","fix":"60907","desc":"57943"},{"messageId":"57938","fix":"60908","desc":"57940"},{"messageId":"57941","fix":"60909","desc":"57943"},{"messageId":"57938","fix":"60910","desc":"57940"},{"messageId":"57941","fix":"60911","desc":"57943"},{"messageId":"57938","fix":"60912","desc":"57940"},{"messageId":"57941","fix":"60913","desc":"57943"},{"messageId":"57938","fix":"60914","desc":"57940"},{"messageId":"57941","fix":"60915","desc":"57943"},{"messageId":"57938","fix":"60916","desc":"57940"},{"messageId":"57941","fix":"60917","desc":"57943"},{"messageId":"57938","fix":"60918","desc":"57940"},{"messageId":"57941","fix":"60919","desc":"57943"},{"messageId":"57938","fix":"60920","desc":"57940"},{"messageId":"57941","fix":"60921","desc":"57943"},{"messageId":"57938","fix":"60922","desc":"57940"},{"messageId":"57941","fix":"60923","desc":"57943"},{"messageId":"57938","fix":"60924","desc":"57940"},{"messageId":"57941","fix":"60925","desc":"57943"},{"messageId":"57938","fix":"60926","desc":"57940"},{"messageId":"57941","fix":"60927","desc":"57943"},{"messageId":"57938","fix":"60928","desc":"57940"},{"messageId":"57941","fix":"60929","desc":"57943"},{"messageId":"57938","fix":"60930","desc":"57940"},{"messageId":"57941","fix":"60931","desc":"57943"},{"messageId":"57938","fix":"60932","desc":"57940"},{"messageId":"57941","fix":"60933","desc":"57943"},{"messageId":"57938","fix":"60934","desc":"57940"},{"messageId":"57941","fix":"60935","desc":"57943"},{"messageId":"57938","fix":"60936","desc":"57940"},{"messageId":"57941","fix":"60937","desc":"57943"},{"messageId":"57938","fix":"60938","desc":"57940"},{"messageId":"57941","fix":"60939","desc":"57943"},{"messageId":"57938","fix":"60940","desc":"57940"},{"messageId":"57941","fix":"60941","desc":"57943"},{"messageId":"57938","fix":"60942","desc":"57940"},{"messageId":"57941","fix":"60943","desc":"57943"},{"messageId":"57938","fix":"60944","desc":"57940"},{"messageId":"57941","fix":"60945","desc":"57943"},{"messageId":"57938","fix":"60946","desc":"57940"},{"messageId":"57941","fix":"60947","desc":"57943"},{"messageId":"57938","fix":"60948","desc":"57940"},{"messageId":"57941","fix":"60949","desc":"57943"},{"messageId":"57938","fix":"60950","desc":"57940"},{"messageId":"57941","fix":"60951","desc":"57943"},{"messageId":"57938","fix":"60952","desc":"57940"},{"messageId":"57941","fix":"60953","desc":"57943"},{"messageId":"57938","fix":"60954","desc":"57940"},{"messageId":"57941","fix":"60955","desc":"57943"},{"messageId":"57938","fix":"60956","desc":"57940"},{"messageId":"57941","fix":"60957","desc":"57943"},{"messageId":"57938","fix":"60958","desc":"57940"},{"messageId":"57941","fix":"60959","desc":"57943"},{"messageId":"57938","fix":"60960","desc":"57940"},{"messageId":"57941","fix":"60961","desc":"57943"},{"messageId":"57938","fix":"60962","desc":"57940"},{"messageId":"57941","fix":"60963","desc":"57943"},{"messageId":"57938","fix":"60964","desc":"57940"},{"messageId":"57941","fix":"60965","desc":"57943"},{"messageId":"57938","fix":"60966","desc":"57940"},{"messageId":"57941","fix":"60967","desc":"57943"},{"messageId":"57938","fix":"60968","desc":"57940"},{"messageId":"57941","fix":"60969","desc":"57943"},{"messageId":"57938","fix":"60970","desc":"57940"},{"messageId":"57941","fix":"60971","desc":"57943"},{"messageId":"57938","fix":"60972","desc":"57940"},{"messageId":"57941","fix":"60973","desc":"57943"},{"messageId":"57938","fix":"60974","desc":"57940"},{"messageId":"57941","fix":"60975","desc":"57943"},{"messageId":"57938","fix":"60976","desc":"57940"},{"messageId":"57941","fix":"60977","desc":"57943"},{"messageId":"57938","fix":"60978","desc":"57940"},{"messageId":"57941","fix":"60979","desc":"57943"},{"messageId":"57938","fix":"60980","desc":"57940"},{"messageId":"57941","fix":"60981","desc":"57943"},{"messageId":"57938","fix":"60982","desc":"57940"},{"messageId":"57941","fix":"60983","desc":"57943"},{"messageId":"57938","fix":"60984","desc":"57940"},{"messageId":"57941","fix":"60985","desc":"57943"},{"messageId":"57938","fix":"60986","desc":"57940"},{"messageId":"57941","fix":"60987","desc":"57943"},{"messageId":"57938","fix":"60988","desc":"57940"},{"messageId":"57941","fix":"60989","desc":"57943"},{"messageId":"57938","fix":"60990","desc":"57940"},{"messageId":"57941","fix":"60991","desc":"57943"},{"messageId":"57938","fix":"60992","desc":"57940"},{"messageId":"57941","fix":"60993","desc":"57943"},{"messageId":"57938","fix":"60994","desc":"57940"},{"messageId":"57941","fix":"60995","desc":"57943"},{"messageId":"57938","fix":"60996","desc":"57940"},{"messageId":"57941","fix":"60997","desc":"57943"},{"messageId":"57938","fix":"60998","desc":"57940"},{"messageId":"57941","fix":"60999","desc":"57943"},{"messageId":"57938","fix":"61000","desc":"57940"},{"messageId":"57941","fix":"61001","desc":"57943"},{"messageId":"57938","fix":"61002","desc":"57940"},{"messageId":"57941","fix":"61003","desc":"57943"},{"messageId":"57938","fix":"61004","desc":"57940"},{"messageId":"57941","fix":"61005","desc":"57943"},{"messageId":"57938","fix":"61006","desc":"57940"},{"messageId":"57941","fix":"61007","desc":"57943"},{"messageId":"57938","fix":"61008","desc":"57940"},{"messageId":"57941","fix":"61009","desc":"57943"},{"messageId":"57938","fix":"61010","desc":"57940"},{"messageId":"57941","fix":"61011","desc":"57943"},{"messageId":"57938","fix":"61012","desc":"57940"},{"messageId":"57941","fix":"61013","desc":"57943"},{"messageId":"57938","fix":"61014","desc":"57940"},{"messageId":"57941","fix":"61015","desc":"57943"},{"messageId":"57938","fix":"61016","desc":"57940"},{"messageId":"57941","fix":"61017","desc":"57943"},{"messageId":"57938","fix":"61018","desc":"57940"},{"messageId":"57941","fix":"61019","desc":"57943"},{"messageId":"57938","fix":"61020","desc":"57940"},{"messageId":"57941","fix":"61021","desc":"57943"},{"messageId":"57938","fix":"61022","desc":"57940"},{"messageId":"57941","fix":"61023","desc":"57943"},{"messageId":"57938","fix":"61024","desc":"57940"},{"messageId":"57941","fix":"61025","desc":"57943"},{"messageId":"57938","fix":"61026","desc":"57940"},{"messageId":"57941","fix":"61027","desc":"57943"},{"messageId":"57938","fix":"61028","desc":"57940"},{"messageId":"57941","fix":"61029","desc":"57943"},{"messageId":"57938","fix":"61030","desc":"57940"},{"messageId":"57941","fix":"61031","desc":"57943"},{"messageId":"57938","fix":"61032","desc":"57940"},{"messageId":"57941","fix":"61033","desc":"57943"},{"messageId":"57938","fix":"61034","desc":"57940"},{"messageId":"57941","fix":"61035","desc":"57943"},{"messageId":"57938","fix":"61036","desc":"57940"},{"messageId":"57941","fix":"61037","desc":"57943"},{"messageId":"57938","fix":"61038","desc":"57940"},{"messageId":"57941","fix":"61039","desc":"57943"},{"messageId":"57938","fix":"61040","desc":"57940"},{"messageId":"57941","fix":"61041","desc":"57943"},{"messageId":"57938","fix":"61042","desc":"57940"},{"messageId":"57941","fix":"61043","desc":"57943"},{"messageId":"57938","fix":"61044","desc":"57940"},{"messageId":"57941","fix":"61045","desc":"57943"},{"messageId":"57938","fix":"61046","desc":"57940"},{"messageId":"57941","fix":"61047","desc":"57943"},{"messageId":"57938","fix":"61048","desc":"57940"},{"messageId":"57941","fix":"61049","desc":"57943"},{"messageId":"57938","fix":"61050","desc":"57940"},{"messageId":"57941","fix":"61051","desc":"57943"},{"messageId":"57938","fix":"61052","desc":"57940"},{"messageId":"57941","fix":"61053","desc":"57943"},{"messageId":"57938","fix":"61054","desc":"57940"},{"messageId":"57941","fix":"61055","desc":"57943"},{"messageId":"57938","fix":"61056","desc":"57940"},{"messageId":"57941","fix":"61057","desc":"57943"},{"messageId":"57938","fix":"61058","desc":"57940"},{"messageId":"57941","fix":"61059","desc":"57943"},{"messageId":"57938","fix":"61060","desc":"57940"},{"messageId":"57941","fix":"61061","desc":"57943"},{"messageId":"57938","fix":"61062","desc":"57940"},{"messageId":"57941","fix":"61063","desc":"57943"},{"messageId":"57938","fix":"61064","desc":"57940"},{"messageId":"57941","fix":"61065","desc":"57943"},{"messageId":"57938","fix":"61066","desc":"57940"},{"messageId":"57941","fix":"61067","desc":"57943"},{"messageId":"57938","fix":"61068","desc":"57940"},{"messageId":"57941","fix":"61069","desc":"57943"},{"messageId":"57938","fix":"61070","desc":"57940"},{"messageId":"57941","fix":"61071","desc":"57943"},{"messageId":"57938","fix":"61072","desc":"57940"},{"messageId":"57941","fix":"61073","desc":"57943"},{"messageId":"57938","fix":"61074","desc":"57940"},{"messageId":"57941","fix":"61075","desc":"57943"},{"messageId":"57938","fix":"61076","desc":"57940"},{"messageId":"57941","fix":"61077","desc":"57943"},{"messageId":"57938","fix":"61078","desc":"57940"},{"messageId":"57941","fix":"61079","desc":"57943"},{"messageId":"57938","fix":"61080","desc":"57940"},{"messageId":"57941","fix":"61081","desc":"57943"},{"messageId":"57938","fix":"61082","desc":"57940"},{"messageId":"57941","fix":"61083","desc":"57943"},{"messageId":"57938","fix":"61084","desc":"57940"},{"messageId":"57941","fix":"61085","desc":"57943"},{"messageId":"57938","fix":"61086","desc":"57940"},{"messageId":"57941","fix":"61087","desc":"57943"},{"messageId":"57938","fix":"61088","desc":"57940"},{"messageId":"57941","fix":"61089","desc":"57943"},{"messageId":"57938","fix":"61090","desc":"57940"},{"messageId":"57941","fix":"61091","desc":"57943"},{"messageId":"57938","fix":"61092","desc":"57940"},{"messageId":"57941","fix":"61093","desc":"57943"},{"messageId":"57938","fix":"61094","desc":"57940"},{"messageId":"57941","fix":"61095","desc":"57943"},{"messageId":"57938","fix":"61096","desc":"57940"},{"messageId":"57941","fix":"61097","desc":"57943"},{"messageId":"57938","fix":"61098","desc":"57940"},{"messageId":"57941","fix":"61099","desc":"57943"},{"messageId":"57938","fix":"61100","desc":"57940"},{"messageId":"57941","fix":"61101","desc":"57943"},{"messageId":"57938","fix":"61102","desc":"57940"},{"messageId":"57941","fix":"61103","desc":"57943"},{"messageId":"57938","fix":"61104","desc":"57940"},{"messageId":"57941","fix":"61105","desc":"57943"},{"messageId":"57938","fix":"61106","desc":"57940"},{"messageId":"57941","fix":"61107","desc":"57943"},{"messageId":"57938","fix":"61108","desc":"57940"},{"messageId":"57941","fix":"61109","desc":"57943"},{"messageId":"57938","fix":"61110","desc":"57940"},{"messageId":"57941","fix":"61111","desc":"57943"},{"messageId":"57938","fix":"61112","desc":"57940"},{"messageId":"57941","fix":"61113","desc":"57943"},{"messageId":"57938","fix":"61114","desc":"57940"},{"messageId":"57941","fix":"61115","desc":"57943"},{"messageId":"57938","fix":"61116","desc":"57940"},{"messageId":"57941","fix":"61117","desc":"57943"},{"messageId":"57938","fix":"61118","desc":"57940"},{"messageId":"57941","fix":"61119","desc":"57943"},{"messageId":"57938","fix":"61120","desc":"57940"},{"messageId":"57941","fix":"61121","desc":"57943"},{"messageId":"57938","fix":"61122","desc":"57940"},{"messageId":"57941","fix":"61123","desc":"57943"},{"messageId":"57938","fix":"61124","desc":"57940"},{"messageId":"57941","fix":"61125","desc":"57943"},{"messageId":"57938","fix":"61126","desc":"57940"},{"messageId":"57941","fix":"61127","desc":"57943"},{"messageId":"57938","fix":"61128","desc":"57940"},{"messageId":"57941","fix":"61129","desc":"57943"},{"messageId":"57938","fix":"61130","desc":"57940"},{"messageId":"57941","fix":"61131","desc":"57943"},{"messageId":"57938","fix":"61132","desc":"57940"},{"messageId":"57941","fix":"61133","desc":"57943"},{"messageId":"57938","fix":"61134","desc":"57940"},{"messageId":"57941","fix":"61135","desc":"57943"},{"messageId":"57938","fix":"61136","desc":"57940"},{"messageId":"57941","fix":"61137","desc":"57943"},{"messageId":"57938","fix":"61138","desc":"57940"},{"messageId":"57941","fix":"61139","desc":"57943"},{"messageId":"57938","fix":"61140","desc":"57940"},{"messageId":"57941","fix":"61141","desc":"57943"},{"messageId":"57938","fix":"61142","desc":"57940"},{"messageId":"57941","fix":"61143","desc":"57943"},{"messageId":"57938","fix":"61144","desc":"57940"},{"messageId":"57941","fix":"61145","desc":"57943"},{"messageId":"57938","fix":"61146","desc":"57940"},{"messageId":"57941","fix":"61147","desc":"57943"},{"messageId":"57938","fix":"61148","desc":"57940"},{"messageId":"57941","fix":"61149","desc":"57943"},{"messageId":"57938","fix":"61150","desc":"57940"},{"messageId":"57941","fix":"61151","desc":"57943"},{"messageId":"57938","fix":"61152","desc":"57940"},{"messageId":"57941","fix":"61153","desc":"57943"},{"messageId":"57938","fix":"61154","desc":"57940"},{"messageId":"57941","fix":"61155","desc":"57943"},{"messageId":"57938","fix":"61156","desc":"57940"},{"messageId":"57941","fix":"61157","desc":"57943"},{"messageId":"57938","fix":"61158","desc":"57940"},{"messageId":"57941","fix":"61159","desc":"57943"},{"messageId":"57938","fix":"61160","desc":"57940"},{"messageId":"57941","fix":"61161","desc":"57943"},{"messageId":"57938","fix":"61162","desc":"57940"},{"messageId":"57941","fix":"61163","desc":"57943"},{"messageId":"57938","fix":"61164","desc":"57940"},{"messageId":"57941","fix":"61165","desc":"57943"},{"messageId":"57938","fix":"61166","desc":"57940"},{"messageId":"57941","fix":"61167","desc":"57943"},{"messageId":"57938","fix":"61168","desc":"57940"},{"messageId":"57941","fix":"61169","desc":"57943"},{"messageId":"57938","fix":"61170","desc":"57940"},{"messageId":"57941","fix":"61171","desc":"57943"},{"messageId":"57938","fix":"61172","desc":"57940"},{"messageId":"57941","fix":"61173","desc":"57943"},{"messageId":"57938","fix":"61174","desc":"57940"},{"messageId":"57941","fix":"61175","desc":"57943"},{"messageId":"57938","fix":"61176","desc":"57940"},{"messageId":"57941","fix":"61177","desc":"57943"},{"messageId":"57938","fix":"61178","desc":"57940"},{"messageId":"57941","fix":"61179","desc":"57943"},{"messageId":"57938","fix":"61180","desc":"57940"},{"messageId":"57941","fix":"61181","desc":"57943"},{"messageId":"57938","fix":"61182","desc":"57940"},{"messageId":"57941","fix":"61183","desc":"57943"},{"messageId":"57938","fix":"61184","desc":"57940"},{"messageId":"57941","fix":"61185","desc":"57943"},{"messageId":"57938","fix":"61186","desc":"57940"},{"messageId":"57941","fix":"61187","desc":"57943"},{"messageId":"57938","fix":"61188","desc":"57940"},{"messageId":"57941","fix":"61189","desc":"57943"},{"messageId":"57938","fix":"61190","desc":"57940"},{"messageId":"57941","fix":"61191","desc":"57943"},{"messageId":"57938","fix":"61192","desc":"57940"},{"messageId":"57941","fix":"61193","desc":"57943"},{"messageId":"57938","fix":"61194","desc":"57940"},{"messageId":"57941","fix":"61195","desc":"57943"},{"messageId":"57938","fix":"61196","desc":"57940"},{"messageId":"57941","fix":"61197","desc":"57943"},{"messageId":"57938","fix":"61198","desc":"57940"},{"messageId":"57941","fix":"61199","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61200","desc":"57940"},{"messageId":"57941","fix":"61201","desc":"57943"},{"messageId":"57938","fix":"61202","desc":"57940"},{"messageId":"57941","fix":"61203","desc":"57943"},{"messageId":"57938","fix":"61204","desc":"57940"},{"messageId":"57941","fix":"61205","desc":"57943"},{"messageId":"57938","fix":"61206","desc":"57940"},{"messageId":"57941","fix":"61207","desc":"57943"},{"messageId":"57938","fix":"61208","desc":"57940"},{"messageId":"57941","fix":"61209","desc":"57943"},{"messageId":"57938","fix":"61210","desc":"57940"},{"messageId":"57941","fix":"61211","desc":"57943"},{"messageId":"57938","fix":"61212","desc":"57940"},{"messageId":"57941","fix":"61213","desc":"57943"},{"messageId":"57938","fix":"61214","desc":"57940"},{"messageId":"57941","fix":"61215","desc":"57943"},{"messageId":"57938","fix":"61216","desc":"57940"},{"messageId":"57941","fix":"61217","desc":"57943"},{"messageId":"57938","fix":"61218","desc":"57940"},{"messageId":"57941","fix":"61219","desc":"57943"},{"messageId":"57938","fix":"61220","desc":"57940"},{"messageId":"57941","fix":"61221","desc":"57943"},{"messageId":"57938","fix":"61222","desc":"57940"},{"messageId":"57941","fix":"61223","desc":"57943"},{"messageId":"57938","fix":"61224","desc":"57940"},{"messageId":"57941","fix":"61225","desc":"57943"},{"messageId":"57938","fix":"61226","desc":"57940"},{"messageId":"57941","fix":"61227","desc":"57943"},{"messageId":"57938","fix":"61228","desc":"57940"},{"messageId":"57941","fix":"61229","desc":"57943"},{"messageId":"57938","fix":"61230","desc":"57940"},{"messageId":"57941","fix":"61231","desc":"57943"},{"messageId":"57938","fix":"61232","desc":"57940"},{"messageId":"57941","fix":"61233","desc":"57943"},{"messageId":"57938","fix":"61234","desc":"57940"},{"messageId":"57941","fix":"61235","desc":"57943"},{"messageId":"57938","fix":"61236","desc":"57940"},{"messageId":"57941","fix":"61237","desc":"57943"},{"messageId":"57938","fix":"61238","desc":"57940"},{"messageId":"57941","fix":"61239","desc":"57943"},{"messageId":"57938","fix":"61240","desc":"57940"},{"messageId":"57941","fix":"61241","desc":"57943"},{"messageId":"57938","fix":"61242","desc":"57940"},{"messageId":"57941","fix":"61243","desc":"57943"},{"messageId":"57938","fix":"61244","desc":"57940"},{"messageId":"57941","fix":"61245","desc":"57943"},{"messageId":"57938","fix":"61246","desc":"57940"},{"messageId":"57941","fix":"61247","desc":"57943"},{"messageId":"57938","fix":"61248","desc":"57940"},{"messageId":"57941","fix":"61249","desc":"57943"},{"messageId":"57938","fix":"61250","desc":"57940"},{"messageId":"57941","fix":"61251","desc":"57943"},{"messageId":"57938","fix":"61252","desc":"57940"},{"messageId":"57941","fix":"61253","desc":"57943"},{"messageId":"57938","fix":"61254","desc":"57940"},{"messageId":"57941","fix":"61255","desc":"57943"},{"messageId":"57938","fix":"61256","desc":"57940"},{"messageId":"57941","fix":"61257","desc":"57943"},{"messageId":"57938","fix":"61258","desc":"57940"},{"messageId":"57941","fix":"61259","desc":"57943"},{"messageId":"57938","fix":"61260","desc":"57940"},{"messageId":"57941","fix":"61261","desc":"57943"},{"messageId":"57938","fix":"61262","desc":"57940"},{"messageId":"57941","fix":"61263","desc":"57943"},{"messageId":"57938","fix":"61264","desc":"57940"},{"messageId":"57941","fix":"61265","desc":"57943"},{"messageId":"57938","fix":"61266","desc":"57940"},{"messageId":"57941","fix":"61267","desc":"57943"},{"messageId":"57938","fix":"61268","desc":"57940"},{"messageId":"57941","fix":"61269","desc":"57943"},{"messageId":"57938","fix":"61270","desc":"57940"},{"messageId":"57941","fix":"61271","desc":"57943"},{"messageId":"57938","fix":"61272","desc":"57940"},{"messageId":"57941","fix":"61273","desc":"57943"},{"messageId":"57938","fix":"61274","desc":"57940"},{"messageId":"57941","fix":"61275","desc":"57943"},{"messageId":"57938","fix":"61276","desc":"57940"},{"messageId":"57941","fix":"61277","desc":"57943"},{"messageId":"57938","fix":"61278","desc":"57940"},{"messageId":"57941","fix":"61279","desc":"57943"},{"messageId":"57938","fix":"61280","desc":"57940"},{"messageId":"57941","fix":"61281","desc":"57943"},{"messageId":"57938","fix":"61282","desc":"57940"},{"messageId":"57941","fix":"61283","desc":"57943"},{"messageId":"57938","fix":"61284","desc":"57940"},{"messageId":"57941","fix":"61285","desc":"57943"},{"messageId":"57938","fix":"61286","desc":"57940"},{"messageId":"57941","fix":"61287","desc":"57943"},{"messageId":"57938","fix":"61288","desc":"57940"},{"messageId":"57941","fix":"61289","desc":"57943"},{"messageId":"57938","fix":"61290","desc":"57940"},{"messageId":"57941","fix":"61291","desc":"57943"},{"messageId":"57938","fix":"61292","desc":"57940"},{"messageId":"57941","fix":"61293","desc":"57943"},{"messageId":"57938","fix":"61294","desc":"57940"},{"messageId":"57941","fix":"61295","desc":"57943"},{"messageId":"57938","fix":"61296","desc":"57940"},{"messageId":"57941","fix":"61297","desc":"57943"},{"messageId":"57938","fix":"61298","desc":"57940"},{"messageId":"57941","fix":"61299","desc":"57943"},{"messageId":"57938","fix":"61300","desc":"57940"},{"messageId":"57941","fix":"61301","desc":"57943"},{"messageId":"57938","fix":"61302","desc":"57940"},{"messageId":"57941","fix":"61303","desc":"57943"},{"messageId":"57938","fix":"61304","desc":"57940"},{"messageId":"57941","fix":"61305","desc":"57943"},{"messageId":"57938","fix":"61306","desc":"57940"},{"messageId":"57941","fix":"61307","desc":"57943"},{"messageId":"57938","fix":"61308","desc":"57940"},{"messageId":"57941","fix":"61309","desc":"57943"},{"messageId":"57938","fix":"61310","desc":"57940"},{"messageId":"57941","fix":"61311","desc":"57943"},{"messageId":"57938","fix":"61312","desc":"57940"},{"messageId":"57941","fix":"61313","desc":"57943"},{"messageId":"57938","fix":"61314","desc":"57940"},{"messageId":"57941","fix":"61315","desc":"57943"},{"messageId":"57938","fix":"61316","desc":"57940"},{"messageId":"57941","fix":"61317","desc":"57943"},{"messageId":"57938","fix":"61318","desc":"57940"},{"messageId":"57941","fix":"61319","desc":"57943"},{"messageId":"57938","fix":"61320","desc":"57940"},{"messageId":"57941","fix":"61321","desc":"57943"},{"messageId":"57938","fix":"61322","desc":"57940"},{"messageId":"57941","fix":"61323","desc":"57943"},{"messageId":"57938","fix":"61324","desc":"57940"},{"messageId":"57941","fix":"61325","desc":"57943"},{"messageId":"57938","fix":"61326","desc":"57940"},{"messageId":"57941","fix":"61327","desc":"57943"},{"messageId":"57938","fix":"61328","desc":"57940"},{"messageId":"57941","fix":"61329","desc":"57943"},{"messageId":"57938","fix":"61330","desc":"57940"},{"messageId":"57941","fix":"61331","desc":"57943"},{"messageId":"57938","fix":"61332","desc":"57940"},{"messageId":"57941","fix":"61333","desc":"57943"},{"messageId":"57938","fix":"61334","desc":"57940"},{"messageId":"57941","fix":"61335","desc":"57943"},{"messageId":"57938","fix":"61336","desc":"57940"},{"messageId":"57941","fix":"61337","desc":"57943"},{"messageId":"57938","fix":"61338","desc":"57940"},{"messageId":"57941","fix":"61339","desc":"57943"},{"messageId":"57938","fix":"61340","desc":"57940"},{"messageId":"57941","fix":"61341","desc":"57943"},{"messageId":"57938","fix":"61342","desc":"57940"},{"messageId":"57941","fix":"61343","desc":"57943"},{"messageId":"57938","fix":"61344","desc":"57940"},{"messageId":"57941","fix":"61345","desc":"57943"},{"messageId":"57938","fix":"61346","desc":"57940"},{"messageId":"57941","fix":"61347","desc":"57943"},{"messageId":"57938","fix":"61348","desc":"57940"},{"messageId":"57941","fix":"61349","desc":"57943"},{"messageId":"57938","fix":"61350","desc":"57940"},{"messageId":"57941","fix":"61351","desc":"57943"},{"messageId":"57938","fix":"61352","desc":"57940"},{"messageId":"57941","fix":"61353","desc":"57943"},{"messageId":"57938","fix":"61354","desc":"57940"},{"messageId":"57941","fix":"61355","desc":"57943"},{"messageId":"57938","fix":"61356","desc":"57940"},{"messageId":"57941","fix":"61357","desc":"57943"},{"messageId":"57938","fix":"61358","desc":"57940"},{"messageId":"57941","fix":"61359","desc":"57943"},{"messageId":"57938","fix":"61360","desc":"57940"},{"messageId":"57941","fix":"61361","desc":"57943"},{"messageId":"57938","fix":"61362","desc":"57940"},{"messageId":"57941","fix":"61363","desc":"57943"},{"messageId":"57938","fix":"61364","desc":"57940"},{"messageId":"57941","fix":"61365","desc":"57943"},{"messageId":"57938","fix":"61366","desc":"57940"},{"messageId":"57941","fix":"61367","desc":"57943"},{"messageId":"57938","fix":"61368","desc":"57940"},{"messageId":"57941","fix":"61369","desc":"57943"},{"messageId":"57938","fix":"61370","desc":"57940"},{"messageId":"57941","fix":"61371","desc":"57943"},{"messageId":"57938","fix":"61372","desc":"57940"},{"messageId":"57941","fix":"61373","desc":"57943"},{"messageId":"57938","fix":"61374","desc":"57940"},{"messageId":"57941","fix":"61375","desc":"57943"},{"messageId":"57938","fix":"61376","desc":"57940"},{"messageId":"57941","fix":"61377","desc":"57943"},{"messageId":"57938","fix":"61378","desc":"57940"},{"messageId":"57941","fix":"61379","desc":"57943"},{"messageId":"57938","fix":"61380","desc":"57940"},{"messageId":"57941","fix":"61381","desc":"57943"},{"messageId":"57938","fix":"61382","desc":"57940"},{"messageId":"57941","fix":"61383","desc":"57943"},{"messageId":"57938","fix":"61384","desc":"57940"},{"messageId":"57941","fix":"61385","desc":"57943"},{"messageId":"57938","fix":"61386","desc":"57940"},{"messageId":"57941","fix":"61387","desc":"57943"},{"messageId":"57938","fix":"61388","desc":"57940"},{"messageId":"57941","fix":"61389","desc":"57943"},{"messageId":"57938","fix":"61390","desc":"57940"},{"messageId":"57941","fix":"61391","desc":"57943"},{"messageId":"57938","fix":"61392","desc":"57940"},{"messageId":"57941","fix":"61393","desc":"57943"},{"messageId":"57938","fix":"61394","desc":"57940"},{"messageId":"57941","fix":"61395","desc":"57943"},{"messageId":"57938","fix":"61396","desc":"57940"},{"messageId":"57941","fix":"61397","desc":"57943"},{"messageId":"57938","fix":"61398","desc":"57940"},{"messageId":"57941","fix":"61399","desc":"57943"},{"messageId":"57938","fix":"61400","desc":"57940"},{"messageId":"57941","fix":"61401","desc":"57943"},{"messageId":"57938","fix":"61402","desc":"57940"},{"messageId":"57941","fix":"61403","desc":"57943"},{"messageId":"57938","fix":"61404","desc":"57940"},{"messageId":"57941","fix":"61405","desc":"57943"},{"messageId":"57938","fix":"61406","desc":"57940"},{"messageId":"57941","fix":"61407","desc":"57943"},{"messageId":"57938","fix":"61408","desc":"57940"},{"messageId":"57941","fix":"61409","desc":"57943"},{"messageId":"57938","fix":"61410","desc":"57940"},{"messageId":"57941","fix":"61411","desc":"57943"},{"messageId":"57938","fix":"61412","desc":"57940"},{"messageId":"57941","fix":"61413","desc":"57943"},{"messageId":"57938","fix":"61414","desc":"57940"},{"messageId":"57941","fix":"61415","desc":"57943"},{"messageId":"57938","fix":"61416","desc":"57940"},{"messageId":"57941","fix":"61417","desc":"57943"},{"messageId":"57938","fix":"61418","desc":"57940"},{"messageId":"57941","fix":"61419","desc":"57943"},{"messageId":"57938","fix":"61420","desc":"57940"},{"messageId":"57941","fix":"61421","desc":"57943"},{"messageId":"57938","fix":"61422","desc":"57940"},{"messageId":"57941","fix":"61423","desc":"57943"},{"messageId":"57938","fix":"61424","desc":"57940"},{"messageId":"57941","fix":"61425","desc":"57943"},{"messageId":"57938","fix":"61426","desc":"57940"},{"messageId":"57941","fix":"61427","desc":"57943"},{"messageId":"57938","fix":"61428","desc":"57940"},{"messageId":"57941","fix":"61429","desc":"57943"},{"messageId":"57938","fix":"61430","desc":"57940"},{"messageId":"57941","fix":"61431","desc":"57943"},{"messageId":"57938","fix":"61432","desc":"57940"},{"messageId":"57941","fix":"61433","desc":"57943"},{"messageId":"57938","fix":"61434","desc":"57940"},{"messageId":"57941","fix":"61435","desc":"57943"},{"messageId":"57938","fix":"61436","desc":"57940"},{"messageId":"57941","fix":"61437","desc":"57943"},{"messageId":"57938","fix":"61438","desc":"57940"},{"messageId":"57941","fix":"61439","desc":"57943"},{"messageId":"57938","fix":"61440","desc":"57940"},{"messageId":"57941","fix":"61441","desc":"57943"},{"messageId":"57938","fix":"61442","desc":"57940"},{"messageId":"57941","fix":"61443","desc":"57943"},{"messageId":"57938","fix":"61444","desc":"57940"},{"messageId":"57941","fix":"61445","desc":"57943"},{"messageId":"57938","fix":"61446","desc":"57940"},{"messageId":"57941","fix":"61447","desc":"57943"},{"messageId":"57938","fix":"61448","desc":"57940"},{"messageId":"57941","fix":"61449","desc":"57943"},{"messageId":"57938","fix":"61450","desc":"57940"},{"messageId":"57941","fix":"61451","desc":"57943"},{"messageId":"57938","fix":"61452","desc":"57940"},{"messageId":"57941","fix":"61453","desc":"57943"},{"messageId":"57938","fix":"61454","desc":"57940"},{"messageId":"57941","fix":"61455","desc":"57943"},{"messageId":"57938","fix":"61456","desc":"57940"},{"messageId":"57941","fix":"61457","desc":"57943"},{"messageId":"57938","fix":"61458","desc":"57940"},{"messageId":"57941","fix":"61459","desc":"57943"},{"messageId":"57938","fix":"61460","desc":"57940"},{"messageId":"57941","fix":"61461","desc":"57943"},{"messageId":"57938","fix":"61462","desc":"57940"},{"messageId":"57941","fix":"61463","desc":"57943"},{"messageId":"57938","fix":"61464","desc":"57940"},{"messageId":"57941","fix":"61465","desc":"57943"},{"messageId":"57938","fix":"61466","desc":"57940"},{"messageId":"57941","fix":"61467","desc":"57943"},{"messageId":"57938","fix":"61468","desc":"57940"},{"messageId":"57941","fix":"61469","desc":"57943"},{"messageId":"57938","fix":"61470","desc":"57940"},{"messageId":"57941","fix":"61471","desc":"57943"},{"messageId":"57938","fix":"61472","desc":"57940"},{"messageId":"57941","fix":"61473","desc":"57943"},{"messageId":"57938","fix":"61474","desc":"57940"},{"messageId":"57941","fix":"61475","desc":"57943"},{"messageId":"57938","fix":"61476","desc":"57940"},{"messageId":"57941","fix":"61477","desc":"57943"},{"messageId":"57938","fix":"61478","desc":"57940"},{"messageId":"57941","fix":"61479","desc":"57943"},{"messageId":"57938","fix":"61480","desc":"57940"},{"messageId":"57941","fix":"61481","desc":"57943"},{"messageId":"57938","fix":"61482","desc":"57940"},{"messageId":"57941","fix":"61483","desc":"57943"},{"messageId":"57938","fix":"61484","desc":"57940"},{"messageId":"57941","fix":"61485","desc":"57943"},{"messageId":"57938","fix":"61486","desc":"57940"},{"messageId":"57941","fix":"61487","desc":"57943"},{"messageId":"57938","fix":"61488","desc":"57940"},{"messageId":"57941","fix":"61489","desc":"57943"},{"messageId":"57938","fix":"61490","desc":"57940"},{"messageId":"57941","fix":"61491","desc":"57943"},{"messageId":"57938","fix":"61492","desc":"57940"},{"messageId":"57941","fix":"61493","desc":"57943"},{"messageId":"57938","fix":"61494","desc":"57940"},{"messageId":"57941","fix":"61495","desc":"57943"},{"messageId":"57938","fix":"61496","desc":"57940"},{"messageId":"57941","fix":"61497","desc":"57943"},{"messageId":"57938","fix":"61498","desc":"57940"},{"messageId":"57941","fix":"61499","desc":"57943"},{"messageId":"57938","fix":"61500","desc":"57940"},{"messageId":"57941","fix":"61501","desc":"57943"},{"messageId":"57938","fix":"61502","desc":"57940"},{"messageId":"57941","fix":"61503","desc":"57943"},{"messageId":"57938","fix":"61504","desc":"57940"},{"messageId":"57941","fix":"61505","desc":"57943"},{"messageId":"57938","fix":"61506","desc":"57940"},{"messageId":"57941","fix":"61507","desc":"57943"},{"messageId":"57938","fix":"61508","desc":"57940"},{"messageId":"57941","fix":"61509","desc":"57943"},{"messageId":"57938","fix":"61510","desc":"57940"},{"messageId":"57941","fix":"61511","desc":"57943"},{"messageId":"57938","fix":"61512","desc":"57940"},{"messageId":"57941","fix":"61513","desc":"57943"},{"messageId":"57938","fix":"61514","desc":"57940"},{"messageId":"57941","fix":"61515","desc":"57943"},{"messageId":"57938","fix":"61516","desc":"57940"},{"messageId":"57941","fix":"61517","desc":"57943"},{"messageId":"57938","fix":"61518","desc":"57940"},{"messageId":"57941","fix":"61519","desc":"57943"},{"messageId":"57938","fix":"61520","desc":"57940"},{"messageId":"57941","fix":"61521","desc":"57943"},{"messageId":"57938","fix":"61522","desc":"57940"},{"messageId":"57941","fix":"61523","desc":"57943"},{"messageId":"57938","fix":"61524","desc":"57940"},{"messageId":"57941","fix":"61525","desc":"57943"},{"messageId":"57938","fix":"61526","desc":"57940"},{"messageId":"57941","fix":"61527","desc":"57943"},{"messageId":"57938","fix":"61528","desc":"57940"},{"messageId":"57941","fix":"61529","desc":"57943"},{"messageId":"57938","fix":"61530","desc":"57940"},{"messageId":"57941","fix":"61531","desc":"57943"},{"messageId":"57938","fix":"61532","desc":"57940"},{"messageId":"57941","fix":"61533","desc":"57943"},{"messageId":"57938","fix":"61534","desc":"57940"},{"messageId":"57941","fix":"61535","desc":"57943"},{"messageId":"57938","fix":"61536","desc":"57940"},{"messageId":"57941","fix":"61537","desc":"57943"},{"messageId":"57938","fix":"61538","desc":"57940"},{"messageId":"57941","fix":"61539","desc":"57943"},{"messageId":"57938","fix":"61540","desc":"57940"},{"messageId":"57941","fix":"61541","desc":"57943"},{"messageId":"57938","fix":"61542","desc":"57940"},{"messageId":"57941","fix":"61543","desc":"57943"},{"messageId":"57938","fix":"61544","desc":"57940"},{"messageId":"57941","fix":"61545","desc":"57943"},{"messageId":"57938","fix":"61546","desc":"57940"},{"messageId":"57941","fix":"61547","desc":"57943"},{"messageId":"57938","fix":"61548","desc":"57940"},{"messageId":"57941","fix":"61549","desc":"57943"},{"messageId":"57938","fix":"61550","desc":"57940"},{"messageId":"57941","fix":"61551","desc":"57943"},{"messageId":"57938","fix":"61552","desc":"57940"},{"messageId":"57941","fix":"61553","desc":"57943"},{"messageId":"57938","fix":"61554","desc":"57940"},{"messageId":"57941","fix":"61555","desc":"57943"},{"messageId":"57938","fix":"61556","desc":"57940"},{"messageId":"57941","fix":"61557","desc":"57943"},{"messageId":"57938","fix":"61558","desc":"57940"},{"messageId":"57941","fix":"61559","desc":"57943"},{"messageId":"57938","fix":"61560","desc":"57940"},{"messageId":"57941","fix":"61561","desc":"57943"},{"messageId":"57938","fix":"61562","desc":"57940"},{"messageId":"57941","fix":"61563","desc":"57943"},{"messageId":"57938","fix":"61564","desc":"57940"},{"messageId":"57941","fix":"61565","desc":"57943"},{"messageId":"57938","fix":"61566","desc":"57940"},{"messageId":"57941","fix":"61567","desc":"57943"},{"messageId":"57938","fix":"61568","desc":"57940"},{"messageId":"57941","fix":"61569","desc":"57943"},{"messageId":"57938","fix":"61570","desc":"57940"},{"messageId":"57941","fix":"61571","desc":"57943"},{"messageId":"57938","fix":"61572","desc":"57940"},{"messageId":"57941","fix":"61573","desc":"57943"},{"messageId":"57938","fix":"61574","desc":"57940"},{"messageId":"57941","fix":"61575","desc":"57943"},{"messageId":"57938","fix":"61576","desc":"57940"},{"messageId":"57941","fix":"61577","desc":"57943"},{"messageId":"57938","fix":"61578","desc":"57940"},{"messageId":"57941","fix":"61579","desc":"57943"},{"messageId":"57938","fix":"61580","desc":"57940"},{"messageId":"57941","fix":"61581","desc":"57943"},{"messageId":"57938","fix":"61582","desc":"57940"},{"messageId":"57941","fix":"61583","desc":"57943"},{"messageId":"57938","fix":"61584","desc":"57940"},{"messageId":"57941","fix":"61585","desc":"57943"},{"messageId":"57938","fix":"61586","desc":"57940"},{"messageId":"57941","fix":"61587","desc":"57943"},{"messageId":"57938","fix":"61588","desc":"57940"},{"messageId":"57941","fix":"61589","desc":"57943"},{"messageId":"57938","fix":"61590","desc":"57940"},{"messageId":"57941","fix":"61591","desc":"57943"},{"messageId":"57938","fix":"61592","desc":"57940"},{"messageId":"57941","fix":"61593","desc":"57943"},{"messageId":"57938","fix":"61594","desc":"57940"},{"messageId":"57941","fix":"61595","desc":"57943"},{"messageId":"57938","fix":"61596","desc":"57940"},{"messageId":"57941","fix":"61597","desc":"57943"},{"messageId":"57938","fix":"61598","desc":"57940"},{"messageId":"57941","fix":"61599","desc":"57943"},{"messageId":"57938","fix":"61600","desc":"57940"},{"messageId":"57941","fix":"61601","desc":"57943"},{"messageId":"57938","fix":"61602","desc":"57940"},{"messageId":"57941","fix":"61603","desc":"57943"},{"messageId":"57938","fix":"61604","desc":"57940"},{"messageId":"57941","fix":"61605","desc":"57943"},{"messageId":"57938","fix":"61606","desc":"57940"},{"messageId":"57941","fix":"61607","desc":"57943"},{"messageId":"57938","fix":"61608","desc":"57940"},{"messageId":"57941","fix":"61609","desc":"57943"},{"messageId":"57938","fix":"61610","desc":"57940"},{"messageId":"57941","fix":"61611","desc":"57943"},{"messageId":"57938","fix":"61612","desc":"57940"},{"messageId":"57941","fix":"61613","desc":"57943"},{"messageId":"57938","fix":"61614","desc":"57940"},{"messageId":"57941","fix":"61615","desc":"57943"},{"messageId":"57938","fix":"61616","desc":"57940"},{"messageId":"57941","fix":"61617","desc":"57943"},{"messageId":"57938","fix":"61618","desc":"57940"},{"messageId":"57941","fix":"61619","desc":"57943"},{"messageId":"57938","fix":"61620","desc":"57940"},{"messageId":"57941","fix":"61621","desc":"57943"},{"messageId":"57938","fix":"61622","desc":"57940"},{"messageId":"57941","fix":"61623","desc":"57943"},{"messageId":"57938","fix":"61624","desc":"57940"},{"messageId":"57941","fix":"61625","desc":"57943"},{"messageId":"57938","fix":"61626","desc":"57940"},{"messageId":"57941","fix":"61627","desc":"57943"},{"messageId":"57938","fix":"61628","desc":"57940"},{"messageId":"57941","fix":"61629","desc":"57943"},{"messageId":"57938","fix":"61630","desc":"57940"},{"messageId":"57941","fix":"61631","desc":"57943"},{"messageId":"57938","fix":"61632","desc":"57940"},{"messageId":"57941","fix":"61633","desc":"57943"},{"messageId":"57938","fix":"61634","desc":"57940"},{"messageId":"57941","fix":"61635","desc":"57943"},{"messageId":"57938","fix":"61636","desc":"57940"},{"messageId":"57941","fix":"61637","desc":"57943"},{"messageId":"57938","fix":"61638","desc":"57940"},{"messageId":"57941","fix":"61639","desc":"57943"},{"messageId":"57938","fix":"61640","desc":"57940"},{"messageId":"57941","fix":"61641","desc":"57943"},{"messageId":"57938","fix":"61642","desc":"57940"},{"messageId":"57941","fix":"61643","desc":"57943"},{"messageId":"57938","fix":"61644","desc":"57940"},{"messageId":"57941","fix":"61645","desc":"57943"},{"messageId":"57938","fix":"61646","desc":"57940"},{"messageId":"57941","fix":"61647","desc":"57943"},{"messageId":"57938","fix":"61648","desc":"57940"},{"messageId":"57941","fix":"61649","desc":"57943"},{"messageId":"57938","fix":"61650","desc":"57940"},{"messageId":"57941","fix":"61651","desc":"57943"},{"messageId":"57938","fix":"61652","desc":"57940"},{"messageId":"57941","fix":"61653","desc":"57943"},{"messageId":"57938","fix":"61654","desc":"57940"},{"messageId":"57941","fix":"61655","desc":"57943"},{"messageId":"57938","fix":"61656","desc":"57940"},{"messageId":"57941","fix":"61657","desc":"57943"},{"messageId":"57938","fix":"61658","desc":"57940"},{"messageId":"57941","fix":"61659","desc":"57943"},{"messageId":"57938","fix":"61660","desc":"57940"},{"messageId":"57941","fix":"61661","desc":"57943"},{"messageId":"57938","fix":"61662","desc":"57940"},{"messageId":"57941","fix":"61663","desc":"57943"},{"messageId":"57938","fix":"61664","desc":"57940"},{"messageId":"57941","fix":"61665","desc":"57943"},{"messageId":"57938","fix":"61666","desc":"57940"},{"messageId":"57941","fix":"61667","desc":"57943"},{"messageId":"57938","fix":"61668","desc":"57940"},{"messageId":"57941","fix":"61669","desc":"57943"},{"messageId":"57938","fix":"61670","desc":"57940"},{"messageId":"57941","fix":"61671","desc":"57943"},{"messageId":"57938","fix":"61672","desc":"57940"},{"messageId":"57941","fix":"61673","desc":"57943"},{"messageId":"57938","fix":"61674","desc":"57940"},{"messageId":"57941","fix":"61675","desc":"57943"},{"messageId":"57938","fix":"61676","desc":"57940"},{"messageId":"57941","fix":"61677","desc":"57943"},{"messageId":"57938","fix":"61678","desc":"57940"},{"messageId":"57941","fix":"61679","desc":"57943"},{"messageId":"57938","fix":"61680","desc":"57940"},{"messageId":"57941","fix":"61681","desc":"57943"},{"messageId":"57938","fix":"61682","desc":"57940"},{"messageId":"57941","fix":"61683","desc":"57943"},{"messageId":"57938","fix":"61684","desc":"57940"},{"messageId":"57941","fix":"61685","desc":"57943"},{"messageId":"57938","fix":"61686","desc":"57940"},{"messageId":"57941","fix":"61687","desc":"57943"},{"messageId":"57938","fix":"61688","desc":"57940"},{"messageId":"57941","fix":"61689","desc":"57943"},{"messageId":"57938","fix":"61690","desc":"57940"},{"messageId":"57941","fix":"61691","desc":"57943"},{"messageId":"57938","fix":"61692","desc":"57940"},{"messageId":"57941","fix":"61693","desc":"57943"},{"messageId":"57938","fix":"61694","desc":"57940"},{"messageId":"57941","fix":"61695","desc":"57943"},{"messageId":"57938","fix":"61696","desc":"57940"},{"messageId":"57941","fix":"61697","desc":"57943"},{"messageId":"57938","fix":"61698","desc":"57940"},{"messageId":"57941","fix":"61699","desc":"57943"},{"messageId":"57938","fix":"61700","desc":"57940"},{"messageId":"57941","fix":"61701","desc":"57943"},{"messageId":"57938","fix":"61702","desc":"57940"},{"messageId":"57941","fix":"61703","desc":"57943"},{"messageId":"57938","fix":"61704","desc":"57940"},{"messageId":"57941","fix":"61705","desc":"57943"},{"messageId":"57938","fix":"61706","desc":"57940"},{"messageId":"57941","fix":"61707","desc":"57943"},{"messageId":"57938","fix":"61708","desc":"57940"},{"messageId":"57941","fix":"61709","desc":"57943"},{"messageId":"57938","fix":"61710","desc":"57940"},{"messageId":"57941","fix":"61711","desc":"57943"},{"messageId":"57938","fix":"61712","desc":"57940"},{"messageId":"57941","fix":"61713","desc":"57943"},{"messageId":"57938","fix":"61714","desc":"57940"},{"messageId":"57941","fix":"61715","desc":"57943"},{"messageId":"57938","fix":"61716","desc":"57940"},{"messageId":"57941","fix":"61717","desc":"57943"},{"messageId":"57938","fix":"61718","desc":"57940"},{"messageId":"57941","fix":"61719","desc":"57943"},{"messageId":"57938","fix":"61720","desc":"57940"},{"messageId":"57941","fix":"61721","desc":"57943"},{"messageId":"57938","fix":"61722","desc":"57940"},{"messageId":"57941","fix":"61723","desc":"57943"},{"messageId":"57938","fix":"61724","desc":"57940"},{"messageId":"57941","fix":"61725","desc":"57943"},{"messageId":"57938","fix":"61726","desc":"57940"},{"messageId":"57941","fix":"61727","desc":"57943"},{"messageId":"57938","fix":"61728","desc":"57940"},{"messageId":"57941","fix":"61729","desc":"57943"},{"messageId":"57938","fix":"61730","desc":"57940"},{"messageId":"57941","fix":"61731","desc":"57943"},{"messageId":"57938","fix":"61732","desc":"57940"},{"messageId":"57941","fix":"61733","desc":"57943"},{"messageId":"57938","fix":"61734","desc":"57940"},{"messageId":"57941","fix":"61735","desc":"57943"},{"messageId":"57938","fix":"61736","desc":"57940"},{"messageId":"57941","fix":"61737","desc":"57943"},{"messageId":"57938","fix":"61738","desc":"57940"},{"messageId":"57941","fix":"61739","desc":"57943"},{"messageId":"57938","fix":"61740","desc":"57940"},{"messageId":"57941","fix":"61741","desc":"57943"},{"messageId":"57938","fix":"61742","desc":"57940"},{"messageId":"57941","fix":"61743","desc":"57943"},{"messageId":"57938","fix":"61744","desc":"57940"},{"messageId":"57941","fix":"61745","desc":"57943"},{"messageId":"57938","fix":"61746","desc":"57940"},{"messageId":"57941","fix":"61747","desc":"57943"},{"messageId":"57938","fix":"61748","desc":"57940"},{"messageId":"57941","fix":"61749","desc":"57943"},{"messageId":"57938","fix":"61750","desc":"57940"},{"messageId":"57941","fix":"61751","desc":"57943"},{"messageId":"57938","fix":"61752","desc":"57940"},{"messageId":"57941","fix":"61753","desc":"57943"},{"messageId":"57938","fix":"61754","desc":"57940"},{"messageId":"57941","fix":"61755","desc":"57943"},{"messageId":"57938","fix":"61756","desc":"57940"},{"messageId":"57941","fix":"61757","desc":"57943"},{"messageId":"57938","fix":"61758","desc":"57940"},{"messageId":"57941","fix":"61759","desc":"57943"},{"messageId":"57938","fix":"61760","desc":"57940"},{"messageId":"57941","fix":"61761","desc":"57943"},{"messageId":"57938","fix":"61762","desc":"57940"},{"messageId":"57941","fix":"61763","desc":"57943"},{"messageId":"57938","fix":"61764","desc":"57940"},{"messageId":"57941","fix":"61765","desc":"57943"},{"messageId":"57938","fix":"61766","desc":"57940"},{"messageId":"57941","fix":"61767","desc":"57943"},{"messageId":"57938","fix":"61768","desc":"57940"},{"messageId":"57941","fix":"61769","desc":"57943"},{"messageId":"57938","fix":"61770","desc":"57940"},{"messageId":"57941","fix":"61771","desc":"57943"},{"messageId":"57938","fix":"61772","desc":"57940"},{"messageId":"57941","fix":"61773","desc":"57943"},{"messageId":"57938","fix":"61774","desc":"57940"},{"messageId":"57941","fix":"61775","desc":"57943"},{"messageId":"57938","fix":"61776","desc":"57940"},{"messageId":"57941","fix":"61777","desc":"57943"},{"messageId":"57938","fix":"61778","desc":"57940"},{"messageId":"57941","fix":"61779","desc":"57943"},{"messageId":"57938","fix":"61780","desc":"57940"},{"messageId":"57941","fix":"61781","desc":"57943"},{"messageId":"57938","fix":"61782","desc":"57940"},{"messageId":"57941","fix":"61783","desc":"57943"},{"messageId":"57938","fix":"61784","desc":"57940"},{"messageId":"57941","fix":"61785","desc":"57943"},{"messageId":"57938","fix":"61786","desc":"57940"},{"messageId":"57941","fix":"61787","desc":"57943"},{"messageId":"57938","fix":"61788","desc":"57940"},{"messageId":"57941","fix":"61789","desc":"57943"},{"messageId":"57938","fix":"61790","desc":"57940"},{"messageId":"57941","fix":"61791","desc":"57943"},{"messageId":"57938","fix":"61792","desc":"57940"},{"messageId":"57941","fix":"61793","desc":"57943"},{"messageId":"57938","fix":"61794","desc":"57940"},{"messageId":"57941","fix":"61795","desc":"57943"},{"messageId":"57938","fix":"61796","desc":"57940"},{"messageId":"57941","fix":"61797","desc":"57943"},{"messageId":"57938","fix":"61798","desc":"57940"},{"messageId":"57941","fix":"61799","desc":"57943"},{"messageId":"57938","fix":"61800","desc":"57940"},{"messageId":"57941","fix":"61801","desc":"57943"},{"messageId":"57938","fix":"61802","desc":"57940"},{"messageId":"57941","fix":"61803","desc":"57943"},{"messageId":"57938","fix":"61804","desc":"57940"},{"messageId":"57941","fix":"61805","desc":"57943"},{"messageId":"57938","fix":"61806","desc":"57940"},{"messageId":"57941","fix":"61807","desc":"57943"},{"messageId":"57938","fix":"61808","desc":"57940"},{"messageId":"57941","fix":"61809","desc":"57943"},{"messageId":"57938","fix":"61810","desc":"57940"},{"messageId":"57941","fix":"61811","desc":"57943"},{"messageId":"57938","fix":"61812","desc":"57940"},{"messageId":"57941","fix":"61813","desc":"57943"},{"messageId":"57938","fix":"61814","desc":"57940"},{"messageId":"57941","fix":"61815","desc":"57943"},{"messageId":"57938","fix":"61816","desc":"57940"},{"messageId":"57941","fix":"61817","desc":"57943"},{"messageId":"57938","fix":"61818","desc":"57940"},{"messageId":"57941","fix":"61819","desc":"57943"},{"messageId":"57938","fix":"61820","desc":"57940"},{"messageId":"57941","fix":"61821","desc":"57943"},{"messageId":"57938","fix":"61822","desc":"57940"},{"messageId":"57941","fix":"61823","desc":"57943"},{"messageId":"57938","fix":"61824","desc":"57940"},{"messageId":"57941","fix":"61825","desc":"57943"},{"messageId":"57938","fix":"61826","desc":"57940"},{"messageId":"57941","fix":"61827","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61828","desc":"57940"},{"messageId":"57941","fix":"61829","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61830","desc":"57940"},{"messageId":"57941","fix":"61831","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61832","desc":"57940"},{"messageId":"57941","fix":"61833","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61834","desc":"57940"},{"messageId":"57941","fix":"61835","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61836","desc":"57940"},{"messageId":"57941","fix":"61837","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61838","desc":"57940"},{"messageId":"57941","fix":"61839","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61840","desc":"57940"},{"messageId":"57941","fix":"61841","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61842","desc":"57940"},{"messageId":"57941","fix":"61843","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61844","desc":"57940"},{"messageId":"57941","fix":"61845","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61846","desc":"57940"},{"messageId":"57941","fix":"61847","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61848","desc":"57940"},{"messageId":"57941","fix":"61849","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"61850","desc":"57940"},{"messageId":"57941","fix":"61851","desc":"57943"},{"messageId":"57938","fix":"61852","desc":"57940"},{"messageId":"57941","fix":"61853","desc":"57943"},{"messageId":"57938","fix":"61854","desc":"57940"},{"messageId":"57941","fix":"61855","desc":"57943"},{"messageId":"57938","fix":"61856","desc":"57940"},{"messageId":"57941","fix":"61857","desc":"57943"},{"messageId":"57938","fix":"61858","desc":"57940"},{"messageId":"57941","fix":"61859","desc":"57943"},{"messageId":"57938","fix":"61860","desc":"57940"},{"messageId":"57941","fix":"61861","desc":"57943"},{"messageId":"57938","fix":"61862","desc":"57940"},{"messageId":"57941","fix":"61863","desc":"57943"},{"messageId":"57938","fix":"61864","desc":"57940"},{"messageId":"57941","fix":"61865","desc":"57943"},{"messageId":"57938","fix":"61866","desc":"57940"},{"messageId":"57941","fix":"61867","desc":"57943"},{"messageId":"57938","fix":"61868","desc":"57940"},{"messageId":"57941","fix":"61869","desc":"57943"},{"messageId":"57938","fix":"61870","desc":"57940"},{"messageId":"57941","fix":"61871","desc":"57943"},{"messageId":"57938","fix":"61872","desc":"57940"},{"messageId":"57941","fix":"61873","desc":"57943"},{"messageId":"57938","fix":"61874","desc":"57940"},{"messageId":"57941","fix":"61875","desc":"57943"},{"messageId":"57938","fix":"61876","desc":"57940"},{"messageId":"57941","fix":"61877","desc":"57943"},{"messageId":"57938","fix":"61878","desc":"57940"},{"messageId":"57941","fix":"61879","desc":"57943"},{"messageId":"57938","fix":"61880","desc":"57940"},{"messageId":"57941","fix":"61881","desc":"57943"},{"messageId":"57938","fix":"61882","desc":"57940"},{"messageId":"57941","fix":"61883","desc":"57943"},{"messageId":"57938","fix":"61884","desc":"57940"},{"messageId":"57941","fix":"61885","desc":"57943"},{"messageId":"57938","fix":"61886","desc":"57940"},{"messageId":"57941","fix":"61887","desc":"57943"},{"messageId":"57938","fix":"61888","desc":"57940"},{"messageId":"57941","fix":"61889","desc":"57943"},{"messageId":"57938","fix":"61890","desc":"57940"},{"messageId":"57941","fix":"61891","desc":"57943"},{"messageId":"57938","fix":"61892","desc":"57940"},{"messageId":"57941","fix":"61893","desc":"57943"},{"messageId":"57938","fix":"61894","desc":"57940"},{"messageId":"57941","fix":"61895","desc":"57943"},{"messageId":"57938","fix":"61896","desc":"57940"},{"messageId":"57941","fix":"61897","desc":"57943"},{"messageId":"57938","fix":"61898","desc":"57940"},{"messageId":"57941","fix":"61899","desc":"57943"},{"messageId":"57938","fix":"61900","desc":"57940"},{"messageId":"57941","fix":"61901","desc":"57943"},{"messageId":"57938","fix":"61902","desc":"57940"},{"messageId":"57941","fix":"61903","desc":"57943"},{"messageId":"57938","fix":"61904","desc":"57940"},{"messageId":"57941","fix":"61905","desc":"57943"},{"messageId":"57938","fix":"61906","desc":"57940"},{"messageId":"57941","fix":"61907","desc":"57943"},{"messageId":"57938","fix":"61908","desc":"57940"},{"messageId":"57941","fix":"61909","desc":"57943"},{"messageId":"57938","fix":"61910","desc":"57940"},{"messageId":"57941","fix":"61911","desc":"57943"},{"messageId":"57938","fix":"61912","desc":"57940"},{"messageId":"57941","fix":"61913","desc":"57943"},{"messageId":"57938","fix":"61914","desc":"57940"},{"messageId":"57941","fix":"61915","desc":"57943"},{"messageId":"57938","fix":"61916","desc":"57940"},{"messageId":"57941","fix":"61917","desc":"57943"},{"messageId":"57938","fix":"61918","desc":"57940"},{"messageId":"57941","fix":"61919","desc":"57943"},{"messageId":"57938","fix":"61920","desc":"57940"},{"messageId":"57941","fix":"61921","desc":"57943"},{"messageId":"57938","fix":"61922","desc":"57940"},{"messageId":"57941","fix":"61923","desc":"57943"},{"messageId":"57938","fix":"61924","desc":"57940"},{"messageId":"57941","fix":"61925","desc":"57943"},{"messageId":"57938","fix":"61926","desc":"57940"},{"messageId":"57941","fix":"61927","desc":"57943"},{"messageId":"57938","fix":"61928","desc":"57940"},{"messageId":"57941","fix":"61929","desc":"57943"},{"messageId":"57938","fix":"61930","desc":"57940"},{"messageId":"57941","fix":"61931","desc":"57943"},{"messageId":"57938","fix":"61932","desc":"57940"},{"messageId":"57941","fix":"61933","desc":"57943"},{"messageId":"57938","fix":"61934","desc":"57940"},{"messageId":"57941","fix":"61935","desc":"57943"},{"messageId":"57938","fix":"61936","desc":"57940"},{"messageId":"57941","fix":"61937","desc":"57943"},{"messageId":"57938","fix":"61938","desc":"57940"},{"messageId":"57941","fix":"61939","desc":"57943"},{"messageId":"57938","fix":"61940","desc":"57940"},{"messageId":"57941","fix":"61941","desc":"57943"},{"messageId":"57938","fix":"61942","desc":"57940"},{"messageId":"57941","fix":"61943","desc":"57943"},{"messageId":"57938","fix":"61944","desc":"57940"},{"messageId":"57941","fix":"61945","desc":"57943"},{"messageId":"57938","fix":"61946","desc":"57940"},{"messageId":"57941","fix":"61947","desc":"57943"},{"messageId":"57938","fix":"61948","desc":"57940"},{"messageId":"57941","fix":"61949","desc":"57943"},{"messageId":"57938","fix":"61950","desc":"57940"},{"messageId":"57941","fix":"61951","desc":"57943"},{"messageId":"57938","fix":"61952","desc":"57940"},{"messageId":"57941","fix":"61953","desc":"57943"},{"messageId":"57938","fix":"61954","desc":"57940"},{"messageId":"57941","fix":"61955","desc":"57943"},{"messageId":"57938","fix":"61956","desc":"57940"},{"messageId":"57941","fix":"61957","desc":"57943"},{"messageId":"57938","fix":"61958","desc":"57940"},{"messageId":"57941","fix":"61959","desc":"57943"},{"messageId":"57938","fix":"61960","desc":"57940"},{"messageId":"57941","fix":"61961","desc":"57943"},{"messageId":"57938","fix":"61962","desc":"57940"},{"messageId":"57941","fix":"61963","desc":"57943"},{"messageId":"57938","fix":"61964","desc":"57940"},{"messageId":"57941","fix":"61965","desc":"57943"},{"messageId":"57938","fix":"61966","desc":"57940"},{"messageId":"57941","fix":"61967","desc":"57943"},{"messageId":"57938","fix":"61968","desc":"57940"},{"messageId":"57941","fix":"61969","desc":"57943"},{"messageId":"57938","fix":"61970","desc":"57940"},{"messageId":"57941","fix":"61971","desc":"57943"},{"messageId":"57938","fix":"61972","desc":"57940"},{"messageId":"57941","fix":"61973","desc":"57943"},{"messageId":"57938","fix":"61974","desc":"57940"},{"messageId":"57941","fix":"61975","desc":"57943"},{"messageId":"57938","fix":"61976","desc":"57940"},{"messageId":"57941","fix":"61977","desc":"57943"},{"messageId":"57938","fix":"61978","desc":"57940"},{"messageId":"57941","fix":"61979","desc":"57943"},{"messageId":"57938","fix":"61980","desc":"57940"},{"messageId":"57941","fix":"61981","desc":"57943"},{"messageId":"57938","fix":"61982","desc":"57940"},{"messageId":"57941","fix":"61983","desc":"57943"},{"messageId":"57938","fix":"61984","desc":"57940"},{"messageId":"57941","fix":"61985","desc":"57943"},{"messageId":"57938","fix":"61986","desc":"57940"},{"messageId":"57941","fix":"61987","desc":"57943"},{"messageId":"57938","fix":"61988","desc":"57940"},{"messageId":"57941","fix":"61989","desc":"57943"},{"messageId":"57938","fix":"61990","desc":"57940"},{"messageId":"57941","fix":"61991","desc":"57943"},{"messageId":"57938","fix":"61992","desc":"57940"},{"messageId":"57941","fix":"61993","desc":"57943"},{"messageId":"57938","fix":"61994","desc":"57940"},{"messageId":"57941","fix":"61995","desc":"57943"},{"messageId":"57938","fix":"61996","desc":"57940"},{"messageId":"57941","fix":"61997","desc":"57943"},{"messageId":"57938","fix":"61998","desc":"57940"},{"messageId":"57941","fix":"61999","desc":"57943"},{"messageId":"57938","fix":"62000","desc":"57940"},{"messageId":"57941","fix":"62001","desc":"57943"},{"messageId":"57938","fix":"62002","desc":"57940"},{"messageId":"57941","fix":"62003","desc":"57943"},{"messageId":"57938","fix":"62004","desc":"57940"},{"messageId":"57941","fix":"62005","desc":"57943"},{"messageId":"57938","fix":"62006","desc":"57940"},{"messageId":"57941","fix":"62007","desc":"57943"},{"messageId":"57938","fix":"62008","desc":"57940"},{"messageId":"57941","fix":"62009","desc":"57943"},{"messageId":"57938","fix":"62010","desc":"57940"},{"messageId":"57941","fix":"62011","desc":"57943"},{"messageId":"57938","fix":"62012","desc":"57940"},{"messageId":"57941","fix":"62013","desc":"57943"},{"messageId":"57938","fix":"62014","desc":"57940"},{"messageId":"57941","fix":"62015","desc":"57943"},{"messageId":"57938","fix":"62016","desc":"57940"},{"messageId":"57941","fix":"62017","desc":"57943"},{"messageId":"57938","fix":"62018","desc":"57940"},{"messageId":"57941","fix":"62019","desc":"57943"},{"messageId":"57938","fix":"62020","desc":"57940"},{"messageId":"57941","fix":"62021","desc":"57943"},{"messageId":"57938","fix":"62022","desc":"57940"},{"messageId":"57941","fix":"62023","desc":"57943"},{"messageId":"57938","fix":"62024","desc":"57940"},{"messageId":"57941","fix":"62025","desc":"57943"},{"messageId":"57938","fix":"62026","desc":"57940"},{"messageId":"57941","fix":"62027","desc":"57943"},{"messageId":"57938","fix":"62028","desc":"57940"},{"messageId":"57941","fix":"62029","desc":"57943"},{"messageId":"57938","fix":"62030","desc":"57940"},{"messageId":"57941","fix":"62031","desc":"57943"},{"messageId":"57938","fix":"62032","desc":"57940"},{"messageId":"57941","fix":"62033","desc":"57943"},{"messageId":"57938","fix":"62034","desc":"57940"},{"messageId":"57941","fix":"62035","desc":"57943"},{"messageId":"57938","fix":"62036","desc":"57940"},{"messageId":"57941","fix":"62037","desc":"57943"},{"messageId":"57938","fix":"62038","desc":"57940"},{"messageId":"57941","fix":"62039","desc":"57943"},{"messageId":"57938","fix":"62040","desc":"57940"},{"messageId":"57941","fix":"62041","desc":"57943"},{"messageId":"57938","fix":"62042","desc":"57940"},{"messageId":"57941","fix":"62043","desc":"57943"},{"messageId":"57938","fix":"62044","desc":"57940"},{"messageId":"57941","fix":"62045","desc":"57943"},{"messageId":"57938","fix":"62046","desc":"57940"},{"messageId":"57941","fix":"62047","desc":"57943"},{"messageId":"57938","fix":"62048","desc":"57940"},{"messageId":"57941","fix":"62049","desc":"57943"},{"messageId":"57938","fix":"62050","desc":"57940"},{"messageId":"57941","fix":"62051","desc":"57943"},{"messageId":"57938","fix":"62052","desc":"57940"},{"messageId":"57941","fix":"62053","desc":"57943"},{"messageId":"57938","fix":"62054","desc":"57940"},{"messageId":"57941","fix":"62055","desc":"57943"},{"messageId":"57938","fix":"62056","desc":"57940"},{"messageId":"57941","fix":"62057","desc":"57943"},{"messageId":"57938","fix":"62058","desc":"57940"},{"messageId":"57941","fix":"62059","desc":"57943"},{"messageId":"57938","fix":"62060","desc":"57940"},{"messageId":"57941","fix":"62061","desc":"57943"},{"messageId":"57938","fix":"62062","desc":"57940"},{"messageId":"57941","fix":"62063","desc":"57943"},{"messageId":"57938","fix":"62064","desc":"57940"},{"messageId":"57941","fix":"62065","desc":"57943"},{"messageId":"57938","fix":"62066","desc":"57940"},{"messageId":"57941","fix":"62067","desc":"57943"},{"messageId":"57938","fix":"62068","desc":"57940"},{"messageId":"57941","fix":"62069","desc":"57943"},{"messageId":"57938","fix":"62070","desc":"57940"},{"messageId":"57941","fix":"62071","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"62072","desc":"57940"},{"messageId":"57941","fix":"62073","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"62074","desc":"57940"},{"messageId":"57941","fix":"62075","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"62076","desc":"57940"},{"messageId":"57941","fix":"62077","desc":"57943"},{"messageId":"57938","fix":"62078","desc":"57940"},{"messageId":"57941","fix":"62079","desc":"57943"},{"messageId":"57938","fix":"62080","desc":"57940"},{"messageId":"57941","fix":"62081","desc":"57943"},{"messageId":"57938","fix":"62082","desc":"57940"},{"messageId":"57941","fix":"62083","desc":"57943"},{"messageId":"57938","fix":"62084","desc":"57940"},{"messageId":"57941","fix":"62085","desc":"57943"},{"messageId":"57938","fix":"62086","desc":"57940"},{"messageId":"57941","fix":"62087","desc":"57943"},{"messageId":"57938","fix":"62088","desc":"57940"},{"messageId":"57941","fix":"62089","desc":"57943"},{"messageId":"57938","fix":"62090","desc":"57940"},{"messageId":"57941","fix":"62091","desc":"57943"},{"messageId":"57938","fix":"62092","desc":"57940"},{"messageId":"57941","fix":"62093","desc":"57943"},{"messageId":"57938","fix":"62094","desc":"57940"},{"messageId":"57941","fix":"62095","desc":"57943"},{"messageId":"57938","fix":"62096","desc":"57940"},{"messageId":"57941","fix":"62097","desc":"57943"},{"messageId":"57938","fix":"62098","desc":"57940"},{"messageId":"57941","fix":"62099","desc":"57943"},{"messageId":"57938","fix":"62100","desc":"57940"},{"messageId":"57941","fix":"62101","desc":"57943"},{"messageId":"57938","fix":"62102","desc":"57940"},{"messageId":"57941","fix":"62103","desc":"57943"},{"messageId":"57938","fix":"62104","desc":"57940"},{"messageId":"57941","fix":"62105","desc":"57943"},{"messageId":"57938","fix":"62106","desc":"57940"},{"messageId":"57941","fix":"62107","desc":"57943"},{"messageId":"57938","fix":"62108","desc":"57940"},{"messageId":"57941","fix":"62109","desc":"57943"},{"messageId":"57938","fix":"62110","desc":"57940"},{"messageId":"57941","fix":"62111","desc":"57943"},{"messageId":"57938","fix":"62112","desc":"57940"},{"messageId":"57941","fix":"62113","desc":"57943"},{"messageId":"57938","fix":"62114","desc":"57940"},{"messageId":"57941","fix":"62115","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"62116","desc":"57940"},{"messageId":"57941","fix":"62117","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"62118","desc":"57940"},{"messageId":"57941","fix":"62119","desc":"57943"},{"messageId":"57938","fix":"62120","desc":"57940"},{"messageId":"57941","fix":"62121","desc":"57943"},{"messageId":"57938","fix":"62122","desc":"57940"},{"messageId":"57941","fix":"62123","desc":"57943"},{"messageId":"57938","fix":"62124","desc":"57940"},{"messageId":"57941","fix":"62125","desc":"57943"},{"messageId":"57938","fix":"62126","desc":"57940"},{"messageId":"57941","fix":"62127","desc":"57943"},{"messageId":"57938","fix":"62128","desc":"57940"},{"messageId":"57941","fix":"62129","desc":"57943"},{"messageId":"57938","fix":"62130","desc":"57940"},{"messageId":"57941","fix":"62131","desc":"57943"},{"messageId":"57938","fix":"62132","desc":"57940"},{"messageId":"57941","fix":"62133","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"62134","desc":"57940"},{"messageId":"57941","fix":"62135","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"62136","desc":"57940"},{"messageId":"57941","fix":"62137","desc":"57943"},{"messageId":"57938","fix":"62138","desc":"57940"},{"messageId":"57941","fix":"62139","desc":"57943"},{"messageId":"57938","fix":"62140","desc":"57940"},{"messageId":"57941","fix":"62141","desc":"57943"},{"messageId":"57938","fix":"62142","desc":"57940"},{"messageId":"57941","fix":"62143","desc":"57943"},{"messageId":"57938","fix":"62144","desc":"57940"},{"messageId":"57941","fix":"62145","desc":"57943"},{"messageId":"57938","fix":"62146","desc":"57940"},{"messageId":"57941","fix":"62147","desc":"57943"},{"messageId":"57938","fix":"62148","desc":"57940"},{"messageId":"57941","fix":"62149","desc":"57943"},{"messageId":"57938","fix":"62150","desc":"57940"},{"messageId":"57941","fix":"62151","desc":"57943"},{"messageId":"57938","fix":"62152","desc":"57940"},{"messageId":"57941","fix":"62153","desc":"57943"},{"messageId":"57938","fix":"62154","desc":"57940"},{"messageId":"57941","fix":"62155","desc":"57943"},{"messageId":"57938","fix":"62156","desc":"57940"},{"messageId":"57941","fix":"62157","desc":"57943"},{"messageId":"57938","fix":"62158","desc":"57940"},{"messageId":"57941","fix":"62159","desc":"57943"},{"messageId":"57938","fix":"62160","desc":"57940"},{"messageId":"57941","fix":"62161","desc":"57943"},{"messageId":"57938","fix":"62162","desc":"57940"},{"messageId":"57941","fix":"62163","desc":"57943"},{"messageId":"57938","fix":"62164","desc":"57940"},{"messageId":"57941","fix":"62165","desc":"57943"},{"messageId":"57938","fix":"62166","desc":"57940"},{"messageId":"57941","fix":"62167","desc":"57943"},{"messageId":"57938","fix":"62168","desc":"57940"},{"messageId":"57941","fix":"62169","desc":"57943"},{"messageId":"57938","fix":"62170","desc":"57940"},{"messageId":"57941","fix":"62171","desc":"57943"},{"messageId":"57938","fix":"62172","desc":"57940"},{"messageId":"57941","fix":"62173","desc":"57943"},{"messageId":"57938","fix":"62174","desc":"57940"},{"messageId":"57941","fix":"62175","desc":"57943"},{"messageId":"57938","fix":"62176","desc":"57940"},{"messageId":"57941","fix":"62177","desc":"57943"},{"messageId":"57938","fix":"62178","desc":"57940"},{"messageId":"57941","fix":"62179","desc":"57943"},{"messageId":"57938","fix":"62180","desc":"57940"},{"messageId":"57941","fix":"62181","desc":"57943"},{"messageId":"57938","fix":"62182","desc":"57940"},{"messageId":"57941","fix":"62183","desc":"57943"},{"messageId":"57938","fix":"62184","desc":"57940"},{"messageId":"57941","fix":"62185","desc":"57943"},{"messageId":"57938","fix":"62186","desc":"57940"},{"messageId":"57941","fix":"62187","desc":"57943"},{"messageId":"57938","fix":"62188","desc":"57940"},{"messageId":"57941","fix":"62189","desc":"57943"},{"messageId":"57938","fix":"62190","desc":"57940"},{"messageId":"57941","fix":"62191","desc":"57943"},{"messageId":"57938","fix":"62192","desc":"57940"},{"messageId":"57941","fix":"62193","desc":"57943"},{"messageId":"57938","fix":"62194","desc":"57940"},{"messageId":"57941","fix":"62195","desc":"57943"},{"messageId":"57938","fix":"62196","desc":"57940"},{"messageId":"57941","fix":"62197","desc":"57943"},{"messageId":"57938","fix":"62198","desc":"57940"},{"messageId":"57941","fix":"62199","desc":"57943"},{"messageId":"57938","fix":"62200","desc":"57940"},{"messageId":"57941","fix":"62201","desc":"57943"},{"messageId":"57938","fix":"62202","desc":"57940"},{"messageId":"57941","fix":"62203","desc":"57943"},{"messageId":"57938","fix":"62204","desc":"57940"},{"messageId":"57941","fix":"62205","desc":"57943"},{"messageId":"57938","fix":"62206","desc":"57940"},{"messageId":"57941","fix":"62207","desc":"57943"},{"messageId":"57938","fix":"62208","desc":"57940"},{"messageId":"57941","fix":"62209","desc":"57943"},{"messageId":"57938","fix":"62210","desc":"57940"},{"messageId":"57941","fix":"62211","desc":"57943"},{"messageId":"57938","fix":"62212","desc":"57940"},{"messageId":"57941","fix":"62213","desc":"57943"},{"messageId":"57938","fix":"62214","desc":"57940"},{"messageId":"57941","fix":"62215","desc":"57943"},{"messageId":"57938","fix":"62216","desc":"57940"},{"messageId":"57941","fix":"62217","desc":"57943"},{"messageId":"57938","fix":"62218","desc":"57940"},{"messageId":"57941","fix":"62219","desc":"57943"},{"messageId":"57938","fix":"62220","desc":"57940"},{"messageId":"57941","fix":"62221","desc":"57943"},{"messageId":"57938","fix":"62222","desc":"57940"},{"messageId":"57941","fix":"62223","desc":"57943"},{"messageId":"57938","fix":"62224","desc":"57940"},{"messageId":"57941","fix":"62225","desc":"57943"},{"messageId":"57938","fix":"62226","desc":"57940"},{"messageId":"57941","fix":"62227","desc":"57943"},{"messageId":"57938","fix":"62228","desc":"57940"},{"messageId":"57941","fix":"62229","desc":"57943"},{"messageId":"57938","fix":"62230","desc":"57940"},{"messageId":"57941","fix":"62231","desc":"57943"},{"messageId":"57938","fix":"62232","desc":"57940"},{"messageId":"57941","fix":"62233","desc":"57943"},{"messageId":"57938","fix":"62234","desc":"57940"},{"messageId":"57941","fix":"62235","desc":"57943"},{"messageId":"57938","fix":"62236","desc":"57940"},{"messageId":"57941","fix":"62237","desc":"57943"},{"messageId":"57938","fix":"62238","desc":"57940"},{"messageId":"57941","fix":"62239","desc":"57943"},{"messageId":"57938","fix":"62240","desc":"57940"},{"messageId":"57941","fix":"62241","desc":"57943"},{"messageId":"57938","fix":"62242","desc":"57940"},{"messageId":"57941","fix":"62243","desc":"57943"},{"messageId":"57938","fix":"62244","desc":"57940"},{"messageId":"57941","fix":"62245","desc":"57943"},{"messageId":"57938","fix":"62246","desc":"57940"},{"messageId":"57941","fix":"62247","desc":"57943"},{"messageId":"57938","fix":"62248","desc":"57940"},{"messageId":"57941","fix":"62249","desc":"57943"},{"messageId":"57938","fix":"62250","desc":"57940"},{"messageId":"57941","fix":"62251","desc":"57943"},{"messageId":"57938","fix":"62252","desc":"57940"},{"messageId":"57941","fix":"62253","desc":"57943"},{"messageId":"57938","fix":"62254","desc":"57940"},{"messageId":"57941","fix":"62255","desc":"57943"},{"messageId":"57938","fix":"62256","desc":"57940"},{"messageId":"57941","fix":"62257","desc":"57943"},{"messageId":"57938","fix":"62258","desc":"57940"},{"messageId":"57941","fix":"62259","desc":"57943"},{"messageId":"57938","fix":"62260","desc":"57940"},{"messageId":"57941","fix":"62261","desc":"57943"},{"messageId":"57938","fix":"62262","desc":"57940"},{"messageId":"57941","fix":"62263","desc":"57943"},{"messageId":"57938","fix":"62264","desc":"57940"},{"messageId":"57941","fix":"62265","desc":"57943"},{"messageId":"57938","fix":"62266","desc":"57940"},{"messageId":"57941","fix":"62267","desc":"57943"},{"messageId":"57938","fix":"62268","desc":"57940"},{"messageId":"57941","fix":"62269","desc":"57943"},{"messageId":"57938","fix":"62270","desc":"57940"},{"messageId":"57941","fix":"62271","desc":"57943"},{"messageId":"57938","fix":"62272","desc":"57940"},{"messageId":"57941","fix":"62273","desc":"57943"},{"messageId":"57938","fix":"62274","desc":"57940"},{"messageId":"57941","fix":"62275","desc":"57943"},{"messageId":"57938","fix":"62276","desc":"57940"},{"messageId":"57941","fix":"62277","desc":"57943"},{"messageId":"57938","fix":"62278","desc":"57940"},{"messageId":"57941","fix":"62279","desc":"57943"},{"messageId":"57938","fix":"62280","desc":"57940"},{"messageId":"57941","fix":"62281","desc":"57943"},{"messageId":"57938","fix":"62282","desc":"57940"},{"messageId":"57941","fix":"62283","desc":"57943"},{"messageId":"57938","fix":"62284","desc":"57940"},{"messageId":"57941","fix":"62285","desc":"57943"},{"messageId":"57938","fix":"62286","desc":"57940"},{"messageId":"57941","fix":"62287","desc":"57943"},{"messageId":"57938","fix":"62288","desc":"57940"},{"messageId":"57941","fix":"62289","desc":"57943"},{"messageId":"57938","fix":"62290","desc":"57940"},{"messageId":"57941","fix":"62291","desc":"57943"},{"messageId":"57938","fix":"62292","desc":"57940"},{"messageId":"57941","fix":"62293","desc":"57943"},{"messageId":"57938","fix":"62294","desc":"57940"},{"messageId":"57941","fix":"62295","desc":"57943"},{"messageId":"57938","fix":"62296","desc":"57940"},{"messageId":"57941","fix":"62297","desc":"57943"},{"messageId":"57938","fix":"62298","desc":"57940"},{"messageId":"57941","fix":"62299","desc":"57943"},{"messageId":"57938","fix":"62300","desc":"57940"},{"messageId":"57941","fix":"62301","desc":"57943"},{"messageId":"57938","fix":"62302","desc":"57940"},{"messageId":"57941","fix":"62303","desc":"57943"},{"messageId":"57938","fix":"62304","desc":"57940"},{"messageId":"57941","fix":"62305","desc":"57943"},{"messageId":"57938","fix":"62306","desc":"57940"},{"messageId":"57941","fix":"62307","desc":"57943"},{"messageId":"57938","fix":"62308","desc":"57940"},{"messageId":"57941","fix":"62309","desc":"57943"},{"messageId":"57938","fix":"62310","desc":"57940"},{"messageId":"57941","fix":"62311","desc":"57943"},{"messageId":"57938","fix":"62312","desc":"57940"},{"messageId":"57941","fix":"62313","desc":"57943"},{"messageId":"57938","fix":"62314","desc":"57940"},{"messageId":"57941","fix":"62315","desc":"57943"},{"messageId":"57938","fix":"62316","desc":"57940"},{"messageId":"57941","fix":"62317","desc":"57943"},{"messageId":"57938","fix":"62318","desc":"57940"},{"messageId":"57941","fix":"62319","desc":"57943"},{"messageId":"57938","fix":"62320","desc":"57940"},{"messageId":"57941","fix":"62321","desc":"57943"},{"messageId":"57938","fix":"62322","desc":"57940"},{"messageId":"57941","fix":"62323","desc":"57943"},{"messageId":"57938","fix":"62324","desc":"57940"},{"messageId":"57941","fix":"62325","desc":"57943"},{"messageId":"57938","fix":"62326","desc":"57940"},{"messageId":"57941","fix":"62327","desc":"57943"},{"messageId":"57938","fix":"62328","desc":"57940"},{"messageId":"57941","fix":"62329","desc":"57943"},{"messageId":"57938","fix":"62330","desc":"57940"},{"messageId":"57941","fix":"62331","desc":"57943"},{"messageId":"57938","fix":"62332","desc":"57940"},{"messageId":"57941","fix":"62333","desc":"57943"},{"messageId":"57938","fix":"62334","desc":"57940"},{"messageId":"57941","fix":"62335","desc":"57943"},{"messageId":"57938","fix":"62336","desc":"57940"},{"messageId":"57941","fix":"62337","desc":"57943"},{"messageId":"57938","fix":"62338","desc":"57940"},{"messageId":"57941","fix":"62339","desc":"57943"},{"messageId":"57938","fix":"62340","desc":"57940"},{"messageId":"57941","fix":"62341","desc":"57943"},{"messageId":"57938","fix":"62342","desc":"57940"},{"messageId":"57941","fix":"62343","desc":"57943"},{"messageId":"57938","fix":"62344","desc":"57940"},{"messageId":"57941","fix":"62345","desc":"57943"},{"messageId":"57938","fix":"62346","desc":"57940"},{"messageId":"57941","fix":"62347","desc":"57943"},{"messageId":"57938","fix":"62348","desc":"57940"},{"messageId":"57941","fix":"62349","desc":"57943"},{"messageId":"57938","fix":"62350","desc":"57940"},{"messageId":"57941","fix":"62351","desc":"57943"},{"messageId":"57938","fix":"62352","desc":"57940"},{"messageId":"57941","fix":"62353","desc":"57943"},{"messageId":"57938","fix":"62354","desc":"57940"},{"messageId":"57941","fix":"62355","desc":"57943"},{"messageId":"57938","fix":"62356","desc":"57940"},{"messageId":"57941","fix":"62357","desc":"57943"},{"messageId":"57938","fix":"62358","desc":"57940"},{"messageId":"57941","fix":"62359","desc":"57943"},{"messageId":"57938","fix":"62360","desc":"57940"},{"messageId":"57941","fix":"62361","desc":"57943"},{"messageId":"57938","fix":"62362","desc":"57940"},{"messageId":"57941","fix":"62363","desc":"57943"},{"messageId":"57938","fix":"62364","desc":"57940"},{"messageId":"57941","fix":"62365","desc":"57943"},{"messageId":"57938","fix":"62366","desc":"57940"},{"messageId":"57941","fix":"62367","desc":"57943"},{"messageId":"57938","fix":"62368","desc":"57940"},{"messageId":"57941","fix":"62369","desc":"57943"},{"messageId":"57938","fix":"62370","desc":"57940"},{"messageId":"57941","fix":"62371","desc":"57943"},{"messageId":"57938","fix":"62372","desc":"57940"},{"messageId":"57941","fix":"62373","desc":"57943"},{"messageId":"57938","fix":"62374","desc":"57940"},{"messageId":"57941","fix":"62375","desc":"57943"},{"messageId":"57938","fix":"62376","desc":"57940"},{"messageId":"57941","fix":"62377","desc":"57943"},{"messageId":"57938","fix":"62378","desc":"57940"},{"messageId":"57941","fix":"62379","desc":"57943"},{"messageId":"57938","fix":"62380","desc":"57940"},{"messageId":"57941","fix":"62381","desc":"57943"},{"messageId":"57938","fix":"62382","desc":"57940"},{"messageId":"57941","fix":"62383","desc":"57943"},{"messageId":"57938","fix":"62384","desc":"57940"},{"messageId":"57941","fix":"62385","desc":"57943"},{"messageId":"57938","fix":"62386","desc":"57940"},{"messageId":"57941","fix":"62387","desc":"57943"},{"messageId":"57938","fix":"62388","desc":"57940"},{"messageId":"57941","fix":"62389","desc":"57943"},{"messageId":"57938","fix":"62390","desc":"57940"},{"messageId":"57941","fix":"62391","desc":"57943"},{"messageId":"57938","fix":"62392","desc":"57940"},{"messageId":"57941","fix":"62393","desc":"57943"},{"messageId":"57938","fix":"62394","desc":"57940"},{"messageId":"57941","fix":"62395","desc":"57943"},{"messageId":"57938","fix":"62396","desc":"57940"},{"messageId":"57941","fix":"62397","desc":"57943"},{"messageId":"57938","fix":"62398","desc":"57940"},{"messageId":"57941","fix":"62399","desc":"57943"},{"messageId":"57938","fix":"62400","desc":"57940"},{"messageId":"57941","fix":"62401","desc":"57943"},{"messageId":"57938","fix":"62402","desc":"57940"},{"messageId":"57941","fix":"62403","desc":"57943"},{"messageId":"57938","fix":"62404","desc":"57940"},{"messageId":"57941","fix":"62405","desc":"57943"},{"messageId":"57938","fix":"62406","desc":"57940"},{"messageId":"57941","fix":"62407","desc":"57943"},{"messageId":"57938","fix":"62408","desc":"57940"},{"messageId":"57941","fix":"62409","desc":"57943"},{"messageId":"57938","fix":"62410","desc":"57940"},{"messageId":"57941","fix":"62411","desc":"57943"},{"messageId":"57938","fix":"62412","desc":"57940"},{"messageId":"57941","fix":"62413","desc":"57943"},{"messageId":"57938","fix":"62414","desc":"57940"},{"messageId":"57941","fix":"62415","desc":"57943"},{"messageId":"57938","fix":"62416","desc":"57940"},{"messageId":"57941","fix":"62417","desc":"57943"},{"messageId":"57938","fix":"62418","desc":"57940"},{"messageId":"57941","fix":"62419","desc":"57943"},{"messageId":"57938","fix":"62420","desc":"57940"},{"messageId":"57941","fix":"62421","desc":"57943"},{"messageId":"57938","fix":"62422","desc":"57940"},{"messageId":"57941","fix":"62423","desc":"57943"},{"messageId":"57938","fix":"62424","desc":"57940"},{"messageId":"57941","fix":"62425","desc":"57943"},{"messageId":"57938","fix":"62426","desc":"57940"},{"messageId":"57941","fix":"62427","desc":"57943"},{"messageId":"57938","fix":"62428","desc":"57940"},{"messageId":"57941","fix":"62429","desc":"57943"},{"messageId":"57938","fix":"62430","desc":"57940"},{"messageId":"57941","fix":"62431","desc":"57943"},{"messageId":"57938","fix":"62432","desc":"57940"},{"messageId":"57941","fix":"62433","desc":"57943"},{"messageId":"57938","fix":"62434","desc":"57940"},{"messageId":"57941","fix":"62435","desc":"57943"},{"messageId":"57938","fix":"62436","desc":"57940"},{"messageId":"57941","fix":"62437","desc":"57943"},{"messageId":"57938","fix":"62438","desc":"57940"},{"messageId":"57941","fix":"62439","desc":"57943"},{"messageId":"57938","fix":"62440","desc":"57940"},{"messageId":"57941","fix":"62441","desc":"57943"},{"messageId":"57938","fix":"62442","desc":"57940"},{"messageId":"57941","fix":"62443","desc":"57943"},{"messageId":"57938","fix":"62444","desc":"57940"},{"messageId":"57941","fix":"62445","desc":"57943"},{"messageId":"57938","fix":"62446","desc":"57940"},{"messageId":"57941","fix":"62447","desc":"57943"},{"messageId":"57938","fix":"62448","desc":"57940"},{"messageId":"57941","fix":"62449","desc":"57943"},{"messageId":"57938","fix":"62450","desc":"57940"},{"messageId":"57941","fix":"62451","desc":"57943"},{"messageId":"57938","fix":"62452","desc":"57940"},{"messageId":"57941","fix":"62453","desc":"57943"},{"messageId":"57938","fix":"62454","desc":"57940"},{"messageId":"57941","fix":"62455","desc":"57943"},{"messageId":"57938","fix":"62456","desc":"57940"},{"messageId":"57941","fix":"62457","desc":"57943"},{"messageId":"57938","fix":"62458","desc":"57940"},{"messageId":"57941","fix":"62459","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"62460","desc":"57940"},{"messageId":"57941","fix":"62461","desc":"57943"},{"messageId":"57938","fix":"62462","desc":"57940"},{"messageId":"57941","fix":"62463","desc":"57943"},{"messageId":"57938","fix":"62464","desc":"57940"},{"messageId":"57941","fix":"62465","desc":"57943"},{"messageId":"57938","fix":"62466","desc":"57940"},{"messageId":"57941","fix":"62467","desc":"57943"},{"messageId":"57938","fix":"62468","desc":"57940"},{"messageId":"57941","fix":"62469","desc":"57943"},{"messageId":"57938","fix":"62470","desc":"57940"},{"messageId":"57941","fix":"62471","desc":"57943"},{"messageId":"57938","fix":"62472","desc":"57940"},{"messageId":"57941","fix":"62473","desc":"57943"},{"messageId":"57938","fix":"62474","desc":"57940"},{"messageId":"57941","fix":"62475","desc":"57943"},{"messageId":"57938","fix":"62476","desc":"57940"},{"messageId":"57941","fix":"62477","desc":"57943"},{"messageId":"57938","fix":"62478","desc":"57940"},{"messageId":"57941","fix":"62479","desc":"57943"},{"messageId":"57938","fix":"62480","desc":"57940"},{"messageId":"57941","fix":"62481","desc":"57943"},{"messageId":"57938","fix":"62482","desc":"57940"},{"messageId":"57941","fix":"62483","desc":"57943"},{"messageId":"57938","fix":"62484","desc":"57940"},{"messageId":"57941","fix":"62485","desc":"57943"},{"messageId":"57938","fix":"62486","desc":"57940"},{"messageId":"57941","fix":"62487","desc":"57943"},{"messageId":"57938","fix":"62488","desc":"57940"},{"messageId":"57941","fix":"62489","desc":"57943"},{"messageId":"57938","fix":"62490","desc":"57940"},{"messageId":"57941","fix":"62491","desc":"57943"},{"messageId":"57938","fix":"62492","desc":"57940"},{"messageId":"57941","fix":"62493","desc":"57943"},{"messageId":"57938","fix":"62494","desc":"57940"},{"messageId":"57941","fix":"62495","desc":"57943"},{"messageId":"57938","fix":"62496","desc":"57940"},{"messageId":"57941","fix":"62497","desc":"57943"},{"messageId":"57938","fix":"62498","desc":"57940"},{"messageId":"57941","fix":"62499","desc":"57943"},{"messageId":"57938","fix":"62500","desc":"57940"},{"messageId":"57941","fix":"62501","desc":"57943"},{"messageId":"57938","fix":"62502","desc":"57940"},{"messageId":"57941","fix":"62503","desc":"57943"},{"messageId":"57938","fix":"62504","desc":"57940"},{"messageId":"57941","fix":"62505","desc":"57943"},{"messageId":"57938","fix":"62506","desc":"57940"},{"messageId":"57941","fix":"62507","desc":"57943"},{"messageId":"57938","fix":"62508","desc":"57940"},{"messageId":"57941","fix":"62509","desc":"57943"},{"messageId":"57938","fix":"62510","desc":"57940"},{"messageId":"57941","fix":"62511","desc":"57943"},{"messageId":"57938","fix":"62512","desc":"57940"},{"messageId":"57941","fix":"62513","desc":"57943"},{"messageId":"57938","fix":"62514","desc":"57940"},{"messageId":"57941","fix":"62515","desc":"57943"},{"messageId":"57938","fix":"62516","desc":"57940"},{"messageId":"57941","fix":"62517","desc":"57943"},{"messageId":"57938","fix":"62518","desc":"57940"},{"messageId":"57941","fix":"62519","desc":"57943"},{"messageId":"57938","fix":"62520","desc":"57940"},{"messageId":"57941","fix":"62521","desc":"57943"},{"messageId":"57938","fix":"62522","desc":"57940"},{"messageId":"57941","fix":"62523","desc":"57943"},{"messageId":"57938","fix":"62524","desc":"57940"},{"messageId":"57941","fix":"62525","desc":"57943"},{"messageId":"57938","fix":"62526","desc":"57940"},{"messageId":"57941","fix":"62527","desc":"57943"},{"messageId":"57938","fix":"62528","desc":"57940"},{"messageId":"57941","fix":"62529","desc":"57943"},{"messageId":"57938","fix":"62530","desc":"57940"},{"messageId":"57941","fix":"62531","desc":"57943"},{"messageId":"57938","fix":"62532","desc":"57940"},{"messageId":"57941","fix":"62533","desc":"57943"},{"messageId":"57938","fix":"62534","desc":"57940"},{"messageId":"57941","fix":"62535","desc":"57943"},{"messageId":"57938","fix":"62536","desc":"57940"},{"messageId":"57941","fix":"62537","desc":"57943"},{"messageId":"57938","fix":"62538","desc":"57940"},{"messageId":"57941","fix":"62539","desc":"57943"},{"messageId":"57938","fix":"62540","desc":"57940"},{"messageId":"57941","fix":"62541","desc":"57943"},{"messageId":"57938","fix":"62542","desc":"57940"},{"messageId":"57941","fix":"62543","desc":"57943"},{"messageId":"57938","fix":"62544","desc":"57940"},{"messageId":"57941","fix":"62545","desc":"57943"},{"messageId":"57938","fix":"62546","desc":"57940"},{"messageId":"57941","fix":"62547","desc":"57943"},{"messageId":"57938","fix":"62548","desc":"57940"},{"messageId":"57941","fix":"62549","desc":"57943"},{"messageId":"57938","fix":"62550","desc":"57940"},{"messageId":"57941","fix":"62551","desc":"57943"},{"messageId":"57938","fix":"62552","desc":"57940"},{"messageId":"57941","fix":"62553","desc":"57943"},{"messageId":"57938","fix":"62554","desc":"57940"},{"messageId":"57941","fix":"62555","desc":"57943"},{"messageId":"57938","fix":"62556","desc":"57940"},{"messageId":"57941","fix":"62557","desc":"57943"},{"messageId":"57938","fix":"62558","desc":"57940"},{"messageId":"57941","fix":"62559","desc":"57943"},{"messageId":"57938","fix":"62560","desc":"57940"},{"messageId":"57941","fix":"62561","desc":"57943"},{"messageId":"57938","fix":"62562","desc":"57940"},{"messageId":"57941","fix":"62563","desc":"57943"},{"messageId":"57938","fix":"62564","desc":"57940"},{"messageId":"57941","fix":"62565","desc":"57943"},{"messageId":"57938","fix":"62566","desc":"57940"},{"messageId":"57941","fix":"62567","desc":"57943"},{"messageId":"57938","fix":"62568","desc":"57940"},{"messageId":"57941","fix":"62569","desc":"57943"},{"messageId":"57938","fix":"62570","desc":"57940"},{"messageId":"57941","fix":"62571","desc":"57943"},{"messageId":"57938","fix":"62572","desc":"57940"},{"messageId":"57941","fix":"62573","desc":"57943"},{"messageId":"57938","fix":"62574","desc":"57940"},{"messageId":"57941","fix":"62575","desc":"57943"},{"messageId":"57938","fix":"62576","desc":"57940"},{"messageId":"57941","fix":"62577","desc":"57943"},{"messageId":"57938","fix":"62578","desc":"57940"},{"messageId":"57941","fix":"62579","desc":"57943"},{"messageId":"57938","fix":"62580","desc":"57940"},{"messageId":"57941","fix":"62581","desc":"57943"},{"messageId":"57938","fix":"62582","desc":"57940"},{"messageId":"57941","fix":"62583","desc":"57943"},{"messageId":"57938","fix":"62584","desc":"57940"},{"messageId":"57941","fix":"62585","desc":"57943"},{"messageId":"57938","fix":"62586","desc":"57940"},{"messageId":"57941","fix":"62587","desc":"57943"},{"messageId":"57938","fix":"62588","desc":"57940"},{"messageId":"57941","fix":"62589","desc":"57943"},{"messageId":"57938","fix":"62590","desc":"57940"},{"messageId":"57941","fix":"62591","desc":"57943"},{"messageId":"57938","fix":"62592","desc":"57940"},{"messageId":"57941","fix":"62593","desc":"57943"},{"messageId":"57938","fix":"62594","desc":"57940"},{"messageId":"57941","fix":"62595","desc":"57943"},{"messageId":"57938","fix":"62596","desc":"57940"},{"messageId":"57941","fix":"62597","desc":"57943"},{"messageId":"57938","fix":"62598","desc":"57940"},{"messageId":"57941","fix":"62599","desc":"57943"},{"messageId":"57938","fix":"62600","desc":"57940"},{"messageId":"57941","fix":"62601","desc":"57943"},{"messageId":"57938","fix":"62602","desc":"57940"},{"messageId":"57941","fix":"62603","desc":"57943"},{"messageId":"57938","fix":"62604","desc":"57940"},{"messageId":"57941","fix":"62605","desc":"57943"},{"messageId":"57938","fix":"62606","desc":"57940"},{"messageId":"57941","fix":"62607","desc":"57943"},{"messageId":"57938","fix":"62608","desc":"57940"},{"messageId":"57941","fix":"62609","desc":"57943"},{"messageId":"57938","fix":"62610","desc":"57940"},{"messageId":"57941","fix":"62611","desc":"57943"},{"messageId":"57938","fix":"62612","desc":"57940"},{"messageId":"57941","fix":"62613","desc":"57943"},{"messageId":"57938","fix":"62614","desc":"57940"},{"messageId":"57941","fix":"62615","desc":"57943"},{"messageId":"57938","fix":"62616","desc":"57940"},{"messageId":"57941","fix":"62617","desc":"57943"},{"messageId":"57938","fix":"62618","desc":"57940"},{"messageId":"57941","fix":"62619","desc":"57943"},{"messageId":"57938","fix":"62620","desc":"57940"},{"messageId":"57941","fix":"62621","desc":"57943"},{"messageId":"57938","fix":"62622","desc":"57940"},{"messageId":"57941","fix":"62623","desc":"57943"},{"messageId":"57938","fix":"62624","desc":"57940"},{"messageId":"57941","fix":"62625","desc":"57943"},{"messageId":"57938","fix":"62626","desc":"57940"},{"messageId":"57941","fix":"62627","desc":"57943"},{"messageId":"57938","fix":"62628","desc":"57940"},{"messageId":"57941","fix":"62629","desc":"57943"},{"messageId":"57938","fix":"62630","desc":"57940"},{"messageId":"57941","fix":"62631","desc":"57943"},{"messageId":"57938","fix":"62632","desc":"57940"},{"messageId":"57941","fix":"62633","desc":"57943"},{"messageId":"57938","fix":"62634","desc":"57940"},{"messageId":"57941","fix":"62635","desc":"57943"},{"messageId":"57938","fix":"62636","desc":"57940"},{"messageId":"57941","fix":"62637","desc":"57943"},{"messageId":"57938","fix":"62638","desc":"57940"},{"messageId":"57941","fix":"62639","desc":"57943"},{"messageId":"57938","fix":"62640","desc":"57940"},{"messageId":"57941","fix":"62641","desc":"57943"},{"messageId":"57938","fix":"62642","desc":"57940"},{"messageId":"57941","fix":"62643","desc":"57943"},{"messageId":"57938","fix":"62644","desc":"57940"},{"messageId":"57941","fix":"62645","desc":"57943"},{"messageId":"57938","fix":"62646","desc":"57940"},{"messageId":"57941","fix":"62647","desc":"57943"},{"messageId":"57938","fix":"62648","desc":"57940"},{"messageId":"57941","fix":"62649","desc":"57943"},{"messageId":"57938","fix":"62650","desc":"57940"},{"messageId":"57941","fix":"62651","desc":"57943"},{"messageId":"57938","fix":"62652","desc":"57940"},{"messageId":"57941","fix":"62653","desc":"57943"},{"messageId":"57938","fix":"62654","desc":"57940"},{"messageId":"57941","fix":"62655","desc":"57943"},{"messageId":"57938","fix":"62656","desc":"57940"},{"messageId":"57941","fix":"62657","desc":"57943"},{"messageId":"57938","fix":"62658","desc":"57940"},{"messageId":"57941","fix":"62659","desc":"57943"},{"messageId":"57938","fix":"62660","desc":"57940"},{"messageId":"57941","fix":"62661","desc":"57943"},{"messageId":"57938","fix":"62662","desc":"57940"},{"messageId":"57941","fix":"62663","desc":"57943"},{"messageId":"57938","fix":"62664","desc":"57940"},{"messageId":"57941","fix":"62665","desc":"57943"},{"messageId":"57938","fix":"62666","desc":"57940"},{"messageId":"57941","fix":"62667","desc":"57943"},{"messageId":"57938","fix":"62668","desc":"57940"},{"messageId":"57941","fix":"62669","desc":"57943"},{"messageId":"57938","fix":"62670","desc":"57940"},{"messageId":"57941","fix":"62671","desc":"57943"},{"messageId":"57938","fix":"62672","desc":"57940"},{"messageId":"57941","fix":"62673","desc":"57943"},{"messageId":"57938","fix":"62674","desc":"57940"},{"messageId":"57941","fix":"62675","desc":"57943"},{"messageId":"57938","fix":"62676","desc":"57940"},{"messageId":"57941","fix":"62677","desc":"57943"},{"messageId":"57938","fix":"62678","desc":"57940"},{"messageId":"57941","fix":"62679","desc":"57943"},{"messageId":"57938","fix":"62680","desc":"57940"},{"messageId":"57941","fix":"62681","desc":"57943"},{"messageId":"57938","fix":"62682","desc":"57940"},{"messageId":"57941","fix":"62683","desc":"57943"},{"messageId":"57938","fix":"62684","desc":"57940"},{"messageId":"57941","fix":"62685","desc":"57943"},{"messageId":"57938","fix":"62686","desc":"57940"},{"messageId":"57941","fix":"62687","desc":"57943"},{"messageId":"57938","fix":"62688","desc":"57940"},{"messageId":"57941","fix":"62689","desc":"57943"},{"messageId":"57938","fix":"62690","desc":"57940"},{"messageId":"57941","fix":"62691","desc":"57943"},{"messageId":"57938","fix":"62692","desc":"57940"},{"messageId":"57941","fix":"62693","desc":"57943"},{"messageId":"57938","fix":"62694","desc":"57940"},{"messageId":"57941","fix":"62695","desc":"57943"},{"messageId":"57938","fix":"62696","desc":"57940"},{"messageId":"57941","fix":"62697","desc":"57943"},{"messageId":"57938","fix":"62698","desc":"57940"},{"messageId":"57941","fix":"62699","desc":"57943"},{"messageId":"57938","fix":"62700","desc":"57940"},{"messageId":"57941","fix":"62701","desc":"57943"},{"messageId":"57938","fix":"62702","desc":"57940"},{"messageId":"57941","fix":"62703","desc":"57943"},{"messageId":"57938","fix":"62704","desc":"57940"},{"messageId":"57941","fix":"62705","desc":"57943"},{"messageId":"57938","fix":"62706","desc":"57940"},{"messageId":"57941","fix":"62707","desc":"57943"},{"messageId":"57938","fix":"62708","desc":"57940"},{"messageId":"57941","fix":"62709","desc":"57943"},{"messageId":"57938","fix":"62710","desc":"57940"},{"messageId":"57941","fix":"62711","desc":"57943"},{"messageId":"57938","fix":"62712","desc":"57940"},{"messageId":"57941","fix":"62713","desc":"57943"},{"messageId":"57938","fix":"62714","desc":"57940"},{"messageId":"57941","fix":"62715","desc":"57943"},{"messageId":"57938","fix":"62716","desc":"57940"},{"messageId":"57941","fix":"62717","desc":"57943"},{"messageId":"57938","fix":"62718","desc":"57940"},{"messageId":"57941","fix":"62719","desc":"57943"},{"messageId":"57938","fix":"62720","desc":"57940"},{"messageId":"57941","fix":"62721","desc":"57943"},{"messageId":"57938","fix":"62722","desc":"57940"},{"messageId":"57941","fix":"62723","desc":"57943"},{"messageId":"57938","fix":"62724","desc":"57940"},{"messageId":"57941","fix":"62725","desc":"57943"},{"messageId":"57938","fix":"62726","desc":"57940"},{"messageId":"57941","fix":"62727","desc":"57943"},{"messageId":"57938","fix":"62728","desc":"57940"},{"messageId":"57941","fix":"62729","desc":"57943"},{"messageId":"57938","fix":"62730","desc":"57940"},{"messageId":"57941","fix":"62731","desc":"57943"},{"messageId":"57938","fix":"62732","desc":"57940"},{"messageId":"57941","fix":"62733","desc":"57943"},{"messageId":"57938","fix":"62734","desc":"57940"},{"messageId":"57941","fix":"62735","desc":"57943"},{"messageId":"57938","fix":"62736","desc":"57940"},{"messageId":"57941","fix":"62737","desc":"57943"},{"messageId":"57938","fix":"62738","desc":"57940"},{"messageId":"57941","fix":"62739","desc":"57943"},{"messageId":"57938","fix":"62740","desc":"57940"},{"messageId":"57941","fix":"62741","desc":"57943"},{"messageId":"57938","fix":"62742","desc":"57940"},{"messageId":"57941","fix":"62743","desc":"57943"},{"messageId":"57938","fix":"62744","desc":"57940"},{"messageId":"57941","fix":"62745","desc":"57943"},{"messageId":"57938","fix":"62746","desc":"57940"},{"messageId":"57941","fix":"62747","desc":"57943"},{"messageId":"57938","fix":"62748","desc":"57940"},{"messageId":"57941","fix":"62749","desc":"57943"},{"messageId":"57938","fix":"62750","desc":"57940"},{"messageId":"57941","fix":"62751","desc":"57943"},{"messageId":"57938","fix":"62752","desc":"57940"},{"messageId":"57941","fix":"62753","desc":"57943"},{"messageId":"57938","fix":"62754","desc":"57940"},{"messageId":"57941","fix":"62755","desc":"57943"},{"messageId":"57938","fix":"62756","desc":"57940"},{"messageId":"57941","fix":"62757","desc":"57943"},{"messageId":"57938","fix":"62758","desc":"57940"},{"messageId":"57941","fix":"62759","desc":"57943"},{"messageId":"57938","fix":"62760","desc":"57940"},{"messageId":"57941","fix":"62761","desc":"57943"},{"messageId":"57938","fix":"62762","desc":"57940"},{"messageId":"57941","fix":"62763","desc":"57943"},{"messageId":"57938","fix":"62764","desc":"57940"},{"messageId":"57941","fix":"62765","desc":"57943"},{"messageId":"57938","fix":"62766","desc":"57940"},{"messageId":"57941","fix":"62767","desc":"57943"},{"messageId":"57938","fix":"62768","desc":"57940"},{"messageId":"57941","fix":"62769","desc":"57943"},{"messageId":"57938","fix":"62770","desc":"57940"},{"messageId":"57941","fix":"62771","desc":"57943"},{"messageId":"57938","fix":"62772","desc":"57940"},{"messageId":"57941","fix":"62773","desc":"57943"},{"messageId":"57938","fix":"62774","desc":"57940"},{"messageId":"57941","fix":"62775","desc":"57943"},{"messageId":"57938","fix":"62776","desc":"57940"},{"messageId":"57941","fix":"62777","desc":"57943"},{"messageId":"57938","fix":"62778","desc":"57940"},{"messageId":"57941","fix":"62779","desc":"57943"},{"messageId":"57938","fix":"62780","desc":"57940"},{"messageId":"57941","fix":"62781","desc":"57943"},{"messageId":"57938","fix":"62782","desc":"57940"},{"messageId":"57941","fix":"62783","desc":"57943"},{"messageId":"57938","fix":"62784","desc":"57940"},{"messageId":"57941","fix":"62785","desc":"57943"},{"messageId":"57938","fix":"62786","desc":"57940"},{"messageId":"57941","fix":"62787","desc":"57943"},{"messageId":"57938","fix":"62788","desc":"57940"},{"messageId":"57941","fix":"62789","desc":"57943"},{"messageId":"57938","fix":"62790","desc":"57940"},{"messageId":"57941","fix":"62791","desc":"57943"},{"messageId":"57938","fix":"62792","desc":"57940"},{"messageId":"57941","fix":"62793","desc":"57943"},{"messageId":"57938","fix":"62794","desc":"57940"},{"messageId":"57941","fix":"62795","desc":"57943"},{"messageId":"57938","fix":"62796","desc":"57940"},{"messageId":"57941","fix":"62797","desc":"57943"},{"messageId":"57938","fix":"62798","desc":"57940"},{"messageId":"57941","fix":"62799","desc":"57943"},{"messageId":"57938","fix":"62800","desc":"57940"},{"messageId":"57941","fix":"62801","desc":"57943"},{"messageId":"57938","fix":"62802","desc":"57940"},{"messageId":"57941","fix":"62803","desc":"57943"},{"messageId":"57938","fix":"62804","desc":"57940"},{"messageId":"57941","fix":"62805","desc":"57943"},{"messageId":"57938","fix":"62806","desc":"57940"},{"messageId":"57941","fix":"62807","desc":"57943"},{"messageId":"57938","fix":"62808","desc":"57940"},{"messageId":"57941","fix":"62809","desc":"57943"},{"messageId":"57938","fix":"62810","desc":"57940"},{"messageId":"57941","fix":"62811","desc":"57943"},{"messageId":"57938","fix":"62812","desc":"57940"},{"messageId":"57941","fix":"62813","desc":"57943"},{"messageId":"57938","fix":"62814","desc":"57940"},{"messageId":"57941","fix":"62815","desc":"57943"},{"messageId":"57938","fix":"62816","desc":"57940"},{"messageId":"57941","fix":"62817","desc":"57943"},{"messageId":"57938","fix":"62818","desc":"57940"},{"messageId":"57941","fix":"62819","desc":"57943"},{"messageId":"57938","fix":"62820","desc":"57940"},{"messageId":"57941","fix":"62821","desc":"57943"},{"messageId":"57938","fix":"62822","desc":"57940"},{"messageId":"57941","fix":"62823","desc":"57943"},{"messageId":"57938","fix":"62824","desc":"57940"},{"messageId":"57941","fix":"62825","desc":"57943"},{"messageId":"57938","fix":"62826","desc":"57940"},{"messageId":"57941","fix":"62827","desc":"57943"},{"messageId":"57938","fix":"62828","desc":"57940"},{"messageId":"57941","fix":"62829","desc":"57943"},{"messageId":"57938","fix":"62830","desc":"57940"},{"messageId":"57941","fix":"62831","desc":"57943"},{"messageId":"57938","fix":"62832","desc":"57940"},{"messageId":"57941","fix":"62833","desc":"57943"},{"messageId":"57938","fix":"62834","desc":"57940"},{"messageId":"57941","fix":"62835","desc":"57943"},{"messageId":"57938","fix":"62836","desc":"57940"},{"messageId":"57941","fix":"62837","desc":"57943"},{"messageId":"57938","fix":"62838","desc":"57940"},{"messageId":"57941","fix":"62839","desc":"57943"},{"messageId":"57938","fix":"62840","desc":"57940"},{"messageId":"57941","fix":"62841","desc":"57943"},{"messageId":"57938","fix":"62842","desc":"57940"},{"messageId":"57941","fix":"62843","desc":"57943"},{"messageId":"57938","fix":"62844","desc":"57940"},{"messageId":"57941","fix":"62845","desc":"57943"},{"messageId":"57938","fix":"62846","desc":"57940"},{"messageId":"57941","fix":"62847","desc":"57943"},{"messageId":"57938","fix":"62848","desc":"57940"},{"messageId":"57941","fix":"62849","desc":"57943"},{"messageId":"57938","fix":"62850","desc":"57940"},{"messageId":"57941","fix":"62851","desc":"57943"},{"messageId":"57938","fix":"62852","desc":"57940"},{"messageId":"57941","fix":"62853","desc":"57943"},{"messageId":"57938","fix":"62854","desc":"57940"},{"messageId":"57941","fix":"62855","desc":"57943"},{"messageId":"57938","fix":"62856","desc":"57940"},{"messageId":"57941","fix":"62857","desc":"57943"},{"messageId":"57938","fix":"62858","desc":"57940"},{"messageId":"57941","fix":"62859","desc":"57943"},{"messageId":"57938","fix":"62860","desc":"57940"},{"messageId":"57941","fix":"62861","desc":"57943"},{"messageId":"57938","fix":"62862","desc":"57940"},{"messageId":"57941","fix":"62863","desc":"57943"},{"messageId":"57938","fix":"62864","desc":"57940"},{"messageId":"57941","fix":"62865","desc":"57943"},{"messageId":"57938","fix":"62866","desc":"57940"},{"messageId":"57941","fix":"62867","desc":"57943"},{"messageId":"57938","fix":"62868","desc":"57940"},{"messageId":"57941","fix":"62869","desc":"57943"},{"messageId":"57938","fix":"62870","desc":"57940"},{"messageId":"57941","fix":"62871","desc":"57943"},{"messageId":"57938","fix":"62872","desc":"57940"},{"messageId":"57941","fix":"62873","desc":"57943"},{"messageId":"57938","fix":"62874","desc":"57940"},{"messageId":"57941","fix":"62875","desc":"57943"},{"messageId":"57938","fix":"62876","desc":"57940"},{"messageId":"57941","fix":"62877","desc":"57943"},{"messageId":"57938","fix":"62878","desc":"57940"},{"messageId":"57941","fix":"62879","desc":"57943"},{"messageId":"57938","fix":"62880","desc":"57940"},{"messageId":"57941","fix":"62881","desc":"57943"},{"messageId":"57938","fix":"62882","desc":"57940"},{"messageId":"57941","fix":"62883","desc":"57943"},{"messageId":"57938","fix":"62884","desc":"57940"},{"messageId":"57941","fix":"62885","desc":"57943"},{"messageId":"57938","fix":"62886","desc":"57940"},{"messageId":"57941","fix":"62887","desc":"57943"},{"messageId":"57938","fix":"62888","desc":"57940"},{"messageId":"57941","fix":"62889","desc":"57943"},{"messageId":"57938","fix":"62890","desc":"57940"},{"messageId":"57941","fix":"62891","desc":"57943"},{"messageId":"57938","fix":"62892","desc":"57940"},{"messageId":"57941","fix":"62893","desc":"57943"},{"messageId":"57938","fix":"62894","desc":"57940"},{"messageId":"57941","fix":"62895","desc":"57943"},{"messageId":"57938","fix":"62896","desc":"57940"},{"messageId":"57941","fix":"62897","desc":"57943"},{"messageId":"57938","fix":"62898","desc":"57940"},{"messageId":"57941","fix":"62899","desc":"57943"},{"messageId":"57938","fix":"62900","desc":"57940"},{"messageId":"57941","fix":"62901","desc":"57943"},{"messageId":"57938","fix":"62902","desc":"57940"},{"messageId":"57941","fix":"62903","desc":"57943"},{"messageId":"57938","fix":"62904","desc":"57940"},{"messageId":"57941","fix":"62905","desc":"57943"},{"messageId":"57938","fix":"62906","desc":"57940"},{"messageId":"57941","fix":"62907","desc":"57943"},{"messageId":"57938","fix":"62908","desc":"57940"},{"messageId":"57941","fix":"62909","desc":"57943"},{"messageId":"57938","fix":"62910","desc":"57940"},{"messageId":"57941","fix":"62911","desc":"57943"},{"messageId":"57938","fix":"62912","desc":"57940"},{"messageId":"57941","fix":"62913","desc":"57943"},{"messageId":"57938","fix":"62914","desc":"57940"},{"messageId":"57941","fix":"62915","desc":"57943"},{"messageId":"57938","fix":"62916","desc":"57940"},{"messageId":"57941","fix":"62917","desc":"57943"},{"messageId":"57938","fix":"62918","desc":"57940"},{"messageId":"57941","fix":"62919","desc":"57943"},{"messageId":"57938","fix":"62920","desc":"57940"},{"messageId":"57941","fix":"62921","desc":"57943"},{"messageId":"57938","fix":"62922","desc":"57940"},{"messageId":"57941","fix":"62923","desc":"57943"},{"messageId":"57938","fix":"62924","desc":"57940"},{"messageId":"57941","fix":"62925","desc":"57943"},{"messageId":"57938","fix":"62926","desc":"57940"},{"messageId":"57941","fix":"62927","desc":"57943"},{"messageId":"57938","fix":"62928","desc":"57940"},{"messageId":"57941","fix":"62929","desc":"57943"},{"messageId":"57938","fix":"62930","desc":"57940"},{"messageId":"57941","fix":"62931","desc":"57943"},{"messageId":"57938","fix":"62932","desc":"57940"},{"messageId":"57941","fix":"62933","desc":"57943"},{"messageId":"57938","fix":"62934","desc":"57940"},{"messageId":"57941","fix":"62935","desc":"57943"},{"messageId":"57938","fix":"62936","desc":"57940"},{"messageId":"57941","fix":"62937","desc":"57943"},{"messageId":"57938","fix":"62938","desc":"57940"},{"messageId":"57941","fix":"62939","desc":"57943"},{"messageId":"57938","fix":"62940","desc":"57940"},{"messageId":"57941","fix":"62941","desc":"57943"},{"messageId":"57938","fix":"62942","desc":"57940"},{"messageId":"57941","fix":"62943","desc":"57943"},{"messageId":"57938","fix":"62944","desc":"57940"},{"messageId":"57941","fix":"62945","desc":"57943"},{"messageId":"57938","fix":"62946","desc":"57940"},{"messageId":"57941","fix":"62947","desc":"57943"},{"messageId":"57938","fix":"62948","desc":"57940"},{"messageId":"57941","fix":"62949","desc":"57943"},{"messageId":"57938","fix":"62950","desc":"57940"},{"messageId":"57941","fix":"62951","desc":"57943"},{"messageId":"57938","fix":"62952","desc":"57940"},{"messageId":"57941","fix":"62953","desc":"57943"},{"messageId":"57938","fix":"62954","desc":"57940"},{"messageId":"57941","fix":"62955","desc":"57943"},{"messageId":"57938","fix":"62956","desc":"57940"},{"messageId":"57941","fix":"62957","desc":"57943"},{"messageId":"57938","fix":"62958","desc":"57940"},{"messageId":"57941","fix":"62959","desc":"57943"},{"messageId":"57938","fix":"62960","desc":"57940"},{"messageId":"57941","fix":"62961","desc":"57943"},{"messageId":"57938","fix":"62962","desc":"57940"},{"messageId":"57941","fix":"62963","desc":"57943"},{"messageId":"57938","fix":"62964","desc":"57940"},{"messageId":"57941","fix":"62965","desc":"57943"},{"messageId":"57938","fix":"62966","desc":"57940"},{"messageId":"57941","fix":"62967","desc":"57943"},{"messageId":"57938","fix":"62968","desc":"57940"},{"messageId":"57941","fix":"62969","desc":"57943"},{"messageId":"57938","fix":"62970","desc":"57940"},{"messageId":"57941","fix":"62971","desc":"57943"},{"messageId":"57938","fix":"62972","desc":"57940"},{"messageId":"57941","fix":"62973","desc":"57943"},{"messageId":"57938","fix":"62974","desc":"57940"},{"messageId":"57941","fix":"62975","desc":"57943"},{"messageId":"57938","fix":"62976","desc":"57940"},{"messageId":"57941","fix":"62977","desc":"57943"},{"messageId":"57938","fix":"62978","desc":"57940"},{"messageId":"57941","fix":"62979","desc":"57943"},{"messageId":"57938","fix":"62980","desc":"57940"},{"messageId":"57941","fix":"62981","desc":"57943"},{"messageId":"57938","fix":"62982","desc":"57940"},{"messageId":"57941","fix":"62983","desc":"57943"},{"messageId":"57938","fix":"62984","desc":"57940"},{"messageId":"57941","fix":"62985","desc":"57943"},{"messageId":"57938","fix":"62986","desc":"57940"},{"messageId":"57941","fix":"62987","desc":"57943"},{"messageId":"57938","fix":"62988","desc":"57940"},{"messageId":"57941","fix":"62989","desc":"57943"},{"messageId":"57938","fix":"62990","desc":"57940"},{"messageId":"57941","fix":"62991","desc":"57943"},{"messageId":"57938","fix":"62992","desc":"57940"},{"messageId":"57941","fix":"62993","desc":"57943"},{"messageId":"57938","fix":"62994","desc":"57940"},{"messageId":"57941","fix":"62995","desc":"57943"},{"messageId":"57938","fix":"62996","desc":"57940"},{"messageId":"57941","fix":"62997","desc":"57943"},{"messageId":"57938","fix":"62998","desc":"57940"},{"messageId":"57941","fix":"62999","desc":"57943"},{"messageId":"57938","fix":"63000","desc":"57940"},{"messageId":"57941","fix":"63001","desc":"57943"},{"messageId":"57938","fix":"63002","desc":"57940"},{"messageId":"57941","fix":"63003","desc":"57943"},{"messageId":"57938","fix":"63004","desc":"57940"},{"messageId":"57941","fix":"63005","desc":"57943"},{"messageId":"57938","fix":"63006","desc":"57940"},{"messageId":"57941","fix":"63007","desc":"57943"},{"messageId":"57938","fix":"63008","desc":"57940"},{"messageId":"57941","fix":"63009","desc":"57943"},{"messageId":"57938","fix":"63010","desc":"57940"},{"messageId":"57941","fix":"63011","desc":"57943"},{"messageId":"57938","fix":"63012","desc":"57940"},{"messageId":"57941","fix":"63013","desc":"57943"},{"messageId":"57938","fix":"63014","desc":"57940"},{"messageId":"57941","fix":"63015","desc":"57943"},{"messageId":"57938","fix":"63016","desc":"57940"},{"messageId":"57941","fix":"63017","desc":"57943"},{"messageId":"57938","fix":"63018","desc":"57940"},{"messageId":"57941","fix":"63019","desc":"57943"},{"messageId":"57938","fix":"63020","desc":"57940"},{"messageId":"57941","fix":"63021","desc":"57943"},{"messageId":"57938","fix":"63022","desc":"57940"},{"messageId":"57941","fix":"63023","desc":"57943"},{"messageId":"57938","fix":"63024","desc":"57940"},{"messageId":"57941","fix":"63025","desc":"57943"},{"messageId":"57938","fix":"63026","desc":"57940"},{"messageId":"57941","fix":"63027","desc":"57943"},{"messageId":"57938","fix":"63028","desc":"57940"},{"messageId":"57941","fix":"63029","desc":"57943"},{"messageId":"57938","fix":"63030","desc":"57940"},{"messageId":"57941","fix":"63031","desc":"57943"},{"messageId":"57938","fix":"63032","desc":"57940"},{"messageId":"57941","fix":"63033","desc":"57943"},{"messageId":"57938","fix":"63034","desc":"57940"},{"messageId":"57941","fix":"63035","desc":"57943"},{"messageId":"57938","fix":"63036","desc":"57940"},{"messageId":"57941","fix":"63037","desc":"57943"},{"messageId":"57938","fix":"63038","desc":"57940"},{"messageId":"57941","fix":"63039","desc":"57943"},{"messageId":"57938","fix":"63040","desc":"57940"},{"messageId":"57941","fix":"63041","desc":"57943"},{"messageId":"57938","fix":"63042","desc":"57940"},{"messageId":"57941","fix":"63043","desc":"57943"},{"messageId":"57938","fix":"63044","desc":"57940"},{"messageId":"57941","fix":"63045","desc":"57943"},{"messageId":"57938","fix":"63046","desc":"57940"},{"messageId":"57941","fix":"63047","desc":"57943"},{"messageId":"57938","fix":"63048","desc":"57940"},{"messageId":"57941","fix":"63049","desc":"57943"},{"messageId":"57938","fix":"63050","desc":"57940"},{"messageId":"57941","fix":"63051","desc":"57943"},{"messageId":"57938","fix":"63052","desc":"57940"},{"messageId":"57941","fix":"63053","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"63054","desc":"57940"},{"messageId":"57941","fix":"63055","desc":"57943"},{"messageId":"57938","fix":"63056","desc":"57940"},{"messageId":"57941","fix":"63057","desc":"57943"},{"messageId":"57938","fix":"63058","desc":"57940"},{"messageId":"57941","fix":"63059","desc":"57943"},{"messageId":"57938","fix":"63060","desc":"57940"},{"messageId":"57941","fix":"63061","desc":"57943"},{"messageId":"57938","fix":"63062","desc":"57940"},{"messageId":"57941","fix":"63063","desc":"57943"},{"messageId":"57938","fix":"63064","desc":"57940"},{"messageId":"57941","fix":"63065","desc":"57943"},{"messageId":"57938","fix":"63066","desc":"57940"},{"messageId":"57941","fix":"63067","desc":"57943"},{"messageId":"57938","fix":"63068","desc":"57940"},{"messageId":"57941","fix":"63069","desc":"57943"},{"messageId":"57938","fix":"63070","desc":"57940"},{"messageId":"57941","fix":"63071","desc":"57943"},{"messageId":"57938","fix":"63072","desc":"57940"},{"messageId":"57941","fix":"63073","desc":"57943"},{"messageId":"57938","fix":"63074","desc":"57940"},{"messageId":"57941","fix":"63075","desc":"57943"},{"messageId":"57938","fix":"63076","desc":"57940"},{"messageId":"57941","fix":"63077","desc":"57943"},{"messageId":"57938","fix":"63078","desc":"57940"},{"messageId":"57941","fix":"63079","desc":"57943"},{"messageId":"57938","fix":"63080","desc":"57940"},{"messageId":"57941","fix":"63081","desc":"57943"},{"messageId":"57938","fix":"63082","desc":"57940"},{"messageId":"57941","fix":"63083","desc":"57943"},{"messageId":"57938","fix":"63084","desc":"57940"},{"messageId":"57941","fix":"63085","desc":"57943"},{"messageId":"57938","fix":"63086","desc":"57940"},{"messageId":"57941","fix":"63087","desc":"57943"},{"messageId":"57938","fix":"63088","desc":"57940"},{"messageId":"57941","fix":"63089","desc":"57943"},{"messageId":"57938","fix":"63090","desc":"57940"},{"messageId":"57941","fix":"63091","desc":"57943"},{"messageId":"57938","fix":"63092","desc":"57940"},{"messageId":"57941","fix":"63093","desc":"57943"},{"messageId":"57938","fix":"63094","desc":"57940"},{"messageId":"57941","fix":"63095","desc":"57943"},{"messageId":"57938","fix":"63096","desc":"57940"},{"messageId":"57941","fix":"63097","desc":"57943"},{"messageId":"57938","fix":"63098","desc":"57940"},{"messageId":"57941","fix":"63099","desc":"57943"},{"messageId":"57938","fix":"63100","desc":"57940"},{"messageId":"57941","fix":"63101","desc":"57943"},{"messageId":"57938","fix":"63102","desc":"57940"},{"messageId":"57941","fix":"63103","desc":"57943"},{"messageId":"57938","fix":"63104","desc":"57940"},{"messageId":"57941","fix":"63105","desc":"57943"},{"messageId":"57938","fix":"63106","desc":"57940"},{"messageId":"57941","fix":"63107","desc":"57943"},{"messageId":"57938","fix":"63108","desc":"57940"},{"messageId":"57941","fix":"63109","desc":"57943"},{"messageId":"57938","fix":"63110","desc":"57940"},{"messageId":"57941","fix":"63111","desc":"57943"},{"messageId":"57938","fix":"63112","desc":"57940"},{"messageId":"57941","fix":"63113","desc":"57943"},{"messageId":"57938","fix":"63114","desc":"57940"},{"messageId":"57941","fix":"63115","desc":"57943"},{"messageId":"57938","fix":"63116","desc":"57940"},{"messageId":"57941","fix":"63117","desc":"57943"},{"messageId":"57938","fix":"63118","desc":"57940"},{"messageId":"57941","fix":"63119","desc":"57943"},{"messageId":"57938","fix":"63120","desc":"57940"},{"messageId":"57941","fix":"63121","desc":"57943"},{"messageId":"57938","fix":"63122","desc":"57940"},{"messageId":"57941","fix":"63123","desc":"57943"},{"messageId":"57938","fix":"63124","desc":"57940"},{"messageId":"57941","fix":"63125","desc":"57943"},{"messageId":"57938","fix":"63126","desc":"57940"},{"messageId":"57941","fix":"63127","desc":"57943"},{"messageId":"57938","fix":"63128","desc":"57940"},{"messageId":"57941","fix":"63129","desc":"57943"},{"messageId":"57938","fix":"63130","desc":"57940"},{"messageId":"57941","fix":"63131","desc":"57943"},{"messageId":"57938","fix":"63132","desc":"57940"},{"messageId":"57941","fix":"63133","desc":"57943"},{"messageId":"57938","fix":"63134","desc":"57940"},{"messageId":"57941","fix":"63135","desc":"57943"},{"messageId":"57938","fix":"63136","desc":"57940"},{"messageId":"57941","fix":"63137","desc":"57943"},{"messageId":"57938","fix":"63138","desc":"57940"},{"messageId":"57941","fix":"63139","desc":"57943"},{"messageId":"57938","fix":"63140","desc":"57940"},{"messageId":"57941","fix":"63141","desc":"57943"},{"messageId":"57938","fix":"63142","desc":"57940"},{"messageId":"57941","fix":"63143","desc":"57943"},{"messageId":"57938","fix":"63144","desc":"57940"},{"messageId":"57941","fix":"63145","desc":"57943"},{"messageId":"57938","fix":"63146","desc":"57940"},{"messageId":"57941","fix":"63147","desc":"57943"},{"messageId":"57938","fix":"63148","desc":"57940"},{"messageId":"57941","fix":"63149","desc":"57943"},{"messageId":"57938","fix":"63150","desc":"57940"},{"messageId":"57941","fix":"63151","desc":"57943"},{"messageId":"57938","fix":"63152","desc":"57940"},{"messageId":"57941","fix":"63153","desc":"57943"},{"messageId":"57938","fix":"63154","desc":"57940"},{"messageId":"57941","fix":"63155","desc":"57943"},{"messageId":"57938","fix":"63156","desc":"57940"},{"messageId":"57941","fix":"63157","desc":"57943"},{"messageId":"57938","fix":"63158","desc":"57940"},{"messageId":"57941","fix":"63159","desc":"57943"},{"messageId":"57938","fix":"63160","desc":"57940"},{"messageId":"57941","fix":"63161","desc":"57943"},{"messageId":"57938","fix":"63162","desc":"57940"},{"messageId":"57941","fix":"63163","desc":"57943"},{"messageId":"57938","fix":"63164","desc":"57940"},{"messageId":"57941","fix":"63165","desc":"57943"},{"messageId":"57938","fix":"63166","desc":"57940"},{"messageId":"57941","fix":"63167","desc":"57943"},{"messageId":"57938","fix":"63168","desc":"57940"},{"messageId":"57941","fix":"63169","desc":"57943"},{"messageId":"57938","fix":"63170","desc":"57940"},{"messageId":"57941","fix":"63171","desc":"57943"},{"messageId":"57938","fix":"63172","desc":"57940"},{"messageId":"57941","fix":"63173","desc":"57943"},{"messageId":"57938","fix":"63174","desc":"57940"},{"messageId":"57941","fix":"63175","desc":"57943"},{"messageId":"57938","fix":"63176","desc":"57940"},{"messageId":"57941","fix":"63177","desc":"57943"},{"messageId":"57938","fix":"63178","desc":"57940"},{"messageId":"57941","fix":"63179","desc":"57943"},{"messageId":"57938","fix":"63180","desc":"57940"},{"messageId":"57941","fix":"63181","desc":"57943"},{"messageId":"57938","fix":"63182","desc":"57940"},{"messageId":"57941","fix":"63183","desc":"57943"},{"messageId":"57938","fix":"63184","desc":"57940"},{"messageId":"57941","fix":"63185","desc":"57943"},{"messageId":"57938","fix":"63186","desc":"57940"},{"messageId":"57941","fix":"63187","desc":"57943"},{"messageId":"57938","fix":"63188","desc":"57940"},{"messageId":"57941","fix":"63189","desc":"57943"},{"messageId":"57938","fix":"63190","desc":"57940"},{"messageId":"57941","fix":"63191","desc":"57943"},{"messageId":"57938","fix":"63192","desc":"57940"},{"messageId":"57941","fix":"63193","desc":"57943"},{"messageId":"57938","fix":"63194","desc":"57940"},{"messageId":"57941","fix":"63195","desc":"57943"},{"messageId":"57938","fix":"63196","desc":"57940"},{"messageId":"57941","fix":"63197","desc":"57943"},{"messageId":"57938","fix":"63198","desc":"57940"},{"messageId":"57941","fix":"63199","desc":"57943"},{"messageId":"57938","fix":"63200","desc":"57940"},{"messageId":"57941","fix":"63201","desc":"57943"},{"messageId":"57938","fix":"63202","desc":"57940"},{"messageId":"57941","fix":"63203","desc":"57943"},{"messageId":"57938","fix":"63204","desc":"57940"},{"messageId":"57941","fix":"63205","desc":"57943"},{"messageId":"57938","fix":"63206","desc":"57940"},{"messageId":"57941","fix":"63207","desc":"57943"},{"messageId":"57938","fix":"63208","desc":"57940"},{"messageId":"57941","fix":"63209","desc":"57943"},{"messageId":"57938","fix":"63210","desc":"57940"},{"messageId":"57941","fix":"63211","desc":"57943"},{"messageId":"57938","fix":"63212","desc":"57940"},{"messageId":"57941","fix":"63213","desc":"57943"},{"messageId":"57938","fix":"63214","desc":"57940"},{"messageId":"57941","fix":"63215","desc":"57943"},{"messageId":"57938","fix":"63216","desc":"57940"},{"messageId":"57941","fix":"63217","desc":"57943"},{"messageId":"57938","fix":"63218","desc":"57940"},{"messageId":"57941","fix":"63219","desc":"57943"},{"messageId":"57938","fix":"63220","desc":"57940"},{"messageId":"57941","fix":"63221","desc":"57943"},{"messageId":"57938","fix":"63222","desc":"57940"},{"messageId":"57941","fix":"63223","desc":"57943"},{"messageId":"57938","fix":"63224","desc":"57940"},{"messageId":"57941","fix":"63225","desc":"57943"},{"messageId":"57938","fix":"63226","desc":"57940"},{"messageId":"57941","fix":"63227","desc":"57943"},{"messageId":"57938","fix":"63228","desc":"57940"},{"messageId":"57941","fix":"63229","desc":"57943"},{"messageId":"57938","fix":"63230","desc":"57940"},{"messageId":"57941","fix":"63231","desc":"57943"},{"messageId":"57938","fix":"63232","desc":"57940"},{"messageId":"57941","fix":"63233","desc":"57943"},{"messageId":"57938","fix":"63234","desc":"57940"},{"messageId":"57941","fix":"63235","desc":"57943"},{"messageId":"57938","fix":"63236","desc":"57940"},{"messageId":"57941","fix":"63237","desc":"57943"},{"messageId":"57938","fix":"63238","desc":"57940"},{"messageId":"57941","fix":"63239","desc":"57943"},{"messageId":"57938","fix":"63240","desc":"57940"},{"messageId":"57941","fix":"63241","desc":"57943"},{"messageId":"57938","fix":"63242","desc":"57940"},{"messageId":"57941","fix":"63243","desc":"57943"},{"messageId":"57938","fix":"63244","desc":"57940"},{"messageId":"57941","fix":"63245","desc":"57943"},{"messageId":"57938","fix":"63246","desc":"57940"},{"messageId":"57941","fix":"63247","desc":"57943"},{"messageId":"57938","fix":"63248","desc":"57940"},{"messageId":"57941","fix":"63249","desc":"57943"},{"messageId":"57938","fix":"63250","desc":"57940"},{"messageId":"57941","fix":"63251","desc":"57943"},{"messageId":"57938","fix":"63252","desc":"57940"},{"messageId":"57941","fix":"63253","desc":"57943"},{"messageId":"57938","fix":"63254","desc":"57940"},{"messageId":"57941","fix":"63255","desc":"57943"},{"messageId":"57938","fix":"63256","desc":"57940"},{"messageId":"57941","fix":"63257","desc":"57943"},{"messageId":"57938","fix":"63258","desc":"57940"},{"messageId":"57941","fix":"63259","desc":"57943"},{"messageId":"57938","fix":"63260","desc":"57940"},{"messageId":"57941","fix":"63261","desc":"57943"},{"messageId":"57938","fix":"63262","desc":"57940"},{"messageId":"57941","fix":"63263","desc":"57943"},{"messageId":"57938","fix":"63264","desc":"57940"},{"messageId":"57941","fix":"63265","desc":"57943"},{"messageId":"57938","fix":"63266","desc":"57940"},{"messageId":"57941","fix":"63267","desc":"57943"},{"messageId":"57938","fix":"63268","desc":"57940"},{"messageId":"57941","fix":"63269","desc":"57943"},{"messageId":"57938","fix":"63270","desc":"57940"},{"messageId":"57941","fix":"63271","desc":"57943"},{"messageId":"57938","fix":"63272","desc":"57940"},{"messageId":"57941","fix":"63273","desc":"57943"},{"messageId":"57938","fix":"63274","desc":"57940"},{"messageId":"57941","fix":"63275","desc":"57943"},{"messageId":"57938","fix":"63276","desc":"57940"},{"messageId":"57941","fix":"63277","desc":"57943"},{"messageId":"57938","fix":"63278","desc":"57940"},{"messageId":"57941","fix":"63279","desc":"57943"},{"messageId":"57938","fix":"63280","desc":"57940"},{"messageId":"57941","fix":"63281","desc":"57943"},{"messageId":"57938","fix":"63282","desc":"57940"},{"messageId":"57941","fix":"63283","desc":"57943"},{"messageId":"57938","fix":"63284","desc":"57940"},{"messageId":"57941","fix":"63285","desc":"57943"},{"messageId":"57938","fix":"63286","desc":"57940"},{"messageId":"57941","fix":"63287","desc":"57943"},{"messageId":"57938","fix":"63288","desc":"57940"},{"messageId":"57941","fix":"63289","desc":"57943"},{"messageId":"57938","fix":"63290","desc":"57940"},{"messageId":"57941","fix":"63291","desc":"57943"},{"messageId":"57938","fix":"63292","desc":"57940"},{"messageId":"57941","fix":"63293","desc":"57943"},{"messageId":"57938","fix":"63294","desc":"57940"},{"messageId":"57941","fix":"63295","desc":"57943"},{"messageId":"57938","fix":"63296","desc":"57940"},{"messageId":"57941","fix":"63297","desc":"57943"},{"messageId":"57938","fix":"63298","desc":"57940"},{"messageId":"57941","fix":"63299","desc":"57943"},{"messageId":"57938","fix":"63300","desc":"57940"},{"messageId":"57941","fix":"63301","desc":"57943"},{"messageId":"57938","fix":"63302","desc":"57940"},{"messageId":"57941","fix":"63303","desc":"57943"},{"messageId":"57938","fix":"63304","desc":"57940"},{"messageId":"57941","fix":"63305","desc":"57943"},{"messageId":"57938","fix":"63306","desc":"57940"},{"messageId":"57941","fix":"63307","desc":"57943"},{"messageId":"57938","fix":"63308","desc":"57940"},{"messageId":"57941","fix":"63309","desc":"57943"},{"messageId":"57938","fix":"63310","desc":"57940"},{"messageId":"57941","fix":"63311","desc":"57943"},{"messageId":"57938","fix":"63312","desc":"57940"},{"messageId":"57941","fix":"63313","desc":"57943"},{"messageId":"57938","fix":"63314","desc":"57940"},{"messageId":"57941","fix":"63315","desc":"57943"},{"messageId":"57938","fix":"63316","desc":"57940"},{"messageId":"57941","fix":"63317","desc":"57943"},{"messageId":"57938","fix":"63318","desc":"57940"},{"messageId":"57941","fix":"63319","desc":"57943"},{"messageId":"57938","fix":"63320","desc":"57940"},{"messageId":"57941","fix":"63321","desc":"57943"},{"messageId":"57938","fix":"63322","desc":"57940"},{"messageId":"57941","fix":"63323","desc":"57943"},{"messageId":"57938","fix":"63324","desc":"57940"},{"messageId":"57941","fix":"63325","desc":"57943"},{"messageId":"57938","fix":"63326","desc":"57940"},{"messageId":"57941","fix":"63327","desc":"57943"},{"messageId":"57938","fix":"63328","desc":"57940"},{"messageId":"57941","fix":"63329","desc":"57943"},{"messageId":"57938","fix":"63330","desc":"57940"},{"messageId":"57941","fix":"63331","desc":"57943"},{"messageId":"57938","fix":"63332","desc":"57940"},{"messageId":"57941","fix":"63333","desc":"57943"},{"messageId":"57938","fix":"63334","desc":"57940"},{"messageId":"57941","fix":"63335","desc":"57943"},{"messageId":"57938","fix":"63336","desc":"57940"},{"messageId":"57941","fix":"63337","desc":"57943"},{"messageId":"57938","fix":"63338","desc":"57940"},{"messageId":"57941","fix":"63339","desc":"57943"},{"messageId":"57938","fix":"63340","desc":"57940"},{"messageId":"57941","fix":"63341","desc":"57943"},{"messageId":"57938","fix":"63342","desc":"57940"},{"messageId":"57941","fix":"63343","desc":"57943"},{"messageId":"57938","fix":"63344","desc":"57940"},{"messageId":"57941","fix":"63345","desc":"57943"},{"messageId":"57938","fix":"63346","desc":"57940"},{"messageId":"57941","fix":"63347","desc":"57943"},{"messageId":"57938","fix":"63348","desc":"57940"},{"messageId":"57941","fix":"63349","desc":"57943"},{"messageId":"57938","fix":"63350","desc":"57940"},{"messageId":"57941","fix":"63351","desc":"57943"},{"messageId":"57938","fix":"63352","desc":"57940"},{"messageId":"57941","fix":"63353","desc":"57943"},{"messageId":"57938","fix":"63354","desc":"57940"},{"messageId":"57941","fix":"63355","desc":"57943"},{"messageId":"57938","fix":"63356","desc":"57940"},{"messageId":"57941","fix":"63357","desc":"57943"},{"messageId":"57938","fix":"63358","desc":"57940"},{"messageId":"57941","fix":"63359","desc":"57943"},{"messageId":"57938","fix":"63360","desc":"57940"},{"messageId":"57941","fix":"63361","desc":"57943"},{"messageId":"57938","fix":"63362","desc":"57940"},{"messageId":"57941","fix":"63363","desc":"57943"},{"messageId":"57938","fix":"63364","desc":"57940"},{"messageId":"57941","fix":"63365","desc":"57943"},{"messageId":"57938","fix":"63366","desc":"57940"},{"messageId":"57941","fix":"63367","desc":"57943"},{"messageId":"57938","fix":"63368","desc":"57940"},{"messageId":"57941","fix":"63369","desc":"57943"},{"messageId":"57938","fix":"63370","desc":"57940"},{"messageId":"57941","fix":"63371","desc":"57943"},{"messageId":"57938","fix":"63372","desc":"57940"},{"messageId":"57941","fix":"63373","desc":"57943"},{"messageId":"57938","fix":"63374","desc":"57940"},{"messageId":"57941","fix":"63375","desc":"57943"},{"messageId":"57938","fix":"63376","desc":"57940"},{"messageId":"57941","fix":"63377","desc":"57943"},{"messageId":"57938","fix":"63378","desc":"57940"},{"messageId":"57941","fix":"63379","desc":"57943"},{"messageId":"57938","fix":"63380","desc":"57940"},{"messageId":"57941","fix":"63381","desc":"57943"},{"messageId":"57938","fix":"63382","desc":"57940"},{"messageId":"57941","fix":"63383","desc":"57943"},{"messageId":"57938","fix":"63384","desc":"57940"},{"messageId":"57941","fix":"63385","desc":"57943"},{"messageId":"57938","fix":"63386","desc":"57940"},{"messageId":"57941","fix":"63387","desc":"57943"},{"messageId":"57938","fix":"63388","desc":"57940"},{"messageId":"57941","fix":"63389","desc":"57943"},{"messageId":"57938","fix":"63390","desc":"57940"},{"messageId":"57941","fix":"63391","desc":"57943"},{"messageId":"57938","fix":"63392","desc":"57940"},{"messageId":"57941","fix":"63393","desc":"57943"},{"messageId":"57938","fix":"63394","desc":"57940"},{"messageId":"57941","fix":"63395","desc":"57943"},{"messageId":"57938","fix":"63396","desc":"57940"},{"messageId":"57941","fix":"63397","desc":"57943"},{"messageId":"57938","fix":"63398","desc":"57940"},{"messageId":"57941","fix":"63399","desc":"57943"},{"messageId":"57938","fix":"63400","desc":"57940"},{"messageId":"57941","fix":"63401","desc":"57943"},{"messageId":"57938","fix":"63402","desc":"57940"},{"messageId":"57941","fix":"63403","desc":"57943"},{"messageId":"57938","fix":"63404","desc":"57940"},{"messageId":"57941","fix":"63405","desc":"57943"},{"messageId":"57938","fix":"63406","desc":"57940"},{"messageId":"57941","fix":"63407","desc":"57943"},{"messageId":"57938","fix":"63408","desc":"57940"},{"messageId":"57941","fix":"63409","desc":"57943"},{"messageId":"57938","fix":"63410","desc":"57940"},{"messageId":"57941","fix":"63411","desc":"57943"},{"messageId":"57938","fix":"63412","desc":"57940"},{"messageId":"57941","fix":"63413","desc":"57943"},{"messageId":"57938","fix":"63414","desc":"57940"},{"messageId":"57941","fix":"63415","desc":"57943"},{"messageId":"57938","fix":"63416","desc":"57940"},{"messageId":"57941","fix":"63417","desc":"57943"},{"messageId":"57938","fix":"63418","desc":"57940"},{"messageId":"57941","fix":"63419","desc":"57943"},{"messageId":"57938","fix":"63420","desc":"57940"},{"messageId":"57941","fix":"63421","desc":"57943"},{"messageId":"57938","fix":"63422","desc":"57940"},{"messageId":"57941","fix":"63423","desc":"57943"},{"messageId":"57938","fix":"63424","desc":"57940"},{"messageId":"57941","fix":"63425","desc":"57943"},{"messageId":"57938","fix":"63426","desc":"57940"},{"messageId":"57941","fix":"63427","desc":"57943"},{"messageId":"57938","fix":"63428","desc":"57940"},{"messageId":"57941","fix":"63429","desc":"57943"},{"messageId":"57938","fix":"63430","desc":"57940"},{"messageId":"57941","fix":"63431","desc":"57943"},{"messageId":"57938","fix":"63432","desc":"57940"},{"messageId":"57941","fix":"63433","desc":"57943"},{"messageId":"57938","fix":"63434","desc":"57940"},{"messageId":"57941","fix":"63435","desc":"57943"},{"messageId":"57938","fix":"63436","desc":"57940"},{"messageId":"57941","fix":"63437","desc":"57943"},{"messageId":"57938","fix":"63438","desc":"57940"},{"messageId":"57941","fix":"63439","desc":"57943"},{"messageId":"57938","fix":"63440","desc":"57940"},{"messageId":"57941","fix":"63441","desc":"57943"},{"messageId":"57938","fix":"63442","desc":"57940"},{"messageId":"57941","fix":"63443","desc":"57943"},{"messageId":"57938","fix":"63444","desc":"57940"},{"messageId":"57941","fix":"63445","desc":"57943"},{"messageId":"57938","fix":"63446","desc":"57940"},{"messageId":"57941","fix":"63447","desc":"57943"},{"messageId":"57938","fix":"63448","desc":"57940"},{"messageId":"57941","fix":"63449","desc":"57943"},{"messageId":"57938","fix":"63450","desc":"57940"},{"messageId":"57941","fix":"63451","desc":"57943"},{"messageId":"57938","fix":"63452","desc":"57940"},{"messageId":"57941","fix":"63453","desc":"57943"},{"messageId":"57938","fix":"63454","desc":"57940"},{"messageId":"57941","fix":"63455","desc":"57943"},{"messageId":"57938","fix":"63456","desc":"57940"},{"messageId":"57941","fix":"63457","desc":"57943"},{"messageId":"57938","fix":"63458","desc":"57940"},{"messageId":"57941","fix":"63459","desc":"57943"},{"messageId":"57938","fix":"63460","desc":"57940"},{"messageId":"57941","fix":"63461","desc":"57943"},{"messageId":"57938","fix":"63462","desc":"57940"},{"messageId":"57941","fix":"63463","desc":"57943"},{"messageId":"57938","fix":"63464","desc":"57940"},{"messageId":"57941","fix":"63465","desc":"57943"},{"messageId":"57938","fix":"63466","desc":"57940"},{"messageId":"57941","fix":"63467","desc":"57943"},{"messageId":"57938","fix":"63468","desc":"57940"},{"messageId":"57941","fix":"63469","desc":"57943"},{"messageId":"57938","fix":"63470","desc":"57940"},{"messageId":"57941","fix":"63471","desc":"57943"},{"messageId":"57938","fix":"63472","desc":"57940"},{"messageId":"57941","fix":"63473","desc":"57943"},{"messageId":"57938","fix":"63474","desc":"57940"},{"messageId":"57941","fix":"63475","desc":"57943"},{"messageId":"57938","fix":"63476","desc":"57940"},{"messageId":"57941","fix":"63477","desc":"57943"},{"messageId":"57938","fix":"63478","desc":"57940"},{"messageId":"57941","fix":"63479","desc":"57943"},{"messageId":"57938","fix":"63480","desc":"57940"},{"messageId":"57941","fix":"63481","desc":"57943"},{"messageId":"57938","fix":"63482","desc":"57940"},{"messageId":"57941","fix":"63483","desc":"57943"},{"messageId":"57938","fix":"63484","desc":"57940"},{"messageId":"57941","fix":"63485","desc":"57943"},{"messageId":"57938","fix":"63486","desc":"57940"},{"messageId":"57941","fix":"63487","desc":"57943"},{"messageId":"57938","fix":"63488","desc":"57940"},{"messageId":"57941","fix":"63489","desc":"57943"},{"messageId":"57938","fix":"63490","desc":"57940"},{"messageId":"57941","fix":"63491","desc":"57943"},{"messageId":"57938","fix":"63492","desc":"57940"},{"messageId":"57941","fix":"63493","desc":"57943"},{"messageId":"57938","fix":"63494","desc":"57940"},{"messageId":"57941","fix":"63495","desc":"57943"},{"messageId":"57938","fix":"63496","desc":"57940"},{"messageId":"57941","fix":"63497","desc":"57943"},{"messageId":"57938","fix":"63498","desc":"57940"},{"messageId":"57941","fix":"63499","desc":"57943"},{"messageId":"57938","fix":"63500","desc":"57940"},{"messageId":"57941","fix":"63501","desc":"57943"},{"messageId":"57938","fix":"63502","desc":"57940"},{"messageId":"57941","fix":"63503","desc":"57943"},{"messageId":"57938","fix":"63504","desc":"57940"},{"messageId":"57941","fix":"63505","desc":"57943"},{"messageId":"57938","fix":"63506","desc":"57940"},{"messageId":"57941","fix":"63507","desc":"57943"},{"messageId":"57938","fix":"63508","desc":"57940"},{"messageId":"57941","fix":"63509","desc":"57943"},{"messageId":"57938","fix":"63510","desc":"57940"},{"messageId":"57941","fix":"63511","desc":"57943"},{"messageId":"57938","fix":"63512","desc":"57940"},{"messageId":"57941","fix":"63513","desc":"57943"},{"messageId":"57938","fix":"63514","desc":"57940"},{"messageId":"57941","fix":"63515","desc":"57943"},{"messageId":"57938","fix":"63516","desc":"57940"},{"messageId":"57941","fix":"63517","desc":"57943"},{"messageId":"57938","fix":"63518","desc":"57940"},{"messageId":"57941","fix":"63519","desc":"57943"},{"messageId":"57938","fix":"63520","desc":"57940"},{"messageId":"57941","fix":"63521","desc":"57943"},{"messageId":"57938","fix":"63522","desc":"57940"},{"messageId":"57941","fix":"63523","desc":"57943"},{"messageId":"57938","fix":"63524","desc":"57940"},{"messageId":"57941","fix":"63525","desc":"57943"},{"messageId":"57938","fix":"63526","desc":"57940"},{"messageId":"57941","fix":"63527","desc":"57943"},{"messageId":"57938","fix":"63528","desc":"57940"},{"messageId":"57941","fix":"63529","desc":"57943"},{"messageId":"57938","fix":"63530","desc":"57940"},{"messageId":"57941","fix":"63531","desc":"57943"},{"messageId":"57938","fix":"63532","desc":"57940"},{"messageId":"57941","fix":"63533","desc":"57943"},{"messageId":"57938","fix":"63534","desc":"57940"},{"messageId":"57941","fix":"63535","desc":"57943"},{"messageId":"57938","fix":"63536","desc":"57940"},{"messageId":"57941","fix":"63537","desc":"57943"},{"messageId":"57938","fix":"63538","desc":"57940"},{"messageId":"57941","fix":"63539","desc":"57943"},{"messageId":"57938","fix":"63540","desc":"57940"},{"messageId":"57941","fix":"63541","desc":"57943"},{"messageId":"57938","fix":"63542","desc":"57940"},{"messageId":"57941","fix":"63543","desc":"57943"},{"messageId":"57938","fix":"63544","desc":"57940"},{"messageId":"57941","fix":"63545","desc":"57943"},{"messageId":"57938","fix":"63546","desc":"57940"},{"messageId":"57941","fix":"63547","desc":"57943"},{"messageId":"57938","fix":"63548","desc":"57940"},{"messageId":"57941","fix":"63549","desc":"57943"},{"messageId":"57938","fix":"63550","desc":"57940"},{"messageId":"57941","fix":"63551","desc":"57943"},{"messageId":"57938","fix":"63552","desc":"57940"},{"messageId":"57941","fix":"63553","desc":"57943"},{"messageId":"57938","fix":"63554","desc":"57940"},{"messageId":"57941","fix":"63555","desc":"57943"},{"messageId":"57938","fix":"63556","desc":"57940"},{"messageId":"57941","fix":"63557","desc":"57943"},{"messageId":"57938","fix":"63558","desc":"57940"},{"messageId":"57941","fix":"63559","desc":"57943"},{"messageId":"57938","fix":"63560","desc":"57940"},{"messageId":"57941","fix":"63561","desc":"57943"},{"messageId":"57938","fix":"63562","desc":"57940"},{"messageId":"57941","fix":"63563","desc":"57943"},{"messageId":"57938","fix":"63564","desc":"57940"},{"messageId":"57941","fix":"63565","desc":"57943"},{"messageId":"57938","fix":"63566","desc":"57940"},{"messageId":"57941","fix":"63567","desc":"57943"},{"messageId":"57938","fix":"63568","desc":"57940"},{"messageId":"57941","fix":"63569","desc":"57943"},{"messageId":"57938","fix":"63570","desc":"57940"},{"messageId":"57941","fix":"63571","desc":"57943"},{"messageId":"57938","fix":"63572","desc":"57940"},{"messageId":"57941","fix":"63573","desc":"57943"},{"messageId":"57938","fix":"63574","desc":"57940"},{"messageId":"57941","fix":"63575","desc":"57943"},{"messageId":"57938","fix":"63576","desc":"57940"},{"messageId":"57941","fix":"63577","desc":"57943"},{"messageId":"57938","fix":"63578","desc":"57940"},{"messageId":"57941","fix":"63579","desc":"57943"},{"messageId":"57938","fix":"63580","desc":"57940"},{"messageId":"57941","fix":"63581","desc":"57943"},{"messageId":"57938","fix":"63582","desc":"57940"},{"messageId":"57941","fix":"63583","desc":"57943"},{"messageId":"57938","fix":"63584","desc":"57940"},{"messageId":"57941","fix":"63585","desc":"57943"},{"messageId":"57938","fix":"63586","desc":"57940"},{"messageId":"57941","fix":"63587","desc":"57943"},{"messageId":"57938","fix":"63588","desc":"57940"},{"messageId":"57941","fix":"63589","desc":"57943"},{"messageId":"57938","fix":"63590","desc":"57940"},{"messageId":"57941","fix":"63591","desc":"57943"},{"messageId":"57938","fix":"63592","desc":"57940"},{"messageId":"57941","fix":"63593","desc":"57943"},{"messageId":"57938","fix":"63594","desc":"57940"},{"messageId":"57941","fix":"63595","desc":"57943"},{"messageId":"57938","fix":"63596","desc":"57940"},{"messageId":"57941","fix":"63597","desc":"57943"},{"messageId":"57938","fix":"63598","desc":"57940"},{"messageId":"57941","fix":"63599","desc":"57943"},{"messageId":"57938","fix":"63600","desc":"57940"},{"messageId":"57941","fix":"63601","desc":"57943"},{"messageId":"57938","fix":"63602","desc":"57940"},{"messageId":"57941","fix":"63603","desc":"57943"},{"messageId":"57938","fix":"63604","desc":"57940"},{"messageId":"57941","fix":"63605","desc":"57943"},{"messageId":"57938","fix":"63606","desc":"57940"},{"messageId":"57941","fix":"63607","desc":"57943"},{"messageId":"57938","fix":"63608","desc":"57940"},{"messageId":"57941","fix":"63609","desc":"57943"},{"messageId":"57938","fix":"63610","desc":"57940"},{"messageId":"57941","fix":"63611","desc":"57943"},{"messageId":"57938","fix":"63612","desc":"57940"},{"messageId":"57941","fix":"63613","desc":"57943"},{"messageId":"57938","fix":"63614","desc":"57940"},{"messageId":"57941","fix":"63615","desc":"57943"},{"messageId":"57938","fix":"63616","desc":"57940"},{"messageId":"57941","fix":"63617","desc":"57943"},{"messageId":"57938","fix":"63618","desc":"57940"},{"messageId":"57941","fix":"63619","desc":"57943"},{"messageId":"57938","fix":"63620","desc":"57940"},{"messageId":"57941","fix":"63621","desc":"57943"},{"messageId":"57938","fix":"63622","desc":"57940"},{"messageId":"57941","fix":"63623","desc":"57943"},{"messageId":"57938","fix":"63624","desc":"57940"},{"messageId":"57941","fix":"63625","desc":"57943"},{"messageId":"57938","fix":"63626","desc":"57940"},{"messageId":"57941","fix":"63627","desc":"57943"},{"messageId":"57938","fix":"63628","desc":"57940"},{"messageId":"57941","fix":"63629","desc":"57943"},{"messageId":"57938","fix":"63630","desc":"57940"},{"messageId":"57941","fix":"63631","desc":"57943"},{"messageId":"57938","fix":"63632","desc":"57940"},{"messageId":"57941","fix":"63633","desc":"57943"},{"messageId":"57938","fix":"63634","desc":"57940"},{"messageId":"57941","fix":"63635","desc":"57943"},{"messageId":"57938","fix":"63636","desc":"57940"},{"messageId":"57941","fix":"63637","desc":"57943"},{"messageId":"57938","fix":"63638","desc":"57940"},{"messageId":"57941","fix":"63639","desc":"57943"},{"messageId":"57938","fix":"63640","desc":"57940"},{"messageId":"57941","fix":"63641","desc":"57943"},{"messageId":"57938","fix":"63642","desc":"57940"},{"messageId":"57941","fix":"63643","desc":"57943"},{"messageId":"57938","fix":"63644","desc":"57940"},{"messageId":"57941","fix":"63645","desc":"57943"},{"messageId":"57938","fix":"63646","desc":"57940"},{"messageId":"57941","fix":"63647","desc":"57943"},{"messageId":"57938","fix":"63648","desc":"57940"},{"messageId":"57941","fix":"63649","desc":"57943"},{"messageId":"57938","fix":"63650","desc":"57940"},{"messageId":"57941","fix":"63651","desc":"57943"},{"messageId":"57938","fix":"63652","desc":"57940"},{"messageId":"57941","fix":"63653","desc":"57943"},{"messageId":"57938","fix":"63654","desc":"57940"},{"messageId":"57941","fix":"63655","desc":"57943"},{"messageId":"57938","fix":"63656","desc":"57940"},{"messageId":"57941","fix":"63657","desc":"57943"},{"messageId":"57938","fix":"63658","desc":"57940"},{"messageId":"57941","fix":"63659","desc":"57943"},{"messageId":"57938","fix":"63660","desc":"57940"},{"messageId":"57941","fix":"63661","desc":"57943"},{"messageId":"57938","fix":"63662","desc":"57940"},{"messageId":"57941","fix":"63663","desc":"57943"},{"messageId":"57938","fix":"63664","desc":"57940"},{"messageId":"57941","fix":"63665","desc":"57943"},{"messageId":"57938","fix":"63666","desc":"57940"},{"messageId":"57941","fix":"63667","desc":"57943"},{"messageId":"57938","fix":"63668","desc":"57940"},{"messageId":"57941","fix":"63669","desc":"57943"},{"messageId":"57938","fix":"63670","desc":"57940"},{"messageId":"57941","fix":"63671","desc":"57943"},{"messageId":"57938","fix":"63672","desc":"57940"},{"messageId":"57941","fix":"63673","desc":"57943"},{"messageId":"57938","fix":"63674","desc":"57940"},{"messageId":"57941","fix":"63675","desc":"57943"},{"messageId":"57938","fix":"63676","desc":"57940"},{"messageId":"57941","fix":"63677","desc":"57943"},{"messageId":"57938","fix":"63678","desc":"57940"},{"messageId":"57941","fix":"63679","desc":"57943"},{"messageId":"57938","fix":"63680","desc":"57940"},{"messageId":"57941","fix":"63681","desc":"57943"},{"messageId":"57938","fix":"63682","desc":"57940"},{"messageId":"57941","fix":"63683","desc":"57943"},{"messageId":"57938","fix":"63684","desc":"57940"},{"messageId":"57941","fix":"63685","desc":"57943"},{"messageId":"57938","fix":"63686","desc":"57940"},{"messageId":"57941","fix":"63687","desc":"57943"},{"messageId":"57938","fix":"63688","desc":"57940"},{"messageId":"57941","fix":"63689","desc":"57943"},{"messageId":"57938","fix":"63690","desc":"57940"},{"messageId":"57941","fix":"63691","desc":"57943"},{"messageId":"57938","fix":"63692","desc":"57940"},{"messageId":"57941","fix":"63693","desc":"57943"},{"messageId":"57938","fix":"63694","desc":"57940"},{"messageId":"57941","fix":"63695","desc":"57943"},{"messageId":"57938","fix":"63696","desc":"57940"},{"messageId":"57941","fix":"63697","desc":"57943"},{"messageId":"57938","fix":"63698","desc":"57940"},{"messageId":"57941","fix":"63699","desc":"57943"},{"messageId":"57938","fix":"63700","desc":"57940"},{"messageId":"57941","fix":"63701","desc":"57943"},{"messageId":"57938","fix":"63702","desc":"57940"},{"messageId":"57941","fix":"63703","desc":"57943"},{"messageId":"57938","fix":"63704","desc":"57940"},{"messageId":"57941","fix":"63705","desc":"57943"},{"messageId":"57938","fix":"63706","desc":"57940"},{"messageId":"57941","fix":"63707","desc":"57943"},{"messageId":"57938","fix":"63708","desc":"57940"},{"messageId":"57941","fix":"63709","desc":"57943"},{"messageId":"57938","fix":"63710","desc":"57940"},{"messageId":"57941","fix":"63711","desc":"57943"},{"messageId":"57938","fix":"63712","desc":"57940"},{"messageId":"57941","fix":"63713","desc":"57943"},{"messageId":"57938","fix":"63714","desc":"57940"},{"messageId":"57941","fix":"63715","desc":"57943"},{"messageId":"57938","fix":"63716","desc":"57940"},{"messageId":"57941","fix":"63717","desc":"57943"},{"messageId":"57938","fix":"63718","desc":"57940"},{"messageId":"57941","fix":"63719","desc":"57943"},{"messageId":"57938","fix":"63720","desc":"57940"},{"messageId":"57941","fix":"63721","desc":"57943"},{"messageId":"57938","fix":"63722","desc":"57940"},{"messageId":"57941","fix":"63723","desc":"57943"},{"messageId":"57938","fix":"63724","desc":"57940"},{"messageId":"57941","fix":"63725","desc":"57943"},{"messageId":"57938","fix":"63726","desc":"57940"},{"messageId":"57941","fix":"63727","desc":"57943"},{"messageId":"57938","fix":"63728","desc":"57940"},{"messageId":"57941","fix":"63729","desc":"57943"},{"messageId":"57938","fix":"63730","desc":"57940"},{"messageId":"57941","fix":"63731","desc":"57943"},{"messageId":"57938","fix":"63732","desc":"57940"},{"messageId":"57941","fix":"63733","desc":"57943"},{"messageId":"57938","fix":"63734","desc":"57940"},{"messageId":"57941","fix":"63735","desc":"57943"},{"messageId":"57938","fix":"63736","desc":"57940"},{"messageId":"57941","fix":"63737","desc":"57943"},{"messageId":"57938","fix":"63738","desc":"57940"},{"messageId":"57941","fix":"63739","desc":"57943"},{"messageId":"57938","fix":"63740","desc":"57940"},{"messageId":"57941","fix":"63741","desc":"57943"},{"messageId":"57938","fix":"63742","desc":"57940"},{"messageId":"57941","fix":"63743","desc":"57943"},{"messageId":"57938","fix":"63744","desc":"57940"},{"messageId":"57941","fix":"63745","desc":"57943"},{"messageId":"57938","fix":"63746","desc":"57940"},{"messageId":"57941","fix":"63747","desc":"57943"},{"messageId":"57938","fix":"63748","desc":"57940"},{"messageId":"57941","fix":"63749","desc":"57943"},{"messageId":"57938","fix":"63750","desc":"57940"},{"messageId":"57941","fix":"63751","desc":"57943"},{"messageId":"57938","fix":"63752","desc":"57940"},{"messageId":"57941","fix":"63753","desc":"57943"},{"messageId":"57938","fix":"63754","desc":"57940"},{"messageId":"57941","fix":"63755","desc":"57943"},{"messageId":"57938","fix":"63756","desc":"57940"},{"messageId":"57941","fix":"63757","desc":"57943"},{"messageId":"57938","fix":"63758","desc":"57940"},{"messageId":"57941","fix":"63759","desc":"57943"},{"messageId":"57938","fix":"63760","desc":"57940"},{"messageId":"57941","fix":"63761","desc":"57943"},{"messageId":"57938","fix":"63762","desc":"57940"},{"messageId":"57941","fix":"63763","desc":"57943"},{"messageId":"57938","fix":"63764","desc":"57940"},{"messageId":"57941","fix":"63765","desc":"57943"},{"messageId":"57938","fix":"63766","desc":"57940"},{"messageId":"57941","fix":"63767","desc":"57943"},{"messageId":"57938","fix":"63768","desc":"57940"},{"messageId":"57941","fix":"63769","desc":"57943"},{"messageId":"57938","fix":"63770","desc":"57940"},{"messageId":"57941","fix":"63771","desc":"57943"},{"messageId":"57938","fix":"63772","desc":"57940"},{"messageId":"57941","fix":"63773","desc":"57943"},{"messageId":"57938","fix":"63774","desc":"57940"},{"messageId":"57941","fix":"63775","desc":"57943"},{"messageId":"57938","fix":"63776","desc":"57940"},{"messageId":"57941","fix":"63777","desc":"57943"},{"messageId":"57938","fix":"63778","desc":"57940"},{"messageId":"57941","fix":"63779","desc":"57943"},{"messageId":"57938","fix":"63780","desc":"57940"},{"messageId":"57941","fix":"63781","desc":"57943"},{"messageId":"57938","fix":"63782","desc":"57940"},{"messageId":"57941","fix":"63783","desc":"57943"},{"messageId":"57938","fix":"63784","desc":"57940"},{"messageId":"57941","fix":"63785","desc":"57943"},{"messageId":"57938","fix":"63786","desc":"57940"},{"messageId":"57941","fix":"63787","desc":"57943"},{"messageId":"57938","fix":"63788","desc":"57940"},{"messageId":"57941","fix":"63789","desc":"57943"},{"messageId":"57938","fix":"63790","desc":"57940"},{"messageId":"57941","fix":"63791","desc":"57943"},{"messageId":"57938","fix":"63792","desc":"57940"},{"messageId":"57941","fix":"63793","desc":"57943"},{"messageId":"57938","fix":"63794","desc":"57940"},{"messageId":"57941","fix":"63795","desc":"57943"},{"messageId":"57938","fix":"63796","desc":"57940"},{"messageId":"57941","fix":"63797","desc":"57943"},{"messageId":"57938","fix":"63798","desc":"57940"},{"messageId":"57941","fix":"63799","desc":"57943"},{"messageId":"57938","fix":"63800","desc":"57940"},{"messageId":"57941","fix":"63801","desc":"57943"},{"messageId":"57938","fix":"63802","desc":"57940"},{"messageId":"57941","fix":"63803","desc":"57943"},{"messageId":"57938","fix":"63804","desc":"57940"},{"messageId":"57941","fix":"63805","desc":"57943"},{"messageId":"57938","fix":"63806","desc":"57940"},{"messageId":"57941","fix":"63807","desc":"57943"},{"messageId":"57938","fix":"63808","desc":"57940"},{"messageId":"57941","fix":"63809","desc":"57943"},{"messageId":"57938","fix":"63810","desc":"57940"},{"messageId":"57941","fix":"63811","desc":"57943"},{"messageId":"57938","fix":"63812","desc":"57940"},{"messageId":"57941","fix":"63813","desc":"57943"},{"messageId":"57938","fix":"63814","desc":"57940"},{"messageId":"57941","fix":"63815","desc":"57943"},{"messageId":"57938","fix":"63816","desc":"57940"},{"messageId":"57941","fix":"63817","desc":"57943"},{"messageId":"57938","fix":"63818","desc":"57940"},{"messageId":"57941","fix":"63819","desc":"57943"},{"messageId":"57938","fix":"63820","desc":"57940"},{"messageId":"57941","fix":"63821","desc":"57943"},{"messageId":"57938","fix":"63822","desc":"57940"},{"messageId":"57941","fix":"63823","desc":"57943"},{"messageId":"57938","fix":"63824","desc":"57940"},{"messageId":"57941","fix":"63825","desc":"57943"},{"messageId":"57938","fix":"63826","desc":"57940"},{"messageId":"57941","fix":"63827","desc":"57943"},{"messageId":"57938","fix":"63828","desc":"57940"},{"messageId":"57941","fix":"63829","desc":"57943"},{"messageId":"57938","fix":"63830","desc":"57940"},{"messageId":"57941","fix":"63831","desc":"57943"},{"messageId":"57938","fix":"63832","desc":"57940"},{"messageId":"57941","fix":"63833","desc":"57943"},{"messageId":"57938","fix":"63834","desc":"57940"},{"messageId":"57941","fix":"63835","desc":"57943"},{"messageId":"57938","fix":"63836","desc":"57940"},{"messageId":"57941","fix":"63837","desc":"57943"},{"messageId":"57938","fix":"63838","desc":"57940"},{"messageId":"57941","fix":"63839","desc":"57943"},{"messageId":"57938","fix":"63840","desc":"57940"},{"messageId":"57941","fix":"63841","desc":"57943"},{"messageId":"57938","fix":"63842","desc":"57940"},{"messageId":"57941","fix":"63843","desc":"57943"},{"messageId":"57938","fix":"63844","desc":"57940"},{"messageId":"57941","fix":"63845","desc":"57943"},{"messageId":"57938","fix":"63846","desc":"57940"},{"messageId":"57941","fix":"63847","desc":"57943"},{"messageId":"57938","fix":"63848","desc":"57940"},{"messageId":"57941","fix":"63849","desc":"57943"},{"messageId":"57938","fix":"63850","desc":"57940"},{"messageId":"57941","fix":"63851","desc":"57943"},{"messageId":"57938","fix":"63852","desc":"57940"},{"messageId":"57941","fix":"63853","desc":"57943"},{"messageId":"57938","fix":"63854","desc":"57940"},{"messageId":"57941","fix":"63855","desc":"57943"},{"messageId":"57938","fix":"63856","desc":"57940"},{"messageId":"57941","fix":"63857","desc":"57943"},{"messageId":"57938","fix":"63858","desc":"57940"},{"messageId":"57941","fix":"63859","desc":"57943"},{"messageId":"57938","fix":"63860","desc":"57940"},{"messageId":"57941","fix":"63861","desc":"57943"},{"messageId":"57938","fix":"63862","desc":"57940"},{"messageId":"57941","fix":"63863","desc":"57943"},{"messageId":"57938","fix":"63864","desc":"57940"},{"messageId":"57941","fix":"63865","desc":"57943"},{"messageId":"57938","fix":"63866","desc":"57940"},{"messageId":"57941","fix":"63867","desc":"57943"},{"messageId":"57938","fix":"63868","desc":"57940"},{"messageId":"57941","fix":"63869","desc":"57943"},{"messageId":"57938","fix":"63870","desc":"57940"},{"messageId":"57941","fix":"63871","desc":"57943"},{"messageId":"57938","fix":"63872","desc":"57940"},{"messageId":"57941","fix":"63873","desc":"57943"},{"messageId":"57938","fix":"63874","desc":"57940"},{"messageId":"57941","fix":"63875","desc":"57943"},{"messageId":"57938","fix":"63876","desc":"57940"},{"messageId":"57941","fix":"63877","desc":"57943"},{"messageId":"57938","fix":"63878","desc":"57940"},{"messageId":"57941","fix":"63879","desc":"57943"},{"messageId":"57938","fix":"63880","desc":"57940"},{"messageId":"57941","fix":"63881","desc":"57943"},{"messageId":"57938","fix":"63882","desc":"57940"},{"messageId":"57941","fix":"63883","desc":"57943"},{"messageId":"57938","fix":"63884","desc":"57940"},{"messageId":"57941","fix":"63885","desc":"57943"},{"messageId":"57938","fix":"63886","desc":"57940"},{"messageId":"57941","fix":"63887","desc":"57943"},{"messageId":"57938","fix":"63888","desc":"57940"},{"messageId":"57941","fix":"63889","desc":"57943"},{"messageId":"57938","fix":"63890","desc":"57940"},{"messageId":"57941","fix":"63891","desc":"57943"},{"messageId":"57938","fix":"63892","desc":"57940"},{"messageId":"57941","fix":"63893","desc":"57943"},{"messageId":"57938","fix":"63894","desc":"57940"},{"messageId":"57941","fix":"63895","desc":"57943"},{"messageId":"57938","fix":"63896","desc":"57940"},{"messageId":"57941","fix":"63897","desc":"57943"},{"messageId":"57938","fix":"63898","desc":"57940"},{"messageId":"57941","fix":"63899","desc":"57943"},{"messageId":"57938","fix":"63900","desc":"57940"},{"messageId":"57941","fix":"63901","desc":"57943"},{"messageId":"57938","fix":"63902","desc":"57940"},{"messageId":"57941","fix":"63903","desc":"57943"},{"messageId":"57938","fix":"63904","desc":"57940"},{"messageId":"57941","fix":"63905","desc":"57943"},{"messageId":"57938","fix":"63906","desc":"57940"},{"messageId":"57941","fix":"63907","desc":"57943"},{"messageId":"57938","fix":"63908","desc":"57940"},{"messageId":"57941","fix":"63909","desc":"57943"},{"messageId":"57938","fix":"63910","desc":"57940"},{"messageId":"57941","fix":"63911","desc":"57943"},{"messageId":"57938","fix":"63912","desc":"57940"},{"messageId":"57941","fix":"63913","desc":"57943"},{"messageId":"57938","fix":"63914","desc":"57940"},{"messageId":"57941","fix":"63915","desc":"57943"},{"messageId":"57938","fix":"63916","desc":"57940"},{"messageId":"57941","fix":"63917","desc":"57943"},{"messageId":"57938","fix":"63918","desc":"57940"},{"messageId":"57941","fix":"63919","desc":"57943"},{"messageId":"57938","fix":"63920","desc":"57940"},{"messageId":"57941","fix":"63921","desc":"57943"},{"messageId":"57938","fix":"63922","desc":"57940"},{"messageId":"57941","fix":"63923","desc":"57943"},{"messageId":"57938","fix":"63924","desc":"57940"},{"messageId":"57941","fix":"63925","desc":"57943"},{"messageId":"57938","fix":"63926","desc":"57940"},{"messageId":"57941","fix":"63927","desc":"57943"},{"messageId":"57938","fix":"63928","desc":"57940"},{"messageId":"57941","fix":"63929","desc":"57943"},{"messageId":"57938","fix":"63930","desc":"57940"},{"messageId":"57941","fix":"63931","desc":"57943"},{"messageId":"57938","fix":"63932","desc":"57940"},{"messageId":"57941","fix":"63933","desc":"57943"},{"messageId":"57938","fix":"63934","desc":"57940"},{"messageId":"57941","fix":"63935","desc":"57943"},{"messageId":"57938","fix":"63936","desc":"57940"},{"messageId":"57941","fix":"63937","desc":"57943"},{"messageId":"57938","fix":"63938","desc":"57940"},{"messageId":"57941","fix":"63939","desc":"57943"},{"messageId":"57938","fix":"63940","desc":"57940"},{"messageId":"57941","fix":"63941","desc":"57943"},{"messageId":"57938","fix":"63942","desc":"57940"},{"messageId":"57941","fix":"63943","desc":"57943"},{"messageId":"57938","fix":"63944","desc":"57940"},{"messageId":"57941","fix":"63945","desc":"57943"},{"messageId":"57938","fix":"63946","desc":"57940"},{"messageId":"57941","fix":"63947","desc":"57943"},{"messageId":"57938","fix":"63948","desc":"57940"},{"messageId":"57941","fix":"63949","desc":"57943"},{"messageId":"57938","fix":"63950","desc":"57940"},{"messageId":"57941","fix":"63951","desc":"57943"},{"messageId":"57938","fix":"63952","desc":"57940"},{"messageId":"57941","fix":"63953","desc":"57943"},{"messageId":"57938","fix":"63954","desc":"57940"},{"messageId":"57941","fix":"63955","desc":"57943"},{"messageId":"57938","fix":"63956","desc":"57940"},{"messageId":"57941","fix":"63957","desc":"57943"},{"messageId":"57938","fix":"63958","desc":"57940"},{"messageId":"57941","fix":"63959","desc":"57943"},{"messageId":"57938","fix":"63960","desc":"57940"},{"messageId":"57941","fix":"63961","desc":"57943"},{"messageId":"57938","fix":"63962","desc":"57940"},{"messageId":"57941","fix":"63963","desc":"57943"},{"messageId":"57938","fix":"63964","desc":"57940"},{"messageId":"57941","fix":"63965","desc":"57943"},{"messageId":"57938","fix":"63966","desc":"57940"},{"messageId":"57941","fix":"63967","desc":"57943"},{"messageId":"57938","fix":"63968","desc":"57940"},{"messageId":"57941","fix":"63969","desc":"57943"},{"messageId":"57938","fix":"63970","desc":"57940"},{"messageId":"57941","fix":"63971","desc":"57943"},{"messageId":"57938","fix":"63972","desc":"57940"},{"messageId":"57941","fix":"63973","desc":"57943"},{"messageId":"57938","fix":"63974","desc":"57940"},{"messageId":"57941","fix":"63975","desc":"57943"},{"messageId":"57938","fix":"63976","desc":"57940"},{"messageId":"57941","fix":"63977","desc":"57943"},{"messageId":"57938","fix":"63978","desc":"57940"},{"messageId":"57941","fix":"63979","desc":"57943"},{"messageId":"57938","fix":"63980","desc":"57940"},{"messageId":"57941","fix":"63981","desc":"57943"},{"messageId":"57938","fix":"63982","desc":"57940"},{"messageId":"57941","fix":"63983","desc":"57943"},{"messageId":"57938","fix":"63984","desc":"57940"},{"messageId":"57941","fix":"63985","desc":"57943"},{"messageId":"57938","fix":"63986","desc":"57940"},{"messageId":"57941","fix":"63987","desc":"57943"},{"messageId":"57938","fix":"63988","desc":"57940"},{"messageId":"57941","fix":"63989","desc":"57943"},{"messageId":"57938","fix":"63990","desc":"57940"},{"messageId":"57941","fix":"63991","desc":"57943"},{"messageId":"57938","fix":"63992","desc":"57940"},{"messageId":"57941","fix":"63993","desc":"57943"},{"messageId":"57938","fix":"63994","desc":"57940"},{"messageId":"57941","fix":"63995","desc":"57943"},{"messageId":"57938","fix":"63996","desc":"57940"},{"messageId":"57941","fix":"63997","desc":"57943"},{"messageId":"57938","fix":"63998","desc":"57940"},{"messageId":"57941","fix":"63999","desc":"57943"},{"messageId":"57938","fix":"64000","desc":"57940"},{"messageId":"57941","fix":"64001","desc":"57943"},{"messageId":"57938","fix":"64002","desc":"57940"},{"messageId":"57941","fix":"64003","desc":"57943"},{"messageId":"57938","fix":"64004","desc":"57940"},{"messageId":"57941","fix":"64005","desc":"57943"},{"messageId":"57938","fix":"64006","desc":"57940"},{"messageId":"57941","fix":"64007","desc":"57943"},{"messageId":"57938","fix":"64008","desc":"57940"},{"messageId":"57941","fix":"64009","desc":"57943"},{"messageId":"57938","fix":"64010","desc":"57940"},{"messageId":"57941","fix":"64011","desc":"57943"},{"messageId":"57938","fix":"64012","desc":"57940"},{"messageId":"57941","fix":"64013","desc":"57943"},{"messageId":"57938","fix":"64014","desc":"57940"},{"messageId":"57941","fix":"64015","desc":"57943"},{"messageId":"57938","fix":"64016","desc":"57940"},{"messageId":"57941","fix":"64017","desc":"57943"},{"messageId":"57938","fix":"64018","desc":"57940"},{"messageId":"57941","fix":"64019","desc":"57943"},{"messageId":"57938","fix":"64020","desc":"57940"},{"messageId":"57941","fix":"64021","desc":"57943"},{"messageId":"57938","fix":"64022","desc":"57940"},{"messageId":"57941","fix":"64023","desc":"57943"},{"messageId":"57938","fix":"64024","desc":"57940"},{"messageId":"57941","fix":"64025","desc":"57943"},{"messageId":"57938","fix":"64026","desc":"57940"},{"messageId":"57941","fix":"64027","desc":"57943"},{"messageId":"57938","fix":"64028","desc":"57940"},{"messageId":"57941","fix":"64029","desc":"57943"},{"messageId":"57938","fix":"64030","desc":"57940"},{"messageId":"57941","fix":"64031","desc":"57943"},{"messageId":"57938","fix":"64032","desc":"57940"},{"messageId":"57941","fix":"64033","desc":"57943"},{"messageId":"57938","fix":"64034","desc":"57940"},{"messageId":"57941","fix":"64035","desc":"57943"},{"messageId":"57938","fix":"64036","desc":"57940"},{"messageId":"57941","fix":"64037","desc":"57943"},{"messageId":"57938","fix":"64038","desc":"57940"},{"messageId":"57941","fix":"64039","desc":"57943"},{"messageId":"57938","fix":"64040","desc":"57940"},{"messageId":"57941","fix":"64041","desc":"57943"},{"messageId":"57938","fix":"64042","desc":"57940"},{"messageId":"57941","fix":"64043","desc":"57943"},{"messageId":"57938","fix":"64044","desc":"57940"},{"messageId":"57941","fix":"64045","desc":"57943"},{"messageId":"57938","fix":"64046","desc":"57940"},{"messageId":"57941","fix":"64047","desc":"57943"},{"messageId":"57938","fix":"64048","desc":"57940"},{"messageId":"57941","fix":"64049","desc":"57943"},{"messageId":"57938","fix":"64050","desc":"57940"},{"messageId":"57941","fix":"64051","desc":"57943"},{"messageId":"57938","fix":"64052","desc":"57940"},{"messageId":"57941","fix":"64053","desc":"57943"},{"messageId":"57938","fix":"64054","desc":"57940"},{"messageId":"57941","fix":"64055","desc":"57943"},{"messageId":"57938","fix":"64056","desc":"57940"},{"messageId":"57941","fix":"64057","desc":"57943"},{"messageId":"57938","fix":"64058","desc":"57940"},{"messageId":"57941","fix":"64059","desc":"57943"},{"messageId":"57938","fix":"64060","desc":"57940"},{"messageId":"57941","fix":"64061","desc":"57943"},{"messageId":"57938","fix":"64062","desc":"57940"},{"messageId":"57941","fix":"64063","desc":"57943"},{"messageId":"57938","fix":"64064","desc":"57940"},{"messageId":"57941","fix":"64065","desc":"57943"},{"messageId":"57938","fix":"64066","desc":"57940"},{"messageId":"57941","fix":"64067","desc":"57943"},{"messageId":"57938","fix":"64068","desc":"57940"},{"messageId":"57941","fix":"64069","desc":"57943"},{"messageId":"57938","fix":"64070","desc":"57940"},{"messageId":"57941","fix":"64071","desc":"57943"},{"messageId":"57938","fix":"64072","desc":"57940"},{"messageId":"57941","fix":"64073","desc":"57943"},{"messageId":"57938","fix":"64074","desc":"57940"},{"messageId":"57941","fix":"64075","desc":"57943"},{"messageId":"57938","fix":"64076","desc":"57940"},{"messageId":"57941","fix":"64077","desc":"57943"},{"messageId":"57938","fix":"64078","desc":"57940"},{"messageId":"57941","fix":"64079","desc":"57943"},{"messageId":"57938","fix":"64080","desc":"57940"},{"messageId":"57941","fix":"64081","desc":"57943"},{"messageId":"57938","fix":"64082","desc":"57940"},{"messageId":"57941","fix":"64083","desc":"57943"},{"messageId":"57938","fix":"64084","desc":"57940"},{"messageId":"57941","fix":"64085","desc":"57943"},{"messageId":"57938","fix":"64086","desc":"57940"},{"messageId":"57941","fix":"64087","desc":"57943"},{"messageId":"57938","fix":"64088","desc":"57940"},{"messageId":"57941","fix":"64089","desc":"57943"},{"messageId":"57938","fix":"64090","desc":"57940"},{"messageId":"57941","fix":"64091","desc":"57943"},{"messageId":"57938","fix":"64092","desc":"57940"},{"messageId":"57941","fix":"64093","desc":"57943"},{"messageId":"57938","fix":"64094","desc":"57940"},{"messageId":"57941","fix":"64095","desc":"57943"},{"messageId":"57938","fix":"64096","desc":"57940"},{"messageId":"57941","fix":"64097","desc":"57943"},{"messageId":"57938","fix":"64098","desc":"57940"},{"messageId":"57941","fix":"64099","desc":"57943"},{"messageId":"57938","fix":"64100","desc":"57940"},{"messageId":"57941","fix":"64101","desc":"57943"},{"messageId":"57938","fix":"64102","desc":"57940"},{"messageId":"57941","fix":"64103","desc":"57943"},{"messageId":"57938","fix":"64104","desc":"57940"},{"messageId":"57941","fix":"64105","desc":"57943"},{"messageId":"57938","fix":"64106","desc":"57940"},{"messageId":"57941","fix":"64107","desc":"57943"},{"messageId":"57938","fix":"64108","desc":"57940"},{"messageId":"57941","fix":"64109","desc":"57943"},{"messageId":"57938","fix":"64110","desc":"57940"},{"messageId":"57941","fix":"64111","desc":"57943"},{"messageId":"57938","fix":"64112","desc":"57940"},{"messageId":"57941","fix":"64113","desc":"57943"},{"messageId":"57938","fix":"64114","desc":"57940"},{"messageId":"57941","fix":"64115","desc":"57943"},{"messageId":"57938","fix":"64116","desc":"57940"},{"messageId":"57941","fix":"64117","desc":"57943"},{"messageId":"57938","fix":"64118","desc":"57940"},{"messageId":"57941","fix":"64119","desc":"57943"},{"messageId":"57938","fix":"64120","desc":"57940"},{"messageId":"57941","fix":"64121","desc":"57943"},{"messageId":"57938","fix":"64122","desc":"57940"},{"messageId":"57941","fix":"64123","desc":"57943"},{"messageId":"57938","fix":"64124","desc":"57940"},{"messageId":"57941","fix":"64125","desc":"57943"},{"messageId":"57938","fix":"64126","desc":"57940"},{"messageId":"57941","fix":"64127","desc":"57943"},{"messageId":"57938","fix":"64128","desc":"57940"},{"messageId":"57941","fix":"64129","desc":"57943"},{"messageId":"57938","fix":"64130","desc":"57940"},{"messageId":"57941","fix":"64131","desc":"57943"},{"messageId":"57938","fix":"64132","desc":"57940"},{"messageId":"57941","fix":"64133","desc":"57943"},{"messageId":"57938","fix":"64134","desc":"57940"},{"messageId":"57941","fix":"64135","desc":"57943"},{"messageId":"57938","fix":"64136","desc":"57940"},{"messageId":"57941","fix":"64137","desc":"57943"},{"messageId":"57938","fix":"64138","desc":"57940"},{"messageId":"57941","fix":"64139","desc":"57943"},{"messageId":"57938","fix":"64140","desc":"57940"},{"messageId":"57941","fix":"64141","desc":"57943"},{"messageId":"57938","fix":"64142","desc":"57940"},{"messageId":"57941","fix":"64143","desc":"57943"},{"messageId":"57938","fix":"64144","desc":"57940"},{"messageId":"57941","fix":"64145","desc":"57943"},{"messageId":"57938","fix":"64146","desc":"57940"},{"messageId":"57941","fix":"64147","desc":"57943"},{"messageId":"57938","fix":"64148","desc":"57940"},{"messageId":"57941","fix":"64149","desc":"57943"},{"messageId":"57938","fix":"64150","desc":"57940"},{"messageId":"57941","fix":"64151","desc":"57943"},{"messageId":"57938","fix":"64152","desc":"57940"},{"messageId":"57941","fix":"64153","desc":"57943"},{"messageId":"57938","fix":"64154","desc":"57940"},{"messageId":"57941","fix":"64155","desc":"57943"},{"messageId":"57938","fix":"64156","desc":"57940"},{"messageId":"57941","fix":"64157","desc":"57943"},{"messageId":"57938","fix":"64158","desc":"57940"},{"messageId":"57941","fix":"64159","desc":"57943"},{"messageId":"57938","fix":"64160","desc":"57940"},{"messageId":"57941","fix":"64161","desc":"57943"},{"messageId":"57938","fix":"64162","desc":"57940"},{"messageId":"57941","fix":"64163","desc":"57943"},{"messageId":"57938","fix":"64164","desc":"57940"},{"messageId":"57941","fix":"64165","desc":"57943"},{"messageId":"57938","fix":"64166","desc":"57940"},{"messageId":"57941","fix":"64167","desc":"57943"},{"messageId":"57938","fix":"64168","desc":"57940"},{"messageId":"57941","fix":"64169","desc":"57943"},{"messageId":"57938","fix":"64170","desc":"57940"},{"messageId":"57941","fix":"64171","desc":"57943"},{"messageId":"57938","fix":"64172","desc":"57940"},{"messageId":"57941","fix":"64173","desc":"57943"},{"messageId":"57938","fix":"64174","desc":"57940"},{"messageId":"57941","fix":"64175","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"64176","desc":"57940"},{"messageId":"57941","fix":"64177","desc":"57943"},{"kind":"58246","justification":"58247"},{"messageId":"57938","fix":"64178","desc":"57940"},{"messageId":"57941","fix":"64179","desc":"57943"},{"messageId":"57938","fix":"64180","desc":"57940"},{"messageId":"57941","fix":"64181","desc":"57943"},{"messageId":"57938","fix":"64182","desc":"57940"},{"messageId":"57941","fix":"64183","desc":"57943"},{"messageId":"57938","fix":"64184","desc":"57940"},{"messageId":"57941","fix":"64185","desc":"57943"},{"messageId":"57938","fix":"64186","desc":"57940"},{"messageId":"57941","fix":"64187","desc":"57943"},{"messageId":"57938","fix":"64188","desc":"57940"},{"messageId":"57941","fix":"64189","desc":"57943"},{"messageId":"57938","fix":"64190","desc":"57940"},{"messageId":"57941","fix":"64191","desc":"57943"},{"messageId":"57938","fix":"64192","desc":"57940"},{"messageId":"57941","fix":"64193","desc":"57943"},{"messageId":"57938","fix":"64194","desc":"57940"},{"messageId":"57941","fix":"64195","desc":"57943"},{"messageId":"57938","fix":"64196","desc":"57940"},{"messageId":"57941","fix":"64197","desc":"57943"},{"messageId":"57938","fix":"64198","desc":"57940"},{"messageId":"57941","fix":"64199","desc":"57943"},{"messageId":"57938","fix":"64200","desc":"57940"},{"messageId":"57941","fix":"64201","desc":"57943"},{"messageId":"57938","fix":"64202","desc":"57940"},{"messageId":"57941","fix":"64203","desc":"57943"},{"messageId":"57938","fix":"64204","desc":"57940"},{"messageId":"57941","fix":"64205","desc":"57943"},{"messageId":"57938","fix":"64206","desc":"57940"},{"messageId":"57941","fix":"64207","desc":"57943"},{"messageId":"57938","fix":"64208","desc":"57940"},{"messageId":"57941","fix":"64209","desc":"57943"},{"messageId":"57938","fix":"64210","desc":"57940"},{"messageId":"57941","fix":"64211","desc":"57943"},{"messageId":"57938","fix":"64212","desc":"57940"},{"messageId":"57941","fix":"64213","desc":"57943"},{"messageId":"57938","fix":"64214","desc":"57940"},{"messageId":"57941","fix":"64215","desc":"57943"},{"messageId":"57938","fix":"64216","desc":"57940"},{"messageId":"57941","fix":"64217","desc":"57943"},{"messageId":"57938","fix":"64218","desc":"57940"},{"messageId":"57941","fix":"64219","desc":"57943"},{"messageId":"57938","fix":"64220","desc":"57940"},{"messageId":"57941","fix":"64221","desc":"57943"},{"messageId":"57938","fix":"64222","desc":"57940"},{"messageId":"57941","fix":"64223","desc":"57943"},{"messageId":"57938","fix":"64224","desc":"57940"},{"messageId":"57941","fix":"64225","desc":"57943"},{"messageId":"57938","fix":"64226","desc":"57940"},{"messageId":"57941","fix":"64227","desc":"57943"},{"messageId":"57938","fix":"64228","desc":"57940"},{"messageId":"57941","fix":"64229","desc":"57943"},{"messageId":"57938","fix":"64230","desc":"57940"},{"messageId":"57941","fix":"64231","desc":"57943"},{"messageId":"57938","fix":"64232","desc":"57940"},{"messageId":"57941","fix":"64233","desc":"57943"},{"messageId":"57938","fix":"64234","desc":"57940"},{"messageId":"57941","fix":"64235","desc":"57943"},{"messageId":"57938","fix":"64236","desc":"57940"},{"messageId":"57941","fix":"64237","desc":"57943"},{"messageId":"57938","fix":"64238","desc":"57940"},{"messageId":"57941","fix":"64239","desc":"57943"},{"messageId":"57938","fix":"64240","desc":"57940"},{"messageId":"57941","fix":"64241","desc":"57943"},{"messageId":"57938","fix":"64242","desc":"57940"},{"messageId":"57941","fix":"64243","desc":"57943"},{"messageId":"57938","fix":"64244","desc":"57940"},{"messageId":"57941","fix":"64245","desc":"57943"},{"messageId":"57938","fix":"64246","desc":"57940"},{"messageId":"57941","fix":"64247","desc":"57943"},{"messageId":"57938","fix":"64248","desc":"57940"},{"messageId":"57941","fix":"64249","desc":"57943"},{"messageId":"57938","fix":"64250","desc":"57940"},{"messageId":"57941","fix":"64251","desc":"57943"},{"messageId":"57938","fix":"64252","desc":"57940"},{"messageId":"57941","fix":"64253","desc":"57943"},{"messageId":"57938","fix":"64254","desc":"57940"},{"messageId":"57941","fix":"64255","desc":"57943"},{"messageId":"57938","fix":"64256","desc":"57940"},{"messageId":"57941","fix":"64257","desc":"57943"},{"messageId":"57938","fix":"64258","desc":"57940"},{"messageId":"57941","fix":"64259","desc":"57943"},{"messageId":"57938","fix":"64260","desc":"57940"},{"messageId":"57941","fix":"64261","desc":"57943"},{"messageId":"57938","fix":"64262","desc":"57940"},{"messageId":"57941","fix":"64263","desc":"57943"},{"messageId":"57938","fix":"64264","desc":"57940"},{"messageId":"57941","fix":"64265","desc":"57943"},{"messageId":"57938","fix":"64266","desc":"57940"},{"messageId":"57941","fix":"64267","desc":"57943"},{"messageId":"57938","fix":"64268","desc":"57940"},{"messageId":"57941","fix":"64269","desc":"57943"},{"messageId":"57938","fix":"64270","desc":"57940"},{"messageId":"57941","fix":"64271","desc":"57943"},{"messageId":"57938","fix":"64272","desc":"57940"},{"messageId":"57941","fix":"64273","desc":"57943"},{"messageId":"57938","fix":"64274","desc":"57940"},{"messageId":"57941","fix":"64275","desc":"57943"},{"messageId":"57938","fix":"64276","desc":"57940"},{"messageId":"57941","fix":"64277","desc":"57943"},{"messageId":"57938","fix":"64278","desc":"57940"},{"messageId":"57941","fix":"64279","desc":"57943"},{"messageId":"57938","fix":"64280","desc":"57940"},{"messageId":"57941","fix":"64281","desc":"57943"},{"messageId":"57938","fix":"64282","desc":"57940"},{"messageId":"57941","fix":"64283","desc":"57943"},{"messageId":"57938","fix":"64284","desc":"57940"},{"messageId":"57941","fix":"64285","desc":"57943"},{"messageId":"57938","fix":"64286","desc":"57940"},{"messageId":"57941","fix":"64287","desc":"57943"},{"messageId":"57938","fix":"64288","desc":"57940"},{"messageId":"57941","fix":"64289","desc":"57943"},{"messageId":"57938","fix":"64290","desc":"57940"},{"messageId":"57941","fix":"64291","desc":"57943"},{"messageId":"57938","fix":"64292","desc":"57940"},{"messageId":"57941","fix":"64293","desc":"57943"},{"messageId":"57938","fix":"64294","desc":"57940"},{"messageId":"57941","fix":"64295","desc":"57943"},{"messageId":"57938","fix":"64296","desc":"57940"},{"messageId":"57941","fix":"64297","desc":"57943"},{"messageId":"57938","fix":"64298","desc":"57940"},{"messageId":"57941","fix":"64299","desc":"57943"},{"messageId":"57938","fix":"64300","desc":"57940"},{"messageId":"57941","fix":"64301","desc":"57943"},{"messageId":"57938","fix":"64302","desc":"57940"},{"messageId":"57941","fix":"64303","desc":"57943"},{"messageId":"57938","fix":"64304","desc":"57940"},{"messageId":"57941","fix":"64305","desc":"57943"},{"messageId":"57938","fix":"64306","desc":"57940"},{"messageId":"57941","fix":"64307","desc":"57943"},{"messageId":"57938","fix":"64308","desc":"57940"},{"messageId":"57941","fix":"64309","desc":"57943"},{"messageId":"57938","fix":"64310","desc":"57940"},{"messageId":"57941","fix":"64311","desc":"57943"},{"messageId":"57938","fix":"64312","desc":"57940"},{"messageId":"57941","fix":"64313","desc":"57943"},{"messageId":"57938","fix":"64314","desc":"57940"},{"messageId":"57941","fix":"64315","desc":"57943"},{"messageId":"57938","fix":"64316","desc":"57940"},{"messageId":"57941","fix":"64317","desc":"57943"},{"messageId":"57938","fix":"64318","desc":"57940"},{"messageId":"57941","fix":"64319","desc":"57943"},{"messageId":"57938","fix":"64320","desc":"57940"},{"messageId":"57941","fix":"64321","desc":"57943"},{"messageId":"57938","fix":"64322","desc":"57940"},{"messageId":"57941","fix":"64323","desc":"57943"},{"messageId":"57938","fix":"64324","desc":"57940"},{"messageId":"57941","fix":"64325","desc":"57943"},{"messageId":"57938","fix":"64326","desc":"57940"},{"messageId":"57941","fix":"64327","desc":"57943"},{"messageId":"57938","fix":"64328","desc":"57940"},{"messageId":"57941","fix":"64329","desc":"57943"},{"messageId":"57938","fix":"64330","desc":"57940"},{"messageId":"57941","fix":"64331","desc":"57943"},{"messageId":"57938","fix":"64332","desc":"57940"},{"messageId":"57941","fix":"64333","desc":"57943"},{"messageId":"57938","fix":"64334","desc":"57940"},{"messageId":"57941","fix":"64335","desc":"57943"},{"messageId":"57938","fix":"64336","desc":"57940"},{"messageId":"57941","fix":"64337","desc":"57943"},{"messageId":"57938","fix":"64338","desc":"57940"},{"messageId":"57941","fix":"64339","desc":"57943"},{"messageId":"57938","fix":"64340","desc":"57940"},{"messageId":"57941","fix":"64341","desc":"57943"},{"messageId":"57938","fix":"64342","desc":"57940"},{"messageId":"57941","fix":"64343","desc":"57943"},{"messageId":"57938","fix":"64344","desc":"57940"},{"messageId":"57941","fix":"64345","desc":"57943"},{"messageId":"57938","fix":"64346","desc":"57940"},{"messageId":"57941","fix":"64347","desc":"57943"},{"messageId":"57938","fix":"64348","desc":"57940"},{"messageId":"57941","fix":"64349","desc":"57943"},{"messageId":"57938","fix":"64350","desc":"57940"},{"messageId":"57941","fix":"64351","desc":"57943"},{"messageId":"57938","fix":"64352","desc":"57940"},{"messageId":"57941","fix":"64353","desc":"57943"},{"messageId":"57938","fix":"64354","desc":"57940"},{"messageId":"57941","fix":"64355","desc":"57943"},{"messageId":"57938","fix":"64356","desc":"57940"},{"messageId":"57941","fix":"64357","desc":"57943"},{"messageId":"57938","fix":"64358","desc":"57940"},{"messageId":"57941","fix":"64359","desc":"57943"},{"messageId":"57938","fix":"64360","desc":"57940"},{"messageId":"57941","fix":"64361","desc":"57943"},{"messageId":"57938","fix":"64362","desc":"57940"},{"messageId":"57941","fix":"64363","desc":"57943"},{"messageId":"57938","fix":"64364","desc":"57940"},{"messageId":"57941","fix":"64365","desc":"57943"},{"messageId":"57938","fix":"64366","desc":"57940"},{"messageId":"57941","fix":"64367","desc":"57943"},{"messageId":"57938","fix":"64368","desc":"57940"},{"messageId":"57941","fix":"64369","desc":"57943"},{"messageId":"57938","fix":"64370","desc":"57940"},{"messageId":"57941","fix":"64371","desc":"57943"},{"messageId":"57938","fix":"64372","desc":"57940"},{"messageId":"57941","fix":"64373","desc":"57943"},{"messageId":"57938","fix":"64374","desc":"57940"},{"messageId":"57941","fix":"64375","desc":"57943"},{"messageId":"57938","fix":"64376","desc":"57940"},{"messageId":"57941","fix":"64377","desc":"57943"},{"messageId":"57938","fix":"64378","desc":"57940"},{"messageId":"57941","fix":"64379","desc":"57943"},{"messageId":"57938","fix":"64380","desc":"57940"},{"messageId":"57941","fix":"64381","desc":"57943"},{"messageId":"57938","fix":"64382","desc":"57940"},{"messageId":"57941","fix":"64383","desc":"57943"},{"messageId":"57938","fix":"64384","desc":"57940"},{"messageId":"57941","fix":"64385","desc":"57943"},{"messageId":"57938","fix":"64386","desc":"57940"},{"messageId":"57941","fix":"64387","desc":"57943"},{"messageId":"57938","fix":"64388","desc":"57940"},{"messageId":"57941","fix":"64389","desc":"57943"},{"messageId":"57938","fix":"64390","desc":"57940"},{"messageId":"57941","fix":"64391","desc":"57943"},{"messageId":"57938","fix":"64392","desc":"57940"},{"messageId":"57941","fix":"64393","desc":"57943"},{"messageId":"57938","fix":"64394","desc":"57940"},{"messageId":"57941","fix":"64395","desc":"57943"},{"messageId":"57938","fix":"64396","desc":"57940"},{"messageId":"57941","fix":"64397","desc":"57943"},{"messageId":"57938","fix":"64398","desc":"57940"},{"messageId":"57941","fix":"64399","desc":"57943"},{"messageId":"57938","fix":"64400","desc":"57940"},{"messageId":"57941","fix":"64401","desc":"57943"},{"messageId":"57938","fix":"64402","desc":"57940"},{"messageId":"57941","fix":"64403","desc":"57943"},{"messageId":"57938","fix":"64404","desc":"57940"},{"messageId":"57941","fix":"64405","desc":"57943"},{"messageId":"57938","fix":"64406","desc":"57940"},{"messageId":"57941","fix":"64407","desc":"57943"},{"messageId":"57938","fix":"64408","desc":"57940"},{"messageId":"57941","fix":"64409","desc":"57943"},{"messageId":"57938","fix":"64410","desc":"57940"},{"messageId":"57941","fix":"64411","desc":"57943"},{"messageId":"57938","fix":"64412","desc":"57940"},{"messageId":"57941","fix":"64413","desc":"57943"},{"messageId":"57938","fix":"64414","desc":"57940"},{"messageId":"57941","fix":"64415","desc":"57943"},{"messageId":"57938","fix":"64416","desc":"57940"},{"messageId":"57941","fix":"64417","desc":"57943"},{"messageId":"57938","fix":"64418","desc":"57940"},{"messageId":"57941","fix":"64419","desc":"57943"},{"messageId":"57938","fix":"64420","desc":"57940"},{"messageId":"57941","fix":"64421","desc":"57943"},{"messageId":"57938","fix":"64422","desc":"57940"},{"messageId":"57941","fix":"64423","desc":"57943"},{"messageId":"57938","fix":"64424","desc":"57940"},{"messageId":"57941","fix":"64425","desc":"57943"},{"messageId":"57938","fix":"64426","desc":"57940"},{"messageId":"57941","fix":"64427","desc":"57943"},{"messageId":"57938","fix":"64428","desc":"57940"},{"messageId":"57941","fix":"64429","desc":"57943"},{"messageId":"57938","fix":"64430","desc":"57940"},{"messageId":"57941","fix":"64431","desc":"57943"},{"messageId":"57938","fix":"64432","desc":"57940"},{"messageId":"57941","fix":"64433","desc":"57943"},{"messageId":"57938","fix":"64434","desc":"57940"},{"messageId":"57941","fix":"64435","desc":"57943"},{"messageId":"57938","fix":"64436","desc":"57940"},{"messageId":"57941","fix":"64437","desc":"57943"},{"messageId":"57938","fix":"64438","desc":"57940"},{"messageId":"57941","fix":"64439","desc":"57943"},{"messageId":"57938","fix":"64440","desc":"57940"},{"messageId":"57941","fix":"64441","desc":"57943"},{"messageId":"57938","fix":"64442","desc":"57940"},{"messageId":"57941","fix":"64443","desc":"57943"},{"messageId":"57938","fix":"64444","desc":"57940"},{"messageId":"57941","fix":"64445","desc":"57943"},{"messageId":"57938","fix":"64446","desc":"57940"},{"messageId":"57941","fix":"64447","desc":"57943"},{"messageId":"57938","fix":"64448","desc":"57940"},{"messageId":"57941","fix":"64449","desc":"57943"},{"messageId":"57938","fix":"64450","desc":"57940"},{"messageId":"57941","fix":"64451","desc":"57943"},{"messageId":"57938","fix":"64452","desc":"57940"},{"messageId":"57941","fix":"64453","desc":"57943"},{"messageId":"57938","fix":"64454","desc":"57940"},{"messageId":"57941","fix":"64455","desc":"57943"},{"messageId":"57938","fix":"64456","desc":"57940"},{"messageId":"57941","fix":"64457","desc":"57943"},{"messageId":"57938","fix":"64458","desc":"57940"},{"messageId":"57941","fix":"64459","desc":"57943"},{"messageId":"57938","fix":"64460","desc":"57940"},{"messageId":"57941","fix":"64461","desc":"57943"},{"messageId":"57938","fix":"64462","desc":"57940"},{"messageId":"57941","fix":"64463","desc":"57943"},{"messageId":"57938","fix":"64464","desc":"57940"},{"messageId":"57941","fix":"64465","desc":"57943"},{"messageId":"57938","fix":"64466","desc":"57940"},{"messageId":"57941","fix":"64467","desc":"57943"},{"messageId":"57938","fix":"64468","desc":"57940"},{"messageId":"57941","fix":"64469","desc":"57943"},{"messageId":"57938","fix":"64470","desc":"57940"},{"messageId":"57941","fix":"64471","desc":"57943"},{"messageId":"57938","fix":"64472","desc":"57940"},{"messageId":"57941","fix":"64473","desc":"57943"},{"messageId":"57938","fix":"64474","desc":"57940"},{"messageId":"57941","fix":"64475","desc":"57943"},{"messageId":"57938","fix":"64476","desc":"57940"},{"messageId":"57941","fix":"64477","desc":"57943"},{"messageId":"57938","fix":"64478","desc":"57940"},{"messageId":"57941","fix":"64479","desc":"57943"},{"messageId":"57938","fix":"64480","desc":"57940"},{"messageId":"57941","fix":"64481","desc":"57943"},{"messageId":"57938","fix":"64482","desc":"57940"},{"messageId":"57941","fix":"64483","desc":"57943"},{"messageId":"57938","fix":"64484","desc":"57940"},{"messageId":"57941","fix":"64485","desc":"57943"},{"messageId":"57938","fix":"64486","desc":"57940"},{"messageId":"57941","fix":"64487","desc":"57943"},{"messageId":"57938","fix":"64488","desc":"57940"},{"messageId":"57941","fix":"64489","desc":"57943"},{"messageId":"57938","fix":"64490","desc":"57940"},{"messageId":"57941","fix":"64491","desc":"57943"},{"messageId":"57938","fix":"64492","desc":"57940"},{"messageId":"57941","fix":"64493","desc":"57943"},{"messageId":"57938","fix":"64494","desc":"57940"},{"messageId":"57941","fix":"64495","desc":"57943"},{"messageId":"57938","fix":"64496","desc":"57940"},{"messageId":"57941","fix":"64497","desc":"57943"},{"messageId":"57938","fix":"64498","desc":"57940"},{"messageId":"57941","fix":"64499","desc":"57943"},{"messageId":"57938","fix":"64500","desc":"57940"},{"messageId":"57941","fix":"64501","desc":"57943"},{"messageId":"57938","fix":"64502","desc":"57940"},{"messageId":"57941","fix":"64503","desc":"57943"},{"messageId":"57938","fix":"64504","desc":"57940"},{"messageId":"57941","fix":"64505","desc":"57943"},{"messageId":"57938","fix":"64506","desc":"57940"},{"messageId":"57941","fix":"64507","desc":"57943"},{"messageId":"57938","fix":"64508","desc":"57940"},{"messageId":"57941","fix":"64509","desc":"57943"},{"messageId":"57938","fix":"64510","desc":"57940"},{"messageId":"57941","fix":"64511","desc":"57943"},{"messageId":"57938","fix":"64512","desc":"57940"},{"messageId":"57941","fix":"64513","desc":"57943"},{"messageId":"57938","fix":"64514","desc":"57940"},{"messageId":"57941","fix":"64515","desc":"57943"},{"messageId":"57938","fix":"64516","desc":"57940"},{"messageId":"57941","fix":"64517","desc":"57943"},{"messageId":"57938","fix":"64518","desc":"57940"},{"messageId":"57941","fix":"64519","desc":"57943"},{"messageId":"57938","fix":"64520","desc":"57940"},{"messageId":"57941","fix":"64521","desc":"57943"},{"messageId":"57938","fix":"64522","desc":"57940"},{"messageId":"57941","fix":"64523","desc":"57943"},{"messageId":"57938","fix":"64524","desc":"57940"},{"messageId":"57941","fix":"64525","desc":"57943"},{"messageId":"57938","fix":"64526","desc":"57940"},{"messageId":"57941","fix":"64527","desc":"57943"},{"messageId":"57938","fix":"64528","desc":"57940"},{"messageId":"57941","fix":"64529","desc":"57943"},{"messageId":"57938","fix":"64530","desc":"57940"},{"messageId":"57941","fix":"64531","desc":"57943"},{"messageId":"57938","fix":"64532","desc":"57940"},{"messageId":"57941","fix":"64533","desc":"57943"},{"messageId":"57938","fix":"64534","desc":"57940"},{"messageId":"57941","fix":"64535","desc":"57943"},{"messageId":"57938","fix":"64536","desc":"57940"},{"messageId":"57941","fix":"64537","desc":"57943"},{"messageId":"57938","fix":"64538","desc":"57940"},{"messageId":"57941","fix":"64539","desc":"57943"},{"messageId":"57938","fix":"64540","desc":"57940"},{"messageId":"57941","fix":"64541","desc":"57943"},{"messageId":"57938","fix":"64542","desc":"57940"},{"messageId":"57941","fix":"64543","desc":"57943"},{"messageId":"57938","fix":"64544","desc":"57940"},{"messageId":"57941","fix":"64545","desc":"57943"},{"messageId":"57938","fix":"64546","desc":"57940"},{"messageId":"57941","fix":"64547","desc":"57943"},{"messageId":"57938","fix":"64548","desc":"57940"},{"messageId":"57941","fix":"64549","desc":"57943"},{"messageId":"57938","fix":"64550","desc":"57940"},{"messageId":"57941","fix":"64551","desc":"57943"},{"messageId":"57938","fix":"64552","desc":"57940"},{"messageId":"57941","fix":"64553","desc":"57943"},{"messageId":"57938","fix":"64554","desc":"57940"},{"messageId":"57941","fix":"64555","desc":"57943"},{"messageId":"57938","fix":"64556","desc":"57940"},{"messageId":"57941","fix":"64557","desc":"57943"},{"messageId":"57938","fix":"64558","desc":"57940"},{"messageId":"57941","fix":"64559","desc":"57943"},{"messageId":"57938","fix":"64560","desc":"57940"},{"messageId":"57941","fix":"64561","desc":"57943"},{"messageId":"57938","fix":"64562","desc":"57940"},{"messageId":"57941","fix":"64563","desc":"57943"},{"messageId":"57938","fix":"64564","desc":"57940"},{"messageId":"57941","fix":"64565","desc":"57943"},{"messageId":"57938","fix":"64566","desc":"57940"},{"messageId":"57941","fix":"64567","desc":"57943"},{"messageId":"57938","fix":"64568","desc":"57940"},{"messageId":"57941","fix":"64569","desc":"57943"},{"messageId":"57938","fix":"64570","desc":"57940"},{"messageId":"57941","fix":"64571","desc":"57943"},{"messageId":"57938","fix":"64572","desc":"57940"},{"messageId":"57941","fix":"64573","desc":"57943"},{"messageId":"57938","fix":"64574","desc":"57940"},{"messageId":"57941","fix":"64575","desc":"57943"},{"messageId":"57938","fix":"64576","desc":"57940"},{"messageId":"57941","fix":"64577","desc":"57943"},{"messageId":"57938","fix":"64578","desc":"57940"},{"messageId":"57941","fix":"64579","desc":"57943"},{"messageId":"57938","fix":"64580","desc":"57940"},{"messageId":"57941","fix":"64581","desc":"57943"},{"messageId":"57938","fix":"64582","desc":"57940"},{"messageId":"57941","fix":"64583","desc":"57943"},{"messageId":"57938","fix":"64584","desc":"57940"},{"messageId":"57941","fix":"64585","desc":"57943"},{"messageId":"57938","fix":"64586","desc":"57940"},{"messageId":"57941","fix":"64587","desc":"57943"},{"messageId":"57938","fix":"64588","desc":"57940"},{"messageId":"57941","fix":"64589","desc":"57943"},{"messageId":"57938","fix":"64590","desc":"57940"},{"messageId":"57941","fix":"64591","desc":"57943"},{"messageId":"57938","fix":"64592","desc":"57940"},{"messageId":"57941","fix":"64593","desc":"57943"},{"messageId":"57938","fix":"64594","desc":"57940"},{"messageId":"57941","fix":"64595","desc":"57943"},{"messageId":"57938","fix":"64596","desc":"57940"},{"messageId":"57941","fix":"64597","desc":"57943"},{"messageId":"57938","fix":"64598","desc":"57940"},{"messageId":"57941","fix":"64599","desc":"57943"},{"messageId":"57938","fix":"64600","desc":"57940"},{"messageId":"57941","fix":"64601","desc":"57943"},{"messageId":"57938","fix":"64602","desc":"57940"},{"messageId":"57941","fix":"64603","desc":"57943"},{"messageId":"57938","fix":"64604","desc":"57940"},{"messageId":"57941","fix":"64605","desc":"57943"},{"messageId":"57938","fix":"64606","desc":"57940"},{"messageId":"57941","fix":"64607","desc":"57943"},{"messageId":"57938","fix":"64608","desc":"57940"},{"messageId":"57941","fix":"64609","desc":"57943"},{"messageId":"57938","fix":"64610","desc":"57940"},{"messageId":"57941","fix":"64611","desc":"57943"},{"messageId":"57938","fix":"64612","desc":"57940"},{"messageId":"57941","fix":"64613","desc":"57943"},{"messageId":"57938","fix":"64614","desc":"57940"},{"messageId":"57941","fix":"64615","desc":"57943"},{"messageId":"57938","fix":"64616","desc":"57940"},{"messageId":"57941","fix":"64617","desc":"57943"},{"messageId":"57938","fix":"64618","desc":"57940"},{"messageId":"57941","fix":"64619","desc":"57943"},{"messageId":"57938","fix":"64620","desc":"57940"},{"messageId":"57941","fix":"64621","desc":"57943"},{"messageId":"57938","fix":"64622","desc":"57940"},{"messageId":"57941","fix":"64623","desc":"57943"},{"messageId":"57938","fix":"64624","desc":"57940"},{"messageId":"57941","fix":"64625","desc":"57943"},{"messageId":"57938","fix":"64626","desc":"57940"},{"messageId":"57941","fix":"64627","desc":"57943"},{"messageId":"57938","fix":"64628","desc":"57940"},{"messageId":"57941","fix":"64629","desc":"57943"},{"messageId":"57938","fix":"64630","desc":"57940"},{"messageId":"57941","fix":"64631","desc":"57943"},{"messageId":"57938","fix":"64632","desc":"57940"},{"messageId":"57941","fix":"64633","desc":"57943"},{"messageId":"57938","fix":"64634","desc":"57940"},{"messageId":"57941","fix":"64635","desc":"57943"},{"messageId":"57938","fix":"64636","desc":"57940"},{"messageId":"57941","fix":"64637","desc":"57943"},{"messageId":"57938","fix":"64638","desc":"57940"},{"messageId":"57941","fix":"64639","desc":"57943"},{"messageId":"57938","fix":"64640","desc":"57940"},{"messageId":"57941","fix":"64641","desc":"57943"},{"messageId":"57938","fix":"64642","desc":"57940"},{"messageId":"57941","fix":"64643","desc":"57943"},{"messageId":"57938","fix":"64644","desc":"57940"},{"messageId":"57941","fix":"64645","desc":"57943"},{"messageId":"57938","fix":"64646","desc":"57940"},{"messageId":"57941","fix":"64647","desc":"57943"},{"messageId":"57938","fix":"64648","desc":"57940"},{"messageId":"57941","fix":"64649","desc":"57943"},{"messageId":"57938","fix":"64650","desc":"57940"},{"messageId":"57941","fix":"64651","desc":"57943"},{"messageId":"57938","fix":"64652","desc":"57940"},{"messageId":"57941","fix":"64653","desc":"57943"},{"messageId":"57938","fix":"64654","desc":"57940"},{"messageId":"57941","fix":"64655","desc":"57943"},{"messageId":"57938","fix":"64656","desc":"57940"},{"messageId":"57941","fix":"64657","desc":"57943"},{"messageId":"57938","fix":"64658","desc":"57940"},{"messageId":"57941","fix":"64659","desc":"57943"},{"messageId":"57938","fix":"64660","desc":"57940"},{"messageId":"57941","fix":"64661","desc":"57943"},{"messageId":"57938","fix":"64662","desc":"57940"},{"messageId":"57941","fix":"64663","desc":"57943"},{"messageId":"57938","fix":"64664","desc":"57940"},{"messageId":"57941","fix":"64665","desc":"57943"},{"messageId":"57938","fix":"64666","desc":"57940"},{"messageId":"57941","fix":"64667","desc":"57943"},{"messageId":"57938","fix":"64668","desc":"57940"},{"messageId":"57941","fix":"64669","desc":"57943"},{"messageId":"57938","fix":"64670","desc":"57940"},{"messageId":"57941","fix":"64671","desc":"57943"},{"messageId":"57938","fix":"64672","desc":"57940"},{"messageId":"57941","fix":"64673","desc":"57943"},{"messageId":"57938","fix":"64674","desc":"57940"},{"messageId":"57941","fix":"64675","desc":"57943"},{"messageId":"57938","fix":"64676","desc":"57940"},{"messageId":"57941","fix":"64677","desc":"57943"},{"messageId":"57938","fix":"64678","desc":"57940"},{"messageId":"57941","fix":"64679","desc":"57943"},{"messageId":"57938","fix":"64680","desc":"57940"},{"messageId":"57941","fix":"64681","desc":"57943"},{"messageId":"57938","fix":"64682","desc":"57940"},{"messageId":"57941","fix":"64683","desc":"57943"},{"messageId":"57938","fix":"64684","desc":"57940"},{"messageId":"57941","fix":"64685","desc":"57943"},{"messageId":"57938","fix":"64686","desc":"57940"},{"messageId":"57941","fix":"64687","desc":"57943"},{"messageId":"57938","fix":"64688","desc":"57940"},{"messageId":"57941","fix":"64689","desc":"57943"},{"messageId":"57938","fix":"64690","desc":"57940"},{"messageId":"57941","fix":"64691","desc":"57943"},{"messageId":"57938","fix":"64692","desc":"57940"},{"messageId":"57941","fix":"64693","desc":"57943"},{"messageId":"57938","fix":"64694","desc":"57940"},{"messageId":"57941","fix":"64695","desc":"57943"},{"messageId":"57938","fix":"64696","desc":"57940"},{"messageId":"57941","fix":"64697","desc":"57943"},{"messageId":"57938","fix":"64698","desc":"57940"},{"messageId":"57941","fix":"64699","desc":"57943"},{"messageId":"57938","fix":"64700","desc":"57940"},{"messageId":"57941","fix":"64701","desc":"57943"},{"messageId":"57938","fix":"64702","desc":"57940"},{"messageId":"57941","fix":"64703","desc":"57943"},{"messageId":"57938","fix":"64704","desc":"57940"},{"messageId":"57941","fix":"64705","desc":"57943"},{"messageId":"57938","fix":"64706","desc":"57940"},{"messageId":"57941","fix":"64707","desc":"57943"},{"messageId":"57938","fix":"64708","desc":"57940"},{"messageId":"57941","fix":"64709","desc":"57943"},{"messageId":"57938","fix":"64710","desc":"57940"},{"messageId":"57941","fix":"64711","desc":"57943"},{"messageId":"57938","fix":"64712","desc":"57940"},{"messageId":"57941","fix":"64713","desc":"57943"},{"messageId":"57938","fix":"64714","desc":"57940"},{"messageId":"57941","fix":"64715","desc":"57943"},{"messageId":"57938","fix":"64716","desc":"57940"},{"messageId":"57941","fix":"64717","desc":"57943"},{"messageId":"57938","fix":"64718","desc":"57940"},{"messageId":"57941","fix":"64719","desc":"57943"},{"messageId":"57938","fix":"64720","desc":"57940"},{"messageId":"57941","fix":"64721","desc":"57943"},{"messageId":"57938","fix":"64722","desc":"57940"},{"messageId":"57941","fix":"64723","desc":"57943"},{"messageId":"57938","fix":"64724","desc":"57940"},{"messageId":"57941","fix":"64725","desc":"57943"},{"messageId":"57938","fix":"64726","desc":"57940"},{"messageId":"57941","fix":"64727","desc":"57943"},{"messageId":"57938","fix":"64728","desc":"57940"},{"messageId":"57941","fix":"64729","desc":"57943"},{"messageId":"57938","fix":"64730","desc":"57940"},{"messageId":"57941","fix":"64731","desc":"57943"},{"messageId":"57938","fix":"64732","desc":"57940"},{"messageId":"57941","fix":"64733","desc":"57943"},{"messageId":"57938","fix":"64734","desc":"57940"},{"messageId":"57941","fix":"64735","desc":"57943"},{"messageId":"57938","fix":"64736","desc":"57940"},{"messageId":"57941","fix":"64737","desc":"57943"},{"messageId":"57938","fix":"64738","desc":"57940"},{"messageId":"57941","fix":"64739","desc":"57943"},{"messageId":"57938","fix":"64740","desc":"57940"},{"messageId":"57941","fix":"64741","desc":"57943"},{"messageId":"57938","fix":"64742","desc":"57940"},{"messageId":"57941","fix":"64743","desc":"57943"},{"messageId":"57938","fix":"64744","desc":"57940"},{"messageId":"57941","fix":"64745","desc":"57943"},{"messageId":"57938","fix":"64746","desc":"57940"},{"messageId":"57941","fix":"64747","desc":"57943"},{"messageId":"57938","fix":"64748","desc":"57940"},{"messageId":"57941","fix":"64749","desc":"57943"},{"messageId":"57938","fix":"64750","desc":"57940"},{"messageId":"57941","fix":"64751","desc":"57943"},{"messageId":"57938","fix":"64752","desc":"57940"},{"messageId":"57941","fix":"64753","desc":"57943"},{"messageId":"57938","fix":"64754","desc":"57940"},{"messageId":"57941","fix":"64755","desc":"57943"},{"messageId":"57938","fix":"64756","desc":"57940"},{"messageId":"57941","fix":"64757","desc":"57943"},{"messageId":"57938","fix":"64758","desc":"57940"},{"messageId":"57941","fix":"64759","desc":"57943"},{"messageId":"57938","fix":"64760","desc":"57940"},{"messageId":"57941","fix":"64761","desc":"57943"},{"messageId":"57938","fix":"64762","desc":"57940"},{"messageId":"57941","fix":"64763","desc":"57943"},{"messageId":"57938","fix":"64764","desc":"57940"},{"messageId":"57941","fix":"64765","desc":"57943"},{"messageId":"57938","fix":"64766","desc":"57940"},{"messageId":"57941","fix":"64767","desc":"57943"},{"messageId":"57938","fix":"64768","desc":"57940"},{"messageId":"57941","fix":"64769","desc":"57943"},{"messageId":"57938","fix":"64770","desc":"57940"},{"messageId":"57941","fix":"64771","desc":"57943"},{"messageId":"57938","fix":"64772","desc":"57940"},{"messageId":"57941","fix":"64773","desc":"57943"},{"messageId":"57938","fix":"64774","desc":"57940"},{"messageId":"57941","fix":"64775","desc":"57943"},{"messageId":"57938","fix":"64776","desc":"57940"},{"messageId":"57941","fix":"64777","desc":"57943"},{"messageId":"57938","fix":"64778","desc":"57940"},{"messageId":"57941","fix":"64779","desc":"57943"},{"messageId":"57938","fix":"64780","desc":"57940"},{"messageId":"57941","fix":"64781","desc":"57943"},{"messageId":"57938","fix":"64782","desc":"57940"},{"messageId":"57941","fix":"64783","desc":"57943"},{"messageId":"57938","fix":"64784","desc":"57940"},{"messageId":"57941","fix":"64785","desc":"57943"},{"messageId":"57938","fix":"64786","desc":"57940"},{"messageId":"57941","fix":"64787","desc":"57943"},{"messageId":"57938","fix":"64788","desc":"57940"},{"messageId":"57941","fix":"64789","desc":"57943"},{"messageId":"57938","fix":"64790","desc":"57940"},{"messageId":"57941","fix":"64791","desc":"57943"},{"messageId":"57938","fix":"64792","desc":"57940"},{"messageId":"57941","fix":"64793","desc":"57943"},{"messageId":"57938","fix":"64794","desc":"57940"},{"messageId":"57941","fix":"64795","desc":"57943"},{"messageId":"57938","fix":"64796","desc":"57940"},{"messageId":"57941","fix":"64797","desc":"57943"},{"messageId":"57938","fix":"64798","desc":"57940"},{"messageId":"57941","fix":"64799","desc":"57943"},{"messageId":"57938","fix":"64800","desc":"57940"},{"messageId":"57941","fix":"64801","desc":"57943"},{"messageId":"57938","fix":"64802","desc":"57940"},{"messageId":"57941","fix":"64803","desc":"57943"},{"messageId":"57938","fix":"64804","desc":"57940"},{"messageId":"57941","fix":"64805","desc":"57943"},{"messageId":"57938","fix":"64806","desc":"57940"},{"messageId":"57941","fix":"64807","desc":"57943"},{"messageId":"57938","fix":"64808","desc":"57940"},{"messageId":"57941","fix":"64809","desc":"57943"},{"messageId":"57938","fix":"64810","desc":"57940"},{"messageId":"57941","fix":"64811","desc":"57943"},{"messageId":"57938","fix":"64812","desc":"57940"},{"messageId":"57941","fix":"64813","desc":"57943"},{"messageId":"57938","fix":"64814","desc":"57940"},{"messageId":"57941","fix":"64815","desc":"57943"},{"messageId":"57938","fix":"64816","desc":"57940"},{"messageId":"57941","fix":"64817","desc":"57943"},{"messageId":"57938","fix":"64818","desc":"57940"},{"messageId":"57941","fix":"64819","desc":"57943"},{"messageId":"57938","fix":"64820","desc":"57940"},{"messageId":"57941","fix":"64821","desc":"57943"},{"messageId":"57938","fix":"64822","desc":"57940"},{"messageId":"57941","fix":"64823","desc":"57943"},{"messageId":"57938","fix":"64824","desc":"57940"},{"messageId":"57941","fix":"64825","desc":"57943"},{"messageId":"57938","fix":"64826","desc":"57940"},{"messageId":"57941","fix":"64827","desc":"57943"},{"messageId":"57938","fix":"64828","desc":"57940"},{"messageId":"57941","fix":"64829","desc":"57943"},{"messageId":"57938","fix":"64830","desc":"57940"},{"messageId":"57941","fix":"64831","desc":"57943"},{"messageId":"57938","fix":"64832","desc":"57940"},{"messageId":"57941","fix":"64833","desc":"57943"},{"messageId":"57938","fix":"64834","desc":"57940"},{"messageId":"57941","fix":"64835","desc":"57943"},{"messageId":"57938","fix":"64836","desc":"57940"},{"messageId":"57941","fix":"64837","desc":"57943"},{"messageId":"57938","fix":"64838","desc":"57940"},{"messageId":"57941","fix":"64839","desc":"57943"},{"messageId":"57938","fix":"64840","desc":"57940"},{"messageId":"57941","fix":"64841","desc":"57943"},{"messageId":"57938","fix":"64842","desc":"57940"},{"messageId":"57941","fix":"64843","desc":"57943"},{"messageId":"57938","fix":"64844","desc":"57940"},{"messageId":"57941","fix":"64845","desc":"57943"},{"messageId":"57938","fix":"64846","desc":"57940"},{"messageId":"57941","fix":"64847","desc":"57943"},{"messageId":"57938","fix":"64848","desc":"57940"},{"messageId":"57941","fix":"64849","desc":"57943"},{"messageId":"57938","fix":"64850","desc":"57940"},{"messageId":"57941","fix":"64851","desc":"57943"},{"messageId":"57938","fix":"64852","desc":"57940"},{"messageId":"57941","fix":"64853","desc":"57943"},{"messageId":"57938","fix":"64854","desc":"57940"},{"messageId":"57941","fix":"64855","desc":"57943"},{"messageId":"57938","fix":"64856","desc":"57940"},{"messageId":"57941","fix":"64857","desc":"57943"},{"messageId":"57938","fix":"64858","desc":"57940"},{"messageId":"57941","fix":"64859","desc":"57943"},{"messageId":"57938","fix":"64860","desc":"57940"},{"messageId":"57941","fix":"64861","desc":"57943"},{"messageId":"57938","fix":"64862","desc":"57940"},{"messageId":"57941","fix":"64863","desc":"57943"},{"messageId":"57938","fix":"64864","desc":"57940"},{"messageId":"57941","fix":"64865","desc":"57943"},{"messageId":"57938","fix":"64866","desc":"57940"},{"messageId":"57941","fix":"64867","desc":"57943"},{"messageId":"57938","fix":"64868","desc":"57940"},{"messageId":"57941","fix":"64869","desc":"57943"},{"messageId":"57938","fix":"64870","desc":"57940"},{"messageId":"57941","fix":"64871","desc":"57943"},{"messageId":"57938","fix":"64872","desc":"57940"},{"messageId":"57941","fix":"64873","desc":"57943"},{"messageId":"57938","fix":"64874","desc":"57940"},{"messageId":"57941","fix":"64875","desc":"57943"},{"messageId":"57938","fix":"64876","desc":"57940"},{"messageId":"57941","fix":"64877","desc":"57943"},{"messageId":"57938","fix":"64878","desc":"57940"},{"messageId":"57941","fix":"64879","desc":"57943"},{"messageId":"57938","fix":"64880","desc":"57940"},{"messageId":"57941","fix":"64881","desc":"57943"},{"messageId":"57938","fix":"64882","desc":"57940"},{"messageId":"57941","fix":"64883","desc":"57943"},{"messageId":"57938","fix":"64884","desc":"57940"},{"messageId":"57941","fix":"64885","desc":"57943"},{"messageId":"57938","fix":"64886","desc":"57940"},{"messageId":"57941","fix":"64887","desc":"57943"},{"messageId":"57938","fix":"64888","desc":"57940"},{"messageId":"57941","fix":"64889","desc":"57943"},{"messageId":"57938","fix":"64890","desc":"57940"},{"messageId":"57941","fix":"64891","desc":"57943"},{"messageId":"57938","fix":"64892","desc":"57940"},{"messageId":"57941","fix":"64893","desc":"57943"},{"messageId":"57938","fix":"64894","desc":"57940"},{"messageId":"57941","fix":"64895","desc":"57943"},{"messageId":"57938","fix":"64896","desc":"57940"},{"messageId":"57941","fix":"64897","desc":"57943"},{"messageId":"57938","fix":"64898","desc":"57940"},{"messageId":"57941","fix":"64899","desc":"57943"},{"messageId":"57938","fix":"64900","desc":"57940"},{"messageId":"57941","fix":"64901","desc":"57943"},{"messageId":"57938","fix":"64902","desc":"57940"},{"messageId":"57941","fix":"64903","desc":"57943"},{"messageId":"57938","fix":"64904","desc":"57940"},{"messageId":"57941","fix":"64905","desc":"57943"},{"messageId":"57938","fix":"64906","desc":"57940"},{"messageId":"57941","fix":"64907","desc":"57943"},{"messageId":"57938","fix":"64908","desc":"57940"},{"messageId":"57941","fix":"64909","desc":"57943"},{"messageId":"57938","fix":"64910","desc":"57940"},{"messageId":"57941","fix":"64911","desc":"57943"},{"messageId":"57938","fix":"64912","desc":"57940"},{"messageId":"57941","fix":"64913","desc":"57943"},{"messageId":"57938","fix":"64914","desc":"57940"},{"messageId":"57941","fix":"64915","desc":"57943"},{"messageId":"57938","fix":"64916","desc":"57940"},{"messageId":"57941","fix":"64917","desc":"57943"},{"messageId":"57938","fix":"64918","desc":"57940"},{"messageId":"57941","fix":"64919","desc":"57943"},{"messageId":"57938","fix":"64920","desc":"57940"},{"messageId":"57941","fix":"64921","desc":"57943"},{"messageId":"57938","fix":"64922","desc":"57940"},{"messageId":"57941","fix":"64923","desc":"57943"},{"messageId":"57938","fix":"64924","desc":"57940"},{"messageId":"57941","fix":"64925","desc":"57943"},{"messageId":"57938","fix":"64926","desc":"57940"},{"messageId":"57941","fix":"64927","desc":"57943"},{"messageId":"57938","fix":"64928","desc":"57940"},{"messageId":"57941","fix":"64929","desc":"57943"},{"messageId":"57938","fix":"64930","desc":"57940"},{"messageId":"57941","fix":"64931","desc":"57943"},{"messageId":"57938","fix":"64932","desc":"57940"},{"messageId":"57941","fix":"64933","desc":"57943"},{"messageId":"57938","fix":"64934","desc":"57940"},{"messageId":"57941","fix":"64935","desc":"57943"},{"messageId":"57938","fix":"64936","desc":"57940"},{"messageId":"57941","fix":"64937","desc":"57943"},{"messageId":"57938","fix":"64938","desc":"57940"},{"messageId":"57941","fix":"64939","desc":"57943"},{"messageId":"57938","fix":"64940","desc":"57940"},{"messageId":"57941","fix":"64941","desc":"57943"},{"messageId":"57938","fix":"64942","desc":"57940"},{"messageId":"57941","fix":"64943","desc":"57943"},{"messageId":"57938","fix":"64944","desc":"57940"},{"messageId":"57941","fix":"64945","desc":"57943"},{"messageId":"57938","fix":"64946","desc":"57940"},{"messageId":"57941","fix":"64947","desc":"57943"},{"messageId":"57938","fix":"64948","desc":"57940"},{"messageId":"57941","fix":"64949","desc":"57943"},{"messageId":"57938","fix":"64950","desc":"57940"},{"messageId":"57941","fix":"64951","desc":"57943"},{"messageId":"57938","fix":"64952","desc":"57940"},{"messageId":"57941","fix":"64953","desc":"57943"},{"messageId":"57938","fix":"64954","desc":"57940"},{"messageId":"57941","fix":"64955","desc":"57943"},{"messageId":"57938","fix":"64956","desc":"57940"},{"messageId":"57941","fix":"64957","desc":"57943"},{"messageId":"57938","fix":"64958","desc":"57940"},{"messageId":"57941","fix":"64959","desc":"57943"},{"messageId":"57938","fix":"64960","desc":"57940"},{"messageId":"57941","fix":"64961","desc":"57943"},{"messageId":"57938","fix":"64962","desc":"57940"},{"messageId":"57941","fix":"64963","desc":"57943"},{"messageId":"57938","fix":"64964","desc":"57940"},{"messageId":"57941","fix":"64965","desc":"57943"},{"messageId":"57938","fix":"64966","desc":"57940"},{"messageId":"57941","fix":"64967","desc":"57943"},{"messageId":"57938","fix":"64968","desc":"57940"},{"messageId":"57941","fix":"64969","desc":"57943"},{"messageId":"57938","fix":"64970","desc":"57940"},{"messageId":"57941","fix":"64971","desc":"57943"},{"messageId":"57938","fix":"64972","desc":"57940"},{"messageId":"57941","fix":"64973","desc":"57943"},{"messageId":"57938","fix":"64974","desc":"57940"},{"messageId":"57941","fix":"64975","desc":"57943"},{"messageId":"57938","fix":"64976","desc":"57940"},{"messageId":"57941","fix":"64977","desc":"57943"},{"messageId":"57938","fix":"64978","desc":"57940"},{"messageId":"57941","fix":"64979","desc":"57943"},{"messageId":"57938","fix":"64980","desc":"57940"},{"messageId":"57941","fix":"64981","desc":"57943"},{"messageId":"57938","fix":"64982","desc":"57940"},{"messageId":"57941","fix":"64983","desc":"57943"},{"messageId":"57938","fix":"64984","desc":"57940"},{"messageId":"57941","fix":"64985","desc":"57943"},{"messageId":"57938","fix":"64986","desc":"57940"},{"messageId":"57941","fix":"64987","desc":"57943"},{"messageId":"57938","fix":"64988","desc":"57940"},{"messageId":"57941","fix":"64989","desc":"57943"},{"messageId":"57938","fix":"64990","desc":"57940"},{"messageId":"57941","fix":"64991","desc":"57943"},{"messageId":"57938","fix":"64992","desc":"57940"},{"messageId":"57941","fix":"64993","desc":"57943"},{"messageId":"57938","fix":"64994","desc":"57940"},{"messageId":"57941","fix":"64995","desc":"57943"},{"messageId":"57938","fix":"64996","desc":"57940"},{"messageId":"57941","fix":"64997","desc":"57943"},{"messageId":"57938","fix":"64998","desc":"57940"},{"messageId":"57941","fix":"64999","desc":"57943"},{"messageId":"57938","fix":"65000","desc":"57940"},{"messageId":"57941","fix":"65001","desc":"57943"},{"messageId":"57938","fix":"65002","desc":"57940"},{"messageId":"57941","fix":"65003","desc":"57943"},{"messageId":"57938","fix":"65004","desc":"57940"},{"messageId":"57941","fix":"65005","desc":"57943"},{"messageId":"57938","fix":"65006","desc":"57940"},{"messageId":"57941","fix":"65007","desc":"57943"},{"messageId":"57938","fix":"65008","desc":"57940"},{"messageId":"57941","fix":"65009","desc":"57943"},{"messageId":"57938","fix":"65010","desc":"57940"},{"messageId":"57941","fix":"65011","desc":"57943"},{"messageId":"57938","fix":"65012","desc":"57940"},{"messageId":"57941","fix":"65013","desc":"57943"},{"messageId":"57938","fix":"65014","desc":"57940"},{"messageId":"57941","fix":"65015","desc":"57943"},{"messageId":"57938","fix":"65016","desc":"57940"},{"messageId":"57941","fix":"65017","desc":"57943"},{"messageId":"57938","fix":"65018","desc":"57940"},{"messageId":"57941","fix":"65019","desc":"57943"},{"messageId":"57938","fix":"65020","desc":"57940"},{"messageId":"57941","fix":"65021","desc":"57943"},{"messageId":"57938","fix":"65022","desc":"57940"},{"messageId":"57941","fix":"65023","desc":"57943"},{"messageId":"57938","fix":"65024","desc":"57940"},{"messageId":"57941","fix":"65025","desc":"57943"},{"messageId":"57938","fix":"65026","desc":"57940"},{"messageId":"57941","fix":"65027","desc":"57943"},{"messageId":"57938","fix":"65028","desc":"57940"},{"messageId":"57941","fix":"65029","desc":"57943"},{"messageId":"57938","fix":"65030","desc":"57940"},{"messageId":"57941","fix":"65031","desc":"57943"},{"messageId":"57938","fix":"65032","desc":"57940"},{"messageId":"57941","fix":"65033","desc":"57943"},{"messageId":"57938","fix":"65034","desc":"57940"},{"messageId":"57941","fix":"65035","desc":"57943"},{"messageId":"57938","fix":"65036","desc":"57940"},{"messageId":"57941","fix":"65037","desc":"57943"},{"messageId":"57938","fix":"65038","desc":"57940"},{"messageId":"57941","fix":"65039","desc":"57943"},{"messageId":"57938","fix":"65040","desc":"57940"},{"messageId":"57941","fix":"65041","desc":"57943"},{"messageId":"57938","fix":"65042","desc":"57940"},{"messageId":"57941","fix":"65043","desc":"57943"},{"messageId":"57938","fix":"65044","desc":"57940"},{"messageId":"57941","fix":"65045","desc":"57943"},{"messageId":"57938","fix":"65046","desc":"57940"},{"messageId":"57941","fix":"65047","desc":"57943"},{"messageId":"57938","fix":"65048","desc":"57940"},{"messageId":"57941","fix":"65049","desc":"57943"},{"messageId":"57938","fix":"65050","desc":"57940"},{"messageId":"57941","fix":"65051","desc":"57943"},{"messageId":"57938","fix":"65052","desc":"57940"},{"messageId":"57941","fix":"65053","desc":"57943"},{"messageId":"57938","fix":"65054","desc":"57940"},{"messageId":"57941","fix":"65055","desc":"57943"},{"messageId":"57938","fix":"65056","desc":"57940"},{"messageId":"57941","fix":"65057","desc":"57943"},{"messageId":"57938","fix":"65058","desc":"57940"},{"messageId":"57941","fix":"65059","desc":"57943"},{"messageId":"57938","fix":"65060","desc":"57940"},{"messageId":"57941","fix":"65061","desc":"57943"},{"messageId":"57938","fix":"65062","desc":"57940"},{"messageId":"57941","fix":"65063","desc":"57943"},{"messageId":"57938","fix":"65064","desc":"57940"},{"messageId":"57941","fix":"65065","desc":"57943"},{"messageId":"57938","fix":"65066","desc":"57940"},{"messageId":"57941","fix":"65067","desc":"57943"},{"messageId":"57938","fix":"65068","desc":"57940"},{"messageId":"57941","fix":"65069","desc":"57943"},{"messageId":"57938","fix":"65070","desc":"57940"},{"messageId":"57941","fix":"65071","desc":"57943"},{"messageId":"57938","fix":"65072","desc":"57940"},{"messageId":"57941","fix":"65073","desc":"57943"},{"messageId":"57938","fix":"65074","desc":"57940"},{"messageId":"57941","fix":"65075","desc":"57943"},{"messageId":"57938","fix":"65076","desc":"57940"},{"messageId":"57941","fix":"65077","desc":"57943"},{"messageId":"57938","fix":"65078","desc":"57940"},{"messageId":"57941","fix":"65079","desc":"57943"},{"messageId":"57938","fix":"65080","desc":"57940"},{"messageId":"57941","fix":"65081","desc":"57943"},{"messageId":"57938","fix":"65082","desc":"57940"},{"messageId":"57941","fix":"65083","desc":"57943"},{"messageId":"57938","fix":"65084","desc":"57940"},{"messageId":"57941","fix":"65085","desc":"57943"},{"messageId":"57938","fix":"65086","desc":"57940"},{"messageId":"57941","fix":"65087","desc":"57943"},{"messageId":"57938","fix":"65088","desc":"57940"},{"messageId":"57941","fix":"65089","desc":"57943"},{"messageId":"57938","fix":"65090","desc":"57940"},{"messageId":"57941","fix":"65091","desc":"57943"},{"messageId":"57938","fix":"65092","desc":"57940"},{"messageId":"57941","fix":"65093","desc":"57943"},{"messageId":"57938","fix":"65094","desc":"57940"},{"messageId":"57941","fix":"65095","desc":"57943"},{"messageId":"57938","fix":"65096","desc":"57940"},{"messageId":"57941","fix":"65097","desc":"57943"},{"messageId":"57938","fix":"65098","desc":"57940"},{"messageId":"57941","fix":"65099","desc":"57943"},{"messageId":"57938","fix":"65100","desc":"57940"},{"messageId":"57941","fix":"65101","desc":"57943"},{"messageId":"57938","fix":"65102","desc":"57940"},{"messageId":"57941","fix":"65103","desc":"57943"},{"messageId":"57938","fix":"65104","desc":"57940"},{"messageId":"57941","fix":"65105","desc":"57943"},{"messageId":"57938","fix":"65106","desc":"57940"},{"messageId":"57941","fix":"65107","desc":"57943"},{"messageId":"57938","fix":"65108","desc":"57940"},{"messageId":"57941","fix":"65109","desc":"57943"},{"messageId":"57938","fix":"65110","desc":"57940"},{"messageId":"57941","fix":"65111","desc":"57943"},{"messageId":"57938","fix":"65112","desc":"57940"},{"messageId":"57941","fix":"65113","desc":"57943"},{"messageId":"57938","fix":"65114","desc":"57940"},{"messageId":"57941","fix":"65115","desc":"57943"},{"messageId":"57938","fix":"65116","desc":"57940"},{"messageId":"57941","fix":"65117","desc":"57943"},{"messageId":"57938","fix":"65118","desc":"57940"},{"messageId":"57941","fix":"65119","desc":"57943"},{"messageId":"57938","fix":"65120","desc":"57940"},{"messageId":"57941","fix":"65121","desc":"57943"},{"messageId":"57938","fix":"65122","desc":"57940"},{"messageId":"57941","fix":"65123","desc":"57943"},{"messageId":"57938","fix":"65124","desc":"57940"},{"messageId":"57941","fix":"65125","desc":"57943"},{"messageId":"57938","fix":"65126","desc":"57940"},{"messageId":"57941","fix":"65127","desc":"57943"},{"messageId":"57938","fix":"65128","desc":"57940"},{"messageId":"57941","fix":"65129","desc":"57943"},{"messageId":"57938","fix":"65130","desc":"57940"},{"messageId":"57941","fix":"65131","desc":"57943"},{"messageId":"57938","fix":"65132","desc":"57940"},{"messageId":"57941","fix":"65133","desc":"57943"},{"messageId":"57938","fix":"65134","desc":"57940"},{"messageId":"57941","fix":"65135","desc":"57943"},{"messageId":"57938","fix":"65136","desc":"57940"},{"messageId":"57941","fix":"65137","desc":"57943"},{"messageId":"57938","fix":"65138","desc":"57940"},{"messageId":"57941","fix":"65139","desc":"57943"},{"messageId":"57938","fix":"65140","desc":"57940"},{"messageId":"57941","fix":"65141","desc":"57943"},{"messageId":"57938","fix":"65142","desc":"57940"},{"messageId":"57941","fix":"65143","desc":"57943"},{"messageId":"57938","fix":"65144","desc":"57940"},{"messageId":"57941","fix":"65145","desc":"57943"},{"messageId":"57938","fix":"65146","desc":"57940"},{"messageId":"57941","fix":"65147","desc":"57943"},{"messageId":"57938","fix":"65148","desc":"57940"},{"messageId":"57941","fix":"65149","desc":"57943"},{"messageId":"57938","fix":"65150","desc":"57940"},{"messageId":"57941","fix":"65151","desc":"57943"},{"messageId":"57938","fix":"65152","desc":"57940"},{"messageId":"57941","fix":"65153","desc":"57943"},{"messageId":"57938","fix":"65154","desc":"57940"},{"messageId":"57941","fix":"65155","desc":"57943"},{"messageId":"57938","fix":"65156","desc":"57940"},{"messageId":"57941","fix":"65157","desc":"57943"},{"messageId":"57938","fix":"65158","desc":"57940"},{"messageId":"57941","fix":"65159","desc":"57943"},{"messageId":"57938","fix":"65160","desc":"57940"},{"messageId":"57941","fix":"65161","desc":"57943"},{"messageId":"57938","fix":"65162","desc":"57940"},{"messageId":"57941","fix":"65163","desc":"57943"},{"messageId":"57938","fix":"65164","desc":"57940"},{"messageId":"57941","fix":"65165","desc":"57943"},{"messageId":"57938","fix":"65166","desc":"57940"},{"messageId":"57941","fix":"65167","desc":"57943"},{"messageId":"57938","fix":"65168","desc":"57940"},{"messageId":"57941","fix":"65169","desc":"57943"},{"messageId":"57938","fix":"65170","desc":"57940"},{"messageId":"57941","fix":"65171","desc":"57943"},{"messageId":"57938","fix":"65172","desc":"57940"},{"messageId":"57941","fix":"65173","desc":"57943"},{"messageId":"57938","fix":"65174","desc":"57940"},{"messageId":"57941","fix":"65175","desc":"57943"},{"messageId":"57938","fix":"65176","desc":"57940"},{"messageId":"57941","fix":"65177","desc":"57943"},{"messageId":"57938","fix":"65178","desc":"57940"},{"messageId":"57941","fix":"65179","desc":"57943"},{"messageId":"57938","fix":"65180","desc":"57940"},{"messageId":"57941","fix":"65181","desc":"57943"},{"messageId":"57938","fix":"65182","desc":"57940"},{"messageId":"57941","fix":"65183","desc":"57943"},{"messageId":"57938","fix":"65184","desc":"57940"},{"messageId":"57941","fix":"65185","desc":"57943"},{"messageId":"57938","fix":"65186","desc":"57940"},{"messageId":"57941","fix":"65187","desc":"57943"},{"messageId":"57938","fix":"65188","desc":"57940"},{"messageId":"57941","fix":"65189","desc":"57943"},{"messageId":"57938","fix":"65190","desc":"57940"},{"messageId":"57941","fix":"65191","desc":"57943"},{"messageId":"57938","fix":"65192","desc":"57940"},{"messageId":"57941","fix":"65193","desc":"57943"},{"messageId":"57938","fix":"65194","desc":"57940"},{"messageId":"57941","fix":"65195","desc":"57943"},{"messageId":"57938","fix":"65196","desc":"57940"},{"messageId":"57941","fix":"65197","desc":"57943"},{"messageId":"57938","fix":"65198","desc":"57940"},{"messageId":"57941","fix":"65199","desc":"57943"},{"messageId":"57938","fix":"65200","desc":"57940"},{"messageId":"57941","fix":"65201","desc":"57943"},{"messageId":"57938","fix":"65202","desc":"57940"},{"messageId":"57941","fix":"65203","desc":"57943"},{"messageId":"57938","fix":"65204","desc":"57940"},{"messageId":"57941","fix":"65205","desc":"57943"},{"messageId":"57938","fix":"65206","desc":"57940"},{"messageId":"57941","fix":"65207","desc":"57943"},{"messageId":"57938","fix":"65208","desc":"57940"},{"messageId":"57941","fix":"65209","desc":"57943"},{"messageId":"57938","fix":"65210","desc":"57940"},{"messageId":"57941","fix":"65211","desc":"57943"},{"messageId":"57938","fix":"65212","desc":"57940"},{"messageId":"57941","fix":"65213","desc":"57943"},{"messageId":"57938","fix":"65214","desc":"57940"},{"messageId":"57941","fix":"65215","desc":"57943"},{"messageId":"57938","fix":"65216","desc":"57940"},{"messageId":"57941","fix":"65217","desc":"57943"},{"messageId":"57938","fix":"65218","desc":"57940"},{"messageId":"57941","fix":"65219","desc":"57943"},{"messageId":"57938","fix":"65220","desc":"57940"},{"messageId":"57941","fix":"65221","desc":"57943"},{"messageId":"57938","fix":"65222","desc":"57940"},{"messageId":"57941","fix":"65223","desc":"57943"},{"messageId":"57938","fix":"65224","desc":"57940"},{"messageId":"57941","fix":"65225","desc":"57943"},{"messageId":"57938","fix":"65226","desc":"57940"},{"messageId":"57941","fix":"65227","desc":"57943"},{"messageId":"57938","fix":"65228","desc":"57940"},{"messageId":"57941","fix":"65229","desc":"57943"},{"messageId":"57938","fix":"65230","desc":"57940"},{"messageId":"57941","fix":"65231","desc":"57943"},{"messageId":"57938","fix":"65232","desc":"57940"},{"messageId":"57941","fix":"65233","desc":"57943"},{"messageId":"57938","fix":"65234","desc":"57940"},{"messageId":"57941","fix":"65235","desc":"57943"},{"messageId":"57938","fix":"65236","desc":"57940"},{"messageId":"57941","fix":"65237","desc":"57943"},{"messageId":"57938","fix":"65238","desc":"57940"},{"messageId":"57941","fix":"65239","desc":"57943"},{"messageId":"57938","fix":"65240","desc":"57940"},{"messageId":"57941","fix":"65241","desc":"57943"},{"messageId":"57938","fix":"65242","desc":"57940"},{"messageId":"57941","fix":"65243","desc":"57943"},{"messageId":"57938","fix":"65244","desc":"57940"},{"messageId":"57941","fix":"65245","desc":"57943"},{"messageId":"57938","fix":"65246","desc":"57940"},{"messageId":"57941","fix":"65247","desc":"57943"},{"messageId":"57938","fix":"65248","desc":"57940"},{"messageId":"57941","fix":"65249","desc":"57943"},{"messageId":"57938","fix":"65250","desc":"57940"},{"messageId":"57941","fix":"65251","desc":"57943"},{"messageId":"57938","fix":"65252","desc":"57940"},{"messageId":"57941","fix":"65253","desc":"57943"},{"messageId":"57938","fix":"65254","desc":"57940"},{"messageId":"57941","fix":"65255","desc":"57943"},{"messageId":"57938","fix":"65256","desc":"57940"},{"messageId":"57941","fix":"65257","desc":"57943"},{"messageId":"57938","fix":"65258","desc":"57940"},{"messageId":"57941","fix":"65259","desc":"57943"},{"messageId":"57938","fix":"65260","desc":"57940"},{"messageId":"57941","fix":"65261","desc":"57943"},{"messageId":"57938","fix":"65262","desc":"57940"},{"messageId":"57941","fix":"65263","desc":"57943"},{"messageId":"57938","fix":"65264","desc":"57940"},{"messageId":"57941","fix":"65265","desc":"57943"},{"messageId":"57938","fix":"65266","desc":"57940"},{"messageId":"57941","fix":"65267","desc":"57943"},{"messageId":"57938","fix":"65268","desc":"57940"},{"messageId":"57941","fix":"65269","desc":"57943"},{"messageId":"57938","fix":"65270","desc":"57940"},{"messageId":"57941","fix":"65271","desc":"57943"},{"messageId":"57938","fix":"65272","desc":"57940"},{"messageId":"57941","fix":"65273","desc":"57943"},{"messageId":"57938","fix":"65274","desc":"57940"},{"messageId":"57941","fix":"65275","desc":"57943"},{"messageId":"57938","fix":"65276","desc":"57940"},{"messageId":"57941","fix":"65277","desc":"57943"},{"messageId":"57938","fix":"65278","desc":"57940"},{"messageId":"57941","fix":"65279","desc":"57943"},{"messageId":"57938","fix":"65280","desc":"57940"},{"messageId":"57941","fix":"65281","desc":"57943"},{"messageId":"57938","fix":"65282","desc":"57940"},{"messageId":"57941","fix":"65283","desc":"57943"},{"messageId":"57938","fix":"65284","desc":"57940"},{"messageId":"57941","fix":"65285","desc":"57943"},{"messageId":"57938","fix":"65286","desc":"57940"},{"messageId":"57941","fix":"65287","desc":"57943"},{"messageId":"57938","fix":"65288","desc":"57940"},{"messageId":"57941","fix":"65289","desc":"57943"},{"messageId":"57938","fix":"65290","desc":"57940"},{"messageId":"57941","fix":"65291","desc":"57943"},{"messageId":"57938","fix":"65292","desc":"57940"},{"messageId":"57941","fix":"65293","desc":"57943"},{"messageId":"57938","fix":"65294","desc":"57940"},{"messageId":"57941","fix":"65295","desc":"57943"},{"messageId":"57938","fix":"65296","desc":"57940"},{"messageId":"57941","fix":"65297","desc":"57943"},{"messageId":"57938","fix":"65298","desc":"57940"},{"messageId":"57941","fix":"65299","desc":"57943"},{"messageId":"57938","fix":"65300","desc":"57940"},{"messageId":"57941","fix":"65301","desc":"57943"},{"messageId":"57938","fix":"65302","desc":"57940"},{"messageId":"57941","fix":"65303","desc":"57943"},{"messageId":"57938","fix":"65304","desc":"57940"},{"messageId":"57941","fix":"65305","desc":"57943"},{"messageId":"57938","fix":"65306","desc":"57940"},{"messageId":"57941","fix":"65307","desc":"57943"},{"messageId":"57938","fix":"65308","desc":"57940"},{"messageId":"57941","fix":"65309","desc":"57943"},{"messageId":"57938","fix":"65310","desc":"57940"},{"messageId":"57941","fix":"65311","desc":"57943"},{"messageId":"57938","fix":"65312","desc":"57940"},{"messageId":"57941","fix":"65313","desc":"57943"},{"messageId":"57938","fix":"65314","desc":"57940"},{"messageId":"57941","fix":"65315","desc":"57943"},{"messageId":"57938","fix":"65316","desc":"57940"},{"messageId":"57941","fix":"65317","desc":"57943"},{"messageId":"57938","fix":"65318","desc":"57940"},{"messageId":"57941","fix":"65319","desc":"57943"},{"messageId":"57938","fix":"65320","desc":"57940"},{"messageId":"57941","fix":"65321","desc":"57943"},{"messageId":"57938","fix":"65322","desc":"57940"},{"messageId":"57941","fix":"65323","desc":"57943"},{"messageId":"57938","fix":"65324","desc":"57940"},{"messageId":"57941","fix":"65325","desc":"57943"},{"messageId":"57938","fix":"65326","desc":"57940"},{"messageId":"57941","fix":"65327","desc":"57943"},{"messageId":"57938","fix":"65328","desc":"57940"},{"messageId":"57941","fix":"65329","desc":"57943"},{"messageId":"57938","fix":"65330","desc":"57940"},{"messageId":"57941","fix":"65331","desc":"57943"},{"messageId":"57938","fix":"65332","desc":"57940"},{"messageId":"57941","fix":"65333","desc":"57943"},{"messageId":"57938","fix":"65334","desc":"57940"},{"messageId":"57941","fix":"65335","desc":"57943"},{"messageId":"57938","fix":"65336","desc":"57940"},{"messageId":"57941","fix":"65337","desc":"57943"},{"messageId":"57938","fix":"65338","desc":"57940"},{"messageId":"57941","fix":"65339","desc":"57943"},{"messageId":"57938","fix":"65340","desc":"57940"},{"messageId":"57941","fix":"65341","desc":"57943"},{"messageId":"57938","fix":"65342","desc":"57940"},{"messageId":"57941","fix":"65343","desc":"57943"},{"messageId":"57938","fix":"65344","desc":"57940"},{"messageId":"57941","fix":"65345","desc":"57943"},{"messageId":"57938","fix":"65346","desc":"57940"},{"messageId":"57941","fix":"65347","desc":"57943"},{"messageId":"57938","fix":"65348","desc":"57940"},{"messageId":"57941","fix":"65349","desc":"57943"},{"messageId":"57938","fix":"65350","desc":"57940"},{"messageId":"57941","fix":"65351","desc":"57943"},{"messageId":"57938","fix":"65352","desc":"57940"},{"messageId":"57941","fix":"65353","desc":"57943"},{"messageId":"57938","fix":"65354","desc":"57940"},{"messageId":"57941","fix":"65355","desc":"57943"},{"messageId":"57938","fix":"65356","desc":"57940"},{"messageId":"57941","fix":"65357","desc":"57943"},{"messageId":"57938","fix":"65358","desc":"57940"},{"messageId":"57941","fix":"65359","desc":"57943"},{"messageId":"57938","fix":"65360","desc":"57940"},{"messageId":"57941","fix":"65361","desc":"57943"},{"messageId":"57938","fix":"65362","desc":"57940"},{"messageId":"57941","fix":"65363","desc":"57943"},{"messageId":"57938","fix":"65364","desc":"57940"},{"messageId":"57941","fix":"65365","desc":"57943"},{"messageId":"57938","fix":"65366","desc":"57940"},{"messageId":"57941","fix":"65367","desc":"57943"},{"messageId":"57938","fix":"65368","desc":"57940"},{"messageId":"57941","fix":"65369","desc":"57943"},{"messageId":"57938","fix":"65370","desc":"57940"},{"messageId":"57941","fix":"65371","desc":"57943"},{"messageId":"57938","fix":"65372","desc":"57940"},{"messageId":"57941","fix":"65373","desc":"57943"},{"messageId":"57938","fix":"65374","desc":"57940"},{"messageId":"57941","fix":"65375","desc":"57943"},{"messageId":"57938","fix":"65376","desc":"57940"},{"messageId":"57941","fix":"65377","desc":"57943"},{"messageId":"57938","fix":"65378","desc":"57940"},{"messageId":"57941","fix":"65379","desc":"57943"},{"messageId":"57938","fix":"65380","desc":"57940"},{"messageId":"57941","fix":"65381","desc":"57943"},{"messageId":"57938","fix":"65382","desc":"57940"},{"messageId":"57941","fix":"65383","desc":"57943"},{"messageId":"57938","fix":"65384","desc":"57940"},{"messageId":"57941","fix":"65385","desc":"57943"},{"messageId":"57938","fix":"65386","desc":"57940"},{"messageId":"57941","fix":"65387","desc":"57943"},{"messageId":"57938","fix":"65388","desc":"57940"},{"messageId":"57941","fix":"65389","desc":"57943"},{"messageId":"57938","fix":"65390","desc":"57940"},{"messageId":"57941","fix":"65391","desc":"57943"},{"messageId":"57938","fix":"65392","desc":"57940"},{"messageId":"57941","fix":"65393","desc":"57943"},{"messageId":"57938","fix":"65394","desc":"57940"},{"messageId":"57941","fix":"65395","desc":"57943"},{"messageId":"57938","fix":"65396","desc":"57940"},{"messageId":"57941","fix":"65397","desc":"57943"},{"messageId":"57938","fix":"65398","desc":"57940"},{"messageId":"57941","fix":"65399","desc":"57943"},{"messageId":"57938","fix":"65400","desc":"57940"},{"messageId":"57941","fix":"65401","desc":"57943"},{"messageId":"57938","fix":"65402","desc":"57940"},{"messageId":"57941","fix":"65403","desc":"57943"},{"messageId":"57938","fix":"65404","desc":"57940"},{"messageId":"57941","fix":"65405","desc":"57943"},{"messageId":"57938","fix":"65406","desc":"57940"},{"messageId":"57941","fix":"65407","desc":"57943"},{"messageId":"57938","fix":"65408","desc":"57940"},{"messageId":"57941","fix":"65409","desc":"57943"},{"messageId":"57938","fix":"65410","desc":"57940"},{"messageId":"57941","fix":"65411","desc":"57943"},{"messageId":"57938","fix":"65412","desc":"57940"},{"messageId":"57941","fix":"65413","desc":"57943"},{"messageId":"57938","fix":"65414","desc":"57940"},{"messageId":"57941","fix":"65415","desc":"57943"},{"messageId":"57938","fix":"65416","desc":"57940"},{"messageId":"57941","fix":"65417","desc":"57943"},{"messageId":"57938","fix":"65418","desc":"57940"},{"messageId":"57941","fix":"65419","desc":"57943"},{"messageId":"57938","fix":"65420","desc":"57940"},{"messageId":"57941","fix":"65421","desc":"57943"},{"messageId":"57938","fix":"65422","desc":"57940"},{"messageId":"57941","fix":"65423","desc":"57943"},{"messageId":"57938","fix":"65424","desc":"57940"},{"messageId":"57941","fix":"65425","desc":"57943"},{"messageId":"57938","fix":"65426","desc":"57940"},{"messageId":"57941","fix":"65427","desc":"57943"},{"messageId":"57938","fix":"65428","desc":"57940"},{"messageId":"57941","fix":"65429","desc":"57943"},{"messageId":"57938","fix":"65430","desc":"57940"},{"messageId":"57941","fix":"65431","desc":"57943"},{"messageId":"57938","fix":"65432","desc":"57940"},{"messageId":"57941","fix":"65433","desc":"57943"},{"messageId":"57938","fix":"65434","desc":"57940"},{"messageId":"57941","fix":"65435","desc":"57943"},{"messageId":"57938","fix":"65436","desc":"57940"},{"messageId":"57941","fix":"65437","desc":"57943"},{"messageId":"57938","fix":"65438","desc":"57940"},{"messageId":"57941","fix":"65439","desc":"57943"},{"messageId":"57938","fix":"65440","desc":"57940"},{"messageId":"57941","fix":"65441","desc":"57943"},{"messageId":"57938","fix":"65442","desc":"57940"},{"messageId":"57941","fix":"65443","desc":"57943"},{"messageId":"57938","fix":"65444","desc":"57940"},{"messageId":"57941","fix":"65445","desc":"57943"},{"messageId":"57938","fix":"65446","desc":"57940"},{"messageId":"57941","fix":"65447","desc":"57943"},{"messageId":"57938","fix":"65448","desc":"57940"},{"messageId":"57941","fix":"65449","desc":"57943"},{"messageId":"57938","fix":"65450","desc":"57940"},{"messageId":"57941","fix":"65451","desc":"57943"},{"messageId":"57938","fix":"65452","desc":"57940"},{"messageId":"57941","fix":"65453","desc":"57943"},{"messageId":"57938","fix":"65454","desc":"57940"},{"messageId":"57941","fix":"65455","desc":"57943"},{"messageId":"57938","fix":"65456","desc":"57940"},{"messageId":"57941","fix":"65457","desc":"57943"},{"messageId":"57938","fix":"65458","desc":"57940"},{"messageId":"57941","fix":"65459","desc":"57943"},{"messageId":"57938","fix":"65460","desc":"57940"},{"messageId":"57941","fix":"65461","desc":"57943"},{"messageId":"57938","fix":"65462","desc":"57940"},{"messageId":"57941","fix":"65463","desc":"57943"},{"messageId":"57938","fix":"65464","desc":"57940"},{"messageId":"57941","fix":"65465","desc":"57943"},{"messageId":"57938","fix":"65466","desc":"57940"},{"messageId":"57941","fix":"65467","desc":"57943"},{"messageId":"57938","fix":"65468","desc":"57940"},{"messageId":"57941","fix":"65469","desc":"57943"},{"messageId":"57938","fix":"65470","desc":"57940"},{"messageId":"57941","fix":"65471","desc":"57943"},{"messageId":"57938","fix":"65472","desc":"57940"},{"messageId":"57941","fix":"65473","desc":"57943"},{"messageId":"57938","fix":"65474","desc":"57940"},{"messageId":"57941","fix":"65475","desc":"57943"},{"messageId":"57938","fix":"65476","desc":"57940"},{"messageId":"57941","fix":"65477","desc":"57943"},{"messageId":"57938","fix":"65478","desc":"57940"},{"messageId":"57941","fix":"65479","desc":"57943"},{"messageId":"57938","fix":"65480","desc":"57940"},{"messageId":"57941","fix":"65481","desc":"57943"},{"messageId":"57938","fix":"65482","desc":"57940"},{"messageId":"57941","fix":"65483","desc":"57943"},{"messageId":"57938","fix":"65484","desc":"57940"},{"messageId":"57941","fix":"65485","desc":"57943"},{"messageId":"57938","fix":"65486","desc":"57940"},{"messageId":"57941","fix":"65487","desc":"57943"},{"messageId":"57938","fix":"65488","desc":"57940"},{"messageId":"57941","fix":"65489","desc":"57943"},{"messageId":"57938","fix":"65490","desc":"57940"},{"messageId":"57941","fix":"65491","desc":"57943"},{"messageId":"57938","fix":"65492","desc":"57940"},{"messageId":"57941","fix":"65493","desc":"57943"},{"messageId":"57938","fix":"65494","desc":"57940"},{"messageId":"57941","fix":"65495","desc":"57943"},{"messageId":"57938","fix":"65496","desc":"57940"},{"messageId":"57941","fix":"65497","desc":"57943"},{"messageId":"57938","fix":"65498","desc":"57940"},{"messageId":"57941","fix":"65499","desc":"57943"},{"messageId":"57938","fix":"65500","desc":"57940"},{"messageId":"57941","fix":"65501","desc":"57943"},{"messageId":"57938","fix":"65502","desc":"57940"},{"messageId":"57941","fix":"65503","desc":"57943"},{"messageId":"57938","fix":"65504","desc":"57940"},{"messageId":"57941","fix":"65505","desc":"57943"},{"messageId":"57938","fix":"65506","desc":"57940"},{"messageId":"57941","fix":"65507","desc":"57943"},{"messageId":"57938","fix":"65508","desc":"57940"},{"messageId":"57941","fix":"65509","desc":"57943"},{"messageId":"57938","fix":"65510","desc":"57940"},{"messageId":"57941","fix":"65511","desc":"57943"},{"messageId":"57938","fix":"65512","desc":"57940"},{"messageId":"57941","fix":"65513","desc":"57943"},{"messageId":"57938","fix":"65514","desc":"57940"},{"messageId":"57941","fix":"65515","desc":"57943"},{"messageId":"57938","fix":"65516","desc":"57940"},{"messageId":"57941","fix":"65517","desc":"57943"},{"messageId":"57938","fix":"65518","desc":"57940"},{"messageId":"57941","fix":"65519","desc":"57943"},{"messageId":"57938","fix":"65520","desc":"57940"},{"messageId":"57941","fix":"65521","desc":"57943"},{"messageId":"57938","fix":"65522","desc":"57940"},{"messageId":"57941","fix":"65523","desc":"57943"},{"messageId":"57938","fix":"65524","desc":"57940"},{"messageId":"57941","fix":"65525","desc":"57943"},{"messageId":"57938","fix":"65526","desc":"57940"},{"messageId":"57941","fix":"65527","desc":"57943"},{"messageId":"57938","fix":"65528","desc":"57940"},{"messageId":"57941","fix":"65529","desc":"57943"},{"messageId":"57938","fix":"65530","desc":"57940"},{"messageId":"57941","fix":"65531","desc":"57943"},{"messageId":"57938","fix":"65532","desc":"57940"},{"messageId":"57941","fix":"65533","desc":"57943"},{"messageId":"57938","fix":"65534","desc":"57940"},{"messageId":"57941","fix":"65535","desc":"57943"},{"messageId":"57938","fix":"65536","desc":"57940"},{"messageId":"57941","fix":"65537","desc":"57943"},{"messageId":"57938","fix":"65538","desc":"57940"},{"messageId":"57941","fix":"65539","desc":"57943"},{"messageId":"57938","fix":"65540","desc":"57940"},{"messageId":"57941","fix":"65541","desc":"57943"},{"messageId":"57938","fix":"65542","desc":"57940"},{"messageId":"57941","fix":"65543","desc":"57943"},{"messageId":"57938","fix":"65544","desc":"57940"},{"messageId":"57941","fix":"65545","desc":"57943"},{"messageId":"57938","fix":"65546","desc":"57940"},{"messageId":"57941","fix":"65547","desc":"57943"},{"messageId":"57938","fix":"65548","desc":"57940"},{"messageId":"57941","fix":"65549","desc":"57943"},{"messageId":"57938","fix":"65550","desc":"57940"},{"messageId":"57941","fix":"65551","desc":"57943"},{"messageId":"57938","fix":"65552","desc":"57940"},{"messageId":"57941","fix":"65553","desc":"57943"},{"messageId":"57938","fix":"65554","desc":"57940"},{"messageId":"57941","fix":"65555","desc":"57943"},{"messageId":"57938","fix":"65556","desc":"57940"},{"messageId":"57941","fix":"65557","desc":"57943"},{"messageId":"57938","fix":"65558","desc":"57940"},{"messageId":"57941","fix":"65559","desc":"57943"},{"messageId":"57938","fix":"65560","desc":"57940"},{"messageId":"57941","fix":"65561","desc":"57943"},{"messageId":"57938","fix":"65562","desc":"57940"},{"messageId":"57941","fix":"65563","desc":"57943"},{"messageId":"57938","fix":"65564","desc":"57940"},{"messageId":"57941","fix":"65565","desc":"57943"},{"messageId":"57938","fix":"65566","desc":"57940"},{"messageId":"57941","fix":"65567","desc":"57943"},{"messageId":"57938","fix":"65568","desc":"57940"},{"messageId":"57941","fix":"65569","desc":"57943"},{"messageId":"57938","fix":"65570","desc":"57940"},{"messageId":"57941","fix":"65571","desc":"57943"},{"messageId":"57938","fix":"65572","desc":"57940"},{"messageId":"57941","fix":"65573","desc":"57943"},{"messageId":"57938","fix":"65574","desc":"57940"},{"messageId":"57941","fix":"65575","desc":"57943"},{"messageId":"57938","fix":"65576","desc":"57940"},{"messageId":"57941","fix":"65577","desc":"57943"},{"messageId":"57938","fix":"65578","desc":"57940"},{"messageId":"57941","fix":"65579","desc":"57943"},{"messageId":"57938","fix":"65580","desc":"57940"},{"messageId":"57941","fix":"65581","desc":"57943"},{"messageId":"57938","fix":"65582","desc":"57940"},{"messageId":"57941","fix":"65583","desc":"57943"},{"messageId":"57938","fix":"65584","desc":"57940"},{"messageId":"57941","fix":"65585","desc":"57943"},{"messageId":"57938","fix":"65586","desc":"57940"},{"messageId":"57941","fix":"65587","desc":"57943"},{"messageId":"57938","fix":"65588","desc":"57940"},{"messageId":"57941","fix":"65589","desc":"57943"},{"messageId":"57938","fix":"65590","desc":"57940"},{"messageId":"57941","fix":"65591","desc":"57943"},{"messageId":"57938","fix":"65592","desc":"57940"},{"messageId":"57941","fix":"65593","desc":"57943"},{"messageId":"57938","fix":"65594","desc":"57940"},{"messageId":"57941","fix":"65595","desc":"57943"},{"messageId":"57938","fix":"65596","desc":"57940"},{"messageId":"57941","fix":"65597","desc":"57943"},{"messageId":"57938","fix":"65598","desc":"57940"},{"messageId":"57941","fix":"65599","desc":"57943"},{"messageId":"57938","fix":"65600","desc":"57940"},{"messageId":"57941","fix":"65601","desc":"57943"},{"messageId":"57938","fix":"65602","desc":"57940"},{"messageId":"57941","fix":"65603","desc":"57943"},{"messageId":"57938","fix":"65604","desc":"57940"},{"messageId":"57941","fix":"65605","desc":"57943"},{"messageId":"57938","fix":"65606","desc":"57940"},{"messageId":"57941","fix":"65607","desc":"57943"},{"messageId":"57938","fix":"65608","desc":"57940"},{"messageId":"57941","fix":"65609","desc":"57943"},{"messageId":"57938","fix":"65610","desc":"57940"},{"messageId":"57941","fix":"65611","desc":"57943"},{"messageId":"57938","fix":"65612","desc":"57940"},{"messageId":"57941","fix":"65613","desc":"57943"},{"messageId":"57938","fix":"65614","desc":"57940"},{"messageId":"57941","fix":"65615","desc":"57943"},{"messageId":"57938","fix":"65616","desc":"57940"},{"messageId":"57941","fix":"65617","desc":"57943"},{"messageId":"57938","fix":"65618","desc":"57940"},{"messageId":"57941","fix":"65619","desc":"57943"},{"messageId":"57938","fix":"65620","desc":"57940"},{"messageId":"57941","fix":"65621","desc":"57943"},{"messageId":"57938","fix":"65622","desc":"57940"},{"messageId":"57941","fix":"65623","desc":"57943"},{"messageId":"57938","fix":"65624","desc":"57940"},{"messageId":"57941","fix":"65625","desc":"57943"},{"messageId":"57938","fix":"65626","desc":"57940"},{"messageId":"57941","fix":"65627","desc":"57943"},{"messageId":"57938","fix":"65628","desc":"57940"},{"messageId":"57941","fix":"65629","desc":"57943"},{"messageId":"57938","fix":"65630","desc":"57940"},{"messageId":"57941","fix":"65631","desc":"57943"},{"messageId":"57938","fix":"65632","desc":"57940"},{"messageId":"57941","fix":"65633","desc":"57943"},{"messageId":"57938","fix":"65634","desc":"57940"},{"messageId":"57941","fix":"65635","desc":"57943"},{"messageId":"57938","fix":"65636","desc":"57940"},{"messageId":"57941","fix":"65637","desc":"57943"},{"messageId":"57938","fix":"65638","desc":"57940"},{"messageId":"57941","fix":"65639","desc":"57943"},{"messageId":"57938","fix":"65640","desc":"57940"},{"messageId":"57941","fix":"65641","desc":"57943"},{"messageId":"57938","fix":"65642","desc":"57940"},{"messageId":"57941","fix":"65643","desc":"57943"},{"messageId":"57938","fix":"65644","desc":"57940"},{"messageId":"57941","fix":"65645","desc":"57943"},{"messageId":"57938","fix":"65646","desc":"57940"},{"messageId":"57941","fix":"65647","desc":"57943"},{"messageId":"57938","fix":"65648","desc":"57940"},{"messageId":"57941","fix":"65649","desc":"57943"},{"messageId":"57938","fix":"65650","desc":"57940"},{"messageId":"57941","fix":"65651","desc":"57943"},{"messageId":"57938","fix":"65652","desc":"57940"},{"messageId":"57941","fix":"65653","desc":"57943"},{"messageId":"57938","fix":"65654","desc":"57940"},{"messageId":"57941","fix":"65655","desc":"57943"},{"messageId":"57938","fix":"65656","desc":"57940"},{"messageId":"57941","fix":"65657","desc":"57943"},{"messageId":"57938","fix":"65658","desc":"57940"},{"messageId":"57941","fix":"65659","desc":"57943"},{"messageId":"57938","fix":"65660","desc":"57940"},{"messageId":"57941","fix":"65661","desc":"57943"},{"messageId":"57938","fix":"65662","desc":"57940"},{"messageId":"57941","fix":"65663","desc":"57943"},{"messageId":"57938","fix":"65664","desc":"57940"},{"messageId":"57941","fix":"65665","desc":"57943"},{"messageId":"57938","fix":"65666","desc":"57940"},{"messageId":"57941","fix":"65667","desc":"57943"},{"messageId":"57938","fix":"65668","desc":"57940"},{"messageId":"57941","fix":"65669","desc":"57943"},{"messageId":"57938","fix":"65670","desc":"57940"},{"messageId":"57941","fix":"65671","desc":"57943"},{"messageId":"57938","fix":"65672","desc":"57940"},{"messageId":"57941","fix":"65673","desc":"57943"},{"messageId":"57938","fix":"65674","desc":"57940"},{"messageId":"57941","fix":"65675","desc":"57943"},{"messageId":"57938","fix":"65676","desc":"57940"},{"messageId":"57941","fix":"65677","desc":"57943"},{"messageId":"57938","fix":"65678","desc":"57940"},{"messageId":"57941","fix":"65679","desc":"57943"},{"messageId":"57938","fix":"65680","desc":"57940"},{"messageId":"57941","fix":"65681","desc":"57943"},{"messageId":"57938","fix":"65682","desc":"57940"},{"messageId":"57941","fix":"65683","desc":"57943"},{"messageId":"57938","fix":"65684","desc":"57940"},{"messageId":"57941","fix":"65685","desc":"57943"},{"messageId":"57938","fix":"65686","desc":"57940"},{"messageId":"57941","fix":"65687","desc":"57943"},{"messageId":"57938","fix":"65688","desc":"57940"},{"messageId":"57941","fix":"65689","desc":"57943"},{"messageId":"57938","fix":"65690","desc":"57940"},{"messageId":"57941","fix":"65691","desc":"57943"},{"messageId":"57938","fix":"65692","desc":"57940"},{"messageId":"57941","fix":"65693","desc":"57943"},{"messageId":"57938","fix":"65694","desc":"57940"},{"messageId":"57941","fix":"65695","desc":"57943"},{"messageId":"57938","fix":"65696","desc":"57940"},{"messageId":"57941","fix":"65697","desc":"57943"},{"messageId":"57938","fix":"65698","desc":"57940"},{"messageId":"57941","fix":"65699","desc":"57943"},{"messageId":"57938","fix":"65700","desc":"57940"},{"messageId":"57941","fix":"65701","desc":"57943"},{"messageId":"57938","fix":"65702","desc":"57940"},{"messageId":"57941","fix":"65703","desc":"57943"},{"messageId":"57938","fix":"65704","desc":"57940"},{"messageId":"57941","fix":"65705","desc":"57943"},{"messageId":"57938","fix":"65706","desc":"57940"},{"messageId":"57941","fix":"65707","desc":"57943"},{"messageId":"57938","fix":"65708","desc":"57940"},{"messageId":"57941","fix":"65709","desc":"57943"},{"messageId":"57938","fix":"65710","desc":"57940"},{"messageId":"57941","fix":"65711","desc":"57943"},{"messageId":"57938","fix":"65712","desc":"57940"},{"messageId":"57941","fix":"65713","desc":"57943"},{"messageId":"57938","fix":"65714","desc":"57940"},{"messageId":"57941","fix":"65715","desc":"57943"},{"messageId":"57938","fix":"65716","desc":"57940"},{"messageId":"57941","fix":"65717","desc":"57943"},{"messageId":"57938","fix":"65718","desc":"57940"},{"messageId":"57941","fix":"65719","desc":"57943"},{"messageId":"57938","fix":"65720","desc":"57940"},{"messageId":"57941","fix":"65721","desc":"57943"},{"messageId":"57938","fix":"65722","desc":"57940"},{"messageId":"57941","fix":"65723","desc":"57943"},{"messageId":"57938","fix":"65724","desc":"57940"},{"messageId":"57941","fix":"65725","desc":"57943"},{"messageId":"57938","fix":"65726","desc":"57940"},{"messageId":"57941","fix":"65727","desc":"57943"},{"messageId":"57938","fix":"65728","desc":"57940"},{"messageId":"57941","fix":"65729","desc":"57943"},{"messageId":"57938","fix":"65730","desc":"57940"},{"messageId":"57941","fix":"65731","desc":"57943"},{"messageId":"57938","fix":"65732","desc":"57940"},{"messageId":"57941","fix":"65733","desc":"57943"},{"messageId":"57938","fix":"65734","desc":"57940"},{"messageId":"57941","fix":"65735","desc":"57943"},{"messageId":"57938","fix":"65736","desc":"57940"},{"messageId":"57941","fix":"65737","desc":"57943"},{"messageId":"57938","fix":"65738","desc":"57940"},{"messageId":"57941","fix":"65739","desc":"57943"},{"messageId":"57938","fix":"65740","desc":"57940"},{"messageId":"57941","fix":"65741","desc":"57943"},{"messageId":"57938","fix":"65742","desc":"57940"},{"messageId":"57941","fix":"65743","desc":"57943"},{"messageId":"57938","fix":"65744","desc":"57940"},{"messageId":"57941","fix":"65745","desc":"57943"},{"messageId":"57938","fix":"65746","desc":"57940"},{"messageId":"57941","fix":"65747","desc":"57943"},{"messageId":"57938","fix":"65748","desc":"57940"},{"messageId":"57941","fix":"65749","desc":"57943"},{"messageId":"57938","fix":"65750","desc":"57940"},{"messageId":"57941","fix":"65751","desc":"57943"},{"messageId":"57938","fix":"65752","desc":"57940"},{"messageId":"57941","fix":"65753","desc":"57943"},{"messageId":"57938","fix":"65754","desc":"57940"},{"messageId":"57941","fix":"65755","desc":"57943"},{"messageId":"57938","fix":"65756","desc":"57940"},{"messageId":"57941","fix":"65757","desc":"57943"},{"messageId":"57938","fix":"65758","desc":"57940"},{"messageId":"57941","fix":"65759","desc":"57943"},{"messageId":"57938","fix":"65760","desc":"57940"},{"messageId":"57941","fix":"65761","desc":"57943"},{"messageId":"57938","fix":"65762","desc":"57940"},{"messageId":"57941","fix":"65763","desc":"57943"},{"messageId":"57938","fix":"65764","desc":"57940"},{"messageId":"57941","fix":"65765","desc":"57943"},{"messageId":"57938","fix":"65766","desc":"57940"},{"messageId":"57941","fix":"65767","desc":"57943"},{"messageId":"57938","fix":"65768","desc":"57940"},{"messageId":"57941","fix":"65769","desc":"57943"},{"messageId":"57938","fix":"65770","desc":"57940"},{"messageId":"57941","fix":"65771","desc":"57943"},{"messageId":"57938","fix":"65772","desc":"57940"},{"messageId":"57941","fix":"65773","desc":"57943"},{"messageId":"57938","fix":"65774","desc":"57940"},{"messageId":"57941","fix":"65775","desc":"57943"},{"messageId":"57938","fix":"65776","desc":"57940"},{"messageId":"57941","fix":"65777","desc":"57943"},{"messageId":"57938","fix":"65778","desc":"57940"},{"messageId":"57941","fix":"65779","desc":"57943"},{"messageId":"57938","fix":"65780","desc":"57940"},{"messageId":"57941","fix":"65781","desc":"57943"},{"messageId":"57938","fix":"65782","desc":"57940"},{"messageId":"57941","fix":"65783","desc":"57943"},{"messageId":"57938","fix":"65784","desc":"57940"},{"messageId":"57941","fix":"65785","desc":"57943"},{"messageId":"57938","fix":"65786","desc":"57940"},{"messageId":"57941","fix":"65787","desc":"57943"},{"messageId":"57938","fix":"65788","desc":"57940"},{"messageId":"57941","fix":"65789","desc":"57943"},{"messageId":"57938","fix":"65790","desc":"57940"},{"messageId":"57941","fix":"65791","desc":"57943"},{"messageId":"57938","fix":"65792","desc":"57940"},{"messageId":"57941","fix":"65793","desc":"57943"},{"messageId":"57938","fix":"65794","desc":"57940"},{"messageId":"57941","fix":"65795","desc":"57943"},{"messageId":"57938","fix":"65796","desc":"57940"},{"messageId":"57941","fix":"65797","desc":"57943"},{"messageId":"57938","fix":"65798","desc":"57940"},{"messageId":"57941","fix":"65799","desc":"57943"},{"messageId":"57938","fix":"65800","desc":"57940"},{"messageId":"57941","fix":"65801","desc":"57943"},{"messageId":"57938","fix":"65802","desc":"57940"},{"messageId":"57941","fix":"65803","desc":"57943"},{"messageId":"57938","fix":"65804","desc":"57940"},{"messageId":"57941","fix":"65805","desc":"57943"},{"messageId":"57938","fix":"65806","desc":"57940"},{"messageId":"57941","fix":"65807","desc":"57943"},{"messageId":"57938","fix":"65808","desc":"57940"},{"messageId":"57941","fix":"65809","desc":"57943"},{"messageId":"57938","fix":"65810","desc":"57940"},{"messageId":"57941","fix":"65811","desc":"57943"},{"messageId":"57938","fix":"65812","desc":"57940"},{"messageId":"57941","fix":"65813","desc":"57943"},{"messageId":"57938","fix":"65814","desc":"57940"},{"messageId":"57941","fix":"65815","desc":"57943"},{"messageId":"57938","fix":"65816","desc":"57940"},{"messageId":"57941","fix":"65817","desc":"57943"},{"messageId":"57938","fix":"65818","desc":"57940"},{"messageId":"57941","fix":"65819","desc":"57943"},{"messageId":"57938","fix":"65820","desc":"57940"},{"messageId":"57941","fix":"65821","desc":"57943"},{"messageId":"57938","fix":"65822","desc":"57940"},{"messageId":"57941","fix":"65823","desc":"57943"},{"messageId":"57938","fix":"65824","desc":"57940"},{"messageId":"57941","fix":"65825","desc":"57943"},{"kind":"58246","justification":"58247"},{"kind":"58246","justification":"65826"},{"kind":"58246","justification":"65826"},{"kind":"58246","justification":"65827"},{"kind":"58246","justification":"65827"},{"kind":"58246","justification":"65827"},{"kind":"58246","justification":"65827"},{"kind":"58246","justification":"65827"},{"messageId":"57938","fix":"65828","desc":"57940"},{"messageId":"57941","fix":"65829","desc":"57943"},{"messageId":"57938","fix":"65830","desc":"57940"},{"messageId":"57941","fix":"65831","desc":"57943"},{"messageId":"57938","fix":"65832","desc":"57940"},{"messageId":"57941","fix":"65833","desc":"57943"},{"messageId":"57938","fix":"65834","desc":"57940"},{"messageId":"57941","fix":"65835","desc":"57943"},{"messageId":"57938","fix":"65836","desc":"57940"},{"messageId":"57941","fix":"65837","desc":"57943"},{"messageId":"57938","fix":"65838","desc":"57940"},{"messageId":"57941","fix":"65839","desc":"57943"},{"messageId":"57938","fix":"65840","desc":"57940"},{"messageId":"57941","fix":"65841","desc":"57943"},{"messageId":"57938","fix":"65842","desc":"57940"},{"messageId":"57941","fix":"65843","desc":"57943"},{"messageId":"57938","fix":"65844","desc":"57940"},{"messageId":"57941","fix":"65845","desc":"57943"},{"messageId":"57938","fix":"65846","desc":"57940"},{"messageId":"57941","fix":"65847","desc":"57943"},{"messageId":"57938","fix":"65848","desc":"57940"},{"messageId":"57941","fix":"65849","desc":"57943"},{"messageId":"57938","fix":"65850","desc":"57940"},{"messageId":"57941","fix":"65851","desc":"57943"},{"messageId":"57938","fix":"65852","desc":"57940"},{"messageId":"57941","fix":"65853","desc":"57943"},{"messageId":"57938","fix":"65854","desc":"57940"},{"messageId":"57941","fix":"65855","desc":"57943"},{"messageId":"57938","fix":"65856","desc":"57940"},{"messageId":"57941","fix":"65857","desc":"57943"},{"messageId":"57938","fix":"65858","desc":"57940"},{"messageId":"57941","fix":"65859","desc":"57943"},{"messageId":"57938","fix":"65860","desc":"57940"},{"messageId":"57941","fix":"65861","desc":"57943"},{"messageId":"57938","fix":"65862","desc":"57940"},{"messageId":"57941","fix":"65863","desc":"57943"},{"messageId":"57938","fix":"65864","desc":"57940"},{"messageId":"57941","fix":"65865","desc":"57943"},{"messageId":"57938","fix":"65866","desc":"57940"},{"messageId":"57941","fix":"65867","desc":"57943"},{"messageId":"57938","fix":"65868","desc":"57940"},{"messageId":"57941","fix":"65869","desc":"57943"},{"messageId":"57938","fix":"65870","desc":"57940"},{"messageId":"57941","fix":"65871","desc":"57943"},{"messageId":"57938","fix":"65872","desc":"57940"},{"messageId":"57941","fix":"65873","desc":"57943"},{"messageId":"57938","fix":"65874","desc":"57940"},{"messageId":"57941","fix":"65875","desc":"57943"},{"messageId":"57938","fix":"65876","desc":"57940"},{"messageId":"57941","fix":"65877","desc":"57943"},{"messageId":"57938","fix":"65878","desc":"57940"},{"messageId":"57941","fix":"65879","desc":"57943"},{"messageId":"57938","fix":"65880","desc":"57940"},{"messageId":"57941","fix":"65881","desc":"57943"},{"messageId":"57938","fix":"65882","desc":"57940"},{"messageId":"57941","fix":"65883","desc":"57943"},{"messageId":"57938","fix":"65884","desc":"57940"},{"messageId":"57941","fix":"65885","desc":"57943"},{"messageId":"57938","fix":"65886","desc":"57940"},{"messageId":"57941","fix":"65887","desc":"57943"},{"messageId":"57938","fix":"65888","desc":"57940"},{"messageId":"57941","fix":"65889","desc":"57943"},{"messageId":"57938","fix":"65890","desc":"57940"},{"messageId":"57941","fix":"65891","desc":"57943"},{"messageId":"57938","fix":"65892","desc":"57940"},{"messageId":"57941","fix":"65893","desc":"57943"},{"messageId":"57938","fix":"65894","desc":"57940"},{"messageId":"57941","fix":"65895","desc":"57943"},{"messageId":"57938","fix":"65896","desc":"57940"},{"messageId":"57941","fix":"65897","desc":"57943"},{"messageId":"57938","fix":"65898","desc":"57940"},{"messageId":"57941","fix":"65899","desc":"57943"},{"messageId":"57938","fix":"65900","desc":"57940"},{"messageId":"57941","fix":"65901","desc":"57943"},{"messageId":"57938","fix":"65902","desc":"57940"},{"messageId":"57941","fix":"65903","desc":"57943"},{"messageId":"57938","fix":"65904","desc":"57940"},{"messageId":"57941","fix":"65905","desc":"57943"},{"messageId":"57938","fix":"65906","desc":"57940"},{"messageId":"57941","fix":"65907","desc":"57943"},{"messageId":"57938","fix":"65908","desc":"57940"},{"messageId":"57941","fix":"65909","desc":"57943"},{"messageId":"57938","fix":"65910","desc":"57940"},{"messageId":"57941","fix":"65911","desc":"57943"},{"messageId":"57938","fix":"65912","desc":"57940"},{"messageId":"57941","fix":"65913","desc":"57943"},{"messageId":"57938","fix":"65914","desc":"57940"},{"messageId":"57941","fix":"65915","desc":"57943"},{"messageId":"57938","fix":"65916","desc":"57940"},{"messageId":"57941","fix":"65917","desc":"57943"},{"messageId":"57938","fix":"65918","desc":"57940"},{"messageId":"57941","fix":"65919","desc":"57943"},{"messageId":"57938","fix":"65920","desc":"57940"},{"messageId":"57941","fix":"65921","desc":"57943"},{"messageId":"57938","fix":"65922","desc":"57940"},{"messageId":"57941","fix":"65923","desc":"57943"},{"messageId":"57938","fix":"65924","desc":"57940"},{"messageId":"57941","fix":"65925","desc":"57943"},{"messageId":"57938","fix":"65926","desc":"57940"},{"messageId":"57941","fix":"65927","desc":"57943"},{"messageId":"57938","fix":"65928","desc":"57940"},{"messageId":"57941","fix":"65929","desc":"57943"},{"messageId":"57938","fix":"65930","desc":"57940"},{"messageId":"57941","fix":"65931","desc":"57943"},{"messageId":"57938","fix":"65932","desc":"57940"},{"messageId":"57941","fix":"65933","desc":"57943"},{"messageId":"57938","fix":"65934","desc":"57940"},{"messageId":"57941","fix":"65935","desc":"57943"},{"messageId":"57938","fix":"65936","desc":"57940"},{"messageId":"57941","fix":"65937","desc":"57943"},{"messageId":"57938","fix":"65938","desc":"57940"},{"messageId":"57941","fix":"65939","desc":"57943"},{"messageId":"57938","fix":"65940","desc":"57940"},{"messageId":"57941","fix":"65941","desc":"57943"},{"messageId":"57938","fix":"65942","desc":"57940"},{"messageId":"57941","fix":"65943","desc":"57943"},{"messageId":"57938","fix":"65944","desc":"57940"},{"messageId":"57941","fix":"65945","desc":"57943"},{"messageId":"57938","fix":"65946","desc":"57940"},{"messageId":"57941","fix":"65947","desc":"57943"},{"messageId":"57938","fix":"65948","desc":"57940"},{"messageId":"57941","fix":"65949","desc":"57943"},{"messageId":"57938","fix":"65950","desc":"57940"},{"messageId":"57941","fix":"65951","desc":"57943"},{"messageId":"57938","fix":"65952","desc":"57940"},{"messageId":"57941","fix":"65953","desc":"57943"},{"messageId":"57938","fix":"65954","desc":"57940"},{"messageId":"57941","fix":"65955","desc":"57943"},{"messageId":"57938","fix":"65956","desc":"57940"},{"messageId":"57941","fix":"65957","desc":"57943"},{"messageId":"57938","fix":"65958","desc":"57940"},{"messageId":"57941","fix":"65959","desc":"57943"},{"messageId":"57938","fix":"65960","desc":"57940"},{"messageId":"57941","fix":"65961","desc":"57943"},{"messageId":"57938","fix":"65962","desc":"57940"},{"messageId":"57941","fix":"65963","desc":"57943"},{"messageId":"57938","fix":"65964","desc":"57940"},{"messageId":"57941","fix":"65965","desc":"57943"},{"messageId":"57938","fix":"65966","desc":"57940"},{"messageId":"57941","fix":"65967","desc":"57943"},{"messageId":"57938","fix":"65968","desc":"57940"},{"messageId":"57941","fix":"65969","desc":"57943"},{"messageId":"57938","fix":"65970","desc":"57940"},{"messageId":"57941","fix":"65971","desc":"57943"},{"messageId":"57938","fix":"65972","desc":"57940"},{"messageId":"57941","fix":"65973","desc":"57943"},{"messageId":"57938","fix":"65974","desc":"57940"},{"messageId":"57941","fix":"65975","desc":"57943"},{"messageId":"57938","fix":"65976","desc":"57940"},{"messageId":"57941","fix":"65977","desc":"57943"},{"messageId":"57938","fix":"65978","desc":"57940"},{"messageId":"57941","fix":"65979","desc":"57943"},{"messageId":"57938","fix":"65980","desc":"57940"},{"messageId":"57941","fix":"65981","desc":"57943"},{"messageId":"57938","fix":"65982","desc":"57940"},{"messageId":"57941","fix":"65983","desc":"57943"},{"messageId":"57938","fix":"65984","desc":"57940"},{"messageId":"57941","fix":"65985","desc":"57943"},{"messageId":"57938","fix":"65986","desc":"57940"},{"messageId":"57941","fix":"65987","desc":"57943"},{"messageId":"57938","fix":"65988","desc":"57940"},{"messageId":"57941","fix":"65989","desc":"57943"},{"messageId":"57938","fix":"65990","desc":"57940"},{"messageId":"57941","fix":"65991","desc":"57943"},{"messageId":"57938","fix":"65992","desc":"57940"},{"messageId":"57941","fix":"65993","desc":"57943"},{"messageId":"57938","fix":"65994","desc":"57940"},{"messageId":"57941","fix":"65995","desc":"57943"},{"messageId":"57938","fix":"65996","desc":"57940"},{"messageId":"57941","fix":"65997","desc":"57943"},{"messageId":"57938","fix":"65998","desc":"57940"},{"messageId":"57941","fix":"65999","desc":"57943"},{"messageId":"57938","fix":"66000","desc":"57940"},{"messageId":"57941","fix":"66001","desc":"57943"},{"messageId":"57938","fix":"66002","desc":"57940"},{"messageId":"57941","fix":"66003","desc":"57943"},{"messageId":"57938","fix":"66004","desc":"57940"},{"messageId":"57941","fix":"66005","desc":"57943"},{"messageId":"57938","fix":"66006","desc":"57940"},{"messageId":"57941","fix":"66007","desc":"57943"},{"messageId":"57938","fix":"66008","desc":"57940"},{"messageId":"57941","fix":"66009","desc":"57943"},{"messageId":"57938","fix":"66010","desc":"57940"},{"messageId":"57941","fix":"66011","desc":"57943"},{"messageId":"57938","fix":"66012","desc":"57940"},{"messageId":"57941","fix":"66013","desc":"57943"},{"messageId":"57938","fix":"66014","desc":"57940"},{"messageId":"57941","fix":"66015","desc":"57943"},{"messageId":"57938","fix":"66016","desc":"57940"},{"messageId":"57941","fix":"66017","desc":"57943"},{"messageId":"57938","fix":"66018","desc":"57940"},{"messageId":"57941","fix":"66019","desc":"57943"},{"messageId":"57938","fix":"66020","desc":"57940"},{"messageId":"57941","fix":"66021","desc":"57943"},{"messageId":"57938","fix":"66022","desc":"57940"},{"messageId":"57941","fix":"66023","desc":"57943"},{"messageId":"57938","fix":"66024","desc":"57940"},{"messageId":"57941","fix":"66025","desc":"57943"},{"messageId":"57938","fix":"66026","desc":"57940"},{"messageId":"57941","fix":"66027","desc":"57943"},{"messageId":"57938","fix":"66028","desc":"57940"},{"messageId":"57941","fix":"66029","desc":"57943"},{"messageId":"57938","fix":"66030","desc":"57940"},{"messageId":"57941","fix":"66031","desc":"57943"},{"messageId":"57938","fix":"66032","desc":"57940"},{"messageId":"57941","fix":"66033","desc":"57943"},{"messageId":"57938","fix":"66034","desc":"57940"},{"messageId":"57941","fix":"66035","desc":"57943"},{"messageId":"57938","fix":"66036","desc":"57940"},{"messageId":"57941","fix":"66037","desc":"57943"},{"messageId":"57938","fix":"66038","desc":"57940"},{"messageId":"57941","fix":"66039","desc":"57943"},{"messageId":"57938","fix":"66040","desc":"57940"},{"messageId":"57941","fix":"66041","desc":"57943"},{"messageId":"57938","fix":"66042","desc":"57940"},{"messageId":"57941","fix":"66043","desc":"57943"},{"messageId":"57938","fix":"66044","desc":"57940"},{"messageId":"57941","fix":"66045","desc":"57943"},{"messageId":"57938","fix":"66046","desc":"57940"},{"messageId":"57941","fix":"66047","desc":"57943"},{"messageId":"57938","fix":"66048","desc":"57940"},{"messageId":"57941","fix":"66049","desc":"57943"},{"messageId":"57938","fix":"66050","desc":"57940"},{"messageId":"57941","fix":"66051","desc":"57943"},{"messageId":"57938","fix":"66052","desc":"57940"},{"messageId":"57941","fix":"66053","desc":"57943"},{"messageId":"57938","fix":"66054","desc":"57940"},{"messageId":"57941","fix":"66055","desc":"57943"},{"messageId":"57938","fix":"66056","desc":"57940"},{"messageId":"57941","fix":"66057","desc":"57943"},{"messageId":"57938","fix":"66058","desc":"57940"},{"messageId":"57941","fix":"66059","desc":"57943"},{"messageId":"57938","fix":"66060","desc":"57940"},{"messageId":"57941","fix":"66061","desc":"57943"},{"messageId":"57938","fix":"66062","desc":"57940"},{"messageId":"57941","fix":"66063","desc":"57943"},{"messageId":"57938","fix":"66064","desc":"57940"},{"messageId":"57941","fix":"66065","desc":"57943"},{"messageId":"57938","fix":"66066","desc":"57940"},{"messageId":"57941","fix":"66067","desc":"57943"},{"messageId":"57938","fix":"66068","desc":"57940"},{"messageId":"57941","fix":"66069","desc":"57943"},{"messageId":"57938","fix":"66070","desc":"57940"},{"messageId":"57941","fix":"66071","desc":"57943"},{"messageId":"57938","fix":"66072","desc":"57940"},{"messageId":"57941","fix":"66073","desc":"57943"},{"messageId":"57938","fix":"66074","desc":"57940"},{"messageId":"57941","fix":"66075","desc":"57943"},{"messageId":"57938","fix":"66076","desc":"57940"},{"messageId":"57941","fix":"66077","desc":"57943"},{"messageId":"57938","fix":"66078","desc":"57940"},{"messageId":"57941","fix":"66079","desc":"57943"},{"messageId":"57938","fix":"66080","desc":"57940"},{"messageId":"57941","fix":"66081","desc":"57943"},{"messageId":"57938","fix":"66082","desc":"57940"},{"messageId":"57941","fix":"66083","desc":"57943"},{"messageId":"57938","fix":"66084","desc":"57940"},{"messageId":"57941","fix":"66085","desc":"57943"},{"messageId":"57938","fix":"66086","desc":"57940"},{"messageId":"57941","fix":"66087","desc":"57943"},{"messageId":"57938","fix":"66088","desc":"57940"},{"messageId":"57941","fix":"66089","desc":"57943"},{"messageId":"57938","fix":"66090","desc":"57940"},{"messageId":"57941","fix":"66091","desc":"57943"},{"messageId":"57938","fix":"66092","desc":"57940"},{"messageId":"57941","fix":"66093","desc":"57943"},{"messageId":"57938","fix":"66094","desc":"57940"},{"messageId":"57941","fix":"66095","desc":"57943"},{"messageId":"57938","fix":"66096","desc":"57940"},{"messageId":"57941","fix":"66097","desc":"57943"},{"messageId":"57938","fix":"66098","desc":"57940"},{"messageId":"57941","fix":"66099","desc":"57943"},{"messageId":"57938","fix":"66100","desc":"57940"},{"messageId":"57941","fix":"66101","desc":"57943"},{"messageId":"57938","fix":"66102","desc":"57940"},{"messageId":"57941","fix":"66103","desc":"57943"},{"messageId":"57938","fix":"66104","desc":"57940"},{"messageId":"57941","fix":"66105","desc":"57943"},{"messageId":"57938","fix":"66106","desc":"57940"},{"messageId":"57941","fix":"66107","desc":"57943"},{"messageId":"57938","fix":"66108","desc":"57940"},{"messageId":"57941","fix":"66109","desc":"57943"},{"messageId":"57938","fix":"66110","desc":"57940"},{"messageId":"57941","fix":"66111","desc":"57943"},{"messageId":"57938","fix":"66112","desc":"57940"},{"messageId":"57941","fix":"66113","desc":"57943"},{"messageId":"57938","fix":"66114","desc":"57940"},{"messageId":"57941","fix":"66115","desc":"57943"},{"messageId":"57938","fix":"66116","desc":"57940"},{"messageId":"57941","fix":"66117","desc":"57943"},{"messageId":"57938","fix":"66118","desc":"57940"},{"messageId":"57941","fix":"66119","desc":"57943"},{"messageId":"57938","fix":"66120","desc":"57940"},{"messageId":"57941","fix":"66121","desc":"57943"},{"messageId":"57938","fix":"66122","desc":"57940"},{"messageId":"57941","fix":"66123","desc":"57943"},{"messageId":"57938","fix":"66124","desc":"57940"},{"messageId":"57941","fix":"66125","desc":"57943"},{"messageId":"57938","fix":"66126","desc":"57940"},{"messageId":"57941","fix":"66127","desc":"57943"},{"messageId":"57938","fix":"66128","desc":"57940"},{"messageId":"57941","fix":"66129","desc":"57943"},{"messageId":"57938","fix":"66130","desc":"57940"},{"messageId":"57941","fix":"66131","desc":"57943"},{"messageId":"57938","fix":"66132","desc":"57940"},{"messageId":"57941","fix":"66133","desc":"57943"},{"messageId":"57938","fix":"66134","desc":"57940"},{"messageId":"57941","fix":"66135","desc":"57943"},{"messageId":"57938","fix":"66136","desc":"57940"},{"messageId":"57941","fix":"66137","desc":"57943"},{"messageId":"57938","fix":"66138","desc":"57940"},{"messageId":"57941","fix":"66139","desc":"57943"},{"messageId":"57938","fix":"66140","desc":"57940"},{"messageId":"57941","fix":"66141","desc":"57943"},{"messageId":"57938","fix":"66142","desc":"57940"},{"messageId":"57941","fix":"66143","desc":"57943"},{"messageId":"57938","fix":"66144","desc":"57940"},{"messageId":"57941","fix":"66145","desc":"57943"},{"messageId":"57938","fix":"66146","desc":"57940"},{"messageId":"57941","fix":"66147","desc":"57943"},{"messageId":"57938","fix":"66148","desc":"57940"},{"messageId":"57941","fix":"66149","desc":"57943"},{"messageId":"57938","fix":"66150","desc":"57940"},{"messageId":"57941","fix":"66151","desc":"57943"},{"messageId":"57938","fix":"66152","desc":"57940"},{"messageId":"57941","fix":"66153","desc":"57943"},{"messageId":"57938","fix":"66154","desc":"57940"},{"messageId":"57941","fix":"66155","desc":"57943"},{"messageId":"57938","fix":"66156","desc":"57940"},{"messageId":"57941","fix":"66157","desc":"57943"},{"messageId":"57938","fix":"66158","desc":"57940"},{"messageId":"57941","fix":"66159","desc":"57943"},{"messageId":"57938","fix":"66160","desc":"57940"},{"messageId":"57941","fix":"66161","desc":"57943"},{"messageId":"57938","fix":"66162","desc":"57940"},{"messageId":"57941","fix":"66163","desc":"57943"},{"messageId":"57938","fix":"66164","desc":"57940"},{"messageId":"57941","fix":"66165","desc":"57943"},{"messageId":"57938","fix":"66166","desc":"57940"},{"messageId":"57941","fix":"66167","desc":"57943"},{"messageId":"57938","fix":"66168","desc":"57940"},{"messageId":"57941","fix":"66169","desc":"57943"},{"messageId":"57938","fix":"66170","desc":"57940"},{"messageId":"57941","fix":"66171","desc":"57943"},{"messageId":"57938","fix":"66172","desc":"57940"},{"messageId":"57941","fix":"66173","desc":"57943"},{"messageId":"57938","fix":"66174","desc":"57940"},{"messageId":"57941","fix":"66175","desc":"57943"},{"messageId":"57938","fix":"66176","desc":"57940"},{"messageId":"57941","fix":"66177","desc":"57943"},{"messageId":"57938","fix":"66178","desc":"57940"},{"messageId":"57941","fix":"66179","desc":"57943"},{"messageId":"57938","fix":"66180","desc":"57940"},{"messageId":"57941","fix":"66181","desc":"57943"},{"messageId":"57938","fix":"66182","desc":"57940"},{"messageId":"57941","fix":"66183","desc":"57943"},{"messageId":"57938","fix":"66184","desc":"57940"},{"messageId":"57941","fix":"66185","desc":"57943"},{"messageId":"57938","fix":"66186","desc":"57940"},{"messageId":"57941","fix":"66187","desc":"57943"},{"messageId":"57938","fix":"66188","desc":"57940"},{"messageId":"57941","fix":"66189","desc":"57943"},{"messageId":"57938","fix":"66190","desc":"57940"},{"messageId":"57941","fix":"66191","desc":"57943"},{"messageId":"57938","fix":"66192","desc":"57940"},{"messageId":"57941","fix":"66193","desc":"57943"},{"messageId":"57938","fix":"66194","desc":"57940"},{"messageId":"57941","fix":"66195","desc":"57943"},{"messageId":"57938","fix":"66196","desc":"57940"},{"messageId":"57941","fix":"66197","desc":"57943"},"suggestUnknown",{"range":"66198","text":"66199"},"Use `unknown` instead, this will force you to explicitly, and safely assert the type is correct.","suggestNever",{"range":"66200","text":"66201"},"Use `never` instead, this is useful when instantiating generic type parameters that you don't need to know the type of.",{"range":"66202","text":"66199"},{"range":"66203","text":"66201"},{"range":"66204","text":"66199"},{"range":"66205","text":"66201"},{"range":"66206","text":"66199"},{"range":"66207","text":"66201"},{"range":"66208","text":"66199"},{"range":"66209","text":"66201"},{"range":"66210","text":"66199"},{"range":"66211","text":"66201"},{"range":"66212","text":"66199"},{"range":"66213","text":"66201"},{"range":"66214","text":"66199"},{"range":"66215","text":"66201"},{"range":"66216","text":"66199"},{"range":"66217","text":"66201"},{"range":"66218","text":"66199"},{"range":"66219","text":"66201"},{"range":"66220","text":"66199"},{"range":"66221","text":"66201"},{"range":"66222","text":"66199"},{"range":"66223","text":"66201"},{"range":"66224","text":"66199"},{"range":"66225","text":"66201"},{"range":"66226","text":"66199"},{"range":"66227","text":"66201"},{"range":"66228","text":"66199"},{"range":"66229","text":"66201"},{"range":"66230","text":"66199"},{"range":"66231","text":"66201"},{"range":"66232","text":"66199"},{"range":"66233","text":"66201"},{"range":"66234","text":"66199"},{"range":"66235","text":"66201"},{"range":"66236","text":"66199"},{"range":"66237","text":"66201"},{"range":"66238","text":"66199"},{"range":"66239","text":"66201"},{"range":"66240","text":"66199"},{"range":"66241","text":"66201"},{"range":"66242","text":"66199"},{"range":"66243","text":"66201"},{"range":"66244","text":"66199"},{"range":"66245","text":"66201"},{"range":"66246","text":"66199"},{"range":"66247","text":"66201"},{"range":"66248","text":"66199"},{"range":"66249","text":"66201"},{"range":"66250","text":"66199"},{"range":"66251","text":"66201"},{"range":"66252","text":"66199"},{"range":"66253","text":"66201"},{"range":"66254","text":"66199"},{"range":"66255","text":"66201"},{"range":"66256","text":"66199"},{"range":"66257","text":"66201"},{"range":"66258","text":"66199"},{"range":"66259","text":"66201"},{"range":"66260","text":"66199"},{"range":"66261","text":"66201"},{"range":"66262","text":"66199"},{"range":"66263","text":"66201"},{"range":"66264","text":"66199"},{"range":"66265","text":"66201"},{"range":"66266","text":"66199"},{"range":"66267","text":"66201"},{"range":"66268","text":"66199"},{"range":"66269","text":"66201"},{"range":"66270","text":"66199"},{"range":"66271","text":"66201"},{"range":"66272","text":"66199"},{"range":"66273","text":"66201"},{"range":"66274","text":"66199"},{"range":"66275","text":"66201"},{"range":"66276","text":"66199"},{"range":"66277","text":"66201"},{"range":"66278","text":"66199"},{"range":"66279","text":"66201"},{"range":"66280","text":"66199"},{"range":"66281","text":"66201"},{"range":"66282","text":"66199"},{"range":"66283","text":"66201"},{"range":"66284","text":"66199"},{"range":"66285","text":"66201"},{"range":"66286","text":"66199"},{"range":"66287","text":"66201"},{"range":"66288","text":"66199"},{"range":"66289","text":"66201"},{"range":"66290","text":"66199"},{"range":"66291","text":"66201"},{"range":"66292","text":"66199"},{"range":"66293","text":"66201"},{"range":"66294","text":"66199"},{"range":"66295","text":"66201"},{"range":"66296","text":"66199"},{"range":"66297","text":"66201"},{"range":"66298","text":"66199"},{"range":"66299","text":"66201"},{"range":"66300","text":"66199"},{"range":"66301","text":"66201"},{"range":"66302","text":"66199"},{"range":"66303","text":"66201"},{"range":"66304","text":"66199"},{"range":"66305","text":"66201"},{"range":"66306","text":"66199"},{"range":"66307","text":"66201"},{"range":"66308","text":"66199"},{"range":"66309","text":"66201"},{"range":"66310","text":"66199"},{"range":"66311","text":"66201"},{"range":"66312","text":"66199"},{"range":"66313","text":"66201"},{"range":"66314","text":"66199"},{"range":"66315","text":"66201"},{"range":"66316","text":"66199"},{"range":"66317","text":"66201"},{"range":"66318","text":"66199"},{"range":"66319","text":"66201"},{"range":"66320","text":"66199"},{"range":"66321","text":"66201"},{"range":"66322","text":"66199"},{"range":"66323","text":"66201"},{"range":"66324","text":"66199"},{"range":"66325","text":"66201"},{"range":"66326","text":"66199"},{"range":"66327","text":"66201"},{"range":"66328","text":"66199"},{"range":"66329","text":"66201"},{"range":"66330","text":"66199"},{"range":"66331","text":"66201"},{"range":"66332","text":"66199"},{"range":"66333","text":"66201"},{"range":"66334","text":"66199"},{"range":"66335","text":"66201"},{"range":"66336","text":"66199"},{"range":"66337","text":"66201"},{"range":"66338","text":"66199"},{"range":"66339","text":"66201"},{"range":"66340","text":"66199"},{"range":"66341","text":"66201"},{"range":"66342","text":"66199"},{"range":"66343","text":"66201"},{"range":"66344","text":"66199"},{"range":"66345","text":"66201"},{"range":"66346","text":"66199"},{"range":"66347","text":"66201"},{"range":"66348","text":"66199"},{"range":"66349","text":"66201"},{"range":"66350","text":"66199"},{"range":"66351","text":"66201"},{"range":"66352","text":"66199"},{"range":"66353","text":"66201"},{"range":"66354","text":"66199"},{"range":"66355","text":"66201"},{"range":"66356","text":"66199"},{"range":"66357","text":"66201"},{"range":"66358","text":"66199"},{"range":"66359","text":"66201"},{"range":"66360","text":"66199"},{"range":"66361","text":"66201"},{"range":"66362","text":"66199"},{"range":"66363","text":"66201"},{"range":"66364","text":"66199"},{"range":"66365","text":"66201"},{"range":"66366","text":"66199"},{"range":"66367","text":"66201"},{"range":"66368","text":"66199"},{"range":"66369","text":"66201"},{"range":"66370","text":"66199"},{"range":"66371","text":"66201"},{"range":"66372","text":"66199"},{"range":"66373","text":"66201"},{"range":"66374","text":"66199"},{"range":"66375","text":"66201"},{"range":"66376","text":"66199"},{"range":"66377","text":"66201"},{"range":"66378","text":"66199"},{"range":"66379","text":"66201"},{"range":"66380","text":"66199"},{"range":"66381","text":"66201"},{"range":"66382","text":"66199"},{"range":"66383","text":"66201"},{"range":"66384","text":"66199"},{"range":"66385","text":"66201"},{"range":"66386","text":"66199"},{"range":"66387","text":"66201"},{"range":"66388","text":"66199"},{"range":"66389","text":"66201"},{"range":"66390","text":"66199"},{"range":"66391","text":"66201"},{"range":"66392","text":"66199"},{"range":"66393","text":"66201"},{"range":"66394","text":"66199"},{"range":"66395","text":"66201"},{"range":"66396","text":"66199"},{"range":"66397","text":"66201"},{"range":"66398","text":"66199"},{"range":"66399","text":"66201"},{"range":"66400","text":"66199"},{"range":"66401","text":"66201"},{"range":"66402","text":"66199"},{"range":"66403","text":"66201"},{"range":"66404","text":"66199"},{"range":"66405","text":"66201"},{"range":"66406","text":"66199"},{"range":"66407","text":"66201"},{"range":"66408","text":"66199"},{"range":"66409","text":"66201"},{"range":"66410","text":"66199"},{"range":"66411","text":"66201"},{"range":"66412","text":"66199"},{"range":"66413","text":"66201"},{"range":"66414","text":"66199"},{"range":"66415","text":"66201"},{"range":"66416","text":"66199"},{"range":"66417","text":"66201"},{"range":"66418","text":"66199"},{"range":"66419","text":"66201"},{"range":"66420","text":"66199"},{"range":"66421","text":"66201"},{"range":"66422","text":"66199"},{"range":"66423","text":"66201"},{"range":"66424","text":"66199"},{"range":"66425","text":"66201"},{"range":"66426","text":"66199"},{"range":"66427","text":"66201"},{"range":"66428","text":"66199"},{"range":"66429","text":"66201"},{"range":"66430","text":"66199"},{"range":"66431","text":"66201"},{"range":"66432","text":"66199"},{"range":"66433","text":"66201"},{"range":"66434","text":"66199"},{"range":"66435","text":"66201"},{"range":"66436","text":"66199"},{"range":"66437","text":"66201"},{"range":"66438","text":"66199"},{"range":"66439","text":"66201"},{"range":"66440","text":"66199"},{"range":"66441","text":"66201"},{"range":"66442","text":"66199"},{"range":"66443","text":"66201"},{"range":"66444","text":"66199"},{"range":"66445","text":"66201"},{"range":"66446","text":"66199"},{"range":"66447","text":"66201"},{"range":"66448","text":"66199"},{"range":"66449","text":"66201"},{"range":"66450","text":"66199"},{"range":"66451","text":"66201"},{"range":"66452","text":"66199"},{"range":"66453","text":"66201"},{"range":"66454","text":"66199"},{"range":"66455","text":"66201"},{"range":"66456","text":"66199"},{"range":"66457","text":"66201"},{"range":"66458","text":"66199"},{"range":"66459","text":"66201"},{"range":"66460","text":"66199"},{"range":"66461","text":"66201"},{"range":"66462","text":"66199"},{"range":"66463","text":"66201"},{"range":"66464","text":"66199"},{"range":"66465","text":"66201"},{"range":"66466","text":"66199"},{"range":"66467","text":"66201"},{"range":"66468","text":"66199"},{"range":"66469","text":"66201"},{"range":"66470","text":"66199"},{"range":"66471","text":"66201"},{"range":"66472","text":"66199"},{"range":"66473","text":"66201"},{"range":"66474","text":"66199"},{"range":"66475","text":"66201"},{"range":"66476","text":"66199"},{"range":"66477","text":"66201"},{"range":"66478","text":"66199"},{"range":"66479","text":"66201"},{"range":"66480","text":"66199"},{"range":"66481","text":"66201"},{"range":"66482","text":"66199"},{"range":"66483","text":"66201"},{"range":"66484","text":"66199"},{"range":"66485","text":"66201"},{"range":"66486","text":"66199"},{"range":"66487","text":"66201"},{"range":"66488","text":"66199"},{"range":"66489","text":"66201"},{"range":"66490","text":"66199"},{"range":"66491","text":"66201"},{"range":"66492","text":"66199"},{"range":"66493","text":"66201"},{"range":"66494","text":"66199"},{"range":"66495","text":"66201"},{"range":"66496","text":"66199"},{"range":"66497","text":"66201"},{"range":"66498","text":"66199"},{"range":"66499","text":"66201"},{"range":"66500","text":"66199"},{"range":"66501","text":"66201"},{"range":"66502","text":"66199"},{"range":"66503","text":"66201"},"directive","",{"range":"66504","text":"66199"},{"range":"66505","text":"66201"},{"range":"66506","text":"66199"},{"range":"66507","text":"66201"},{"range":"66508","text":"66199"},{"range":"66509","text":"66201"},{"range":"66510","text":"66199"},{"range":"66511","text":"66201"},{"range":"66512","text":"66199"},{"range":"66513","text":"66201"},{"range":"66514","text":"66199"},{"range":"66515","text":"66201"},{"range":"66516","text":"66199"},{"range":"66517","text":"66201"},{"range":"66518","text":"66199"},{"range":"66519","text":"66201"},{"range":"66520","text":"66199"},{"range":"66521","text":"66201"},{"range":"66522","text":"66199"},{"range":"66523","text":"66201"},{"range":"66524","text":"66199"},{"range":"66525","text":"66201"},{"range":"66526","text":"66199"},{"range":"66527","text":"66201"},{"range":"66528","text":"66199"},{"range":"66529","text":"66201"},{"range":"66530","text":"66199"},{"range":"66531","text":"66201"},{"range":"66532","text":"66199"},{"range":"66533","text":"66201"},{"range":"66534","text":"66199"},{"range":"66535","text":"66201"},{"range":"66536","text":"66199"},{"range":"66537","text":"66201"},{"range":"66538","text":"66199"},{"range":"66539","text":"66201"},{"range":"66540","text":"66199"},{"range":"66541","text":"66201"},{"range":"66542","text":"66199"},{"range":"66543","text":"66201"},"Update the dependencies array to be: [versionInfo, platform]",{"range":"66544","text":"66545"},"Update the dependencies array to be: [fetchData]",{"range":"66546","text":"66547"},"initial dashboard load only","localStorage hydration, runs once","Update the dependencies array to be: [jsonl, endpoint, onResult, t]",{"range":"66548","text":"66549"},"teknik string kontrolü, kullanıcı metni araması değil","Update the dependencies array to be: [LOCAL_PROVIDERS]",{"range":"66550","text":"66551"},"Update the dependencies array to be: [isExpanded, loadSavedMappings, status]",{"range":"66552","text":"66553"},"data URI, no loader needed","Update the dependencies array to be: [plans, primaryConnectionId, selectedConn]",{"range":"66554","text":"66555"},"Update the dependencies array to be: [open, editPool, initialGroupId, editPoolExclusive, plans]",{"range":"66556","text":"66557"},"Update the dependencies array to be: [open, editPool, groups, groupId]",{"range":"66558","text":"66559"},"Update the dependencies array to be: [pools]",{"range":"66560","text":"66561"},"Update the dependencies array to be: [availableModels, configState, configState.model, setConfigState]",{"range":"66562","text":"66563"},"Update the dependencies array to be: [configState, reasoningSpec, reasoningSpec.show, setConfigState]",{"range":"66564","text":"66565"},"Wrap the definition of 'clearResults' in its own useCallback() Hook.",{"range":"66566","text":"66567"},"Update the dependencies array to be: [getUpstreamHeadersRecord, open, protocol]",{"range":"66568","text":"66569"},"see above","Update the dependencies array to be: [searchParams, setProviderDisplayMode]",{"range":"66570","text":"66571"},"Update the dependencies array to be: [searchParams, setActiveCategory, setActiveServiceKind, setModelSearchQuery, setSearchQuery, setShowFreeOnly]",{"range":"66572","text":"66573"},"Update the dependencies array to be: [L]",{"range":"66574","text":"66575"},"Update the dependencies array to be: [customThemeColor]",{"range":"66576","text":"66577"},"Update the dependencies array to be: [notify, t]",{"range":"66578","text":"66579"},"Update the dependencies array to be: [load, providerKey]",{"range":"66580","text":"66581"},"Update the dependencies array to be: [t]",{"range":"66582","text":"66583"},"async data fetch on filter change","Update the dependencies array to be: [forceOpen, onOpenChange]",{"range":"66584","text":"66585"},"Update the dependencies array to be: [defaultOpen, forceOpen, onOpenChange]",{"range":"66586","text":"66587"},"Update the dependencies array to be: [onFirstOpen]",{"range":"66588","text":"66589"},{"range":"66590","text":"66579"},"Update the dependencies array to be: [providers, activeSet, lastSet, errorSet]",{"range":"66591","text":"66592"},"Update the dependencies array to be: [apiKey, effectiveWsUrl, channels, autoReconnect, connection.reconnectAttempt]",{"range":"66593","text":"66594"},"Update the dependencies array to be: [isOpen, t]",{"range":"66595","text":"66596"},"Update the dependencies array to be: [router]",{"range":"66597","text":"66598"},"Update the dependencies array to be: [isOpen, activeProviders, fetchProviderModels]",{"range":"66599","text":"66600"},"operator-supplied remote URL, not a static/known asset","external SVG from thesvg.org, not a static/known asset","Update the dependencies array to be: [isOpen, level, levelId, resetFields, t]",{"range":"66601","text":"66602"},"Update the dependencies array to be: [columnSortMap]",{"range":"66603","text":"66604"},"Update the dependencies array to be: [columnSortMap, sortBy]",{"range":"66605","text":"66606"},"Wrap the definition of 'openDetail' in its own useCallback() Hook.",{"range":"66607","text":"66608"},"Update the dependencies array to be: [initialSelectedId, openDetail]",{"range":"66609","text":"66610"},"Update the dependencies array to be: [closeDetail, currentLogIndex, openDetail, sortedLogsForNav]",{"range":"66611","text":"66612"},{"range":"66613","text":"66612"},"Update the dependencies array to be: [activeHref, collapsed, pinnedSections, sidebarExpansionLoaded, visibleSections]",{"range":"66614","text":"66615"},{"range":"66616","text":"66199"},{"range":"66617","text":"66201"},{"range":"66618","text":"66199"},{"range":"66619","text":"66201"},{"range":"66620","text":"66199"},{"range":"66621","text":"66201"},{"range":"66622","text":"66199"},{"range":"66623","text":"66201"},{"range":"66624","text":"66199"},{"range":"66625","text":"66201"},{"range":"66626","text":"66199"},{"range":"66627","text":"66201"},{"range":"66628","text":"66199"},{"range":"66629","text":"66201"},{"range":"66630","text":"66199"},{"range":"66631","text":"66201"},{"range":"66632","text":"66199"},{"range":"66633","text":"66201"},{"range":"66634","text":"66199"},{"range":"66635","text":"66201"},{"range":"66636","text":"66199"},{"range":"66637","text":"66201"},{"range":"66638","text":"66199"},{"range":"66639","text":"66201"},{"range":"66640","text":"66199"},{"range":"66641","text":"66201"},{"range":"66642","text":"66199"},{"range":"66643","text":"66201"},{"range":"66644","text":"66199"},{"range":"66645","text":"66201"},{"range":"66646","text":"66199"},{"range":"66647","text":"66201"},{"range":"66648","text":"66199"},{"range":"66649","text":"66201"},{"range":"66650","text":"66199"},{"range":"66651","text":"66201"},{"range":"66652","text":"66199"},{"range":"66653","text":"66201"},{"range":"66654","text":"66199"},{"range":"66655","text":"66201"},{"range":"66656","text":"66199"},{"range":"66657","text":"66201"},{"range":"66658","text":"66199"},{"range":"66659","text":"66201"},{"range":"66660","text":"66199"},{"range":"66661","text":"66201"},{"range":"66662","text":"66199"},{"range":"66663","text":"66201"},{"range":"66664","text":"66199"},{"range":"66665","text":"66201"},{"range":"66666","text":"66199"},{"range":"66667","text":"66201"},{"range":"66668","text":"66199"},{"range":"66669","text":"66201"},{"range":"66670","text":"66199"},{"range":"66671","text":"66201"},{"range":"66672","text":"66199"},{"range":"66673","text":"66201"},{"range":"66674","text":"66199"},{"range":"66675","text":"66201"},{"range":"66676","text":"66199"},{"range":"66677","text":"66201"},{"range":"66678","text":"66199"},{"range":"66679","text":"66201"},{"range":"66680","text":"66199"},{"range":"66681","text":"66201"},{"range":"66682","text":"66199"},{"range":"66683","text":"66201"},{"range":"66684","text":"66199"},{"range":"66685","text":"66201"},{"range":"66686","text":"66199"},{"range":"66687","text":"66201"},{"range":"66688","text":"66199"},{"range":"66689","text":"66201"},{"range":"66690","text":"66199"},{"range":"66691","text":"66201"},{"range":"66692","text":"66199"},{"range":"66693","text":"66201"},{"range":"66694","text":"66199"},{"range":"66695","text":"66201"},{"range":"66696","text":"66199"},{"range":"66697","text":"66201"},{"range":"66698","text":"66199"},{"range":"66699","text":"66201"},{"range":"66700","text":"66199"},{"range":"66701","text":"66201"},{"range":"66702","text":"66199"},{"range":"66703","text":"66201"},{"range":"66704","text":"66199"},{"range":"66705","text":"66201"},{"range":"66706","text":"66199"},{"range":"66707","text":"66201"},{"range":"66708","text":"66199"},{"range":"66709","text":"66201"},{"range":"66710","text":"66199"},{"range":"66711","text":"66201"},{"range":"66712","text":"66199"},{"range":"66713","text":"66201"},{"range":"66714","text":"66199"},{"range":"66715","text":"66201"},{"range":"66716","text":"66199"},{"range":"66717","text":"66201"},{"range":"66718","text":"66199"},{"range":"66719","text":"66201"},{"range":"66720","text":"66199"},{"range":"66721","text":"66201"},{"range":"66722","text":"66199"},{"range":"66723","text":"66201"},{"range":"66724","text":"66199"},{"range":"66725","text":"66201"},{"range":"66726","text":"66199"},{"range":"66727","text":"66201"},{"range":"66728","text":"66199"},{"range":"66729","text":"66201"},{"range":"66730","text":"66199"},{"range":"66731","text":"66201"},{"range":"66732","text":"66199"},{"range":"66733","text":"66201"},{"range":"66734","text":"66199"},{"range":"66735","text":"66201"},{"range":"66736","text":"66199"},{"range":"66737","text":"66201"},{"range":"66738","text":"66199"},{"range":"66739","text":"66201"},{"range":"66740","text":"66199"},{"range":"66741","text":"66201"},{"range":"66742","text":"66199"},{"range":"66743","text":"66201"},{"range":"66744","text":"66199"},{"range":"66745","text":"66201"},{"range":"66746","text":"66199"},{"range":"66747","text":"66201"},{"range":"66748","text":"66199"},{"range":"66749","text":"66201"},{"range":"66750","text":"66199"},{"range":"66751","text":"66201"},{"range":"66752","text":"66199"},{"range":"66753","text":"66201"},{"range":"66754","text":"66199"},{"range":"66755","text":"66201"},{"range":"66756","text":"66199"},{"range":"66757","text":"66201"},{"range":"66758","text":"66199"},{"range":"66759","text":"66201"},{"range":"66760","text":"66199"},{"range":"66761","text":"66201"},{"range":"66762","text":"66199"},{"range":"66763","text":"66201"},{"range":"66764","text":"66199"},{"range":"66765","text":"66201"},{"range":"66766","text":"66199"},{"range":"66767","text":"66201"},{"range":"66768","text":"66199"},{"range":"66769","text":"66201"},{"range":"66770","text":"66199"},{"range":"66771","text":"66201"},{"range":"66772","text":"66199"},{"range":"66773","text":"66201"},{"range":"66774","text":"66199"},{"range":"66775","text":"66201"},{"range":"66776","text":"66199"},{"range":"66777","text":"66201"},{"range":"66778","text":"66199"},{"range":"66779","text":"66201"},{"range":"66780","text":"66199"},{"range":"66781","text":"66201"},{"range":"66782","text":"66199"},{"range":"66783","text":"66201"},{"range":"66784","text":"66199"},{"range":"66785","text":"66201"},{"range":"66786","text":"66199"},{"range":"66787","text":"66201"},{"range":"66788","text":"66199"},{"range":"66789","text":"66201"},{"range":"66790","text":"66199"},{"range":"66791","text":"66201"},{"range":"66792","text":"66199"},{"range":"66793","text":"66201"},{"range":"66794","text":"66199"},{"range":"66795","text":"66201"},{"range":"66796","text":"66199"},{"range":"66797","text":"66201"},{"range":"66798","text":"66199"},{"range":"66799","text":"66201"},{"range":"66800","text":"66199"},{"range":"66801","text":"66201"},{"range":"66802","text":"66199"},{"range":"66803","text":"66201"},{"range":"66804","text":"66199"},{"range":"66805","text":"66201"},{"range":"66806","text":"66199"},{"range":"66807","text":"66201"},{"range":"66808","text":"66199"},{"range":"66809","text":"66201"},{"range":"66810","text":"66199"},{"range":"66811","text":"66201"},{"range":"66812","text":"66199"},{"range":"66813","text":"66201"},{"range":"66814","text":"66199"},{"range":"66815","text":"66201"},{"range":"66816","text":"66199"},{"range":"66817","text":"66201"},{"range":"66818","text":"66199"},{"range":"66819","text":"66201"},{"range":"66820","text":"66199"},{"range":"66821","text":"66201"},{"range":"66822","text":"66199"},{"range":"66823","text":"66201"},{"range":"66824","text":"66199"},{"range":"66825","text":"66201"},{"range":"66826","text":"66199"},{"range":"66827","text":"66201"},{"range":"66828","text":"66199"},{"range":"66829","text":"66201"},{"range":"66830","text":"66199"},{"range":"66831","text":"66201"},{"range":"66832","text":"66199"},{"range":"66833","text":"66201"},{"range":"66834","text":"66199"},{"range":"66835","text":"66201"},{"range":"66836","text":"66199"},{"range":"66837","text":"66201"},{"range":"66838","text":"66199"},{"range":"66839","text":"66201"},{"range":"66840","text":"66199"},{"range":"66841","text":"66201"},{"range":"66842","text":"66199"},{"range":"66843","text":"66201"},{"range":"66844","text":"66199"},{"range":"66845","text":"66201"},{"range":"66846","text":"66199"},{"range":"66847","text":"66201"},{"range":"66848","text":"66199"},{"range":"66849","text":"66201"},{"range":"66850","text":"66199"},{"range":"66851","text":"66201"},{"range":"66852","text":"66199"},{"range":"66853","text":"66201"},{"range":"66854","text":"66199"},{"range":"66855","text":"66201"},{"range":"66856","text":"66199"},{"range":"66857","text":"66201"},{"range":"66858","text":"66199"},{"range":"66859","text":"66201"},{"range":"66860","text":"66199"},{"range":"66861","text":"66201"},{"range":"66862","text":"66199"},{"range":"66863","text":"66201"},{"range":"66864","text":"66199"},{"range":"66865","text":"66201"},{"range":"66866","text":"66199"},{"range":"66867","text":"66201"},{"range":"66868","text":"66199"},{"range":"66869","text":"66201"},{"range":"66870","text":"66199"},{"range":"66871","text":"66201"},{"range":"66872","text":"66199"},{"range":"66873","text":"66201"},{"range":"66874","text":"66199"},{"range":"66875","text":"66201"},{"range":"66876","text":"66199"},{"range":"66877","text":"66201"},{"range":"66878","text":"66199"},{"range":"66879","text":"66201"},{"range":"66880","text":"66199"},{"range":"66881","text":"66201"},{"range":"66882","text":"66199"},{"range":"66883","text":"66201"},{"range":"66884","text":"66199"},{"range":"66885","text":"66201"},{"range":"66886","text":"66199"},{"range":"66887","text":"66201"},{"range":"66888","text":"66199"},{"range":"66889","text":"66201"},{"range":"66890","text":"66199"},{"range":"66891","text":"66201"},{"range":"66892","text":"66199"},{"range":"66893","text":"66201"},{"range":"66894","text":"66199"},{"range":"66895","text":"66201"},{"range":"66896","text":"66199"},{"range":"66897","text":"66201"},{"range":"66898","text":"66199"},{"range":"66899","text":"66201"},{"range":"66900","text":"66199"},{"range":"66901","text":"66201"},{"range":"66902","text":"66199"},{"range":"66903","text":"66201"},{"range":"66904","text":"66199"},{"range":"66905","text":"66201"},{"range":"66906","text":"66199"},{"range":"66907","text":"66201"},{"range":"66908","text":"66199"},{"range":"66909","text":"66201"},{"range":"66910","text":"66199"},{"range":"66911","text":"66201"},{"range":"66912","text":"66199"},{"range":"66913","text":"66201"},{"range":"66914","text":"66199"},{"range":"66915","text":"66201"},{"range":"66916","text":"66199"},{"range":"66917","text":"66201"},{"range":"66918","text":"66199"},{"range":"66919","text":"66201"},{"range":"66920","text":"66199"},{"range":"66921","text":"66201"},{"range":"66922","text":"66199"},{"range":"66923","text":"66201"},{"range":"66924","text":"66199"},{"range":"66925","text":"66201"},{"range":"66926","text":"66199"},{"range":"66927","text":"66201"},{"range":"66928","text":"66199"},{"range":"66929","text":"66201"},{"range":"66930","text":"66199"},{"range":"66931","text":"66201"},{"range":"66932","text":"66199"},{"range":"66933","text":"66201"},{"range":"66934","text":"66199"},{"range":"66935","text":"66201"},{"range":"66936","text":"66199"},{"range":"66937","text":"66201"},{"range":"66938","text":"66199"},{"range":"66939","text":"66201"},{"range":"66940","text":"66199"},{"range":"66941","text":"66201"},{"range":"66942","text":"66199"},{"range":"66943","text":"66201"},{"range":"66944","text":"66199"},{"range":"66945","text":"66201"},{"range":"66946","text":"66199"},{"range":"66947","text":"66201"},{"range":"66948","text":"66199"},{"range":"66949","text":"66201"},{"range":"66950","text":"66199"},{"range":"66951","text":"66201"},{"range":"66952","text":"66199"},{"range":"66953","text":"66201"},{"range":"66954","text":"66199"},{"range":"66955","text":"66201"},{"range":"66956","text":"66199"},{"range":"66957","text":"66201"},{"range":"66958","text":"66199"},{"range":"66959","text":"66201"},{"range":"66960","text":"66199"},{"range":"66961","text":"66201"},{"range":"66962","text":"66199"},{"range":"66963","text":"66201"},{"range":"66964","text":"66199"},{"range":"66965","text":"66201"},{"range":"66966","text":"66199"},{"range":"66967","text":"66201"},{"range":"66968","text":"66199"},{"range":"66969","text":"66201"},{"range":"66970","text":"66199"},{"range":"66971","text":"66201"},{"range":"66972","text":"66199"},{"range":"66973","text":"66201"},{"range":"66974","text":"66199"},{"range":"66975","text":"66201"},{"range":"66976","text":"66199"},{"range":"66977","text":"66201"},{"range":"66978","text":"66199"},{"range":"66979","text":"66201"},{"range":"66980","text":"66199"},{"range":"66981","text":"66201"},{"range":"66982","text":"66199"},{"range":"66983","text":"66201"},{"range":"66984","text":"66199"},{"range":"66985","text":"66201"},{"range":"66986","text":"66199"},{"range":"66987","text":"66201"},{"range":"66988","text":"66199"},{"range":"66989","text":"66201"},{"range":"66990","text":"66199"},{"range":"66991","text":"66201"},{"range":"66992","text":"66199"},{"range":"66993","text":"66201"},{"range":"66994","text":"66199"},{"range":"66995","text":"66201"},{"range":"66996","text":"66199"},{"range":"66997","text":"66201"},{"range":"66998","text":"66199"},{"range":"66999","text":"66201"},{"range":"67000","text":"66199"},{"range":"67001","text":"66201"},{"range":"67002","text":"66199"},{"range":"67003","text":"66201"},{"range":"67004","text":"66199"},{"range":"67005","text":"66201"},{"range":"67006","text":"66199"},{"range":"67007","text":"66201"},{"range":"67008","text":"66199"},{"range":"67009","text":"66201"},{"range":"67010","text":"66199"},{"range":"67011","text":"66201"},{"range":"67012","text":"66199"},{"range":"67013","text":"66201"},{"range":"67014","text":"66199"},{"range":"67015","text":"66201"},{"range":"67016","text":"66199"},{"range":"67017","text":"66201"},{"range":"67018","text":"66199"},{"range":"67019","text":"66201"},{"range":"67020","text":"66199"},{"range":"67021","text":"66201"},{"range":"67022","text":"66199"},{"range":"67023","text":"66201"},{"range":"67024","text":"66199"},{"range":"67025","text":"66201"},{"range":"67026","text":"66199"},{"range":"67027","text":"66201"},{"range":"67028","text":"66199"},{"range":"67029","text":"66201"},{"range":"67030","text":"66199"},{"range":"67031","text":"66201"},{"range":"67032","text":"66199"},{"range":"67033","text":"66201"},{"range":"67034","text":"66199"},{"range":"67035","text":"66201"},{"range":"67036","text":"66199"},{"range":"67037","text":"66201"},{"range":"67038","text":"66199"},{"range":"67039","text":"66201"},{"range":"67040","text":"66199"},{"range":"67041","text":"66201"},{"range":"67042","text":"66199"},{"range":"67043","text":"66201"},{"range":"67044","text":"66199"},{"range":"67045","text":"66201"},{"range":"67046","text":"66199"},{"range":"67047","text":"66201"},{"range":"67048","text":"66199"},{"range":"67049","text":"66201"},{"range":"67050","text":"66199"},{"range":"67051","text":"66201"},{"range":"67052","text":"66199"},{"range":"67053","text":"66201"},{"range":"67054","text":"66199"},{"range":"67055","text":"66201"},{"range":"67056","text":"66199"},{"range":"67057","text":"66201"},{"range":"67058","text":"66199"},{"range":"67059","text":"66201"},{"range":"67060","text":"66199"},{"range":"67061","text":"66201"},{"range":"67062","text":"66199"},{"range":"67063","text":"66201"},{"range":"67064","text":"66199"},{"range":"67065","text":"66201"},{"range":"67066","text":"66199"},{"range":"67067","text":"66201"},{"range":"67068","text":"66199"},{"range":"67069","text":"66201"},{"range":"67070","text":"66199"},{"range":"67071","text":"66201"},{"range":"67072","text":"66199"},{"range":"67073","text":"66201"},{"range":"67074","text":"66199"},{"range":"67075","text":"66201"},{"range":"67076","text":"66199"},{"range":"67077","text":"66201"},{"range":"67078","text":"66199"},{"range":"67079","text":"66201"},{"range":"67080","text":"66199"},{"range":"67081","text":"66201"},{"range":"67082","text":"66199"},{"range":"67083","text":"66201"},{"range":"67084","text":"66199"},{"range":"67085","text":"66201"},{"range":"67086","text":"66199"},{"range":"67087","text":"66201"},{"range":"67088","text":"66199"},{"range":"67089","text":"66201"},{"range":"67090","text":"66199"},{"range":"67091","text":"66201"},{"range":"67092","text":"66199"},{"range":"67093","text":"66201"},{"range":"67094","text":"66199"},{"range":"67095","text":"66201"},{"range":"67096","text":"66199"},{"range":"67097","text":"66201"},{"range":"67098","text":"66199"},{"range":"67099","text":"66201"},{"range":"67100","text":"66199"},{"range":"67101","text":"66201"},{"range":"67102","text":"66199"},{"range":"67103","text":"66201"},{"range":"67104","text":"66199"},{"range":"67105","text":"66201"},{"range":"67106","text":"66199"},{"range":"67107","text":"66201"},{"range":"67108","text":"66199"},{"range":"67109","text":"66201"},{"range":"67110","text":"66199"},{"range":"67111","text":"66201"},{"range":"67112","text":"66199"},{"range":"67113","text":"66201"},{"range":"67114","text":"66199"},{"range":"67115","text":"66201"},{"range":"67116","text":"66199"},{"range":"67117","text":"66201"},{"range":"67118","text":"66199"},{"range":"67119","text":"66201"},{"range":"67120","text":"66199"},{"range":"67121","text":"66201"},{"range":"67122","text":"66199"},{"range":"67123","text":"66201"},{"range":"67124","text":"66199"},{"range":"67125","text":"66201"},{"range":"67126","text":"66199"},{"range":"67127","text":"66201"},{"range":"67128","text":"66199"},{"range":"67129","text":"66201"},{"range":"67130","text":"66199"},{"range":"67131","text":"66201"},{"range":"67132","text":"66199"},{"range":"67133","text":"66201"},{"range":"67134","text":"66199"},{"range":"67135","text":"66201"},{"range":"67136","text":"66199"},{"range":"67137","text":"66201"},{"range":"67138","text":"66199"},{"range":"67139","text":"66201"},{"range":"67140","text":"66199"},{"range":"67141","text":"66201"},{"range":"67142","text":"66199"},{"range":"67143","text":"66201"},{"range":"67144","text":"66199"},{"range":"67145","text":"66201"},{"range":"67146","text":"66199"},{"range":"67147","text":"66201"},{"range":"67148","text":"66199"},{"range":"67149","text":"66201"},{"range":"67150","text":"66199"},{"range":"67151","text":"66201"},{"range":"67152","text":"66199"},{"range":"67153","text":"66201"},{"range":"67154","text":"66199"},{"range":"67155","text":"66201"},{"range":"67156","text":"66199"},{"range":"67157","text":"66201"},{"range":"67158","text":"66199"},{"range":"67159","text":"66201"},{"range":"67160","text":"66199"},{"range":"67161","text":"66201"},{"range":"67162","text":"66199"},{"range":"67163","text":"66201"},{"range":"67164","text":"66199"},{"range":"67165","text":"66201"},{"range":"67166","text":"66199"},{"range":"67167","text":"66201"},{"range":"67168","text":"66199"},{"range":"67169","text":"66201"},{"range":"67170","text":"66199"},{"range":"67171","text":"66201"},{"range":"67172","text":"66199"},{"range":"67173","text":"66201"},{"range":"67174","text":"66199"},{"range":"67175","text":"66201"},{"range":"67176","text":"66199"},{"range":"67177","text":"66201"},{"range":"67178","text":"66199"},{"range":"67179","text":"66201"},{"range":"67180","text":"66199"},{"range":"67181","text":"66201"},{"range":"67182","text":"66199"},{"range":"67183","text":"66201"},{"range":"67184","text":"66199"},{"range":"67185","text":"66201"},{"range":"67186","text":"66199"},{"range":"67187","text":"66201"},{"range":"67188","text":"66199"},{"range":"67189","text":"66201"},{"range":"67190","text":"66199"},{"range":"67191","text":"66201"},{"range":"67192","text":"66199"},{"range":"67193","text":"66201"},{"range":"67194","text":"66199"},{"range":"67195","text":"66201"},{"range":"67196","text":"66199"},{"range":"67197","text":"66201"},{"range":"67198","text":"66199"},{"range":"67199","text":"66201"},{"range":"67200","text":"66199"},{"range":"67201","text":"66201"},{"range":"67202","text":"66199"},{"range":"67203","text":"66201"},{"range":"67204","text":"66199"},{"range":"67205","text":"66201"},{"range":"67206","text":"66199"},{"range":"67207","text":"66201"},{"range":"67208","text":"66199"},{"range":"67209","text":"66201"},{"range":"67210","text":"66199"},{"range":"67211","text":"66201"},{"range":"67212","text":"66199"},{"range":"67213","text":"66201"},{"range":"67214","text":"66199"},{"range":"67215","text":"66201"},{"range":"67216","text":"66199"},{"range":"67217","text":"66201"},{"range":"67218","text":"66199"},{"range":"67219","text":"66201"},{"range":"67220","text":"66199"},{"range":"67221","text":"66201"},{"range":"67222","text":"66199"},{"range":"67223","text":"66201"},{"range":"67224","text":"66199"},{"range":"67225","text":"66201"},{"range":"67226","text":"66199"},{"range":"67227","text":"66201"},{"range":"67228","text":"66199"},{"range":"67229","text":"66201"},{"range":"67230","text":"66199"},{"range":"67231","text":"66201"},{"range":"67232","text":"66199"},{"range":"67233","text":"66201"},{"range":"67234","text":"66199"},{"range":"67235","text":"66201"},{"range":"67236","text":"66199"},{"range":"67237","text":"66201"},{"range":"67238","text":"66199"},{"range":"67239","text":"66201"},{"range":"67240","text":"66199"},{"range":"67241","text":"66201"},{"range":"67242","text":"66199"},{"range":"67243","text":"66201"},{"range":"67244","text":"66199"},{"range":"67245","text":"66201"},{"range":"67246","text":"66199"},{"range":"67247","text":"66201"},{"range":"67248","text":"66199"},{"range":"67249","text":"66201"},{"range":"67250","text":"66199"},{"range":"67251","text":"66201"},{"range":"67252","text":"66199"},{"range":"67253","text":"66201"},{"range":"67254","text":"66199"},{"range":"67255","text":"66201"},{"range":"67256","text":"66199"},{"range":"67257","text":"66201"},{"range":"67258","text":"66199"},{"range":"67259","text":"66201"},{"range":"67260","text":"66199"},{"range":"67261","text":"66201"},{"range":"67262","text":"66199"},{"range":"67263","text":"66201"},{"range":"67264","text":"66199"},{"range":"67265","text":"66201"},{"range":"67266","text":"66199"},{"range":"67267","text":"66201"},{"range":"67268","text":"66199"},{"range":"67269","text":"66201"},{"range":"67270","text":"66199"},{"range":"67271","text":"66201"},{"range":"67272","text":"66199"},{"range":"67273","text":"66201"},{"range":"67274","text":"66199"},{"range":"67275","text":"66201"},{"range":"67276","text":"66199"},{"range":"67277","text":"66201"},{"range":"67278","text":"66199"},{"range":"67279","text":"66201"},{"range":"67280","text":"66199"},{"range":"67281","text":"66201"},{"range":"67282","text":"66199"},{"range":"67283","text":"66201"},{"range":"67284","text":"66199"},{"range":"67285","text":"66201"},{"range":"67286","text":"66199"},{"range":"67287","text":"66201"},{"range":"67288","text":"66199"},{"range":"67289","text":"66201"},{"range":"67290","text":"66199"},{"range":"67291","text":"66201"},{"range":"67292","text":"66199"},{"range":"67293","text":"66201"},{"range":"67294","text":"66199"},{"range":"67295","text":"66201"},{"range":"67296","text":"66199"},{"range":"67297","text":"66201"},{"range":"67298","text":"66199"},{"range":"67299","text":"66201"},{"range":"67300","text":"66199"},{"range":"67301","text":"66201"},{"range":"67302","text":"66199"},{"range":"67303","text":"66201"},{"range":"67304","text":"66199"},{"range":"67305","text":"66201"},{"range":"67306","text":"66199"},{"range":"67307","text":"66201"},{"range":"67308","text":"66199"},{"range":"67309","text":"66201"},{"range":"67310","text":"66199"},{"range":"67311","text":"66201"},{"range":"67312","text":"66199"},{"range":"67313","text":"66201"},{"range":"67314","text":"66199"},{"range":"67315","text":"66201"},{"range":"67316","text":"66199"},{"range":"67317","text":"66201"},{"range":"67318","text":"66199"},{"range":"67319","text":"66201"},{"range":"67320","text":"66199"},{"range":"67321","text":"66201"},{"range":"67322","text":"66199"},{"range":"67323","text":"66201"},{"range":"67324","text":"66199"},{"range":"67325","text":"66201"},{"range":"67326","text":"66199"},{"range":"67327","text":"66201"},{"range":"67328","text":"66199"},{"range":"67329","text":"66201"},{"range":"67330","text":"66199"},{"range":"67331","text":"66201"},{"range":"67332","text":"66199"},{"range":"67333","text":"66201"},{"range":"67334","text":"66199"},{"range":"67335","text":"66201"},{"range":"67336","text":"66199"},{"range":"67337","text":"66201"},{"range":"67338","text":"66199"},{"range":"67339","text":"66201"},{"range":"67340","text":"66199"},{"range":"67341","text":"66201"},{"range":"67342","text":"66199"},{"range":"67343","text":"66201"},{"range":"67344","text":"66199"},{"range":"67345","text":"66201"},{"range":"67346","text":"66199"},{"range":"67347","text":"66201"},{"range":"67348","text":"66199"},{"range":"67349","text":"66201"},{"range":"67350","text":"66199"},{"range":"67351","text":"66201"},{"range":"67352","text":"66199"},{"range":"67353","text":"66201"},{"range":"67354","text":"66199"},{"range":"67355","text":"66201"},{"range":"67356","text":"66199"},{"range":"67357","text":"66201"},{"range":"67358","text":"66199"},{"range":"67359","text":"66201"},{"range":"67360","text":"66199"},{"range":"67361","text":"66201"},{"range":"67362","text":"66199"},{"range":"67363","text":"66201"},{"range":"67364","text":"66199"},{"range":"67365","text":"66201"},{"range":"67366","text":"66199"},{"range":"67367","text":"66201"},{"range":"67368","text":"66199"},{"range":"67369","text":"66201"},{"range":"67370","text":"66199"},{"range":"67371","text":"66201"},{"range":"67372","text":"66199"},{"range":"67373","text":"66201"},{"range":"67374","text":"66199"},{"range":"67375","text":"66201"},{"range":"67376","text":"66199"},{"range":"67377","text":"66201"},{"range":"67378","text":"66199"},{"range":"67379","text":"66201"},{"range":"67380","text":"66199"},{"range":"67381","text":"66201"},{"range":"67382","text":"66199"},{"range":"67383","text":"66201"},{"range":"67384","text":"66199"},{"range":"67385","text":"66201"},{"range":"67386","text":"66199"},{"range":"67387","text":"66201"},{"range":"67388","text":"66199"},{"range":"67389","text":"66201"},{"range":"67390","text":"66199"},{"range":"67391","text":"66201"},{"range":"67392","text":"66199"},{"range":"67393","text":"66201"},{"range":"67394","text":"66199"},{"range":"67395","text":"66201"},{"range":"67396","text":"66199"},{"range":"67397","text":"66201"},{"range":"67398","text":"66199"},{"range":"67399","text":"66201"},{"range":"67400","text":"66199"},{"range":"67401","text":"66201"},{"range":"67402","text":"66199"},{"range":"67403","text":"66201"},{"range":"67404","text":"66199"},{"range":"67405","text":"66201"},{"range":"67406","text":"66199"},{"range":"67407","text":"66201"},{"range":"67408","text":"66199"},{"range":"67409","text":"66201"},{"range":"67410","text":"66199"},{"range":"67411","text":"66201"},{"range":"67412","text":"66199"},{"range":"67413","text":"66201"},{"range":"67414","text":"66199"},{"range":"67415","text":"66201"},{"range":"67416","text":"66199"},{"range":"67417","text":"66201"},{"range":"67418","text":"66199"},{"range":"67419","text":"66201"},{"range":"67420","text":"66199"},{"range":"67421","text":"66201"},{"range":"67422","text":"66199"},{"range":"67423","text":"66201"},{"range":"67424","text":"66199"},{"range":"67425","text":"66201"},{"range":"67426","text":"66199"},{"range":"67427","text":"66201"},{"range":"67428","text":"66199"},{"range":"67429","text":"66201"},{"range":"67430","text":"66199"},{"range":"67431","text":"66201"},{"range":"67432","text":"66199"},{"range":"67433","text":"66201"},{"range":"67434","text":"66199"},{"range":"67435","text":"66201"},{"range":"67436","text":"66199"},{"range":"67437","text":"66201"},{"range":"67438","text":"66199"},{"range":"67439","text":"66201"},{"range":"67440","text":"66199"},{"range":"67441","text":"66201"},{"range":"67442","text":"66199"},{"range":"67443","text":"66201"},{"range":"67444","text":"66199"},{"range":"67445","text":"66201"},{"range":"67446","text":"66199"},{"range":"67447","text":"66201"},{"range":"67448","text":"66199"},{"range":"67449","text":"66201"},{"range":"67450","text":"66199"},{"range":"67451","text":"66201"},{"range":"67452","text":"66199"},{"range":"67453","text":"66201"},{"range":"67454","text":"66199"},{"range":"67455","text":"66201"},{"range":"67456","text":"66199"},{"range":"67457","text":"66201"},{"range":"67458","text":"66199"},{"range":"67459","text":"66201"},{"range":"67460","text":"66199"},{"range":"67461","text":"66201"},{"range":"67462","text":"66199"},{"range":"67463","text":"66201"},{"range":"67464","text":"66199"},{"range":"67465","text":"66201"},{"range":"67466","text":"66199"},{"range":"67467","text":"66201"},{"range":"67468","text":"66199"},{"range":"67469","text":"66201"},{"range":"67470","text":"66199"},{"range":"67471","text":"66201"},{"range":"67472","text":"66199"},{"range":"67473","text":"66201"},{"range":"67474","text":"66199"},{"range":"67475","text":"66201"},{"range":"67476","text":"66199"},{"range":"67477","text":"66201"},{"range":"67478","text":"66199"},{"range":"67479","text":"66201"},{"range":"67480","text":"66199"},{"range":"67481","text":"66201"},{"range":"67482","text":"66199"},{"range":"67483","text":"66201"},{"range":"67484","text":"66199"},{"range":"67485","text":"66201"},{"range":"67486","text":"66199"},{"range":"67487","text":"66201"},{"range":"67488","text":"66199"},{"range":"67489","text":"66201"},{"range":"67490","text":"66199"},{"range":"67491","text":"66201"},{"range":"67492","text":"66199"},{"range":"67493","text":"66201"},{"range":"67494","text":"66199"},{"range":"67495","text":"66201"},{"range":"67496","text":"66199"},{"range":"67497","text":"66201"},{"range":"67498","text":"66199"},{"range":"67499","text":"66201"},{"range":"67500","text":"66199"},{"range":"67501","text":"66201"},{"range":"67502","text":"66199"},{"range":"67503","text":"66201"},{"range":"67504","text":"66199"},{"range":"67505","text":"66201"},{"range":"67506","text":"66199"},{"range":"67507","text":"66201"},{"range":"67508","text":"66199"},{"range":"67509","text":"66201"},{"range":"67510","text":"66199"},{"range":"67511","text":"66201"},{"range":"67512","text":"66199"},{"range":"67513","text":"66201"},{"range":"67514","text":"66199"},{"range":"67515","text":"66201"},{"range":"67516","text":"66199"},{"range":"67517","text":"66201"},{"range":"67518","text":"66199"},{"range":"67519","text":"66201"},{"range":"67520","text":"66199"},{"range":"67521","text":"66201"},{"range":"67522","text":"66199"},{"range":"67523","text":"66201"},{"range":"67524","text":"66199"},{"range":"67525","text":"66201"},{"range":"67526","text":"66199"},{"range":"67527","text":"66201"},{"range":"67528","text":"66199"},{"range":"67529","text":"66201"},{"range":"67530","text":"66199"},{"range":"67531","text":"66201"},{"range":"67532","text":"66199"},{"range":"67533","text":"66201"},{"range":"67534","text":"66199"},{"range":"67535","text":"66201"},{"range":"67536","text":"66199"},{"range":"67537","text":"66201"},{"range":"67538","text":"66199"},{"range":"67539","text":"66201"},{"range":"67540","text":"66199"},{"range":"67541","text":"66201"},{"range":"67542","text":"66199"},{"range":"67543","text":"66201"},{"range":"67544","text":"66199"},{"range":"67545","text":"66201"},{"range":"67546","text":"66199"},{"range":"67547","text":"66201"},{"range":"67548","text":"66199"},{"range":"67549","text":"66201"},{"range":"67550","text":"66199"},{"range":"67551","text":"66201"},{"range":"67552","text":"66199"},{"range":"67553","text":"66201"},{"range":"67554","text":"66199"},{"range":"67555","text":"66201"},{"range":"67556","text":"66199"},{"range":"67557","text":"66201"},{"range":"67558","text":"66199"},{"range":"67559","text":"66201"},{"range":"67560","text":"66199"},{"range":"67561","text":"66201"},{"range":"67562","text":"66199"},{"range":"67563","text":"66201"},{"range":"67564","text":"66199"},{"range":"67565","text":"66201"},{"range":"67566","text":"66199"},{"range":"67567","text":"66201"},{"range":"67568","text":"66199"},{"range":"67569","text":"66201"},{"range":"67570","text":"66199"},{"range":"67571","text":"66201"},{"range":"67572","text":"66199"},{"range":"67573","text":"66201"},{"range":"67574","text":"66199"},{"range":"67575","text":"66201"},{"range":"67576","text":"66199"},{"range":"67577","text":"66201"},{"range":"67578","text":"66199"},{"range":"67579","text":"66201"},{"range":"67580","text":"66199"},{"range":"67581","text":"66201"},{"range":"67582","text":"66199"},{"range":"67583","text":"66201"},{"range":"67584","text":"66199"},{"range":"67585","text":"66201"},{"range":"67586","text":"66199"},{"range":"67587","text":"66201"},{"range":"67588","text":"66199"},{"range":"67589","text":"66201"},{"range":"67590","text":"66199"},{"range":"67591","text":"66201"},{"range":"67592","text":"66199"},{"range":"67593","text":"66201"},{"range":"67594","text":"66199"},{"range":"67595","text":"66201"},{"range":"67596","text":"66199"},{"range":"67597","text":"66201"},{"range":"67598","text":"66199"},{"range":"67599","text":"66201"},{"range":"67600","text":"66199"},{"range":"67601","text":"66201"},{"range":"67602","text":"66199"},{"range":"67603","text":"66201"},{"range":"67604","text":"66199"},{"range":"67605","text":"66201"},{"range":"67606","text":"66199"},{"range":"67607","text":"66201"},{"range":"67608","text":"66199"},{"range":"67609","text":"66201"},{"range":"67610","text":"66199"},{"range":"67611","text":"66201"},{"range":"67612","text":"66199"},{"range":"67613","text":"66201"},{"range":"67614","text":"66199"},{"range":"67615","text":"66201"},{"range":"67616","text":"66199"},{"range":"67617","text":"66201"},{"range":"67618","text":"66199"},{"range":"67619","text":"66201"},{"range":"67620","text":"66199"},{"range":"67621","text":"66201"},{"range":"67622","text":"66199"},{"range":"67623","text":"66201"},{"range":"67624","text":"66199"},{"range":"67625","text":"66201"},{"range":"67626","text":"66199"},{"range":"67627","text":"66201"},{"range":"67628","text":"66199"},{"range":"67629","text":"66201"},{"range":"67630","text":"66199"},{"range":"67631","text":"66201"},{"range":"67632","text":"66199"},{"range":"67633","text":"66201"},{"range":"67634","text":"66199"},{"range":"67635","text":"66201"},{"range":"67636","text":"66199"},{"range":"67637","text":"66201"},{"range":"67638","text":"66199"},{"range":"67639","text":"66201"},{"range":"67640","text":"66199"},{"range":"67641","text":"66201"},{"range":"67642","text":"66199"},{"range":"67643","text":"66201"},{"range":"67644","text":"66199"},{"range":"67645","text":"66201"},{"range":"67646","text":"66199"},{"range":"67647","text":"66201"},{"range":"67648","text":"66199"},{"range":"67649","text":"66201"},{"range":"67650","text":"66199"},{"range":"67651","text":"66201"},{"range":"67652","text":"66199"},{"range":"67653","text":"66201"},{"range":"67654","text":"66199"},{"range":"67655","text":"66201"},{"range":"67656","text":"66199"},{"range":"67657","text":"66201"},{"range":"67658","text":"66199"},{"range":"67659","text":"66201"},{"range":"67660","text":"66199"},{"range":"67661","text":"66201"},{"range":"67662","text":"66199"},{"range":"67663","text":"66201"},{"range":"67664","text":"66199"},{"range":"67665","text":"66201"},{"range":"67666","text":"66199"},{"range":"67667","text":"66201"},{"range":"67668","text":"66199"},{"range":"67669","text":"66201"},{"range":"67670","text":"66199"},{"range":"67671","text":"66201"},{"range":"67672","text":"66199"},{"range":"67673","text":"66201"},{"range":"67674","text":"66199"},{"range":"67675","text":"66201"},{"range":"67676","text":"66199"},{"range":"67677","text":"66201"},{"range":"67678","text":"66199"},{"range":"67679","text":"66201"},{"range":"67680","text":"66199"},{"range":"67681","text":"66201"},{"range":"67682","text":"66199"},{"range":"67683","text":"66201"},{"range":"67684","text":"66199"},{"range":"67685","text":"66201"},{"range":"67686","text":"66199"},{"range":"67687","text":"66201"},{"range":"67688","text":"66199"},{"range":"67689","text":"66201"},{"range":"67690","text":"66199"},{"range":"67691","text":"66201"},{"range":"67692","text":"66199"},{"range":"67693","text":"66201"},{"range":"67694","text":"66199"},{"range":"67695","text":"66201"},{"range":"67696","text":"66199"},{"range":"67697","text":"66201"},{"range":"67698","text":"66199"},{"range":"67699","text":"66201"},{"range":"67700","text":"66199"},{"range":"67701","text":"66201"},{"range":"67702","text":"66199"},{"range":"67703","text":"66201"},{"range":"67704","text":"66199"},{"range":"67705","text":"66201"},{"range":"67706","text":"66199"},{"range":"67707","text":"66201"},{"range":"67708","text":"66199"},{"range":"67709","text":"66201"},{"range":"67710","text":"66199"},{"range":"67711","text":"66201"},{"range":"67712","text":"66199"},{"range":"67713","text":"66201"},{"range":"67714","text":"66199"},{"range":"67715","text":"66201"},{"range":"67716","text":"66199"},{"range":"67717","text":"66201"},{"range":"67718","text":"66199"},{"range":"67719","text":"66201"},{"range":"67720","text":"66199"},{"range":"67721","text":"66201"},{"range":"67722","text":"66199"},{"range":"67723","text":"66201"},{"range":"67724","text":"66199"},{"range":"67725","text":"66201"},{"range":"67726","text":"66199"},{"range":"67727","text":"66201"},{"range":"67728","text":"66199"},{"range":"67729","text":"66201"},{"range":"67730","text":"66199"},{"range":"67731","text":"66201"},{"range":"67732","text":"66199"},{"range":"67733","text":"66201"},{"range":"67734","text":"66199"},{"range":"67735","text":"66201"},{"range":"67736","text":"66199"},{"range":"67737","text":"66201"},{"range":"67738","text":"66199"},{"range":"67739","text":"66201"},{"range":"67740","text":"66199"},{"range":"67741","text":"66201"},{"range":"67742","text":"66199"},{"range":"67743","text":"66201"},{"range":"67744","text":"66199"},{"range":"67745","text":"66201"},{"range":"67746","text":"66199"},{"range":"67747","text":"66201"},{"range":"67748","text":"66199"},{"range":"67749","text":"66201"},{"range":"67750","text":"66199"},{"range":"67751","text":"66201"},{"range":"67752","text":"66199"},{"range":"67753","text":"66201"},{"range":"67754","text":"66199"},{"range":"67755","text":"66201"},{"range":"67756","text":"66199"},{"range":"67757","text":"66201"},{"range":"67758","text":"66199"},{"range":"67759","text":"66201"},{"range":"67760","text":"66199"},{"range":"67761","text":"66201"},{"range":"67762","text":"66199"},{"range":"67763","text":"66201"},{"range":"67764","text":"66199"},{"range":"67765","text":"66201"},{"range":"67766","text":"66199"},{"range":"67767","text":"66201"},{"range":"67768","text":"66199"},{"range":"67769","text":"66201"},{"range":"67770","text":"66199"},{"range":"67771","text":"66201"},{"range":"67772","text":"66199"},{"range":"67773","text":"66201"},{"range":"67774","text":"66199"},{"range":"67775","text":"66201"},{"range":"67776","text":"66199"},{"range":"67777","text":"66201"},{"range":"67778","text":"66199"},{"range":"67779","text":"66201"},{"range":"67780","text":"66199"},{"range":"67781","text":"66201"},{"range":"67782","text":"66199"},{"range":"67783","text":"66201"},{"range":"67784","text":"66199"},{"range":"67785","text":"66201"},{"range":"67786","text":"66199"},{"range":"67787","text":"66201"},{"range":"67788","text":"66199"},{"range":"67789","text":"66201"},{"range":"67790","text":"66199"},{"range":"67791","text":"66201"},{"range":"67792","text":"66199"},{"range":"67793","text":"66201"},{"range":"67794","text":"66199"},{"range":"67795","text":"66201"},{"range":"67796","text":"66199"},{"range":"67797","text":"66201"},{"range":"67798","text":"66199"},{"range":"67799","text":"66201"},{"range":"67800","text":"66199"},{"range":"67801","text":"66201"},{"range":"67802","text":"66199"},{"range":"67803","text":"66201"},{"range":"67804","text":"66199"},{"range":"67805","text":"66201"},{"range":"67806","text":"66199"},{"range":"67807","text":"66201"},{"range":"67808","text":"66199"},{"range":"67809","text":"66201"},{"range":"67810","text":"66199"},{"range":"67811","text":"66201"},{"range":"67812","text":"66199"},{"range":"67813","text":"66201"},{"range":"67814","text":"66199"},{"range":"67815","text":"66201"},{"range":"67816","text":"66199"},{"range":"67817","text":"66201"},{"range":"67818","text":"66199"},{"range":"67819","text":"66201"},{"range":"67820","text":"66199"},{"range":"67821","text":"66201"},{"range":"67822","text":"66199"},{"range":"67823","text":"66201"},{"range":"67824","text":"66199"},{"range":"67825","text":"66201"},{"range":"67826","text":"66199"},{"range":"67827","text":"66201"},{"range":"67828","text":"66199"},{"range":"67829","text":"66201"},{"range":"67830","text":"66199"},{"range":"67831","text":"66201"},{"range":"67832","text":"66199"},{"range":"67833","text":"66201"},{"range":"67834","text":"66199"},{"range":"67835","text":"66201"},{"range":"67836","text":"66199"},{"range":"67837","text":"66201"},{"range":"67838","text":"66199"},{"range":"67839","text":"66201"},{"range":"67840","text":"66199"},{"range":"67841","text":"66201"},{"range":"67842","text":"66199"},{"range":"67843","text":"66201"},{"range":"67844","text":"66199"},{"range":"67845","text":"66201"},{"range":"67846","text":"66199"},{"range":"67847","text":"66201"},{"range":"67848","text":"66199"},{"range":"67849","text":"66201"},{"range":"67850","text":"66199"},{"range":"67851","text":"66201"},{"range":"67852","text":"66199"},{"range":"67853","text":"66201"},{"range":"67854","text":"66199"},{"range":"67855","text":"66201"},{"range":"67856","text":"66199"},{"range":"67857","text":"66201"},{"range":"67858","text":"66199"},{"range":"67859","text":"66201"},{"range":"67860","text":"66199"},{"range":"67861","text":"66201"},{"range":"67862","text":"66199"},{"range":"67863","text":"66201"},{"range":"67864","text":"66199"},{"range":"67865","text":"66201"},{"range":"67866","text":"66199"},{"range":"67867","text":"66201"},{"range":"67868","text":"66199"},{"range":"67869","text":"66201"},{"range":"67870","text":"66199"},{"range":"67871","text":"66201"},{"range":"67872","text":"66199"},{"range":"67873","text":"66201"},{"range":"67874","text":"66199"},{"range":"67875","text":"66201"},{"range":"67876","text":"66199"},{"range":"67877","text":"66201"},{"range":"67878","text":"66199"},{"range":"67879","text":"66201"},{"range":"67880","text":"66199"},{"range":"67881","text":"66201"},{"range":"67882","text":"66199"},{"range":"67883","text":"66201"},{"range":"67884","text":"66199"},{"range":"67885","text":"66201"},{"range":"67886","text":"66199"},{"range":"67887","text":"66201"},{"range":"67888","text":"66199"},{"range":"67889","text":"66201"},{"range":"67890","text":"66199"},{"range":"67891","text":"66201"},{"range":"67892","text":"66199"},{"range":"67893","text":"66201"},{"range":"67894","text":"66199"},{"range":"67895","text":"66201"},{"range":"67896","text":"66199"},{"range":"67897","text":"66201"},{"range":"67898","text":"66199"},{"range":"67899","text":"66201"},{"range":"67900","text":"66199"},{"range":"67901","text":"66201"},{"range":"67902","text":"66199"},{"range":"67903","text":"66201"},{"range":"67904","text":"66199"},{"range":"67905","text":"66201"},{"range":"67906","text":"66199"},{"range":"67907","text":"66201"},{"range":"67908","text":"66199"},{"range":"67909","text":"66201"},{"range":"67910","text":"66199"},{"range":"67911","text":"66201"},{"range":"67912","text":"66199"},{"range":"67913","text":"66201"},{"range":"67914","text":"66199"},{"range":"67915","text":"66201"},{"range":"67916","text":"66199"},{"range":"67917","text":"66201"},{"range":"67918","text":"66199"},{"range":"67919","text":"66201"},{"range":"67920","text":"66199"},{"range":"67921","text":"66201"},{"range":"67922","text":"66199"},{"range":"67923","text":"66201"},{"range":"67924","text":"66199"},{"range":"67925","text":"66201"},{"range":"67926","text":"66199"},{"range":"67927","text":"66201"},{"range":"67928","text":"66199"},{"range":"67929","text":"66201"},{"range":"67930","text":"66199"},{"range":"67931","text":"66201"},{"range":"67932","text":"66199"},{"range":"67933","text":"66201"},{"range":"67934","text":"66199"},{"range":"67935","text":"66201"},{"range":"67936","text":"66199"},{"range":"67937","text":"66201"},{"range":"67938","text":"66199"},{"range":"67939","text":"66201"},{"range":"67940","text":"66199"},{"range":"67941","text":"66201"},{"range":"67942","text":"66199"},{"range":"67943","text":"66201"},{"range":"67944","text":"66199"},{"range":"67945","text":"66201"},{"range":"67946","text":"66199"},{"range":"67947","text":"66201"},{"range":"67948","text":"66199"},{"range":"67949","text":"66201"},{"range":"67950","text":"66199"},{"range":"67951","text":"66201"},{"range":"67952","text":"66199"},{"range":"67953","text":"66201"},{"range":"67954","text":"66199"},{"range":"67955","text":"66201"},{"range":"67956","text":"66199"},{"range":"67957","text":"66201"},{"range":"67958","text":"66199"},{"range":"67959","text":"66201"},{"range":"67960","text":"66199"},{"range":"67961","text":"66201"},{"range":"67962","text":"66199"},{"range":"67963","text":"66201"},{"range":"67964","text":"66199"},{"range":"67965","text":"66201"},{"range":"67966","text":"66199"},{"range":"67967","text":"66201"},{"range":"67968","text":"66199"},{"range":"67969","text":"66201"},{"range":"67970","text":"66199"},{"range":"67971","text":"66201"},{"range":"67972","text":"66199"},{"range":"67973","text":"66201"},{"range":"67974","text":"66199"},{"range":"67975","text":"66201"},{"range":"67976","text":"66199"},{"range":"67977","text":"66201"},{"range":"67978","text":"66199"},{"range":"67979","text":"66201"},{"range":"67980","text":"66199"},{"range":"67981","text":"66201"},{"range":"67982","text":"66199"},{"range":"67983","text":"66201"},{"range":"67984","text":"66199"},{"range":"67985","text":"66201"},{"range":"67986","text":"66199"},{"range":"67987","text":"66201"},{"range":"67988","text":"66199"},{"range":"67989","text":"66201"},{"range":"67990","text":"66199"},{"range":"67991","text":"66201"},{"range":"67992","text":"66199"},{"range":"67993","text":"66201"},{"range":"67994","text":"66199"},{"range":"67995","text":"66201"},{"range":"67996","text":"66199"},{"range":"67997","text":"66201"},{"range":"67998","text":"66199"},{"range":"67999","text":"66201"},{"range":"68000","text":"66199"},{"range":"68001","text":"66201"},{"range":"68002","text":"66199"},{"range":"68003","text":"66201"},{"range":"68004","text":"66199"},{"range":"68005","text":"66201"},{"range":"68006","text":"66199"},{"range":"68007","text":"66201"},{"range":"68008","text":"66199"},{"range":"68009","text":"66201"},{"range":"68010","text":"66199"},{"range":"68011","text":"66201"},{"range":"68012","text":"66199"},{"range":"68013","text":"66201"},{"range":"68014","text":"66199"},{"range":"68015","text":"66201"},{"range":"68016","text":"66199"},{"range":"68017","text":"66201"},{"range":"68018","text":"66199"},{"range":"68019","text":"66201"},{"range":"68020","text":"66199"},{"range":"68021","text":"66201"},{"range":"68022","text":"66199"},{"range":"68023","text":"66201"},{"range":"68024","text":"66199"},{"range":"68025","text":"66201"},{"range":"68026","text":"66199"},{"range":"68027","text":"66201"},{"range":"68028","text":"66199"},{"range":"68029","text":"66201"},{"range":"68030","text":"66199"},{"range":"68031","text":"66201"},{"range":"68032","text":"66199"},{"range":"68033","text":"66201"},{"range":"68034","text":"66199"},{"range":"68035","text":"66201"},{"range":"68036","text":"66199"},{"range":"68037","text":"66201"},{"range":"68038","text":"66199"},{"range":"68039","text":"66201"},{"range":"68040","text":"66199"},{"range":"68041","text":"66201"},{"range":"68042","text":"66199"},{"range":"68043","text":"66201"},{"range":"68044","text":"66199"},{"range":"68045","text":"66201"},{"range":"68046","text":"66199"},{"range":"68047","text":"66201"},{"range":"68048","text":"66199"},{"range":"68049","text":"66201"},{"range":"68050","text":"66199"},{"range":"68051","text":"66201"},{"range":"68052","text":"66199"},{"range":"68053","text":"66201"},{"range":"68054","text":"66199"},{"range":"68055","text":"66201"},{"range":"68056","text":"66199"},{"range":"68057","text":"66201"},{"range":"68058","text":"66199"},{"range":"68059","text":"66201"},{"range":"68060","text":"66199"},{"range":"68061","text":"66201"},{"range":"68062","text":"66199"},{"range":"68063","text":"66201"},{"range":"68064","text":"66199"},{"range":"68065","text":"66201"},{"range":"68066","text":"66199"},{"range":"68067","text":"66201"},{"range":"68068","text":"66199"},{"range":"68069","text":"66201"},{"range":"68070","text":"66199"},{"range":"68071","text":"66201"},{"range":"68072","text":"66199"},{"range":"68073","text":"66201"},{"range":"68074","text":"66199"},{"range":"68075","text":"66201"},{"range":"68076","text":"66199"},{"range":"68077","text":"66201"},{"range":"68078","text":"66199"},{"range":"68079","text":"66201"},{"range":"68080","text":"66199"},{"range":"68081","text":"66201"},{"range":"68082","text":"66199"},{"range":"68083","text":"66201"},{"range":"68084","text":"66199"},{"range":"68085","text":"66201"},{"range":"68086","text":"66199"},{"range":"68087","text":"66201"},{"range":"68088","text":"66199"},{"range":"68089","text":"66201"},{"range":"68090","text":"66199"},{"range":"68091","text":"66201"},{"range":"68092","text":"66199"},{"range":"68093","text":"66201"},{"range":"68094","text":"66199"},{"range":"68095","text":"66201"},{"range":"68096","text":"66199"},{"range":"68097","text":"66201"},{"range":"68098","text":"66199"},{"range":"68099","text":"66201"},{"range":"68100","text":"66199"},{"range":"68101","text":"66201"},{"range":"68102","text":"66199"},{"range":"68103","text":"66201"},{"range":"68104","text":"66199"},{"range":"68105","text":"66201"},{"range":"68106","text":"66199"},{"range":"68107","text":"66201"},{"range":"68108","text":"66199"},{"range":"68109","text":"66201"},{"range":"68110","text":"66199"},{"range":"68111","text":"66201"},{"range":"68112","text":"66199"},{"range":"68113","text":"66201"},{"range":"68114","text":"66199"},{"range":"68115","text":"66201"},{"range":"68116","text":"66199"},{"range":"68117","text":"66201"},{"range":"68118","text":"66199"},{"range":"68119","text":"66201"},{"range":"68120","text":"66199"},{"range":"68121","text":"66201"},{"range":"68122","text":"66199"},{"range":"68123","text":"66201"},{"range":"68124","text":"66199"},{"range":"68125","text":"66201"},{"range":"68126","text":"66199"},{"range":"68127","text":"66201"},{"range":"68128","text":"66199"},{"range":"68129","text":"66201"},{"range":"68130","text":"66199"},{"range":"68131","text":"66201"},{"range":"68132","text":"66199"},{"range":"68133","text":"66201"},{"range":"68134","text":"66199"},{"range":"68135","text":"66201"},{"range":"68136","text":"66199"},{"range":"68137","text":"66201"},{"range":"68138","text":"66199"},{"range":"68139","text":"66201"},{"range":"68140","text":"66199"},{"range":"68141","text":"66201"},{"range":"68142","text":"66199"},{"range":"68143","text":"66201"},{"range":"68144","text":"66199"},{"range":"68145","text":"66201"},{"range":"68146","text":"66199"},{"range":"68147","text":"66201"},{"range":"68148","text":"66199"},{"range":"68149","text":"66201"},{"range":"68150","text":"66199"},{"range":"68151","text":"66201"},{"range":"68152","text":"66199"},{"range":"68153","text":"66201"},{"range":"68154","text":"66199"},{"range":"68155","text":"66201"},{"range":"68156","text":"66199"},{"range":"68157","text":"66201"},{"range":"68158","text":"66199"},{"range":"68159","text":"66201"},{"range":"68160","text":"66199"},{"range":"68161","text":"66201"},{"range":"68162","text":"66199"},{"range":"68163","text":"66201"},{"range":"68164","text":"66199"},{"range":"68165","text":"66201"},{"range":"68166","text":"66199"},{"range":"68167","text":"66201"},{"range":"68168","text":"66199"},{"range":"68169","text":"66201"},{"range":"68170","text":"66199"},{"range":"68171","text":"66201"},{"range":"68172","text":"66199"},{"range":"68173","text":"66201"},{"range":"68174","text":"66199"},{"range":"68175","text":"66201"},{"range":"68176","text":"66199"},{"range":"68177","text":"66201"},{"range":"68178","text":"66199"},{"range":"68179","text":"66201"},{"range":"68180","text":"66199"},{"range":"68181","text":"66201"},{"range":"68182","text":"66199"},{"range":"68183","text":"66201"},{"range":"68184","text":"66199"},{"range":"68185","text":"66201"},{"range":"68186","text":"66199"},{"range":"68187","text":"66201"},{"range":"68188","text":"66199"},{"range":"68189","text":"66201"},{"range":"68190","text":"66199"},{"range":"68191","text":"66201"},{"range":"68192","text":"66199"},{"range":"68193","text":"66201"},{"range":"68194","text":"66199"},{"range":"68195","text":"66201"},{"range":"68196","text":"66199"},{"range":"68197","text":"66201"},{"range":"68198","text":"66199"},{"range":"68199","text":"66201"},{"range":"68200","text":"66199"},{"range":"68201","text":"66201"},{"range":"68202","text":"66199"},{"range":"68203","text":"66201"},{"range":"68204","text":"66199"},{"range":"68205","text":"66201"},{"range":"68206","text":"66199"},{"range":"68207","text":"66201"},{"range":"68208","text":"66199"},{"range":"68209","text":"66201"},{"range":"68210","text":"66199"},{"range":"68211","text":"66201"},{"range":"68212","text":"66199"},{"range":"68213","text":"66201"},{"range":"68214","text":"66199"},{"range":"68215","text":"66201"},{"range":"68216","text":"66199"},{"range":"68217","text":"66201"},{"range":"68218","text":"66199"},{"range":"68219","text":"66201"},{"range":"68220","text":"66199"},{"range":"68221","text":"66201"},{"range":"68222","text":"66199"},{"range":"68223","text":"66201"},{"range":"68224","text":"66199"},{"range":"68225","text":"66201"},{"range":"68226","text":"66199"},{"range":"68227","text":"66201"},{"range":"68228","text":"66199"},{"range":"68229","text":"66201"},{"range":"68230","text":"66199"},{"range":"68231","text":"66201"},{"range":"68232","text":"66199"},{"range":"68233","text":"66201"},{"range":"68234","text":"66199"},{"range":"68235","text":"66201"},{"range":"68236","text":"66199"},{"range":"68237","text":"66201"},{"range":"68238","text":"66199"},{"range":"68239","text":"66201"},{"range":"68240","text":"66199"},{"range":"68241","text":"66201"},{"range":"68242","text":"66199"},{"range":"68243","text":"66201"},{"range":"68244","text":"66199"},{"range":"68245","text":"66201"},{"range":"68246","text":"66199"},{"range":"68247","text":"66201"},{"range":"68248","text":"66199"},{"range":"68249","text":"66201"},{"range":"68250","text":"66199"},{"range":"68251","text":"66201"},{"range":"68252","text":"66199"},{"range":"68253","text":"66201"},{"range":"68254","text":"66199"},{"range":"68255","text":"66201"},{"range":"68256","text":"66199"},{"range":"68257","text":"66201"},{"range":"68258","text":"66199"},{"range":"68259","text":"66201"},{"range":"68260","text":"66199"},{"range":"68261","text":"66201"},{"range":"68262","text":"66199"},{"range":"68263","text":"66201"},{"range":"68264","text":"66199"},{"range":"68265","text":"66201"},{"range":"68266","text":"66199"},{"range":"68267","text":"66201"},{"range":"68268","text":"66199"},{"range":"68269","text":"66201"},{"range":"68270","text":"66199"},{"range":"68271","text":"66201"},{"range":"68272","text":"66199"},{"range":"68273","text":"66201"},{"range":"68274","text":"66199"},{"range":"68275","text":"66201"},{"range":"68276","text":"66199"},{"range":"68277","text":"66201"},{"range":"68278","text":"66199"},{"range":"68279","text":"66201"},{"range":"68280","text":"66199"},{"range":"68281","text":"66201"},{"range":"68282","text":"66199"},{"range":"68283","text":"66201"},{"range":"68284","text":"66199"},{"range":"68285","text":"66201"},{"range":"68286","text":"66199"},{"range":"68287","text":"66201"},{"range":"68288","text":"66199"},{"range":"68289","text":"66201"},{"range":"68290","text":"66199"},{"range":"68291","text":"66201"},{"range":"68292","text":"66199"},{"range":"68293","text":"66201"},{"range":"68294","text":"66199"},{"range":"68295","text":"66201"},{"range":"68296","text":"66199"},{"range":"68297","text":"66201"},{"range":"68298","text":"66199"},{"range":"68299","text":"66201"},{"range":"68300","text":"66199"},{"range":"68301","text":"66201"},{"range":"68302","text":"66199"},{"range":"68303","text":"66201"},{"range":"68304","text":"66199"},{"range":"68305","text":"66201"},{"range":"68306","text":"66199"},{"range":"68307","text":"66201"},{"range":"68308","text":"66199"},{"range":"68309","text":"66201"},{"range":"68310","text":"66199"},{"range":"68311","text":"66201"},{"range":"68312","text":"66199"},{"range":"68313","text":"66201"},{"range":"68314","text":"66199"},{"range":"68315","text":"66201"},{"range":"68316","text":"66199"},{"range":"68317","text":"66201"},{"range":"68318","text":"66199"},{"range":"68319","text":"66201"},{"range":"68320","text":"66199"},{"range":"68321","text":"66201"},{"range":"68322","text":"66199"},{"range":"68323","text":"66201"},{"range":"68324","text":"66199"},{"range":"68325","text":"66201"},{"range":"68326","text":"66199"},{"range":"68327","text":"66201"},{"range":"68328","text":"66199"},{"range":"68329","text":"66201"},{"range":"68330","text":"66199"},{"range":"68331","text":"66201"},{"range":"68332","text":"66199"},{"range":"68333","text":"66201"},{"range":"68334","text":"66199"},{"range":"68335","text":"66201"},{"range":"68336","text":"66199"},{"range":"68337","text":"66201"},{"range":"68338","text":"66199"},{"range":"68339","text":"66201"},{"range":"68340","text":"66199"},{"range":"68341","text":"66201"},{"range":"68342","text":"66199"},{"range":"68343","text":"66201"},{"range":"68344","text":"66199"},{"range":"68345","text":"66201"},{"range":"68346","text":"66199"},{"range":"68347","text":"66201"},{"range":"68348","text":"66199"},{"range":"68349","text":"66201"},{"range":"68350","text":"66199"},{"range":"68351","text":"66201"},{"range":"68352","text":"66199"},{"range":"68353","text":"66201"},{"range":"68354","text":"66199"},{"range":"68355","text":"66201"},{"range":"68356","text":"66199"},{"range":"68357","text":"66201"},{"range":"68358","text":"66199"},{"range":"68359","text":"66201"},{"range":"68360","text":"66199"},{"range":"68361","text":"66201"},{"range":"68362","text":"66199"},{"range":"68363","text":"66201"},{"range":"68364","text":"66199"},{"range":"68365","text":"66201"},{"range":"68366","text":"66199"},{"range":"68367","text":"66201"},{"range":"68368","text":"66199"},{"range":"68369","text":"66201"},{"range":"68370","text":"66199"},{"range":"68371","text":"66201"},{"range":"68372","text":"66199"},{"range":"68373","text":"66201"},{"range":"68374","text":"66199"},{"range":"68375","text":"66201"},{"range":"68376","text":"66199"},{"range":"68377","text":"66201"},{"range":"68378","text":"66199"},{"range":"68379","text":"66201"},{"range":"68380","text":"66199"},{"range":"68381","text":"66201"},{"range":"68382","text":"66199"},{"range":"68383","text":"66201"},{"range":"68384","text":"66199"},{"range":"68385","text":"66201"},{"range":"68386","text":"66199"},{"range":"68387","text":"66201"},{"range":"68388","text":"66199"},{"range":"68389","text":"66201"},{"range":"68390","text":"66199"},{"range":"68391","text":"66201"},{"range":"68392","text":"66199"},{"range":"68393","text":"66201"},{"range":"68394","text":"66199"},{"range":"68395","text":"66201"},{"range":"68396","text":"66199"},{"range":"68397","text":"66201"},{"range":"68398","text":"66199"},{"range":"68399","text":"66201"},{"range":"68400","text":"66199"},{"range":"68401","text":"66201"},{"range":"68402","text":"66199"},{"range":"68403","text":"66201"},{"range":"68404","text":"66199"},{"range":"68405","text":"66201"},{"range":"68406","text":"66199"},{"range":"68407","text":"66201"},{"range":"68408","text":"66199"},{"range":"68409","text":"66201"},{"range":"68410","text":"66199"},{"range":"68411","text":"66201"},{"range":"68412","text":"66199"},{"range":"68413","text":"66201"},{"range":"68414","text":"66199"},{"range":"68415","text":"66201"},{"range":"68416","text":"66199"},{"range":"68417","text":"66201"},{"range":"68418","text":"66199"},{"range":"68419","text":"66201"},{"range":"68420","text":"66199"},{"range":"68421","text":"66201"},{"range":"68422","text":"66199"},{"range":"68423","text":"66201"},{"range":"68424","text":"66199"},{"range":"68425","text":"66201"},{"range":"68426","text":"66199"},{"range":"68427","text":"66201"},{"range":"68428","text":"66199"},{"range":"68429","text":"66201"},{"range":"68430","text":"66199"},{"range":"68431","text":"66201"},{"range":"68432","text":"66199"},{"range":"68433","text":"66201"},{"range":"68434","text":"66199"},{"range":"68435","text":"66201"},{"range":"68436","text":"66199"},{"range":"68437","text":"66201"},{"range":"68438","text":"66199"},{"range":"68439","text":"66201"},{"range":"68440","text":"66199"},{"range":"68441","text":"66201"},{"range":"68442","text":"66199"},{"range":"68443","text":"66201"},{"range":"68444","text":"66199"},{"range":"68445","text":"66201"},{"range":"68446","text":"66199"},{"range":"68447","text":"66201"},{"range":"68448","text":"66199"},{"range":"68449","text":"66201"},{"range":"68450","text":"66199"},{"range":"68451","text":"66201"},{"range":"68452","text":"66199"},{"range":"68453","text":"66201"},{"range":"68454","text":"66199"},{"range":"68455","text":"66201"},{"range":"68456","text":"66199"},{"range":"68457","text":"66201"},{"range":"68458","text":"66199"},{"range":"68459","text":"66201"},{"range":"68460","text":"66199"},{"range":"68461","text":"66201"},{"range":"68462","text":"66199"},{"range":"68463","text":"66201"},{"range":"68464","text":"66199"},{"range":"68465","text":"66201"},{"range":"68466","text":"66199"},{"range":"68467","text":"66201"},{"range":"68468","text":"66199"},{"range":"68469","text":"66201"},{"range":"68470","text":"66199"},{"range":"68471","text":"66201"},{"range":"68472","text":"66199"},{"range":"68473","text":"66201"},{"range":"68474","text":"66199"},{"range":"68475","text":"66201"},{"range":"68476","text":"66199"},{"range":"68477","text":"66201"},{"range":"68478","text":"66199"},{"range":"68479","text":"66201"},{"range":"68480","text":"66199"},{"range":"68481","text":"66201"},{"range":"68482","text":"66199"},{"range":"68483","text":"66201"},{"range":"68484","text":"66199"},{"range":"68485","text":"66201"},{"range":"68486","text":"66199"},{"range":"68487","text":"66201"},{"range":"68488","text":"66199"},{"range":"68489","text":"66201"},{"range":"68490","text":"66199"},{"range":"68491","text":"66201"},{"range":"68492","text":"66199"},{"range":"68493","text":"66201"},{"range":"68494","text":"66199"},{"range":"68495","text":"66201"},{"range":"68496","text":"66199"},{"range":"68497","text":"66201"},{"range":"68498","text":"66199"},{"range":"68499","text":"66201"},{"range":"68500","text":"66199"},{"range":"68501","text":"66201"},{"range":"68502","text":"66199"},{"range":"68503","text":"66201"},{"range":"68504","text":"66199"},{"range":"68505","text":"66201"},{"range":"68506","text":"66199"},{"range":"68507","text":"66201"},{"range":"68508","text":"66199"},{"range":"68509","text":"66201"},{"range":"68510","text":"66199"},{"range":"68511","text":"66201"},{"range":"68512","text":"66199"},{"range":"68513","text":"66201"},{"range":"68514","text":"66199"},{"range":"68515","text":"66201"},{"range":"68516","text":"66199"},{"range":"68517","text":"66201"},{"range":"68518","text":"66199"},{"range":"68519","text":"66201"},{"range":"68520","text":"66199"},{"range":"68521","text":"66201"},{"range":"68522","text":"66199"},{"range":"68523","text":"66201"},{"range":"68524","text":"66199"},{"range":"68525","text":"66201"},{"range":"68526","text":"66199"},{"range":"68527","text":"66201"},{"range":"68528","text":"66199"},{"range":"68529","text":"66201"},{"range":"68530","text":"66199"},{"range":"68531","text":"66201"},{"range":"68532","text":"66199"},{"range":"68533","text":"66201"},{"range":"68534","text":"66199"},{"range":"68535","text":"66201"},{"range":"68536","text":"66199"},{"range":"68537","text":"66201"},{"range":"68538","text":"66199"},{"range":"68539","text":"66201"},{"range":"68540","text":"66199"},{"range":"68541","text":"66201"},{"range":"68542","text":"66199"},{"range":"68543","text":"66201"},{"range":"68544","text":"66199"},{"range":"68545","text":"66201"},{"range":"68546","text":"66199"},{"range":"68547","text":"66201"},{"range":"68548","text":"66199"},{"range":"68549","text":"66201"},{"range":"68550","text":"66199"},{"range":"68551","text":"66201"},{"range":"68552","text":"66199"},{"range":"68553","text":"66201"},{"range":"68554","text":"66199"},{"range":"68555","text":"66201"},{"range":"68556","text":"66199"},{"range":"68557","text":"66201"},{"range":"68558","text":"66199"},{"range":"68559","text":"66201"},{"range":"68560","text":"66199"},{"range":"68561","text":"66201"},{"range":"68562","text":"66199"},{"range":"68563","text":"66201"},{"range":"68564","text":"66199"},{"range":"68565","text":"66201"},{"range":"68566","text":"66199"},{"range":"68567","text":"66201"},{"range":"68568","text":"66199"},{"range":"68569","text":"66201"},{"range":"68570","text":"66199"},{"range":"68571","text":"66201"},{"range":"68572","text":"66199"},{"range":"68573","text":"66201"},{"range":"68574","text":"66199"},{"range":"68575","text":"66201"},{"range":"68576","text":"66199"},{"range":"68577","text":"66201"},{"range":"68578","text":"66199"},{"range":"68579","text":"66201"},{"range":"68580","text":"66199"},{"range":"68581","text":"66201"},{"range":"68582","text":"66199"},{"range":"68583","text":"66201"},{"range":"68584","text":"66199"},{"range":"68585","text":"66201"},{"range":"68586","text":"66199"},{"range":"68587","text":"66201"},{"range":"68588","text":"66199"},{"range":"68589","text":"66201"},{"range":"68590","text":"66199"},{"range":"68591","text":"66201"},{"range":"68592","text":"66199"},{"range":"68593","text":"66201"},{"range":"68594","text":"66199"},{"range":"68595","text":"66201"},{"range":"68596","text":"66199"},{"range":"68597","text":"66201"},{"range":"68598","text":"66199"},{"range":"68599","text":"66201"},{"range":"68600","text":"66199"},{"range":"68601","text":"66201"},{"range":"68602","text":"66199"},{"range":"68603","text":"66201"},{"range":"68604","text":"66199"},{"range":"68605","text":"66201"},{"range":"68606","text":"66199"},{"range":"68607","text":"66201"},{"range":"68608","text":"66199"},{"range":"68609","text":"66201"},{"range":"68610","text":"66199"},{"range":"68611","text":"66201"},{"range":"68612","text":"66199"},{"range":"68613","text":"66201"},{"range":"68614","text":"66199"},{"range":"68615","text":"66201"},{"range":"68616","text":"66199"},{"range":"68617","text":"66201"},{"range":"68618","text":"66199"},{"range":"68619","text":"66201"},{"range":"68620","text":"66199"},{"range":"68621","text":"66201"},{"range":"68622","text":"66199"},{"range":"68623","text":"66201"},{"range":"68624","text":"66199"},{"range":"68625","text":"66201"},{"range":"68626","text":"66199"},{"range":"68627","text":"66201"},{"range":"68628","text":"66199"},{"range":"68629","text":"66201"},{"range":"68630","text":"66199"},{"range":"68631","text":"66201"},{"range":"68632","text":"66199"},{"range":"68633","text":"66201"},{"range":"68634","text":"66199"},{"range":"68635","text":"66201"},{"range":"68636","text":"66199"},{"range":"68637","text":"66201"},{"range":"68638","text":"66199"},{"range":"68639","text":"66201"},{"range":"68640","text":"66199"},{"range":"68641","text":"66201"},{"range":"68642","text":"66199"},{"range":"68643","text":"66201"},{"range":"68644","text":"66199"},{"range":"68645","text":"66201"},{"range":"68646","text":"66199"},{"range":"68647","text":"66201"},{"range":"68648","text":"66199"},{"range":"68649","text":"66201"},{"range":"68650","text":"66199"},{"range":"68651","text":"66201"},{"range":"68652","text":"66199"},{"range":"68653","text":"66201"},{"range":"68654","text":"66199"},{"range":"68655","text":"66201"},{"range":"68656","text":"66199"},{"range":"68657","text":"66201"},{"range":"68658","text":"66199"},{"range":"68659","text":"66201"},{"range":"68660","text":"66199"},{"range":"68661","text":"66201"},{"range":"68662","text":"66199"},{"range":"68663","text":"66201"},{"range":"68664","text":"66199"},{"range":"68665","text":"66201"},{"range":"68666","text":"66199"},{"range":"68667","text":"66201"},{"range":"68668","text":"66199"},{"range":"68669","text":"66201"},{"range":"68670","text":"66199"},{"range":"68671","text":"66201"},{"range":"68672","text":"66199"},{"range":"68673","text":"66201"},{"range":"68674","text":"66199"},{"range":"68675","text":"66201"},{"range":"68676","text":"66199"},{"range":"68677","text":"66201"},{"range":"68678","text":"66199"},{"range":"68679","text":"66201"},{"range":"68680","text":"66199"},{"range":"68681","text":"66201"},{"range":"68682","text":"66199"},{"range":"68683","text":"66201"},{"range":"68684","text":"66199"},{"range":"68685","text":"66201"},{"range":"68686","text":"66199"},{"range":"68687","text":"66201"},{"range":"68688","text":"66199"},{"range":"68689","text":"66201"},{"range":"68690","text":"66199"},{"range":"68691","text":"66201"},{"range":"68692","text":"66199"},{"range":"68693","text":"66201"},{"range":"68694","text":"66199"},{"range":"68695","text":"66201"},{"range":"68696","text":"66199"},{"range":"68697","text":"66201"},{"range":"68698","text":"66199"},{"range":"68699","text":"66201"},{"range":"68700","text":"66199"},{"range":"68701","text":"66201"},{"range":"68702","text":"66199"},{"range":"68703","text":"66201"},{"range":"68704","text":"66199"},{"range":"68705","text":"66201"},{"range":"68706","text":"66199"},{"range":"68707","text":"66201"},{"range":"68708","text":"66199"},{"range":"68709","text":"66201"},{"range":"68710","text":"66199"},{"range":"68711","text":"66201"},{"range":"68712","text":"66199"},{"range":"68713","text":"66201"},{"range":"68714","text":"66199"},{"range":"68715","text":"66201"},{"range":"68716","text":"66199"},{"range":"68717","text":"66201"},{"range":"68718","text":"66199"},{"range":"68719","text":"66201"},{"range":"68720","text":"66199"},{"range":"68721","text":"66201"},{"range":"68722","text":"66199"},{"range":"68723","text":"66201"},{"range":"68724","text":"66199"},{"range":"68725","text":"66201"},{"range":"68726","text":"66199"},{"range":"68727","text":"66201"},{"range":"68728","text":"66199"},{"range":"68729","text":"66201"},{"range":"68730","text":"66199"},{"range":"68731","text":"66201"},{"range":"68732","text":"66199"},{"range":"68733","text":"66201"},{"range":"68734","text":"66199"},{"range":"68735","text":"66201"},{"range":"68736","text":"66199"},{"range":"68737","text":"66201"},{"range":"68738","text":"66199"},{"range":"68739","text":"66201"},{"range":"68740","text":"66199"},{"range":"68741","text":"66201"},{"range":"68742","text":"66199"},{"range":"68743","text":"66201"},{"range":"68744","text":"66199"},{"range":"68745","text":"66201"},{"range":"68746","text":"66199"},{"range":"68747","text":"66201"},{"range":"68748","text":"66199"},{"range":"68749","text":"66201"},{"range":"68750","text":"66199"},{"range":"68751","text":"66201"},{"range":"68752","text":"66199"},{"range":"68753","text":"66201"},{"range":"68754","text":"66199"},{"range":"68755","text":"66201"},{"range":"68756","text":"66199"},{"range":"68757","text":"66201"},{"range":"68758","text":"66199"},{"range":"68759","text":"66201"},{"range":"68760","text":"66199"},{"range":"68761","text":"66201"},{"range":"68762","text":"66199"},{"range":"68763","text":"66201"},{"range":"68764","text":"66199"},{"range":"68765","text":"66201"},{"range":"68766","text":"66199"},{"range":"68767","text":"66201"},{"range":"68768","text":"66199"},{"range":"68769","text":"66201"},{"range":"68770","text":"66199"},{"range":"68771","text":"66201"},{"range":"68772","text":"66199"},{"range":"68773","text":"66201"},{"range":"68774","text":"66199"},{"range":"68775","text":"66201"},{"range":"68776","text":"66199"},{"range":"68777","text":"66201"},{"range":"68778","text":"66199"},{"range":"68779","text":"66201"},{"range":"68780","text":"66199"},{"range":"68781","text":"66201"},{"range":"68782","text":"66199"},{"range":"68783","text":"66201"},{"range":"68784","text":"66199"},{"range":"68785","text":"66201"},{"range":"68786","text":"66199"},{"range":"68787","text":"66201"},{"range":"68788","text":"66199"},{"range":"68789","text":"66201"},{"range":"68790","text":"66199"},{"range":"68791","text":"66201"},{"range":"68792","text":"66199"},{"range":"68793","text":"66201"},{"range":"68794","text":"66199"},{"range":"68795","text":"66201"},{"range":"68796","text":"66199"},{"range":"68797","text":"66201"},{"range":"68798","text":"66199"},{"range":"68799","text":"66201"},{"range":"68800","text":"66199"},{"range":"68801","text":"66201"},{"range":"68802","text":"66199"},{"range":"68803","text":"66201"},{"range":"68804","text":"66199"},{"range":"68805","text":"66201"},{"range":"68806","text":"66199"},{"range":"68807","text":"66201"},{"range":"68808","text":"66199"},{"range":"68809","text":"66201"},{"range":"68810","text":"66199"},{"range":"68811","text":"66201"},{"range":"68812","text":"66199"},{"range":"68813","text":"66201"},{"range":"68814","text":"66199"},{"range":"68815","text":"66201"},{"range":"68816","text":"66199"},{"range":"68817","text":"66201"},{"range":"68818","text":"66199"},{"range":"68819","text":"66201"},{"range":"68820","text":"66199"},{"range":"68821","text":"66201"},{"range":"68822","text":"66199"},{"range":"68823","text":"66201"},{"range":"68824","text":"66199"},{"range":"68825","text":"66201"},{"range":"68826","text":"66199"},{"range":"68827","text":"66201"},{"range":"68828","text":"66199"},{"range":"68829","text":"66201"},{"range":"68830","text":"66199"},{"range":"68831","text":"66201"},{"range":"68832","text":"66199"},{"range":"68833","text":"66201"},{"range":"68834","text":"66199"},{"range":"68835","text":"66201"},{"range":"68836","text":"66199"},{"range":"68837","text":"66201"},{"range":"68838","text":"66199"},{"range":"68839","text":"66201"},{"range":"68840","text":"66199"},{"range":"68841","text":"66201"},{"range":"68842","text":"66199"},{"range":"68843","text":"66201"},{"range":"68844","text":"66199"},{"range":"68845","text":"66201"},{"range":"68846","text":"66199"},{"range":"68847","text":"66201"},{"range":"68848","text":"66199"},{"range":"68849","text":"66201"},{"range":"68850","text":"66199"},{"range":"68851","text":"66201"},{"range":"68852","text":"66199"},{"range":"68853","text":"66201"},{"range":"68854","text":"66199"},{"range":"68855","text":"66201"},{"range":"68856","text":"66199"},{"range":"68857","text":"66201"},{"range":"68858","text":"66199"},{"range":"68859","text":"66201"},{"range":"68860","text":"66199"},{"range":"68861","text":"66201"},{"range":"68862","text":"66199"},{"range":"68863","text":"66201"},{"range":"68864","text":"66199"},{"range":"68865","text":"66201"},{"range":"68866","text":"66199"},{"range":"68867","text":"66201"},{"range":"68868","text":"66199"},{"range":"68869","text":"66201"},{"range":"68870","text":"66199"},{"range":"68871","text":"66201"},{"range":"68872","text":"66199"},{"range":"68873","text":"66201"},{"range":"68874","text":"66199"},{"range":"68875","text":"66201"},{"range":"68876","text":"66199"},{"range":"68877","text":"66201"},{"range":"68878","text":"66199"},{"range":"68879","text":"66201"},{"range":"68880","text":"66199"},{"range":"68881","text":"66201"},{"range":"68882","text":"66199"},{"range":"68883","text":"66201"},{"range":"68884","text":"66199"},{"range":"68885","text":"66201"},{"range":"68886","text":"66199"},{"range":"68887","text":"66201"},{"range":"68888","text":"66199"},{"range":"68889","text":"66201"},{"range":"68890","text":"66199"},{"range":"68891","text":"66201"},{"range":"68892","text":"66199"},{"range":"68893","text":"66201"},{"range":"68894","text":"66199"},{"range":"68895","text":"66201"},{"range":"68896","text":"66199"},{"range":"68897","text":"66201"},{"range":"68898","text":"66199"},{"range":"68899","text":"66201"},{"range":"68900","text":"66199"},{"range":"68901","text":"66201"},{"range":"68902","text":"66199"},{"range":"68903","text":"66201"},{"range":"68904","text":"66199"},{"range":"68905","text":"66201"},{"range":"68906","text":"66199"},{"range":"68907","text":"66201"},{"range":"68908","text":"66199"},{"range":"68909","text":"66201"},{"range":"68910","text":"66199"},{"range":"68911","text":"66201"},{"range":"68912","text":"66199"},{"range":"68913","text":"66201"},{"range":"68914","text":"66199"},{"range":"68915","text":"66201"},{"range":"68916","text":"66199"},{"range":"68917","text":"66201"},{"range":"68918","text":"66199"},{"range":"68919","text":"66201"},{"range":"68920","text":"66199"},{"range":"68921","text":"66201"},{"range":"68922","text":"66199"},{"range":"68923","text":"66201"},{"range":"68924","text":"66199"},{"range":"68925","text":"66201"},{"range":"68926","text":"66199"},{"range":"68927","text":"66201"},{"range":"68928","text":"66199"},{"range":"68929","text":"66201"},{"range":"68930","text":"66199"},{"range":"68931","text":"66201"},{"range":"68932","text":"66199"},{"range":"68933","text":"66201"},{"range":"68934","text":"66199"},{"range":"68935","text":"66201"},{"range":"68936","text":"66199"},{"range":"68937","text":"66201"},{"range":"68938","text":"66199"},{"range":"68939","text":"66201"},{"range":"68940","text":"66199"},{"range":"68941","text":"66201"},{"range":"68942","text":"66199"},{"range":"68943","text":"66201"},{"range":"68944","text":"66199"},{"range":"68945","text":"66201"},{"range":"68946","text":"66199"},{"range":"68947","text":"66201"},{"range":"68948","text":"66199"},{"range":"68949","text":"66201"},{"range":"68950","text":"66199"},{"range":"68951","text":"66201"},{"range":"68952","text":"66199"},{"range":"68953","text":"66201"},{"range":"68954","text":"66199"},{"range":"68955","text":"66201"},{"range":"68956","text":"66199"},{"range":"68957","text":"66201"},{"range":"68958","text":"66199"},{"range":"68959","text":"66201"},{"range":"68960","text":"66199"},{"range":"68961","text":"66201"},{"range":"68962","text":"66199"},{"range":"68963","text":"66201"},{"range":"68964","text":"66199"},{"range":"68965","text":"66201"},{"range":"68966","text":"66199"},{"range":"68967","text":"66201"},{"range":"68968","text":"66199"},{"range":"68969","text":"66201"},{"range":"68970","text":"66199"},{"range":"68971","text":"66201"},{"range":"68972","text":"66199"},{"range":"68973","text":"66201"},{"range":"68974","text":"66199"},{"range":"68975","text":"66201"},{"range":"68976","text":"66199"},{"range":"68977","text":"66201"},{"range":"68978","text":"66199"},{"range":"68979","text":"66201"},{"range":"68980","text":"66199"},{"range":"68981","text":"66201"},{"range":"68982","text":"66199"},{"range":"68983","text":"66201"},{"range":"68984","text":"66199"},{"range":"68985","text":"66201"},{"range":"68986","text":"66199"},{"range":"68987","text":"66201"},{"range":"68988","text":"66199"},{"range":"68989","text":"66201"},{"range":"68990","text":"66199"},{"range":"68991","text":"66201"},{"range":"68992","text":"66199"},{"range":"68993","text":"66201"},{"range":"68994","text":"66199"},{"range":"68995","text":"66201"},{"range":"68996","text":"66199"},{"range":"68997","text":"66201"},{"range":"68998","text":"66199"},{"range":"68999","text":"66201"},{"range":"69000","text":"66199"},{"range":"69001","text":"66201"},{"range":"69002","text":"66199"},{"range":"69003","text":"66201"},{"range":"69004","text":"66199"},{"range":"69005","text":"66201"},{"range":"69006","text":"66199"},{"range":"69007","text":"66201"},{"range":"69008","text":"66199"},{"range":"69009","text":"66201"},{"range":"69010","text":"66199"},{"range":"69011","text":"66201"},{"range":"69012","text":"66199"},{"range":"69013","text":"66201"},{"range":"69014","text":"66199"},{"range":"69015","text":"66201"},{"range":"69016","text":"66199"},{"range":"69017","text":"66201"},{"range":"69018","text":"66199"},{"range":"69019","text":"66201"},{"range":"69020","text":"66199"},{"range":"69021","text":"66201"},{"range":"69022","text":"66199"},{"range":"69023","text":"66201"},{"range":"69024","text":"66199"},{"range":"69025","text":"66201"},{"range":"69026","text":"66199"},{"range":"69027","text":"66201"},{"range":"69028","text":"66199"},{"range":"69029","text":"66201"},{"range":"69030","text":"66199"},{"range":"69031","text":"66201"},{"range":"69032","text":"66199"},{"range":"69033","text":"66201"},{"range":"69034","text":"66199"},{"range":"69035","text":"66201"},{"range":"69036","text":"66199"},{"range":"69037","text":"66201"},{"range":"69038","text":"66199"},{"range":"69039","text":"66201"},{"range":"69040","text":"66199"},{"range":"69041","text":"66201"},{"range":"69042","text":"66199"},{"range":"69043","text":"66201"},{"range":"69044","text":"66199"},{"range":"69045","text":"66201"},{"range":"69046","text":"66199"},{"range":"69047","text":"66201"},{"range":"69048","text":"66199"},{"range":"69049","text":"66201"},{"range":"69050","text":"66199"},{"range":"69051","text":"66201"},{"range":"69052","text":"66199"},{"range":"69053","text":"66201"},{"range":"69054","text":"66199"},{"range":"69055","text":"66201"},{"range":"69056","text":"66199"},{"range":"69057","text":"66201"},{"range":"69058","text":"66199"},{"range":"69059","text":"66201"},{"range":"69060","text":"66199"},{"range":"69061","text":"66201"},{"range":"69062","text":"66199"},{"range":"69063","text":"66201"},{"range":"69064","text":"66199"},{"range":"69065","text":"66201"},{"range":"69066","text":"66199"},{"range":"69067","text":"66201"},{"range":"69068","text":"66199"},{"range":"69069","text":"66201"},{"range":"69070","text":"66199"},{"range":"69071","text":"66201"},{"range":"69072","text":"66199"},{"range":"69073","text":"66201"},{"range":"69074","text":"66199"},{"range":"69075","text":"66201"},{"range":"69076","text":"66199"},{"range":"69077","text":"66201"},{"range":"69078","text":"66199"},{"range":"69079","text":"66201"},{"range":"69080","text":"66199"},{"range":"69081","text":"66201"},{"range":"69082","text":"66199"},{"range":"69083","text":"66201"},{"range":"69084","text":"66199"},{"range":"69085","text":"66201"},{"range":"69086","text":"66199"},{"range":"69087","text":"66201"},{"range":"69088","text":"66199"},{"range":"69089","text":"66201"},{"range":"69090","text":"66199"},{"range":"69091","text":"66201"},{"range":"69092","text":"66199"},{"range":"69093","text":"66201"},{"range":"69094","text":"66199"},{"range":"69095","text":"66201"},{"range":"69096","text":"66199"},{"range":"69097","text":"66201"},{"range":"69098","text":"66199"},{"range":"69099","text":"66201"},{"range":"69100","text":"66199"},{"range":"69101","text":"66201"},{"range":"69102","text":"66199"},{"range":"69103","text":"66201"},{"range":"69104","text":"66199"},{"range":"69105","text":"66201"},{"range":"69106","text":"66199"},{"range":"69107","text":"66201"},{"range":"69108","text":"66199"},{"range":"69109","text":"66201"},{"range":"69110","text":"66199"},{"range":"69111","text":"66201"},{"range":"69112","text":"66199"},{"range":"69113","text":"66201"},{"range":"69114","text":"66199"},{"range":"69115","text":"66201"},{"range":"69116","text":"66199"},{"range":"69117","text":"66201"},{"range":"69118","text":"66199"},{"range":"69119","text":"66201"},{"range":"69120","text":"66199"},{"range":"69121","text":"66201"},{"range":"69122","text":"66199"},{"range":"69123","text":"66201"},{"range":"69124","text":"66199"},{"range":"69125","text":"66201"},{"range":"69126","text":"66199"},{"range":"69127","text":"66201"},{"range":"69128","text":"66199"},{"range":"69129","text":"66201"},{"range":"69130","text":"66199"},{"range":"69131","text":"66201"},{"range":"69132","text":"66199"},{"range":"69133","text":"66201"},{"range":"69134","text":"66199"},{"range":"69135","text":"66201"},{"range":"69136","text":"66199"},{"range":"69137","text":"66201"},{"range":"69138","text":"66199"},{"range":"69139","text":"66201"},{"range":"69140","text":"66199"},{"range":"69141","text":"66201"},{"range":"69142","text":"66199"},{"range":"69143","text":"66201"},{"range":"69144","text":"66199"},{"range":"69145","text":"66201"},{"range":"69146","text":"66199"},{"range":"69147","text":"66201"},{"range":"69148","text":"66199"},{"range":"69149","text":"66201"},{"range":"69150","text":"66199"},{"range":"69151","text":"66201"},{"range":"69152","text":"66199"},{"range":"69153","text":"66201"},{"range":"69154","text":"66199"},{"range":"69155","text":"66201"},{"range":"69156","text":"66199"},{"range":"69157","text":"66201"},{"range":"69158","text":"66199"},{"range":"69159","text":"66201"},{"range":"69160","text":"66199"},{"range":"69161","text":"66201"},{"range":"69162","text":"66199"},{"range":"69163","text":"66201"},{"range":"69164","text":"66199"},{"range":"69165","text":"66201"},{"range":"69166","text":"66199"},{"range":"69167","text":"66201"},{"range":"69168","text":"66199"},{"range":"69169","text":"66201"},{"range":"69170","text":"66199"},{"range":"69171","text":"66201"},{"range":"69172","text":"66199"},{"range":"69173","text":"66201"},{"range":"69174","text":"66199"},{"range":"69175","text":"66201"},{"range":"69176","text":"66199"},{"range":"69177","text":"66201"},{"range":"69178","text":"66199"},{"range":"69179","text":"66201"},{"range":"69180","text":"66199"},{"range":"69181","text":"66201"},{"range":"69182","text":"66199"},{"range":"69183","text":"66201"},{"range":"69184","text":"66199"},{"range":"69185","text":"66201"},{"range":"69186","text":"66199"},{"range":"69187","text":"66201"},{"range":"69188","text":"66199"},{"range":"69189","text":"66201"},{"range":"69190","text":"66199"},{"range":"69191","text":"66201"},{"range":"69192","text":"66199"},{"range":"69193","text":"66201"},{"range":"69194","text":"66199"},{"range":"69195","text":"66201"},{"range":"69196","text":"66199"},{"range":"69197","text":"66201"},{"range":"69198","text":"66199"},{"range":"69199","text":"66201"},{"range":"69200","text":"66199"},{"range":"69201","text":"66201"},{"range":"69202","text":"66199"},{"range":"69203","text":"66201"},{"range":"69204","text":"66199"},{"range":"69205","text":"66201"},{"range":"69206","text":"66199"},{"range":"69207","text":"66201"},{"range":"69208","text":"66199"},{"range":"69209","text":"66201"},{"range":"69210","text":"66199"},{"range":"69211","text":"66201"},{"range":"69212","text":"66199"},{"range":"69213","text":"66201"},{"range":"69214","text":"66199"},{"range":"69215","text":"66201"},{"range":"69216","text":"66199"},{"range":"69217","text":"66201"},{"range":"69218","text":"66199"},{"range":"69219","text":"66201"},{"range":"69220","text":"66199"},{"range":"69221","text":"66201"},{"range":"69222","text":"66199"},{"range":"69223","text":"66201"},{"range":"69224","text":"66199"},{"range":"69225","text":"66201"},{"range":"69226","text":"66199"},{"range":"69227","text":"66201"},{"range":"69228","text":"66199"},{"range":"69229","text":"66201"},{"range":"69230","text":"66199"},{"range":"69231","text":"66201"},{"range":"69232","text":"66199"},{"range":"69233","text":"66201"},{"range":"69234","text":"66199"},{"range":"69235","text":"66201"},{"range":"69236","text":"66199"},{"range":"69237","text":"66201"},{"range":"69238","text":"66199"},{"range":"69239","text":"66201"},{"range":"69240","text":"66199"},{"range":"69241","text":"66201"},{"range":"69242","text":"66199"},{"range":"69243","text":"66201"},{"range":"69244","text":"66199"},{"range":"69245","text":"66201"},{"range":"69246","text":"66199"},{"range":"69247","text":"66201"},{"range":"69248","text":"66199"},{"range":"69249","text":"66201"},{"range":"69250","text":"66199"},{"range":"69251","text":"66201"},{"range":"69252","text":"66199"},{"range":"69253","text":"66201"},{"range":"69254","text":"66199"},{"range":"69255","text":"66201"},{"range":"69256","text":"66199"},{"range":"69257","text":"66201"},{"range":"69258","text":"66199"},{"range":"69259","text":"66201"},{"range":"69260","text":"66199"},{"range":"69261","text":"66201"},{"range":"69262","text":"66199"},{"range":"69263","text":"66201"},{"range":"69264","text":"66199"},{"range":"69265","text":"66201"},{"range":"69266","text":"66199"},{"range":"69267","text":"66201"},{"range":"69268","text":"66199"},{"range":"69269","text":"66201"},{"range":"69270","text":"66199"},{"range":"69271","text":"66201"},{"range":"69272","text":"66199"},{"range":"69273","text":"66201"},{"range":"69274","text":"66199"},{"range":"69275","text":"66201"},{"range":"69276","text":"66199"},{"range":"69277","text":"66201"},{"range":"69278","text":"66199"},{"range":"69279","text":"66201"},{"range":"69280","text":"66199"},{"range":"69281","text":"66201"},{"range":"69282","text":"66199"},{"range":"69283","text":"66201"},{"range":"69284","text":"66199"},{"range":"69285","text":"66201"},{"range":"69286","text":"66199"},{"range":"69287","text":"66201"},{"range":"69288","text":"66199"},{"range":"69289","text":"66201"},{"range":"69290","text":"66199"},{"range":"69291","text":"66201"},{"range":"69292","text":"66199"},{"range":"69293","text":"66201"},{"range":"69294","text":"66199"},{"range":"69295","text":"66201"},{"range":"69296","text":"66199"},{"range":"69297","text":"66201"},{"range":"69298","text":"66199"},{"range":"69299","text":"66201"},{"range":"69300","text":"66199"},{"range":"69301","text":"66201"},{"range":"69302","text":"66199"},{"range":"69303","text":"66201"},{"range":"69304","text":"66199"},{"range":"69305","text":"66201"},{"range":"69306","text":"66199"},{"range":"69307","text":"66201"},{"range":"69308","text":"66199"},{"range":"69309","text":"66201"},{"range":"69310","text":"66199"},{"range":"69311","text":"66201"},{"range":"69312","text":"66199"},{"range":"69313","text":"66201"},{"range":"69314","text":"66199"},{"range":"69315","text":"66201"},{"range":"69316","text":"66199"},{"range":"69317","text":"66201"},{"range":"69318","text":"66199"},{"range":"69319","text":"66201"},{"range":"69320","text":"66199"},{"range":"69321","text":"66201"},{"range":"69322","text":"66199"},{"range":"69323","text":"66201"},{"range":"69324","text":"66199"},{"range":"69325","text":"66201"},{"range":"69326","text":"66199"},{"range":"69327","text":"66201"},{"range":"69328","text":"66199"},{"range":"69329","text":"66201"},{"range":"69330","text":"66199"},{"range":"69331","text":"66201"},{"range":"69332","text":"66199"},{"range":"69333","text":"66201"},{"range":"69334","text":"66199"},{"range":"69335","text":"66201"},{"range":"69336","text":"66199"},{"range":"69337","text":"66201"},{"range":"69338","text":"66199"},{"range":"69339","text":"66201"},{"range":"69340","text":"66199"},{"range":"69341","text":"66201"},{"range":"69342","text":"66199"},{"range":"69343","text":"66201"},{"range":"69344","text":"66199"},{"range":"69345","text":"66201"},{"range":"69346","text":"66199"},{"range":"69347","text":"66201"},{"range":"69348","text":"66199"},{"range":"69349","text":"66201"},{"range":"69350","text":"66199"},{"range":"69351","text":"66201"},{"range":"69352","text":"66199"},{"range":"69353","text":"66201"},{"range":"69354","text":"66199"},{"range":"69355","text":"66201"},{"range":"69356","text":"66199"},{"range":"69357","text":"66201"},{"range":"69358","text":"66199"},{"range":"69359","text":"66201"},{"range":"69360","text":"66199"},{"range":"69361","text":"66201"},{"range":"69362","text":"66199"},{"range":"69363","text":"66201"},{"range":"69364","text":"66199"},{"range":"69365","text":"66201"},{"range":"69366","text":"66199"},{"range":"69367","text":"66201"},{"range":"69368","text":"66199"},{"range":"69369","text":"66201"},{"range":"69370","text":"66199"},{"range":"69371","text":"66201"},{"range":"69372","text":"66199"},{"range":"69373","text":"66201"},{"range":"69374","text":"66199"},{"range":"69375","text":"66201"},{"range":"69376","text":"66199"},{"range":"69377","text":"66201"},{"range":"69378","text":"66199"},{"range":"69379","text":"66201"},{"range":"69380","text":"66199"},{"range":"69381","text":"66201"},{"range":"69382","text":"66199"},{"range":"69383","text":"66201"},{"range":"69384","text":"66199"},{"range":"69385","text":"66201"},{"range":"69386","text":"66199"},{"range":"69387","text":"66201"},{"range":"69388","text":"66199"},{"range":"69389","text":"66201"},{"range":"69390","text":"66199"},{"range":"69391","text":"66201"},{"range":"69392","text":"66199"},{"range":"69393","text":"66201"},{"range":"69394","text":"66199"},{"range":"69395","text":"66201"},{"range":"69396","text":"66199"},{"range":"69397","text":"66201"},{"range":"69398","text":"66199"},{"range":"69399","text":"66201"},{"range":"69400","text":"66199"},{"range":"69401","text":"66201"},{"range":"69402","text":"66199"},{"range":"69403","text":"66201"},{"range":"69404","text":"66199"},{"range":"69405","text":"66201"},{"range":"69406","text":"66199"},{"range":"69407","text":"66201"},{"range":"69408","text":"66199"},{"range":"69409","text":"66201"},{"range":"69410","text":"66199"},{"range":"69411","text":"66201"},{"range":"69412","text":"66199"},{"range":"69413","text":"66201"},{"range":"69414","text":"66199"},{"range":"69415","text":"66201"},{"range":"69416","text":"66199"},{"range":"69417","text":"66201"},{"range":"69418","text":"66199"},{"range":"69419","text":"66201"},{"range":"69420","text":"66199"},{"range":"69421","text":"66201"},{"range":"69422","text":"66199"},{"range":"69423","text":"66201"},{"range":"69424","text":"66199"},{"range":"69425","text":"66201"},{"range":"69426","text":"66199"},{"range":"69427","text":"66201"},{"range":"69428","text":"66199"},{"range":"69429","text":"66201"},{"range":"69430","text":"66199"},{"range":"69431","text":"66201"},{"range":"69432","text":"66199"},{"range":"69433","text":"66201"},{"range":"69434","text":"66199"},{"range":"69435","text":"66201"},{"range":"69436","text":"66199"},{"range":"69437","text":"66201"},{"range":"69438","text":"66199"},{"range":"69439","text":"66201"},{"range":"69440","text":"66199"},{"range":"69441","text":"66201"},{"range":"69442","text":"66199"},{"range":"69443","text":"66201"},{"range":"69444","text":"66199"},{"range":"69445","text":"66201"},{"range":"69446","text":"66199"},{"range":"69447","text":"66201"},{"range":"69448","text":"66199"},{"range":"69449","text":"66201"},{"range":"69450","text":"66199"},{"range":"69451","text":"66201"},{"range":"69452","text":"66199"},{"range":"69453","text":"66201"},{"range":"69454","text":"66199"},{"range":"69455","text":"66201"},{"range":"69456","text":"66199"},{"range":"69457","text":"66201"},{"range":"69458","text":"66199"},{"range":"69459","text":"66201"},{"range":"69460","text":"66199"},{"range":"69461","text":"66201"},{"range":"69462","text":"66199"},{"range":"69463","text":"66201"},{"range":"69464","text":"66199"},{"range":"69465","text":"66201"},{"range":"69466","text":"66199"},{"range":"69467","text":"66201"},{"range":"69468","text":"66199"},{"range":"69469","text":"66201"},{"range":"69470","text":"66199"},{"range":"69471","text":"66201"},{"range":"69472","text":"66199"},{"range":"69473","text":"66201"},{"range":"69474","text":"66199"},{"range":"69475","text":"66201"},{"range":"69476","text":"66199"},{"range":"69477","text":"66201"},{"range":"69478","text":"66199"},{"range":"69479","text":"66201"},{"range":"69480","text":"66199"},{"range":"69481","text":"66201"},{"range":"69482","text":"66199"},{"range":"69483","text":"66201"},{"range":"69484","text":"66199"},{"range":"69485","text":"66201"},{"range":"69486","text":"66199"},{"range":"69487","text":"66201"},{"range":"69488","text":"66199"},{"range":"69489","text":"66201"},{"range":"69490","text":"66199"},{"range":"69491","text":"66201"},{"range":"69492","text":"66199"},{"range":"69493","text":"66201"},{"range":"69494","text":"66199"},{"range":"69495","text":"66201"},{"range":"69496","text":"66199"},{"range":"69497","text":"66201"},{"range":"69498","text":"66199"},{"range":"69499","text":"66201"},{"range":"69500","text":"66199"},{"range":"69501","text":"66201"},{"range":"69502","text":"66199"},{"range":"69503","text":"66201"},{"range":"69504","text":"66199"},{"range":"69505","text":"66201"},{"range":"69506","text":"66199"},{"range":"69507","text":"66201"},{"range":"69508","text":"66199"},{"range":"69509","text":"66201"},{"range":"69510","text":"66199"},{"range":"69511","text":"66201"},{"range":"69512","text":"66199"},{"range":"69513","text":"66201"},{"range":"69514","text":"66199"},{"range":"69515","text":"66201"},{"range":"69516","text":"66199"},{"range":"69517","text":"66201"},{"range":"69518","text":"66199"},{"range":"69519","text":"66201"},{"range":"69520","text":"66199"},{"range":"69521","text":"66201"},{"range":"69522","text":"66199"},{"range":"69523","text":"66201"},{"range":"69524","text":"66199"},{"range":"69525","text":"66201"},{"range":"69526","text":"66199"},{"range":"69527","text":"66201"},{"range":"69528","text":"66199"},{"range":"69529","text":"66201"},{"range":"69530","text":"66199"},{"range":"69531","text":"66201"},{"range":"69532","text":"66199"},{"range":"69533","text":"66201"},{"range":"69534","text":"66199"},{"range":"69535","text":"66201"},{"range":"69536","text":"66199"},{"range":"69537","text":"66201"},{"range":"69538","text":"66199"},{"range":"69539","text":"66201"},{"range":"69540","text":"66199"},{"range":"69541","text":"66201"},{"range":"69542","text":"66199"},{"range":"69543","text":"66201"},{"range":"69544","text":"66199"},{"range":"69545","text":"66201"},{"range":"69546","text":"66199"},{"range":"69547","text":"66201"},{"range":"69548","text":"66199"},{"range":"69549","text":"66201"},{"range":"69550","text":"66199"},{"range":"69551","text":"66201"},{"range":"69552","text":"66199"},{"range":"69553","text":"66201"},{"range":"69554","text":"66199"},{"range":"69555","text":"66201"},{"range":"69556","text":"66199"},{"range":"69557","text":"66201"},{"range":"69558","text":"66199"},{"range":"69559","text":"66201"},{"range":"69560","text":"66199"},{"range":"69561","text":"66201"},{"range":"69562","text":"66199"},{"range":"69563","text":"66201"},{"range":"69564","text":"66199"},{"range":"69565","text":"66201"},{"range":"69566","text":"66199"},{"range":"69567","text":"66201"},{"range":"69568","text":"66199"},{"range":"69569","text":"66201"},{"range":"69570","text":"66199"},{"range":"69571","text":"66201"},{"range":"69572","text":"66199"},{"range":"69573","text":"66201"},{"range":"69574","text":"66199"},{"range":"69575","text":"66201"},{"range":"69576","text":"66199"},{"range":"69577","text":"66201"},{"range":"69578","text":"66199"},{"range":"69579","text":"66201"},{"range":"69580","text":"66199"},{"range":"69581","text":"66201"},{"range":"69582","text":"66199"},{"range":"69583","text":"66201"},{"range":"69584","text":"66199"},{"range":"69585","text":"66201"},{"range":"69586","text":"66199"},{"range":"69587","text":"66201"},{"range":"69588","text":"66199"},{"range":"69589","text":"66201"},{"range":"69590","text":"66199"},{"range":"69591","text":"66201"},{"range":"69592","text":"66199"},{"range":"69593","text":"66201"},{"range":"69594","text":"66199"},{"range":"69595","text":"66201"},{"range":"69596","text":"66199"},{"range":"69597","text":"66201"},{"range":"69598","text":"66199"},{"range":"69599","text":"66201"},{"range":"69600","text":"66199"},{"range":"69601","text":"66201"},{"range":"69602","text":"66199"},{"range":"69603","text":"66201"},{"range":"69604","text":"66199"},{"range":"69605","text":"66201"},{"range":"69606","text":"66199"},{"range":"69607","text":"66201"},{"range":"69608","text":"66199"},{"range":"69609","text":"66201"},{"range":"69610","text":"66199"},{"range":"69611","text":"66201"},{"range":"69612","text":"66199"},{"range":"69613","text":"66201"},{"range":"69614","text":"66199"},{"range":"69615","text":"66201"},{"range":"69616","text":"66199"},{"range":"69617","text":"66201"},{"range":"69618","text":"66199"},{"range":"69619","text":"66201"},{"range":"69620","text":"66199"},{"range":"69621","text":"66201"},{"range":"69622","text":"66199"},{"range":"69623","text":"66201"},{"range":"69624","text":"66199"},{"range":"69625","text":"66201"},{"range":"69626","text":"66199"},{"range":"69627","text":"66201"},{"range":"69628","text":"66199"},{"range":"69629","text":"66201"},{"range":"69630","text":"66199"},{"range":"69631","text":"66201"},{"range":"69632","text":"66199"},{"range":"69633","text":"66201"},{"range":"69634","text":"66199"},{"range":"69635","text":"66201"},{"range":"69636","text":"66199"},{"range":"69637","text":"66201"},{"range":"69638","text":"66199"},{"range":"69639","text":"66201"},{"range":"69640","text":"66199"},{"range":"69641","text":"66201"},{"range":"69642","text":"66199"},{"range":"69643","text":"66201"},{"range":"69644","text":"66199"},{"range":"69645","text":"66201"},{"range":"69646","text":"66199"},{"range":"69647","text":"66201"},{"range":"69648","text":"66199"},{"range":"69649","text":"66201"},{"range":"69650","text":"66199"},{"range":"69651","text":"66201"},{"range":"69652","text":"66199"},{"range":"69653","text":"66201"},{"range":"69654","text":"66199"},{"range":"69655","text":"66201"},{"range":"69656","text":"66199"},{"range":"69657","text":"66201"},{"range":"69658","text":"66199"},{"range":"69659","text":"66201"},{"range":"69660","text":"66199"},{"range":"69661","text":"66201"},{"range":"69662","text":"66199"},{"range":"69663","text":"66201"},{"range":"69664","text":"66199"},{"range":"69665","text":"66201"},{"range":"69666","text":"66199"},{"range":"69667","text":"66201"},{"range":"69668","text":"66199"},{"range":"69669","text":"66201"},{"range":"69670","text":"66199"},{"range":"69671","text":"66201"},{"range":"69672","text":"66199"},{"range":"69673","text":"66201"},{"range":"69674","text":"66199"},{"range":"69675","text":"66201"},{"range":"69676","text":"66199"},{"range":"69677","text":"66201"},{"range":"69678","text":"66199"},{"range":"69679","text":"66201"},{"range":"69680","text":"66199"},{"range":"69681","text":"66201"},{"range":"69682","text":"66199"},{"range":"69683","text":"66201"},{"range":"69684","text":"66199"},{"range":"69685","text":"66201"},{"range":"69686","text":"66199"},{"range":"69687","text":"66201"},{"range":"69688","text":"66199"},{"range":"69689","text":"66201"},{"range":"69690","text":"66199"},{"range":"69691","text":"66201"},{"range":"69692","text":"66199"},{"range":"69693","text":"66201"},{"range":"69694","text":"66199"},{"range":"69695","text":"66201"},{"range":"69696","text":"66199"},{"range":"69697","text":"66201"},{"range":"69698","text":"66199"},{"range":"69699","text":"66201"},{"range":"69700","text":"66199"},{"range":"69701","text":"66201"},{"range":"69702","text":"66199"},{"range":"69703","text":"66201"},{"range":"69704","text":"66199"},{"range":"69705","text":"66201"},{"range":"69706","text":"66199"},{"range":"69707","text":"66201"},{"range":"69708","text":"66199"},{"range":"69709","text":"66201"},{"range":"69710","text":"66199"},{"range":"69711","text":"66201"},{"range":"69712","text":"66199"},{"range":"69713","text":"66201"},{"range":"69714","text":"66199"},{"range":"69715","text":"66201"},{"range":"69716","text":"66199"},{"range":"69717","text":"66201"},{"range":"69718","text":"66199"},{"range":"69719","text":"66201"},{"range":"69720","text":"66199"},{"range":"69721","text":"66201"},{"range":"69722","text":"66199"},{"range":"69723","text":"66201"},{"range":"69724","text":"66199"},{"range":"69725","text":"66201"},{"range":"69726","text":"66199"},{"range":"69727","text":"66201"},{"range":"69728","text":"66199"},{"range":"69729","text":"66201"},{"range":"69730","text":"66199"},{"range":"69731","text":"66201"},{"range":"69732","text":"66199"},{"range":"69733","text":"66201"},{"range":"69734","text":"66199"},{"range":"69735","text":"66201"},{"range":"69736","text":"66199"},{"range":"69737","text":"66201"},{"range":"69738","text":"66199"},{"range":"69739","text":"66201"},{"range":"69740","text":"66199"},{"range":"69741","text":"66201"},{"range":"69742","text":"66199"},{"range":"69743","text":"66201"},{"range":"69744","text":"66199"},{"range":"69745","text":"66201"},{"range":"69746","text":"66199"},{"range":"69747","text":"66201"},{"range":"69748","text":"66199"},{"range":"69749","text":"66201"},{"range":"69750","text":"66199"},{"range":"69751","text":"66201"},{"range":"69752","text":"66199"},{"range":"69753","text":"66201"},{"range":"69754","text":"66199"},{"range":"69755","text":"66201"},{"range":"69756","text":"66199"},{"range":"69757","text":"66201"},{"range":"69758","text":"66199"},{"range":"69759","text":"66201"},{"range":"69760","text":"66199"},{"range":"69761","text":"66201"},{"range":"69762","text":"66199"},{"range":"69763","text":"66201"},{"range":"69764","text":"66199"},{"range":"69765","text":"66201"},{"range":"69766","text":"66199"},{"range":"69767","text":"66201"},{"range":"69768","text":"66199"},{"range":"69769","text":"66201"},{"range":"69770","text":"66199"},{"range":"69771","text":"66201"},{"range":"69772","text":"66199"},{"range":"69773","text":"66201"},{"range":"69774","text":"66199"},{"range":"69775","text":"66201"},{"range":"69776","text":"66199"},{"range":"69777","text":"66201"},{"range":"69778","text":"66199"},{"range":"69779","text":"66201"},{"range":"69780","text":"66199"},{"range":"69781","text":"66201"},{"range":"69782","text":"66199"},{"range":"69783","text":"66201"},{"range":"69784","text":"66199"},{"range":"69785","text":"66201"},{"range":"69786","text":"66199"},{"range":"69787","text":"66201"},{"range":"69788","text":"66199"},{"range":"69789","text":"66201"},{"range":"69790","text":"66199"},{"range":"69791","text":"66201"},{"range":"69792","text":"66199"},{"range":"69793","text":"66201"},{"range":"69794","text":"66199"},{"range":"69795","text":"66201"},{"range":"69796","text":"66199"},{"range":"69797","text":"66201"},{"range":"69798","text":"66199"},{"range":"69799","text":"66201"},{"range":"69800","text":"66199"},{"range":"69801","text":"66201"},{"range":"69802","text":"66199"},{"range":"69803","text":"66201"},{"range":"69804","text":"66199"},{"range":"69805","text":"66201"},{"range":"69806","text":"66199"},{"range":"69807","text":"66201"},{"range":"69808","text":"66199"},{"range":"69809","text":"66201"},{"range":"69810","text":"66199"},{"range":"69811","text":"66201"},{"range":"69812","text":"66199"},{"range":"69813","text":"66201"},{"range":"69814","text":"66199"},{"range":"69815","text":"66201"},{"range":"69816","text":"66199"},{"range":"69817","text":"66201"},{"range":"69818","text":"66199"},{"range":"69819","text":"66201"},{"range":"69820","text":"66199"},{"range":"69821","text":"66201"},{"range":"69822","text":"66199"},{"range":"69823","text":"66201"},{"range":"69824","text":"66199"},{"range":"69825","text":"66201"},{"range":"69826","text":"66199"},{"range":"69827","text":"66201"},{"range":"69828","text":"66199"},{"range":"69829","text":"66201"},{"range":"69830","text":"66199"},{"range":"69831","text":"66201"},{"range":"69832","text":"66199"},{"range":"69833","text":"66201"},{"range":"69834","text":"66199"},{"range":"69835","text":"66201"},{"range":"69836","text":"66199"},{"range":"69837","text":"66201"},{"range":"69838","text":"66199"},{"range":"69839","text":"66201"},{"range":"69840","text":"66199"},{"range":"69841","text":"66201"},{"range":"69842","text":"66199"},{"range":"69843","text":"66201"},{"range":"69844","text":"66199"},{"range":"69845","text":"66201"},{"range":"69846","text":"66199"},{"range":"69847","text":"66201"},{"range":"69848","text":"66199"},{"range":"69849","text":"66201"},{"range":"69850","text":"66199"},{"range":"69851","text":"66201"},{"range":"69852","text":"66199"},{"range":"69853","text":"66201"},{"range":"69854","text":"66199"},{"range":"69855","text":"66201"},{"range":"69856","text":"66199"},{"range":"69857","text":"66201"},{"range":"69858","text":"66199"},{"range":"69859","text":"66201"},{"range":"69860","text":"66199"},{"range":"69861","text":"66201"},{"range":"69862","text":"66199"},{"range":"69863","text":"66201"},{"range":"69864","text":"66199"},{"range":"69865","text":"66201"},{"range":"69866","text":"66199"},{"range":"69867","text":"66201"},{"range":"69868","text":"66199"},{"range":"69869","text":"66201"},{"range":"69870","text":"66199"},{"range":"69871","text":"66201"},{"range":"69872","text":"66199"},{"range":"69873","text":"66201"},{"range":"69874","text":"66199"},{"range":"69875","text":"66201"},{"range":"69876","text":"66199"},{"range":"69877","text":"66201"},{"range":"69878","text":"66199"},{"range":"69879","text":"66201"},{"range":"69880","text":"66199"},{"range":"69881","text":"66201"},{"range":"69882","text":"66199"},{"range":"69883","text":"66201"},{"range":"69884","text":"66199"},{"range":"69885","text":"66201"},{"range":"69886","text":"66199"},{"range":"69887","text":"66201"},{"range":"69888","text":"66199"},{"range":"69889","text":"66201"},{"range":"69890","text":"66199"},{"range":"69891","text":"66201"},{"range":"69892","text":"66199"},{"range":"69893","text":"66201"},{"range":"69894","text":"66199"},{"range":"69895","text":"66201"},{"range":"69896","text":"66199"},{"range":"69897","text":"66201"},{"range":"69898","text":"66199"},{"range":"69899","text":"66201"},{"range":"69900","text":"66199"},{"range":"69901","text":"66201"},{"range":"69902","text":"66199"},{"range":"69903","text":"66201"},{"range":"69904","text":"66199"},{"range":"69905","text":"66201"},{"range":"69906","text":"66199"},{"range":"69907","text":"66201"},{"range":"69908","text":"66199"},{"range":"69909","text":"66201"},{"range":"69910","text":"66199"},{"range":"69911","text":"66201"},{"range":"69912","text":"66199"},{"range":"69913","text":"66201"},{"range":"69914","text":"66199"},{"range":"69915","text":"66201"},{"range":"69916","text":"66199"},{"range":"69917","text":"66201"},{"range":"69918","text":"66199"},{"range":"69919","text":"66201"},{"range":"69920","text":"66199"},{"range":"69921","text":"66201"},{"range":"69922","text":"66199"},{"range":"69923","text":"66201"},{"range":"69924","text":"66199"},{"range":"69925","text":"66201"},{"range":"69926","text":"66199"},{"range":"69927","text":"66201"},{"range":"69928","text":"66199"},{"range":"69929","text":"66201"},{"range":"69930","text":"66199"},{"range":"69931","text":"66201"},{"range":"69932","text":"66199"},{"range":"69933","text":"66201"},{"range":"69934","text":"66199"},{"range":"69935","text":"66201"},{"range":"69936","text":"66199"},{"range":"69937","text":"66201"},{"range":"69938","text":"66199"},{"range":"69939","text":"66201"},{"range":"69940","text":"66199"},{"range":"69941","text":"66201"},{"range":"69942","text":"66199"},{"range":"69943","text":"66201"},{"range":"69944","text":"66199"},{"range":"69945","text":"66201"},{"range":"69946","text":"66199"},{"range":"69947","text":"66201"},{"range":"69948","text":"66199"},{"range":"69949","text":"66201"},{"range":"69950","text":"66199"},{"range":"69951","text":"66201"},{"range":"69952","text":"66199"},{"range":"69953","text":"66201"},{"range":"69954","text":"66199"},{"range":"69955","text":"66201"},{"range":"69956","text":"66199"},{"range":"69957","text":"66201"},{"range":"69958","text":"66199"},{"range":"69959","text":"66201"},{"range":"69960","text":"66199"},{"range":"69961","text":"66201"},{"range":"69962","text":"66199"},{"range":"69963","text":"66201"},{"range":"69964","text":"66199"},{"range":"69965","text":"66201"},{"range":"69966","text":"66199"},{"range":"69967","text":"66201"},{"range":"69968","text":"66199"},{"range":"69969","text":"66201"},{"range":"69970","text":"66199"},{"range":"69971","text":"66201"},{"range":"69972","text":"66199"},{"range":"69973","text":"66201"},{"range":"69974","text":"66199"},{"range":"69975","text":"66201"},{"range":"69976","text":"66199"},{"range":"69977","text":"66201"},{"range":"69978","text":"66199"},{"range":"69979","text":"66201"},{"range":"69980","text":"66199"},{"range":"69981","text":"66201"},{"range":"69982","text":"66199"},{"range":"69983","text":"66201"},{"range":"69984","text":"66199"},{"range":"69985","text":"66201"},{"range":"69986","text":"66199"},{"range":"69987","text":"66201"},{"range":"69988","text":"66199"},{"range":"69989","text":"66201"},{"range":"69990","text":"66199"},{"range":"69991","text":"66201"},{"range":"69992","text":"66199"},{"range":"69993","text":"66201"},{"range":"69994","text":"66199"},{"range":"69995","text":"66201"},{"range":"69996","text":"66199"},{"range":"69997","text":"66201"},{"range":"69998","text":"66199"},{"range":"69999","text":"66201"},{"range":"70000","text":"66199"},{"range":"70001","text":"66201"},{"range":"70002","text":"66199"},{"range":"70003","text":"66201"},{"range":"70004","text":"66199"},{"range":"70005","text":"66201"},{"range":"70006","text":"66199"},{"range":"70007","text":"66201"},{"range":"70008","text":"66199"},{"range":"70009","text":"66201"},{"range":"70010","text":"66199"},{"range":"70011","text":"66201"},{"range":"70012","text":"66199"},{"range":"70013","text":"66201"},{"range":"70014","text":"66199"},{"range":"70015","text":"66201"},{"range":"70016","text":"66199"},{"range":"70017","text":"66201"},{"range":"70018","text":"66199"},{"range":"70019","text":"66201"},{"range":"70020","text":"66199"},{"range":"70021","text":"66201"},{"range":"70022","text":"66199"},{"range":"70023","text":"66201"},{"range":"70024","text":"66199"},{"range":"70025","text":"66201"},{"range":"70026","text":"66199"},{"range":"70027","text":"66201"},{"range":"70028","text":"66199"},{"range":"70029","text":"66201"},{"range":"70030","text":"66199"},{"range":"70031","text":"66201"},{"range":"70032","text":"66199"},{"range":"70033","text":"66201"},{"range":"70034","text":"66199"},{"range":"70035","text":"66201"},{"range":"70036","text":"66199"},{"range":"70037","text":"66201"},{"range":"70038","text":"66199"},{"range":"70039","text":"66201"},{"range":"70040","text":"66199"},{"range":"70041","text":"66201"},{"range":"70042","text":"66199"},{"range":"70043","text":"66201"},{"range":"70044","text":"66199"},{"range":"70045","text":"66201"},{"range":"70046","text":"66199"},{"range":"70047","text":"66201"},{"range":"70048","text":"66199"},{"range":"70049","text":"66201"},{"range":"70050","text":"66199"},{"range":"70051","text":"66201"},{"range":"70052","text":"66199"},{"range":"70053","text":"66201"},{"range":"70054","text":"66199"},{"range":"70055","text":"66201"},{"range":"70056","text":"66199"},{"range":"70057","text":"66201"},{"range":"70058","text":"66199"},{"range":"70059","text":"66201"},{"range":"70060","text":"66199"},{"range":"70061","text":"66201"},{"range":"70062","text":"66199"},{"range":"70063","text":"66201"},{"range":"70064","text":"66199"},{"range":"70065","text":"66201"},{"range":"70066","text":"66199"},{"range":"70067","text":"66201"},{"range":"70068","text":"66199"},{"range":"70069","text":"66201"},{"range":"70070","text":"66199"},{"range":"70071","text":"66201"},{"range":"70072","text":"66199"},{"range":"70073","text":"66201"},{"range":"70074","text":"66199"},{"range":"70075","text":"66201"},{"range":"70076","text":"66199"},{"range":"70077","text":"66201"},{"range":"70078","text":"66199"},{"range":"70079","text":"66201"},{"range":"70080","text":"66199"},{"range":"70081","text":"66201"},{"range":"70082","text":"66199"},{"range":"70083","text":"66201"},{"range":"70084","text":"66199"},{"range":"70085","text":"66201"},{"range":"70086","text":"66199"},{"range":"70087","text":"66201"},{"range":"70088","text":"66199"},{"range":"70089","text":"66201"},{"range":"70090","text":"66199"},{"range":"70091","text":"66201"},{"range":"70092","text":"66199"},{"range":"70093","text":"66201"},{"range":"70094","text":"66199"},{"range":"70095","text":"66201"},{"range":"70096","text":"66199"},{"range":"70097","text":"66201"},{"range":"70098","text":"66199"},{"range":"70099","text":"66201"},{"range":"70100","text":"66199"},{"range":"70101","text":"66201"},{"range":"70102","text":"66199"},{"range":"70103","text":"66201"},{"range":"70104","text":"66199"},{"range":"70105","text":"66201"},{"range":"70106","text":"66199"},{"range":"70107","text":"66201"},{"range":"70108","text":"66199"},{"range":"70109","text":"66201"},{"range":"70110","text":"66199"},{"range":"70111","text":"66201"},{"range":"70112","text":"66199"},{"range":"70113","text":"66201"},{"range":"70114","text":"66199"},{"range":"70115","text":"66201"},{"range":"70116","text":"66199"},{"range":"70117","text":"66201"},{"range":"70118","text":"66199"},{"range":"70119","text":"66201"},{"range":"70120","text":"66199"},{"range":"70121","text":"66201"},{"range":"70122","text":"66199"},{"range":"70123","text":"66201"},{"range":"70124","text":"66199"},{"range":"70125","text":"66201"},{"range":"70126","text":"66199"},{"range":"70127","text":"66201"},{"range":"70128","text":"66199"},{"range":"70129","text":"66201"},{"range":"70130","text":"66199"},{"range":"70131","text":"66201"},{"range":"70132","text":"66199"},{"range":"70133","text":"66201"},{"range":"70134","text":"66199"},{"range":"70135","text":"66201"},{"range":"70136","text":"66199"},{"range":"70137","text":"66201"},{"range":"70138","text":"66199"},{"range":"70139","text":"66201"},{"range":"70140","text":"66199"},{"range":"70141","text":"66201"},{"range":"70142","text":"66199"},{"range":"70143","text":"66201"},{"range":"70144","text":"66199"},{"range":"70145","text":"66201"},{"range":"70146","text":"66199"},{"range":"70147","text":"66201"},{"range":"70148","text":"66199"},{"range":"70149","text":"66201"},{"range":"70150","text":"66199"},{"range":"70151","text":"66201"},{"range":"70152","text":"66199"},{"range":"70153","text":"66201"},{"range":"70154","text":"66199"},{"range":"70155","text":"66201"},{"range":"70156","text":"66199"},{"range":"70157","text":"66201"},{"range":"70158","text":"66199"},{"range":"70159","text":"66201"},{"range":"70160","text":"66199"},{"range":"70161","text":"66201"},{"range":"70162","text":"66199"},{"range":"70163","text":"66201"},{"range":"70164","text":"66199"},{"range":"70165","text":"66201"},{"range":"70166","text":"66199"},{"range":"70167","text":"66201"},{"range":"70168","text":"66199"},{"range":"70169","text":"66201"},{"range":"70170","text":"66199"},{"range":"70171","text":"66201"},{"range":"70172","text":"66199"},{"range":"70173","text":"66201"},{"range":"70174","text":"66199"},{"range":"70175","text":"66201"},{"range":"70176","text":"66199"},{"range":"70177","text":"66201"},{"range":"70178","text":"66199"},{"range":"70179","text":"66201"},{"range":"70180","text":"66199"},{"range":"70181","text":"66201"},{"range":"70182","text":"66199"},{"range":"70183","text":"66201"},{"range":"70184","text":"66199"},{"range":"70185","text":"66201"},{"range":"70186","text":"66199"},{"range":"70187","text":"66201"},{"range":"70188","text":"66199"},{"range":"70189","text":"66201"},{"range":"70190","text":"66199"},{"range":"70191","text":"66201"},{"range":"70192","text":"66199"},{"range":"70193","text":"66201"},{"range":"70194","text":"66199"},{"range":"70195","text":"66201"},{"range":"70196","text":"66199"},{"range":"70197","text":"66201"},{"range":"70198","text":"66199"},{"range":"70199","text":"66201"},{"range":"70200","text":"66199"},{"range":"70201","text":"66201"},{"range":"70202","text":"66199"},{"range":"70203","text":"66201"},{"range":"70204","text":"66199"},{"range":"70205","text":"66201"},{"range":"70206","text":"66199"},{"range":"70207","text":"66201"},{"range":"70208","text":"66199"},{"range":"70209","text":"66201"},{"range":"70210","text":"66199"},{"range":"70211","text":"66201"},{"range":"70212","text":"66199"},{"range":"70213","text":"66201"},{"range":"70214","text":"66199"},{"range":"70215","text":"66201"},{"range":"70216","text":"66199"},{"range":"70217","text":"66201"},{"range":"70218","text":"66199"},{"range":"70219","text":"66201"},{"range":"70220","text":"66199"},{"range":"70221","text":"66201"},{"range":"70222","text":"66199"},{"range":"70223","text":"66201"},{"range":"70224","text":"66199"},{"range":"70225","text":"66201"},{"range":"70226","text":"66199"},{"range":"70227","text":"66201"},{"range":"70228","text":"66199"},{"range":"70229","text":"66201"},{"range":"70230","text":"66199"},{"range":"70231","text":"66201"},{"range":"70232","text":"66199"},{"range":"70233","text":"66201"},{"range":"70234","text":"66199"},{"range":"70235","text":"66201"},{"range":"70236","text":"66199"},{"range":"70237","text":"66201"},{"range":"70238","text":"66199"},{"range":"70239","text":"66201"},{"range":"70240","text":"66199"},{"range":"70241","text":"66201"},{"range":"70242","text":"66199"},{"range":"70243","text":"66201"},{"range":"70244","text":"66199"},{"range":"70245","text":"66201"},{"range":"70246","text":"66199"},{"range":"70247","text":"66201"},{"range":"70248","text":"66199"},{"range":"70249","text":"66201"},{"range":"70250","text":"66199"},{"range":"70251","text":"66201"},{"range":"70252","text":"66199"},{"range":"70253","text":"66201"},{"range":"70254","text":"66199"},{"range":"70255","text":"66201"},{"range":"70256","text":"66199"},{"range":"70257","text":"66201"},{"range":"70258","text":"66199"},{"range":"70259","text":"66201"},{"range":"70260","text":"66199"},{"range":"70261","text":"66201"},{"range":"70262","text":"66199"},{"range":"70263","text":"66201"},{"range":"70264","text":"66199"},{"range":"70265","text":"66201"},{"range":"70266","text":"66199"},{"range":"70267","text":"66201"},{"range":"70268","text":"66199"},{"range":"70269","text":"66201"},{"range":"70270","text":"66199"},{"range":"70271","text":"66201"},{"range":"70272","text":"66199"},{"range":"70273","text":"66201"},{"range":"70274","text":"66199"},{"range":"70275","text":"66201"},{"range":"70276","text":"66199"},{"range":"70277","text":"66201"},{"range":"70278","text":"66199"},{"range":"70279","text":"66201"},{"range":"70280","text":"66199"},{"range":"70281","text":"66201"},{"range":"70282","text":"66199"},{"range":"70283","text":"66201"},{"range":"70284","text":"66199"},{"range":"70285","text":"66201"},{"range":"70286","text":"66199"},{"range":"70287","text":"66201"},{"range":"70288","text":"66199"},{"range":"70289","text":"66201"},{"range":"70290","text":"66199"},{"range":"70291","text":"66201"},{"range":"70292","text":"66199"},{"range":"70293","text":"66201"},{"range":"70294","text":"66199"},{"range":"70295","text":"66201"},{"range":"70296","text":"66199"},{"range":"70297","text":"66201"},{"range":"70298","text":"66199"},{"range":"70299","text":"66201"},{"range":"70300","text":"66199"},{"range":"70301","text":"66201"},{"range":"70302","text":"66199"},{"range":"70303","text":"66201"},{"range":"70304","text":"66199"},{"range":"70305","text":"66201"},{"range":"70306","text":"66199"},{"range":"70307","text":"66201"},{"range":"70308","text":"66199"},{"range":"70309","text":"66201"},{"range":"70310","text":"66199"},{"range":"70311","text":"66201"},{"range":"70312","text":"66199"},{"range":"70313","text":"66201"},{"range":"70314","text":"66199"},{"range":"70315","text":"66201"},{"range":"70316","text":"66199"},{"range":"70317","text":"66201"},{"range":"70318","text":"66199"},{"range":"70319","text":"66201"},{"range":"70320","text":"66199"},{"range":"70321","text":"66201"},{"range":"70322","text":"66199"},{"range":"70323","text":"66201"},{"range":"70324","text":"66199"},{"range":"70325","text":"66201"},{"range":"70326","text":"66199"},{"range":"70327","text":"66201"},{"range":"70328","text":"66199"},{"range":"70329","text":"66201"},{"range":"70330","text":"66199"},{"range":"70331","text":"66201"},{"range":"70332","text":"66199"},{"range":"70333","text":"66201"},{"range":"70334","text":"66199"},{"range":"70335","text":"66201"},{"range":"70336","text":"66199"},{"range":"70337","text":"66201"},{"range":"70338","text":"66199"},{"range":"70339","text":"66201"},{"range":"70340","text":"66199"},{"range":"70341","text":"66201"},{"range":"70342","text":"66199"},{"range":"70343","text":"66201"},{"range":"70344","text":"66199"},{"range":"70345","text":"66201"},{"range":"70346","text":"66199"},{"range":"70347","text":"66201"},{"range":"70348","text":"66199"},{"range":"70349","text":"66201"},{"range":"70350","text":"66199"},{"range":"70351","text":"66201"},{"range":"70352","text":"66199"},{"range":"70353","text":"66201"},{"range":"70354","text":"66199"},{"range":"70355","text":"66201"},{"range":"70356","text":"66199"},{"range":"70357","text":"66201"},{"range":"70358","text":"66199"},{"range":"70359","text":"66201"},{"range":"70360","text":"66199"},{"range":"70361","text":"66201"},{"range":"70362","text":"66199"},{"range":"70363","text":"66201"},{"range":"70364","text":"66199"},{"range":"70365","text":"66201"},{"range":"70366","text":"66199"},{"range":"70367","text":"66201"},{"range":"70368","text":"66199"},{"range":"70369","text":"66201"},{"range":"70370","text":"66199"},{"range":"70371","text":"66201"},{"range":"70372","text":"66199"},{"range":"70373","text":"66201"},{"range":"70374","text":"66199"},{"range":"70375","text":"66201"},{"range":"70376","text":"66199"},{"range":"70377","text":"66201"},{"range":"70378","text":"66199"},{"range":"70379","text":"66201"},{"range":"70380","text":"66199"},{"range":"70381","text":"66201"},{"range":"70382","text":"66199"},{"range":"70383","text":"66201"},{"range":"70384","text":"66199"},{"range":"70385","text":"66201"},{"range":"70386","text":"66199"},{"range":"70387","text":"66201"},{"range":"70388","text":"66199"},{"range":"70389","text":"66201"},{"range":"70390","text":"66199"},{"range":"70391","text":"66201"},{"range":"70392","text":"66199"},{"range":"70393","text":"66201"},{"range":"70394","text":"66199"},{"range":"70395","text":"66201"},{"range":"70396","text":"66199"},{"range":"70397","text":"66201"},{"range":"70398","text":"66199"},{"range":"70399","text":"66201"},{"range":"70400","text":"66199"},{"range":"70401","text":"66201"},{"range":"70402","text":"66199"},{"range":"70403","text":"66201"},{"range":"70404","text":"66199"},{"range":"70405","text":"66201"},{"range":"70406","text":"66199"},{"range":"70407","text":"66201"},{"range":"70408","text":"66199"},{"range":"70409","text":"66201"},{"range":"70410","text":"66199"},{"range":"70411","text":"66201"},{"range":"70412","text":"66199"},{"range":"70413","text":"66201"},{"range":"70414","text":"66199"},{"range":"70415","text":"66201"},{"range":"70416","text":"66199"},{"range":"70417","text":"66201"},{"range":"70418","text":"66199"},{"range":"70419","text":"66201"},{"range":"70420","text":"66199"},{"range":"70421","text":"66201"},{"range":"70422","text":"66199"},{"range":"70423","text":"66201"},{"range":"70424","text":"66199"},{"range":"70425","text":"66201"},{"range":"70426","text":"66199"},{"range":"70427","text":"66201"},{"range":"70428","text":"66199"},{"range":"70429","text":"66201"},{"range":"70430","text":"66199"},{"range":"70431","text":"66201"},{"range":"70432","text":"66199"},{"range":"70433","text":"66201"},{"range":"70434","text":"66199"},{"range":"70435","text":"66201"},{"range":"70436","text":"66199"},{"range":"70437","text":"66201"},{"range":"70438","text":"66199"},{"range":"70439","text":"66201"},{"range":"70440","text":"66199"},{"range":"70441","text":"66201"},{"range":"70442","text":"66199"},{"range":"70443","text":"66201"},{"range":"70444","text":"66199"},{"range":"70445","text":"66201"},{"range":"70446","text":"66199"},{"range":"70447","text":"66201"},{"range":"70448","text":"66199"},{"range":"70449","text":"66201"},{"range":"70450","text":"66199"},{"range":"70451","text":"66201"},{"range":"70452","text":"66199"},{"range":"70453","text":"66201"},{"range":"70454","text":"66199"},{"range":"70455","text":"66201"},{"range":"70456","text":"66199"},{"range":"70457","text":"66201"},{"range":"70458","text":"66199"},{"range":"70459","text":"66201"},{"range":"70460","text":"66199"},{"range":"70461","text":"66201"},{"range":"70462","text":"66199"},{"range":"70463","text":"66201"},{"range":"70464","text":"66199"},{"range":"70465","text":"66201"},{"range":"70466","text":"66199"},{"range":"70467","text":"66201"},{"range":"70468","text":"66199"},{"range":"70469","text":"66201"},{"range":"70470","text":"66199"},{"range":"70471","text":"66201"},{"range":"70472","text":"66199"},{"range":"70473","text":"66201"},{"range":"70474","text":"66199"},{"range":"70475","text":"66201"},{"range":"70476","text":"66199"},{"range":"70477","text":"66201"},{"range":"70478","text":"66199"},{"range":"70479","text":"66201"},{"range":"70480","text":"66199"},{"range":"70481","text":"66201"},{"range":"70482","text":"66199"},{"range":"70483","text":"66201"},{"range":"70484","text":"66199"},{"range":"70485","text":"66201"},{"range":"70486","text":"66199"},{"range":"70487","text":"66201"},{"range":"70488","text":"66199"},{"range":"70489","text":"66201"},{"range":"70490","text":"66199"},{"range":"70491","text":"66201"},{"range":"70492","text":"66199"},{"range":"70493","text":"66201"},{"range":"70494","text":"66199"},{"range":"70495","text":"66201"},{"range":"70496","text":"66199"},{"range":"70497","text":"66201"},{"range":"70498","text":"66199"},{"range":"70499","text":"66201"},{"range":"70500","text":"66199"},{"range":"70501","text":"66201"},{"range":"70502","text":"66199"},{"range":"70503","text":"66201"},{"range":"70504","text":"66199"},{"range":"70505","text":"66201"},{"range":"70506","text":"66199"},{"range":"70507","text":"66201"},{"range":"70508","text":"66199"},{"range":"70509","text":"66201"},{"range":"70510","text":"66199"},{"range":"70511","text":"66201"},{"range":"70512","text":"66199"},{"range":"70513","text":"66201"},{"range":"70514","text":"66199"},{"range":"70515","text":"66201"},{"range":"70516","text":"66199"},{"range":"70517","text":"66201"},{"range":"70518","text":"66199"},{"range":"70519","text":"66201"},{"range":"70520","text":"66199"},{"range":"70521","text":"66201"},{"range":"70522","text":"66199"},{"range":"70523","text":"66201"},{"range":"70524","text":"66199"},{"range":"70525","text":"66201"},{"range":"70526","text":"66199"},{"range":"70527","text":"66201"},{"range":"70528","text":"66199"},{"range":"70529","text":"66201"},{"range":"70530","text":"66199"},{"range":"70531","text":"66201"},{"range":"70532","text":"66199"},{"range":"70533","text":"66201"},{"range":"70534","text":"66199"},{"range":"70535","text":"66201"},{"range":"70536","text":"66199"},{"range":"70537","text":"66201"},{"range":"70538","text":"66199"},{"range":"70539","text":"66201"},{"range":"70540","text":"66199"},{"range":"70541","text":"66201"},{"range":"70542","text":"66199"},{"range":"70543","text":"66201"},{"range":"70544","text":"66199"},{"range":"70545","text":"66201"},{"range":"70546","text":"66199"},{"range":"70547","text":"66201"},{"range":"70548","text":"66199"},{"range":"70549","text":"66201"},{"range":"70550","text":"66199"},{"range":"70551","text":"66201"},{"range":"70552","text":"66199"},{"range":"70553","text":"66201"},{"range":"70554","text":"66199"},{"range":"70555","text":"66201"},{"range":"70556","text":"66199"},{"range":"70557","text":"66201"},{"range":"70558","text":"66199"},{"range":"70559","text":"66201"},{"range":"70560","text":"66199"},{"range":"70561","text":"66201"},{"range":"70562","text":"66199"},{"range":"70563","text":"66201"},{"range":"70564","text":"66199"},{"range":"70565","text":"66201"},{"range":"70566","text":"66199"},{"range":"70567","text":"66201"},{"range":"70568","text":"66199"},{"range":"70569","text":"66201"},{"range":"70570","text":"66199"},{"range":"70571","text":"66201"},{"range":"70572","text":"66199"},{"range":"70573","text":"66201"},{"range":"70574","text":"66199"},{"range":"70575","text":"66201"},{"range":"70576","text":"66199"},{"range":"70577","text":"66201"},{"range":"70578","text":"66199"},{"range":"70579","text":"66201"},{"range":"70580","text":"66199"},{"range":"70581","text":"66201"},{"range":"70582","text":"66199"},{"range":"70583","text":"66201"},{"range":"70584","text":"66199"},{"range":"70585","text":"66201"},{"range":"70586","text":"66199"},{"range":"70587","text":"66201"},{"range":"70588","text":"66199"},{"range":"70589","text":"66201"},{"range":"70590","text":"66199"},{"range":"70591","text":"66201"},{"range":"70592","text":"66199"},{"range":"70593","text":"66201"},{"range":"70594","text":"66199"},{"range":"70595","text":"66201"},{"range":"70596","text":"66199"},{"range":"70597","text":"66201"},{"range":"70598","text":"66199"},{"range":"70599","text":"66201"},{"range":"70600","text":"66199"},{"range":"70601","text":"66201"},{"range":"70602","text":"66199"},{"range":"70603","text":"66201"},{"range":"70604","text":"66199"},{"range":"70605","text":"66201"},{"range":"70606","text":"66199"},{"range":"70607","text":"66201"},{"range":"70608","text":"66199"},{"range":"70609","text":"66201"},{"range":"70610","text":"66199"},{"range":"70611","text":"66201"},{"range":"70612","text":"66199"},{"range":"70613","text":"66201"},{"range":"70614","text":"66199"},{"range":"70615","text":"66201"},{"range":"70616","text":"66199"},{"range":"70617","text":"66201"},{"range":"70618","text":"66199"},{"range":"70619","text":"66201"},{"range":"70620","text":"66199"},{"range":"70621","text":"66201"},{"range":"70622","text":"66199"},{"range":"70623","text":"66201"},{"range":"70624","text":"66199"},{"range":"70625","text":"66201"},{"range":"70626","text":"66199"},{"range":"70627","text":"66201"},{"range":"70628","text":"66199"},{"range":"70629","text":"66201"},{"range":"70630","text":"66199"},{"range":"70631","text":"66201"},{"range":"70632","text":"66199"},{"range":"70633","text":"66201"},{"range":"70634","text":"66199"},{"range":"70635","text":"66201"},{"range":"70636","text":"66199"},{"range":"70637","text":"66201"},{"range":"70638","text":"66199"},{"range":"70639","text":"66201"},{"range":"70640","text":"66199"},{"range":"70641","text":"66201"},{"range":"70642","text":"66199"},{"range":"70643","text":"66201"},{"range":"70644","text":"66199"},{"range":"70645","text":"66201"},{"range":"70646","text":"66199"},{"range":"70647","text":"66201"},{"range":"70648","text":"66199"},{"range":"70649","text":"66201"},{"range":"70650","text":"66199"},{"range":"70651","text":"66201"},{"range":"70652","text":"66199"},{"range":"70653","text":"66201"},{"range":"70654","text":"66199"},{"range":"70655","text":"66201"},{"range":"70656","text":"66199"},{"range":"70657","text":"66201"},{"range":"70658","text":"66199"},{"range":"70659","text":"66201"},{"range":"70660","text":"66199"},{"range":"70661","text":"66201"},{"range":"70662","text":"66199"},{"range":"70663","text":"66201"},{"range":"70664","text":"66199"},{"range":"70665","text":"66201"},{"range":"70666","text":"66199"},{"range":"70667","text":"66201"},{"range":"70668","text":"66199"},{"range":"70669","text":"66201"},{"range":"70670","text":"66199"},{"range":"70671","text":"66201"},{"range":"70672","text":"66199"},{"range":"70673","text":"66201"},{"range":"70674","text":"66199"},{"range":"70675","text":"66201"},{"range":"70676","text":"66199"},{"range":"70677","text":"66201"},{"range":"70678","text":"66199"},{"range":"70679","text":"66201"},{"range":"70680","text":"66199"},{"range":"70681","text":"66201"},{"range":"70682","text":"66199"},{"range":"70683","text":"66201"},{"range":"70684","text":"66199"},{"range":"70685","text":"66201"},{"range":"70686","text":"66199"},{"range":"70687","text":"66201"},{"range":"70688","text":"66199"},{"range":"70689","text":"66201"},{"range":"70690","text":"66199"},{"range":"70691","text":"66201"},{"range":"70692","text":"66199"},{"range":"70693","text":"66201"},{"range":"70694","text":"66199"},{"range":"70695","text":"66201"},{"range":"70696","text":"66199"},{"range":"70697","text":"66201"},{"range":"70698","text":"66199"},{"range":"70699","text":"66201"},{"range":"70700","text":"66199"},{"range":"70701","text":"66201"},{"range":"70702","text":"66199"},{"range":"70703","text":"66201"},{"range":"70704","text":"66199"},{"range":"70705","text":"66201"},{"range":"70706","text":"66199"},{"range":"70707","text":"66201"},{"range":"70708","text":"66199"},{"range":"70709","text":"66201"},{"range":"70710","text":"66199"},{"range":"70711","text":"66201"},{"range":"70712","text":"66199"},{"range":"70713","text":"66201"},{"range":"70714","text":"66199"},{"range":"70715","text":"66201"},{"range":"70716","text":"66199"},{"range":"70717","text":"66201"},{"range":"70718","text":"66199"},{"range":"70719","text":"66201"},{"range":"70720","text":"66199"},{"range":"70721","text":"66201"},{"range":"70722","text":"66199"},{"range":"70723","text":"66201"},{"range":"70724","text":"66199"},{"range":"70725","text":"66201"},{"range":"70726","text":"66199"},{"range":"70727","text":"66201"},{"range":"70728","text":"66199"},{"range":"70729","text":"66201"},{"range":"70730","text":"66199"},{"range":"70731","text":"66201"},{"range":"70732","text":"66199"},{"range":"70733","text":"66201"},{"range":"70734","text":"66199"},{"range":"70735","text":"66201"},{"range":"70736","text":"66199"},{"range":"70737","text":"66201"},{"range":"70738","text":"66199"},{"range":"70739","text":"66201"},{"range":"70740","text":"66199"},{"range":"70741","text":"66201"},{"range":"70742","text":"66199"},{"range":"70743","text":"66201"},{"range":"70744","text":"66199"},{"range":"70745","text":"66201"},{"range":"70746","text":"66199"},{"range":"70747","text":"66201"},{"range":"70748","text":"66199"},{"range":"70749","text":"66201"},{"range":"70750","text":"66199"},{"range":"70751","text":"66201"},{"range":"70752","text":"66199"},{"range":"70753","text":"66201"},{"range":"70754","text":"66199"},{"range":"70755","text":"66201"},{"range":"70756","text":"66199"},{"range":"70757","text":"66201"},{"range":"70758","text":"66199"},{"range":"70759","text":"66201"},{"range":"70760","text":"66199"},{"range":"70761","text":"66201"},{"range":"70762","text":"66199"},{"range":"70763","text":"66201"},{"range":"70764","text":"66199"},{"range":"70765","text":"66201"},{"range":"70766","text":"66199"},{"range":"70767","text":"66201"},{"range":"70768","text":"66199"},{"range":"70769","text":"66201"},{"range":"70770","text":"66199"},{"range":"70771","text":"66201"},{"range":"70772","text":"66199"},{"range":"70773","text":"66201"},{"range":"70774","text":"66199"},{"range":"70775","text":"66201"},{"range":"70776","text":"66199"},{"range":"70777","text":"66201"},{"range":"70778","text":"66199"},{"range":"70779","text":"66201"},{"range":"70780","text":"66199"},{"range":"70781","text":"66201"},{"range":"70782","text":"66199"},{"range":"70783","text":"66201"},{"range":"70784","text":"66199"},{"range":"70785","text":"66201"},{"range":"70786","text":"66199"},{"range":"70787","text":"66201"},{"range":"70788","text":"66199"},{"range":"70789","text":"66201"},{"range":"70790","text":"66199"},{"range":"70791","text":"66201"},{"range":"70792","text":"66199"},{"range":"70793","text":"66201"},{"range":"70794","text":"66199"},{"range":"70795","text":"66201"},{"range":"70796","text":"66199"},{"range":"70797","text":"66201"},{"range":"70798","text":"66199"},{"range":"70799","text":"66201"},{"range":"70800","text":"66199"},{"range":"70801","text":"66201"},{"range":"70802","text":"66199"},{"range":"70803","text":"66201"},{"range":"70804","text":"66199"},{"range":"70805","text":"66201"},{"range":"70806","text":"66199"},{"range":"70807","text":"66201"},{"range":"70808","text":"66199"},{"range":"70809","text":"66201"},{"range":"70810","text":"66199"},{"range":"70811","text":"66201"},{"range":"70812","text":"66199"},{"range":"70813","text":"66201"},{"range":"70814","text":"66199"},{"range":"70815","text":"66201"},{"range":"70816","text":"66199"},{"range":"70817","text":"66201"},{"range":"70818","text":"66199"},{"range":"70819","text":"66201"},{"range":"70820","text":"66199"},{"range":"70821","text":"66201"},{"range":"70822","text":"66199"},{"range":"70823","text":"66201"},{"range":"70824","text":"66199"},{"range":"70825","text":"66201"},{"range":"70826","text":"66199"},{"range":"70827","text":"66201"},{"range":"70828","text":"66199"},{"range":"70829","text":"66201"},{"range":"70830","text":"66199"},{"range":"70831","text":"66201"},{"range":"70832","text":"66199"},{"range":"70833","text":"66201"},{"range":"70834","text":"66199"},{"range":"70835","text":"66201"},{"range":"70836","text":"66199"},{"range":"70837","text":"66201"},{"range":"70838","text":"66199"},{"range":"70839","text":"66201"},{"range":"70840","text":"66199"},{"range":"70841","text":"66201"},{"range":"70842","text":"66199"},{"range":"70843","text":"66201"},{"range":"70844","text":"66199"},{"range":"70845","text":"66201"},{"range":"70846","text":"66199"},{"range":"70847","text":"66201"},{"range":"70848","text":"66199"},{"range":"70849","text":"66201"},{"range":"70850","text":"66199"},{"range":"70851","text":"66201"},{"range":"70852","text":"66199"},{"range":"70853","text":"66201"},{"range":"70854","text":"66199"},{"range":"70855","text":"66201"},{"range":"70856","text":"66199"},{"range":"70857","text":"66201"},{"range":"70858","text":"66199"},{"range":"70859","text":"66201"},{"range":"70860","text":"66199"},{"range":"70861","text":"66201"},{"range":"70862","text":"66199"},{"range":"70863","text":"66201"},{"range":"70864","text":"66199"},{"range":"70865","text":"66201"},{"range":"70866","text":"66199"},{"range":"70867","text":"66201"},{"range":"70868","text":"66199"},{"range":"70869","text":"66201"},{"range":"70870","text":"66199"},{"range":"70871","text":"66201"},{"range":"70872","text":"66199"},{"range":"70873","text":"66201"},{"range":"70874","text":"66199"},{"range":"70875","text":"66201"},{"range":"70876","text":"66199"},{"range":"70877","text":"66201"},{"range":"70878","text":"66199"},{"range":"70879","text":"66201"},{"range":"70880","text":"66199"},{"range":"70881","text":"66201"},{"range":"70882","text":"66199"},{"range":"70883","text":"66201"},{"range":"70884","text":"66199"},{"range":"70885","text":"66201"},{"range":"70886","text":"66199"},{"range":"70887","text":"66201"},{"range":"70888","text":"66199"},{"range":"70889","text":"66201"},{"range":"70890","text":"66199"},{"range":"70891","text":"66201"},{"range":"70892","text":"66199"},{"range":"70893","text":"66201"},{"range":"70894","text":"66199"},{"range":"70895","text":"66201"},{"range":"70896","text":"66199"},{"range":"70897","text":"66201"},{"range":"70898","text":"66199"},{"range":"70899","text":"66201"},{"range":"70900","text":"66199"},{"range":"70901","text":"66201"},{"range":"70902","text":"66199"},{"range":"70903","text":"66201"},{"range":"70904","text":"66199"},{"range":"70905","text":"66201"},{"range":"70906","text":"66199"},{"range":"70907","text":"66201"},{"range":"70908","text":"66199"},{"range":"70909","text":"66201"},{"range":"70910","text":"66199"},{"range":"70911","text":"66201"},{"range":"70912","text":"66199"},{"range":"70913","text":"66201"},{"range":"70914","text":"66199"},{"range":"70915","text":"66201"},{"range":"70916","text":"66199"},{"range":"70917","text":"66201"},{"range":"70918","text":"66199"},{"range":"70919","text":"66201"},{"range":"70920","text":"66199"},{"range":"70921","text":"66201"},{"range":"70922","text":"66199"},{"range":"70923","text":"66201"},{"range":"70924","text":"66199"},{"range":"70925","text":"66201"},{"range":"70926","text":"66199"},{"range":"70927","text":"66201"},{"range":"70928","text":"66199"},{"range":"70929","text":"66201"},{"range":"70930","text":"66199"},{"range":"70931","text":"66201"},{"range":"70932","text":"66199"},{"range":"70933","text":"66201"},{"range":"70934","text":"66199"},{"range":"70935","text":"66201"},{"range":"70936","text":"66199"},{"range":"70937","text":"66201"},{"range":"70938","text":"66199"},{"range":"70939","text":"66201"},{"range":"70940","text":"66199"},{"range":"70941","text":"66201"},{"range":"70942","text":"66199"},{"range":"70943","text":"66201"},{"range":"70944","text":"66199"},{"range":"70945","text":"66201"},{"range":"70946","text":"66199"},{"range":"70947","text":"66201"},{"range":"70948","text":"66199"},{"range":"70949","text":"66201"},{"range":"70950","text":"66199"},{"range":"70951","text":"66201"},{"range":"70952","text":"66199"},{"range":"70953","text":"66201"},{"range":"70954","text":"66199"},{"range":"70955","text":"66201"},{"range":"70956","text":"66199"},{"range":"70957","text":"66201"},{"range":"70958","text":"66199"},{"range":"70959","text":"66201"},{"range":"70960","text":"66199"},{"range":"70961","text":"66201"},{"range":"70962","text":"66199"},{"range":"70963","text":"66201"},{"range":"70964","text":"66199"},{"range":"70965","text":"66201"},{"range":"70966","text":"66199"},{"range":"70967","text":"66201"},{"range":"70968","text":"66199"},{"range":"70969","text":"66201"},{"range":"70970","text":"66199"},{"range":"70971","text":"66201"},{"range":"70972","text":"66199"},{"range":"70973","text":"66201"},{"range":"70974","text":"66199"},{"range":"70975","text":"66201"},{"range":"70976","text":"66199"},{"range":"70977","text":"66201"},{"range":"70978","text":"66199"},{"range":"70979","text":"66201"},{"range":"70980","text":"66199"},{"range":"70981","text":"66201"},{"range":"70982","text":"66199"},{"range":"70983","text":"66201"},{"range":"70984","text":"66199"},{"range":"70985","text":"66201"},{"range":"70986","text":"66199"},{"range":"70987","text":"66201"},{"range":"70988","text":"66199"},{"range":"70989","text":"66201"},{"range":"70990","text":"66199"},{"range":"70991","text":"66201"},{"range":"70992","text":"66199"},{"range":"70993","text":"66201"},{"range":"70994","text":"66199"},{"range":"70995","text":"66201"},{"range":"70996","text":"66199"},{"range":"70997","text":"66201"},{"range":"70998","text":"66199"},{"range":"70999","text":"66201"},{"range":"71000","text":"66199"},{"range":"71001","text":"66201"},{"range":"71002","text":"66199"},{"range":"71003","text":"66201"},{"range":"71004","text":"66199"},{"range":"71005","text":"66201"},{"range":"71006","text":"66199"},{"range":"71007","text":"66201"},{"range":"71008","text":"66199"},{"range":"71009","text":"66201"},{"range":"71010","text":"66199"},{"range":"71011","text":"66201"},{"range":"71012","text":"66199"},{"range":"71013","text":"66201"},{"range":"71014","text":"66199"},{"range":"71015","text":"66201"},{"range":"71016","text":"66199"},{"range":"71017","text":"66201"},{"range":"71018","text":"66199"},{"range":"71019","text":"66201"},{"range":"71020","text":"66199"},{"range":"71021","text":"66201"},{"range":"71022","text":"66199"},{"range":"71023","text":"66201"},{"range":"71024","text":"66199"},{"range":"71025","text":"66201"},{"range":"71026","text":"66199"},{"range":"71027","text":"66201"},{"range":"71028","text":"66199"},{"range":"71029","text":"66201"},{"range":"71030","text":"66199"},{"range":"71031","text":"66201"},{"range":"71032","text":"66199"},{"range":"71033","text":"66201"},{"range":"71034","text":"66199"},{"range":"71035","text":"66201"},{"range":"71036","text":"66199"},{"range":"71037","text":"66201"},{"range":"71038","text":"66199"},{"range":"71039","text":"66201"},{"range":"71040","text":"66199"},{"range":"71041","text":"66201"},{"range":"71042","text":"66199"},{"range":"71043","text":"66201"},{"range":"71044","text":"66199"},{"range":"71045","text":"66201"},{"range":"71046","text":"66199"},{"range":"71047","text":"66201"},{"range":"71048","text":"66199"},{"range":"71049","text":"66201"},{"range":"71050","text":"66199"},{"range":"71051","text":"66201"},{"range":"71052","text":"66199"},{"range":"71053","text":"66201"},{"range":"71054","text":"66199"},{"range":"71055","text":"66201"},{"range":"71056","text":"66199"},{"range":"71057","text":"66201"},{"range":"71058","text":"66199"},{"range":"71059","text":"66201"},{"range":"71060","text":"66199"},{"range":"71061","text":"66201"},{"range":"71062","text":"66199"},{"range":"71063","text":"66201"},{"range":"71064","text":"66199"},{"range":"71065","text":"66201"},{"range":"71066","text":"66199"},{"range":"71067","text":"66201"},{"range":"71068","text":"66199"},{"range":"71069","text":"66201"},{"range":"71070","text":"66199"},{"range":"71071","text":"66201"},{"range":"71072","text":"66199"},{"range":"71073","text":"66201"},{"range":"71074","text":"66199"},{"range":"71075","text":"66201"},{"range":"71076","text":"66199"},{"range":"71077","text":"66201"},{"range":"71078","text":"66199"},{"range":"71079","text":"66201"},{"range":"71080","text":"66199"},{"range":"71081","text":"66201"},{"range":"71082","text":"66199"},{"range":"71083","text":"66201"},{"range":"71084","text":"66199"},{"range":"71085","text":"66201"},{"range":"71086","text":"66199"},{"range":"71087","text":"66201"},{"range":"71088","text":"66199"},{"range":"71089","text":"66201"},{"range":"71090","text":"66199"},{"range":"71091","text":"66201"},{"range":"71092","text":"66199"},{"range":"71093","text":"66201"},{"range":"71094","text":"66199"},{"range":"71095","text":"66201"},{"range":"71096","text":"66199"},{"range":"71097","text":"66201"},{"range":"71098","text":"66199"},{"range":"71099","text":"66201"},{"range":"71100","text":"66199"},{"range":"71101","text":"66201"},{"range":"71102","text":"66199"},{"range":"71103","text":"66201"},{"range":"71104","text":"66199"},{"range":"71105","text":"66201"},{"range":"71106","text":"66199"},{"range":"71107","text":"66201"},{"range":"71108","text":"66199"},{"range":"71109","text":"66201"},{"range":"71110","text":"66199"},{"range":"71111","text":"66201"},{"range":"71112","text":"66199"},{"range":"71113","text":"66201"},{"range":"71114","text":"66199"},{"range":"71115","text":"66201"},{"range":"71116","text":"66199"},{"range":"71117","text":"66201"},{"range":"71118","text":"66199"},{"range":"71119","text":"66201"},{"range":"71120","text":"66199"},{"range":"71121","text":"66201"},{"range":"71122","text":"66199"},{"range":"71123","text":"66201"},{"range":"71124","text":"66199"},{"range":"71125","text":"66201"},{"range":"71126","text":"66199"},{"range":"71127","text":"66201"},{"range":"71128","text":"66199"},{"range":"71129","text":"66201"},{"range":"71130","text":"66199"},{"range":"71131","text":"66201"},{"range":"71132","text":"66199"},{"range":"71133","text":"66201"},{"range":"71134","text":"66199"},{"range":"71135","text":"66201"},{"range":"71136","text":"66199"},{"range":"71137","text":"66201"},{"range":"71138","text":"66199"},{"range":"71139","text":"66201"},{"range":"71140","text":"66199"},{"range":"71141","text":"66201"},{"range":"71142","text":"66199"},{"range":"71143","text":"66201"},{"range":"71144","text":"66199"},{"range":"71145","text":"66201"},{"range":"71146","text":"66199"},{"range":"71147","text":"66201"},{"range":"71148","text":"66199"},{"range":"71149","text":"66201"},{"range":"71150","text":"66199"},{"range":"71151","text":"66201"},{"range":"71152","text":"66199"},{"range":"71153","text":"66201"},{"range":"71154","text":"66199"},{"range":"71155","text":"66201"},{"range":"71156","text":"66199"},{"range":"71157","text":"66201"},{"range":"71158","text":"66199"},{"range":"71159","text":"66201"},{"range":"71160","text":"66199"},{"range":"71161","text":"66201"},{"range":"71162","text":"66199"},{"range":"71163","text":"66201"},{"range":"71164","text":"66199"},{"range":"71165","text":"66201"},{"range":"71166","text":"66199"},{"range":"71167","text":"66201"},{"range":"71168","text":"66199"},{"range":"71169","text":"66201"},{"range":"71170","text":"66199"},{"range":"71171","text":"66201"},{"range":"71172","text":"66199"},{"range":"71173","text":"66201"},{"range":"71174","text":"66199"},{"range":"71175","text":"66201"},{"range":"71176","text":"66199"},{"range":"71177","text":"66201"},{"range":"71178","text":"66199"},{"range":"71179","text":"66201"},{"range":"71180","text":"66199"},{"range":"71181","text":"66201"},{"range":"71182","text":"66199"},{"range":"71183","text":"66201"},{"range":"71184","text":"66199"},{"range":"71185","text":"66201"},{"range":"71186","text":"66199"},{"range":"71187","text":"66201"},{"range":"71188","text":"66199"},{"range":"71189","text":"66201"},{"range":"71190","text":"66199"},{"range":"71191","text":"66201"},{"range":"71192","text":"66199"},{"range":"71193","text":"66201"},{"range":"71194","text":"66199"},{"range":"71195","text":"66201"},{"range":"71196","text":"66199"},{"range":"71197","text":"66201"},{"range":"71198","text":"66199"},{"range":"71199","text":"66201"},{"range":"71200","text":"66199"},{"range":"71201","text":"66201"},{"range":"71202","text":"66199"},{"range":"71203","text":"66201"},{"range":"71204","text":"66199"},{"range":"71205","text":"66201"},{"range":"71206","text":"66199"},{"range":"71207","text":"66201"},{"range":"71208","text":"66199"},{"range":"71209","text":"66201"},{"range":"71210","text":"66199"},{"range":"71211","text":"66201"},{"range":"71212","text":"66199"},{"range":"71213","text":"66201"},{"range":"71214","text":"66199"},{"range":"71215","text":"66201"},{"range":"71216","text":"66199"},{"range":"71217","text":"66201"},{"range":"71218","text":"66199"},{"range":"71219","text":"66201"},{"range":"71220","text":"66199"},{"range":"71221","text":"66201"},{"range":"71222","text":"66199"},{"range":"71223","text":"66201"},{"range":"71224","text":"66199"},{"range":"71225","text":"66201"},{"range":"71226","text":"66199"},{"range":"71227","text":"66201"},{"range":"71228","text":"66199"},{"range":"71229","text":"66201"},{"range":"71230","text":"66199"},{"range":"71231","text":"66201"},{"range":"71232","text":"66199"},{"range":"71233","text":"66201"},{"range":"71234","text":"66199"},{"range":"71235","text":"66201"},{"range":"71236","text":"66199"},{"range":"71237","text":"66201"},{"range":"71238","text":"66199"},{"range":"71239","text":"66201"},{"range":"71240","text":"66199"},{"range":"71241","text":"66201"},{"range":"71242","text":"66199"},{"range":"71243","text":"66201"},{"range":"71244","text":"66199"},{"range":"71245","text":"66201"},{"range":"71246","text":"66199"},{"range":"71247","text":"66201"},{"range":"71248","text":"66199"},{"range":"71249","text":"66201"},{"range":"71250","text":"66199"},{"range":"71251","text":"66201"},{"range":"71252","text":"66199"},{"range":"71253","text":"66201"},{"range":"71254","text":"66199"},{"range":"71255","text":"66201"},{"range":"71256","text":"66199"},{"range":"71257","text":"66201"},{"range":"71258","text":"66199"},{"range":"71259","text":"66201"},{"range":"71260","text":"66199"},{"range":"71261","text":"66201"},{"range":"71262","text":"66199"},{"range":"71263","text":"66201"},{"range":"71264","text":"66199"},{"range":"71265","text":"66201"},{"range":"71266","text":"66199"},{"range":"71267","text":"66201"},{"range":"71268","text":"66199"},{"range":"71269","text":"66201"},{"range":"71270","text":"66199"},{"range":"71271","text":"66201"},{"range":"71272","text":"66199"},{"range":"71273","text":"66201"},{"range":"71274","text":"66199"},{"range":"71275","text":"66201"},{"range":"71276","text":"66199"},{"range":"71277","text":"66201"},{"range":"71278","text":"66199"},{"range":"71279","text":"66201"},{"range":"71280","text":"66199"},{"range":"71281","text":"66201"},{"range":"71282","text":"66199"},{"range":"71283","text":"66201"},{"range":"71284","text":"66199"},{"range":"71285","text":"66201"},{"range":"71286","text":"66199"},{"range":"71287","text":"66201"},{"range":"71288","text":"66199"},{"range":"71289","text":"66201"},{"range":"71290","text":"66199"},{"range":"71291","text":"66201"},{"range":"71292","text":"66199"},{"range":"71293","text":"66201"},{"range":"71294","text":"66199"},{"range":"71295","text":"66201"},{"range":"71296","text":"66199"},{"range":"71297","text":"66201"},{"range":"71298","text":"66199"},{"range":"71299","text":"66201"},{"range":"71300","text":"66199"},{"range":"71301","text":"66201"},{"range":"71302","text":"66199"},{"range":"71303","text":"66201"},{"range":"71304","text":"66199"},{"range":"71305","text":"66201"},{"range":"71306","text":"66199"},{"range":"71307","text":"66201"},{"range":"71308","text":"66199"},{"range":"71309","text":"66201"},{"range":"71310","text":"66199"},{"range":"71311","text":"66201"},{"range":"71312","text":"66199"},{"range":"71313","text":"66201"},{"range":"71314","text":"66199"},{"range":"71315","text":"66201"},{"range":"71316","text":"66199"},{"range":"71317","text":"66201"},{"range":"71318","text":"66199"},{"range":"71319","text":"66201"},{"range":"71320","text":"66199"},{"range":"71321","text":"66201"},{"range":"71322","text":"66199"},{"range":"71323","text":"66201"},{"range":"71324","text":"66199"},{"range":"71325","text":"66201"},{"range":"71326","text":"66199"},{"range":"71327","text":"66201"},{"range":"71328","text":"66199"},{"range":"71329","text":"66201"},{"range":"71330","text":"66199"},{"range":"71331","text":"66201"},{"range":"71332","text":"66199"},{"range":"71333","text":"66201"},{"range":"71334","text":"66199"},{"range":"71335","text":"66201"},{"range":"71336","text":"66199"},{"range":"71337","text":"66201"},{"range":"71338","text":"66199"},{"range":"71339","text":"66201"},{"range":"71340","text":"66199"},{"range":"71341","text":"66201"},{"range":"71342","text":"66199"},{"range":"71343","text":"66201"},{"range":"71344","text":"66199"},{"range":"71345","text":"66201"},{"range":"71346","text":"66199"},{"range":"71347","text":"66201"},{"range":"71348","text":"66199"},{"range":"71349","text":"66201"},{"range":"71350","text":"66199"},{"range":"71351","text":"66201"},{"range":"71352","text":"66199"},{"range":"71353","text":"66201"},{"range":"71354","text":"66199"},{"range":"71355","text":"66201"},{"range":"71356","text":"66199"},{"range":"71357","text":"66201"},{"range":"71358","text":"66199"},{"range":"71359","text":"66201"},{"range":"71360","text":"66199"},{"range":"71361","text":"66201"},{"range":"71362","text":"66199"},{"range":"71363","text":"66201"},{"range":"71364","text":"66199"},{"range":"71365","text":"66201"},{"range":"71366","text":"66199"},{"range":"71367","text":"66201"},{"range":"71368","text":"66199"},{"range":"71369","text":"66201"},{"range":"71370","text":"66199"},{"range":"71371","text":"66201"},{"range":"71372","text":"66199"},{"range":"71373","text":"66201"},{"range":"71374","text":"66199"},{"range":"71375","text":"66201"},{"range":"71376","text":"66199"},{"range":"71377","text":"66201"},{"range":"71378","text":"66199"},{"range":"71379","text":"66201"},{"range":"71380","text":"66199"},{"range":"71381","text":"66201"},{"range":"71382","text":"66199"},{"range":"71383","text":"66201"},{"range":"71384","text":"66199"},{"range":"71385","text":"66201"},{"range":"71386","text":"66199"},{"range":"71387","text":"66201"},{"range":"71388","text":"66199"},{"range":"71389","text":"66201"},{"range":"71390","text":"66199"},{"range":"71391","text":"66201"},{"range":"71392","text":"66199"},{"range":"71393","text":"66201"},{"range":"71394","text":"66199"},{"range":"71395","text":"66201"},{"range":"71396","text":"66199"},{"range":"71397","text":"66201"},{"range":"71398","text":"66199"},{"range":"71399","text":"66201"},{"range":"71400","text":"66199"},{"range":"71401","text":"66201"},{"range":"71402","text":"66199"},{"range":"71403","text":"66201"},{"range":"71404","text":"66199"},{"range":"71405","text":"66201"},{"range":"71406","text":"66199"},{"range":"71407","text":"66201"},{"range":"71408","text":"66199"},{"range":"71409","text":"66201"},{"range":"71410","text":"66199"},{"range":"71411","text":"66201"},{"range":"71412","text":"66199"},{"range":"71413","text":"66201"},{"range":"71414","text":"66199"},{"range":"71415","text":"66201"},{"range":"71416","text":"66199"},{"range":"71417","text":"66201"},{"range":"71418","text":"66199"},{"range":"71419","text":"66201"},{"range":"71420","text":"66199"},{"range":"71421","text":"66201"},{"range":"71422","text":"66199"},{"range":"71423","text":"66201"},{"range":"71424","text":"66199"},{"range":"71425","text":"66201"},{"range":"71426","text":"66199"},{"range":"71427","text":"66201"},{"range":"71428","text":"66199"},{"range":"71429","text":"66201"},{"range":"71430","text":"66199"},{"range":"71431","text":"66201"},{"range":"71432","text":"66199"},{"range":"71433","text":"66201"},{"range":"71434","text":"66199"},{"range":"71435","text":"66201"},{"range":"71436","text":"66199"},{"range":"71437","text":"66201"},{"range":"71438","text":"66199"},{"range":"71439","text":"66201"},{"range":"71440","text":"66199"},{"range":"71441","text":"66201"},{"range":"71442","text":"66199"},{"range":"71443","text":"66201"},{"range":"71444","text":"66199"},{"range":"71445","text":"66201"},{"range":"71446","text":"66199"},{"range":"71447","text":"66201"},{"range":"71448","text":"66199"},{"range":"71449","text":"66201"},{"range":"71450","text":"66199"},{"range":"71451","text":"66201"},{"range":"71452","text":"66199"},{"range":"71453","text":"66201"},{"range":"71454","text":"66199"},{"range":"71455","text":"66201"},{"range":"71456","text":"66199"},{"range":"71457","text":"66201"},{"range":"71458","text":"66199"},{"range":"71459","text":"66201"},{"range":"71460","text":"66199"},{"range":"71461","text":"66201"},{"range":"71462","text":"66199"},{"range":"71463","text":"66201"},{"range":"71464","text":"66199"},{"range":"71465","text":"66201"},{"range":"71466","text":"66199"},{"range":"71467","text":"66201"},{"range":"71468","text":"66199"},{"range":"71469","text":"66201"},{"range":"71470","text":"66199"},{"range":"71471","text":"66201"},{"range":"71472","text":"66199"},{"range":"71473","text":"66201"},{"range":"71474","text":"66199"},{"range":"71475","text":"66201"},{"range":"71476","text":"66199"},{"range":"71477","text":"66201"},{"range":"71478","text":"66199"},{"range":"71479","text":"66201"},{"range":"71480","text":"66199"},{"range":"71481","text":"66201"},{"range":"71482","text":"66199"},{"range":"71483","text":"66201"},{"range":"71484","text":"66199"},{"range":"71485","text":"66201"},{"range":"71486","text":"66199"},{"range":"71487","text":"66201"},{"range":"71488","text":"66199"},{"range":"71489","text":"66201"},{"range":"71490","text":"66199"},{"range":"71491","text":"66201"},{"range":"71492","text":"66199"},{"range":"71493","text":"66201"},{"range":"71494","text":"66199"},{"range":"71495","text":"66201"},{"range":"71496","text":"66199"},{"range":"71497","text":"66201"},{"range":"71498","text":"66199"},{"range":"71499","text":"66201"},{"range":"71500","text":"66199"},{"range":"71501","text":"66201"},{"range":"71502","text":"66199"},{"range":"71503","text":"66201"},{"range":"71504","text":"66199"},{"range":"71505","text":"66201"},{"range":"71506","text":"66199"},{"range":"71507","text":"66201"},{"range":"71508","text":"66199"},{"range":"71509","text":"66201"},{"range":"71510","text":"66199"},{"range":"71511","text":"66201"},{"range":"71512","text":"66199"},{"range":"71513","text":"66201"},{"range":"71514","text":"66199"},{"range":"71515","text":"66201"},{"range":"71516","text":"66199"},{"range":"71517","text":"66201"},{"range":"71518","text":"66199"},{"range":"71519","text":"66201"},{"range":"71520","text":"66199"},{"range":"71521","text":"66201"},{"range":"71522","text":"66199"},{"range":"71523","text":"66201"},{"range":"71524","text":"66199"},{"range":"71525","text":"66201"},{"range":"71526","text":"66199"},{"range":"71527","text":"66201"},{"range":"71528","text":"66199"},{"range":"71529","text":"66201"},{"range":"71530","text":"66199"},{"range":"71531","text":"66201"},{"range":"71532","text":"66199"},{"range":"71533","text":"66201"},{"range":"71534","text":"66199"},{"range":"71535","text":"66201"},{"range":"71536","text":"66199"},{"range":"71537","text":"66201"},{"range":"71538","text":"66199"},{"range":"71539","text":"66201"},{"range":"71540","text":"66199"},{"range":"71541","text":"66201"},{"range":"71542","text":"66199"},{"range":"71543","text":"66201"},{"range":"71544","text":"66199"},{"range":"71545","text":"66201"},{"range":"71546","text":"66199"},{"range":"71547","text":"66201"},{"range":"71548","text":"66199"},{"range":"71549","text":"66201"},{"range":"71550","text":"66199"},{"range":"71551","text":"66201"},{"range":"71552","text":"66199"},{"range":"71553","text":"66201"},{"range":"71554","text":"66199"},{"range":"71555","text":"66201"},{"range":"71556","text":"66199"},{"range":"71557","text":"66201"},{"range":"71558","text":"66199"},{"range":"71559","text":"66201"},{"range":"71560","text":"66199"},{"range":"71561","text":"66201"},{"range":"71562","text":"66199"},{"range":"71563","text":"66201"},{"range":"71564","text":"66199"},{"range":"71565","text":"66201"},{"range":"71566","text":"66199"},{"range":"71567","text":"66201"},{"range":"71568","text":"66199"},{"range":"71569","text":"66201"},{"range":"71570","text":"66199"},{"range":"71571","text":"66201"},{"range":"71572","text":"66199"},{"range":"71573","text":"66201"},{"range":"71574","text":"66199"},{"range":"71575","text":"66201"},{"range":"71576","text":"66199"},{"range":"71577","text":"66201"},{"range":"71578","text":"66199"},{"range":"71579","text":"66201"},{"range":"71580","text":"66199"},{"range":"71581","text":"66201"},{"range":"71582","text":"66199"},{"range":"71583","text":"66201"},{"range":"71584","text":"66199"},{"range":"71585","text":"66201"},{"range":"71586","text":"66199"},{"range":"71587","text":"66201"},{"range":"71588","text":"66199"},{"range":"71589","text":"66201"},{"range":"71590","text":"66199"},{"range":"71591","text":"66201"},{"range":"71592","text":"66199"},{"range":"71593","text":"66201"},{"range":"71594","text":"66199"},{"range":"71595","text":"66201"},{"range":"71596","text":"66199"},{"range":"71597","text":"66201"},{"range":"71598","text":"66199"},{"range":"71599","text":"66201"},{"range":"71600","text":"66199"},{"range":"71601","text":"66201"},{"range":"71602","text":"66199"},{"range":"71603","text":"66201"},{"range":"71604","text":"66199"},{"range":"71605","text":"66201"},{"range":"71606","text":"66199"},{"range":"71607","text":"66201"},{"range":"71608","text":"66199"},{"range":"71609","text":"66201"},{"range":"71610","text":"66199"},{"range":"71611","text":"66201"},{"range":"71612","text":"66199"},{"range":"71613","text":"66201"},{"range":"71614","text":"66199"},{"range":"71615","text":"66201"},{"range":"71616","text":"66199"},{"range":"71617","text":"66201"},{"range":"71618","text":"66199"},{"range":"71619","text":"66201"},{"range":"71620","text":"66199"},{"range":"71621","text":"66201"},{"range":"71622","text":"66199"},{"range":"71623","text":"66201"},{"range":"71624","text":"66199"},{"range":"71625","text":"66201"},{"range":"71626","text":"66199"},{"range":"71627","text":"66201"},{"range":"71628","text":"66199"},{"range":"71629","text":"66201"},{"range":"71630","text":"66199"},{"range":"71631","text":"66201"},{"range":"71632","text":"66199"},{"range":"71633","text":"66201"},{"range":"71634","text":"66199"},{"range":"71635","text":"66201"},{"range":"71636","text":"66199"},{"range":"71637","text":"66201"},{"range":"71638","text":"66199"},{"range":"71639","text":"66201"},{"range":"71640","text":"66199"},{"range":"71641","text":"66201"},{"range":"71642","text":"66199"},{"range":"71643","text":"66201"},{"range":"71644","text":"66199"},{"range":"71645","text":"66201"},{"range":"71646","text":"66199"},{"range":"71647","text":"66201"},{"range":"71648","text":"66199"},{"range":"71649","text":"66201"},{"range":"71650","text":"66199"},{"range":"71651","text":"66201"},{"range":"71652","text":"66199"},{"range":"71653","text":"66201"},{"range":"71654","text":"66199"},{"range":"71655","text":"66201"},{"range":"71656","text":"66199"},{"range":"71657","text":"66201"},{"range":"71658","text":"66199"},{"range":"71659","text":"66201"},{"range":"71660","text":"66199"},{"range":"71661","text":"66201"},{"range":"71662","text":"66199"},{"range":"71663","text":"66201"},{"range":"71664","text":"66199"},{"range":"71665","text":"66201"},{"range":"71666","text":"66199"},{"range":"71667","text":"66201"},{"range":"71668","text":"66199"},{"range":"71669","text":"66201"},{"range":"71670","text":"66199"},{"range":"71671","text":"66201"},{"range":"71672","text":"66199"},{"range":"71673","text":"66201"},{"range":"71674","text":"66199"},{"range":"71675","text":"66201"},{"range":"71676","text":"66199"},{"range":"71677","text":"66201"},{"range":"71678","text":"66199"},{"range":"71679","text":"66201"},{"range":"71680","text":"66199"},{"range":"71681","text":"66201"},{"range":"71682","text":"66199"},{"range":"71683","text":"66201"},{"range":"71684","text":"66199"},{"range":"71685","text":"66201"},{"range":"71686","text":"66199"},{"range":"71687","text":"66201"},{"range":"71688","text":"66199"},{"range":"71689","text":"66201"},{"range":"71690","text":"66199"},{"range":"71691","text":"66201"},{"range":"71692","text":"66199"},{"range":"71693","text":"66201"},{"range":"71694","text":"66199"},{"range":"71695","text":"66201"},{"range":"71696","text":"66199"},{"range":"71697","text":"66201"},{"range":"71698","text":"66199"},{"range":"71699","text":"66201"},{"range":"71700","text":"66199"},{"range":"71701","text":"66201"},{"range":"71702","text":"66199"},{"range":"71703","text":"66201"},{"range":"71704","text":"66199"},{"range":"71705","text":"66201"},{"range":"71706","text":"66199"},{"range":"71707","text":"66201"},{"range":"71708","text":"66199"},{"range":"71709","text":"66201"},{"range":"71710","text":"66199"},{"range":"71711","text":"66201"},{"range":"71712","text":"66199"},{"range":"71713","text":"66201"},{"range":"71714","text":"66199"},{"range":"71715","text":"66201"},{"range":"71716","text":"66199"},{"range":"71717","text":"66201"},{"range":"71718","text":"66199"},{"range":"71719","text":"66201"},{"range":"71720","text":"66199"},{"range":"71721","text":"66201"},{"range":"71722","text":"66199"},{"range":"71723","text":"66201"},{"range":"71724","text":"66199"},{"range":"71725","text":"66201"},{"range":"71726","text":"66199"},{"range":"71727","text":"66201"},{"range":"71728","text":"66199"},{"range":"71729","text":"66201"},{"range":"71730","text":"66199"},{"range":"71731","text":"66201"},{"range":"71732","text":"66199"},{"range":"71733","text":"66201"},{"range":"71734","text":"66199"},{"range":"71735","text":"66201"},{"range":"71736","text":"66199"},{"range":"71737","text":"66201"},{"range":"71738","text":"66199"},{"range":"71739","text":"66201"},{"range":"71740","text":"66199"},{"range":"71741","text":"66201"},{"range":"71742","text":"66199"},{"range":"71743","text":"66201"},{"range":"71744","text":"66199"},{"range":"71745","text":"66201"},{"range":"71746","text":"66199"},{"range":"71747","text":"66201"},{"range":"71748","text":"66199"},{"range":"71749","text":"66201"},{"range":"71750","text":"66199"},{"range":"71751","text":"66201"},{"range":"71752","text":"66199"},{"range":"71753","text":"66201"},{"range":"71754","text":"66199"},{"range":"71755","text":"66201"},{"range":"71756","text":"66199"},{"range":"71757","text":"66201"},{"range":"71758","text":"66199"},{"range":"71759","text":"66201"},{"range":"71760","text":"66199"},{"range":"71761","text":"66201"},{"range":"71762","text":"66199"},{"range":"71763","text":"66201"},{"range":"71764","text":"66199"},{"range":"71765","text":"66201"},{"range":"71766","text":"66199"},{"range":"71767","text":"66201"},{"range":"71768","text":"66199"},{"range":"71769","text":"66201"},{"range":"71770","text":"66199"},{"range":"71771","text":"66201"},{"range":"71772","text":"66199"},{"range":"71773","text":"66201"},{"range":"71774","text":"66199"},{"range":"71775","text":"66201"},{"range":"71776","text":"66199"},{"range":"71777","text":"66201"},{"range":"71778","text":"66199"},{"range":"71779","text":"66201"},{"range":"71780","text":"66199"},{"range":"71781","text":"66201"},{"range":"71782","text":"66199"},{"range":"71783","text":"66201"},{"range":"71784","text":"66199"},{"range":"71785","text":"66201"},{"range":"71786","text":"66199"},{"range":"71787","text":"66201"},{"range":"71788","text":"66199"},{"range":"71789","text":"66201"},{"range":"71790","text":"66199"},{"range":"71791","text":"66201"},{"range":"71792","text":"66199"},{"range":"71793","text":"66201"},{"range":"71794","text":"66199"},{"range":"71795","text":"66201"},{"range":"71796","text":"66199"},{"range":"71797","text":"66201"},{"range":"71798","text":"66199"},{"range":"71799","text":"66201"},{"range":"71800","text":"66199"},{"range":"71801","text":"66201"},{"range":"71802","text":"66199"},{"range":"71803","text":"66201"},{"range":"71804","text":"66199"},{"range":"71805","text":"66201"},{"range":"71806","text":"66199"},{"range":"71807","text":"66201"},{"range":"71808","text":"66199"},{"range":"71809","text":"66201"},{"range":"71810","text":"66199"},{"range":"71811","text":"66201"},{"range":"71812","text":"66199"},{"range":"71813","text":"66201"},{"range":"71814","text":"66199"},{"range":"71815","text":"66201"},{"range":"71816","text":"66199"},{"range":"71817","text":"66201"},{"range":"71818","text":"66199"},{"range":"71819","text":"66201"},{"range":"71820","text":"66199"},{"range":"71821","text":"66201"},{"range":"71822","text":"66199"},{"range":"71823","text":"66201"},{"range":"71824","text":"66199"},{"range":"71825","text":"66201"},{"range":"71826","text":"66199"},{"range":"71827","text":"66201"},{"range":"71828","text":"66199"},{"range":"71829","text":"66201"},{"range":"71830","text":"66199"},{"range":"71831","text":"66201"},{"range":"71832","text":"66199"},{"range":"71833","text":"66201"},{"range":"71834","text":"66199"},{"range":"71835","text":"66201"},{"range":"71836","text":"66199"},{"range":"71837","text":"66201"},{"range":"71838","text":"66199"},{"range":"71839","text":"66201"},{"range":"71840","text":"66199"},{"range":"71841","text":"66201"},{"range":"71842","text":"66199"},{"range":"71843","text":"66201"},{"range":"71844","text":"66199"},{"range":"71845","text":"66201"},{"range":"71846","text":"66199"},{"range":"71847","text":"66201"},{"range":"71848","text":"66199"},{"range":"71849","text":"66201"},{"range":"71850","text":"66199"},{"range":"71851","text":"66201"},{"range":"71852","text":"66199"},{"range":"71853","text":"66201"},{"range":"71854","text":"66199"},{"range":"71855","text":"66201"},{"range":"71856","text":"66199"},{"range":"71857","text":"66201"},{"range":"71858","text":"66199"},{"range":"71859","text":"66201"},{"range":"71860","text":"66199"},{"range":"71861","text":"66201"},{"range":"71862","text":"66199"},{"range":"71863","text":"66201"},{"range":"71864","text":"66199"},{"range":"71865","text":"66201"},{"range":"71866","text":"66199"},{"range":"71867","text":"66201"},{"range":"71868","text":"66199"},{"range":"71869","text":"66201"},{"range":"71870","text":"66199"},{"range":"71871","text":"66201"},{"range":"71872","text":"66199"},{"range":"71873","text":"66201"},{"range":"71874","text":"66199"},{"range":"71875","text":"66201"},{"range":"71876","text":"66199"},{"range":"71877","text":"66201"},{"range":"71878","text":"66199"},{"range":"71879","text":"66201"},{"range":"71880","text":"66199"},{"range":"71881","text":"66201"},{"range":"71882","text":"66199"},{"range":"71883","text":"66201"},{"range":"71884","text":"66199"},{"range":"71885","text":"66201"},{"range":"71886","text":"66199"},{"range":"71887","text":"66201"},{"range":"71888","text":"66199"},{"range":"71889","text":"66201"},{"range":"71890","text":"66199"},{"range":"71891","text":"66201"},{"range":"71892","text":"66199"},{"range":"71893","text":"66201"},{"range":"71894","text":"66199"},{"range":"71895","text":"66201"},{"range":"71896","text":"66199"},{"range":"71897","text":"66201"},{"range":"71898","text":"66199"},{"range":"71899","text":"66201"},{"range":"71900","text":"66199"},{"range":"71901","text":"66201"},{"range":"71902","text":"66199"},{"range":"71903","text":"66201"},{"range":"71904","text":"66199"},{"range":"71905","text":"66201"},{"range":"71906","text":"66199"},{"range":"71907","text":"66201"},{"range":"71908","text":"66199"},{"range":"71909","text":"66201"},{"range":"71910","text":"66199"},{"range":"71911","text":"66201"},{"range":"71912","text":"66199"},{"range":"71913","text":"66201"},{"range":"71914","text":"66199"},{"range":"71915","text":"66201"},{"range":"71916","text":"66199"},{"range":"71917","text":"66201"},{"range":"71918","text":"66199"},{"range":"71919","text":"66201"},{"range":"71920","text":"66199"},{"range":"71921","text":"66201"},{"range":"71922","text":"66199"},{"range":"71923","text":"66201"},{"range":"71924","text":"66199"},{"range":"71925","text":"66201"},{"range":"71926","text":"66199"},{"range":"71927","text":"66201"},{"range":"71928","text":"66199"},{"range":"71929","text":"66201"},{"range":"71930","text":"66199"},{"range":"71931","text":"66201"},{"range":"71932","text":"66199"},{"range":"71933","text":"66201"},{"range":"71934","text":"66199"},{"range":"71935","text":"66201"},{"range":"71936","text":"66199"},{"range":"71937","text":"66201"},{"range":"71938","text":"66199"},{"range":"71939","text":"66201"},{"range":"71940","text":"66199"},{"range":"71941","text":"66201"},{"range":"71942","text":"66199"},{"range":"71943","text":"66201"},{"range":"71944","text":"66199"},{"range":"71945","text":"66201"},{"range":"71946","text":"66199"},{"range":"71947","text":"66201"},{"range":"71948","text":"66199"},{"range":"71949","text":"66201"},{"range":"71950","text":"66199"},{"range":"71951","text":"66201"},{"range":"71952","text":"66199"},{"range":"71953","text":"66201"},{"range":"71954","text":"66199"},{"range":"71955","text":"66201"},{"range":"71956","text":"66199"},{"range":"71957","text":"66201"},{"range":"71958","text":"66199"},{"range":"71959","text":"66201"},{"range":"71960","text":"66199"},{"range":"71961","text":"66201"},{"range":"71962","text":"66199"},{"range":"71963","text":"66201"},{"range":"71964","text":"66199"},{"range":"71965","text":"66201"},{"range":"71966","text":"66199"},{"range":"71967","text":"66201"},{"range":"71968","text":"66199"},{"range":"71969","text":"66201"},{"range":"71970","text":"66199"},{"range":"71971","text":"66201"},{"range":"71972","text":"66199"},{"range":"71973","text":"66201"},{"range":"71974","text":"66199"},{"range":"71975","text":"66201"},{"range":"71976","text":"66199"},{"range":"71977","text":"66201"},{"range":"71978","text":"66199"},{"range":"71979","text":"66201"},{"range":"71980","text":"66199"},{"range":"71981","text":"66201"},{"range":"71982","text":"66199"},{"range":"71983","text":"66201"},{"range":"71984","text":"66199"},{"range":"71985","text":"66201"},{"range":"71986","text":"66199"},{"range":"71987","text":"66201"},{"range":"71988","text":"66199"},{"range":"71989","text":"66201"},{"range":"71990","text":"66199"},{"range":"71991","text":"66201"},{"range":"71992","text":"66199"},{"range":"71993","text":"66201"},{"range":"71994","text":"66199"},{"range":"71995","text":"66201"},{"range":"71996","text":"66199"},{"range":"71997","text":"66201"},{"range":"71998","text":"66199"},{"range":"71999","text":"66201"},{"range":"72000","text":"66199"},{"range":"72001","text":"66201"},{"range":"72002","text":"66199"},{"range":"72003","text":"66201"},{"range":"72004","text":"66199"},{"range":"72005","text":"66201"},{"range":"72006","text":"66199"},{"range":"72007","text":"66201"},{"range":"72008","text":"66199"},{"range":"72009","text":"66201"},{"range":"72010","text":"66199"},{"range":"72011","text":"66201"},{"range":"72012","text":"66199"},{"range":"72013","text":"66201"},{"range":"72014","text":"66199"},{"range":"72015","text":"66201"},{"range":"72016","text":"66199"},{"range":"72017","text":"66201"},{"range":"72018","text":"66199"},{"range":"72019","text":"66201"},{"range":"72020","text":"66199"},{"range":"72021","text":"66201"},{"range":"72022","text":"66199"},{"range":"72023","text":"66201"},{"range":"72024","text":"66199"},{"range":"72025","text":"66201"},{"range":"72026","text":"66199"},{"range":"72027","text":"66201"},{"range":"72028","text":"66199"},{"range":"72029","text":"66201"},{"range":"72030","text":"66199"},{"range":"72031","text":"66201"},{"range":"72032","text":"66199"},{"range":"72033","text":"66201"},{"range":"72034","text":"66199"},{"range":"72035","text":"66201"},{"range":"72036","text":"66199"},{"range":"72037","text":"66201"},{"range":"72038","text":"66199"},{"range":"72039","text":"66201"},{"range":"72040","text":"66199"},{"range":"72041","text":"66201"},{"range":"72042","text":"66199"},{"range":"72043","text":"66201"},{"range":"72044","text":"66199"},{"range":"72045","text":"66201"},{"range":"72046","text":"66199"},{"range":"72047","text":"66201"},{"range":"72048","text":"66199"},{"range":"72049","text":"66201"},{"range":"72050","text":"66199"},{"range":"72051","text":"66201"},{"range":"72052","text":"66199"},{"range":"72053","text":"66201"},{"range":"72054","text":"66199"},{"range":"72055","text":"66201"},{"range":"72056","text":"66199"},{"range":"72057","text":"66201"},{"range":"72058","text":"66199"},{"range":"72059","text":"66201"},{"range":"72060","text":"66199"},{"range":"72061","text":"66201"},{"range":"72062","text":"66199"},{"range":"72063","text":"66201"},{"range":"72064","text":"66199"},{"range":"72065","text":"66201"},{"range":"72066","text":"66199"},{"range":"72067","text":"66201"},{"range":"72068","text":"66199"},{"range":"72069","text":"66201"},{"range":"72070","text":"66199"},{"range":"72071","text":"66201"},{"range":"72072","text":"66199"},{"range":"72073","text":"66201"},{"range":"72074","text":"66199"},{"range":"72075","text":"66201"},{"range":"72076","text":"66199"},{"range":"72077","text":"66201"},{"range":"72078","text":"66199"},{"range":"72079","text":"66201"},{"range":"72080","text":"66199"},{"range":"72081","text":"66201"},{"range":"72082","text":"66199"},{"range":"72083","text":"66201"},{"range":"72084","text":"66199"},{"range":"72085","text":"66201"},{"range":"72086","text":"66199"},{"range":"72087","text":"66201"},{"range":"72088","text":"66199"},{"range":"72089","text":"66201"},{"range":"72090","text":"66199"},{"range":"72091","text":"66201"},{"range":"72092","text":"66199"},{"range":"72093","text":"66201"},{"range":"72094","text":"66199"},{"range":"72095","text":"66201"},{"range":"72096","text":"66199"},{"range":"72097","text":"66201"},{"range":"72098","text":"66199"},{"range":"72099","text":"66201"},{"range":"72100","text":"66199"},{"range":"72101","text":"66201"},{"range":"72102","text":"66199"},{"range":"72103","text":"66201"},{"range":"72104","text":"66199"},{"range":"72105","text":"66201"},{"range":"72106","text":"66199"},{"range":"72107","text":"66201"},{"range":"72108","text":"66199"},{"range":"72109","text":"66201"},{"range":"72110","text":"66199"},{"range":"72111","text":"66201"},{"range":"72112","text":"66199"},{"range":"72113","text":"66201"},{"range":"72114","text":"66199"},{"range":"72115","text":"66201"},{"range":"72116","text":"66199"},{"range":"72117","text":"66201"},{"range":"72118","text":"66199"},{"range":"72119","text":"66201"},{"range":"72120","text":"66199"},{"range":"72121","text":"66201"},{"range":"72122","text":"66199"},{"range":"72123","text":"66201"},{"range":"72124","text":"66199"},{"range":"72125","text":"66201"},{"range":"72126","text":"66199"},{"range":"72127","text":"66201"},{"range":"72128","text":"66199"},{"range":"72129","text":"66201"},{"range":"72130","text":"66199"},{"range":"72131","text":"66201"},{"range":"72132","text":"66199"},{"range":"72133","text":"66201"},{"range":"72134","text":"66199"},{"range":"72135","text":"66201"},{"range":"72136","text":"66199"},{"range":"72137","text":"66201"},{"range":"72138","text":"66199"},{"range":"72139","text":"66201"},{"range":"72140","text":"66199"},{"range":"72141","text":"66201"},{"range":"72142","text":"66199"},{"range":"72143","text":"66201"},{"range":"72144","text":"66199"},{"range":"72145","text":"66201"},{"range":"72146","text":"66199"},{"range":"72147","text":"66201"},{"range":"72148","text":"66199"},{"range":"72149","text":"66201"},{"range":"72150","text":"66199"},{"range":"72151","text":"66201"},{"range":"72152","text":"66199"},{"range":"72153","text":"66201"},{"range":"72154","text":"66199"},{"range":"72155","text":"66201"},{"range":"72156","text":"66199"},{"range":"72157","text":"66201"},{"range":"72158","text":"66199"},{"range":"72159","text":"66201"},{"range":"72160","text":"66199"},{"range":"72161","text":"66201"},{"range":"72162","text":"66199"},{"range":"72163","text":"66201"},{"range":"72164","text":"66199"},{"range":"72165","text":"66201"},{"range":"72166","text":"66199"},{"range":"72167","text":"66201"},{"range":"72168","text":"66199"},{"range":"72169","text":"66201"},{"range":"72170","text":"66199"},{"range":"72171","text":"66201"},{"range":"72172","text":"66199"},{"range":"72173","text":"66201"},{"range":"72174","text":"66199"},{"range":"72175","text":"66201"},{"range":"72176","text":"66199"},{"range":"72177","text":"66201"},{"range":"72178","text":"66199"},{"range":"72179","text":"66201"},{"range":"72180","text":"66199"},{"range":"72181","text":"66201"},{"range":"72182","text":"66199"},{"range":"72183","text":"66201"},{"range":"72184","text":"66199"},{"range":"72185","text":"66201"},{"range":"72186","text":"66199"},{"range":"72187","text":"66201"},{"range":"72188","text":"66199"},{"range":"72189","text":"66201"},{"range":"72190","text":"66199"},{"range":"72191","text":"66201"},{"range":"72192","text":"66199"},{"range":"72193","text":"66201"},{"range":"72194","text":"66199"},{"range":"72195","text":"66201"},{"range":"72196","text":"66199"},{"range":"72197","text":"66201"},{"range":"72198","text":"66199"},{"range":"72199","text":"66201"},{"range":"72200","text":"66199"},{"range":"72201","text":"66201"},{"range":"72202","text":"66199"},{"range":"72203","text":"66201"},{"range":"72204","text":"66199"},{"range":"72205","text":"66201"},{"range":"72206","text":"66199"},{"range":"72207","text":"66201"},{"range":"72208","text":"66199"},{"range":"72209","text":"66201"},{"range":"72210","text":"66199"},{"range":"72211","text":"66201"},{"range":"72212","text":"66199"},{"range":"72213","text":"66201"},{"range":"72214","text":"66199"},{"range":"72215","text":"66201"},{"range":"72216","text":"66199"},{"range":"72217","text":"66201"},{"range":"72218","text":"66199"},{"range":"72219","text":"66201"},{"range":"72220","text":"66199"},{"range":"72221","text":"66201"},{"range":"72222","text":"66199"},{"range":"72223","text":"66201"},{"range":"72224","text":"66199"},{"range":"72225","text":"66201"},{"range":"72226","text":"66199"},{"range":"72227","text":"66201"},{"range":"72228","text":"66199"},{"range":"72229","text":"66201"},{"range":"72230","text":"66199"},{"range":"72231","text":"66201"},{"range":"72232","text":"66199"},{"range":"72233","text":"66201"},{"range":"72234","text":"66199"},{"range":"72235","text":"66201"},{"range":"72236","text":"66199"},{"range":"72237","text":"66201"},{"range":"72238","text":"66199"},{"range":"72239","text":"66201"},{"range":"72240","text":"66199"},{"range":"72241","text":"66201"},{"range":"72242","text":"66199"},{"range":"72243","text":"66201"},{"range":"72244","text":"66199"},{"range":"72245","text":"66201"},{"range":"72246","text":"66199"},{"range":"72247","text":"66201"},{"range":"72248","text":"66199"},{"range":"72249","text":"66201"},{"range":"72250","text":"66199"},{"range":"72251","text":"66201"},{"range":"72252","text":"66199"},{"range":"72253","text":"66201"},{"range":"72254","text":"66199"},{"range":"72255","text":"66201"},{"range":"72256","text":"66199"},{"range":"72257","text":"66201"},{"range":"72258","text":"66199"},{"range":"72259","text":"66201"},{"range":"72260","text":"66199"},{"range":"72261","text":"66201"},{"range":"72262","text":"66199"},{"range":"72263","text":"66201"},{"range":"72264","text":"66199"},{"range":"72265","text":"66201"},{"range":"72266","text":"66199"},{"range":"72267","text":"66201"},{"range":"72268","text":"66199"},{"range":"72269","text":"66201"},{"range":"72270","text":"66199"},{"range":"72271","text":"66201"},{"range":"72272","text":"66199"},{"range":"72273","text":"66201"},{"range":"72274","text":"66199"},{"range":"72275","text":"66201"},{"range":"72276","text":"66199"},{"range":"72277","text":"66201"},{"range":"72278","text":"66199"},{"range":"72279","text":"66201"},{"range":"72280","text":"66199"},{"range":"72281","text":"66201"},{"range":"72282","text":"66199"},{"range":"72283","text":"66201"},{"range":"72284","text":"66199"},{"range":"72285","text":"66201"},{"range":"72286","text":"66199"},{"range":"72287","text":"66201"},{"range":"72288","text":"66199"},{"range":"72289","text":"66201"},{"range":"72290","text":"66199"},{"range":"72291","text":"66201"},{"range":"72292","text":"66199"},{"range":"72293","text":"66201"},{"range":"72294","text":"66199"},{"range":"72295","text":"66201"},{"range":"72296","text":"66199"},{"range":"72297","text":"66201"},{"range":"72298","text":"66199"},{"range":"72299","text":"66201"},{"range":"72300","text":"66199"},{"range":"72301","text":"66201"},{"range":"72302","text":"66199"},{"range":"72303","text":"66201"},{"range":"72304","text":"66199"},{"range":"72305","text":"66201"},{"range":"72306","text":"66199"},{"range":"72307","text":"66201"},{"range":"72308","text":"66199"},{"range":"72309","text":"66201"},{"range":"72310","text":"66199"},{"range":"72311","text":"66201"},{"range":"72312","text":"66199"},{"range":"72313","text":"66201"},{"range":"72314","text":"66199"},{"range":"72315","text":"66201"},{"range":"72316","text":"66199"},{"range":"72317","text":"66201"},{"range":"72318","text":"66199"},{"range":"72319","text":"66201"},{"range":"72320","text":"66199"},{"range":"72321","text":"66201"},{"range":"72322","text":"66199"},{"range":"72323","text":"66201"},{"range":"72324","text":"66199"},{"range":"72325","text":"66201"},{"range":"72326","text":"66199"},{"range":"72327","text":"66201"},{"range":"72328","text":"66199"},{"range":"72329","text":"66201"},{"range":"72330","text":"66199"},{"range":"72331","text":"66201"},{"range":"72332","text":"66199"},{"range":"72333","text":"66201"},{"range":"72334","text":"66199"},{"range":"72335","text":"66201"},{"range":"72336","text":"66199"},{"range":"72337","text":"66201"},{"range":"72338","text":"66199"},{"range":"72339","text":"66201"},{"range":"72340","text":"66199"},{"range":"72341","text":"66201"},{"range":"72342","text":"66199"},{"range":"72343","text":"66201"},{"range":"72344","text":"66199"},{"range":"72345","text":"66201"},{"range":"72346","text":"66199"},{"range":"72347","text":"66201"},{"range":"72348","text":"66199"},{"range":"72349","text":"66201"},{"range":"72350","text":"66199"},{"range":"72351","text":"66201"},{"range":"72352","text":"66199"},{"range":"72353","text":"66201"},{"range":"72354","text":"66199"},{"range":"72355","text":"66201"},{"range":"72356","text":"66199"},{"range":"72357","text":"66201"},{"range":"72358","text":"66199"},{"range":"72359","text":"66201"},{"range":"72360","text":"66199"},{"range":"72361","text":"66201"},{"range":"72362","text":"66199"},{"range":"72363","text":"66201"},{"range":"72364","text":"66199"},{"range":"72365","text":"66201"},{"range":"72366","text":"66199"},{"range":"72367","text":"66201"},{"range":"72368","text":"66199"},{"range":"72369","text":"66201"},{"range":"72370","text":"66199"},{"range":"72371","text":"66201"},{"range":"72372","text":"66199"},{"range":"72373","text":"66201"},{"range":"72374","text":"66199"},{"range":"72375","text":"66201"},{"range":"72376","text":"66199"},{"range":"72377","text":"66201"},{"range":"72378","text":"66199"},{"range":"72379","text":"66201"},{"range":"72380","text":"66199"},{"range":"72381","text":"66201"},{"range":"72382","text":"66199"},{"range":"72383","text":"66201"},{"range":"72384","text":"66199"},{"range":"72385","text":"66201"},{"range":"72386","text":"66199"},{"range":"72387","text":"66201"},{"range":"72388","text":"66199"},{"range":"72389","text":"66201"},{"range":"72390","text":"66199"},{"range":"72391","text":"66201"},{"range":"72392","text":"66199"},{"range":"72393","text":"66201"},{"range":"72394","text":"66199"},{"range":"72395","text":"66201"},{"range":"72396","text":"66199"},{"range":"72397","text":"66201"},{"range":"72398","text":"66199"},{"range":"72399","text":"66201"},{"range":"72400","text":"66199"},{"range":"72401","text":"66201"},{"range":"72402","text":"66199"},{"range":"72403","text":"66201"},{"range":"72404","text":"66199"},{"range":"72405","text":"66201"},{"range":"72406","text":"66199"},{"range":"72407","text":"66201"},{"range":"72408","text":"66199"},{"range":"72409","text":"66201"},{"range":"72410","text":"66199"},{"range":"72411","text":"66201"},{"range":"72412","text":"66199"},{"range":"72413","text":"66201"},{"range":"72414","text":"66199"},{"range":"72415","text":"66201"},{"range":"72416","text":"66199"},{"range":"72417","text":"66201"},{"range":"72418","text":"66199"},{"range":"72419","text":"66201"},{"range":"72420","text":"66199"},{"range":"72421","text":"66201"},{"range":"72422","text":"66199"},{"range":"72423","text":"66201"},{"range":"72424","text":"66199"},{"range":"72425","text":"66201"},{"range":"72426","text":"66199"},{"range":"72427","text":"66201"},{"range":"72428","text":"66199"},{"range":"72429","text":"66201"},{"range":"72430","text":"66199"},{"range":"72431","text":"66201"},{"range":"72432","text":"66199"},{"range":"72433","text":"66201"},{"range":"72434","text":"66199"},{"range":"72435","text":"66201"},{"range":"72436","text":"66199"},{"range":"72437","text":"66201"},{"range":"72438","text":"66199"},{"range":"72439","text":"66201"},{"range":"72440","text":"66199"},{"range":"72441","text":"66201"},{"range":"72442","text":"66199"},{"range":"72443","text":"66201"},{"range":"72444","text":"66199"},{"range":"72445","text":"66201"},{"range":"72446","text":"66199"},{"range":"72447","text":"66201"},{"range":"72448","text":"66199"},{"range":"72449","text":"66201"},{"range":"72450","text":"66199"},{"range":"72451","text":"66201"},{"range":"72452","text":"66199"},{"range":"72453","text":"66201"},{"range":"72454","text":"66199"},{"range":"72455","text":"66201"},{"range":"72456","text":"66199"},{"range":"72457","text":"66201"},{"range":"72458","text":"66199"},{"range":"72459","text":"66201"},{"range":"72460","text":"66199"},{"range":"72461","text":"66201"},{"range":"72462","text":"66199"},{"range":"72463","text":"66201"},{"range":"72464","text":"66199"},{"range":"72465","text":"66201"},{"range":"72466","text":"66199"},{"range":"72467","text":"66201"},{"range":"72468","text":"66199"},{"range":"72469","text":"66201"},{"range":"72470","text":"66199"},{"range":"72471","text":"66201"},{"range":"72472","text":"66199"},{"range":"72473","text":"66201"},{"range":"72474","text":"66199"},{"range":"72475","text":"66201"},{"range":"72476","text":"66199"},{"range":"72477","text":"66201"},{"range":"72478","text":"66199"},{"range":"72479","text":"66201"},{"range":"72480","text":"66199"},{"range":"72481","text":"66201"},{"range":"72482","text":"66199"},{"range":"72483","text":"66201"},{"range":"72484","text":"66199"},{"range":"72485","text":"66201"},{"range":"72486","text":"66199"},{"range":"72487","text":"66201"},{"range":"72488","text":"66199"},{"range":"72489","text":"66201"},{"range":"72490","text":"66199"},{"range":"72491","text":"66201"},{"range":"72492","text":"66199"},{"range":"72493","text":"66201"},{"range":"72494","text":"66199"},{"range":"72495","text":"66201"},{"range":"72496","text":"66199"},{"range":"72497","text":"66201"},{"range":"72498","text":"66199"},{"range":"72499","text":"66201"},{"range":"72500","text":"66199"},{"range":"72501","text":"66201"},{"range":"72502","text":"66199"},{"range":"72503","text":"66201"},{"range":"72504","text":"66199"},{"range":"72505","text":"66201"},{"range":"72506","text":"66199"},{"range":"72507","text":"66201"},{"range":"72508","text":"66199"},{"range":"72509","text":"66201"},{"range":"72510","text":"66199"},{"range":"72511","text":"66201"},{"range":"72512","text":"66199"},{"range":"72513","text":"66201"},{"range":"72514","text":"66199"},{"range":"72515","text":"66201"},{"range":"72516","text":"66199"},{"range":"72517","text":"66201"},{"range":"72518","text":"66199"},{"range":"72519","text":"66201"},{"range":"72520","text":"66199"},{"range":"72521","text":"66201"},{"range":"72522","text":"66199"},{"range":"72523","text":"66201"},{"range":"72524","text":"66199"},{"range":"72525","text":"66201"},{"range":"72526","text":"66199"},{"range":"72527","text":"66201"},{"range":"72528","text":"66199"},{"range":"72529","text":"66201"},{"range":"72530","text":"66199"},{"range":"72531","text":"66201"},{"range":"72532","text":"66199"},{"range":"72533","text":"66201"},{"range":"72534","text":"66199"},{"range":"72535","text":"66201"},{"range":"72536","text":"66199"},{"range":"72537","text":"66201"},{"range":"72538","text":"66199"},{"range":"72539","text":"66201"},{"range":"72540","text":"66199"},{"range":"72541","text":"66201"},{"range":"72542","text":"66199"},{"range":"72543","text":"66201"},{"range":"72544","text":"66199"},{"range":"72545","text":"66201"},{"range":"72546","text":"66199"},{"range":"72547","text":"66201"},{"range":"72548","text":"66199"},{"range":"72549","text":"66201"},{"range":"72550","text":"66199"},{"range":"72551","text":"66201"},{"range":"72552","text":"66199"},{"range":"72553","text":"66201"},{"range":"72554","text":"66199"},{"range":"72555","text":"66201"},{"range":"72556","text":"66199"},{"range":"72557","text":"66201"},{"range":"72558","text":"66199"},{"range":"72559","text":"66201"},{"range":"72560","text":"66199"},{"range":"72561","text":"66201"},{"range":"72562","text":"66199"},{"range":"72563","text":"66201"},{"range":"72564","text":"66199"},{"range":"72565","text":"66201"},{"range":"72566","text":"66199"},{"range":"72567","text":"66201"},{"range":"72568","text":"66199"},{"range":"72569","text":"66201"},{"range":"72570","text":"66199"},{"range":"72571","text":"66201"},{"range":"72572","text":"66199"},{"range":"72573","text":"66201"},{"range":"72574","text":"66199"},{"range":"72575","text":"66201"},{"range":"72576","text":"66199"},{"range":"72577","text":"66201"},{"range":"72578","text":"66199"},{"range":"72579","text":"66201"},{"range":"72580","text":"66199"},{"range":"72581","text":"66201"},{"range":"72582","text":"66199"},{"range":"72583","text":"66201"},{"range":"72584","text":"66199"},{"range":"72585","text":"66201"},{"range":"72586","text":"66199"},{"range":"72587","text":"66201"},{"range":"72588","text":"66199"},{"range":"72589","text":"66201"},{"range":"72590","text":"66199"},{"range":"72591","text":"66201"},{"range":"72592","text":"66199"},{"range":"72593","text":"66201"},{"range":"72594","text":"66199"},{"range":"72595","text":"66201"},{"range":"72596","text":"66199"},{"range":"72597","text":"66201"},{"range":"72598","text":"66199"},{"range":"72599","text":"66201"},{"range":"72600","text":"66199"},{"range":"72601","text":"66201"},{"range":"72602","text":"66199"},{"range":"72603","text":"66201"},{"range":"72604","text":"66199"},{"range":"72605","text":"66201"},{"range":"72606","text":"66199"},{"range":"72607","text":"66201"},{"range":"72608","text":"66199"},{"range":"72609","text":"66201"},{"range":"72610","text":"66199"},{"range":"72611","text":"66201"},{"range":"72612","text":"66199"},{"range":"72613","text":"66201"},{"range":"72614","text":"66199"},{"range":"72615","text":"66201"},{"range":"72616","text":"66199"},{"range":"72617","text":"66201"},{"range":"72618","text":"66199"},{"range":"72619","text":"66201"},{"range":"72620","text":"66199"},{"range":"72621","text":"66201"},{"range":"72622","text":"66199"},{"range":"72623","text":"66201"},{"range":"72624","text":"66199"},{"range":"72625","text":"66201"},{"range":"72626","text":"66199"},{"range":"72627","text":"66201"},{"range":"72628","text":"66199"},{"range":"72629","text":"66201"},{"range":"72630","text":"66199"},{"range":"72631","text":"66201"},{"range":"72632","text":"66199"},{"range":"72633","text":"66201"},{"range":"72634","text":"66199"},{"range":"72635","text":"66201"},{"range":"72636","text":"66199"},{"range":"72637","text":"66201"},{"range":"72638","text":"66199"},{"range":"72639","text":"66201"},{"range":"72640","text":"66199"},{"range":"72641","text":"66201"},{"range":"72642","text":"66199"},{"range":"72643","text":"66201"},{"range":"72644","text":"66199"},{"range":"72645","text":"66201"},{"range":"72646","text":"66199"},{"range":"72647","text":"66201"},{"range":"72648","text":"66199"},{"range":"72649","text":"66201"},{"range":"72650","text":"66199"},{"range":"72651","text":"66201"},{"range":"72652","text":"66199"},{"range":"72653","text":"66201"},{"range":"72654","text":"66199"},{"range":"72655","text":"66201"},{"range":"72656","text":"66199"},{"range":"72657","text":"66201"},{"range":"72658","text":"66199"},{"range":"72659","text":"66201"},{"range":"72660","text":"66199"},{"range":"72661","text":"66201"},{"range":"72662","text":"66199"},{"range":"72663","text":"66201"},{"range":"72664","text":"66199"},{"range":"72665","text":"66201"},{"range":"72666","text":"66199"},{"range":"72667","text":"66201"},{"range":"72668","text":"66199"},{"range":"72669","text":"66201"},{"range":"72670","text":"66199"},{"range":"72671","text":"66201"},{"range":"72672","text":"66199"},{"range":"72673","text":"66201"},{"range":"72674","text":"66199"},{"range":"72675","text":"66201"},{"range":"72676","text":"66199"},{"range":"72677","text":"66201"},{"range":"72678","text":"66199"},{"range":"72679","text":"66201"},{"range":"72680","text":"66199"},{"range":"72681","text":"66201"},{"range":"72682","text":"66199"},{"range":"72683","text":"66201"},{"range":"72684","text":"66199"},{"range":"72685","text":"66201"},{"range":"72686","text":"66199"},{"range":"72687","text":"66201"},{"range":"72688","text":"66199"},{"range":"72689","text":"66201"},{"range":"72690","text":"66199"},{"range":"72691","text":"66201"},{"range":"72692","text":"66199"},{"range":"72693","text":"66201"},{"range":"72694","text":"66199"},{"range":"72695","text":"66201"},{"range":"72696","text":"66199"},{"range":"72697","text":"66201"},{"range":"72698","text":"66199"},{"range":"72699","text":"66201"},{"range":"72700","text":"66199"},{"range":"72701","text":"66201"},{"range":"72702","text":"66199"},{"range":"72703","text":"66201"},{"range":"72704","text":"66199"},{"range":"72705","text":"66201"},{"range":"72706","text":"66199"},{"range":"72707","text":"66201"},{"range":"72708","text":"66199"},{"range":"72709","text":"66201"},{"range":"72710","text":"66199"},{"range":"72711","text":"66201"},{"range":"72712","text":"66199"},{"range":"72713","text":"66201"},{"range":"72714","text":"66199"},{"range":"72715","text":"66201"},{"range":"72716","text":"66199"},{"range":"72717","text":"66201"},{"range":"72718","text":"66199"},{"range":"72719","text":"66201"},{"range":"72720","text":"66199"},{"range":"72721","text":"66201"},{"range":"72722","text":"66199"},{"range":"72723","text":"66201"},{"range":"72724","text":"66199"},{"range":"72725","text":"66201"},{"range":"72726","text":"66199"},{"range":"72727","text":"66201"},{"range":"72728","text":"66199"},{"range":"72729","text":"66201"},{"range":"72730","text":"66199"},{"range":"72731","text":"66201"},{"range":"72732","text":"66199"},{"range":"72733","text":"66201"},{"range":"72734","text":"66199"},{"range":"72735","text":"66201"},{"range":"72736","text":"66199"},{"range":"72737","text":"66201"},{"range":"72738","text":"66199"},{"range":"72739","text":"66201"},{"range":"72740","text":"66199"},{"range":"72741","text":"66201"},{"range":"72742","text":"66199"},{"range":"72743","text":"66201"},{"range":"72744","text":"66199"},{"range":"72745","text":"66201"},{"range":"72746","text":"66199"},{"range":"72747","text":"66201"},{"range":"72748","text":"66199"},{"range":"72749","text":"66201"},{"range":"72750","text":"66199"},{"range":"72751","text":"66201"},{"range":"72752","text":"66199"},{"range":"72753","text":"66201"},{"range":"72754","text":"66199"},{"range":"72755","text":"66201"},{"range":"72756","text":"66199"},{"range":"72757","text":"66201"},{"range":"72758","text":"66199"},{"range":"72759","text":"66201"},{"range":"72760","text":"66199"},{"range":"72761","text":"66201"},{"range":"72762","text":"66199"},{"range":"72763","text":"66201"},{"range":"72764","text":"66199"},{"range":"72765","text":"66201"},{"range":"72766","text":"66199"},{"range":"72767","text":"66201"},{"range":"72768","text":"66199"},{"range":"72769","text":"66201"},{"range":"72770","text":"66199"},{"range":"72771","text":"66201"},{"range":"72772","text":"66199"},{"range":"72773","text":"66201"},{"range":"72774","text":"66199"},{"range":"72775","text":"66201"},{"range":"72776","text":"66199"},{"range":"72777","text":"66201"},{"range":"72778","text":"66199"},{"range":"72779","text":"66201"},{"range":"72780","text":"66199"},{"range":"72781","text":"66201"},{"range":"72782","text":"66199"},{"range":"72783","text":"66201"},{"range":"72784","text":"66199"},{"range":"72785","text":"66201"},{"range":"72786","text":"66199"},{"range":"72787","text":"66201"},{"range":"72788","text":"66199"},{"range":"72789","text":"66201"},{"range":"72790","text":"66199"},{"range":"72791","text":"66201"},{"range":"72792","text":"66199"},{"range":"72793","text":"66201"},{"range":"72794","text":"66199"},{"range":"72795","text":"66201"},{"range":"72796","text":"66199"},{"range":"72797","text":"66201"},{"range":"72798","text":"66199"},{"range":"72799","text":"66201"},{"range":"72800","text":"66199"},{"range":"72801","text":"66201"},{"range":"72802","text":"66199"},{"range":"72803","text":"66201"},{"range":"72804","text":"66199"},{"range":"72805","text":"66201"},{"range":"72806","text":"66199"},{"range":"72807","text":"66201"},{"range":"72808","text":"66199"},{"range":"72809","text":"66201"},{"range":"72810","text":"66199"},{"range":"72811","text":"66201"},{"range":"72812","text":"66199"},{"range":"72813","text":"66201"},{"range":"72814","text":"66199"},{"range":"72815","text":"66201"},{"range":"72816","text":"66199"},{"range":"72817","text":"66201"},{"range":"72818","text":"66199"},{"range":"72819","text":"66201"},{"range":"72820","text":"66199"},{"range":"72821","text":"66201"},{"range":"72822","text":"66199"},{"range":"72823","text":"66201"},{"range":"72824","text":"66199"},{"range":"72825","text":"66201"},{"range":"72826","text":"66199"},{"range":"72827","text":"66201"},{"range":"72828","text":"66199"},{"range":"72829","text":"66201"},{"range":"72830","text":"66199"},{"range":"72831","text":"66201"},{"range":"72832","text":"66199"},{"range":"72833","text":"66201"},{"range":"72834","text":"66199"},{"range":"72835","text":"66201"},{"range":"72836","text":"66199"},{"range":"72837","text":"66201"},{"range":"72838","text":"66199"},{"range":"72839","text":"66201"},{"range":"72840","text":"66199"},{"range":"72841","text":"66201"},{"range":"72842","text":"66199"},{"range":"72843","text":"66201"},{"range":"72844","text":"66199"},{"range":"72845","text":"66201"},{"range":"72846","text":"66199"},{"range":"72847","text":"66201"},{"range":"72848","text":"66199"},{"range":"72849","text":"66201"},{"range":"72850","text":"66199"},{"range":"72851","text":"66201"},{"range":"72852","text":"66199"},{"range":"72853","text":"66201"},{"range":"72854","text":"66199"},{"range":"72855","text":"66201"},{"range":"72856","text":"66199"},{"range":"72857","text":"66201"},{"range":"72858","text":"66199"},{"range":"72859","text":"66201"},{"range":"72860","text":"66199"},{"range":"72861","text":"66201"},{"range":"72862","text":"66199"},{"range":"72863","text":"66201"},{"range":"72864","text":"66199"},{"range":"72865","text":"66201"},{"range":"72866","text":"66199"},{"range":"72867","text":"66201"},{"range":"72868","text":"66199"},{"range":"72869","text":"66201"},{"range":"72870","text":"66199"},{"range":"72871","text":"66201"},{"range":"72872","text":"66199"},{"range":"72873","text":"66201"},{"range":"72874","text":"66199"},{"range":"72875","text":"66201"},{"range":"72876","text":"66199"},{"range":"72877","text":"66201"},{"range":"72878","text":"66199"},{"range":"72879","text":"66201"},{"range":"72880","text":"66199"},{"range":"72881","text":"66201"},{"range":"72882","text":"66199"},{"range":"72883","text":"66201"},{"range":"72884","text":"66199"},{"range":"72885","text":"66201"},{"range":"72886","text":"66199"},{"range":"72887","text":"66201"},{"range":"72888","text":"66199"},{"range":"72889","text":"66201"},{"range":"72890","text":"66199"},{"range":"72891","text":"66201"},{"range":"72892","text":"66199"},{"range":"72893","text":"66201"},{"range":"72894","text":"66199"},{"range":"72895","text":"66201"},{"range":"72896","text":"66199"},{"range":"72897","text":"66201"},{"range":"72898","text":"66199"},{"range":"72899","text":"66201"},{"range":"72900","text":"66199"},{"range":"72901","text":"66201"},{"range":"72902","text":"66199"},{"range":"72903","text":"66201"},{"range":"72904","text":"66199"},{"range":"72905","text":"66201"},{"range":"72906","text":"66199"},{"range":"72907","text":"66201"},{"range":"72908","text":"66199"},{"range":"72909","text":"66201"},{"range":"72910","text":"66199"},{"range":"72911","text":"66201"},{"range":"72912","text":"66199"},{"range":"72913","text":"66201"},{"range":"72914","text":"66199"},{"range":"72915","text":"66201"},{"range":"72916","text":"66199"},{"range":"72917","text":"66201"},{"range":"72918","text":"66199"},{"range":"72919","text":"66201"},{"range":"72920","text":"66199"},{"range":"72921","text":"66201"},{"range":"72922","text":"66199"},{"range":"72923","text":"66201"},{"range":"72924","text":"66199"},{"range":"72925","text":"66201"},{"range":"72926","text":"66199"},{"range":"72927","text":"66201"},{"range":"72928","text":"66199"},{"range":"72929","text":"66201"},{"range":"72930","text":"66199"},{"range":"72931","text":"66201"},{"range":"72932","text":"66199"},{"range":"72933","text":"66201"},{"range":"72934","text":"66199"},{"range":"72935","text":"66201"},{"range":"72936","text":"66199"},{"range":"72937","text":"66201"},{"range":"72938","text":"66199"},{"range":"72939","text":"66201"},{"range":"72940","text":"66199"},{"range":"72941","text":"66201"},{"range":"72942","text":"66199"},{"range":"72943","text":"66201"},{"range":"72944","text":"66199"},{"range":"72945","text":"66201"},{"range":"72946","text":"66199"},{"range":"72947","text":"66201"},{"range":"72948","text":"66199"},{"range":"72949","text":"66201"},{"range":"72950","text":"66199"},{"range":"72951","text":"66201"},{"range":"72952","text":"66199"},{"range":"72953","text":"66201"},{"range":"72954","text":"66199"},{"range":"72955","text":"66201"},{"range":"72956","text":"66199"},{"range":"72957","text":"66201"},{"range":"72958","text":"66199"},{"range":"72959","text":"66201"},{"range":"72960","text":"66199"},{"range":"72961","text":"66201"},{"range":"72962","text":"66199"},{"range":"72963","text":"66201"},{"range":"72964","text":"66199"},{"range":"72965","text":"66201"},{"range":"72966","text":"66199"},{"range":"72967","text":"66201"},{"range":"72968","text":"66199"},{"range":"72969","text":"66201"},{"range":"72970","text":"66199"},{"range":"72971","text":"66201"},{"range":"72972","text":"66199"},{"range":"72973","text":"66201"},{"range":"72974","text":"66199"},{"range":"72975","text":"66201"},{"range":"72976","text":"66199"},{"range":"72977","text":"66201"},{"range":"72978","text":"66199"},{"range":"72979","text":"66201"},{"range":"72980","text":"66199"},{"range":"72981","text":"66201"},{"range":"72982","text":"66199"},{"range":"72983","text":"66201"},{"range":"72984","text":"66199"},{"range":"72985","text":"66201"},{"range":"72986","text":"66199"},{"range":"72987","text":"66201"},{"range":"72988","text":"66199"},{"range":"72989","text":"66201"},{"range":"72990","text":"66199"},{"range":"72991","text":"66201"},{"range":"72992","text":"66199"},{"range":"72993","text":"66201"},{"range":"72994","text":"66199"},{"range":"72995","text":"66201"},{"range":"72996","text":"66199"},{"range":"72997","text":"66201"},{"range":"72998","text":"66199"},{"range":"72999","text":"66201"},{"range":"73000","text":"66199"},{"range":"73001","text":"66201"},{"range":"73002","text":"66199"},{"range":"73003","text":"66201"},{"range":"73004","text":"66199"},{"range":"73005","text":"66201"},{"range":"73006","text":"66199"},{"range":"73007","text":"66201"},{"range":"73008","text":"66199"},{"range":"73009","text":"66201"},{"range":"73010","text":"66199"},{"range":"73011","text":"66201"},{"range":"73012","text":"66199"},{"range":"73013","text":"66201"},{"range":"73014","text":"66199"},{"range":"73015","text":"66201"},{"range":"73016","text":"66199"},{"range":"73017","text":"66201"},{"range":"73018","text":"66199"},{"range":"73019","text":"66201"},{"range":"73020","text":"66199"},{"range":"73021","text":"66201"},{"range":"73022","text":"66199"},{"range":"73023","text":"66201"},{"range":"73024","text":"66199"},{"range":"73025","text":"66201"},{"range":"73026","text":"66199"},{"range":"73027","text":"66201"},{"range":"73028","text":"66199"},{"range":"73029","text":"66201"},{"range":"73030","text":"66199"},{"range":"73031","text":"66201"},{"range":"73032","text":"66199"},{"range":"73033","text":"66201"},{"range":"73034","text":"66199"},{"range":"73035","text":"66201"},{"range":"73036","text":"66199"},{"range":"73037","text":"66201"},{"range":"73038","text":"66199"},{"range":"73039","text":"66201"},{"range":"73040","text":"66199"},{"range":"73041","text":"66201"},{"range":"73042","text":"66199"},{"range":"73043","text":"66201"},{"range":"73044","text":"66199"},{"range":"73045","text":"66201"},{"range":"73046","text":"66199"},{"range":"73047","text":"66201"},{"range":"73048","text":"66199"},{"range":"73049","text":"66201"},{"range":"73050","text":"66199"},{"range":"73051","text":"66201"},{"range":"73052","text":"66199"},{"range":"73053","text":"66201"},{"range":"73054","text":"66199"},{"range":"73055","text":"66201"},{"range":"73056","text":"66199"},{"range":"73057","text":"66201"},{"range":"73058","text":"66199"},{"range":"73059","text":"66201"},{"range":"73060","text":"66199"},{"range":"73061","text":"66201"},{"range":"73062","text":"66199"},{"range":"73063","text":"66201"},{"range":"73064","text":"66199"},{"range":"73065","text":"66201"},{"range":"73066","text":"66199"},{"range":"73067","text":"66201"},{"range":"73068","text":"66199"},{"range":"73069","text":"66201"},{"range":"73070","text":"66199"},{"range":"73071","text":"66201"},{"range":"73072","text":"66199"},{"range":"73073","text":"66201"},{"range":"73074","text":"66199"},{"range":"73075","text":"66201"},{"range":"73076","text":"66199"},{"range":"73077","text":"66201"},{"range":"73078","text":"66199"},{"range":"73079","text":"66201"},{"range":"73080","text":"66199"},{"range":"73081","text":"66201"},{"range":"73082","text":"66199"},{"range":"73083","text":"66201"},{"range":"73084","text":"66199"},{"range":"73085","text":"66201"},{"range":"73086","text":"66199"},{"range":"73087","text":"66201"},{"range":"73088","text":"66199"},{"range":"73089","text":"66201"},{"range":"73090","text":"66199"},{"range":"73091","text":"66201"},{"range":"73092","text":"66199"},{"range":"73093","text":"66201"},{"range":"73094","text":"66199"},{"range":"73095","text":"66201"},{"range":"73096","text":"66199"},{"range":"73097","text":"66201"},{"range":"73098","text":"66199"},{"range":"73099","text":"66201"},{"range":"73100","text":"66199"},{"range":"73101","text":"66201"},{"range":"73102","text":"66199"},{"range":"73103","text":"66201"},{"range":"73104","text":"66199"},{"range":"73105","text":"66201"},{"range":"73106","text":"66199"},{"range":"73107","text":"66201"},{"range":"73108","text":"66199"},{"range":"73109","text":"66201"},{"range":"73110","text":"66199"},{"range":"73111","text":"66201"},{"range":"73112","text":"66199"},{"range":"73113","text":"66201"},{"range":"73114","text":"66199"},{"range":"73115","text":"66201"},{"range":"73116","text":"66199"},{"range":"73117","text":"66201"},{"range":"73118","text":"66199"},{"range":"73119","text":"66201"},{"range":"73120","text":"66199"},{"range":"73121","text":"66201"},{"range":"73122","text":"66199"},{"range":"73123","text":"66201"},{"range":"73124","text":"66199"},{"range":"73125","text":"66201"},{"range":"73126","text":"66199"},{"range":"73127","text":"66201"},{"range":"73128","text":"66199"},{"range":"73129","text":"66201"},{"range":"73130","text":"66199"},{"range":"73131","text":"66201"},{"range":"73132","text":"66199"},{"range":"73133","text":"66201"},{"range":"73134","text":"66199"},{"range":"73135","text":"66201"},{"range":"73136","text":"66199"},{"range":"73137","text":"66201"},{"range":"73138","text":"66199"},{"range":"73139","text":"66201"},{"range":"73140","text":"66199"},{"range":"73141","text":"66201"},{"range":"73142","text":"66199"},{"range":"73143","text":"66201"},{"range":"73144","text":"66199"},{"range":"73145","text":"66201"},{"range":"73146","text":"66199"},{"range":"73147","text":"66201"},{"range":"73148","text":"66199"},{"range":"73149","text":"66201"},{"range":"73150","text":"66199"},{"range":"73151","text":"66201"},{"range":"73152","text":"66199"},{"range":"73153","text":"66201"},{"range":"73154","text":"66199"},{"range":"73155","text":"66201"},{"range":"73156","text":"66199"},{"range":"73157","text":"66201"},{"range":"73158","text":"66199"},{"range":"73159","text":"66201"},{"range":"73160","text":"66199"},{"range":"73161","text":"66201"},{"range":"73162","text":"66199"},{"range":"73163","text":"66201"},{"range":"73164","text":"66199"},{"range":"73165","text":"66201"},{"range":"73166","text":"66199"},{"range":"73167","text":"66201"},{"range":"73168","text":"66199"},{"range":"73169","text":"66201"},{"range":"73170","text":"66199"},{"range":"73171","text":"66201"},{"range":"73172","text":"66199"},{"range":"73173","text":"66201"},{"range":"73174","text":"66199"},{"range":"73175","text":"66201"},{"range":"73176","text":"66199"},{"range":"73177","text":"66201"},{"range":"73178","text":"66199"},{"range":"73179","text":"66201"},{"range":"73180","text":"66199"},{"range":"73181","text":"66201"},{"range":"73182","text":"66199"},{"range":"73183","text":"66201"},{"range":"73184","text":"66199"},{"range":"73185","text":"66201"},{"range":"73186","text":"66199"},{"range":"73187","text":"66201"},{"range":"73188","text":"66199"},{"range":"73189","text":"66201"},{"range":"73190","text":"66199"},{"range":"73191","text":"66201"},{"range":"73192","text":"66199"},{"range":"73193","text":"66201"},{"range":"73194","text":"66199"},{"range":"73195","text":"66201"},{"range":"73196","text":"66199"},{"range":"73197","text":"66201"},{"range":"73198","text":"66199"},{"range":"73199","text":"66201"},{"range":"73200","text":"66199"},{"range":"73201","text":"66201"},{"range":"73202","text":"66199"},{"range":"73203","text":"66201"},{"range":"73204","text":"66199"},{"range":"73205","text":"66201"},{"range":"73206","text":"66199"},{"range":"73207","text":"66201"},{"range":"73208","text":"66199"},{"range":"73209","text":"66201"},{"range":"73210","text":"66199"},{"range":"73211","text":"66201"},{"range":"73212","text":"66199"},{"range":"73213","text":"66201"},{"range":"73214","text":"66199"},{"range":"73215","text":"66201"},{"range":"73216","text":"66199"},{"range":"73217","text":"66201"},{"range":"73218","text":"66199"},{"range":"73219","text":"66201"},{"range":"73220","text":"66199"},{"range":"73221","text":"66201"},{"range":"73222","text":"66199"},{"range":"73223","text":"66201"},{"range":"73224","text":"66199"},{"range":"73225","text":"66201"},{"range":"73226","text":"66199"},{"range":"73227","text":"66201"},{"range":"73228","text":"66199"},{"range":"73229","text":"66201"},{"range":"73230","text":"66199"},{"range":"73231","text":"66201"},{"range":"73232","text":"66199"},{"range":"73233","text":"66201"},{"range":"73234","text":"66199"},{"range":"73235","text":"66201"},{"range":"73236","text":"66199"},{"range":"73237","text":"66201"},{"range":"73238","text":"66199"},{"range":"73239","text":"66201"},{"range":"73240","text":"66199"},{"range":"73241","text":"66201"},{"range":"73242","text":"66199"},{"range":"73243","text":"66201"},{"range":"73244","text":"66199"},{"range":"73245","text":"66201"},{"range":"73246","text":"66199"},{"range":"73247","text":"66201"},{"range":"73248","text":"66199"},{"range":"73249","text":"66201"},{"range":"73250","text":"66199"},{"range":"73251","text":"66201"},{"range":"73252","text":"66199"},{"range":"73253","text":"66201"},{"range":"73254","text":"66199"},{"range":"73255","text":"66201"},{"range":"73256","text":"66199"},{"range":"73257","text":"66201"},{"range":"73258","text":"66199"},{"range":"73259","text":"66201"},{"range":"73260","text":"66199"},{"range":"73261","text":"66201"},{"range":"73262","text":"66199"},{"range":"73263","text":"66201"},{"range":"73264","text":"66199"},{"range":"73265","text":"66201"},{"range":"73266","text":"66199"},{"range":"73267","text":"66201"},{"range":"73268","text":"66199"},{"range":"73269","text":"66201"},{"range":"73270","text":"66199"},{"range":"73271","text":"66201"},{"range":"73272","text":"66199"},{"range":"73273","text":"66201"},{"range":"73274","text":"66199"},{"range":"73275","text":"66201"},{"range":"73276","text":"66199"},{"range":"73277","text":"66201"},{"range":"73278","text":"66199"},{"range":"73279","text":"66201"},{"range":"73280","text":"66199"},{"range":"73281","text":"66201"},{"range":"73282","text":"66199"},{"range":"73283","text":"66201"},{"range":"73284","text":"66199"},{"range":"73285","text":"66201"},{"range":"73286","text":"66199"},{"range":"73287","text":"66201"},{"range":"73288","text":"66199"},{"range":"73289","text":"66201"},{"range":"73290","text":"66199"},{"range":"73291","text":"66201"},{"range":"73292","text":"66199"},{"range":"73293","text":"66201"},{"range":"73294","text":"66199"},{"range":"73295","text":"66201"},{"range":"73296","text":"66199"},{"range":"73297","text":"66201"},{"range":"73298","text":"66199"},{"range":"73299","text":"66201"},{"range":"73300","text":"66199"},{"range":"73301","text":"66201"},{"range":"73302","text":"66199"},{"range":"73303","text":"66201"},{"range":"73304","text":"66199"},{"range":"73305","text":"66201"},{"range":"73306","text":"66199"},{"range":"73307","text":"66201"},{"range":"73308","text":"66199"},{"range":"73309","text":"66201"},{"range":"73310","text":"66199"},{"range":"73311","text":"66201"},{"range":"73312","text":"66199"},{"range":"73313","text":"66201"},{"range":"73314","text":"66199"},{"range":"73315","text":"66201"},{"range":"73316","text":"66199"},{"range":"73317","text":"66201"},{"range":"73318","text":"66199"},{"range":"73319","text":"66201"},{"range":"73320","text":"66199"},{"range":"73321","text":"66201"},{"range":"73322","text":"66199"},{"range":"73323","text":"66201"},{"range":"73324","text":"66199"},{"range":"73325","text":"66201"},{"range":"73326","text":"66199"},{"range":"73327","text":"66201"},{"range":"73328","text":"66199"},{"range":"73329","text":"66201"},{"range":"73330","text":"66199"},{"range":"73331","text":"66201"},{"range":"73332","text":"66199"},{"range":"73333","text":"66201"},{"range":"73334","text":"66199"},{"range":"73335","text":"66201"},{"range":"73336","text":"66199"},{"range":"73337","text":"66201"},{"range":"73338","text":"66199"},{"range":"73339","text":"66201"},{"range":"73340","text":"66199"},{"range":"73341","text":"66201"},{"range":"73342","text":"66199"},{"range":"73343","text":"66201"},{"range":"73344","text":"66199"},{"range":"73345","text":"66201"},{"range":"73346","text":"66199"},{"range":"73347","text":"66201"},{"range":"73348","text":"66199"},{"range":"73349","text":"66201"},{"range":"73350","text":"66199"},{"range":"73351","text":"66201"},{"range":"73352","text":"66199"},{"range":"73353","text":"66201"},{"range":"73354","text":"66199"},{"range":"73355","text":"66201"},{"range":"73356","text":"66199"},{"range":"73357","text":"66201"},{"range":"73358","text":"66199"},{"range":"73359","text":"66201"},{"range":"73360","text":"66199"},{"range":"73361","text":"66201"},{"range":"73362","text":"66199"},{"range":"73363","text":"66201"},{"range":"73364","text":"66199"},{"range":"73365","text":"66201"},{"range":"73366","text":"66199"},{"range":"73367","text":"66201"},{"range":"73368","text":"66199"},{"range":"73369","text":"66201"},{"range":"73370","text":"66199"},{"range":"73371","text":"66201"},{"range":"73372","text":"66199"},{"range":"73373","text":"66201"},{"range":"73374","text":"66199"},{"range":"73375","text":"66201"},{"range":"73376","text":"66199"},{"range":"73377","text":"66201"},{"range":"73378","text":"66199"},{"range":"73379","text":"66201"},{"range":"73380","text":"66199"},{"range":"73381","text":"66201"},{"range":"73382","text":"66199"},{"range":"73383","text":"66201"},{"range":"73384","text":"66199"},{"range":"73385","text":"66201"},{"range":"73386","text":"66199"},{"range":"73387","text":"66201"},{"range":"73388","text":"66199"},{"range":"73389","text":"66201"},{"range":"73390","text":"66199"},{"range":"73391","text":"66201"},{"range":"73392","text":"66199"},{"range":"73393","text":"66201"},{"range":"73394","text":"66199"},{"range":"73395","text":"66201"},{"range":"73396","text":"66199"},{"range":"73397","text":"66201"},{"range":"73398","text":"66199"},{"range":"73399","text":"66201"},{"range":"73400","text":"66199"},{"range":"73401","text":"66201"},{"range":"73402","text":"66199"},{"range":"73403","text":"66201"},{"range":"73404","text":"66199"},{"range":"73405","text":"66201"},{"range":"73406","text":"66199"},{"range":"73407","text":"66201"},{"range":"73408","text":"66199"},{"range":"73409","text":"66201"},{"range":"73410","text":"66199"},{"range":"73411","text":"66201"},{"range":"73412","text":"66199"},{"range":"73413","text":"66201"},{"range":"73414","text":"66199"},{"range":"73415","text":"66201"},{"range":"73416","text":"66199"},{"range":"73417","text":"66201"},{"range":"73418","text":"66199"},{"range":"73419","text":"66201"},{"range":"73420","text":"66199"},{"range":"73421","text":"66201"},{"range":"73422","text":"66199"},{"range":"73423","text":"66201"},{"range":"73424","text":"66199"},{"range":"73425","text":"66201"},{"range":"73426","text":"66199"},{"range":"73427","text":"66201"},{"range":"73428","text":"66199"},{"range":"73429","text":"66201"},{"range":"73430","text":"66199"},{"range":"73431","text":"66201"},{"range":"73432","text":"66199"},{"range":"73433","text":"66201"},{"range":"73434","text":"66199"},{"range":"73435","text":"66201"},{"range":"73436","text":"66199"},{"range":"73437","text":"66201"},{"range":"73438","text":"66199"},{"range":"73439","text":"66201"},{"range":"73440","text":"66199"},{"range":"73441","text":"66201"},{"range":"73442","text":"66199"},{"range":"73443","text":"66201"},{"range":"73444","text":"66199"},{"range":"73445","text":"66201"},{"range":"73446","text":"66199"},{"range":"73447","text":"66201"},{"range":"73448","text":"66199"},{"range":"73449","text":"66201"},{"range":"73450","text":"66199"},{"range":"73451","text":"66201"},{"range":"73452","text":"66199"},{"range":"73453","text":"66201"},{"range":"73454","text":"66199"},{"range":"73455","text":"66201"},{"range":"73456","text":"66199"},{"range":"73457","text":"66201"},{"range":"73458","text":"66199"},{"range":"73459","text":"66201"},{"range":"73460","text":"66199"},{"range":"73461","text":"66201"},{"range":"73462","text":"66199"},{"range":"73463","text":"66201"},{"range":"73464","text":"66199"},{"range":"73465","text":"66201"},{"range":"73466","text":"66199"},{"range":"73467","text":"66201"},{"range":"73468","text":"66199"},{"range":"73469","text":"66201"},{"range":"73470","text":"66199"},{"range":"73471","text":"66201"},{"range":"73472","text":"66199"},{"range":"73473","text":"66201"},{"range":"73474","text":"66199"},{"range":"73475","text":"66201"},{"range":"73476","text":"66199"},{"range":"73477","text":"66201"},{"range":"73478","text":"66199"},{"range":"73479","text":"66201"},{"range":"73480","text":"66199"},{"range":"73481","text":"66201"},{"range":"73482","text":"66199"},{"range":"73483","text":"66201"},{"range":"73484","text":"66199"},{"range":"73485","text":"66201"},{"range":"73486","text":"66199"},{"range":"73487","text":"66201"},{"range":"73488","text":"66199"},{"range":"73489","text":"66201"},{"range":"73490","text":"66199"},{"range":"73491","text":"66201"},{"range":"73492","text":"66199"},{"range":"73493","text":"66201"},{"range":"73494","text":"66199"},{"range":"73495","text":"66201"},{"range":"73496","text":"66199"},{"range":"73497","text":"66201"},{"range":"73498","text":"66199"},{"range":"73499","text":"66201"},{"range":"73500","text":"66199"},{"range":"73501","text":"66201"},{"range":"73502","text":"66199"},{"range":"73503","text":"66201"},{"range":"73504","text":"66199"},{"range":"73505","text":"66201"},{"range":"73506","text":"66199"},{"range":"73507","text":"66201"},{"range":"73508","text":"66199"},{"range":"73509","text":"66201"},{"range":"73510","text":"66199"},{"range":"73511","text":"66201"},{"range":"73512","text":"66199"},{"range":"73513","text":"66201"},{"range":"73514","text":"66199"},{"range":"73515","text":"66201"},{"range":"73516","text":"66199"},{"range":"73517","text":"66201"},{"range":"73518","text":"66199"},{"range":"73519","text":"66201"},{"range":"73520","text":"66199"},{"range":"73521","text":"66201"},{"range":"73522","text":"66199"},{"range":"73523","text":"66201"},{"range":"73524","text":"66199"},{"range":"73525","text":"66201"},{"range":"73526","text":"66199"},{"range":"73527","text":"66201"},{"range":"73528","text":"66199"},{"range":"73529","text":"66201"},{"range":"73530","text":"66199"},{"range":"73531","text":"66201"},{"range":"73532","text":"66199"},{"range":"73533","text":"66201"},{"range":"73534","text":"66199"},{"range":"73535","text":"66201"},{"range":"73536","text":"66199"},{"range":"73537","text":"66201"},{"range":"73538","text":"66199"},{"range":"73539","text":"66201"},{"range":"73540","text":"66199"},{"range":"73541","text":"66201"},{"range":"73542","text":"66199"},{"range":"73543","text":"66201"},{"range":"73544","text":"66199"},{"range":"73545","text":"66201"},{"range":"73546","text":"66199"},{"range":"73547","text":"66201"},{"range":"73548","text":"66199"},{"range":"73549","text":"66201"},{"range":"73550","text":"66199"},{"range":"73551","text":"66201"},{"range":"73552","text":"66199"},{"range":"73553","text":"66201"},{"range":"73554","text":"66199"},{"range":"73555","text":"66201"},{"range":"73556","text":"66199"},{"range":"73557","text":"66201"},{"range":"73558","text":"66199"},{"range":"73559","text":"66201"},{"range":"73560","text":"66199"},{"range":"73561","text":"66201"},{"range":"73562","text":"66199"},{"range":"73563","text":"66201"},{"range":"73564","text":"66199"},{"range":"73565","text":"66201"},{"range":"73566","text":"66199"},{"range":"73567","text":"66201"},{"range":"73568","text":"66199"},{"range":"73569","text":"66201"},{"range":"73570","text":"66199"},{"range":"73571","text":"66201"},{"range":"73572","text":"66199"},{"range":"73573","text":"66201"},{"range":"73574","text":"66199"},{"range":"73575","text":"66201"},{"range":"73576","text":"66199"},{"range":"73577","text":"66201"},{"range":"73578","text":"66199"},{"range":"73579","text":"66201"},{"range":"73580","text":"66199"},{"range":"73581","text":"66201"},{"range":"73582","text":"66199"},{"range":"73583","text":"66201"},{"range":"73584","text":"66199"},{"range":"73585","text":"66201"},{"range":"73586","text":"66199"},{"range":"73587","text":"66201"},{"range":"73588","text":"66199"},{"range":"73589","text":"66201"},{"range":"73590","text":"66199"},{"range":"73591","text":"66201"},{"range":"73592","text":"66199"},{"range":"73593","text":"66201"},{"range":"73594","text":"66199"},{"range":"73595","text":"66201"},{"range":"73596","text":"66199"},{"range":"73597","text":"66201"},{"range":"73598","text":"66199"},{"range":"73599","text":"66201"},{"range":"73600","text":"66199"},{"range":"73601","text":"66201"},{"range":"73602","text":"66199"},{"range":"73603","text":"66201"},{"range":"73604","text":"66199"},{"range":"73605","text":"66201"},{"range":"73606","text":"66199"},{"range":"73607","text":"66201"},{"range":"73608","text":"66199"},{"range":"73609","text":"66201"},{"range":"73610","text":"66199"},{"range":"73611","text":"66201"},{"range":"73612","text":"66199"},{"range":"73613","text":"66201"},{"range":"73614","text":"66199"},{"range":"73615","text":"66201"},{"range":"73616","text":"66199"},{"range":"73617","text":"66201"},{"range":"73618","text":"66199"},{"range":"73619","text":"66201"},{"range":"73620","text":"66199"},{"range":"73621","text":"66201"},{"range":"73622","text":"66199"},{"range":"73623","text":"66201"},{"range":"73624","text":"66199"},{"range":"73625","text":"66201"},{"range":"73626","text":"66199"},{"range":"73627","text":"66201"},{"range":"73628","text":"66199"},{"range":"73629","text":"66201"},{"range":"73630","text":"66199"},{"range":"73631","text":"66201"},{"range":"73632","text":"66199"},{"range":"73633","text":"66201"},{"range":"73634","text":"66199"},{"range":"73635","text":"66201"},{"range":"73636","text":"66199"},{"range":"73637","text":"66201"},{"range":"73638","text":"66199"},{"range":"73639","text":"66201"},{"range":"73640","text":"66199"},{"range":"73641","text":"66201"},{"range":"73642","text":"66199"},{"range":"73643","text":"66201"},{"range":"73644","text":"66199"},{"range":"73645","text":"66201"},{"range":"73646","text":"66199"},{"range":"73647","text":"66201"},{"range":"73648","text":"66199"},{"range":"73649","text":"66201"},{"range":"73650","text":"66199"},{"range":"73651","text":"66201"},{"range":"73652","text":"66199"},{"range":"73653","text":"66201"},{"range":"73654","text":"66199"},{"range":"73655","text":"66201"},{"range":"73656","text":"66199"},{"range":"73657","text":"66201"},{"range":"73658","text":"66199"},{"range":"73659","text":"66201"},{"range":"73660","text":"66199"},{"range":"73661","text":"66201"},{"range":"73662","text":"66199"},{"range":"73663","text":"66201"},{"range":"73664","text":"66199"},{"range":"73665","text":"66201"},{"range":"73666","text":"66199"},{"range":"73667","text":"66201"},{"range":"73668","text":"66199"},{"range":"73669","text":"66201"},{"range":"73670","text":"66199"},{"range":"73671","text":"66201"},{"range":"73672","text":"66199"},{"range":"73673","text":"66201"},{"range":"73674","text":"66199"},{"range":"73675","text":"66201"},{"range":"73676","text":"66199"},{"range":"73677","text":"66201"},{"range":"73678","text":"66199"},{"range":"73679","text":"66201"},{"range":"73680","text":"66199"},{"range":"73681","text":"66201"},{"range":"73682","text":"66199"},{"range":"73683","text":"66201"},{"range":"73684","text":"66199"},{"range":"73685","text":"66201"},{"range":"73686","text":"66199"},{"range":"73687","text":"66201"},{"range":"73688","text":"66199"},{"range":"73689","text":"66201"},{"range":"73690","text":"66199"},{"range":"73691","text":"66201"},{"range":"73692","text":"66199"},{"range":"73693","text":"66201"},{"range":"73694","text":"66199"},{"range":"73695","text":"66201"},{"range":"73696","text":"66199"},{"range":"73697","text":"66201"},{"range":"73698","text":"66199"},{"range":"73699","text":"66201"},{"range":"73700","text":"66199"},{"range":"73701","text":"66201"},{"range":"73702","text":"66199"},{"range":"73703","text":"66201"},{"range":"73704","text":"66199"},{"range":"73705","text":"66201"},{"range":"73706","text":"66199"},{"range":"73707","text":"66201"},{"range":"73708","text":"66199"},{"range":"73709","text":"66201"},{"range":"73710","text":"66199"},{"range":"73711","text":"66201"},{"range":"73712","text":"66199"},{"range":"73713","text":"66201"},{"range":"73714","text":"66199"},{"range":"73715","text":"66201"},{"range":"73716","text":"66199"},{"range":"73717","text":"66201"},{"range":"73718","text":"66199"},{"range":"73719","text":"66201"},{"range":"73720","text":"66199"},{"range":"73721","text":"66201"},{"range":"73722","text":"66199"},{"range":"73723","text":"66201"},{"range":"73724","text":"66199"},{"range":"73725","text":"66201"},{"range":"73726","text":"66199"},{"range":"73727","text":"66201"},{"range":"73728","text":"66199"},{"range":"73729","text":"66201"},{"range":"73730","text":"66199"},{"range":"73731","text":"66201"},{"range":"73732","text":"66199"},{"range":"73733","text":"66201"},{"range":"73734","text":"66199"},{"range":"73735","text":"66201"},{"range":"73736","text":"66199"},{"range":"73737","text":"66201"},{"range":"73738","text":"66199"},{"range":"73739","text":"66201"},{"range":"73740","text":"66199"},{"range":"73741","text":"66201"},{"range":"73742","text":"66199"},{"range":"73743","text":"66201"},{"range":"73744","text":"66199"},{"range":"73745","text":"66201"},{"range":"73746","text":"66199"},{"range":"73747","text":"66201"},{"range":"73748","text":"66199"},{"range":"73749","text":"66201"},{"range":"73750","text":"66199"},{"range":"73751","text":"66201"},{"range":"73752","text":"66199"},{"range":"73753","text":"66201"},{"range":"73754","text":"66199"},{"range":"73755","text":"66201"},{"range":"73756","text":"66199"},{"range":"73757","text":"66201"},{"range":"73758","text":"66199"},{"range":"73759","text":"66201"},{"range":"73760","text":"66199"},{"range":"73761","text":"66201"},{"range":"73762","text":"66199"},{"range":"73763","text":"66201"},{"range":"73764","text":"66199"},{"range":"73765","text":"66201"},{"range":"73766","text":"66199"},{"range":"73767","text":"66201"},{"range":"73768","text":"66199"},{"range":"73769","text":"66201"},{"range":"73770","text":"66199"},{"range":"73771","text":"66201"},{"range":"73772","text":"66199"},{"range":"73773","text":"66201"},{"range":"73774","text":"66199"},{"range":"73775","text":"66201"},{"range":"73776","text":"66199"},{"range":"73777","text":"66201"},{"range":"73778","text":"66199"},{"range":"73779","text":"66201"},{"range":"73780","text":"66199"},{"range":"73781","text":"66201"},{"range":"73782","text":"66199"},{"range":"73783","text":"66201"},{"range":"73784","text":"66199"},{"range":"73785","text":"66201"},{"range":"73786","text":"66199"},{"range":"73787","text":"66201"},{"range":"73788","text":"66199"},{"range":"73789","text":"66201"},{"range":"73790","text":"66199"},{"range":"73791","text":"66201"},{"range":"73792","text":"66199"},{"range":"73793","text":"66201"},{"range":"73794","text":"66199"},{"range":"73795","text":"66201"},{"range":"73796","text":"66199"},{"range":"73797","text":"66201"},{"range":"73798","text":"66199"},{"range":"73799","text":"66201"},{"range":"73800","text":"66199"},{"range":"73801","text":"66201"},{"range":"73802","text":"66199"},{"range":"73803","text":"66201"},{"range":"73804","text":"66199"},{"range":"73805","text":"66201"},{"range":"73806","text":"66199"},{"range":"73807","text":"66201"},{"range":"73808","text":"66199"},{"range":"73809","text":"66201"},{"range":"73810","text":"66199"},{"range":"73811","text":"66201"},{"range":"73812","text":"66199"},{"range":"73813","text":"66201"},{"range":"73814","text":"66199"},{"range":"73815","text":"66201"},{"range":"73816","text":"66199"},{"range":"73817","text":"66201"},{"range":"73818","text":"66199"},{"range":"73819","text":"66201"},{"range":"73820","text":"66199"},{"range":"73821","text":"66201"},{"range":"73822","text":"66199"},{"range":"73823","text":"66201"},{"range":"73824","text":"66199"},{"range":"73825","text":"66201"},{"range":"73826","text":"66199"},{"range":"73827","text":"66201"},{"range":"73828","text":"66199"},{"range":"73829","text":"66201"},{"range":"73830","text":"66199"},{"range":"73831","text":"66201"},{"range":"73832","text":"66199"},{"range":"73833","text":"66201"},{"range":"73834","text":"66199"},{"range":"73835","text":"66201"},{"range":"73836","text":"66199"},{"range":"73837","text":"66201"},{"range":"73838","text":"66199"},{"range":"73839","text":"66201"},{"range":"73840","text":"66199"},{"range":"73841","text":"66201"},{"range":"73842","text":"66199"},{"range":"73843","text":"66201"},{"range":"73844","text":"66199"},{"range":"73845","text":"66201"},{"range":"73846","text":"66199"},{"range":"73847","text":"66201"},{"range":"73848","text":"66199"},{"range":"73849","text":"66201"},{"range":"73850","text":"66199"},{"range":"73851","text":"66201"},{"range":"73852","text":"66199"},{"range":"73853","text":"66201"},{"range":"73854","text":"66199"},{"range":"73855","text":"66201"},{"range":"73856","text":"66199"},{"range":"73857","text":"66201"},{"range":"73858","text":"66199"},{"range":"73859","text":"66201"},{"range":"73860","text":"66199"},{"range":"73861","text":"66201"},{"range":"73862","text":"66199"},{"range":"73863","text":"66201"},{"range":"73864","text":"66199"},{"range":"73865","text":"66201"},{"range":"73866","text":"66199"},{"range":"73867","text":"66201"},{"range":"73868","text":"66199"},{"range":"73869","text":"66201"},{"range":"73870","text":"66199"},{"range":"73871","text":"66201"},{"range":"73872","text":"66199"},{"range":"73873","text":"66201"},{"range":"73874","text":"66199"},{"range":"73875","text":"66201"},{"range":"73876","text":"66199"},{"range":"73877","text":"66201"},{"range":"73878","text":"66199"},{"range":"73879","text":"66201"},{"range":"73880","text":"66199"},{"range":"73881","text":"66201"},{"range":"73882","text":"66199"},{"range":"73883","text":"66201"},{"range":"73884","text":"66199"},{"range":"73885","text":"66201"},{"range":"73886","text":"66199"},{"range":"73887","text":"66201"},{"range":"73888","text":"66199"},{"range":"73889","text":"66201"},{"range":"73890","text":"66199"},{"range":"73891","text":"66201"},{"range":"73892","text":"66199"},{"range":"73893","text":"66201"},{"range":"73894","text":"66199"},{"range":"73895","text":"66201"},{"range":"73896","text":"66199"},{"range":"73897","text":"66201"},{"range":"73898","text":"66199"},{"range":"73899","text":"66201"},{"range":"73900","text":"66199"},{"range":"73901","text":"66201"},{"range":"73902","text":"66199"},{"range":"73903","text":"66201"},{"range":"73904","text":"66199"},{"range":"73905","text":"66201"},{"range":"73906","text":"66199"},{"range":"73907","text":"66201"},{"range":"73908","text":"66199"},{"range":"73909","text":"66201"},{"range":"73910","text":"66199"},{"range":"73911","text":"66201"},{"range":"73912","text":"66199"},{"range":"73913","text":"66201"},{"range":"73914","text":"66199"},{"range":"73915","text":"66201"},{"range":"73916","text":"66199"},{"range":"73917","text":"66201"},{"range":"73918","text":"66199"},{"range":"73919","text":"66201"},{"range":"73920","text":"66199"},{"range":"73921","text":"66201"},{"range":"73922","text":"66199"},{"range":"73923","text":"66201"},{"range":"73924","text":"66199"},{"range":"73925","text":"66201"},{"range":"73926","text":"66199"},{"range":"73927","text":"66201"},{"range":"73928","text":"66199"},{"range":"73929","text":"66201"},{"range":"73930","text":"66199"},{"range":"73931","text":"66201"},{"range":"73932","text":"66199"},{"range":"73933","text":"66201"},{"range":"73934","text":"66199"},{"range":"73935","text":"66201"},{"range":"73936","text":"66199"},{"range":"73937","text":"66201"},{"range":"73938","text":"66199"},{"range":"73939","text":"66201"},{"range":"73940","text":"66199"},{"range":"73941","text":"66201"},{"range":"73942","text":"66199"},{"range":"73943","text":"66201"},{"range":"73944","text":"66199"},{"range":"73945","text":"66201"},{"range":"73946","text":"66199"},{"range":"73947","text":"66201"},{"range":"73948","text":"66199"},{"range":"73949","text":"66201"},{"range":"73950","text":"66199"},{"range":"73951","text":"66201"},{"range":"73952","text":"66199"},{"range":"73953","text":"66201"},{"range":"73954","text":"66199"},{"range":"73955","text":"66201"},{"range":"73956","text":"66199"},{"range":"73957","text":"66201"},{"range":"73958","text":"66199"},{"range":"73959","text":"66201"},{"range":"73960","text":"66199"},{"range":"73961","text":"66201"},{"range":"73962","text":"66199"},{"range":"73963","text":"66201"},{"range":"73964","text":"66199"},{"range":"73965","text":"66201"},{"range":"73966","text":"66199"},{"range":"73967","text":"66201"},{"range":"73968","text":"66199"},{"range":"73969","text":"66201"},{"range":"73970","text":"66199"},{"range":"73971","text":"66201"},{"range":"73972","text":"66199"},{"range":"73973","text":"66201"},{"range":"73974","text":"66199"},{"range":"73975","text":"66201"},{"range":"73976","text":"66199"},{"range":"73977","text":"66201"},{"range":"73978","text":"66199"},{"range":"73979","text":"66201"},{"range":"73980","text":"66199"},{"range":"73981","text":"66201"},{"range":"73982","text":"66199"},{"range":"73983","text":"66201"},{"range":"73984","text":"66199"},{"range":"73985","text":"66201"},{"range":"73986","text":"66199"},{"range":"73987","text":"66201"},{"range":"73988","text":"66199"},{"range":"73989","text":"66201"},{"range":"73990","text":"66199"},{"range":"73991","text":"66201"},{"range":"73992","text":"66199"},{"range":"73993","text":"66201"},{"range":"73994","text":"66199"},{"range":"73995","text":"66201"},{"range":"73996","text":"66199"},{"range":"73997","text":"66201"},{"range":"73998","text":"66199"},{"range":"73999","text":"66201"},{"range":"74000","text":"66199"},{"range":"74001","text":"66201"},{"range":"74002","text":"66199"},{"range":"74003","text":"66201"},{"range":"74004","text":"66199"},{"range":"74005","text":"66201"},{"range":"74006","text":"66199"},{"range":"74007","text":"66201"},{"range":"74008","text":"66199"},{"range":"74009","text":"66201"},{"range":"74010","text":"66199"},{"range":"74011","text":"66201"},{"range":"74012","text":"66199"},{"range":"74013","text":"66201"},{"range":"74014","text":"66199"},{"range":"74015","text":"66201"},{"range":"74016","text":"66199"},{"range":"74017","text":"66201"},{"range":"74018","text":"66199"},{"range":"74019","text":"66201"},{"range":"74020","text":"66199"},{"range":"74021","text":"66201"},{"range":"74022","text":"66199"},{"range":"74023","text":"66201"},{"range":"74024","text":"66199"},{"range":"74025","text":"66201"},{"range":"74026","text":"66199"},{"range":"74027","text":"66201"},{"range":"74028","text":"66199"},{"range":"74029","text":"66201"},{"range":"74030","text":"66199"},{"range":"74031","text":"66201"},{"range":"74032","text":"66199"},{"range":"74033","text":"66201"},{"range":"74034","text":"66199"},{"range":"74035","text":"66201"},{"range":"74036","text":"66199"},{"range":"74037","text":"66201"},{"range":"74038","text":"66199"},{"range":"74039","text":"66201"},{"range":"74040","text":"66199"},{"range":"74041","text":"66201"},{"range":"74042","text":"66199"},{"range":"74043","text":"66201"},{"range":"74044","text":"66199"},{"range":"74045","text":"66201"},{"range":"74046","text":"66199"},{"range":"74047","text":"66201"},{"range":"74048","text":"66199"},{"range":"74049","text":"66201"},{"range":"74050","text":"66199"},{"range":"74051","text":"66201"},{"range":"74052","text":"66199"},{"range":"74053","text":"66201"},{"range":"74054","text":"66199"},{"range":"74055","text":"66201"},{"range":"74056","text":"66199"},{"range":"74057","text":"66201"},{"range":"74058","text":"66199"},{"range":"74059","text":"66201"},{"range":"74060","text":"66199"},{"range":"74061","text":"66201"},{"range":"74062","text":"66199"},{"range":"74063","text":"66201"},{"range":"74064","text":"66199"},{"range":"74065","text":"66201"},{"range":"74066","text":"66199"},{"range":"74067","text":"66201"},{"range":"74068","text":"66199"},{"range":"74069","text":"66201"},{"range":"74070","text":"66199"},{"range":"74071","text":"66201"},{"range":"74072","text":"66199"},{"range":"74073","text":"66201"},"test double for next/image","test harness: intentionally writes to outer capture object from inside component",{"range":"74074","text":"66199"},{"range":"74075","text":"66201"},{"range":"74076","text":"66199"},{"range":"74077","text":"66201"},{"range":"74078","text":"66199"},{"range":"74079","text":"66201"},{"range":"74080","text":"66199"},{"range":"74081","text":"66201"},{"range":"74082","text":"66199"},{"range":"74083","text":"66201"},{"range":"74084","text":"66199"},{"range":"74085","text":"66201"},{"range":"74086","text":"66199"},{"range":"74087","text":"66201"},{"range":"74088","text":"66199"},{"range":"74089","text":"66201"},{"range":"74090","text":"66199"},{"range":"74091","text":"66201"},{"range":"74092","text":"66199"},{"range":"74093","text":"66201"},{"range":"74094","text":"66199"},{"range":"74095","text":"66201"},{"range":"74096","text":"66199"},{"range":"74097","text":"66201"},{"range":"74098","text":"66199"},{"range":"74099","text":"66201"},{"range":"74100","text":"66199"},{"range":"74101","text":"66201"},{"range":"74102","text":"66199"},{"range":"74103","text":"66201"},{"range":"74104","text":"66199"},{"range":"74105","text":"66201"},{"range":"74106","text":"66199"},{"range":"74107","text":"66201"},{"range":"74108","text":"66199"},{"range":"74109","text":"66201"},{"range":"74110","text":"66199"},{"range":"74111","text":"66201"},{"range":"74112","text":"66199"},{"range":"74113","text":"66201"},{"range":"74114","text":"66199"},{"range":"74115","text":"66201"},{"range":"74116","text":"66199"},{"range":"74117","text":"66201"},{"range":"74118","text":"66199"},{"range":"74119","text":"66201"},{"range":"74120","text":"66199"},{"range":"74121","text":"66201"},{"range":"74122","text":"66199"},{"range":"74123","text":"66201"},{"range":"74124","text":"66199"},{"range":"74125","text":"66201"},{"range":"74126","text":"66199"},{"range":"74127","text":"66201"},{"range":"74128","text":"66199"},{"range":"74129","text":"66201"},{"range":"74130","text":"66199"},{"range":"74131","text":"66201"},{"range":"74132","text":"66199"},{"range":"74133","text":"66201"},{"range":"74134","text":"66199"},{"range":"74135","text":"66201"},{"range":"74136","text":"66199"},{"range":"74137","text":"66201"},{"range":"74138","text":"66199"},{"range":"74139","text":"66201"},{"range":"74140","text":"66199"},{"range":"74141","text":"66201"},{"range":"74142","text":"66199"},{"range":"74143","text":"66201"},{"range":"74144","text":"66199"},{"range":"74145","text":"66201"},{"range":"74146","text":"66199"},{"range":"74147","text":"66201"},{"range":"74148","text":"66199"},{"range":"74149","text":"66201"},{"range":"74150","text":"66199"},{"range":"74151","text":"66201"},{"range":"74152","text":"66199"},{"range":"74153","text":"66201"},{"range":"74154","text":"66199"},{"range":"74155","text":"66201"},{"range":"74156","text":"66199"},{"range":"74157","text":"66201"},{"range":"74158","text":"66199"},{"range":"74159","text":"66201"},{"range":"74160","text":"66199"},{"range":"74161","text":"66201"},{"range":"74162","text":"66199"},{"range":"74163","text":"66201"},{"range":"74164","text":"66199"},{"range":"74165","text":"66201"},{"range":"74166","text":"66199"},{"range":"74167","text":"66201"},{"range":"74168","text":"66199"},{"range":"74169","text":"66201"},{"range":"74170","text":"66199"},{"range":"74171","text":"66201"},{"range":"74172","text":"66199"},{"range":"74173","text":"66201"},{"range":"74174","text":"66199"},{"range":"74175","text":"66201"},{"range":"74176","text":"66199"},{"range":"74177","text":"66201"},{"range":"74178","text":"66199"},{"range":"74179","text":"66201"},{"range":"74180","text":"66199"},{"range":"74181","text":"66201"},{"range":"74182","text":"66199"},{"range":"74183","text":"66201"},{"range":"74184","text":"66199"},{"range":"74185","text":"66201"},{"range":"74186","text":"66199"},{"range":"74187","text":"66201"},{"range":"74188","text":"66199"},{"range":"74189","text":"66201"},{"range":"74190","text":"66199"},{"range":"74191","text":"66201"},{"range":"74192","text":"66199"},{"range":"74193","text":"66201"},{"range":"74194","text":"66199"},{"range":"74195","text":"66201"},{"range":"74196","text":"66199"},{"range":"74197","text":"66201"},{"range":"74198","text":"66199"},{"range":"74199","text":"66201"},{"range":"74200","text":"66199"},{"range":"74201","text":"66201"},{"range":"74202","text":"66199"},{"range":"74203","text":"66201"},{"range":"74204","text":"66199"},{"range":"74205","text":"66201"},{"range":"74206","text":"66199"},{"range":"74207","text":"66201"},{"range":"74208","text":"66199"},{"range":"74209","text":"66201"},{"range":"74210","text":"66199"},{"range":"74211","text":"66201"},{"range":"74212","text":"66199"},{"range":"74213","text":"66201"},{"range":"74214","text":"66199"},{"range":"74215","text":"66201"},{"range":"74216","text":"66199"},{"range":"74217","text":"66201"},{"range":"74218","text":"66199"},{"range":"74219","text":"66201"},{"range":"74220","text":"66199"},{"range":"74221","text":"66201"},{"range":"74222","text":"66199"},{"range":"74223","text":"66201"},{"range":"74224","text":"66199"},{"range":"74225","text":"66201"},{"range":"74226","text":"66199"},{"range":"74227","text":"66201"},{"range":"74228","text":"66199"},{"range":"74229","text":"66201"},{"range":"74230","text":"66199"},{"range":"74231","text":"66201"},{"range":"74232","text":"66199"},{"range":"74233","text":"66201"},{"range":"74234","text":"66199"},{"range":"74235","text":"66201"},{"range":"74236","text":"66199"},{"range":"74237","text":"66201"},{"range":"74238","text":"66199"},{"range":"74239","text":"66201"},{"range":"74240","text":"66199"},{"range":"74241","text":"66201"},{"range":"74242","text":"66199"},{"range":"74243","text":"66201"},{"range":"74244","text":"66199"},{"range":"74245","text":"66201"},{"range":"74246","text":"66199"},{"range":"74247","text":"66201"},{"range":"74248","text":"66199"},{"range":"74249","text":"66201"},{"range":"74250","text":"66199"},{"range":"74251","text":"66201"},{"range":"74252","text":"66199"},{"range":"74253","text":"66201"},{"range":"74254","text":"66199"},{"range":"74255","text":"66201"},{"range":"74256","text":"66199"},{"range":"74257","text":"66201"},{"range":"74258","text":"66199"},{"range":"74259","text":"66201"},{"range":"74260","text":"66199"},{"range":"74261","text":"66201"},{"range":"74262","text":"66199"},{"range":"74263","text":"66201"},{"range":"74264","text":"66199"},{"range":"74265","text":"66201"},{"range":"74266","text":"66199"},{"range":"74267","text":"66201"},{"range":"74268","text":"66199"},{"range":"74269","text":"66201"},{"range":"74270","text":"66199"},{"range":"74271","text":"66201"},{"range":"74272","text":"66199"},{"range":"74273","text":"66201"},{"range":"74274","text":"66199"},{"range":"74275","text":"66201"},{"range":"74276","text":"66199"},{"range":"74277","text":"66201"},{"range":"74278","text":"66199"},{"range":"74279","text":"66201"},{"range":"74280","text":"66199"},{"range":"74281","text":"66201"},{"range":"74282","text":"66199"},{"range":"74283","text":"66201"},{"range":"74284","text":"66199"},{"range":"74285","text":"66201"},{"range":"74286","text":"66199"},{"range":"74287","text":"66201"},{"range":"74288","text":"66199"},{"range":"74289","text":"66201"},{"range":"74290","text":"66199"},{"range":"74291","text":"66201"},{"range":"74292","text":"66199"},{"range":"74293","text":"66201"},{"range":"74294","text":"66199"},{"range":"74295","text":"66201"},{"range":"74296","text":"66199"},{"range":"74297","text":"66201"},{"range":"74298","text":"66199"},{"range":"74299","text":"66201"},{"range":"74300","text":"66199"},{"range":"74301","text":"66201"},{"range":"74302","text":"66199"},{"range":"74303","text":"66201"},{"range":"74304","text":"66199"},{"range":"74305","text":"66201"},{"range":"74306","text":"66199"},{"range":"74307","text":"66201"},{"range":"74308","text":"66199"},{"range":"74309","text":"66201"},{"range":"74310","text":"66199"},{"range":"74311","text":"66201"},{"range":"74312","text":"66199"},{"range":"74313","text":"66201"},{"range":"74314","text":"66199"},{"range":"74315","text":"66201"},{"range":"74316","text":"66199"},{"range":"74317","text":"66201"},{"range":"74318","text":"66199"},{"range":"74319","text":"66201"},{"range":"74320","text":"66199"},{"range":"74321","text":"66201"},{"range":"74322","text":"66199"},{"range":"74323","text":"66201"},{"range":"74324","text":"66199"},{"range":"74325","text":"66201"},{"range":"74326","text":"66199"},{"range":"74327","text":"66201"},{"range":"74328","text":"66199"},{"range":"74329","text":"66201"},{"range":"74330","text":"66199"},{"range":"74331","text":"66201"},{"range":"74332","text":"66199"},{"range":"74333","text":"66201"},{"range":"74334","text":"66199"},{"range":"74335","text":"66201"},{"range":"74336","text":"66199"},{"range":"74337","text":"66201"},{"range":"74338","text":"66199"},{"range":"74339","text":"66201"},{"range":"74340","text":"66199"},{"range":"74341","text":"66201"},{"range":"74342","text":"66199"},{"range":"74343","text":"66201"},{"range":"74344","text":"66199"},{"range":"74345","text":"66201"},{"range":"74346","text":"66199"},{"range":"74347","text":"66201"},{"range":"74348","text":"66199"},{"range":"74349","text":"66201"},{"range":"74350","text":"66199"},{"range":"74351","text":"66201"},{"range":"74352","text":"66199"},{"range":"74353","text":"66201"},{"range":"74354","text":"66199"},{"range":"74355","text":"66201"},{"range":"74356","text":"66199"},{"range":"74357","text":"66201"},{"range":"74358","text":"66199"},{"range":"74359","text":"66201"},{"range":"74360","text":"66199"},{"range":"74361","text":"66201"},{"range":"74362","text":"66199"},{"range":"74363","text":"66201"},{"range":"74364","text":"66199"},{"range":"74365","text":"66201"},{"range":"74366","text":"66199"},{"range":"74367","text":"66201"},{"range":"74368","text":"66199"},{"range":"74369","text":"66201"},{"range":"74370","text":"66199"},{"range":"74371","text":"66201"},{"range":"74372","text":"66199"},{"range":"74373","text":"66201"},{"range":"74374","text":"66199"},{"range":"74375","text":"66201"},{"range":"74376","text":"66199"},{"range":"74377","text":"66201"},{"range":"74378","text":"66199"},{"range":"74379","text":"66201"},{"range":"74380","text":"66199"},{"range":"74381","text":"66201"},{"range":"74382","text":"66199"},{"range":"74383","text":"66201"},{"range":"74384","text":"66199"},{"range":"74385","text":"66201"},{"range":"74386","text":"66199"},{"range":"74387","text":"66201"},{"range":"74388","text":"66199"},{"range":"74389","text":"66201"},{"range":"74390","text":"66199"},{"range":"74391","text":"66201"},{"range":"74392","text":"66199"},{"range":"74393","text":"66201"},{"range":"74394","text":"66199"},{"range":"74395","text":"66201"},{"range":"74396","text":"66199"},{"range":"74397","text":"66201"},{"range":"74398","text":"66199"},{"range":"74399","text":"66201"},{"range":"74400","text":"66199"},{"range":"74401","text":"66201"},{"range":"74402","text":"66199"},{"range":"74403","text":"66201"},{"range":"74404","text":"66199"},{"range":"74405","text":"66201"},{"range":"74406","text":"66199"},{"range":"74407","text":"66201"},{"range":"74408","text":"66199"},{"range":"74409","text":"66201"},{"range":"74410","text":"66199"},{"range":"74411","text":"66201"},{"range":"74412","text":"66199"},{"range":"74413","text":"66201"},{"range":"74414","text":"66199"},{"range":"74415","text":"66201"},{"range":"74416","text":"66199"},{"range":"74417","text":"66201"},{"range":"74418","text":"66199"},{"range":"74419","text":"66201"},{"range":"74420","text":"66199"},{"range":"74421","text":"66201"},{"range":"74422","text":"66199"},{"range":"74423","text":"66201"},{"range":"74424","text":"66199"},{"range":"74425","text":"66201"},{"range":"74426","text":"66199"},{"range":"74427","text":"66201"},{"range":"74428","text":"66199"},{"range":"74429","text":"66201"},{"range":"74430","text":"66199"},{"range":"74431","text":"66201"},{"range":"74432","text":"66199"},{"range":"74433","text":"66201"},{"range":"74434","text":"66199"},{"range":"74435","text":"66201"},{"range":"74436","text":"66199"},{"range":"74437","text":"66201"},{"range":"74438","text":"66199"},{"range":"74439","text":"66201"},{"range":"74440","text":"66199"},{"range":"74441","text":"66201"},{"range":"74442","text":"66199"},{"range":"74443","text":"66201"},[11168,11171],"unknown",[11168,11171],"never",[15827,15830],[15827,15830],[8312,8315],[8312,8315],[8579,8582],[8579,8582],[9861,9864],[9861,9864],[9903,9906],[9903,9906],[9945,9948],[9945,9948],[11960,11963],[11960,11963],[13851,13854],[13851,13854],[14088,14091],[14088,14091],[16732,16735],[16732,16735],[17258,17261],[17258,17261],[17286,17289],[17286,17289],[17334,17337],[17334,17337],[16572,16575],[16572,16575],[17712,17715],[17712,17715],[1556,1559],[1556,1559],[1740,1743],[1740,1743],[4332,4335],[4332,4335],[4355,4358],[4355,4358],[5338,5341],[5338,5341],[5373,5376],[5373,5376],[5379,5382],[5379,5382],[10210,10213],[10210,10213],[11053,11056],[11053,11056],[11059,11062],[11059,11062],[11391,11394],[11391,11394],[12224,12227],[12224,12227],[13059,13062],[13059,13062],[13065,13068],[13065,13068],[12191,12194],[12191,12194],[12259,12262],[12259,12262],[692,695],[692,695],[1106,1109],[1106,1109],[1142,1145],[1142,1145],[1148,1151],[1148,1151],[2980,2983],[2980,2983],[3818,3821],[3818,3821],[3860,3863],[3860,3863],[1405,1408],[1405,1408],[1821,1824],[1821,1824],[1858,1861],[1858,1861],[1864,1867],[1864,1867],[8797,8800],[8797,8800],[8838,8841],[8838,8841],[8871,8874],[8871,8874],[8913,8916],[8913,8916],[8947,8950],[8947,8950],[8991,8994],[8991,8994],[9100,9103],[9100,9103],[9549,9552],[9549,9552],[9587,9590],[9587,9590],[9735,9738],[9735,9738],[15460,15463],[15460,15463],[5602,5605],[5602,5605],[5830,5833],[5830,5833],[7462,7465],[7462,7465],[3417,3420],[3417,3420],[2894,2897],[2894,2897],[2970,2973],[2970,2973],[2991,2994],[2991,2994],[5127,5130],[5127,5130],[5448,5451],[5448,5451],[5907,5910],[5907,5910],[6394,6397],[6394,6397],[19508,19511],[19508,19511],[19794,19797],[19794,19797],[20136,20139],[20136,20139],[20422,20425],[20422,20425],[20971,20974],[20971,20974],[21257,21260],[21257,21260],[21689,21692],[21689,21692],[21932,21935],[21932,21935],[22672,22675],[22672,22675],[22919,22922],[22919,22922],[23408,23411],[23408,23411],[23745,23748],[23745,23748],[24562,24565],[24562,24565],[25014,25017],[25014,25017],[26125,26128],[26125,26128],[26373,26376],[26373,26376],[26951,26954],[26951,26954],[27200,27203],[27200,27203],[31018,31021],[31018,31021],[31061,31064],[31061,31064],[32176,32179],[32176,32179],[33799,33802],[33799,33802],[34703,34706],[34703,34706],[41248,41251],[41248,41251],[41289,41292],[41289,41292],[42348,42351],[42348,42351],[45223,45226],[45223,45226],[6286,6289],[6286,6289],[271,274],[271,274],[3523,3526],[3523,3526],[3558,3561],[3558,3561],[3811,3814],[3811,3814],[4135,4138],[4135,4138],[2649,2652],[2649,2652],[661,664],[661,664],[1272,1275],[1272,1275],[1362,1365],[1362,1365],[36922,36925],[36922,36925],[37907,37910],[37907,37910],[41746,41749],[41746,41749],[739,742],[739,742],[1301,1304],[1301,1304],[1571,1574],[1571,1574],[5836,5839],[5836,5839],[5842,5845],[5842,5845],[9524,9527],[9524,9527],[14966,14969],[14966,14969],[20174,20177],[20174,20177],[20205,20208],[20205,20208],[20754,20757],[20754,20757],[21962,21965],[21962,21965],[21988,21991],[21988,21991],[24705,24708],[24705,24708],[25581,25584],[25581,25584],[25595,25598],[25595,25598],[26147,26150],[26147,26150],[26163,26166],[26163,26166],[26189,26192],[26189,26192],[26993,26996],[26993,26996],[27104,27107],[27104,27107],[521,524],[521,524],[4328,4331],[4328,4331],[4383,4386],[4383,4386],[562,565],[562,565],[2483,2486],[2483,2486],[3290,3293],[3290,3293],[4203,4206],[4203,4206],[6389,6392],[6389,6392],[6782,6785],[6782,6785],[9842,9845],[9842,9845],[9892,9895],[9892,9895],[10575,10578],[10575,10578],[12046,12049],[12046,12049],[12111,12114],[12111,12114],[13865,13868],[13865,13868],[14140,14143],[14140,14143],[16013,16016],[16013,16016],[17495,17498],[17495,17498],[19264,19267],[19264,19267],[20659,20662],[20659,20662],[22355,22358],[22355,22358],[22561,22564],[22561,22564],[25537,25540],[25537,25540],[25603,25606],[25603,25606],[26438,26441],[26438,26441],[3953,3956],[3953,3956],[1806,1809],[1806,1809],[2467,2470],[2467,2470],[2932,2935],[2932,2935],[3453,3456],[3453,3456],[291,294],[291,294],[880,883],[880,883],[2237,2240],[2237,2240],[3277,3280],[3277,3280],[5531,5534],[5531,5534],[8772,8775],[8772,8775],[9082,9085],[9082,9085],[9361,9364],[9361,9364],[11247,11250],[11247,11250],[1166,1169],[1166,1169],[4933,4936],[4933,4936],[6644,6647],[6644,6647],[267,270],[267,270],[307,310],[307,310],[748,751],[748,751],[910,913],[910,913],[1067,1070],[1067,1070],[6864,6917],"[versionInfo, platform]",[9568,9570],"[fetchData]",[1478,1495],"[jsonl, endpoint, onResult, t]",[18999,19001],"[LOCAL_PROVIDERS]",[2737,2757],"[isExpanded, loadSavedMappings, status]",[9467,9488],"[plans, primaryConnectionId, selectedConn]",[11296,11328],"[open, editPool, initialGroupId, editPoolExclusive, plans]",[11843,11867],"[open, editPool, groups, groupId]",[2169,2203],"[pools]",[5628,5664],"[availableModels, configState, configState.model, setConfigState]",[6234,6293],"[configState, reasoningSpec, reasoningSpec.show, setConfigState]",[11205,11380],"useCallback(() => {\n setResponseBody(\"\");\n setResponseStatus(null);\n setResponseDuration(null);\n setAudioUrl(null);\n setImageData(null);\n setTranscriptionText(null);\n })",[5807,5823],"[getUpstreamHeadersRecord, open, protocol]",[2225,2239],"[searchParams, setProviderDisplayMode]",[2696,2710],"[searchParams, setActiveCategory, setActiveServiceKind, setModelSearchQuery, setSearchQuery, setShowFreeOnly]",[1844,1846],"[L]",[2842,2844],"[customThemeColor]",[1297,1299],"[notify, t]",[3254,3267],"[load, providerKey]",[2042,2044],"[t]",[4278,4280],"[forceOpen, onOpenChange]",[1808,1810],"[defaultOpen, forceOpen, onOpenChange]",[18938,18940],"[onFirstOpen]",[13638,13640],[10875,10916],"[providers, activeSet, lastSet, errorSet]",[9256,9344],"[apiKey, effectiveWsUrl, channels, autoReconnect, connection.reconnectAttempt]",[1639,1647],"[isOpen, t]",[1742,1744],"[router]",[8959,8984],"[isOpen, activeProviders, fetchProviderModels]",[10822,10846],"[isOpen, level, levelId, resetFields, t]",[5651,5653],"[columnSortMap]",[5969,5977],"[columnSortMap, sortBy]",[19931,22976],"useCallback(async (logEntry) => {\n // Guard: if no valid id provided, close instead of opening an empty modal\n if (!logEntry?.id) {\n try {\n closeDetail();\n } catch {}\n return;\n }\n\n const requestToken = `${logEntry.id}:${Date.now()}:${Math.random()}`;\n detailRequestRef.current = requestToken;\n const isCurrentDetailRequest = () => detailRequestRef.current === requestToken;\n\n setSelectedLog(logEntry);\n try {\n const url = new URL(globalThis.location.href);\n url.searchParams.set(\"id\", logEntry.id);\n router.replace(url.pathname + url.search);\n } catch (e) {\n // ignore navigation errors\n }\n setDetailLoading(true);\n setDetailData(null);\n try {\n const res = await fetch(`/api/logs/${logEntry.id}`, { cache: \"no-store\" });\n if (res.ok) {\n const data = await res.json();\n if (!isCurrentDetailRequest()) return;\n const dataHasPipeline =\n data?.pipelinePayloads && Object.keys(data.pipelinePayloads || {}).length > 0;\n setDetailData((prev: { pipelinePayloads: any }) => ({\n ...prev,\n ...data,\n pipelinePayloads: dataHasPipeline ? data.pipelinePayloads : prev?.pipelinePayloads,\n }));\n // ensure the modal summary reflects the fetched call log summary\n if (data && typeof data === \"object\") {\n setSelectedLog((prev: any) => ({\n ...prev,\n ...data,\n active: data.active === true,\n }));\n }\n } else {\n // A deep-linked id can legitimately 404 while the request is still\n // finalizing. Keep the modal open and poll /api/logs/[id] instead of\n // falling back to an in-memory active-request endpoint.\n if (!isCurrentDetailRequest()) return;\n if (res.status === 404) {\n if (logEntry.pendingLookup || logEntry.active) {\n setSelectedLog((prev: { method: any; path: any }) => ({\n ...prev,\n id: logEntry.id,\n status: 0,\n method: prev?.method,\n path: prev?.path || \"\",\n }));\n setDetailData({ detailState: \"pending\" });\n return;\n }\n try {\n console.warn(\"Log not found:\", logEntry.id);\n } catch {}\n try {\n closeDetail();\n } catch {}\n return;\n }\n // other errors: show a minimal error indicator by setting detailData to an error object\n try {\n const body = await res.text().catch(() => null);\n if (!isCurrentDetailRequest()) return;\n setDetailData({ error: `Failed to fetch log (status ${res.status})`, body });\n } catch {}\n }\n } catch (error) {\n console.error(\"Failed to fetch log detail:\", error);\n } finally {\n if (isCurrentDetailRequest()) setDetailLoading(false);\n }\n })",[24185,24204],"[initialSelectedId, openDetail]",[27895,27930],"[closeDetail, currentLogIndex, openDetail, sortedLogsForNav]",[28368,28403],[11493,11556],"[activeHref, collapsed, pinnedSections, sidebarExpansionLoaded, visibleSections]",[301,304],[301,304],[556,559],[556,559],[939,942],[939,942],[1471,1474],[1471,1474],[1688,1691],[1688,1691],[1925,1928],[1925,1928],[2660,2663],[2660,2663],[3610,3613],[3610,3613],[3948,3951],[3948,3951],[4122,4125],[4122,4125],[4371,4374],[4371,4374],[4737,4740],[4737,4740],[4919,4922],[4919,4922],[5431,5434],[5431,5434],[6090,6093],[6090,6093],[6562,6565],[6562,6565],[7540,7543],[7540,7543],[7643,7646],[7643,7646],[8061,8064],[8061,8064],[11513,11516],[11513,11516],[2278,2281],[2278,2281],[4810,4813],[4810,4813],[2089,2092],[2089,2092],[4406,4409],[4406,4409],[4531,4534],[4531,4534],[4869,4872],[4869,4872],[7077,7080],[7077,7080],[7193,7196],[7193,7196],[1278,1281],[1278,1281],[5583,5586],[5583,5586],[2208,2211],[2208,2211],[2745,2748],[2745,2748],[2756,2759],[2756,2759],[2600,2603],[2600,2603],[2663,2666],[2663,2666],[3474,3477],[3474,3477],[3537,3540],[3537,3540],[4192,4195],[4192,4195],[5502,5505],[5502,5505],[6281,6284],[6281,6284],[6334,6337],[6334,6337],[7219,7222],[7219,7222],[7815,7818],[7815,7818],[8570,8573],[8570,8573],[9601,9604],[9601,9604],[10996,10999],[10996,10999],[11893,11896],[11893,11896],[13403,13406],[13403,13406],[13470,13473],[13470,13473],[13535,13538],[13535,13538],[15059,15062],[15059,15062],[15128,15131],[15128,15131],[15195,15198],[15195,15198],[16346,16349],[16346,16349],[17990,17993],[17990,17993],[18063,18066],[18063,18066],[2914,2917],[2914,2917],[4823,4826],[4823,4826],[4886,4889],[4886,4889],[4939,4942],[4939,4942],[4996,4999],[4996,4999],[5055,5058],[5055,5058],[5126,5129],[5126,5129],[5189,5192],[5189,5192],[5248,5251],[5248,5251],[5313,5316],[5313,5316],[5380,5383],[5380,5383],[5443,5446],[5443,5446],[7739,7742],[7739,7742],[8468,8471],[8468,8471],[8529,8532],[8529,8532],[8586,8589],[8586,8589],[8649,8652],[8649,8652],[8714,8717],[8714,8717],[11004,11007],[11004,11007],[11234,11237],[11234,11237],[13170,13173],[13170,13173],[13241,13244],[13241,13244],[13312,13315],[13312,13315],[13383,13386],[13383,13386],[13446,13449],[13446,13449],[13521,13524],[13521,13524],[13598,13601],[13598,13601],[13663,13666],[13663,13666],[15187,15190],[15187,15190],[15934,15937],[15934,15937],[16187,16190],[16187,16190],[16433,16436],[16433,16436],[16514,16517],[16514,16517],[16629,16632],[16629,16632],[18598,18601],[18598,18601],[18677,18680],[18677,18680],[18742,18745],[18742,18745],[18805,18808],[18805,18808],[19592,19595],[19592,19595],[2416,2419],[2416,2419],[14630,14633],[14630,14633],[15747,15750],[15747,15750],[17745,17748],[17745,17748],[29092,29095],[29092,29095],[30319,30322],[30319,30322],[31706,31709],[31706,31709],[33409,33412],[33409,33412],[33695,33698],[33695,33698],[34426,34429],[34426,34429],[35121,35124],[35121,35124],[37157,37160],[37157,37160],[38552,38555],[38552,38555],[39372,39375],[39372,39375],[40352,40355],[40352,40355],[42189,42192],[42189,42192],[43420,43423],[43420,43423],[45246,45249],[45246,45249],[46891,46894],[46891,46894],[48477,48480],[48477,48480],[2974,2977],[2974,2977],[9773,9776],[9773,9776],[12223,12226],[12223,12226],[13855,13858],[13855,13858],[15031,15034],[15031,15034],[16223,16226],[16223,16226],[21703,21706],[21703,21706],[32492,32495],[32492,32495],[34561,34564],[34561,34564],[2502,2505],[2502,2505],[2521,2524],[2521,2524],[2538,2541],[2538,2541],[2630,2633],[2630,2633],[4815,4818],[4815,4818],[6315,6318],[6315,6318],[8979,8982],[8979,8982],[9403,9406],[9403,9406],[10356,10359],[10356,10359],[10415,10418],[10415,10418],[4253,4256],[4253,4256],[4282,4285],[4282,4285],[4322,4325],[4322,4325],[4592,4595],[4592,4595],[4981,4984],[4981,4984],[5814,5817],[5814,5817],[5866,5869],[5866,5869],[5955,5958],[5955,5958],[6002,6005],[6002,6005],[6094,6097],[6094,6097],[7181,7184],[7181,7184],[7208,7211],[7208,7211],[7246,7249],[7246,7249],[7583,7586],[7583,7586],[8743,8746],[8743,8746],[8809,8812],[8809,8812],[11083,11086],[11083,11086],[11110,11113],[11110,11113],[11148,11151],[11148,11151],[12828,12831],[12828,12831],[13566,13569],[13566,13569],[13632,13635],[13632,13635],[2802,2805],[2802,2805],[2831,2834],[2831,2834],[2871,2874],[2871,2874],[3141,3144],[3141,3144],[3518,3521],[3518,3521],[4535,4538],[4535,4538],[5187,5190],[5187,5190],[5239,5242],[5239,5242],[5328,5331],[5328,5331],[5375,5378],[5375,5378],[5467,5470],[5467,5470],[8772,8775],[8772,8775],[8959,8962],[8959,8962],[8997,9000],[8997,9000],[9151,9154],[9151,9154],[9180,9183],[9180,9183],[9220,9223],[9220,9223],[9474,9477],[9474,9477],[9679,9682],[9679,9682],[9747,9750],[9747,9750],[13510,13513],[13510,13513],[15083,15086],[15083,15086],[15359,15362],[15359,15362],[15691,15694],[15691,15694],[15720,15723],[15720,15723],[15760,15763],[15760,15763],[16216,16219],[16216,16219],[16608,16611],[16608,16611],[18354,18357],[18354,18357],[5141,5144],[5141,5144],[5263,5266],[5263,5266],[5352,5355],[5352,5355],[5399,5402],[5399,5402],[4089,4092],[4089,4092],[4100,4103],[4100,4103],[470,473],[470,473],[1829,1832],[1829,1832],[3032,3035],[3032,3035],[4308,4311],[4308,4311],[5565,5568],[5565,5568],[6578,6581],[6578,6581],[7701,7704],[7701,7704],[8947,8950],[8947,8950],[10346,10349],[10346,10349],[11083,11086],[11083,11086],[11659,11662],[11659,11662],[13149,13152],[13149,13152],[14168,14171],[14168,14171],[15220,15223],[15220,15223],[16416,16419],[16416,16419],[17546,17549],[17546,17549],[18678,18681],[18678,18681],[19813,19816],[19813,19816],[19824,19827],[19824,19827],[1611,1614],[1611,1614],[5653,5656],[5653,5656],[7519,7522],[7519,7522],[9633,9636],[9633,9636],[10695,10698],[10695,10698],[11248,11251],[11248,11251],[12452,12455],[12452,12455],[2684,2687],[2684,2687],[2885,2888],[2885,2888],[1316,1319],[1316,1319],[4128,4131],[4128,4131],[5740,5743],[5740,5743],[6391,6394],[6391,6394],[1425,1428],[1425,1428],[1786,1789],[1786,1789],[1713,1716],[1713,1716],[1763,1766],[1763,1766],[3848,3851],[3848,3851],[3988,3991],[3988,3991],[4027,4030],[4027,4030],[4195,4198],[4195,4198],[4218,4221],[4218,4221],[4723,4726],[4723,4726],[4967,4970],[4967,4970],[5006,5009],[5006,5009],[5244,5247],[5244,5247],[5267,5270],[5267,5270],[5323,5326],[5323,5326],[5346,5349],[5346,5349],[5763,5766],[5763,5766],[1089,1092],[1089,1092],[1105,1108],[1105,1108],[1123,1126],[1123,1126],[1139,1142],[1139,1142],[7083,7086],[7083,7086],[8008,8011],[8008,8011],[10280,10283],[10280,10283],[16930,16933],[16930,16933],[17533,17536],[17533,17536],[18355,18358],[18355,18358],[18726,18729],[18726,18729],[21273,21276],[21273,21276],[9301,9304],[9301,9304],[2185,2188],[2185,2188],[2293,2296],[2293,2296],[3085,3088],[3085,3088],[3096,3099],[3096,3099],[4193,4196],[4193,4196],[5104,5107],[5104,5107],[5464,5467],[5464,5467],[5476,5479],[5476,5479],[6302,6305],[6302,6305],[2551,2554],[2551,2554],[3032,3035],[3032,3035],[3375,3378],[3375,3378],[4593,4596],[4593,4596],[5334,5337],[5334,5337],[5910,5913],[5910,5913],[6637,6640],[6637,6640],[7120,7123],[7120,7123],[8359,8362],[8359,8362],[3486,3489],[3486,3489],[4571,4574],[4571,4574],[5064,5067],[5064,5067],[6175,6178],[6175,6178],[6724,6727],[6724,6727],[6875,6878],[6875,6878],[7508,7511],[7508,7511],[8553,8556],[8553,8556],[9273,9276],[9273,9276],[9667,9670],[9667,9670],[10145,10148],[10145,10148],[10794,10797],[10794,10797],[11165,11168],[11165,11168],[11660,11663],[11660,11663],[12069,12072],[12069,12072],[12876,12879],[12876,12879],[13223,13226],[13223,13226],[13637,13640],[13637,13640],[14206,14209],[14206,14209],[8530,8533],[8530,8533],[12423,12426],[12423,12426],[12670,12673],[12670,12673],[1946,1949],[1946,1949],[4400,4403],[4400,4403],[5433,5436],[5433,5436],[7540,7543],[7540,7543],[9980,9983],[9980,9983],[10029,10032],[10029,10032],[10089,10092],[10089,10092],[10118,10121],[10118,10121],[10216,10219],[10216,10219],[11030,11033],[11030,11033],[11059,11062],[11059,11062],[17769,17772],[17769,17772],[24546,24549],[24546,24549],[26807,26810],[26807,26810],[1478,1481],[1478,1481],[1541,1544],[1541,1544],[1771,1774],[1771,1774],[1861,1864],[1861,1864],[2284,2287],[2284,2287],[3030,3033],[3030,3033],[3783,3786],[3783,3786],[4697,4700],[4697,4700],[5408,5411],[5408,5411],[6332,6335],[6332,6335],[844,847],[844,847],[2240,2243],[2240,2243],[1079,1082],[1079,1082],[1858,1861],[1858,1861],[2502,2505],[2502,2505],[2782,2785],[2782,2785],[3449,3452],[3449,3452],[3853,3856],[3853,3856],[5629,5632],[5629,5632],[6413,6416],[6413,6416],[7301,7304],[7301,7304],[7771,7774],[7771,7774],[1386,1389],[1386,1389],[3959,3962],[3959,3962],[4081,4084],[4081,4084],[2506,2509],[2506,2509],[1253,1256],[1253,1256],[2311,2314],[2311,2314],[3121,3124],[3121,3124],[5446,5449],[5446,5449],[6857,6860],[6857,6860],[7076,7079],[7076,7079],[7200,7203],[7200,7203],[7259,7262],[7259,7262],[7296,7299],[7296,7299],[7353,7356],[7353,7356],[7402,7405],[7402,7405],[7436,7439],[7436,7439],[7485,7488],[7485,7488],[7834,7837],[7834,7837],[3721,3724],[3721,3724],[10416,10419],[10416,10419],[1611,1614],[1611,1614],[1832,1835],[1832,1835],[2520,2523],[2520,2523],[2696,2699],[2696,2699],[1035,1038],[1035,1038],[1046,1049],[1046,1049],[2654,2657],[2654,2657],[3629,3632],[3629,3632],[4241,4244],[4241,4244],[2552,2555],[2552,2555],[3560,3563],[3560,3563],[4075,4078],[4075,4078],[4802,4805],[4802,4805],[628,631],[628,631],[8900,8903],[8900,8903],[9207,9210],[9207,9210],[4707,4710],[4707,4710],[1657,1660],[1657,1660],[2206,2209],[2206,2209],[3056,3059],[3056,3059],[3642,3645],[3642,3645],[4192,4195],[4192,4195],[4761,4764],[4761,4764],[5223,5226],[5223,5226],[5684,5687],[5684,5687],[1271,1274],[1271,1274],[465,468],[465,468],[801,804],[801,804],[3782,3785],[3782,3785],[9903,9906],[9903,9906],[10335,10338],[10335,10338],[12736,12739],[12736,12739],[16520,16523],[16520,16523],[18912,18915],[18912,18915],[19530,19533],[19530,19533],[712,715],[712,715],[1115,1118],[1115,1118],[4462,4465],[4462,4465],[7912,7915],[7912,7915],[8399,8402],[8399,8402],[12299,12302],[12299,12302],[18828,18831],[18828,18831],[19681,19684],[19681,19684],[20400,20403],[20400,20403],[580,583],[580,583],[979,982],[979,982],[1462,1465],[1462,1465],[1979,1982],[1979,1982],[5928,5931],[5928,5931],[6751,6754],[6751,6754],[3736,3739],[3736,3739],[3849,3852],[3849,3852],[5909,5912],[5909,5912],[6022,6025],[6022,6025],[7846,7849],[7846,7849],[8023,8026],[8023,8026],[8245,8248],[8245,8248],[14313,14316],[14313,14316],[14423,14426],[14423,14426],[1617,1620],[1617,1620],[1715,1718],[1715,1718],[2415,2418],[2415,2418],[2685,2688],[2685,2688],[3885,3888],[3885,3888],[1439,1442],[1439,1442],[1588,1591],[1588,1591],[2818,2821],[2818,2821],[2958,2961],[2958,2961],[3520,3523],[3520,3523],[3664,3667],[3664,3667],[4324,4327],[4324,4327],[4473,4476],[4473,4476],[5551,5554],[5551,5554],[5686,5689],[5686,5689],[6074,6077],[6074,6077],[3505,3508],[3505,3508],[1836,1839],[1836,1839],[2123,2126],[2123,2126],[2404,2407],[2404,2407],[2650,2653],[2650,2653],[2949,2952],[2949,2952],[3164,3167],[3164,3167],[3463,3466],[3463,3466],[3741,3744],[3741,3744],[3878,3881],[3878,3881],[4035,4038],[4035,4038],[4387,4390],[4387,4390],[2994,2997],[2994,2997],[3231,3234],[3231,3234],[3680,3683],[3680,3683],[3820,3823],[3820,3823],[4391,4394],[4391,4394],[4535,4538],[4535,4538],[5095,5098],[5095,5098],[5229,5232],[5229,5232],[5835,5838],[5835,5838],[5966,5969],[5966,5969],[6045,6048],[6045,6048],[6701,6704],[6701,6704],[6869,6872],[6869,6872],[7482,7485],[7482,7485],[7653,7656],[7653,7656],[5212,5215],[5212,5215],[869,872],[869,872],[1110,1113],[1110,1113],[2030,2033],[2030,2033],[2479,2482],[2479,2482],[3399,3402],[3399,3402],[3894,3897],[3894,3897],[4814,4817],[4814,4817],[5345,5348],[5345,5348],[6265,6268],[6265,6268],[7004,7007],[7004,7007],[8210,8213],[8210,8213],[8741,8744],[8741,8744],[9078,9081],[9078,9081],[9495,9498],[9495,9498],[10145,10148],[10145,10148],[10390,10393],[10390,10393],[11860,11863],[11860,11863],[12910,12913],[12910,12913],[13394,13397],[13394,13397],[14470,14473],[14470,14473],[17010,17013],[17010,17013],[1034,1037],[1034,1037],[1093,1096],[1093,1096],[1606,1609],[1606,1609],[2089,2092],[2089,2092],[2739,2742],[2739,2742],[3149,3152],[3149,3152],[3737,3740],[3737,3740],[5371,5374],[5371,5374],[5428,5431],[5428,5431],[5952,5955],[5952,5955],[6629,6632],[6629,6632],[7300,7303],[7300,7303],[7866,7869],[7866,7869],[7925,7928],[7925,7928],[8020,8023],[8020,8023],[8510,8513],[8510,8513],[8876,8879],[8876,8879],[9261,9264],[9261,9264],[9670,9673],[9670,9673],[9729,9732],[9729,9732],[10144,10147],[10144,10147],[10202,10205],[10202,10205],[10587,10590],[10587,10590],[11286,11289],[11286,11289],[11638,11641],[11638,11641],[12045,12048],[12045,12048],[12636,12639],[12636,12639],[13071,13074],[13071,13074],[13453,13456],[13453,13456],[13886,13889],[13886,13889],[14239,14242],[14239,14242],[15530,15533],[15530,15533],[20300,20303],[20300,20303],[20357,20360],[20357,20360],[21021,21024],[21021,21024],[21510,21513],[21510,21513],[21929,21932],[21929,21932],[22394,22397],[22394,22397],[22782,22785],[22782,22785],[22839,22842],[22839,22842],[22934,22937],[22934,22937],[23524,23527],[23524,23527],[24354,24357],[24354,24357],[24853,24856],[24853,24856],[25512,25515],[25512,25515],[26044,26047],[26044,26047],[26200,26203],[26200,26203],[26879,26882],[26879,26882],[9328,9331],[9328,9331],[15845,15848],[15845,15848],[28217,28220],[28217,28220],[33654,33657],[33654,33657],[33703,33706],[33703,33706],[33752,33755],[33752,33755],[34496,34499],[34496,34499],[1453,1456],[1453,1456],[1917,1920],[1917,1920],[1108,1111],[1108,1111],[1119,1122],[1119,1122],[2753,2756],[2753,2756],[4863,4866],[4863,4866],[5773,5776],[5773,5776],[6526,6529],[6526,6529],[7276,7279],[7276,7279],[7972,7975],[7972,7975],[10712,10715],[10712,10715],[11255,11258],[11255,11258],[9943,9946],[9943,9946],[10070,10073],[10070,10073],[10209,10212],[10209,10212],[10323,10326],[10323,10326],[10632,10635],[10632,10635],[1151,1154],[1151,1154],[2284,2287],[2284,2287],[4758,4761],[4758,4761],[4832,4835],[4832,4835],[4922,4925],[4922,4925],[5257,5260],[5257,5260],[5674,5677],[5674,5677],[5700,5703],[5700,5703],[5759,5762],[5759,5762],[5821,5824],[5821,5824],[5878,5881],[5878,5881],[5936,5939],[5936,5939],[6004,6007],[6004,6007],[8562,8565],[8562,8565],[8747,8750],[8747,8750],[9047,9050],[9047,9050],[9231,9234],[9231,9234],[14069,14072],[14069,14072],[14134,14137],[14134,14137],[14197,14200],[14197,14200],[14315,14318],[14315,14318],[15222,15225],[15222,15225],[15275,15278],[15275,15278],[16098,16101],[16098,16101],[16150,16153],[16150,16153],[16190,16193],[16190,16193],[16216,16219],[16216,16219],[16273,16276],[16273,16276],[16388,16391],[16388,16391],[16875,16878],[16875,16878],[17781,17784],[17781,17784],[17830,17833],[17830,17833],[17941,17944],[17941,17944],[19362,19365],[19362,19365],[19411,19414],[19411,19414],[19522,19525],[19522,19525],[20810,20813],[20810,20813],[20859,20862],[20859,20862],[20968,20971],[20968,20971],[22135,22138],[22135,22138],[22184,22187],[22184,22187],[22289,22292],[22289,22292],[23324,23327],[23324,23327],[23373,23376],[23373,23376],[23481,23484],[23481,23484],[1359,1362],[1359,1362],[5380,5383],[5380,5383],[5630,5633],[5630,5633],[5674,5677],[5674,5677],[5698,5701],[5698,5701],[598,601],[598,601],[2060,2063],[2060,2063],[2806,2809],[2806,2809],[2872,2875],[2872,2875],[1133,1136],[1133,1136],[1143,1146],[1143,1146],[1657,1660],[1657,1660],[3237,3240],[3237,3240],[3677,3680],[3677,3680],[4139,4142],[4139,4142],[4793,4796],[4793,4796],[5248,5251],[5248,5251],[5647,5650],[5647,5650],[5958,5961],[5958,5961],[6500,6503],[6500,6503],[6986,6989],[6986,6989],[7463,7466],[7463,7466],[7976,7979],[7976,7979],[8540,8543],[8540,8543],[9193,9196],[9193,9196],[9245,9248],[9245,9248],[9569,9572],[9569,9572],[9852,9855],[9852,9855],[10263,10266],[10263,10266],[10616,10619],[10616,10619],[10729,10732],[10729,10732],[10802,10805],[10802,10805],[10883,10886],[10883,10886],[11665,11668],[11665,11668],[12366,12369],[12366,12369],[13272,13275],[13272,13275],[14296,14299],[14296,14299],[14409,14412],[14409,14412],[15837,15840],[15837,15840],[15934,15937],[15934,15937],[1763,1766],[1763,1766],[2009,2012],[2009,2012],[4940,4943],[4940,4943],[5011,5014],[5011,5014],[5094,5097],[5094,5097],[5213,5216],[5213,5216],[5268,5271],[5268,5271],[5301,5304],[5301,5304],[5370,5373],[5370,5373],[5486,5489],[5486,5489],[5918,5921],[5918,5921],[5962,5965],[5962,5965],[8104,8107],[8104,8107],[8173,8176],[8173,8176],[8246,8249],[8246,8249],[8314,8317],[8314,8317],[8364,8367],[8364,8367],[8469,8472],[8469,8472],[8586,8589],[8586,8589],[9847,9850],[9847,9850],[9929,9932],[9929,9932],[10011,10014],[10011,10014],[10093,10096],[10093,10096],[10166,10169],[10166,10169],[11060,11063],[11060,11063],[11129,11132],[11129,11132],[11202,11205],[11202,11205],[11287,11290],[11287,11290],[12155,12158],[12155,12158],[12220,12223],[12220,12223],[12289,12292],[12289,12292],[12358,12361],[12358,12361],[12440,12443],[12440,12443],[12545,12548],[12545,12548],[19898,19901],[19898,19901],[22513,22516],[22513,22516],[27727,27730],[27727,27730],[29554,29557],[29554,29557],[39310,39313],[39310,39313],[4985,4988],[4985,4988],[5345,5348],[5345,5348],[6332,6335],[6332,6335],[6767,6770],[6767,6770],[8947,8950],[8947,8950],[9626,9629],[9626,9629],[341,344],[341,344],[2824,2827],[2824,2827],[2849,2852],[2849,2852],[2860,2863],[2860,2863],[4424,4427],[4424,4427],[4945,4948],[4945,4948],[5369,5372],[5369,5372],[6776,6779],[6776,6779],[6801,6804],[6801,6804],[6812,6815],[6812,6815],[4014,4017],[4014,4017],[5356,5359],[5356,5359],[6404,6407],[6404,6407],[7033,7036],[7033,7036],[7168,7171],[7168,7171],[7662,7665],[7662,7665],[8712,8715],[8712,8715],[8927,8930],[8927,8930],[8940,8943],[8940,8943],[10142,10145],[10142,10145],[2875,2878],[2875,2878],[4047,4050],[4047,4050],[4498,4501],[4498,4501],[4968,4971],[4968,4971],[7095,7098],[7095,7098],[9432,9435],[9432,9435],[9489,9492],[9489,9492],[10216,10219],[10216,10219],[10992,10995],[10992,10995],[11939,11942],[11939,11942],[12488,12491],[12488,12491],[12856,12859],[12856,12859],[15975,15978],[15975,15978],[1655,1658],[1655,1658],[2671,2674],[2671,2674],[2274,2277],[2274,2277],[2852,2855],[2852,2855],[3663,3666],[3663,3666],[5308,5311],[5308,5311],[5786,5789],[5786,5789],[6805,6808],[6805,6808],[8443,8446],[8443,8446],[9752,9755],[9752,9755],[10526,10529],[10526,10529],[11178,11181],[11178,11181],[11792,11795],[11792,11795],[12592,12595],[12592,12595],[13780,13783],[13780,13783],[15541,15544],[15541,15544],[16569,16572],[16569,16572],[5122,5125],[5122,5125],[7880,7883],[7880,7883],[8998,9001],[8998,9001],[9931,9934],[9931,9934],[3864,3867],[3864,3867],[5516,5519],[5516,5519],[1593,1596],[1593,1596],[3678,3681],[3678,3681],[4852,4855],[4852,4855],[4875,4878],[4875,4878],[9626,9629],[9626,9629],[9653,9656],[9653,9656],[11005,11008],[11005,11008],[12507,12510],[12507,12510],[13274,13277],[13274,13277],[13672,13675],[13672,13675],[13740,13743],[13740,13743],[15246,15249],[15246,15249],[16985,16988],[16985,16988],[41151,41154],[41151,41154],[44799,44802],[44799,44802],[47110,47113],[47110,47113],[53601,53604],[53601,53604],[54809,54812],[54809,54812],[56621,56624],[56621,56624],[59678,59681],[59678,59681],[60284,60287],[60284,60287],[62527,62530],[62527,62530],[62639,62642],[62639,62642],[62723,62726],[62723,62726],[62821,62824],[62821,62824],[62926,62929],[62926,62929],[64111,64114],[64111,64114],[64225,64228],[64225,64228],[64334,64337],[64334,64337],[64500,64503],[64500,64503],[64569,64572],[64569,64572],[64740,64743],[64740,64743],[65590,65593],[65590,65593],[66739,66742],[66739,66742],[67395,67398],[67395,67398],[69778,69781],[69778,69781],[75407,75410],[75407,75410],[75519,75522],[75519,75522],[2008,2011],[2008,2011],[4693,4696],[4693,4696],[4979,4982],[4979,4982],[5896,5899],[5896,5899],[7095,7098],[7095,7098],[8477,8480],[8477,8480],[354,357],[354,357],[1471,1474],[1471,1474],[2158,2161],[2158,2161],[5316,5319],[5316,5319],[5379,5382],[5379,5382],[5051,5054],[5051,5054],[6375,6378],[6375,6378],[6444,6447],[6444,6447],[9408,9411],[9408,9411],[11658,11661],[11658,11661],[11812,11815],[11812,11815],[11892,11895],[11892,11895],[11962,11965],[11962,11965],[12009,12012],[12009,12012],[12371,12374],[12371,12374],[12442,12445],[12442,12445],[12487,12490],[12487,12490],[12526,12529],[12526,12529],[12583,12586],[12583,12586],[12631,12634],[12631,12634],[12722,12725],[12722,12725],[13920,13923],[13920,13923],[14044,14047],[14044,14047],[14121,14124],[14121,14124],[14203,14206],[14203,14206],[14273,14276],[14273,14276],[15167,15170],[15167,15170],[15241,15244],[15241,15244],[15846,15849],[15846,15849],[15911,15914],[15911,15914],[17249,17252],[17249,17252],[17323,17326],[17323,17326],[1252,1255],[1252,1255],[3027,3030],[3027,3030],[3080,3083],[3080,3083],[4189,4192],[4189,4192],[1385,1388],[1385,1388],[1782,1785],[1782,1785],[2070,2073],[2070,2073],[2087,2090],[2087,2090],[2704,2707],[2704,2707],[2840,2843],[2840,2843],[4584,4587],[4584,4587],[5168,5171],[5168,5171],[5304,5307],[5304,5307],[6459,6462],[6459,6462],[7663,7666],[7663,7666],[1527,1530],[1527,1530],[1761,1764],[1761,1764],[2018,2021],[2018,2021],[2155,2158],[2155,2158],[2271,2274],[2271,2274],[2448,2451],[2448,2451],[2483,2486],[2483,2486],[3342,3345],[3342,3345],[3507,3510],[3507,3510],[3922,3925],[3922,3925],[4082,4085],[4082,4085],[4556,4559],[4556,4559],[4683,4686],[4683,4686],[4718,4721],[4718,4721],[5208,5211],[5208,5211],[5243,5246],[5243,5246],[2313,2316],[2313,2316],[2496,2499],[2496,2499],[2637,2640],[2637,2640],[2702,2705],[2702,2705],[3037,3040],[3037,3040],[3227,3230],[3227,3230],[3414,3417],[3414,3417],[3723,3726],[3723,3726],[3957,3960],[3957,3960],[4363,4366],[4363,4366],[4551,4554],[4551,4554],[5030,5033],[5030,5033],[5213,5216],[5213,5216],[5542,5545],[5542,5545],[5739,5742],[5739,5742],[1162,1165],[1162,1165],[1197,1200],[1197,1200],[1565,1568],[1565,1568],[1676,1679],[1676,1679],[1896,1899],[1896,1899],[1989,1992],[1989,1992],[2144,2147],[2144,2147],[2179,2182],[2179,2182],[2712,2715],[2712,2715],[2876,2879],[2876,2879],[2911,2914],[2911,2914],[3355,3358],[3355,3358],[3390,3393],[3390,3393],[4061,4064],[4061,4064],[4075,4078],[4075,4078],[4200,4203],[4200,4203],[1332,1335],[1332,1335],[1601,1604],[1601,1604],[1972,1975],[1972,1975],[2240,2243],[2240,2243],[2655,2658],[2655,2658],[2747,2750],[2747,2750],[2897,2900],[2897,2900],[3176,3179],[3176,3179],[3582,3585],[3582,3585],[3824,3827],[3824,3827],[4482,4485],[4482,4485],[4613,4616],[4613,4616],[4997,5000],[4997,5000],[5271,5274],[5271,5274],[5363,5366],[5363,5366],[5513,5516],[5513,5516],[5885,5888],[5885,5888],[1433,1436],[1433,1436],[1669,1672],[1669,1672],[2090,2093],[2090,2093],[2501,2504],[2501,2504],[2778,2781],[2778,2781],[2894,2897],[2894,2897],[3030,3033],[3030,3033],[3297,3300],[3297,3300],[3668,3671],[3668,3671],[3761,3764],[3761,3764],[3872,3875],[3872,3875],[3907,3910],[3907,3910],[4182,4185],[4182,4185],[4275,4278],[4275,4278],[4386,4389],[4386,4389],[4421,4424],[4421,4424],[4916,4919],[4916,4919],[4951,4954],[4951,4954],[633,636],[633,636],[749,752],[749,752],[1174,1177],[1174,1177],[1209,1212],[1209,1212],[1751,1754],[1751,1754],[1844,1847],[1844,1847],[1978,1981],[1978,1981],[2013,2016],[2013,2016],[2599,2602],[2599,2602],[2692,2695],[2692,2695],[2826,2829],[2826,2829],[2861,2864],[2861,2864],[3445,3448],[3445,3448],[3689,3692],[3689,3692],[3724,3727],[3724,3727],[3888,3891],[3888,3891],[518,521],[518,521],[847,850],[847,850],[1248,1251],[1248,1251],[1576,1579],[1576,1579],[1878,1881],[1878,1881],[2207,2210],[2207,2210],[2493,2496],[2493,2496],[2678,2681],[2678,2681],[2748,2751],[2748,2751],[3072,3075],[3072,3075],[3268,3271],[3268,3271],[1027,1030],[1027,1030],[1120,1123],[1120,1123],[1272,1275],[1272,1275],[1435,1438],[1435,1438],[1638,1641],[1638,1641],[1731,1734],[1731,1734],[1864,1867],[1864,1867],[2084,2087],[2084,2087],[2687,2690],[2687,2690],[2780,2783],[2780,2783],[2913,2916],[2913,2916],[3121,3124],[3121,3124],[3564,3567],[3564,3567],[3743,3746],[3743,3746],[4166,4169],[4166,4169],[4201,4204],[4201,4204],[4419,4422],[4419,4422],[4535,4538],[4535,4538],[4728,4731],[4728,4731],[4763,4766],[4763,4766],[5368,5371],[5368,5371],[5403,5406],[5403,5406],[6881,6884],[6881,6884],[7044,7047],[7044,7047],[7547,7550],[7547,7550],[7640,7643],[7640,7643],[7769,7772],[7769,7772],[7968,7971],[7968,7971],[8234,8237],[8234,8237],[8327,8330],[8327,8330],[8645,8648],[8645,8648],[8841,8844],[8841,8844],[1219,1222],[1219,1222],[1254,1257],[1254,1257],[1548,1551],[1548,1551],[1668,1671],[1668,1671],[1869,1872],[1869,1872],[1904,1907],[1904,1907],[2306,2309],[2306,2309],[2399,2402],[2399,2402],[2552,2555],[2552,2555],[2587,2590],[2587,2590],[2930,2933],[2930,2933],[3023,3026],[3023,3026],[3180,3183],[3180,3183],[3215,3218],[3215,3218],[3696,3699],[3696,3699],[3865,3868],[3865,3868],[3900,3903],[3900,3903],[4379,4382],[4379,4382],[4414,4417],[4414,4417],[4229,4232],[4229,4232],[4617,4620],[4617,4620],[2472,2475],[2472,2475],[2759,2762],[2759,2762],[3022,3025],[3022,3025],[3307,3310],[3307,3310],[3729,3732],[3729,3732],[4010,4013],[4010,4013],[4154,4157],[4154,4157],[4339,4342],[4339,4342],[4618,4621],[4618,4621],[4762,4765],[4762,4765],[4941,4944],[4941,4944],[5228,5231],[5228,5231],[5618,5621],[5618,5621],[5924,5927],[5924,5927],[6275,6278],[6275,6278],[6558,6561],[6558,6561],[1663,1666],[1663,1666],[1825,1828],[1825,1828],[2220,2223],[2220,2223],[2393,2396],[2393,2396],[2661,2664],[2661,2664],[2777,2780],[2777,2780],[2919,2922],[2919,2922],[3105,3108],[3105,3108],[3591,3594],[3591,3594],[3785,3788],[3785,3788],[4218,4221],[4218,4221],[4377,4380],[4377,4380],[4752,4755],[4752,4755],[4919,4922],[4919,4922],[5366,5369],[5366,5369],[5535,5538],[5535,5538],[5715,5718],[5715,5718],[5808,5811],[5808,5811],[5926,5929],[5926,5929],[6122,6125],[6122,6125],[6588,6591],[6588,6591],[6802,6805],[6802,6805],[10092,10095],[10092,10095],[1241,1244],[1241,1244],[1276,1279],[1276,1279],[1640,1643],[1640,1643],[1749,1752],[1749,1752],[2121,2124],[2121,2124],[2156,2159],[2156,2159],[2648,2651],[2648,2651],[2662,2665],[2662,2665],[2697,2700],[2697,2700],[3005,3008],[3005,3008],[3137,3140],[3137,3140],[3172,3175],[3172,3175],[6724,6727],[6724,6727],[13144,13147],[13144,13147],[4608,4611],[4608,4611],[1005,1008],[1005,1008],[1121,1124],[1121,1124],[1288,1291],[1288,1291],[1369,1372],[1369,1372],[1792,1795],[1792,1795],[1885,1888],[1885,1888],[2015,2018],[2015,2018],[2050,2053],[2050,2053],[2593,2596],[2593,2596],[2628,2631],[2628,2631],[3162,3165],[3162,3165],[3322,3325],[3322,3325],[3841,3844],[3841,3844],[3940,3943],[3940,3943],[4391,4394],[4391,4394],[4426,4429],[4426,4429],[1425,1428],[1425,1428],[1613,1616],[1613,1616],[2071,2074],[2071,2074],[2266,2269],[2266,2269],[2864,2867],[2864,2867],[2956,2959],[2956,2959],[3133,3136],[3133,3136],[3318,3321],[3318,3321],[3924,3927],[3924,3927],[4092,4095],[4092,4095],[4529,4532],[4529,4532],[4694,4697],[4694,4697],[5085,5088],[5085,5088],[5245,5248],[5245,5248],[5485,5488],[5485,5488],[5577,5580],[5577,5580],[5697,5700],[5697,5700],[5871,5874],[5871,5874],[1169,1172],[1169,1172],[1204,1207],[1204,1207],[1580,1583],[1580,1583],[1677,1680],[1677,1680],[1893,1896],[1893,1896],[1986,1989],[1986,1989],[2138,2141],[2138,2141],[2173,2176],[2173,2176],[2698,2701],[2698,2701],[2790,2793],[2790,2793],[2989,2992],[2989,2992],[3024,3027],[3024,3027],[3500,3503],[3500,3503],[3632,3635],[3632,3635],[3667,3670],[3667,3670],[3952,3955],[3952,3955],[4045,4048],[4045,4048],[4192,4195],[4192,4195],[4227,4230],[4227,4230],[1639,1642],[1639,1642],[1796,1799],[1796,1799],[1969,1972],[1969,1972],[2343,2346],[2343,2346],[2508,2511],[2508,2511],[2813,2816],[2813,2816],[2940,2943],[2940,2943],[3148,3151],[3148,3151],[3547,3550],[3547,3550],[3674,3677],[3674,3677],[3918,3921],[3918,3921],[4316,4319],[4316,4319],[4453,4456],[4453,4456],[4648,4651],[4648,4651],[5108,5111],[5108,5111],[5324,5327],[5324,5327],[5906,5909],[5906,5909],[6075,6078],[6075,6078],[630,633],[630,633],[723,726],[723,726],[873,876],[873,876],[908,911],[908,911],[1234,1237],[1234,1237],[1327,1330],[1327,1330],[1461,1464],[1461,1464],[1496,1499],[1496,1499],[1939,1942],[1939,1942],[2032,2035],[2032,2035],[2197,2200],[2197,2200],[2232,2235],[2232,2235],[2714,2717],[2714,2717],[2807,2810],[2807,2810],[2962,2965],[2962,2965],[2997,3000],[2997,3000],[3432,3435],[3432,3435],[3548,3551],[3548,3551],[3718,3721],[3718,3721],[3753,3756],[3753,3756],[4320,4323],[4320,4323],[4355,4358],[4355,4358],[1104,1107],[1104,1107],[1139,1142],[1139,1142],[1358,1361],[1358,1361],[1474,1477],[1474,1477],[1638,1641],[1638,1641],[1673,1676],[1673,1676],[1438,1441],[1438,1441],[1594,1597],[1594,1597],[1999,2002],[1999,2002],[2175,2178],[2175,2178],[2555,2558],[2555,2558],[2720,2723],[2720,2723],[3089,3092],[3089,3092],[3221,3224],[3221,3224],[3423,3426],[3423,3426],[3703,3706],[3703,3706],[3889,3892],[3889,3892],[3938,3941],[3938,3941],[4109,4112],[4109,4112],[4347,4350],[4347,4350],[4799,4802],[4799,4802],[4956,4959],[4956,4959],[5148,5151],[5148,5151],[5570,5573],[5570,5573],[5840,5843],[5840,5843],[5922,5925],[5922,5925],[1060,1063],[1060,1063],[1152,1155],[1152,1155],[1364,1367],[1364,1367],[1544,1547],[1544,1547],[2031,2034],[2031,2034],[2235,2238],[2235,2238],[2731,2734],[2731,2734],[2766,2769],[2766,2769],[3173,3176],[3173,3176],[3208,3211],[3208,3211],[3419,3422],[3419,3422],[3539,3542],[3539,3542],[3736,3739],[3736,3739],[3771,3774],[3771,3774],[4309,4312],[4309,4312],[4344,4347],[4344,4347],[2404,2407],[2404,2407],[4094,4097],[4094,4097],[4816,4819],[4816,4819],[6386,6389],[6386,6389],[6945,6948],[6945,6948],[8122,8125],[8122,8125],[2755,2758],[2755,2758],[4576,4579],[4576,4579],[4971,4974],[4971,4974],[5335,5338],[5335,5338],[1658,1661],[1658,1661],[1859,1862],[1859,1862],[2034,2037],[2034,2037],[2097,2100],[2097,2100],[2333,2336],[2333,2336],[2534,2537],[2534,2537],[2708,2711],[2708,2711],[2927,2930],[2927,2930],[3127,3130],[3127,3130],[3499,3502],[3499,3502],[3707,3710],[3707,3710],[4051,4054],[4051,4054],[4259,4262],[4259,4262],[4620,4623],[4620,4623],[4821,4824],[4821,4824],[9054,9057],[9054,9057],[9395,9398],[9395,9398],[10154,10157],[10154,10157],[10393,10396],[10393,10396],[10468,10471],[10468,10471],[1190,1193],[1190,1193],[1225,1228],[1225,1228],[1636,1639],[1636,1639],[1671,1674],[1671,1674],[2064,2067],[2064,2067],[2099,2102],[2099,2102],[2503,2506],[2503,2506],[2538,2541],[2538,2541],[2776,2779],[2776,2779],[2896,2899],[2896,2899],[3071,3074],[3071,3074],[3106,3109],[3106,3109],[3519,3522],[3519,3522],[3612,3615],[3612,3615],[3742,3745],[3742,3745],[3777,3780],[3777,3780],[1597,1600],[1597,1600],[850,853],[850,853],[885,888],[885,888],[1404,1407],[1404,1407],[1439,1442],[1439,1442],[1763,1766],[1763,1766],[1897,1900],[1897,1900],[1932,1935],[1932,1935],[2326,2329],[2326,2329],[2460,2463],[2460,2463],[2495,2498],[2495,2498],[2957,2960],[2957,2960],[2992,2995],[2992,2995],[2525,2528],[2525,2528],[2807,2810],[2807,2810],[3086,3089],[3086,3089],[3358,3361],[3358,3361],[3814,3817],[3814,3817],[4103,4106],[4103,4106],[4588,4591],[4588,4591],[4879,4882],[4879,4882],[5181,5184],[5181,5184],[5471,5474],[5471,5474],[5932,5935],[5932,5935],[6011,6014],[6011,6014],[6285,6288],[6285,6288],[1817,1820],[1817,1820],[1973,1976],[1973,1976],[2386,2389],[2386,2389],[2545,2548],[2545,2548],[2886,2889],[2886,2889],[3050,3053],[3050,3053],[3332,3335],[3332,3335],[3424,3427],[3424,3427],[3542,3545],[3542,3545],[3712,3715],[3712,3715],[4139,4142],[4139,4142],[4232,4235],[4232,4235],[4366,4369],[4366,4369],[4559,4562],[4559,4562],[5067,5070],[5067,5070],[5288,5291],[5288,5291],[5794,5797],[5794,5797],[6009,6012],[6009,6012],[6366,6369],[6366,6369],[6459,6462],[6459,6462],[6599,6602],[6599,6602],[6849,6852],[6849,6852],[1757,1760],[1757,1760],[2010,2013],[2010,2013],[2286,2289],[2286,2289],[2554,2557],[2554,2557],[2813,2816],[2813,2816],[3066,3069],[3066,3069],[3611,3614],[3611,3614],[3868,3871],[3868,3871],[4251,4254],[4251,4254],[4541,4544],[4541,4544],[4863,4866],[4863,4866],[4987,4990],[4987,4990],[5264,5267],[5264,5267],[1008,1011],[1008,1011],[1124,1127],[1124,1127],[1281,1284],[1281,1284],[1316,1319],[1316,1319],[1746,1749],[1746,1749],[1838,1841],[1838,1841],[1992,1995],[1992,1995],[2027,2030],[2027,2030],[2561,2564],[2561,2564],[2596,2599],[2596,2599],[3015,3018],[3015,3018],[3050,3053],[3050,3053],[3443,3446],[3443,3446],[3478,3481],[3478,3481],[3679,3682],[3679,3682],[3772,3775],[3772,3775],[3921,3924],[3921,3924],[3956,3959],[3956,3959],[4415,4418],[4415,4418],[4561,4564],[4561,4564],[4596,4599],[4596,4599],[786,789],[786,789],[821,824],[821,824],[1015,1018],[1015,1018],[1108,1111],[1108,1111],[1256,1259],[1256,1259],[1291,1294],[1291,1294],[1754,1757],[1754,1757],[1888,1891],[1888,1891],[1923,1926],[1923,1926],[2213,2216],[2213,2216],[2329,2332],[2329,2332],[2486,2489],[2486,2489],[2521,2524],[2521,2524],[3114,3117],[3114,3117],[3149,3152],[3149,3152],[3566,3569],[3566,3569],[3601,3604],[3601,3604],[1369,1372],[1369,1372],[1404,1407],[1404,1407],[1860,1863],[1860,1863],[1895,1898],[1895,1898],[2347,2350],[2347,2350],[2382,2385],[2382,2385],[1046,1049],[1046,1049],[1138,1141],[1138,1141],[1315,1318],[1315,1318],[1350,1353],[1350,1353],[1700,1703],[1700,1703],[1793,1796],[1793,1796],[1960,1963],[1960,1963],[1995,1998],[1995,1998],[2437,2440],[2437,2440],[2530,2533],[2530,2533],[2670,2673],[2670,2673],[2705,2708],[2705,2708],[3343,3346],[3343,3346],[3378,3381],[3378,3381],[3799,3802],[3799,3802],[3917,3920],[3917,3920],[3413,3416],[3413,3416],[3661,3664],[3661,3664],[3982,3985],[3982,3985],[4207,4210],[4207,4210],[4534,4537],[4534,4537],[4759,4762],[4759,4762],[5068,5071],[5068,5071],[5304,5307],[5304,5307],[5572,5575],[5572,5575],[5806,5809],[5806,5809],[6187,6190],[6187,6190],[6427,6430],[6427,6430],[6764,6767],[6764,6767],[6956,6959],[6956,6959],[7211,7214],[7211,7214],[7319,7322],[7319,7322],[7369,7372],[7369,7372],[1511,1514],[1511,1514],[1673,1676],[1673,1676],[2061,2064],[2061,2064],[2231,2234],[2231,2234],[2490,2493],[2490,2493],[2583,2586],[2583,2586],[2706,2709],[2706,2709],[3027,3030],[3027,3030],[3507,3510],[3507,3510],[3847,3850],[3847,3850],[4128,4131],[4128,4131],[4244,4247],[4244,4247],[4390,4393],[4390,4393],[4570,4573],[4570,4573],[4958,4961],[4958,4961],[5090,5093],[5090,5093],[5297,5300],[5297,5300],[5564,5567],[5564,5567],[5680,5683],[5680,5683],[5851,5854],[5851,5854],[6041,6044],[6041,6044],[6968,6971],[6968,6971],[7039,7042],[7039,7042],[1785,1788],[1785,1788],[4756,4759],[4756,4759],[1151,1154],[1151,1154],[2410,2413],[2410,2413],[3339,3342],[3339,3342],[1577,1580],[1577,1580],[2135,2138],[2135,2138],[2894,2897],[2894,2897],[5729,5732],[5729,5732],[6269,6272],[6269,6272],[9492,9495],[9492,9495],[4336,4339],[4336,4339],[4381,4384],[4381,4384],[4435,4438],[4435,4438],[4491,4494],[4491,4494],[5058,5061],[5058,5061],[5097,5100],[5097,5100],[5153,5156],[5153,5156],[2507,2510],[2507,2510],[2640,2643],[2640,2643],[2795,2798],[2795,2798],[2938,2941],[2938,2941],[2971,2974],[2971,2974],[3020,3023],[3020,3023],[3895,3898],[3895,3898],[3943,3946],[3943,3946],[4106,4109],[4106,4109],[4186,4189],[4186,4189],[4269,4272],[4269,4272],[4364,4367],[4364,4367],[4562,4565],[4562,4565],[4671,4674],[4671,4674],[4751,4754],[4751,4754],[4834,4837],[4834,4837],[1852,1855],[1852,1855],[3133,3136],[3133,3136],[6678,6681],[6678,6681],[7577,7580],[7577,7580],[8678,8681],[8678,8681],[10132,10135],[10132,10135],[4190,4193],[4190,4193],[6556,6559],[6556,6559],[6720,6723],[6720,6723],[7229,7232],[7229,7232],[8340,8343],[8340,8343],[739,742],[739,742],[7855,7858],[7855,7858],[3387,3390],[3387,3390],[6816,6819],[6816,6819],[9103,9106],[9103,9106],[2652,2655],[2652,2655],[2945,2948],[2945,2948],[4222,4225],[4222,4225],[4190,4193],[4190,4193],[4249,4252],[4249,4252],[4286,4289],[4286,4289],[4377,4380],[4377,4380],[4684,4687],[4684,4687],[5260,5263],[5260,5263],[5956,5959],[5956,5959],[6773,6776],[6773,6776],[6848,6851],[6848,6851],[7392,7395],[7392,7395],[7951,7954],[7951,7954],[9087,9090],[9087,9090],[9161,9164],[9161,9164],[12691,12694],[12691,12694],[13722,13725],[13722,13725],[14780,14783],[14780,14783],[14842,14845],[14842,14845],[14904,14907],[14904,14907],[2382,2385],[2382,2385],[3096,3099],[3096,3099],[3604,3607],[3604,3607],[4247,4250],[4247,4250],[4923,4926],[4923,4926],[5131,5134],[5131,5134],[5670,5673],[5670,5673],[6543,6546],[6543,6546],[7567,7570],[7567,7570],[7627,7630],[7627,7630],[2127,2130],[2127,2130],[2166,2169],[2166,2169],[2176,2179],[2176,2179],[2243,2246],[2243,2246],[2253,2256],[2253,2256],[2321,2324],[2321,2324],[2331,2334],[2331,2334],[2400,2403],[2400,2403],[2410,2413],[2410,2413],[2509,2512],[2509,2512],[3401,3404],[3401,3404],[4209,4212],[4209,4212],[4667,4670],[4667,4670],[8467,8470],[8467,8470],[8689,8692],[8689,8692],[8704,8707],[8704,8707],[9592,9595],[9592,9595],[9628,9631],[9628,9631],[10218,10221],[10218,10221],[10233,10236],[10233,10236],[10247,10250],[10247,10250],[13206,13209],[13206,13209],[13567,13570],[13567,13570],[13582,13585],[13582,13585],[13596,13599],[13596,13599],[14268,14271],[14268,14271],[15205,15208],[15205,15208],[15220,15223],[15220,15223],[15502,15505],[15502,15505],[15772,15775],[15772,15775],[16192,16195],[16192,16195],[16207,16210],[16207,16210],[16483,16486],[16483,16486],[18208,18211],[18208,18211],[18614,18617],[18614,18617],[18629,18632],[18629,18632],[18823,18826],[18823,18826],[19094,19097],[19094,19097],[19437,19440],[19437,19440],[19452,19455],[19452,19455],[19646,19649],[19646,19649],[19922,19925],[19922,19925],[20132,20135],[20132,20135],[20147,20150],[20147,20150],[20327,20330],[20327,20330],[20514,20517],[20514,20517],[21077,21080],[21077,21080],[21092,21095],[21092,21095],[21286,21289],[21286,21289],[22280,22283],[22280,22283],[22423,22426],[22423,22426],[22438,22441],[22438,22441],[22639,22642],[22639,22642],[23059,23062],[23059,23062],[23170,23173],[23170,23173],[23185,23188],[23185,23188],[23365,23368],[23365,23368],[23562,23565],[23562,23565],[23785,23788],[23785,23788],[23800,23803],[23800,23803],[24006,24009],[24006,24009],[24257,24260],[24257,24260],[24512,24515],[24512,24515],[24527,24530],[24527,24530],[24877,24880],[24877,24880],[25450,25453],[25450,25453],[26046,26049],[26046,26049],[26061,26064],[26061,26064],[26074,26077],[26074,26077],[26408,26411],[26408,26411],[27564,27567],[27564,27567],[27579,27582],[27579,27582],[27788,27791],[27788,27791],[27864,27867],[27864,27867],[30791,30794],[30791,30794],[31137,31140],[31137,31140],[31152,31155],[31152,31155],[31346,31349],[31346,31349],[31599,31602],[31599,31602],[32494,32497],[32494,32497],[32509,32512],[32509,32512],[32703,32706],[32703,32706],[34274,34277],[34274,34277],[34842,34845],[34842,34845],[34933,34936],[34933,34936],[35209,35212],[35209,35212],[35224,35227],[35224,35227],[35718,35721],[35718,35721],[36472,36475],[36472,36475],[36718,36721],[36718,36721],[36998,37001],[36998,37001],[37013,37016],[37013,37016],[37655,37658],[37655,37658],[38236,38239],[38236,38239],[38251,38254],[38251,38254],[38709,38712],[38709,38712],[38785,38788],[38785,38788],[39518,39521],[39518,39521],[39594,39597],[39594,39597],[40392,40395],[40392,40395],[40468,40471],[40468,40471],[40960,40963],[40960,40963],[41224,41227],[41224,41227],[41239,41242],[41239,41242],[41733,41736],[41733,41736],[42337,42340],[42337,42340],[42352,42355],[42352,42355],[42897,42900],[42897,42900],[42973,42976],[42973,42976],[43260,43263],[43260,43263],[43567,43570],[43567,43570],[43582,43585],[43582,43585],[44062,44065],[44062,44065],[44138,44141],[44138,44141],[44502,44505],[44502,44505],[45076,45079],[45076,45079],[45091,45094],[45091,45094],[45390,45393],[45390,45393],[45700,45703],[45700,45703],[46325,46328],[46325,46328],[46340,46343],[46340,46343],[46639,46642],[46639,46642],[47065,47068],[47065,47068],[47429,47432],[47429,47432],[47444,47447],[47444,47447],[47736,47739],[47736,47739],[47812,47815],[47812,47815],[48078,48081],[48078,48081],[48486,48489],[48486,48489],[48501,48504],[48501,48504],[48514,48517],[48514,48517],[49183,49186],[49183,49186],[49259,49262],[49259,49262],[49537,49540],[49537,49540],[49769,49772],[49769,49772],[49784,49787],[49784,49787],[50337,50340],[50337,50340],[50637,50640],[50637,50640],[50878,50881],[50878,50881],[50893,50896],[50893,50896],[51528,51531],[51528,51531],[51604,51607],[51604,51607],[51939,51942],[51939,51942],[52228,52231],[52228,52231],[52243,52246],[52243,52246],[52437,52440],[52437,52440],[52881,52884],[52881,52884],[53152,53155],[53152,53155],[53167,53170],[53167,53170],[53347,53350],[53347,53350],[53608,53611],[53608,53611],[54025,54028],[54025,54028],[54040,54043],[54040,54043],[54318,54321],[54318,54321],[55087,55090],[55087,55090],[55363,55366],[55363,55366],[55378,55381],[55378,55381],[55558,55561],[55558,55561],[55799,55802],[55799,55802],[56055,56058],[56055,56058],[56070,56073],[56070,56073],[56250,56253],[56250,56253],[56623,56626],[56623,56626],[56951,56954],[56951,56954],[56966,56969],[56966,56969],[57146,57149],[57146,57149],[58236,58239],[58236,58239],[58979,58982],[58979,58982],[58994,58997],[58994,58997],[59174,59177],[59174,59177],[62492,62495],[62492,62495],[62916,62919],[62916,62919],[62931,62934],[62931,62934],[63111,63114],[63111,63114],[64534,64537],[64534,64537],[64765,64768],[64765,64768],[65665,65668],[65665,65668],[66165,66168],[66165,66168],[66180,66183],[66180,66183],[66360,66363],[66360,66363],[66908,66911],[66908,66911],[67337,67340],[67337,67340],[67352,67355],[67352,67355],[67532,67535],[67532,67535],[68143,68146],[68143,68146],[68253,68256],[68253,68256],[68268,68271],[68268,68271],[68455,68458],[68455,68458],[68628,68631],[68628,68631],[68739,68742],[68739,68742],[68754,68757],[68754,68757],[68939,68942],[68939,68942],[69552,69555],[69552,69555],[69628,69631],[69628,69631],[70407,70410],[70407,70410],[70726,70729],[70726,70729],[71209,71212],[71209,71212],[71224,71227],[71224,71227],[71404,71407],[71404,71407],[73297,73300],[73297,73300],[73312,73315],[73312,73315],[73325,73328],[73325,73328],[73577,73580],[73577,73580],[74063,74066],[74063,74066],[74340,74343],[74340,74343],[74355,74358],[74355,74358],[74535,74538],[74535,74538],[74791,74794],[74791,74794],[75086,75089],[75086,75089],[75101,75104],[75101,75104],[75281,75284],[75281,75284],[75864,75867],[75864,75867],[75990,75993],[75990,75993],[76762,76765],[76762,76765],[77197,77200],[77197,77200],[77212,77215],[77212,77215],[77479,77482],[77479,77482],[77946,77949],[77946,77949],[78248,78251],[78248,78251],[78263,78266],[78263,78266],[78430,78433],[78430,78433],[78822,78825],[78822,78825],[79195,79198],[79195,79198],[79210,79213],[79210,79213],[79390,79393],[79390,79393],[79606,79609],[79606,79609],[80079,80082],[80079,80082],[80094,80097],[80094,80097],[80261,80264],[80261,80264],[80878,80881],[80878,80881],[81365,81368],[81365,81368],[81380,81383],[81380,81383],[81951,81954],[81951,81954],[82027,82030],[82027,82030],[83210,83213],[83210,83213],[84361,84364],[84361,84364],[85241,85244],[85241,85244],[85974,85977],[85974,85977],[86177,86180],[86177,86180],[86974,86977],[86974,86977],[87239,87242],[87239,87242],[87570,87573],[87570,87573],[87585,87588],[87585,87588],[87852,87855],[87852,87855],[88086,88089],[88086,88089],[88412,88415],[88412,88415],[88427,88430],[88427,88430],[88949,88952],[88949,88952],[89724,89727],[89724,89727],[89800,89803],[89800,89803],[90703,90706],[90703,90706],[90779,90782],[90779,90782],[91084,91087],[91084,91087],[91358,91361],[91358,91361],[91373,91376],[91373,91376],[92067,92070],[92067,92070],[92143,92146],[92143,92146],[92580,92583],[92580,92583],[93123,93126],[93123,93126],[93138,93141],[93138,93141],[93730,93733],[93730,93733],[93806,93809],[93806,93809],[94099,94102],[94099,94102],[94358,94361],[94358,94361],[94373,94376],[94373,94376],[94828,94831],[94828,94831],[94904,94907],[94904,94907],[3739,3742],[3739,3742],[1364,1367],[1364,1367],[1374,1377],[1374,1377],[1436,1439],[1436,1439],[1446,1449],[1446,1449],[1509,1512],[1509,1512],[1519,1522],[1519,1522],[1583,1586],[1583,1586],[1593,1596],[1593,1596],[1896,1899],[1896,1899],[5073,5076],[5073,5076],[8018,8021],[8018,8021],[11006,11009],[11006,11009],[1263,1266],[1263,1266],[1302,1305],[1302,1305],[1312,1315],[1312,1315],[1379,1382],[1379,1382],[1389,1392],[1389,1392],[1457,1460],[1457,1460],[1467,1470],[1467,1470],[1536,1539],[1536,1539],[1546,1549],[1546,1549],[1645,1648],[1645,1648],[2470,2473],[2470,2473],[3597,3600],[3597,3600],[4127,4130],[4127,4130],[4248,4251],[4248,4251],[5537,5540],[5537,5540],[6162,6165],[6162,6165],[6283,6286],[6283,6286],[1417,1420],[1417,1420],[1456,1459],[1456,1459],[1466,1469],[1466,1469],[1533,1536],[1533,1536],[1543,1546],[1543,1546],[1611,1614],[1611,1614],[1621,1624],[1621,1624],[1690,1693],[1690,1693],[1700,1703],[1700,1703],[1799,1802],[1799,1802],[2443,2446],[2443,2446],[3748,3751],[3748,3751],[4533,4536],[4533,4536],[5369,5372],[5369,5372],[6111,6114],[6111,6114],[7518,7521],[7518,7521],[8479,8482],[8479,8482],[9245,9248],[9245,9248],[10093,10096],[10093,10096],[11068,11071],[11068,11071],[11890,11893],[11890,11893],[13256,13259],[13256,13259],[14412,14415],[14412,14415],[15690,15693],[15690,15693],[16957,16960],[16957,16960],[17985,17988],[17985,17988],[19398,19401],[19398,19401],[20364,20367],[20364,20367],[21299,21302],[21299,21302],[22370,22373],[22370,22373],[23971,23974],[23971,23974],[24699,24702],[24699,24702],[26166,26169],[26166,26169],[1069,1072],[1069,1072],[1108,1111],[1108,1111],[1118,1121],[1118,1121],[1185,1188],[1185,1188],[1195,1198],[1195,1198],[1263,1266],[1263,1266],[1273,1276],[1273,1276],[1342,1345],[1342,1345],[1352,1355],[1352,1355],[14973,14976],[14973,14976],[15317,15320],[15317,15320],[16224,16227],[16224,16227],[16462,16465],[16462,16465],[17230,17233],[17230,17233],[17600,17603],[17600,17603],[18532,18535],[18532,18535],[18887,18890],[18887,18890],[2631,2634],[2631,2634],[2878,2881],[2878,2881],[3889,3892],[3889,3892],[5350,5353],[5350,5353],[6402,6405],[6402,6405],[7139,7142],[7139,7142],[8910,8913],[8910,8913],[10460,10463],[10460,10463],[11560,11563],[11560,11563],[13522,13525],[13522,13525],[1784,1787],[1784,1787],[2706,2709],[2706,2709],[3601,3604],[3601,3604],[4453,4456],[4453,4456],[913,916],[913,916],[1442,1445],[1442,1445],[1453,1456],[1453,1456],[2009,2012],[2009,2012],[7147,7150],[7147,7150],[7243,7246],[7243,7246],[7341,7344],[7341,7344],[7455,7458],[7455,7458],[7569,7572],[7569,7572],[1212,1215],[1212,1215],[1930,1933],[1930,1933],[3084,3087],[3084,3087],[2533,2536],[2533,2536],[2705,2708],[2705,2708],[2823,2826],[2823,2826],[3005,3008],[3005,3008],[3190,3193],[3190,3193],[3393,3396],[3393,3396],[3741,3744],[3741,3744],[3949,3952],[3949,3952],[4077,4080],[4077,4080],[4265,4268],[4265,4268],[4922,4925],[4922,4925],[5331,5334],[5331,5334],[5504,5507],[5504,5507],[5786,5789],[5786,5789],[6158,6161],[6158,6161],[6974,6977],[6974,6977],[1695,1698],[1695,1698],[3552,3555],[3552,3555],[4048,4051],[4048,4051],[4751,4754],[4751,4754],[4975,4978],[4975,4978],[4989,4992],[4989,4992],[5904,5907],[5904,5907],[5927,5930],[5927,5930],[6063,6066],[6063,6066],[6936,6939],[6936,6939],[6964,6967],[6964,6967],[7709,7712],[7709,7712],[11872,11875],[11872,11875],[11891,11894],[11891,11894],[1029,1032],[1029,1032],[1756,1759],[1756,1759],[2732,2735],[2732,2735],[2814,2817],[2814,2817],[2844,2847],[2844,2847],[2040,2043],[2040,2043],[3225,3228],[3225,3228],[4206,4209],[4206,4209],[5519,5522],[5519,5522],[1031,1034],[1031,1034],[2662,2665],[2662,2665],[1347,1350],[1347,1350],[4964,4967],[4964,4967],[5555,5558],[5555,5558],[6046,6049],[6046,6049],[6506,6509],[6506,6509],[7092,7095],[7092,7095],[7510,7513],[7510,7513],[14266,14269],[14266,14269],[14546,14549],[14546,14549],[690,693],[690,693],[694,697],[694,697],[684,687],[684,687],[667,670],[667,670],[1725,1728],[1725,1728],[3680,3683],[3680,3683],[4142,4145],[4142,4145],[4975,4978],[4975,4978],[5055,5058],[5055,5058],[5135,5138],[5135,5138],[5502,5505],[5502,5505],[5572,5575],[5572,5575],[397,400],[397,400],[446,449],[446,449],[517,520],[517,520],[2623,2626],[2623,2626],[5217,5220],[5217,5220],[2560,2563],[2560,2563],[2599,2602],[2599,2602],[2617,2620],[2617,2620],[2749,2752],[2749,2752],[2768,2771],[2768,2771],[2949,2952],[2949,2952],[2978,2981],[2978,2981],[809,812],[809,812],[858,861],[858,861],[929,932],[929,932],[2047,2050],[2047,2050],[1411,1414],[1411,1414],[5228,5231],[5228,5231],[5273,5276],[5273,5276],[5352,5355],[5352,5355],[1864,1867],[1864,1867],[6953,6956],[6953,6956],[6998,7001],[6998,7001],[7368,7371],[7368,7371],[11525,11528],[11525,11528],[1882,1885],[1882,1885],[2816,2819],[2816,2819],[2916,2919],[2916,2919],[3029,3032],[3029,3032],[3907,3910],[3907,3910],[4007,4010],[4007,4010],[4117,4120],[4117,4120],[4237,4240],[4237,4240],[4355,4358],[4355,4358],[4522,4525],[4522,4525],[6760,6763],[6760,6763],[6890,6893],[6890,6893],[9229,9232],[9229,9232],[9329,9332],[9329,9332],[9439,9442],[9439,9442],[9559,9562],[9559,9562],[9677,9680],[9677,9680],[9844,9847],[9844,9847],[10175,10178],[10175,10178],[10275,10278],[10275,10278],[10385,10388],[10385,10388],[10505,10508],[10505,10508],[10623,10626],[10623,10626],[11168,11171],[11168,11171],[11930,11933],[11930,11933],[12105,12108],[12105,12108],[12117,12120],[12117,12120],[13167,13170],[13167,13170],[13299,13302],[13299,13302],[13557,13560],[13557,13560],[2550,2553],[2550,2553],[2958,2961],[2958,2961],[3165,3168],[3165,3168],[3265,3268],[3265,3268],[3590,3593],[3590,3593],[3797,3800],[3797,3800],[3897,3900],[3897,3900],[696,699],[696,699],[689,692],[689,692],[1162,1165],[1162,1165],[1312,1315],[1312,1315],[7485,7488],[7485,7488],[7673,7676],[7673,7676],[12372,12375],[12372,12375],[23137,23140],[23137,23140],[25517,25520],[25517,25520],[27532,27535],[27532,27535],[31341,31344],[31341,31344],[33684,33687],[33684,33687],[35780,35783],[35780,35783],[38211,38214],[38211,38214],[674,677],[674,677],[667,670],[667,670],[3006,3009],[3006,3009],[455,458],[455,458],[504,507],[504,507],[575,578],[575,578],[1392,1395],[1392,1395],[1463,1466],[1463,1466],[788,791],[788,791],[993,996],[993,996],[676,679],[676,679],[5064,5067],[5064,5067],[6969,6972],[6969,6972],[7198,7201],[7198,7201],[8197,8200],[8197,8200],[9382,9385],[9382,9385],[9397,9400],[9397,9400],[9502,9505],[9502,9505],[9584,9587],[9584,9587],[9671,9674],[9671,9674],[10451,10454],[10451,10454],[10637,10640],[10637,10640],[10911,10914],[10911,10914],[11042,11045],[11042,11045],[11410,11413],[11410,11413],[11495,11498],[11495,11498],[11797,11800],[11797,11800],[11880,11883],[11880,11883],[737,740],[737,740],[4406,4409],[4406,4409],[4479,4482],[4479,4482],[4718,4721],[4718,4721],[8107,8110],[8107,8110],[8458,8461],[8458,8461],[971,974],[971,974],[1041,1044],[1041,1044],[973,976],[973,976],[1902,1905],[1902,1905],[2781,2784],[2781,2784],[4358,4361],[4358,4361],[4861,4864],[4861,4864],[5190,5193],[5190,5193],[5644,5647],[5644,5647],[6029,6032],[6029,6032],[6478,6481],[6478,6481],[670,673],[670,673],[929,932],[929,932],[15393,15396],[15393,15396],[16124,16127],[16124,16127],[16545,16548],[16545,16548],[16722,16725],[16722,16725],[16877,16880],[16877,16880],[17045,17048],[17045,17048],[17195,17198],[17195,17198],[17733,17736],[17733,17736],[18078,18081],[18078,18081],[18093,18096],[18093,18096],[18326,18329],[18326,18329],[18932,18935],[18932,18935],[19157,19160],[19157,19160],[19317,19320],[19317,19320],[20438,20441],[20438,20441],[20587,20590],[20587,20590],[20659,20662],[20659,20662],[20977,20980],[20977,20980],[21085,21088],[21085,21088],[461,464],[461,464],[510,513],[510,513],[581,584],[581,584],[1464,1467],[1464,1467],[1726,1729],[1726,1729],[1772,1775],[1772,1775],[1814,1817],[1814,1817],[2291,2294],[2291,2294],[2493,2496],[2493,2496],[2557,2560],[2557,2560],[3322,3325],[3322,3325],[3386,3389],[3386,3389],[4357,4360],[4357,4360],[4416,4419],[4416,4419],[4440,4443],[4440,4443],[5334,5337],[5334,5337],[1100,1103],[1100,1103],[2306,2309],[2306,2309],[3329,3332],[3329,3332],[4282,4285],[4282,4285],[3844,3847],[3844,3847],[4334,4337],[4334,4337],[4674,4677],[4674,4677],[5092,5095],[5092,5095],[1507,1510],[1507,1510],[771,774],[771,774],[3042,3045],[3042,3045],[3241,3244],[3241,3244],[725,728],[725,728],[684,687],[684,687],[1468,1471],[1468,1471],[2131,2134],[2131,2134],[2823,2826],[2823,2826],[4978,4981],[4978,4981],[5485,5488],[5485,5488],[5796,5799],[5796,5799],[6400,6403],[6400,6403],[6968,6971],[6968,6971],[15609,15612],[15609,15612],[15669,15672],[15669,15672],[2479,2482],[2479,2482],[828,831],[828,831],[1507,1510],[1507,1510],[2154,2157],[2154,2157],[3096,3099],[3096,3099],[4059,4062],[4059,4062],[4676,4679],[4676,4679],[5360,5363],[5360,5363],[6223,6226],[6223,6226],[1226,1229],[1226,1229],[2274,2277],[2274,2277],[7331,7334],[7331,7334],[2213,2216],[2213,2216],[2707,2710],[2707,2710],[3234,3237],[3234,3237],[4060,4063],[4060,4063],[4630,4633],[4630,4633],[5068,5071],[5068,5071],[5649,5652],[5649,5652],[6140,6143],[6140,6143],[11222,11225],[11222,11225],[11654,11657],[11654,11657],[12200,12203],[12200,12203],[12718,12721],[12718,12721],[13656,13659],[13656,13659],[14100,14103],[14100,14103],[14204,14207],[14204,14207],[14745,14748],[14745,14748],[15234,15237],[15234,15237],[18777,18780],[18777,18780],[19379,19382],[19379,19382],[274,277],[274,277],[1486,1489],[1486,1489],[1509,1512],[1509,1512],[4970,4973],[4970,4973],[5234,5237],[5234,5237],[5501,5504],[5501,5504],[6644,6647],[6644,6647],[6703,6706],[6703,6706],[6923,6926],[6923,6926],[3005,3008],[3005,3008],[3038,3041],[3038,3041],[3831,3834],[3831,3834],[3842,3845],[3842,3845],[25948,25951],[25948,25951],[25976,25979],[25976,25979],[29974,29977],[29974,29977],[30052,30055],[30052,30055],[30188,30191],[30188,30191],[30266,30269],[30266,30269],[30329,30332],[30329,30332],[30402,30405],[30402,30405],[30475,30478],[30475,30478],[30549,30552],[30549,30552],[31043,31046],[31043,31046],[31114,31117],[31114,31117],[31917,31920],[31917,31920],[31999,32002],[31999,32002],[32250,32253],[32250,32253],[33923,33926],[33923,33926],[33997,34000],[33997,34000],[34445,34448],[34445,34448],[34509,34512],[34509,34512],[34580,34583],[34580,34583],[34820,34823],[34820,34823],[35049,35052],[35049,35052],[35267,35270],[35267,35270],[35435,35438],[35435,35438],[36336,36339],[36336,36339],[36397,36400],[36397,36400],[37447,37450],[37447,37450],[38048,38051],[38048,38051],[38751,38754],[38751,38754],[39648,39651],[39648,39651],[40382,40385],[40382,40385],[40942,40945],[40942,40945],[40980,40983],[40980,40983],[41006,41009],[41006,41009],[41043,41046],[41043,41046],[41073,41076],[41073,41076],[41473,41476],[41473,41476],[41531,41534],[41531,41534],[41593,41596],[41593,41596],[47188,47191],[47188,47191],[47226,47229],[47226,47229],[47295,47298],[47295,47298],[915,918],[915,918],[1003,1006],[1003,1006],[1017,1020],[1017,1020],[1249,1252],[1249,1252],[1262,1265],[1262,1265],[8021,8024],[8021,8024],[8114,8117],[8114,8117],[2679,2682],[2679,2682],[4605,4608],[4605,4608],[7098,7101],[7098,7101],[8584,8587],[8584,8587],[2700,2703],[2700,2703],[4584,4587],[4584,4587],[2274,2277],[2274,2277],[2542,2545],[2542,2545],[3264,3267],[3264,3267],[3532,3535],[3532,3535],[467,470],[467,470],[2216,2219],[2216,2219],[2227,2230],[2227,2230],[2613,2616],[2613,2616],[2926,2929],[2926,2929],[3922,3925],[3922,3925],[4131,4134],[4131,4134],[4142,4145],[4142,4145],[4423,4426],[4423,4426],[4781,4784],[4781,4784],[5396,5399],[5396,5399],[5407,5410],[5407,5410],[5688,5691],[5688,5691],[5960,5963],[5960,5963],[6392,6395],[6392,6395],[6403,6406],[6403,6406],[6684,6687],[6684,6687],[6956,6959],[6956,6959],[7629,7632],[7629,7632],[8056,8059],[8056,8059],[8342,8345],[8342,8345],[8400,8403],[8400,8403],[8770,8773],[8770,8773],[8908,8911],[8908,8911],[9198,9201],[9198,9201],[9348,9351],[9348,9351],[9715,9718],[9715,9718],[10037,10040],[10037,10040],[10322,10325],[10322,10325],[10678,10681],[10678,10681],[10689,10692],[10689,10692],[10970,10973],[10970,10973],[11240,11243],[11240,11243],[11527,11530],[11527,11530],[11767,11770],[11767,11770],[12582,12585],[12582,12585],[14380,14383],[14380,14383],[14391,14394],[14391,14394],[14672,14675],[14672,14675],[14941,14944],[14941,14944],[2091,2094],[2091,2094],[2128,2131],[2128,2131],[2149,2152],[2149,2152],[2213,2216],[2213,2216],[2234,2237],[2234,2237],[2958,2961],[2958,2961],[3008,3011],[3008,3011],[275,278],[275,278],[4577,4580],[4577,4580],[4595,4598],[4595,4598],[5019,5022],[5019,5022],[5037,5040],[5037,5040],[1897,1900],[1897,1900],[5009,5012],[5009,5012],[5897,5900],[5897,5900],[5916,5919],[5916,5919],[8893,8896],[8893,8896],[9011,9014],[9011,9014],[9178,9181],[9178,9181],[10831,10834],[10831,10834],[11501,11504],[11501,11504],[11649,11652],[11649,11652],[14906,14909],[14906,14909],[15638,15641],[15638,15641],[16303,16306],[16303,16306],[16987,16990],[16987,16990],[17561,17564],[17561,17564],[18009,18012],[18009,18012],[18529,18532],[18529,18532],[19093,19096],[19093,19096],[19833,19836],[19833,19836],[20550,20553],[20550,20553],[740,743],[740,743],[916,919],[916,919],[2199,2202],[2199,2202],[2273,2276],[2273,2276],[817,820],[817,820],[893,896],[893,896],[1469,1472],[1469,1472],[827,830],[827,830],[852,855],[852,855],[1270,1273],[1270,1273],[1817,1820],[1817,1820],[2679,2682],[2679,2682],[3359,3362],[3359,3362],[4329,4332],[4329,4332],[6061,6064],[6061,6064],[8467,8470],[8467,8470],[10171,10174],[10171,10174],[1557,1560],[1557,1560],[1966,1969],[1966,1969],[2382,2385],[2382,2385],[2826,2829],[2826,2829],[3256,3259],[3256,3259],[3314,3317],[3314,3317],[3925,3928],[3925,3928],[4338,4341],[4338,4341],[4721,4724],[4721,4724],[1761,1764],[1761,1764],[1931,1934],[1931,1934],[2110,2113],[2110,2113],[3445,3448],[3445,3448],[4531,4534],[4531,4534],[4589,4592],[4589,4592],[2100,2103],[2100,2103],[3680,3683],[3680,3683],[7071,7074],[7071,7074],[7139,7142],[7139,7142],[7658,7661],[7658,7661],[7726,7729],[7726,7729],[8239,8242],[8239,8242],[8315,8318],[8315,8318],[8375,8378],[8375,8378],[8902,8905],[8902,8905],[8916,8919],[8916,8919],[11470,11473],[11470,11473],[11484,11487],[11484,11487],[13257,13260],[13257,13260],[13271,13274],[13271,13274],[19751,19754],[19751,19754],[19765,19768],[19765,19768],[22164,22167],[22164,22167],[22194,22197],[22194,22197],[22679,22682],[22679,22682],[23076,23079],[23076,23079],[8952,8955],[8952,8955],[10052,10055],[10052,10055],[14387,14390],[14387,14390],[3424,3427],[3424,3427],[4688,4691],[4688,4691],[5654,5657],[5654,5657],[6913,6916],[6913,6916],[7903,7906],[7903,7906],[8917,8920],[8917,8920],[10260,10263],[10260,10263],[11755,11758],[11755,11758],[13882,13885],[13882,13885],[15696,15699],[15696,15699],[17527,17530],[17527,17530],[19645,19648],[19645,19648],[21400,21403],[21400,21403],[24901,24904],[24901,24904],[26653,26656],[26653,26656],[28662,28665],[28662,28665],[30349,30352],[30349,30352],[31924,31927],[31924,31927],[32935,32938],[32935,32938],[33828,33831],[33828,33831],[61229,61232],[61229,61232],[72001,72004],[72001,72004],[72657,72660],[72657,72660],[73688,73691],[73688,73691],[79940,79943],[79940,79943],[743,746],[743,746],[1496,1499],[1496,1499],[1854,1857],[1854,1857],[1912,1915],[1912,1915],[1784,1787],[1784,1787],[2322,2325],[2322,2325],[2915,2918],[2915,2918],[1423,1426],[1423,1426],[8096,8099],[8096,8099],[1203,1206],[1203,1206],[4100,4103],[4100,4103],[4191,4194],[4191,4194],[4283,4286],[4283,4286],[4384,4387],[4384,4387],[4475,4478],[4475,4478],[4571,4574],[4571,4574],[5324,5327],[5324,5327],[6037,6040],[6037,6040],[7224,7227],[7224,7227],[7317,7320],[7317,7320],[7642,7645],[7642,7645],[7734,7737],[7734,7737],[1303,1306],[1303,1306],[1884,1887],[1884,1887],[2452,2455],[2452,2455],[3066,3069],[3066,3069],[3616,3619],[3616,3619],[4196,4199],[4196,4199],[4859,4862],[4859,4862],[5729,5732],[5729,5732],[6481,6484],[6481,6484],[7244,7247],[7244,7247],[2903,2906],[2903,2906],[3745,3748],[3745,3748],[3769,3772],[3769,3772],[4582,4585],[4582,4585],[833,836],[833,836],[1169,1172],[1169,1172],[3237,3240],[3237,3240],[4011,4014],[4011,4014],[993,996],[993,996],[1932,1935],[1932,1935],[2513,2516],[2513,2516],[740,743],[740,743],[694,697],[694,697],[1580,1583],[1580,1583],[1224,1227],[1224,1227],[1492,1495],[1492,1495],[1686,1689],[1686,1689],[1874,1877],[1874,1877],[2181,2184],[2181,2184],[2764,2767],[2764,2767],[3364,3367],[3364,3367],[3567,3570],[3567,3570],[3812,3815],[3812,3815],[4124,4127],[4124,4127],[4168,4171],[4168,4171],[4502,4505],[4502,4505],[4825,4828],[4825,4828],[5156,5159],[5156,5159],[5310,5313],[5310,5313],[5371,5374],[5371,5374],[5900,5903],[5900,5903],[6511,6514],[6511,6514],[6693,6696],[6693,6696],[7105,7108],[7105,7108],[7315,7318],[7315,7318],[7392,7395],[7392,7395],[7613,7616],[7613,7616],[7679,7682],[7679,7682],[8027,8030],[8027,8030],[8475,8478],[8475,8478],[9888,9891],[9888,9891],[10197,10200],[10197,10200],[10667,10670],[10667,10670],[10765,10768],[10765,10768],[11060,11063],[11060,11063],[11100,11103],[11100,11103],[11200,11203],[11200,11203],[11420,11423],[11420,11423],[11467,11470],[11467,11470],[11788,11791],[11788,11791],[12349,12352],[12349,12352],[12571,12574],[12571,12574],[12911,12914],[12911,12914],[13233,13236],[13233,13236],[13364,13367],[13364,13367],[13607,13610],[13607,13610],[13882,13885],[13882,13885],[14362,14365],[14362,14365],[14748,14751],[14748,14751],[14879,14882],[14879,14882],[15294,15297],[15294,15297],[15616,15619],[15616,15619],[15747,15750],[15747,15750],[16009,16012],[16009,16012],[16257,16260],[16257,16260],[16388,16391],[16388,16391],[16647,16650],[16647,16650],[16881,16884],[16881,16884],[17013,17016],[17013,17016],[17257,17260],[17257,17260],[17329,17332],[17329,17332],[17576,17579],[17576,17579],[564,567],[564,567],[603,606],[603,606],[617,620],[617,620],[1381,1384],[1381,1384],[2836,2839],[2836,2839],[3617,3620],[3617,3620],[1640,1643],[1640,1643],[2339,2342],[2339,2342],[3175,3178],[3175,3178],[3238,3241],[3238,3241],[3897,3900],[3897,3900],[4542,4545],[4542,4545],[2657,2660],[2657,2660],[3276,3279],[3276,3279],[4149,4152],[4149,4152],[4749,4752],[4749,4752],[1219,1222],[1219,1222],[1238,1241],[1238,1241],[4034,4037],[4034,4037],[4955,4958],[4955,4958],[3535,3538],[3535,3538],[5001,5004],[5001,5004],[6074,6077],[6074,6077],[7704,7707],[7704,7707],[9041,9044],[9041,9044],[10364,10367],[10364,10367],[11870,11873],[11870,11873],[13652,13655],[13652,13655],[15596,15599],[15596,15599],[17238,17241],[17238,17241],[19632,19635],[19632,19635],[21753,21756],[21753,21756],[24104,24107],[24104,24107],[26801,26804],[26801,26804],[28826,28829],[28826,28829],[30976,30979],[30976,30979],[790,793],[790,793],[2828,2831],[2828,2831],[2891,2894],[2891,2894],[4297,4300],[4297,4300],[3326,3329],[3326,3329],[4335,4338],[4335,4338],[6191,6194],[6191,6194],[6552,6555],[6552,6555],[7119,7122],[7119,7122],[8066,8069],[8066,8069],[8276,8279],[8276,8279],[8517,8520],[8517,8520],[8723,8726],[8723,8726],[9789,9792],[9789,9792],[10112,10115],[10112,10115],[10149,10152],[10149,10152],[10467,10470],[10467,10470],[10840,10843],[10840,10843],[11036,11039],[11036,11039],[13092,13095],[13092,13095],[15032,15035],[15032,15035],[15242,15245],[15242,15245],[15978,15981],[15978,15981],[17630,17633],[17630,17633],[19220,19223],[19220,19223],[19964,19967],[19964,19967],[20668,20671],[20668,20671],[21666,21669],[21666,21669],[22771,22774],[22771,22774],[23924,23927],[23924,23927],[26160,26163],[26160,26163],[26674,26677],[26674,26677],[26698,26701],[26698,26701],[27489,27492],[27489,27492],[28311,28314],[28311,28314],[28629,28632],[28629,28632],[29254,29257],[29254,29257],[29586,29589],[29586,29589],[31459,31462],[31459,31462],[31793,31796],[31793,31796],[32119,32122],[32119,32122],[32910,32913],[32910,32913],[33260,33263],[33260,33263],[34096,34099],[34096,34099],[34256,34259],[34256,34259],[34325,34328],[34325,34328],[34394,34397],[34394,34397],[34487,34490],[34487,34490],[34563,34566],[34563,34566],[34636,34639],[34636,34639],[34714,34717],[34714,34717],[35026,35029],[35026,35029],[35574,35577],[35574,35577],[36967,36970],[36967,36970],[38102,38105],[38102,38105],[38240,38243],[38240,38243],[38315,38318],[38315,38318],[38357,38360],[38357,38360],[38406,38409],[38406,38409],[38444,38447],[38444,38447],[38504,38507],[38504,38507],[38563,38566],[38563,38566],[38614,38617],[38614,38617],[38704,38707],[38704,38707],[39553,39556],[39553,39556],[41429,41432],[41429,41432],[43184,43187],[43184,43187],[43874,43877],[43874,43877],[45746,45749],[45746,45749],[47256,47259],[47256,47259],[48250,48253],[48250,48253],[49537,49540],[49537,49540],[50675,50678],[50675,50678],[51428,51431],[51428,51431],[52641,52644],[52641,52644],[52970,52973],[52970,52973],[53725,53728],[53725,53728],[53927,53930],[53927,53930],[55045,55048],[55045,55048],[55906,55909],[55906,55909],[55956,55959],[55956,55959],[56850,56853],[56850,56853],[56900,56903],[56900,56903],[3370,3373],[3370,3373],[3424,3427],[3424,3427],[1302,1305],[1302,1305],[1340,1343],[1340,1343],[1354,1357],[1354,1357],[2118,2121],[2118,2121],[2494,2497],[2494,2497],[2848,2851],[2848,2851],[5208,5211],[5208,5211],[2967,2970],[2967,2970],[3262,3265],[3262,3265],[9048,9051],[9048,9051],[9282,9285],[9282,9285],[9347,9350],[9347,9350],[2507,2510],[2507,2510],[4463,4466],[4463,4466],[19159,19162],[19159,19162],[19903,19906],[19903,19906],[4764,4767],[4764,4767],[2927,2930],[2927,2930],[3682,3685],[3682,3685],[4050,4053],[4050,4053],[4400,4403],[4400,4403],[4637,4640],[4637,4640],[4675,4678],[4675,4678],[4689,4692],[4689,4692],[6532,6535],[6532,6535],[722,725],[722,725],[1399,1402],[1399,1402],[2119,2122],[2119,2122],[2638,2641],[2638,2641],[2393,2396],[2393,2396],[384,387],[384,387],[469,472],[469,472],[775,778],[775,778],[1761,1764],[1761,1764],[2949,2952],[2949,2952],[3025,3028],[3025,3028],[3116,3119],[3116,3119],[3258,3261],[3258,3261],[366,369],[366,369],[2595,2598],[2595,2598],[2646,2649],[2646,2649],[3190,3193],[3190,3193],[3241,3244],[3241,3244],[4160,4163],[4160,4163],[4211,4214],[4211,4214],[1513,1516],[1513,1516],[2664,2667],[2664,2667],[3218,3221],[3218,3221],[4439,4442],[4439,4442],[5497,5500],[5497,5500],[7154,7157],[7154,7157],[8525,8528],[8525,8528],[7162,7165],[7162,7165],[2526,2529],[2526,2529],[4174,4177],[4174,4177],[4221,4224],[4221,4224],[4531,4534],[4531,4534],[945,948],[945,948],[1813,1816],[1813,1816],[2625,2628],[2625,2628],[3335,3338],[3335,3338],[2104,2107],[2104,2107],[2873,2876],[2873,2876],[2936,2939],[2936,2939],[3001,3004],[3001,3004],[4351,4354],[4351,4354],[5383,5386],[5383,5386],[5448,5451],[5448,5451],[2113,2116],[2113,2116],[2273,2276],[2273,2276],[2972,2975],[2972,2975],[4915,4918],[4915,4918],[2244,2247],[2244,2247],[3126,3129],[3126,3129],[3337,3340],[3337,3340],[3365,3368],[3365,3368],[4328,4331],[4328,4331],[4484,4487],[4484,4487],[4531,4534],[4531,4534],[3266,3269],[3266,3269],[3326,3329],[3326,3329],[3401,3404],[3401,3404],[3449,3452],[3449,3452],[4420,4423],[4420,4423],[4483,4486],[4483,4486],[4812,4815],[4812,4815],[12688,12691],[12688,12691],[12751,12754],[12751,12754],[12794,12797],[12794,12797],[12820,12823],[12820,12823],[12877,12880],[12877,12880],[12908,12911],[12908,12911],[13008,13011],[13008,13011],[13085,13088],[13085,13088],[13123,13126],[13123,13126],[13171,13174],[13171,13174],[13185,13188],[13185,13188],[13240,13243],[13240,13243],[13304,13307],[13304,13307],[7894,7897],[7894,7897],[2710,2713],[2710,2713],[2856,2859],[2856,2859],[3076,3079],[3076,3079],[4035,4038],[4035,4038],[4181,4184],[4181,4184],[4384,4387],[4384,4387],[5054,5057],[5054,5057],[5172,5175],[5172,5175],[5779,5782],[5779,5782],[13725,13728],[13725,13728],[603,606],[603,606],[950,953],[950,953],[1340,1343],[1340,1343],[257,260],[257,260],[8648,8651],[8648,8651],[9751,9754],[9751,9754],[948,951],[948,951],[707,710],[707,710],[2297,2300],[2297,2300],[3098,3101],[3098,3101],[3220,3223],[3220,3223],[4079,4082],[4079,4082],[4202,4205],[4202,4205],[779,782],[779,782],[2834,2837],[2834,2837],[5123,5126],[5123,5126],[6468,6471],[6468,6471],[755,758],[755,758],[1375,1378],[1375,1378],[2263,2266],[2263,2266],[5159,5162],[5159,5162],[5714,5717],[5714,5717],[6504,6507],[6504,6507],[7132,7135],[7132,7135],[4045,4048],[4045,4048],[4375,4378],[4375,4378],[4932,4935],[4932,4935],[8384,8387],[8384,8387],[9255,9258],[9255,9258],[10430,10433],[10430,10433],[11463,11466],[11463,11466],[12174,12177],[12174,12177],[13303,13306],[13303,13306],[14928,14931],[14928,14931],[15618,15621],[15618,15621],[16357,16360],[16357,16360],[16898,16901],[16898,16901],[18297,18300],[18297,18300],[18427,18430],[18427,18430],[19202,19205],[19202,19205],[20148,20151],[20148,20151],[21506,21509],[21506,21509],[21561,21564],[21561,21564],[23222,23225],[23222,23225],[23277,23280],[23277,23280],[24162,24165],[24162,24165],[24591,24594],[24591,24594],[25327,25330],[25327,25330],[26076,26079],[26076,26079],[26861,26864],[26861,26864],[27473,27476],[27473,27476],[28588,28591],[28588,28591],[29204,29207],[29204,29207],[30042,30045],[30042,30045],[31035,31038],[31035,31038],[31940,31943],[31940,31943],[33127,33130],[33127,33130],[36088,36091],[36088,36091],[39220,39223],[39220,39223],[40542,40545],[40542,40545],[42518,42521],[42518,42521],[44621,44624],[44621,44624],[45457,45460],[45457,45460],[46029,46032],[46029,46032],[46611,46614],[46611,46614],[47168,47171],[47168,47171],[48225,48228],[48225,48228],[49397,49400],[49397,49400],[50618,50621],[50618,50621],[51862,51865],[51862,51865],[53904,53907],[53904,53907],[55640,55643],[55640,55643],[57059,57062],[57059,57062],[58241,58244],[58241,58244],[59086,59089],[59086,59089],[59781,59784],[59781,59784],[60995,60998],[60995,60998],[62474,62477],[62474,62477],[1723,1726],[1723,1726],[2566,2569],[2566,2569],[4041,4044],[4041,4044],[4124,4127],[4124,4127],[4657,4660],[4657,4660],[5084,5087],[5084,5087],[5559,5562],[5559,5562],[6116,6119],[6116,6119],[6587,6590],[6587,6590],[2445,2448],[2445,2448],[3148,3151],[3148,3151],[3201,3204],[3201,3204],[4066,4069],[4066,4069],[4895,4898],[4895,4898],[5479,5482],[5479,5482],[6238,6241],[6238,6241],[6837,6840],[6837,6840],[7552,7555],[7552,7555],[8366,8369],[8366,8369],[9007,9010],[9007,9010],[10341,10344],[10341,10344],[11583,11586],[11583,11586],[1060,1063],[1060,1063],[1213,1216],[1213,1216],[1224,1227],[1224,1227],[2193,2196],[2193,2196],[3124,3127],[3124,3127],[3717,3720],[3717,3720],[4240,4243],[4240,4243],[8369,8372],[8369,8372],[4458,4461],[4458,4461],[6787,6790],[6787,6790],[8535,8538],[8535,8538],[10443,10446],[10443,10446],[13032,13035],[13032,13035],[15782,15785],[15782,15785],[4430,4433],[4430,4433],[4888,4891],[4888,4891],[5386,5389],[5386,5389],[5774,5777],[5774,5777],[6617,6620],[6617,6620],[6628,6631],[6628,6631],[477,480],[477,480],[9414,9417],[9414,9417],[11066,11069],[11066,11069],[11284,11287],[11284,11287],[12695,12698],[12695,12698],[1803,1806],[1803,1806],[3859,3862],[3859,3862],[8943,8946],[8943,8946],[10066,10069],[10066,10069],[560,563],[560,563],[645,648],[645,648],[842,845],[842,845],[858,861],[858,861],[893,896],[893,896],[909,912],[909,912],[949,952],[949,952],[1085,1088],[1085,1088],[6420,6423],[6420,6423],[7348,7351],[7348,7351],[4202,4205],[4202,4205],[3112,3115],[3112,3115],[5297,5300],[5297,5300],[5522,5525],[5522,5525],[5881,5884],[5881,5884],[6556,6559],[6556,6559],[7291,7294],[7291,7294],[8431,8434],[8431,8434],[11721,11724],[11721,11724],[13325,13328],[13325,13328],[13997,14000],[13997,14000],[14454,14457],[14454,14457],[15824,15827],[15824,15827],[17357,17360],[17357,17360],[18010,18013],[18010,18013],[18937,18940],[18937,18940],[19863,19866],[19863,19866],[20306,20309],[20306,20309],[20550,20553],[20550,20553],[23235,23238],[23235,23238],[23908,23911],[23908,23911],[25137,25140],[25137,25140],[25689,25692],[25689,25692],[5346,5349],[5346,5349],[1656,1659],[1656,1659],[1692,1695],[1692,1695],[1713,1716],[1713,1716],[2319,2322],[2319,2322],[4376,4379],[4376,4379],[4891,4894],[4891,4894],[4990,4993],[4990,4993],[5028,5031],[5028,5031],[5080,5083],[5080,5083],[5134,5137],[5134,5137],[5770,5773],[5770,5773],[6082,6085],[6082,6085],[6120,6123],[6120,6123],[6172,6175],[6172,6175],[6226,6229],[6226,6229],[7208,7211],[7208,7211],[7277,7280],[7277,7280],[7747,7750],[7747,7750],[8413,8416],[8413,8416],[9122,9125],[9122,9125],[9817,9820],[9817,9820],[10969,10972],[10969,10972],[11020,11023],[11020,11023],[11082,11085],[11082,11085],[11617,11620],[11617,11620],[11794,11797],[11794,11797],[11863,11866],[11863,11866],[11915,11918],[11915,11918],[12731,12734],[12731,12734],[12845,12848],[12845,12848],[13039,13042],[13039,13042],[13140,13143],[13140,13143],[13257,13260],[13257,13260],[13327,13330],[13327,13330],[13452,13455],[13452,13455],[13645,13648],[13645,13648],[13713,13716],[13713,13716],[13831,13834],[13831,13834],[13932,13935],[13932,13935],[15549,15552],[15549,15552],[15740,15743],[15740,15743],[15935,15938],[15935,15938],[16005,16008],[16005,16008],[16118,16121],[16118,16121],[16388,16391],[16388,16391],[16456,16459],[16456,16459],[16567,16570],[16567,16570],[16667,16670],[16667,16670],[17085,17088],[17085,17088],[17234,17237],[17234,17237],[17272,17275],[17272,17275],[17326,17329],[17326,17329],[17385,17388],[17385,17388],[17439,17442],[17439,17442],[2305,2308],[2305,2308],[2364,2367],[2364,2367],[3433,3436],[3433,3436],[8552,8555],[8552,8555],[12437,12440],[12437,12440],[12552,12555],[12552,12555],[925,928],[925,928],[1637,1640],[1637,1640],[3368,3371],[3368,3371],[1797,1800],[1797,1800],[1890,1893],[1890,1893],[2130,2133],[2130,2133],[2165,2168],[2165,2168],[2299,2302],[2299,2302],[2333,2336],[2333,2336],[438,441],[438,441],[519,522],[519,522],[3044,3047],[3044,3047],[3895,3898],[3895,3898],[1328,1331],[1328,1331],[1276,1279],[1276,1279],[4080,4083],[4080,4083],[1274,1277],[1274,1277],[1620,1623],[1620,1623],[2263,2266],[2263,2266],[1296,1299],[1296,1299],[2241,2244],[2241,2244],[2280,2283],[2280,2283],[2999,3002],[2999,3002],[3038,3041],[3038,3041],[3928,3931],[3928,3931],[3967,3970],[3967,3970],[4810,4813],[4810,4813],[4849,4852],[4849,4852],[1295,1298],[1295,1298],[836,839],[836,839],[855,858],[855,858],[2956,2959],[2956,2959],[4103,4106],[4103,4106],[807,810],[807,810],[1936,1939],[1936,1939],[1365,1368],[1365,1368],[1372,1375],[1372,1375],[3561,3564],[3561,3564],[4854,4857],[4854,4857],[6472,6475],[6472,6475],[4010,4013],[4010,4013],[4059,4062],[4059,4062],[4187,4190],[4187,4190],[4344,4347],[4344,4347],[4386,4389],[4386,4389],[4505,4508],[4505,4508],[4673,4676],[4673,4676],[4712,4715],[4712,4715],[2251,2254],[2251,2254],[2343,2346],[2343,2346],[2404,2407],[2404,2407],[3008,3011],[3008,3011],[3069,3072],[3069,3072],[3657,3660],[3657,3660],[3718,3721],[3718,3721],[4050,4053],[4050,4053],[4919,4922],[4919,4922],[4970,4973],[4970,4973],[3165,3168],[3165,3168],[3221,3224],[3221,3224],[3280,3283],[3280,3283],[3310,3313],[3310,3313],[3433,3436],[3433,3436],[3501,3504],[3501,3504],[3530,3533],[3530,3533],[3620,3623],[3620,3623],[4126,4129],[4126,4129],[4207,4210],[4207,4210],[4700,4703],[4700,4703],[4727,4730],[4727,4730],[4775,4778],[4775,4778],[5333,5336],[5333,5336],[5360,5363],[5360,5363],[5446,5449],[5446,5449],[5880,5883],[5880,5883],[6480,6483],[6480,6483],[6554,6557],[6554,6557],[6647,6650],[6647,6650],[7190,7193],[7190,7193],[7271,7274],[7271,7274],[7843,7846],[7843,7846],[8293,8296],[8293,8296],[8374,8377],[8374,8377],[8964,8967],[8964,8967],[9048,9051],[9048,9051],[9146,9149],[9146,9149],[9281,9284],[9281,9284],[9899,9902],[9899,9902],[10948,10951],[10948,10951],[11003,11006],[11003,11006],[11064,11067],[11064,11067],[11112,11115],[11112,11115],[11137,11140],[11137,11140],[11189,11192],[11189,11192],[11214,11217],[11214,11217],[11271,11274],[11271,11274],[11296,11299],[11296,11299],[11371,11374],[11371,11374],[11431,11434],[11431,11434],[11445,11448],[11445,11448],[11498,11501],[11498,11501],[11578,11581],[11578,11581],[11945,11948],[11945,11948],[12750,12753],[12750,12753],[13732,13735],[13732,13735],[13788,13791],[13788,13791],[13806,13809],[13806,13809],[13876,13879],[13876,13879],[13953,13956],[13953,13956],[14019,14022],[14019,14022],[14062,14065],[14062,14065],[14087,14090],[14087,14090],[14146,14149],[14146,14149],[14226,14229],[14226,14229],[14314,14317],[14314,14317],[15958,15961],[15958,15961],[16046,16049],[16046,16049],[16445,16448],[16445,16448],[16530,16533],[16530,16533],[16874,16877],[16874,16877],[16963,16966],[16963,16966],[17709,17712],[17709,17712],[17782,17785],[17782,17785],[17862,17865],[17862,17865],[18298,18301],[18298,18301],[18383,18386],[18383,18386],[19433,19436],[19433,19436],[20206,20209],[20206,20209],[20866,20869],[20866,20869],[22647,22650],[22647,22650],[23711,23714],[23711,23714],[24701,24704],[24701,24704],[25735,25738],[25735,25738],[26305,26308],[26305,26308],[26739,26742],[26739,26742],[27188,27191],[27188,27191],[27652,27655],[27652,27655],[28157,28160],[28157,28160],[28550,28553],[28550,28553],[28926,28929],[28926,28929],[29316,29319],[29316,29319],[1129,1132],[1129,1132],[1144,1147],[1144,1147],[1961,1964],[1961,1964],[1976,1979],[1976,1979],[6966,6969],[6966,6969],[6977,6980],[6977,6980],[821,824],[821,824],[1294,1297],[1294,1297],[1880,1883],[1880,1883],[2464,2467],[2464,2467],[2514,2517],[2514,2517],[2566,2569],[2566,2569],[2628,2631],[2628,2631],[2952,2955],[2952,2955],[3004,3007],[3004,3007],[3066,3069],[3066,3069],[3396,3399],[3396,3399],[3448,3451],[3448,3451],[3506,3509],[3506,3509],[7375,7378],[7375,7378],[8101,8104],[8101,8104],[8787,8790],[8787,8790],[9386,9389],[9386,9389],[10037,10040],[10037,10040],[10732,10735],[10732,10735],[10758,10761],[10758,10761],[11309,11312],[11309,11312],[11335,11338],[11335,11338],[11660,11663],[11660,11663],[11993,11996],[11993,11996],[12327,12330],[12327,12330],[13088,13091],[13088,13091],[13419,13422],[13419,13422],[13787,13790],[13787,13790],[14225,14228],[14225,14228],[15027,15030],[15027,15030],[15572,15575],[15572,15575],[15621,15624],[15621,15624],[16125,16128],[16125,16128],[16925,16928],[16925,16928],[17202,17205],[17202,17205],[5531,5534],[5531,5534],[5919,5922],[5919,5922],[5984,5987],[5984,5987],[6035,6038],[6035,6038],[7501,7504],[7501,7504],[10818,10821],[10818,10821],[10882,10885],[10882,10885],[10937,10940],[10937,10940],[10994,10997],[10994,10997],[11055,11058],[11055,11058],[11111,11114],[11111,11114],[11170,11173],[11170,11173],[11247,11250],[11247,11250],[11346,11349],[11346,11349],[11399,11402],[11399,11402],[11474,11477],[11474,11477],[11537,11540],[11537,11540],[14660,14663],[14660,14663],[14724,14727],[14724,14727],[14784,14787],[14784,14787],[14852,14855],[14852,14855],[14916,14919],[14916,14919],[16551,16554],[16551,16554],[17227,17230],[17227,17230],[17290,17293],[17290,17293],[18168,18171],[18168,18171],[18545,18548],[18545,18548],[19606,19609],[19606,19609],[20694,20697],[20694,20697],[22197,22200],[22197,22200],[24365,24368],[24365,24368],[24428,24431],[24428,24431],[24485,24488],[24485,24488],[24532,24535],[24532,24535],[24589,24592],[24589,24592],[24648,24651],[24648,24651],[24719,24722],[24719,24722],[24782,24785],[24782,24785],[24835,24838],[24835,24838],[24900,24903],[24900,24903],[24967,24970],[24967,24970],[25030,25033],[25030,25033],[26861,26864],[26861,26864],[27563,27566],[27563,27566],[27636,27639],[27636,27639],[27699,27702],[27699,27702],[29492,29495],[29492,29495],[29559,29562],[29559,29562],[32125,32128],[32125,32128],[32925,32928],[32925,32928],[33496,33499],[33496,33499],[34779,34782],[34779,34782],[35917,35920],[35917,35920],[36588,36591],[36588,36591],[37893,37896],[37893,37896],[40226,40229],[40226,40229],[42961,42964],[42961,42964],[1524,1527],[1524,1527],[1564,1567],[1564,1567],[1585,1588],[1585,1588],[1622,1625],[1622,1625],[1643,1646],[1643,1646],[2222,2225],[2222,2225],[2283,2286],[2283,2286],[2331,2334],[2331,2334],[2909,2912],[2909,2912],[710,713],[710,713],[741,744],[741,744],[769,772],[769,772],[818,821],[818,821],[846,849],[846,849],[1089,1092],[1089,1092],[1117,1120],[1117,1120],[1171,1174],[1171,1174],[2186,2189],[2186,2189],[2488,2491],[2488,2491],[2733,2736],[2733,2736],[3033,3036],[3033,3036],[1494,1497],[1494,1497],[3161,3164],[3161,3164],[7459,7462],[7459,7462],[9486,9489],[9486,9489],[10949,10952],[10949,10952],[12517,12520],[12517,12520],[13931,13934],[13931,13934],[976,979],[976,979],[1508,1511],[1508,1511],[2041,2044],[2041,2044],[2325,2328],[2325,2328],[2587,2590],[2587,2590],[1335,1338],[1335,1338],[3168,3171],[3168,3171],[1736,1739],[1736,1739],[1971,1974],[1971,1974],[2538,2541],[2538,2541],[3615,3618],[3615,3618],[4478,4481],[4478,4481],[5427,5430],[5427,5430],[6426,6429],[6426,6429],[7128,7131],[7128,7131],[7826,7829],[7826,7829],[8620,8623],[8620,8623],[9466,9469],[9466,9469],[507,510],[507,510],[547,550],[547,550],[685,688],[685,688],[1969,1972],[1969,1972],[2098,2101],[2098,2101],[2122,2125],[2122,2125],[2819,2822],[2819,2822],[2866,2869],[2866,2869],[2887,2890],[2887,2890],[2923,2926],[2923,2926],[2948,2951],[2948,2951],[3506,3509],[3506,3509],[3565,3568],[3565,3568],[3613,3616],[3613,3616],[841,844],[841,844],[1183,1186],[1183,1186],[1247,1250],[1247,1250],[1708,1711],[1708,1711],[2498,2501],[2498,2501],[2640,2643],[2640,2643],[2894,2897],[2894,2897],[3072,3075],[3072,3075],[3921,3924],[3921,3924],[4723,4726],[4723,4726],[5111,5114],[5111,5114],[3901,3904],[3901,3904],[2499,2502],[2499,2502],[2005,2008],[2005,2008],[2642,2645],[2642,2645],[3186,3189],[3186,3189],[3390,3393],[3390,3393],[3765,3768],[3765,3768],[5242,5245],[5242,5245],[5295,5298],[5295,5298],[5352,5355],[5352,5355],[5542,5545],[5542,5545],[3958,3961],[3958,3961],[4772,4775],[4772,4775],[5659,5662],[5659,5662],[6163,6166],[6163,6166],[7148,7151],[7148,7151],[8643,8646],[8643,8646],[9482,9485],[9482,9485],[1017,1020],[1017,1020],[1170,1173],[1170,1173],[9848,9851],[9848,9851],[10653,10656],[10653,10656],[11624,11627],[11624,11627],[13024,13027],[13024,13027],[15459,15462],[15459,15462],[15681,15684],[15681,15684],[18058,18061],[18058,18061],[22324,22327],[22324,22327],[24196,24199],[24196,24199],[24846,24849],[24846,24849],[25396,25399],[25396,25399],[25464,25467],[25464,25467],[1309,1312],[1309,1312],[1862,1865],[1862,1865],[2228,2231],[2228,2231],[38667,38670],[38667,38670],[38720,38723],[38720,38723],[38780,38783],[38780,38783],[38855,38858],[38855,38858],[38930,38933],[38930,38933],[58227,58230],[58227,58230],[58280,58283],[58280,58283],[58336,58339],[58336,58339],[58415,58418],[58415,58418],[59659,59662],[59659,59662],[59724,59727],[59724,59727],[59812,59815],[59812,59815],[59895,59898],[59895,59898],[60038,60041],[60038,60041],[5954,5957],[5954,5957],[6987,6990],[6987,6990],[7605,7608],[7605,7608],[8241,8244],[8241,8244],[9003,9006],[9003,9006],[9562,9565],[9562,9565],[11830,11833],[11830,11833],[12496,12499],[12496,12499],[13322,13325],[13322,13325],[14169,14172],[14169,14172],[15981,15984],[15981,15984],[16733,16736],[16733,16736],[17894,17897],[17894,17897],[18264,18267],[18264,18267],[18676,18679],[18676,18679],[19097,19100],[19097,19100],[19922,19925],[19922,19925],[20657,20660],[20657,20660],[3049,3052],[3049,3052],[3402,3405],[3402,3405],[3115,3118],[3115,3118],[3560,3563],[3560,3563],[4224,4227],[4224,4227],[4611,4614],[4611,4614],[5543,5546],[5543,5546],[1012,1015],[1012,1015],[1661,1664],[1661,1664],[1712,1715],[1712,1715],[1738,1741],[1738,1741],[5196,5199],[5196,5199],[1402,1405],[1402,1405],[2333,2336],[2333,2336],[2363,2366],[2363,2366],[4041,4044],[4041,4044],[4068,4071],[4068,4071],[3224,3227],[3224,3227],[1080,1083],[1080,1083],[1011,1014],[1011,1014],[1032,1035],[1032,1035],[1068,1071],[1068,1071],[1003,1006],[1003,1006],[7178,7181],[7178,7181],[7450,7453],[7450,7453],[9789,9792],[9789,9792],[10064,10067],[10064,10067],[11800,11803],[11800,11803],[12021,12024],[12021,12024],[14576,14579],[14576,14579],[16931,16934],[16931,16934],[19643,19646],[19643,19646],[1230,1233],[1230,1233],[8788,8791],[8788,8791],[9013,9016],[9013,9016],[11147,11150],[11147,11150],[11423,11426],[11423,11426],[12069,12072],[12069,12072],[13375,13378],[13375,13378],[15224,15227],[15224,15227],[16916,16919],[16916,16919],[17106,17109],[17106,17109],[17196,17199],[17196,17199],[1952,1955],[1952,1955],[2121,2124],[2121,2124],[5178,5181],[5178,5181],[7056,7059],[7056,7059],[8087,8090],[8087,8090],[9545,9548],[9545,9548],[10477,10480],[10477,10480],[13002,13005],[13002,13005],[14104,14107],[14104,14107],[15175,15178],[15175,15178],[16264,16267],[16264,16267],[18066,18069],[18066,18069],[19147,19150],[19147,19150],[20990,20993],[20990,20993],[22062,22065],[22062,22065],[43360,43363],[43360,43363],[43434,43437],[43434,43437],[1595,1598],[1595,1598],[1643,1646],[1643,1646],[1665,1668],[1665,1668],[1714,1717],[1714,1717],[1736,1739],[1736,1739],[1798,1801],[1798,1801],[2120,2123],[2120,2123],[2682,2685],[2682,2685],[2709,2712],[2709,2712],[2726,2729],[2726,2729],[2779,2782],[2779,2782],[2834,2837],[2834,2837],[1621,1624],[1621,1624],[1771,1774],[1771,1774],[1782,1785],[1782,1785],[9196,9199],[9196,9199],[9289,9292],[9289,9292],[9374,9377],[9374,9377],[9385,9388],[9385,9388],[7003,7006],[7003,7006],[7545,7548],[7545,7548],[8505,8508],[8505,8508],[8571,8574],[8571,8574],[8641,8644],[8641,8644],[7458,7461],[7458,7461],[8763,8766],[8763,8766],[10333,10336],[10333,10336],[11466,11469],[11466,11469],[1728,1731],[1728,1731],[1773,1776],[1773,1776],[2458,2461],[2458,2461],[4317,4320],[4317,4320],[4383,4386],[4383,4386],[4856,4859],[4856,4859],[4906,4909],[4906,4909],[5636,5639],[5636,5639],[5686,5689],[5686,5689],[6101,6104],[6101,6104],[6151,6154],[6151,6154],[7319,7322],[7319,7322],[7369,7372],[7369,7372],[8216,8219],[8216,8219],[8266,8269],[8266,8269],[9002,9005],[9002,9005],[9049,9052],[9049,9052],[9568,9571],[9568,9571],[9615,9618],[9615,9618],[9981,9984],[9981,9984],[11759,11762],[11759,11762],[3038,3041],[3038,3041],[3132,3135],[3132,3135],[3312,3315],[3312,3315],[3532,3535],[3532,3535],[3922,3925],[3922,3925],[7469,7472],[7469,7472],[7593,7596],[7593,7596],[7758,7761],[7758,7761],[7877,7880],[7877,7880],[7974,7977],[7974,7977],[10416,10419],[10416,10419],[11383,11386],[11383,11386],[13418,13421],[13418,13421],[14013,14016],[14013,14016],[15686,15689],[15686,15689],[1446,1449],[1446,1449],[2456,2459],[2456,2459],[2487,2490],[2487,2490],[2509,2512],[2509,2512],[2541,2544],[2541,2544],[2563,2566],[2563,2566],[2627,2630],[2627,2630],[2695,2698],[2695,2698],[2770,2773],[2770,2773],[2839,2842],[2839,2842],[2894,2897],[2894,2897],[2965,2968],[2965,2968],[3030,3033],[3030,3033],[3096,3099],[3096,3099],[3156,3159],[3156,3159],[3210,3213],[3210,3213],[3264,3267],[3264,3267],[3320,3323],[3320,3323],[3369,3372],[3369,3372],[3417,3420],[3417,3420],[3467,3470],[3467,3470],[3979,3982],[3979,3982],[4010,4013],[4010,4013],[4197,4200],[4197,4200],[4408,4411],[4408,4411],[4492,4495],[4492,4495],[1355,1358],[1355,1358],[2012,2015],[2012,2015],[2038,2041],[2038,2041],[2258,2261],[2258,2261],[2284,2287],[2284,2287],[2944,2947],[2944,2947],[2996,2999],[2996,2999],[3054,3057],[3054,3057],[3113,3116],[3113,3116],[3139,3142],[3139,3142],[3732,3735],[3732,3735],[4372,4375],[4372,4375],[9826,9829],[9826,9829],[9885,9888],[9885,9888],[11847,11850],[11847,11850],[11902,11905],[11902,11905],[11948,11951],[11948,11951],[11994,11997],[11994,11997],[12069,12072],[12069,12072],[12891,12894],[12891,12894],[13088,13091],[13088,13091],[13174,13177],[13174,13177],[13224,13227],[13224,13227],[13280,13283],[13280,13283],[13943,13946],[13943,13946],[14742,14745],[14742,14745],[15251,15254],[15251,15254],[15922,15925],[15922,15925],[15995,15998],[15995,15998],[16040,16043],[16040,16043],[16563,16566],[16563,16566],[17356,17359],[17356,17359],[17378,17381],[17378,17381],[17430,17433],[17430,17433],[17452,17455],[17452,17455],[17521,17524],[17521,17524],[17582,17585],[17582,17585],[17917,17920],[17917,17920],[17979,17982],[17979,17982],[18400,18403],[18400,18403],[18771,18774],[18771,18774],[19346,19349],[19346,19349],[19523,19526],[19523,19526],[19584,19587],[19584,19587],[20462,20465],[20462,20465],[20543,20546],[20543,20546],[21272,21275],[21272,21275],[21327,21330],[21327,21330],[21427,21430],[21427,21430],[21543,21546],[21543,21546],[21925,21928],[21925,21928],[21947,21950],[21947,21950],[22004,22007],[22004,22007],[22059,22062],[22059,22062],[22424,22427],[22424,22427],[22480,22483],[22480,22483],[22843,22846],[22843,22846],[22865,22868],[22865,22868],[22922,22925],[22922,22925],[22977,22980],[22977,22980],[26377,26380],[26377,26380],[27523,27526],[27523,27526],[28098,28101],[28098,28101],[29539,29542],[29539,29542],[31352,31355],[31352,31355],[32492,32495],[32492,32495],[33971,33974],[33971,33974],[34032,34035],[34032,34035],[34090,34093],[34090,34093],[34173,34176],[34173,34176],[34923,34926],[34923,34926],[35215,35218],[35215,35218],[35797,35800],[35797,35800],[36431,36434],[36431,36434],[37638,37641],[37638,37641],[38175,38178],[38175,38178],[11229,11232],[11229,11232],[11975,11978],[11975,11978],[13087,13090],[13087,13090],[13171,13174],[13171,13174],[13255,13258],[13255,13258],[13337,13340],[13337,13340],[15207,15210],[15207,15210],[15414,15417],[15414,15417],[16036,16039],[16036,16039],[16941,16944],[16941,16944],[17499,17502],[17499,17502],[17539,17542],[17539,17542],[17940,17943],[17940,17943],[18632,18635],[18632,18635],[19537,19540],[19537,19540],[20145,20148],[20145,20148],[21279,21282],[21279,21282],[24046,24049],[24046,24049],[25674,25677],[25674,25677],[27083,27086],[27083,27086],[28501,28504],[28501,28504],[28923,28926],[28923,28926],[29009,29012],[29009,29012],[29071,29074],[29071,29074],[29131,29134],[29131,29134],[29195,29198],[29195,29198],[29996,29999],[29996,29999],[31175,31178],[31175,31178],[31224,31227],[31224,31227],[32892,32895],[32892,32895],[32928,32931],[32928,32931],[33151,33154],[33151,33154],[33236,33239],[33236,33239],[33300,33303],[33300,33303],[33714,33717],[33714,33717],[33750,33753],[33750,33753],[33832,33835],[33832,33835],[33917,33920],[33917,33920],[33981,33984],[33981,33984],[34635,34638],[34635,34638],[34795,34798],[34795,34798],[34945,34948],[34945,34948],[35044,35047],[35044,35047],[35680,35683],[35680,35683],[36071,36074],[36071,36074],[36526,36529],[36526,36529],[36652,36655],[36652,36655],[36972,36975],[36972,36975],[37106,37109],[37106,37109],[37163,37166],[37163,37166],[37535,37538],[37535,37538],[37709,37712],[37709,37712],[37774,37777],[37774,37777],[38377,38380],[38377,38380],[39125,39128],[39125,39128],[39968,39971],[39968,39971],[40894,40897],[40894,40897],[40986,40989],[40986,40989],[41240,41243],[41240,41243],[41945,41948],[41945,41948],[42473,42476],[42473,42476],[42539,42542],[42539,42542],[42559,42562],[42559,42562],[48056,48059],[48056,48059],[50809,50812],[50809,50812],[51128,51131],[51128,51131],[51176,51179],[51176,51179],[53205,53208],[53205,53208],[54427,54430],[54427,54430],[54888,54891],[54888,54891],[55346,55349],[55346,55349],[55956,55959],[55956,55959],[56810,56813],[56810,56813],[57357,57360],[57357,57360],[3279,3282],[3279,3282],[4440,4443],[4440,4443],[5039,5042],[5039,5042],[5647,5650],[5647,5650],[6676,6679],[6676,6679],[6814,6817],[6814,6817],[14473,14476],[14473,14476],[15454,15457],[15454,15457],[16065,16068],[16065,16068],[17418,17421],[17418,17421],[24991,24994],[24991,24994],[28197,28200],[28197,28200],[28374,28377],[28374,28377],[29706,29709],[29706,29709],[29820,29823],[29820,29823],[30003,30006],[30003,30006],[30145,30148],[30145,30148],[2053,2056],[2053,2056],[2139,2142],[2139,2142],[2564,2567],[2564,2567],[2647,2650],[2647,2650],[3039,3042],[3039,3042],[3089,3092],[3089,3092],[993,996],[993,996],[1081,1084],[1081,1084],[1116,1119],[1116,1119],[1243,1246],[1243,1246],[1872,1875],[1872,1875],[2033,2036],[2033,2036],[1520,1523],[1520,1523],[1563,1566],[1563,1566],[1585,1588],[1585,1588],[1632,1635],[1632,1635],[1654,1657],[1654,1657],[1730,1733],[1730,1733],[1815,1818],[1815,1818],[1894,1897],[1894,1897],[1974,1977],[1974,1977],[2001,2004],[2001,2004],[2129,2132],[2129,2132],[2205,2208],[2205,2208],[2667,2670],[2667,2670],[2712,2715],[2712,2715],[2731,2734],[2731,2734],[2784,2787],[2784,2787],[2850,2853],[2850,2853],[1066,1069],[1066,1069],[1112,1115],[1112,1115],[1134,1137],[1134,1137],[1181,1184],[1181,1184],[1203,1206],[1203,1206],[1262,1265],[1262,1265],[1313,1316],[1313,1316],[1383,1386],[1383,1386],[1464,1467],[1464,1467],[1517,1520],[1517,1520],[1543,1546],[1543,1546],[2733,2736],[2733,2736],[2777,2780],[2777,2780],[2829,2832],[2829,2832],[2845,2848],[2845,2848],[2910,2913],[2910,2913],[2929,2932],[2929,2932],[3003,3006],[3003,3006],[3088,3091],[3088,3091],[3115,3118],[3115,3118],[3212,3215],[3212,3215],[3311,3314],[3311,3314],[3338,3341],[3338,3341],[3447,3450],[3447,3450],[3534,3537],[3534,3537],[3561,3564],[3561,3564],[3606,3609],[3606,3609],[3628,3631],[3628,3631],[3696,3699],[3696,3699],[3752,3755],[3752,3755],[3799,3802],[3799,3802],[3821,3824],[3821,3824],[3877,3880],[3877,3880],[3955,3958],[3955,3958],[4322,4325],[4322,4325],[4366,4369],[4366,4369],[4425,4428],[4425,4428],[4476,4479],[4476,4479],[4540,4543],[4540,4543],[5502,5505],[5502,5505],[6343,6346],[6343,6346],[10714,10717],[10714,10717],[11673,11676],[11673,11676],[12099,12102],[12099,12102],[13064,13067],[13064,13067],[13186,13189],[13186,13189],[13357,13360],[13357,13360],[13943,13946],[13943,13946],[14287,14290],[14287,14290],[14658,14661],[14658,14661],[15017,15020],[15017,15020],[15158,15161],[15158,15161],[15277,15280],[15277,15280],[16022,16025],[16022,16025],[16385,16388],[16385,16388],[19538,19541],[19538,19541],[20481,20484],[20481,20484],[20844,20847],[20844,20847],[21594,21597],[21594,21597],[21719,21722],[21719,21722],[25256,25259],[25256,25259],[26412,26415],[26412,26415],[27396,27399],[27396,27399],[28208,28211],[28208,28211],[28367,28370],[28367,28370],[29760,29763],[29760,29763],[30094,30097],[30094,30097],[31109,31112],[31109,31112],[31455,31458],[31455,31458],[33184,33187],[33184,33187],[34094,34097],[34094,34097],[34834,34837],[34834,34837],[34920,34923],[34920,34923],[36397,36400],[36397,36400],[37104,37107],[37104,37107],[11699,11702],[11699,11702],[11735,11738],[11735,11738],[11757,11760],[11757,11760],[11794,11797],[11794,11797],[11816,11819],[11816,11819],[11877,11880],[11877,11880],[11945,11948],[11945,11948],[12002,12005],[12002,12005],[12067,12070],[12067,12070],[12128,12131],[12128,12131],[12177,12180],[12177,12180],[12203,12206],[12203,12206],[12273,12276],[12273,12276],[12334,12337],[12334,12337],[1625,1628],[1625,1628],[1671,1674],[1671,1674],[1694,1697],[1694,1697],[2943,2946],[2943,2946],[2989,2992],[2989,2992],[3012,3015],[3012,3015],[4275,4278],[4275,4278],[4321,4324],[4321,4324],[4344,4347],[4344,4347],[5286,5289],[5286,5289],[6193,6196],[6193,6196],[6744,6747],[6744,6747],[8887,8890],[8887,8890],[8901,8904],[8901,8904],[8907,8910],[8907,8910],[8928,8931],[8928,8931],[2153,2156],[2153,2156],[2383,2386],[2383,2386],[2420,2423],[2420,2423],[2900,2903],[2900,2903],[2937,2940],[2937,2940],[4012,4015],[4012,4015],[4205,4208],[4205,4208],[4468,4471],[4468,4471],[4505,4508],[4505,4508],[868,871],[868,871],[1184,1187],[1184,1187],[1397,1400],[1397,1400],[1424,1427],[1424,1427],[1594,1597],[1594,1597],[1772,1775],[1772,1775],[1953,1956],[1953,1956],[2076,2079],[2076,2079],[2278,2281],[2278,2281],[2421,2424],[2421,2424],[2654,2657],[2654,2657],[6815,6818],[6815,6818],[7060,7063],[7060,7063],[7299,7302],[7299,7302],[7379,7382],[7379,7382],[7543,7546],[7543,7546],[7273,7276],[7273,7276],[7379,7382],[7379,7382],[7403,7406],[7403,7406],[7509,7512],[7509,7512],[7533,7536],[7533,7536],[10041,10044],[10041,10044],[10253,10256],[10253,10256],[10307,10310],[10307,10310],[10356,10359],[10356,10359],[10401,10404],[10401,10404],[10445,10448],[10445,10448],[10494,10497],[10494,10497],[10542,10545],[10542,10545],[10596,10599],[10596,10599],[10652,10655],[10652,10655],[10706,10709],[10706,10709],[10761,10764],[10761,10764],[11197,11200],[11197,11200],[11852,11855],[11852,11855],[11947,11950],[11947,11950],[12860,12863],[12860,12863],[12955,12958],[12955,12958],[514,517],[514,517],[617,620],[617,620],[642,645],[642,645],[1391,1394],[1391,1394],[1946,1949],[1946,1949],[3464,3467],[3464,3467],[3650,3653],[3650,3653],[4490,4493],[4490,4493],[5032,5035],[5032,5035],[5789,5792],[5789,5792],[7049,7052],[7049,7052],[8579,8582],[8579,8582],[10025,10028],[10025,10028],[11736,11739],[11736,11739],[12382,12385],[12382,12385],[13391,13394],[13391,13394],[15872,15875],[15872,15875],[16560,16563],[16560,16563],[17546,17549],[17546,17549],[18608,18611],[18608,18611],[19125,19128],[19125,19128],[19784,19787],[19784,19787],[20485,20488],[20485,20488],[20806,20809],[20806,20809],[21242,21245],[21242,21245],[23987,23990],[23987,23990],[24705,24708],[24705,24708],[25079,25082],[25079,25082],[25423,25426],[25423,25426],[25785,25788],[25785,25788],[26327,26330],[26327,26330],[26727,26730],[26727,26730],[27260,27263],[27260,27263],[27657,27660],[27657,27660],[28683,28686],[28683,28686],[29015,29018],[29015,29018],[29462,29465],[29462,29465],[29651,29654],[29651,29654],[30003,30006],[30003,30006],[31344,31347],[31344,31347],[32134,32137],[32134,32137],[32869,32872],[32869,32872],[33966,33969],[33966,33969],[34515,34518],[34515,34518],[34911,34914],[34911,34914],[34990,34993],[34990,34993],[36229,36232],[36229,36232],[37033,37036],[37033,37036],[37477,37480],[37477,37480],[38063,38066],[38063,38066],[43273,43276],[43273,43276],[43971,43974],[43971,43974],[44889,44892],[44889,44892],[45128,45131],[45128,45131],[45337,45340],[45337,45340],[45597,45600],[45597,45600],[45880,45883],[45880,45883],[46589,46592],[46589,46592],[47247,47250],[47247,47250],[1269,1272],[1269,1272],[2013,2016],[2013,2016],[1909,1912],[1909,1912],[2373,2376],[2373,2376],[2921,2924],[2921,2924],[3355,3358],[3355,3358],[1666,1669],[1666,1669],[1659,1662],[1659,1662],[1913,1916],[1913,1916],[3301,3304],[3301,3304],[3741,3744],[3741,3744],[892,895],[892,895],[1042,1045],[1042,1045],[1081,1084],[1081,1084],[3947,3950],[3947,3950],[4115,4118],[4115,4118],[4821,4824],[4821,4824],[4873,4876],[4873,4876],[5664,5667],[5664,5667],[6689,6692],[6689,6692],[6890,6893],[6890,6893],[7644,7647],[7644,7647],[8767,8770],[8767,8770],[8939,8942],[8939,8942],[10246,10249],[10246,10249],[11581,11584],[11581,11584],[11625,11628],[11625,11628],[12748,12751],[12748,12751],[12800,12803],[12800,12803],[14194,14197],[14194,14197],[14246,14249],[14246,14249],[14352,14355],[14352,14355],[14476,14479],[14476,14479],[15779,15782],[15779,15782],[17421,17424],[17421,17424],[17539,17542],[17539,17542],[17615,17618],[17615,17618],[18410,18413],[18410,18413],[18543,18546],[18543,18546],[19472,19475],[19472,19475],[19602,19605],[19602,19605],[20519,20522],[20519,20522],[21905,21908],[21905,21908],[22208,22211],[22208,22211],[22936,22939],[22936,22939],[22988,22991],[22988,22991],[23757,23760],[23757,23760],[24536,24539],[24536,24539],[24590,24593],[24590,24593],[26067,26070],[26067,26070],[26232,26235],[26232,26235],[26423,26426],[26423,26426],[26549,26552],[26549,26552],[27209,27212],[27209,27212],[27416,27419],[27416,27419],[27636,27639],[27636,27639],[27842,27845],[27842,27845],[27943,27946],[27943,27946],[29398,29401],[29398,29401],[29963,29966],[29963,29966],[30927,30930],[30927,30930],[31057,31060],[31057,31060],[31748,31751],[31748,31751],[31804,31807],[31804,31807],[32687,32690],[32687,32690],[32969,32972],[32969,32972],[33645,33648],[33645,33648],[34099,34102],[34099,34102],[34869,34872],[34869,34872],[35351,35354],[35351,35354],[36416,36419],[36416,36419],[37170,37173],[37170,37173],[37695,37698],[37695,37698],[38561,38564],[38561,38564],[40970,40973],[40970,40973],[42404,42407],[42404,42407],[43688,43691],[43688,43691],[44729,44732],[44729,44732],[45663,45666],[45663,45666],[2017,2020],[2017,2020],[9366,9369],[9366,9369],[1866,1869],[1866,1869],[1940,1943],[1940,1943],[975,978],[975,978],[1005,1008],[1005,1008],[1060,1063],[1060,1063],[1200,1203],[1200,1203],[1594,1597],[1594,1597]] \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 542f44b973..2439c63a94 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1213,8 +1213,10 @@ jobs: cache: npm - uses: ./.github/actions/npm-ci-retry - run: npm run check:node-runtime - # (tsx/esm = QW-b; o alinhamento de ESCOPO do integration com o npm script fica p/ follow-up) - - run: node --import tsx/esm --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=${{ matrix.shard }}/2 tests/integration/*.test.ts + - name: Integration tests (shard ${{ matrix.shard }}/2) + env: + TEST_SHARD: ${{ matrix.shard }}/2 + run: npm run test:integration:ci test-security: name: Security Tests diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 25fb72db24..b32487da27 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -22,10 +22,10 @@ jobs: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - - uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 + - uses: github/codeql-action/init@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4 with: languages: javascript-typescript queries: security-extended - - uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4.37.3 + - uses: github/codeql-action/analyze@f205ea1c3313d32999d8d6a48b4f6530d4437b38 # v4.37.4 with: category: "/language:javascript-typescript" diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index 4ec8ae2dab..9cca65ac09 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -4,6 +4,7 @@ on: push: branches: - main + - "release/v*" tags: - "v*" paths-ignore: @@ -57,39 +58,20 @@ jobs: REF_TYPE: ${{ github.ref_type }} INPUT_VERSION: ${{ inputs.version }} PROMOTE_INPUT: ${{ inputs.promote_latest }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} run: | set -euo pipefail - # 1) Resolve version string from the trigger (all inputs come via env). - case "$EVENT_NAME" in - workflow_dispatch) - VERSION="${INPUT_VERSION#v}" - ;; - push) - if [ "$REF_TYPE" = "tag" ]; then - VERSION="${REF_NAME#v}" - else - # Push to main → build & tag as `main` only. Never touch :latest. - VERSION="main" - fi - ;; - release) - VERSION="${REF_NAME#v}" - ;; - *) - VERSION="${REF_NAME#v}" - ;; - esac - # Sanity-check: only allow [A-Za-z0-9._-] in VERSION (defense in depth). - if ! printf '%s' "$VERSION" | grep -qE '^[A-Za-z0-9._-]+$'; then - echo "Refusing to use unsafe VERSION value: $VERSION" >&2 - exit 1 - fi + # 1) Resolve version/channel from the trigger. Only the current default + # release branch publishes the mutable `next` channel; main keeps `main`. + VERSION=$(bash scripts/ci/resolve-docker-publish-version.sh \ + "$EVENT_NAME" "$REF_TYPE" "$REF_NAME" "$INPUT_VERSION" "$DEFAULT_BRANCH") echo "version=$VERSION" >> "$GITHUB_OUTPUT" - # 2) Decide whether to promote :latest. + # 2) Decide whether to promote :latest. Floating channels are never + # eligible, and the helper independently fails closed for non-semver. PROMOTE="false" - if [ "$VERSION" = "main" ]; then + if [ "$VERSION" = "main" ] || [ "$VERSION" = "next" ]; then PROMOTE="false" elif printf '%s' "$VERSION" | grep -qE -- '-(rc|alpha|beta|pre|next)'; then echo "Pre-release identifier detected — skipping :latest." @@ -109,10 +91,10 @@ jobs: fi echo "promote_latest=$PROMOTE" >> "$GITHUB_OUTPUT" - # 3) Skip if this exact version is already published in Docker Hub. - # `main` is always rebuilt (mutable floating tag). + # 3) Skip immutable version tags that already exist. Floating `main` + # and `next` channels are intentionally rebuilt on every matching push. SKIP="false" - if [ "$VERSION" != "main" ]; then + if [ "$VERSION" != "main" ] && [ "$VERSION" != "next" ]; then if docker manifest inspect "diegosouzapw/omniroute:${VERSION}" >/dev/null 2>&1; then echo "Image diegosouzapw/omniroute:${VERSION} already exists on Docker Hub — skipping rebuild." SKIP="true" @@ -155,13 +137,13 @@ jobs: uses: docker/setup-buildx-action@v4 - name: Login to Docker Hub - uses: docker/login-action@v4.5.2 + uses: docker/login-action@v4.6.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry - uses: docker/login-action@v4.5.2 + uses: docker/login-action@v4.6.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -255,13 +237,13 @@ jobs: uses: docker/setup-buildx-action@v4 - name: Login to Docker Hub - uses: docker/login-action@v4.5.2 + uses: docker/login-action@v4.6.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - name: Login to GitHub Container Registry - uses: docker/login-action@v4.5.2 + uses: docker/login-action@v4.6.0 with: registry: ghcr.io username: ${{ github.actor }} @@ -390,14 +372,14 @@ jobs: - name: Upload Trivy SARIF to Security tab if: needs.prepare.outputs.version != 'main' continue-on-error: true - uses: github/codeql-action/upload-sarif@v4.37.3 + uses: github/codeql-action/upload-sarif@v4.37.4 with: sarif_file: trivy-results.sarif category: trivy-image - name: Update Docker Hub description # Only refresh README/description when we actually promote :latest - # (avoids overwriting from main pushes or back-fill builds). + # (avoids overwriting from main, next, or back-fill builds). if: needs.prepare.outputs.promote_latest == 'true' uses: peter-evans/dockerhub-description@v5 with: diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index 7a167afcd0..76a116287e 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -271,6 +271,10 @@ jobs: # covered by typecheck:core's curated allowlist. See check-dashboard-typecheck.mjs. - name: Typecheck (dashboard) run: npm run check:dashboard-typecheck + # #8781: open-sse workspace typecheck gate — the workspace imports @/ which + # escapes to src/ via undeclared path aliases. See check-open-sse-typecheck.mjs. + - name: Typecheck (open-sse) + run: npm run check:open-sse-typecheck # WS4.2 (v3.8.49 plan): TypeScript 7 native-compiler SHADOW — advisory only. # TS7 went GA 2026-07-08 with 8-12x type-check speedups; its Compiler API only # arrives in 7.1, so typescript-eslint / type-coverage / Stryker stay on 6.x diff --git a/.gitignore b/.gitignore index 4636007b51..b06010eb17 100644 --- a/.gitignore +++ b/.gitignore @@ -72,6 +72,7 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* !.env.example +!.env.devin-bridge.example !.env.homolog.example # Provider API keys (never commit) *.api-key @@ -209,6 +210,8 @@ scripts/i18n/_pending-keys.json .agents/ .antigravitycli/ .claude/ +!tests/fixtures/devin-bridge/e2e-workspace/.claude/ +!tests/fixtures/devin-bridge/e2e-workspace/.claude/** # PR Reviews and local feedback files pr_reviews*.json @@ -248,6 +251,8 @@ _artifacts/ # CI/local quality artifacts (eslint-results.json, quality-ratchet.md, etc.) .artifacts/ +# Isolated Devin bridge workspaces, evidence, and test databases +.sandbox/ # Homologation E2E suite (npm run homolog) — real-environment credentials + report output .env.homolog diff --git a/@omniroute/opencode-plugin/README.md b/@omniroute/opencode-plugin/README.md index 5f09259716..570ff4285a 100644 --- a/@omniroute/opencode-plugin/README.md +++ b/@omniroute/opencode-plugin/README.md @@ -30,7 +30,7 @@ omniroute setup opencode --auth # 3. Restart OpenCode — /models lists the full live catalog ``` -The `--auth` flag runs `opencode auth login --provider omniroute` automatically. +The `--auth` flag runs `opencode auth login --provider opencode-omniroute` automatically. Use `--base-url` to point at a non-default OmniRoute address: ```sh @@ -84,7 +84,7 @@ Peer dep: `@opencode-ai/plugin` (managed by your OpenCode install). ``` ```sh -opencode auth login --provider omniroute +opencode auth login --provider opencode-omniroute # prompts for the OmniRoute API key, writes to ~/.local/share/opencode/auth.json ``` @@ -164,8 +164,8 @@ Then in `~/.config/opencode/opencode.json` reference each directory by absolute Paths are relative to `~/.config/opencode/`. Each entry now resolves to a distinct module file, so OC loads them as two separate plugin instances. Authenticate each: ```sh -opencode auth login --provider omniroute -opencode auth login --provider omniroute-preprod +opencode auth login --provider opencode-omniroute +opencode auth login --provider opencode-omniroute-preprod ``` Each entry gets its own provider id, its own model picker entry, its own slot in `auth.json`, and its own TTL cache. Closures are isolated per plugin instance — no cross-talk. @@ -196,6 +196,7 @@ npm install --prefix ~/.config/opencode/plugins/omniroute-opencode-plugin-prepro | Compression pipeline tags | Combo names get tagged with their compression pipeline (e.g. `Combo: claude-primary [rtk🟡 → caveman🟠]`) when `features.compressionMetadata: true`. Intensity tokens render as a traffic-light emoji: 🟢 lite/minimal · 🟡 standard · 🟠 aggressive/full · 🔴 ultra | both hooks | | Provider-tag prefix | Prepend short upstream-provider label to enriched names (e.g. `Claude - Claude Opus 4.7` vs `Kiro - Claude Opus 4.7`, `GHM - GPT 5`) so same-id models routed via different upstream connections group visibly in the picker (default-on, opt-out via `features.providerTag: false`) | both hooks | | Usable-only filter | Filter to providers with at least one healthy connection in `/api/providers` (opt-in via `features.usableOnly`) | both hooks | +| Model allowlist/blocklist | Curate the model picker to a fixed set of IDs via `features.visibleModels` (allowlist) and/or `features.hiddenModels` (blocklist). Bare suffixes like `claude-opus-4-7` match any `{prefix}/claude-opus-4-7`. Both compose with `usableOnly` (all filters AND together). Blocklist wins over allowlist (deny takes precedence) | both hooks | | Disk-cache fallback | Last-known-good catalog persisted to disk; hydrates on a cold start when `/v1/models` is unreachable (default-on, opt-out via `features.diskCache: false`) | `config` | | Bearer injection + suffix-spoof guard | Adds `Authorization` on baseURL-matched requests only | `auth.loader.fetch` | | Gemini schema sanitization | Strips `$schema`/`$ref`/`additionalProperties` for `gemini-*`/`google-vertex-gemini/*` | `auth.loader.fetch` wrap | @@ -226,6 +227,8 @@ Every field is optional. Defaults mirror v0.1.0 behaviour so existing `opencode. | `compressionMetadata` | `boolean` | `false` | Pull `/api/context/combos` so combo names get tagged with their compression pipeline, e.g. `Combo: claude-primary [rtk🟡 → caveman🟠]`. Intensity tokens render as traffic-light emoji (🟢 lite/minimal · 🟡 standard · 🟠 aggressive/full · 🔴 ultra) so the picker advertises "how compressed" each combo is at a glance. | | `providerTag` | `boolean` | `true` | Prepend a short upstream-provider label to the enriched display name with `" - "` separator, so `cc/claude-opus-4-7 → Claude - Claude Opus 4.7` differs visibly from `kr/claude-opus-4-7 → Kiro - Claude Opus 4.7` in the OC TUI model picker. Label resolution: use `/api/pricing/models[].name` verbatim when ≤8 chars (e.g. `Claude`, `Kiro`, `Codex`, `Qwen`), otherwise fall back to `UPPER(alias)` (e.g. `GitHub Models` → `GHM`, `Gemini` → `GEMINI`). Idempotent. Combos intentionally skipped (the `Combo:` prefix already conveys multi-upstream). | | `usableOnly` | `boolean` | `false` | Read `/api/providers` and filter the catalog to providers that have at least one connection with `isActive: true` AND `testStatus: 'active'`. Subtract-filter semantics: providers unknown to BOTH the pricing-models catalog AND the connection table pass through (so synthetic prefixes like `agentrouter/*` survive). On fetch failure the filter is disabled for the refresh — never hides the whole catalog. | +| `visibleModels` | `string[]` | _unset_ | Allowlist — when set and non-empty, only models whose raw `/v1/models` ID matches are emitted. Bare IDs (no slash, e.g. `claude-opus-4-7`) match any `{prefix}/claude-opus-4-7`; full IDs (e.g. `cc/claude-opus-4-7`) match exactly. Composes with `usableOnly` and `hiddenModels` (all filters AND together). Unset or empty = no filter. | +| `hiddenModels` | `string[]` | _unset_ | Blocklist — models whose raw ID matches are dropped. Same matching rules as `visibleModels`. When a model is in both `visibleModels` and `hiddenModels`, the blocklist wins (deny takes precedence). Composes with `usableOnly` and `visibleModels` (all filters AND together). Unset or empty = no filter. | | `diskCache` | `boolean` | `true` | Persist the last successful `/v1/models` + `/api/combos` + enrichment + connections + compression snapshot to `${OPENCODE_DATA_DIR ?? ~/.local/share/opencode}/plugins/omniroute-.json`. On a subsequent cold start where `/v1/models` throws (network down / IP whitelist drop / 5xx) the static block hydrates from the snapshot so OC's model picker survives offline. Soft-fail on read/write — never blocks publishing. | | `geminiSanitization` | `boolean` | `true` | Strip `$schema`/`$ref`/`additionalProperties` from tool params when the model id matches `gemini` | | `mcpAutoEmit` | `boolean` | `false` | Auto-write an `mcp.` remote entry into the OC config pointing at `/api/mcp/stream` with the resolved Bearer token | @@ -298,7 +301,45 @@ If you want a narrower-scoped Bearer for MCP (different from the chat/inference - `compressionMetadata: true` annotates combo display names with their pipeline using traffic-light emoji for intensity (e.g. `Combo: claude-primary [rtk🟡 → caveman🟠]`) so the picker advertises which compression each combo applies and how heavy it is at a glance. Palette: 🟢 lite/minimal · 🟡 standard · 🟠 aggressive/full · 🔴 ultra. Unknown intensities fall through to raw text (`[rtk:custom-thing]`) so the plugin never hides a value OmniRoute knows but the plugin doesn't. - `providerTag: true` (default) prepends a short upstream-provider label so the picker shows `Claude - Claude Opus 4.7` for `cc/claude-opus-4-7`, `Kiro - Claude Opus 4.7` for `kr/claude-opus-4-7`, and `GHM - GPT 5` for `ghm/gpt-5` (slot.name `GitHub Models` > 8 chars → abbreviated). Critical when the same model id is sold through multiple upstream connections with different cost/auth/rate-limit profiles. Set to `false` to keep the pre-v3.8.3 unsuffixed format. -## Comparison vs `@omniroute/opencode-provider` +#### Example — curating the model picker (allowlist + blocklist) + +A typical OmniRoute instance serves 600+ models. The OpenCode TUI/CLI picker becomes unusable when you need to scroll through hundreds of entries to find the ~30 models you actually use. `visibleModels` and `hiddenModels` let you curate the picker to a fixed set of model IDs that persists in `opencode.json` across config resets. + +```jsonc +{ + "plugin": [ + [ + "@omniroute/opencode-plugin", + { + "providerId": "omniroute", + "baseURL": "https://or.example.com", + "features": { + "combos": true, + "enrichment": true, + "usableOnly": true, + "visibleModels": [ + "claude-opus-4-7", // bare suffix: matches cc/claude-opus-4-7, kr/claude-opus-4-7, etc. + "cc/claude-sonnet-4-6", // exact: only the cc/ alias + "gemini-2.5-pro", + "gpt-5", + "o3", + "o3-pro", + "o4-mini", + ], + "hiddenModels": [ + "o3-mini", // hide the mini variant even if visibleModels is unset + ], + }, + }, + ], + ], +} +``` + +- `visibleModels` is an allowlist — only models whose raw ID matches are emitted. Bare IDs (no slash) match any provider prefix; full IDs (with slash) match exactly. +- `hiddenModels` is a blocklist — listed models are dropped. When a model is in both lists, the blocklist wins (deny takes precedence). +- Both compose with `usableOnly` (all filters AND together: a model must pass usableOnly AND visibleModels AND not be in hiddenModels). +- Unset or empty = no filter (current behavior). [`@omniroute/opencode-provider`](https://github.com/diegosouzapw/OmniRoute/tree/main/%40omniroute/opencode-provider) is the existing config-generator package — it writes a frozen `provider.` block into `opencode.json` at build time. This plugin is the runtime integration. diff --git a/@omniroute/opencode-plugin/package-lock.json b/@omniroute/opencode-plugin/package-lock.json index b75338eb09..82fac18dc1 100644 --- a/@omniroute/opencode-plugin/package-lock.json +++ b/@omniroute/opencode-plugin/package-lock.json @@ -1,12 +1,12 @@ { "name": "@omniroute/opencode-plugin", - "version": "0.2.0", + "version": "0.2.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@omniroute/opencode-plugin", - "version": "0.2.0", + "version": "0.2.1", "license": "MIT", "dependencies": { "zod": "^4.4.3" diff --git a/@omniroute/opencode-plugin/package.json b/@omniroute/opencode-plugin/package.json index 97ab734d4a..848bca4b3a 100644 --- a/@omniroute/opencode-plugin/package.json +++ b/@omniroute/opencode-plugin/package.json @@ -23,7 +23,7 @@ "scripts": { "build": "tsup", "clean": "rm -rf dist", - "test": "node --import tsx/esm --test tests/scaffold.test.ts tests/auth.test.ts tests/options-schema.test.ts tests/multi-instance.test.ts tests/fetch-interceptor.test.ts tests/provider.test.ts tests/gemini-sanitize.test.ts tests/combos.test.ts tests/config-shim.test.ts tests/features.test.ts tests/feature-defaults.test.ts tests/usable-combo.test.ts tests/disk-snapshot-perms.test.ts tests/fork-features.test.ts tests/auto-combo-context.test.ts tests/provider-id-routing.test.ts tests/management-read-token.test.ts tests/auto-sync.test.ts", + "test": "node --import tsx/esm --test tests/scaffold.test.ts tests/auth.test.ts tests/options-schema.test.ts tests/multi-instance.test.ts tests/fetch-interceptor.test.ts tests/provider.test.ts tests/gemini-sanitize.test.ts tests/combos.test.ts tests/config-shim.test.ts tests/features.test.ts tests/feature-defaults.test.ts tests/usable-combo.test.ts tests/disk-snapshot-perms.test.ts tests/fork-features.test.ts tests/auto-combo-context.test.ts tests/provider-id-routing.test.ts tests/management-read-token.test.ts tests/auto-sync.test.ts tests/model-allowlist.test.ts", "prepublishOnly": "npm run clean && npm run build && npm test" }, "keywords": [ diff --git a/@omniroute/opencode-plugin/src/index.ts b/@omniroute/opencode-plugin/src/index.ts index f54adb8d50..681b2fe3d0 100644 --- a/@omniroute/opencode-plugin/src/index.ts +++ b/@omniroute/opencode-plugin/src/index.ts @@ -177,6 +177,8 @@ const featuresSchema = z mcpToken: z.string().min(1).optional(), fetchInterceptor: z.boolean().optional(), usableOnly: z.boolean().optional(), + visibleModels: z.array(z.string().min(1)).optional(), + hiddenModels: z.array(z.string().min(1)).optional(), diskCache: z.boolean().optional(), providerTag: z.boolean().optional(), debugLog: z.boolean().optional(), @@ -241,6 +243,11 @@ export const OMNIROUTE_FEATURE_DEFAULTS = { // default-OFF (read sites use `features.X === true`) compressionMetadata: false, usableOnly: false, + // Array flags: unset/empty = no filter. These are not boolean toggles — + // they are operator-curated model-ID lists applied in the dynamic and static + // hooks alongside usableOnly (all filters AND together). + // visibleModels: undefined, // allowlist — only listed IDs pass + // hiddenModels: undefined, // blocklist — listed IDs are dropped mcpAutoEmit: false, debugLog: false, startupDebug: false, @@ -330,7 +337,10 @@ function trimLeadingDashes(value: string): string { * sees a consistent identifier. */ export function resolveOmniRoutePluginOptions(opts?: OmniRoutePluginOptions): Required< - Pick + Pick< + OmniRoutePluginOptions, + "providerId" | "displayName" | "modelCacheTtl" | "autoSyncIntervalMs" + > > & { /** * #6859: the UNPREFIXED provider id ("omniroute", "omniroute-preprod", …). @@ -621,7 +631,7 @@ export function createOmniRouteAuthHook(opts?: OmniRoutePluginOptions): AuthHook */ export function invalidateOmniRouteFetchCache( cache: OmniRouteFetchCache, - baseURL?: string, + baseURL?: string ): number { if (!baseURL) { const n = cache.size; @@ -645,7 +655,7 @@ export function invalidateOmniRouteFetchCache( */ export async function resolveOmniRouteRuntimeAuth( resolved: ResolvedOmniRoutePluginOptions, - readAuthJson?: OmniRouteReadAuthJson, + readAuthJson?: OmniRouteReadAuthJson ): Promise<{ apiKey: string; baseURL: string; managementReadToken: string } | null> { const reader = readAuthJson ?? defaultReadAuthJson; let authJson: AuthJsonShape | undefined | null; @@ -672,7 +682,7 @@ export async function resolveOmniRouteRuntimeAuth( e && (e as { type?: unknown }).type === "api" && typeof (e as { key?: unknown }).key === "string" && - ((e as { key: string }).key).length > 0 + (e as { key: string }).key.length > 0 ) { entry = e as AuthJsonApiEntry; break; @@ -737,7 +747,7 @@ export async function forceSyncOmniRouteModels(args: { const auth = await resolveOmniRouteRuntimeAuth( resolved, - args.readAuthJson ?? defaultReadAuthJson, + args.readAuthJson ?? defaultReadAuthJson ); if (!auth) { return { @@ -795,7 +805,7 @@ export async function forceSyncOmniRouteModels(args: { rawCompressionCombos = await compressionMetaFetcher( auth.baseURL, auth.managementReadToken, - 10_000, + 10_000 ); } catch { rawCompressionCombos = []; @@ -820,10 +830,7 @@ export async function forceSyncOmniRouteModels(args: { rawConnections, expiresAt: t + resolved.modelCacheTtl, }; - const cacheKey = modelsCacheKey( - auth.baseURL, - `${auth.apiKey}\0${auth.managementReadToken}`, - ); + const cacheKey = modelsCacheKey(auth.baseURL, `${auth.apiKey}\0${auth.managementReadToken}`); cache.set(cacheKey, entry); if (wantDiskCache) { @@ -831,7 +838,7 @@ export async function forceSyncOmniRouteModels(args: { const fingerprint = diskSnapshotIdentityFingerprint( auth.baseURL, auth.apiKey, - auth.managementReadToken, + auth.managementReadToken ); const { expiresAt: _expiresAt, ...diskEntry } = entry; await defaultDiskSnapshotWriter(resolved.providerId, diskEntry, fingerprint); @@ -843,7 +850,7 @@ export async function forceSyncOmniRouteModels(args: { console.warn( `[omniroute-plugin] force sync ok providerId=${resolved.providerId} ` + `models=${rawModels.length} combos=${rawCombos.length} ` + - `clearedMemory=${clearedMemory + clearedAll} disk=${clearedDisk}`, + `clearedMemory=${clearedMemory + clearedAll} disk=${clearedDisk}` ); return { @@ -944,7 +951,7 @@ export function startOmniRouteAutoSync(args: { const result = await forceSyncOmniRouteModels({ resolved, cache }); if (!result.ok) { console.warn( - `[omniroute-plugin] auto-sync failed providerId=${resolved.providerId}: ${result.error}`, + `[omniroute-plugin] auto-sync failed providerId=${resolved.providerId}: ${result.error}` ); return; } @@ -955,7 +962,7 @@ export function startOmniRouteAutoSync(args: { if (result.count !== lastCount) { console.warn( `[omniroute-plugin] auto-sync catalog size changed ${lastCount} → ${result.count} ` + - `(providerId=${resolved.providerId})`, + `(providerId=${resolved.providerId})` ); lastCount = result.count; } @@ -976,7 +983,7 @@ export function startOmniRouteAutoSync(args: { } console.warn( - `[omniroute-plugin] auto-sync enabled intervalMs=${intervalMs} providerId=${resolved.providerId}`, + `[omniroute-plugin] auto-sync enabled intervalMs=${intervalMs} providerId=${resolved.providerId}` ); return () => { @@ -1032,7 +1039,13 @@ export const OmniRoutePlugin: Plugin = async (_input, options) => { const cfg = input as Config & { command?: Record< string, - { template: string; description?: string; agent?: string; model?: string; subtask?: boolean } + { + template: string; + description?: string; + agent?: string; + model?: string; + subtask?: boolean; + } >; }; if (!cfg.command) cfg.command = {}; @@ -2820,6 +2833,118 @@ export function isUsableCombo( return false; } +// ───────────────────────────────────────────────────────────────────────── +// #9473 — Model allowlist / blocklist filter helpers +// ───────────────────────────────────────────────────────────────────────── + +/** + * Pre-compiled filter structure for the model allowlist/blocklist. + * + * "exact" holds full raw IDs (e.g. "cc/claude-opus-4-7") for O(1) match. + * "suffixes" holds bare model IDs (e.g. "claude-opus-4-7") that match any + * "{prefix}/claude-opus-4-7" — so operators can curate by model name without + * knowing the provider prefix. + */ +export interface ModelListFilter { + exact: Set; + suffixes: Set; +} + +/** + * Compile a string[] of model IDs into a pre-computed filter structure. + * Returns undefined when the list is empty or undefined — the "no filter" + * state that callers use as a passthrough. + * + * IDs containing a "/" are stored in "exact"; bare IDs (no slash) go into + * "suffixes" and match any "{prefix}/" at check time. + */ +export function compileModelListFilter(list?: string[]): ModelListFilter | undefined { + if (!list || list.length === 0) return undefined; + const exact = new Set(); + const suffixes = new Set(); + for (const id of list) { + if (id.includes("/")) { + exact.add(id); + } else { + suffixes.add(id); + } + } + if (exact.size === 0 && suffixes.size === 0) return undefined; + return { exact, suffixes }; +} + +/** + * Decide whether a raw model ID passes the allowlist/blocklist filter. + * + * Rules (all filters AND together with usableOnly): + * - No visible filter and no hidden filter → keep (passthrough). + * - Visible filter set: id must match either the exact set or the suffix + * set (bare suffix "claude-opus-4-7" matches any "{prefix}/claude-opus-4-7"). + * - Hidden filter set: id must NOT match either the exact or suffix set. + * - If id is in BOTH visible and hidden → DROP (deny wins — safer). + * - No-slash ids (e.g. combo names like "claude-primary") are checked + * against the exact set directly, and against the suffix set as a bare + * match. + * + * Pure function — exported so static + dynamic hooks share the same + * verdict logic without divergence. + */ +export function passesModelAllowlist( + id: string, + visible?: ModelListFilter, + hidden?: ModelListFilter +): boolean { + // Hidden filter takes precedence (deny wins over allow). + if (hidden) { + if (hidden.exact.has(id) || matchesSuffix(id, hidden.suffixes)) return false; + } + // Visible filter: if set, id must match. + if (visible) { + if (!visible.exact.has(id) && !matchesSuffix(id, visible.suffixes)) return false; + } + return true; +} + +/** + * Decide whether a combo passes the allowlist filter. A combo keeps when + * AT LEAST ONE of its members matches the visible filter. When no visible + * filter is set, all combos pass. Combos with zero resolvable members pass + * (mirrors `isUsableCombo` semantics). + */ +export function passesComboAllowlist( + combo: OmniRouteRawCombo, + visible?: ModelListFilter +): boolean { + if (!visible) return true; + const steps = Array.isArray(combo.models) ? combo.models : []; + if (steps.length === 0) return true; + let sawResolvableMember = false; + for (const step of steps) { + if (step?.kind === "combo-ref") continue; + const modelId = typeof step?.model === "string" ? step.model : ""; + if (modelId.length === 0) continue; + sawResolvableMember = true; + if (visible.exact.has(modelId) || matchesSuffix(modelId, visible.suffixes)) return true; + } + // No resolvable member → can't prove it should be hidden; keep. + if (!sawResolvableMember) return true; + // Every resolvable member failed the allowlist → drop. + return false; +} + +/** + * Check whether a raw model ID matches any suffix in the set. + * For an id like `cc/claude-opus-4-7`, the suffix after the first `/` + * is checked against the suffixes set. For a bare id like `claude-primary`, + * the id itself is checked against the suffixes set. + */ +function matchesSuffix(id: string, suffixes: Set): boolean { + if (suffixes.size === 0) return false; + const slash = id.indexOf("/"); + const suffix = slash > 0 ? id.slice(slash + 1) : id; + return suffixes.has(suffix); +} + /** * Slugify a combo display name into a copy/paste-friendly URL-safe segment. * Lowercases, replaces any run of non-alphanumeric chars with a single dash, @@ -3003,6 +3128,9 @@ export function createOmniRouteProviderHook( const wantCompressionMeta = features.compressionMetadata === true; const wantUsableOnly = features.usableOnly === true; const wantProviderTag = features.providerTag !== false; + // #9473: model allowlist/blocklist — compile once per hook instance. + const visibleFilter = compileModelListFilter(features.visibleModels); + const hiddenFilter = compileModelListFilter(features.hiddenModels); const now = deps.now ?? Date.now; // T-07: cache holds RAW fetch results (not pre-derived ModelV2) so that // the config-shim hook can share the same cache and derive its stripped @@ -3237,6 +3365,8 @@ export function createOmniRouteProviderHook( if (!entry.id) continue; if (canonicalDedup.has(entry.id)) continue; if (usable && !isUsableRawModelId(entry.id, usable, rawEnrichment)) continue; + // #9473: allowlist/blocklist filter (AND with usableOnly). + if (!passesModelAllowlist(entry.id, visibleFilter, hiddenFilter)) continue; const model = mapRawModelToModelV2(entry, { // #6859: server-facing id — NOT the OC-gate-prefixed `resolved.providerId`. providerId: resolved.omnirouteProviderId, @@ -3312,6 +3442,8 @@ export function createOmniRouteProviderHook( if (!combo.id) return false; if (combo.isHidden === true) return false; if (usable && !isUsableCombo(combo, usable)) return false; + // #9473: combo allowlist — drop when no member matches visible filter. + if (visibleFilter && !passesComboAllowlist(combo, visibleFilter)) return false; return true; }); // Resolved nested combos keyed by their friendly name, so parent @@ -4129,6 +4261,9 @@ export function buildStaticProviderEntry( wantUsableOnly && connections && connections.length > 0 ? usableProviderAliasSet(connections, enrichment) : undefined; + // #9473: model allowlist/blocklist — compile once per static-block build. + const visibleFilter = compileModelListFilter(opts.features?.visibleModels); + const hiddenFilter = compileModelListFilter(opts.features?.hiddenModels); // Provider-tag suffix — default-on, opt-out via `features.providerTag: false`. // Prepends e.g. `Claude - ` to enriched raw-model names so the picker // can tell `cc/claude-opus-4-7` (Anthropic) apart from `kr/claude-opus-4-7` @@ -4166,6 +4301,8 @@ export function buildStaticProviderEntry( // Skip canonical-named twins when the alias-keyed enriched row exists. if (canonicalDedup.has(raw.id)) continue; if (usable && !isUsableRawModelId(raw.id, usable, enrichment)) continue; + // #9473: allowlist/blocklist filter (AND with usableOnly). + if (!passesModelAllowlist(raw.id, visibleFilter, hiddenFilter)) continue; const caps = raw.capabilities ?? {}; // Enrichment overlay: `/api/pricing/models` carries human display names // (e.g. "Claude Opus 4.7" for raw id "cc/claude-opus-4-7"). The OC TUI @@ -4318,6 +4455,8 @@ export function buildStaticProviderEntry( if (!combo.id) return false; if (combo.isHidden === true) return false; if (usable && !isUsableCombo(combo, usable)) return false; + // #9473: combo allowlist — drop when no member matches visible filter. + if (visibleFilter && !passesComboAllowlist(combo, visibleFilter)) return false; return true; }); @@ -4466,7 +4605,8 @@ export function buildStaticProviderEntry( // (`opencode-omniroute/opencode-omniroute/`), and `parseModel()` // resolves credentials for the nonexistent provider `opencode-omniroute` // instead of `omniroute`. See #7976. - models[buildComboKey(combo, usedComboKeys, opts.omnirouteProviderId).split("/").pop()!] = entry; + models[buildComboKey(combo, usedComboKeys, opts.omnirouteProviderId).split("/").pop()!] = + entry; // Make this combo's resolved entry available to parent combos // that reference it via combo-ref. Use the friendly name since diff --git a/@omniroute/opencode-plugin/tests/model-allowlist.test.ts b/@omniroute/opencode-plugin/tests/model-allowlist.test.ts new file mode 100644 index 0000000000..de22aa2bba --- /dev/null +++ b/@omniroute/opencode-plugin/tests/model-allowlist.test.ts @@ -0,0 +1,317 @@ +/** + * #9473 — Model allowlist/blocklist for the opencode-plugin. + * + * Tests for the pure filter helpers (`compileModelListFilter`, + * `passesModelAllowlist`, `passesComboAllowlist`) and the schema + hook-level + * integration. The allowlist/blocklist composes with `usableOnly` (all filters + * AND together), blocklist wins over allowlist (deny takes precedence), and + * bare-suffix entries (e.g. "claude-opus-4-7") match any "{prefix}/claude-opus-4-7". + */ + +import test from "node:test"; +import assert from "node:assert/strict"; + +import { + compileModelListFilter, + passesModelAllowlist, + passesComboAllowlist, + parseOmniRoutePluginOptions, + buildStaticProviderEntry, + resolveOmniRoutePluginOptions, + type OmniRouteRawCombo, + type OmniRouteRawModelEntry, +} from "../src/index.js"; + +// ───────────────────────────────────────────────────────────────────────── +// compileModelListFilter +// ───────────────────────────────────────────────────────────────────────── + +test("compileModelListFilter: undefined list → undefined", () => { + assert.equal(compileModelListFilter(undefined), undefined); +}); + +test("compileModelListFilter: empty array → undefined", () => { + assert.equal(compileModelListFilter([]), undefined); +}); + +test("compileModelListFilter: raw IDs with slash → exact set populated", () => { + const f = compileModelListFilter(["cc/claude-opus-4-7", "glm/gpt-5"]); + assert.ok(f); + assert.equal(f.exact.has("cc/claude-opus-4-7"), true); + assert.equal(f.exact.has("glm/gpt-5"), true); + assert.equal(f.suffixes.size, 0); +}); + +test("compileModelListFilter: bare IDs (no slash) → suffixes set populated", () => { + const f = compileModelListFilter(["claude-opus-4-7", "gpt-5"]); + assert.ok(f); + assert.equal(f.suffixes.has("claude-opus-4-7"), true); + assert.equal(f.suffixes.has("gpt-5"), true); + assert.equal(f.exact.size, 0); +}); + +test("compileModelListFilter: mixed raw + bare → both sets populated", () => { + const f = compileModelListFilter(["cc/claude-opus-4-7", "gpt-5"]); + assert.ok(f); + assert.equal(f.exact.has("cc/claude-opus-4-7"), true); + assert.equal(f.suffixes.has("gpt-5"), true); +}); + +// ───────────────────────────────────────────────────────────────────────── +// passesModelAllowlist +// ───────────────────────────────────────────────────────────────────────── + +test("passesModelAllowlist: no visible, no hidden → keep (passthrough)", () => { + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", undefined, undefined), true); +}); + +test("passesModelAllowlist: visible undefined, hidden undefined → keep", () => { + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", undefined, undefined), true); +}); + +test("passesModelAllowlist: visible set, id matches exact → keep", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", vis, undefined), true); +}); + +test("passesModelAllowlist: visible set, id matches suffix → keep", () => { + const vis = compileModelListFilter(["claude-opus-4-7"]); + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", vis, undefined), true); +}); + +test("passesModelAllowlist: visible set, id does NOT match → drop", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + assert.equal(passesModelAllowlist("glm/gpt-5", vis, undefined), false); +}); + +test("passesModelAllowlist: visible set, bare suffix matches different prefix → keep", () => { + const vis = compileModelListFilter(["claude-opus-4-7"]); + assert.equal(passesModelAllowlist("kr/claude-opus-4-7", vis, undefined), true); +}); + +test("passesModelAllowlist: hidden set, id matches exact → drop", () => { + const hid = compileModelListFilter(["cc/claude-opus-4-7"]); + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", undefined, hid), false); +}); + +test("passesModelAllowlist: hidden set, id matches suffix → drop", () => { + const hid = compileModelListFilter(["claude-opus-4-7"]); + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", undefined, hid), false); +}); + +test("passesModelAllowlist: hidden set, id does NOT match → keep", () => { + const hid = compileModelListFilter(["cc/claude-opus-4-7"]); + assert.equal(passesModelAllowlist("glm/gpt-5", undefined, hid), true); +}); + +test("passesModelAllowlist: id in BOTH visible and hidden → DROP (deny wins)", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + const hid = compileModelListFilter(["cc/claude-opus-4-7"]); + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", vis, hid), false); +}); + +test("passesModelAllowlist: visible allows, hidden blocks different id → keep the visible one", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + const hid = compileModelListFilter(["glm/gpt-5"]); + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", vis, hid), true); + assert.equal(passesModelAllowlist("glm/gpt-5", vis, hid), false); +}); + +test("passesModelAllowlist: bare-suffix hidden blocks exact match too", () => { + const hid = compileModelListFilter(["claude-opus-4-7"]); + assert.equal(passesModelAllowlist("cc/claude-opus-4-7", undefined, hid), false); + assert.equal(passesModelAllowlist("kr/claude-opus-4-7", undefined, hid), false); +}); + +test("passesModelAllowlist: no-slash id, visible set has bare match → keep", () => { + const vis = compileModelListFilter(["claude-primary"]); + assert.equal(passesModelAllowlist("claude-primary", vis, undefined), true); +}); + +test("passesModelAllowlist: no-slash id, visible set has no match → drop", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + assert.equal(passesModelAllowlist("claude-primary", vis, undefined), false); +}); + +// ───────────────────────────────────────────────────────────────────────── +// passesComboAllowlist +// ───────────────────────────────────────────────────────────────────────── + +function combo(models: OmniRouteRawCombo["models"]): OmniRouteRawCombo { + return { id: "c1", name: "Test Combo", models }; +} + +test("passesComboAllowlist: visible undefined → keep", () => { + const c = combo([{ kind: "model", model: "cc/claude-opus-4-7" }]); + assert.equal(passesComboAllowlist(c, undefined), true); +}); + +test("passesComboAllowlist: ≥1 member matches visible → keep", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + const c = combo([ + { kind: "model", model: "dead/legacy" }, + { kind: "model", model: "cc/claude-opus-4-7" }, + ]); + assert.equal(passesComboAllowlist(c, vis), true); +}); + +test("passesComboAllowlist: zero members match visible → drop", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + const c = combo([ + { kind: "model", model: "glm/gpt-5" }, + { kind: "model", model: "kr/claude-opus-4-7" }, + ]); + assert.equal(passesComboAllowlist(c, vis), false); +}); + +test("passesComboAllowlist: bare suffix matches any prefix → keep", () => { + const vis = compileModelListFilter(["claude-opus-4-7"]); + const c = combo([{ kind: "model", model: "kr/claude-opus-4-7" }]); + assert.equal(passesComboAllowlist(c, vis), true); +}); + +test("passesComboAllowlist: zero members → keep", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + assert.equal(passesComboAllowlist(combo([]), vis), true); + assert.equal(passesComboAllowlist(combo(undefined), vis), true); +}); + +test("passesComboAllowlist: only combo-ref steps → keep", () => { + const vis = compileModelListFilter(["cc/claude-opus-4-7"]); + const c = combo([{ kind: "combo-ref", comboName: "nested" }]); + assert.equal(passesComboAllowlist(c, vis), true); +}); + +// ───────────────────────────────────────────────────────────────────────── +// Schema — visibleModels / hiddenModels +// ───────────────────────────────────────────────────────────────────────── + +test("parseOmniRoutePluginOptions: visibleModels string[] → preserved", () => { + const r = parseOmniRoutePluginOptions({ + features: { visibleModels: ["cc/claude-opus-4-7", "gpt-5"] }, + }); + assert.deepEqual(r.features?.visibleModels, ["cc/claude-opus-4-7", "gpt-5"]); +}); + +test("parseOmniRoutePluginOptions: hiddenModels string[] → preserved", () => { + const r = parseOmniRoutePluginOptions({ + features: { hiddenModels: ["glm/gpt-5"] }, + }); + assert.deepEqual(r.features?.hiddenModels, ["glm/gpt-5"]); +}); + +test("parseOmniRoutePluginOptions: both lists together → preserved", () => { + const r = parseOmniRoutePluginOptions({ + features: { + visibleModels: ["cc/claude-opus-4-7"], + hiddenModels: ["glm/gpt-5"], + }, + }); + assert.deepEqual(r.features?.visibleModels, ["cc/claude-opus-4-7"]); + assert.deepEqual(r.features?.hiddenModels, ["glm/gpt-5"]); +}); + +test("parseOmniRoutePluginOptions: empty string in visibleModels → rejects", () => { + assert.throws( + () => + parseOmniRoutePluginOptions({ + features: { visibleModels: [""] }, + }), + /Invalid @omniroute\/opencode-plugin options/ + ); +}); + +test("parseOmniRoutePluginOptions: empty string in hiddenModels → rejects", () => { + assert.throws( + () => + parseOmniRoutePluginOptions({ + features: { hiddenModels: [""] }, + }), + /Invalid @omniroute\/opencode-plugin options/ + ); +}); + +test("parseOmniRoutePluginOptions: unknown features key still rejects (strict invariant)", () => { + assert.throws( + () => + parseOmniRoutePluginOptions({ + features: { visibleModels: ["x"], unknownKey: true }, + }), + /Invalid @omniroute\/opencode-plugin options/ + ); +}); + +// ───────────────────────────────────────────────────────────────────────── +// buildStaticProviderEntry — allowlist/blocklist integration +// ───────────────────────────────────────────────────────────────────────── + +const FAKE_RAW_MODELS: OmniRouteRawModelEntry[] = [ + { id: "cc/claude-opus-4-7", owned_by: "anthropic" }, + { id: "glm/gpt-5", owned_by: "openai" }, + { id: "kr/claude-opus-4-7", owned_by: "anthropic" }, + { id: "claude-primary", owned_by: "combo" }, +]; + +test("buildStaticProviderEntry: no allowlist → all models emitted", () => { + const opts = resolveOmniRoutePluginOptions({ features: {} }); + const entry = buildStaticProviderEntry(FAKE_RAW_MODELS, [], opts, "http://localhost:20128/v1", "sk-test"); + const ids = Object.keys(entry.models); + assert.ok(ids.includes("cc/claude-opus-4-7"), "cc/claude-opus-4-7 should be present"); + assert.ok(ids.includes("glm/gpt-5"), "glm/gpt-5 should be present"); + assert.ok(ids.includes("kr/claude-opus-4-7"), "kr/claude-opus-4-7 should be present"); +}); + +test("buildStaticProviderEntry: visibleModels filters to only listed IDs", () => { + const opts = resolveOmniRoutePluginOptions({ + features: { visibleModels: ["cc/claude-opus-4-7"] }, + }); + const entry = buildStaticProviderEntry(FAKE_RAW_MODELS, [], opts, "http://localhost:20128/v1", "sk-test"); + const ids = Object.keys(entry.models); + assert.ok(ids.includes("cc/claude-opus-4-7"), "cc/claude-opus-4-7 should be present"); + assert.equal(ids.includes("glm/gpt-5"), false, "glm/gpt-5 should be filtered out"); + assert.equal(ids.includes("kr/claude-opus-4-7"), false, "kr/claude-opus-4-7 should be filtered out"); +}); + +test("buildStaticProviderEntry: hiddenModels drops listed IDs", () => { + const opts = resolveOmniRoutePluginOptions({ + features: { hiddenModels: ["glm/gpt-5"] }, + }); + const entry = buildStaticProviderEntry(FAKE_RAW_MODELS, [], opts, "http://localhost:20128/v1", "sk-test"); + const ids = Object.keys(entry.models); + assert.ok(ids.includes("cc/claude-opus-4-7"), "cc/claude-opus-4-7 should be present"); + assert.equal(ids.includes("glm/gpt-5"), false, "glm/gpt-5 should be hidden"); + assert.ok(ids.includes("kr/claude-opus-4-7"), "kr/claude-opus-4-7 should be present"); +}); + +test("buildStaticProviderEntry: bare-suffix visibleModels matches any prefix", () => { + const opts = resolveOmniRoutePluginOptions({ + features: { visibleModels: ["claude-opus-4-7"] }, + }); + const entry = buildStaticProviderEntry(FAKE_RAW_MODELS, [], opts, "http://localhost:20128/v1", "sk-test"); + const ids = Object.keys(entry.models); + assert.ok(ids.includes("cc/claude-opus-4-7"), "cc/claude-opus-4-7 should match via suffix"); + assert.ok(ids.includes("kr/claude-opus-4-7"), "kr/claude-opus-4-7 should match via suffix"); + assert.equal(ids.includes("glm/gpt-5"), false, "glm/gpt-5 should be filtered out"); +}); + +test("buildStaticProviderEntry: id in both visible and hidden → hidden wins", () => { + const opts = resolveOmniRoutePluginOptions({ + features: { + visibleModels: ["cc/claude-opus-4-7"], + hiddenModels: ["cc/claude-opus-4-7"], + }, + }); + const entry = buildStaticProviderEntry(FAKE_RAW_MODELS, [], opts, "http://localhost:20128/v1", "sk-test"); + const ids = Object.keys(entry.models); + assert.equal(ids.includes("cc/claude-opus-4-7"), false, "deny takes precedence"); +}); + +test("buildStaticProviderEntry: empty visibleModels → no filter (passthrough)", () => { + const opts = resolveOmniRoutePluginOptions({ + features: { visibleModels: [] }, + }); + const entry = buildStaticProviderEntry(FAKE_RAW_MODELS, [], opts, "http://localhost:20128/v1", "sk-test"); + const ids = Object.keys(entry.models); + assert.ok(ids.includes("cc/claude-opus-4-7"), "empty visibleModels should not filter"); + assert.ok(ids.includes("glm/gpt-5"), "empty visibleModels should not filter"); +}); diff --git a/AGENTS.md b/AGENTS.md index faaa956fdb..f88c9056a5 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -58,7 +58,7 @@ Repository map and Reference Documentation sections below. | Services | `open-sse/services/` | Combo routing, rate limits, caching, etc | | Database | `src/lib/db/` | SQLite domain modules (130 migrations) | | Domain/Policy | `src/domain/` | Policy engine, cost rules, fallback logic | -| MCP Server | `open-sse/mcp-server/` | 104 tools (42 base + memory/skill/agentSkill/pool/notion/obsidian/gamification/plugin modules), 3 transports (stdio / SSE / Streamable HTTP), 31 scopes | +| MCP Server | `open-sse/mcp-server/` | 105 tools (42 base + memory/skill/agentSkill/pool/notion/obsidian/gamification/plugin modules), 3 transports (stdio / SSE / Streamable HTTP), 31 scopes | | A2A Server | `src/lib/a2a/` | JSON-RPC 2.0 agent protocol | | Skills | `src/lib/skills/` | Extensible skill framework | | Memory | `src/lib/memory/` | Persistent conversational memory | @@ -399,6 +399,7 @@ For any non-trivial change, read the matching deep-dive first: | Resilience (3 mechanisms) | `docs/architecture/RESILIENCE_GUIDE.md` | | Reasoning replay | `docs/routing/REASONING_REPLAY.md` | | Skills framework | `docs/frameworks/SKILLS.md` | +| Radar (free-model catalog overlay) | `docs/frameworks/RADAR.md` | | Memory system (FTS5 + Qdrant) | `docs/frameworks/MEMORY.md` | | Cloud agents | `docs/frameworks/CLOUD_AGENT.md` | | Guardrails (PII / injection / vision) | `docs/security/GUARDRAILS.md` | @@ -427,7 +428,7 @@ For any non-trivial change, read the matching deep-dive first: | What | Command | | ----------------------- | --------------------------------------------------------------------------- | | Unit tests | `npm run test:unit` | -| Single file | `node --import tsx/esm --test tests/unit/your-file.test.ts` | +| Single file | `node --import tsx/esm --test tests/unit/your-file.test.ts` | | Vitest (MCP, autoCombo) | `npm run test:vitest` | | E2E (Playwright) | `npm run test:e2e` | | Protocol E2E (MCP+A2A) | `npm run test:protocols:e2e` | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8688d253d6..564aedadfa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -15,6 +15,12 @@ coverage, and reconciliation steps. - **Node.js** `>=22.22.3 <23`, or `>=24.0.0 <27` (recommended: 24 LTS) - **npm** 10+ + +> **npm v11+ users (Node 24+):** After `npm install`, verify native modules were installed: +> `node -e "require('better-sqlite3')"`. If it fails with `MODULE_NOT_FOUND`, +> run `npm approve-scripts better-sqlite3 && npm install`. See +> [Troubleshooting](docs/guides/TROUBLESHOOTING.md#npm-v11-better-sqlite3-not-installed-cannot-find-module). + - **Git** ### Clone & Install diff --git a/Dockerfile b/Dockerfile index 47780263c6..905fb294e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -77,7 +77,7 @@ RUN test -f package-lock.json \ # a broken/rate-limited fetch fails the BUILD loudly instead of shipping a # broken image. RUN --mount=type=cache,id=npm-cache,target=/root/.npm \ - npm ci --no-audit --no-fund --legacy-peer-deps --ignore-scripts \ + npm ci --include=optional --no-audit --no-fund --legacy-peer-deps --ignore-scripts \ && (cd node_modules/better-sqlite3 \ && node /usr/local/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js rebuild) \ && node -e "require('better-sqlite3')(':memory:').close()" \ @@ -119,7 +119,9 @@ ENV NODE_OPTIONS="--max-old-space-size=${OMNIROUTE_BUILD_MEMORY_MB}" COPY . ./ RUN --mount=type=cache,id=next-cache,target=/app/.build/next/cache \ - mkdir -p /app/data && npm run build + mkdir -p /app/data \ + && npm run build \ + && node --input-type=module -e "import { createRequire } from 'node:module'; import { pathToFileURL } from 'node:url'; const standaloneRoot = '/app/.build/next/standalone/node_modules/'; const require = createRequire('/app/.build/next/standalone/package.json'); for (const pkg of ['@atjsh/llmlingua-2', '@huggingface/transformers', '@tensorflow/tfjs', 'js-tiktoken']) { const resolved = require.resolve(pkg); if (!resolved.startsWith(standaloneRoot)) throw new Error(pkg + ' resolved outside standalone: ' + resolved); await import(pathToFileURL(resolved).href); } const onnxRuntime = require.resolve('onnxruntime-node'); if (!onnxRuntime.startsWith(standaloneRoot)) throw new Error('onnxruntime-node resolved outside standalone: ' + onnxRuntime); await import(pathToFileURL(onnxRuntime).href);" # ── Runner base ──────────────────────────────────────────────────────────── FROM base AS runner-base diff --git a/MAX b/MAX new file mode 100644 index 0000000000..e69de29bb2 diff --git a/README.md b/README.md index e0fba74af8..352619a7f0 100644 --- a/README.md +++ b/README.md @@ -188,7 +188,7 @@ curl http://localhost:20128/v1/chat/completions \ -The Promise — One endpoint. 291 providers. Never stop building — OmniRoute picks the cheapest one that works. Six pillars: Never hit limits (auto-fallback across 291 providers in milliseconds, zero downtime) · Save up to 95% tokens (RTK + Caveman stacked compression cuts 15–95%, ~89% avg on tool-heavy sessions) · $0 to start (90+ free tiers, 40+ free forever — no card needed) · Every tool works (33 coding agents through one config) · One endpoint (OpenAI ↔ Claude ↔ Gemini ↔ Responses API at /v1) · Production-grade (circuit breakers, TLS stealth, MCP 104 tools, A2A, memory, guardrails, evals — 25,000+ tests). +The Promise — One endpoint. 291 providers. Never stop building — OmniRoute picks the cheapest one that works. Six pillars: Never hit limits (auto-fallback across 291 providers in milliseconds, zero downtime) · Save up to 95% tokens (RTK + Caveman stacked compression cuts 15–95%, ~89% avg on tool-heavy sessions) · $0 to start (90+ free tiers, 40+ free forever — no card needed) · Every tool works (33 coding agents through one config) · One endpoint (OpenAI ↔ Claude ↔ Gemini ↔ Responses API at /v1) · Production-grade (circuit breakers, TLS stealth, MCP 105 tools, A2A, memory, guardrails, evals — 25,000+ tests).

@@ -439,7 +439,7 @@ All **19** strategies — mix & match per combo step: -What sets OmniRoute apart — comparison table vs 9router, OpenRouter, CLIProxyAPI and LiteLLM across 13 capabilities. OmniRoute: 291 providers, 90+ free providers built-in, 19 routing strategies, 12-engine token compression, built-in MCP server with 104 tools, A2A agent protocol, persistent memory, guardrails, cloud agents, TLS fingerprint stealth, Desktop/Termux/PWA, 43 i18n UI locales, 100% MIT self-hosted. OmniRoute is the only one with the full set; competitors show a mix of checks, partials and crosses. Verified from each project's docs. +What sets OmniRoute apart — comparison table vs 9router, OpenRouter, CLIProxyAPI and LiteLLM across 13 capabilities. OmniRoute: 291 providers, 90+ free providers built-in, 19 routing strategies, 12-engine token compression, built-in MCP server with 105 tools, A2A agent protocol, persistent memory, guardrails, cloud agents, TLS fingerprint stealth, Desktop/Termux/PWA, 43 i18n UI locales, 100% MIT self-hosted. OmniRoute is the only one with the full set; competitors show a mix of checks, partials and crosses. Verified from each project's docs. 📊 Full methodology & per-feature detail vs 9router, OpenRouter, CLIProxyAPI & LiteLLM → [`docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md`](docs/comparison/OMNIROUTE_VS_ALTERNATIVES.md) @@ -723,7 +723,7 @@ Expose OmniRoute over **MCP**, **A2A**, a **REST API**, **webhooks** or a **remo - + @@ -890,6 +890,12 @@ docker run -d --name omniroute --restart unless-stopped --stop-timeout 40 \ -p 127.0.0.1:20128:20128 -v omniroute-data:/app/data diegosouzapw/omniroute:latest ``` +> **Pre-release Docker channel:** `diegosouzapw/omniroute:next` and +> `diegosouzapw/omniroute:next-web` follow the current default `release/v*` +> branch. These mutable tags are intended only for testing unreleased fixes and +> are **not supported for production**. See +> [Docker Release Channels](docs/guides/DOCKER_RELEASE_CHANNELS.md). + **🛠️ From source** ```bash diff --git a/_tasks b/_tasks new file mode 120000 index 0000000000..c17ee3177f --- /dev/null +++ b/_tasks @@ -0,0 +1 @@ +/home/diegosouzapw/dev/proxys/OmniRoute/_tasks \ No newline at end of file diff --git a/bin/cli/commands/doctor.mjs b/bin/cli/commands/doctor.mjs index f61f9d60c0..bf7ba10b59 100644 --- a/bin/cli/commands/doctor.mjs +++ b/bin/cli/commands/doctor.mjs @@ -299,7 +299,15 @@ async function checkNativeBinary(rootDir) { "Release", "better_sqlite3.node" ), - path.join(rootDir, "dist", "node_modules", "better-sqlite3", "build", "Release", "better_sqlite3.node"), + path.join( + rootDir, + "dist", + "node_modules", + "better-sqlite3", + "build", + "Release", + "better_sqlite3.node" + ), path.join(rootDir, "node_modules", "better-sqlite3", "build", "Release", "better_sqlite3.node"), ]; const binaryPath = candidates.find((candidate) => fs.existsSync(candidate)); @@ -396,7 +404,10 @@ async function checkServerLiveness(options = {}) { // First attempt: configured health endpoint (may require auth token). const primary = await probeUrl(url); if (primary.ok) { - return ok("Server liveness", "Server health endpoint is reachable", { url, status: primary.status }); + return ok("Server liveness", "Server health endpoint is reachable", { + url, + status: primary.status, + }); } // #6162: /api/health and /api/health/degradation require a management token. @@ -427,7 +438,12 @@ async function checkServerLiveness(options = {}) { return ok( "Server liveness", `Server reachable (health endpoint returned ${primary.status}, likely requires MANAGEMENT_TOKEN)`, - { primaryUrl: url, primaryStatus: primary.status, fallbackUrl, fallbackStatus: fallback.status } + { + primaryUrl: url, + primaryStatus: primary.status, + fallbackUrl, + fallbackStatus: fallback.status, + } ); } @@ -440,8 +456,7 @@ async function checkServerLiveness(options = {}) { export async function collectDoctorChecks(context = {}, options = {}) { const rootDir = - context.rootDir || - path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", ".."); + context.rootDir || path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..", ".."); const dataDir = resolveDataDir(); const dbPath = resolveStoragePath(dataDir); diff --git a/bin/cli/commands/oauth.mjs b/bin/cli/commands/oauth.mjs index d1d2fd3b40..5c1a6ec4a9 100644 --- a/bin/cli/commands/oauth.mjs +++ b/bin/cli/commands/oauth.mjs @@ -159,9 +159,7 @@ async function runBrowserFlow(def, opts) { } const result = await exchangeRes.json(); const conn = result.connection ?? {}; - process.stdout.write( - `Authorized: ${conn.email ?? conn.displayName ?? conn.id ?? "connected"}\n` - ); + process.stdout.write(`Authorized: ${conn.email ?? conn.displayName ?? conn.id ?? "connected"}\n`); } async function safeErrorBody(res) { diff --git a/bin/cli/commands/setup-claude.mjs b/bin/cli/commands/setup-claude.mjs index 6ccc668257..600a33d8bb 100644 --- a/bin/cli/commands/setup-claude.mjs +++ b/bin/cli/commands/setup-claude.mjs @@ -160,8 +160,7 @@ export async function runSetupClaudeCommand(opts = {}) { let detail = `HTTP ${res.status}`; try { const errorBody = await res.json(); - const serverMsg = - errorBody?.error?.message || errorBody?.error || errorBody?.message || ""; + const serverMsg = errorBody?.error?.message || errorBody?.error || errorBody?.message || ""; if (serverMsg) detail += ` — ${serverMsg}`; } catch {} throw new Error(detail); diff --git a/bin/cli/commands/setup-open-code.mjs b/bin/cli/commands/setup-open-code.mjs index dd20ba28a6..60f08158c2 100644 --- a/bin/cli/commands/setup-open-code.mjs +++ b/bin/cli/commands/setup-open-code.mjs @@ -218,6 +218,26 @@ function registerPluginInOpenCodeConfig({ * a clear "could not run opencode" message instead of a hard import * failure. */ +/** + * Resolve the provider id used for `opencode auth login --provider `. + * + * The bundled @omniroute/opencode-plugin registers its provider under + * `opencode-` (the `opencode-` prefix is required by OpenCode >=1.17.8's + * native-adapter gate). The auth login command must use the prefixed form + * because OpenCode resolves `--provider ` against the provider id the + * plugin actually registered. + * + * Idempotent: if the id already starts with `opencode-`, it passes through + * unchanged. This protects users who manually worked around the bug with + * `--provider opencode-omniroute`. + * + * @param {string} providerId + * @returns {string} + */ +export function resolveOpenCodeAuthProviderId(providerId) { + return providerId.startsWith("opencode-") ? providerId : `opencode-${providerId}`; +} + /** * Pure resolver for the `opencode auth login` spawn descriptor. Extracted so the * platform-branching logic is unit-testable without mocking child_process or @@ -231,21 +251,23 @@ function registerPluginInOpenCodeConfig({ */ export function resolveOpenCodeAuthSpawn(providerId, platform = process.platform) { const isWin = platform === "win32"; + const authProviderId = resolveOpenCodeAuthProviderId(providerId); return { command: isWin ? "opencode.cmd" : "opencode", - args: ["auth", "login", "--provider", providerId], + args: ["auth", "login", "--provider", authProviderId], options: { stdio: "inherit", shell: isWin }, }; } export function runOpenCodeAuth(providerId) { + const authProviderId = resolveOpenCodeAuthProviderId(providerId); const { command, args, options } = resolveOpenCodeAuthSpawn(providerId); const res = spawnSync(command, args, options); if (res.error) { // ENOENT = opencode is not on PATH if (res.error.code === "ENOENT") { printInfo( - `opencode CLI not found on PATH. Run \`opencode auth login --provider ${providerId}\` manually after installing OpenCode.` + `opencode CLI not found on PATH. Run \`opencode auth login --provider ${authProviderId}\` manually after installing OpenCode.` ); return 1; } @@ -343,7 +365,8 @@ export async function runSetupOpenCodeCommand(opts = {}) { if (wantsAuth) { if (nonInteractive) { printInfo(`Skipping \`opencode auth login\` (non-interactive mode).`); - printInfo(`Run manually: opencode auth login --provider ${providerId}`); + const authProviderId = resolveOpenCodeAuthProviderId(providerId); + printInfo(`Run manually: opencode auth login --provider ${authProviderId}`); } else { printHeading("Authenticating with OpenCode"); const authExit = runOpenCodeAuth(providerId); @@ -352,8 +375,9 @@ export async function runSetupOpenCodeCommand(opts = {}) { } } } else { + const authProviderId = resolveOpenCodeAuthProviderId(providerId); printInfo( - `Next step: opencode auth login --provider ${providerId} (pass --auth to do this automatically)` + `Next step: opencode auth login --provider ${authProviderId} (pass --auth to do this automatically)` ); } diff --git a/bin/cli/commands/update.mjs b/bin/cli/commands/update.mjs index 75f829107d..afdaff68e4 100644 --- a/bin/cli/commands/update.mjs +++ b/bin/cli/commands/update.mjs @@ -188,16 +188,18 @@ export async function runUpdateCommand(opts = {}) { const afterVersion = await getCurrentVersion(); if (afterVersion && compareVersions(afterVersion, latest) < 0) { printError( - `Global install updated to ${latest}, but the running binary still reports ${afterVersion}.`, + `Global install updated to ${latest}, but the running binary still reports ${afterVersion}.` ); console.log( - " A local `node_modules/omniroute` is likely shadowing the global install on PATH.", + " A local `node_modules/omniroute` is likely shadowing the global install on PATH." ); console.log(" Diagnose with:"); console.log(" which -a omniroute"); console.log(" command -v omniroute"); console.log(" npm prefix -g"); - console.log(" Then remove the shadowing local copy (e.g. `npm uninstall omniroute` from its directory)"); + console.log( + " Then remove the shadowing local copy (e.g. `npm uninstall omniroute` from its directory)" + ); console.log(" or reorder PATH so the global bin comes first."); return 1; } diff --git a/bin/cli/runtime/nativeDeps.mjs b/bin/cli/runtime/nativeDeps.mjs index bd053384f9..b632e689a2 100644 --- a/bin/cli/runtime/nativeDeps.mjs +++ b/bin/cli/runtime/nativeDeps.mjs @@ -94,10 +94,12 @@ export function isBetterSqliteBinaryValid() { const magic = buf.toString("hex"); const os = platform(); let formatOk; - if (os === "linux") formatOk = magic.startsWith("7f454c46"); // ELF + if (os === "linux") + formatOk = magic.startsWith("7f454c46"); // ELF else if (os === "darwin") formatOk = magic.startsWith("cffaedfe") || magic.startsWith("cefaedfe"); // Mach-O - else if (os === "win32") formatOk = magic.startsWith("4d5a"); // PE/MZ + else if (os === "win32") + formatOk = magic.startsWith("4d5a"); // PE/MZ else formatOk = true; if (!formatOk) return false; // File-format magic bytes alone do not guarantee the binary was built for the Node ABI diff --git a/bin/cli/runtime/trayRuntime.ts b/bin/cli/runtime/trayRuntime.ts index 712bc720dc..98a3abfccc 100644 --- a/bin/cli/runtime/trayRuntime.ts +++ b/bin/cli/runtime/trayRuntime.ts @@ -17,7 +17,7 @@ export const SYSTRAY_VERSION = "2.1.4"; const SYSTRAY_SPEC = `${SYSTRAY_PACKAGE}@${SYSTRAY_VERSION}`; export function resolveSystrayBinName(platform: NodeJS.Platform): string | null { - if (platform === "win32") return null; + if (platform === "win32") return "tray_windows_release.exe"; if (platform === "darwin") return "tray_darwin_release"; return "tray_linux_release"; } @@ -45,7 +45,6 @@ export function chmodSystrayBinAt(runtimeRoot: string, platform: NodeJS.Platform } export async function loadSystray(): Promise<(new (...args: unknown[]) => unknown) | null> { - if (process.platform === "win32") return null; // Windows uses tray.ps1 instead ensureRuntimeDir(); if (!isInstalled()) { try { diff --git a/bin/cli/sqlite.mjs b/bin/cli/sqlite.mjs index 2bdb7bd544..ce14541480 100644 --- a/bin/cli/sqlite.mjs +++ b/bin/cli/sqlite.mjs @@ -130,7 +130,7 @@ async function openSqliteDatabase(dbPath, options = {}) { try { return new loaded.Database(dbPath, options); } catch (error) { - throw createSqliteNativeError(error); + return openWithSyncDriverFallback(dbPath, options, error); } } diff --git a/bin/cli/tray/autostart.mjs b/bin/cli/tray/autostart.mjs index b8318f2d79..6c1ba21aee 100644 --- a/bin/cli/tray/autostart.mjs +++ b/bin/cli/tray/autostart.mjs @@ -167,6 +167,10 @@ export function getAutostartStatus() { linger: tryReadLingerEnabled(), }; } + if (process.platform === "win32") { + const winMechanism = isAutostartEnabled() ? "vbs-startup" : null; + return { enabled: isAutostartEnabled(), mechanism: winMechanism }; + } return { enabled: isAutostartEnabled(), mechanism: null }; } diff --git a/bin/cli/tray/index.mjs b/bin/cli/tray/index.mjs index 5745062e66..dfa621b422 100644 --- a/bin/cli/tray/index.mjs +++ b/bin/cli/tray/index.mjs @@ -1,5 +1,4 @@ import { isTraySupported, initSystrayUnix, killSystrayUnix } from "./traySystray.mjs"; -import { initWinTray, killWinTray } from "./trayWindows.mjs"; let active = null; @@ -10,15 +9,17 @@ export async function initTray({ port, onQuit, onOpenDashboard, onShowLogs }) { const ctx = { port, onQuit, onOpenDashboard, onShowLogs }; // initSystrayUnix is async: it lazily installs/loads systray2 from the runtime // dir (trayRuntime.ts) rather than from node_modules. (#4605) - active = process.platform === "win32" ? initWinTray(ctx) : await initSystrayUnix(ctx); + // Use systray2 on all platforms including Windows — the tarball ships + // tray_windows_release.exe, avoiding the Norton/AVG IDP.HELU.PSE85 heuristic + // that fires on temp-dir PowerShell scripts. (#8609) + active = await initSystrayUnix(ctx); return active; } export function killTray() { if (!active) return; try { - if (process.platform === "win32") killWinTray(active); - else killSystrayUnix(active); + killSystrayUnix(active); } catch {} active = null; } diff --git a/bin/mcp-server.mjs b/bin/mcp-server.mjs index 2a79f151d6..39590d379c 100644 --- a/bin/mcp-server.mjs +++ b/bin/mcp-server.mjs @@ -3,7 +3,7 @@ import { spawn } from "node:child_process"; import { existsSync } from "node:fs"; import { dirname, join } from "node:path"; -import { fileURLToPath } from "node:url"; +import { fileURLToPath, pathToFileURL } from "node:url"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -43,7 +43,15 @@ export async function startMcpCli(rootDir = ROOT) { } // `tsx` loader is only required for local `.ts` fallback; JS entry works without it. - const loaderArgs = mcpEntry.endsWith(".ts") ? ["--import", "tsx"] : []; + const tsxLoaderArgs = mcpEntry.endsWith(".ts") ? ["--import", "tsx"] : []; + // Preload the stdout/stderr console guard before mcpEntry's own module graph evaluates — + // DB init (a side effect of createMcpServer()'s tool registration) logs via plain + // console.log, and by the time any code inside mcpEntry itself could redirect it, that + // module's own (hoisted) imports have already run. Loading the guard first, in a separate + // module, is the only point early enough to guarantee it never leaks into the JSON-RPC + // stream on stdout. + const consoleGuard = pathToFileURL(join(__dirname, "mcpStdioConsoleGuard.mjs")).href; + const loaderArgs = ["--import", consoleGuard, ...tsxLoaderArgs]; await new Promise((resolve, reject) => { const child = spawn(process.execPath, [...loaderArgs, mcpEntry], { diff --git a/bin/mcpStdioConsoleGuard.mjs b/bin/mcpStdioConsoleGuard.mjs new file mode 100644 index 0000000000..074dd1e416 --- /dev/null +++ b/bin/mcpStdioConsoleGuard.mjs @@ -0,0 +1,16 @@ +// Preloaded (via `node --import`) before open-sse/mcp-server/server.ts and its entire +// import graph evaluate. The stdio MCP transport uses stdout exclusively for JSON-RPC +// messages, but DB init (getDbInstance(), triggered as a side effect of evaluating the +// server's module graph — e.g. tool registration reading compression settings) logs via +// plain console.log. A redirect placed *inside* server.ts (even at the top of its first +// executed function) is too late: static imports are hoisted and fully evaluated before +// any of that function's own code runs, so earlier console.log calls during import-time +// side effects already escaped to the real stdout by then. Redirecting here, in a module +// that loads before server.ts is even requested, is the only point early enough to +// guarantee no startup output leaks into the JSON-RPC stream and corrupts it client-side +// (e.g. Claude Desktop: "Unexpected token 'D', \"[DB] Changi\"... is not valid JSON"). +import { Console } from "node:console"; + +const stderrConsole = new Console({ stdout: process.stderr, stderr: process.stderr }); +console.log = stderrConsole.log.bind(stderrConsole); +console.warn = stderrConsole.warn.bind(stderrConsole); diff --git a/bin/omniroute.mjs b/bin/omniroute.mjs index fa216bb3ff..c5b280ba64 100755 --- a/bin/omniroute.mjs +++ b/bin/omniroute.mjs @@ -43,6 +43,19 @@ if (isVersionFastPath(process.argv)) { process.exit(0); } +// MCP stdio transport uses stdout exclusively for JSON-RPC messages. Redirect +// console.log/warn to stderr before anything else runs — including the tsx/esm and +// polyfill imports below, since those (and their transitive module graphs, e.g. DB +// init) can themselves log during evaluation. Redirecting after those imports let +// early output leak straight into the JSON-RPC stream and corrupt it client-side +// (e.g. Claude Desktop: "Unexpected token 'D', \"[DB] Changi\"... is not valid JSON"). +if (process.argv.includes("--mcp")) { + const { Console } = await import("node:console"); + const stderrConsole = new Console({ stdout: process.stderr, stderr: process.stderr }); + console.log = stderrConsole.log.bind(stderrConsole); + console.warn = stderrConsole.warn.bind(stderrConsole); +} + // Register tsx so dynamic imports of .ts source files (referenced as .js per // TypeScript conventions) resolve correctly. The build never emits .js for // src/lib/cli-helper/, so tsx handles the .ts → .js resolution at runtime. @@ -58,16 +71,6 @@ await import("../open-sse/utils/setupPolyfill.ts"); const { registerAliasResolver } = await import("./aliasResolver.mjs"); await registerAliasResolver(ROOT); -// MCP stdio transport uses stdout exclusively for JSON-RPC messages. -// Redirect console.log/warn to stderr early (before loadEnvFile and DB init) -// so no startup output corrupts the protocol. -if (process.argv.includes("--mcp")) { - const { Console } = await import("node:console"); - const stderrConsole = new Console({ stdout: process.stderr, stderr: process.stderr }); - console.log = stderrConsole.log.bind(stderrConsole); - console.warn = stderrConsole.warn.bind(stderrConsole); -} - // Electron persists secrets (JWT_SECRET, API_KEY_SECRET, STORAGE_ENCRYPTION_KEY) to // `/server.env` (electron/main.js), never `.env`. Migrating an existing // install (storage.sqlite + server.env) to the CLI left those secrets undiscoverable — diff --git a/bin/restore-policies.sh b/bin/restore-policies.sh index de1c2608aa..4472fb601f 100755 --- a/bin/restore-policies.sh +++ b/bin/restore-policies.sh @@ -39,7 +39,8 @@ snap="$(ops_find_snapshot "$ID")" # Policy definition tables present in BOTH the snapshot and the live DB. GLOB # keeps `_` literal; we drop usage counters / logs so accounting isn't rewound. -readarray -t tables < <( +tables=() +while IFS= read -r t; do tables+=("$t"); done < <( sqlite3 "$snap/storage.sqlite" \ "SELECT name FROM sqlite_master WHERE type='table' AND name GLOB 'api_key*' \ AND name NOT GLOB '*counter*' AND name NOT GLOB '*_log*' ORDER BY name;" diff --git a/changelog.d/features/6736-response-content-encoding.md b/changelog.d/features/6736-response-content-encoding.md new file mode 100644 index 0000000000..14ed572868 --- /dev/null +++ b/changelog.d/features/6736-response-content-encoding.md @@ -0,0 +1 @@ +- **feat(api):** add response content encoding verification — confirms Next.js compress:true and documents stripStaleForwardingHeaders behavior ([#6736](https://github.com/diegosouzapw/OmniRoute/issues/6736)) diff --git a/changelog.d/features/6752-plugins-marketplace-install-api.md b/changelog.d/features/6752-plugins-marketplace-install-api.md new file mode 100644 index 0000000000..4b53508688 --- /dev/null +++ b/changelog.d/features/6752-plugins-marketplace-install-api.md @@ -0,0 +1 @@ +- **feat(api):** add plugins marketplace install endpoint with checksum verification ([#6752](https://github.com/diegosouzapw/OmniRoute/issues/6752)) diff --git a/changelog.d/features/7679-chatgpt-web-thinking-tool-emulation.md b/changelog.d/features/7679-chatgpt-web-thinking-tool-emulation.md new file mode 100644 index 0000000000..fcd0ec4a14 --- /dev/null +++ b/changelog.d/features/7679-chatgpt-web-thinking-tool-emulation.md @@ -0,0 +1 @@ +- **feat(chatgpt-web):** harden prompt-emulated tool contract for thinking models (#7679 — thanks @horacecar) diff --git a/changelog.d/features/8237-reduce-idle-memory-small-vps.md b/changelog.d/features/8237-reduce-idle-memory-small-vps.md new file mode 100644 index 0000000000..4127a21a70 --- /dev/null +++ b/changelog.d/features/8237-reduce-idle-memory-small-vps.md @@ -0,0 +1 @@ +- **docs:** add low-memory/small VPS optimization guide ([#8237](https://github.com/diegosouzapw/OmniRoute/issues/8237)) diff --git a/changelog.d/features/8369-connection-level-upstream-headers.md b/changelog.d/features/8369-connection-level-upstream-headers.md new file mode 100644 index 0000000000..250c797819 --- /dev/null +++ b/changelog.d/features/8369-connection-level-upstream-headers.md @@ -0,0 +1 @@ +- **feat(providers):** add connection-level custom upstream headers via `provider_specific_data.customHeaders` — applied to every request through that connection, with model-level headers overriding on the same case-insensitive name. (thanks @Benson-mk) \ No newline at end of file diff --git a/changelog.d/features/8461-runomniroutecli-approval-gate.md b/changelog.d/features/8461-runomniroutecli-approval-gate.md new file mode 100644 index 0000000000..bf08a096dc --- /dev/null +++ b/changelog.d/features/8461-runomniroutecli-approval-gate.md @@ -0,0 +1 @@ +- feat(copilot): add approval gate for runOmniRouteCli commands (#8461) diff --git a/changelog.d/features/8799-electron-remote-server-mode.md b/changelog.d/features/8799-electron-remote-server-mode.md new file mode 100644 index 0000000000..f7c4016b3c --- /dev/null +++ b/changelog.d/features/8799-electron-remote-server-mode.md @@ -0,0 +1 @@ +- **feat(electron):** Desktop app can now attach to an already-running OmniRoute server (e.g. a Docker/OrbStack container) instead of always spawning its own bundled server — configurable via the tray's "Remote Server → Connect to Remote Server…" or the `OMNIROUTE_REMOTE_URL` env var ([#8799](https://github.com/diegosouzapw/OmniRoute/pull/8799)) — thanks @soulhakr diff --git a/changelog.d/features/9031-regolo-ai-provider.md b/changelog.d/features/9031-regolo-ai-provider.md new file mode 100644 index 0000000000..0af978fafe --- /dev/null +++ b/changelog.d/features/9031-regolo-ai-provider.md @@ -0,0 +1 @@ +- **feat(providers):** add Regolo AI OpenAI-compatible provider ([#9031](https://github.com/diegosouzapw/OmniRoute/issues/9031)) diff --git a/changelog.d/features/9068-editable-discovered-provider-slugs.md b/changelog.d/features/9068-editable-discovered-provider-slugs.md new file mode 100644 index 0000000000..cc5bcee236 --- /dev/null +++ b/changelog.d/features/9068-editable-discovered-provider-slugs.md @@ -0,0 +1 @@ +- **feat(db):** add provider-scoped model aliases that survive rediscovery ([#9068](https://github.com/diegosouzapw/OmniRoute/issues/9068)) diff --git a/changelog.d/features/9243-forwarded-header-budget-env.md b/changelog.d/features/9243-forwarded-header-budget-env.md new file mode 100644 index 0000000000..830ce41612 --- /dev/null +++ b/changelog.d/features/9243-forwarded-header-budget-env.md @@ -0,0 +1 @@ +- feat: make forwarded upstream response-header budget configurable via env var (#9243) diff --git a/changelog.d/features/9248-video-url-passthrough.md b/changelog.d/features/9248-video-url-passthrough.md new file mode 100644 index 0000000000..de1c81b6f0 --- /dev/null +++ b/changelog.d/features/9248-video-url-passthrough.md @@ -0,0 +1 @@ +- **feat(providers):** make video_url passthrough configurable per provider/model via compat override ([#9248](https://github.com/diegosouzapw/OmniRoute/issues/9248)) — thanks @HellFiveOsborn diff --git a/changelog.d/features/9270-provider-api-key-links.md b/changelog.d/features/9270-provider-api-key-links.md new file mode 100644 index 0000000000..f6e884cea5 --- /dev/null +++ b/changelog.d/features/9270-provider-api-key-links.md @@ -0,0 +1 @@ +- **feat(dashboard):** render a conditional "Get API key" link on the provider detail page, surfaced from the existing `notice.apiKeyUrl` / `notice.signupUrl` catalog metadata (e.g. `pioneer`, `jina`, `together`). The link opens in a new tab and is hidden when neither URL is present, so existing providers are unaffected. Tracks the notice field in `ProviderCatalogMetadata` ([#9270](https://github.com/diegosouzapw/OmniRoute/pull/9270)) diff --git a/changelog.d/features/9284-json-cookie-input.md b/changelog.d/features/9284-json-cookie-input.md new file mode 100644 index 0000000000..100842dcc0 --- /dev/null +++ b/changelog.d/features/9284-json-cookie-input.md @@ -0,0 +1 @@ +- **feat(providers):** accept JSON cookie objects in normalizeSessionCookieHeader (#9284 — thanks @AIB1TAL0S) diff --git a/changelog.d/features/9318-opencode-zen-reasoning-effort.md b/changelog.d/features/9318-opencode-zen-reasoning-effort.md new file mode 100644 index 0000000000..49f8e78a84 --- /dev/null +++ b/changelog.d/features/9318-opencode-zen-reasoning-effort.md @@ -0,0 +1 @@ +- **feat(providers):** support max reasoning effort for opencode-zen DeepSeek models (#9318) diff --git a/changelog.d/features/9415-newapi-sub2api-aggregator-balance.md b/changelog.d/features/9415-newapi-sub2api-aggregator-balance.md new file mode 100644 index 0000000000..91357cf987 --- /dev/null +++ b/changelog.d/features/9415-newapi-sub2api-aggregator-balance.md @@ -0,0 +1 @@ +- **sse:** New-API / One-API / Sub2API aggregator balance detection for compatible nodes — with the "Aggregator Gateway" toggle on, OmniRoute queries the aggregator's `/api/user/self` to read the account balance, shows it as a dashboard badge and lets quota-preflight routing skip exhausted accounts. Gated by the `NEWAPI_AGGREGATOR_BALANCE` feature flag (default off), with a `quotaPerUnit` override for aggregators that do not use the default 500000 units/$1 rate ([#9415](https://github.com/diegosouzapw/OmniRoute/issues/9415)) diff --git a/changelog.d/features/9418-disable-auto-no-think-combos.md b/changelog.d/features/9418-disable-auto-no-think-combos.md new file mode 100644 index 0000000000..0f02309f3f --- /dev/null +++ b/changelog.d/features/9418-disable-auto-no-think-combos.md @@ -0,0 +1 @@ +- **feat(catalog):** added opt-in settings `hideAutoCombos` and `hideNoThinkVariants` (default off) to filter built-in `auto/*` virtual combos and `no-think/*` gateway variants from the `/v1/models` catalog — user-defined combos and original provider models stay listed; routing is unaffected ([#9418](https://github.com/diegosouzapw/OmniRoute/issues/9418)) diff --git a/changelog.d/features/9473-opencode-plugin-model-allowlist.md b/changelog.d/features/9473-opencode-plugin-model-allowlist.md new file mode 100644 index 0000000000..2f0a937812 --- /dev/null +++ b/changelog.d/features/9473-opencode-plugin-model-allowlist.md @@ -0,0 +1 @@ +- **feat(opencode-plugin):** added `features.visibleModels` (allowlist) and `features.hiddenModels` (blocklist) to `@omniroute/opencode-plugin` — curate the OpenCode TUI/CLI model picker from 600+ catalog entries down to an operator-defined ID list that persists in `opencode.json` across config resets ([#9473](https://github.com/diegosouzapw/OmniRoute/issues/9473)) diff --git a/changelog.d/features/9511-quota-exhausted-transient-test-all.md b/changelog.d/features/9511-quota-exhausted-transient-test-all.md new file mode 100644 index 0000000000..d9b3e54270 --- /dev/null +++ b/changelog.d/features/9511-quota-exhausted-transient-test-all.md @@ -0,0 +1 @@ +- **feat(models):** Test All's "Auto-hide failed models" no longer hides quota errors — daily-quota-exhausted and credits-exhausted responses are now classified via the routing path's existing quota detectors, so an evening Test All on a free-tier provider no longer silently wipes the catalog. Quota results stay visible with a distinct amber badge ([#9511](https://github.com/diegosouzapw/OmniRoute/issues/9511)) diff --git a/changelog.d/features/9570-plugin-context-headers.md b/changelog.d/features/9570-plugin-context-headers.md new file mode 100644 index 0000000000..07fc8687c4 --- /dev/null +++ b/changelog.d/features/9570-plugin-context-headers.md @@ -0,0 +1 @@ +- feat(plugins): expose client request headers in plugin onRequest/onResponse context (#9570) diff --git a/changelog.d/features/9579-soniox-audio-provider.md b/changelog.d/features/9579-soniox-audio-provider.md new file mode 100644 index 0000000000..9213793594 --- /dev/null +++ b/changelog.d/features/9579-soniox-audio-provider.md @@ -0,0 +1 @@ +- **feat(audio):** Soniox STT + TTS provider (`sx`) — async speech-to-text (`stt-async-v5`, `stt-async-v4`) and real-time text-to-speech (`tts-rt-v1`) ([#9579](https://github.com/diegosouzapw/OmniRoute/pull/9579)) diff --git a/changelog.d/fixes/8577-fix.plan.md b/changelog.d/fixes/8577-fix.plan.md new file mode 100644 index 0000000000..2b7b175101 --- /dev/null +++ b/changelog.d/fixes/8577-fix.plan.md @@ -0,0 +1,2 @@ +- fix(tests): make machineId tests macOS-compatible by stubbing ioreg in test helper (#8577) +- fix(scripts): replace bash 4+ readarray with compatible while-read loop in restore-policies.sh (#8577) diff --git a/changelog.d/fixes/8609-fix.plan.md b/changelog.d/fixes/8609-fix.plan.md new file mode 100644 index 0000000000..0f8cb8e868 --- /dev/null +++ b/changelog.d/fixes/8609-fix.plan.md @@ -0,0 +1 @@ +- fix(cli): enable systray2 on Windows for Norton-friendly tray (#8609) \ No newline at end of file diff --git a/changelog.d/fixes/8681-fix.plan.md b/changelog.d/fixes/8681-fix.plan.md new file mode 100644 index 0000000000..9abd3a9e87 --- /dev/null +++ b/changelog.d/fixes/8681-fix.plan.md @@ -0,0 +1 @@ +- fix(providers): gate premium opencode-zen/opencode-go models behind an API key (#8681) diff --git a/changelog.d/fixes/8739-yuanbao-sse-parser.md b/changelog.d/fixes/8739-yuanbao-sse-parser.md new file mode 100644 index 0000000000..5893d17799 --- /dev/null +++ b/changelog.d/fixes/8739-yuanbao-sse-parser.md @@ -0,0 +1 @@ +- fix(yuanbao-web): accept `content` field in SSE text events (upstream format change) (#8739) diff --git a/changelog.d/fixes/8781-fix.plan.md b/changelog.d/fixes/8781-fix.plan.md new file mode 100644 index 0000000000..ce761c1555 --- /dev/null +++ b/changelog.d/fixes/8781-fix.plan.md @@ -0,0 +1 @@ +- fix(build): remove misleading open-sse/package.json facade and add workspace typecheck gate (#8781) diff --git a/changelog.d/fixes/8813-chatgpt-sentinel.md b/changelog.d/fixes/8813-chatgpt-sentinel.md new file mode 100644 index 0000000000..0cd1091c5e --- /dev/null +++ b/changelog.d/fixes/8813-chatgpt-sentinel.md @@ -0,0 +1 @@ +- fix(errorClassifier): classify ChatGPT Web SENTINEL_BLOCKED 403 as terminal FORBIDDEN, enabling proper combo fallback (#8813) diff --git a/changelog.d/fixes/8826-fix.plan.md b/changelog.d/fixes/8826-fix.plan.md new file mode 100644 index 0000000000..9549452e3c --- /dev/null +++ b/changelog.d/fixes/8826-fix.plan.md @@ -0,0 +1 @@ +- fix(cli): fall back to node:sqlite when better-sqlite3 constructor throws at runtime (#8826) \ No newline at end of file diff --git a/changelog.d/fixes/8830-fix.plan.md b/changelog.d/fixes/8830-fix.plan.md new file mode 100644 index 0000000000..5cb0cf3c28 --- /dev/null +++ b/changelog.d/fixes/8830-fix.plan.md @@ -0,0 +1 @@ +- fix(opencode): prefix provider id with "opencode-" for auth login command (#8830) \ No newline at end of file diff --git a/changelog.d/fixes/8841-fix.plan.md b/changelog.d/fixes/8841-fix.plan.md new file mode 100644 index 0000000000..6eca00c5b6 --- /dev/null +++ b/changelog.d/fixes/8841-fix.plan.md @@ -0,0 +1 @@ +- fix(opencode-zen): add current free-tier models to registry to enable combo context pre-filtering (#8841) diff --git a/changelog.d/fixes/8869-opencode-complete-model-limits.md b/changelog.d/fixes/8869-opencode-complete-model-limits.md new file mode 100644 index 0000000000..9647ab8d39 --- /dev/null +++ b/changelog.d/fixes/8869-opencode-complete-model-limits.md @@ -0,0 +1 @@ +- **fix(opencode):** generate schema-complete model limits so OpenCode accepts catalog entries without an explicit output cap ([#8869](https://github.com/diegosouzapw/OmniRoute/pull/8869)) — thanks @xiaoyaner0201 diff --git a/changelog.d/fixes/8876-codex-responses-wire-default.md b/changelog.d/fixes/8876-codex-responses-wire-default.md new file mode 100644 index 0000000000..cca93603ff --- /dev/null +++ b/changelog.d/fixes/8876-codex-responses-wire-default.md @@ -0,0 +1 @@ +- **fix(cli):** default omitted Codex CLI wire API settings to Responses and clear stale Chat state after reset ([#8876](https://github.com/diegosouzapw/OmniRoute/pull/8876)) — thanks @xiaoyaner0201 diff --git a/changelog.d/fixes/8883-proxy-credential-autofill.md b/changelog.d/fixes/8883-proxy-credential-autofill.md new file mode 100644 index 0000000000..71d03dbe78 --- /dev/null +++ b/changelog.d/fixes/8883-proxy-credential-autofill.md @@ -0,0 +1 @@ +- **fix(proxy):** isolate new proxy credential fields from browser and password-manager autofill after form reset ([#8883](https://github.com/diegosouzapw/OmniRoute/pull/8883)) — thanks @xiaoyaner0201 diff --git a/changelog.d/fixes/8921-codebuddy-cn-dual-auth-actions.md b/changelog.d/fixes/8921-codebuddy-cn-dual-auth-actions.md new file mode 100644 index 0000000000..5e2ce88591 --- /dev/null +++ b/changelog.d/fixes/8921-codebuddy-cn-dual-auth-actions.md @@ -0,0 +1 @@ +- **fix(providers):** expose both OAuth Connect and manual API-key actions for dual-auth providers such as CodeBuddy CN ([#8921](https://github.com/diegosouzapw/OmniRoute/pull/8921)) — thanks @Llliao1113 diff --git a/changelog.d/fixes/8946-no-tool-output.md b/changelog.d/fixes/8946-no-tool-output.md new file mode 100644 index 0000000000..9dd6ed3369 --- /dev/null +++ b/changelog.d/fixes/8946-no-tool-output.md @@ -0,0 +1 @@ +- fix(compression): drop orphan custom_tool_call/local_shell_call/apply_patch_call on compaction restore (#8946) diff --git a/changelog.d/fixes/8960-fix.plan.md b/changelog.d/fixes/8960-fix.plan.md new file mode 100644 index 0000000000..2dca8c7069 --- /dev/null +++ b/changelog.d/fixes/8960-fix.plan.md @@ -0,0 +1 @@ +- fix(opencode): propagate vision capability from live catalog into opencode.json (#8960) diff --git a/changelog.d/fixes/8965-fix.plan.md b/changelog.d/fixes/8965-fix.plan.md new file mode 100644 index 0000000000..d557cd7027 --- /dev/null +++ b/changelog.d/fixes/8965-fix.plan.md @@ -0,0 +1 @@ +- fix(providers): switch Antigravity quota RPCs to iterate ANTIGRAVITY_RUNTIME_BASE_URLS (#8965) \ No newline at end of file diff --git a/changelog.d/fixes/8994-vertex-partner-claude.md b/changelog.d/fixes/8994-vertex-partner-claude.md new file mode 100644 index 0000000000..4e673ffc4b --- /dev/null +++ b/changelog.d/fixes/8994-vertex-partner-claude.md @@ -0,0 +1 @@ +- fix(vertex): route Claude models to native rawPredict endpoint and respect custom targetFormat overrides (#8994) diff --git a/changelog.d/fixes/8995-fix.plan.md b/changelog.d/fixes/8995-fix.plan.md new file mode 100644 index 0000000000..5ce1ddc6a2 --- /dev/null +++ b/changelog.d/fixes/8995-fix.plan.md @@ -0,0 +1 @@ +- fix(proxies): resolveProxyForConnection now returns the proxy name, so the dashboard badge shows the name instead of the hostname (#8995) diff --git a/changelog.d/fixes/9029-cursor-narration.md b/changelog.d/fixes/9029-cursor-narration.md new file mode 100644 index 0000000000..852f75f192 --- /dev/null +++ b/changelog.d/fixes/9029-cursor-narration.md @@ -0,0 +1 @@ +- fix(cursor): preserve tool context across multi-turn conversations when client lacks conversation_id (#9029) diff --git a/changelog.d/fixes/9030-antigravity-system-429s.md b/changelog.d/fixes/9030-antigravity-system-429s.md new file mode 100644 index 0000000000..da2ebecece --- /dev/null +++ b/changelog.d/fixes/9030-antigravity-system-429s.md @@ -0,0 +1 @@ +- fix(sse): move Antigravity client system content to first user message to avoid upstream 429 RESOURCE_EXHAUSTED on oversized systemInstruction (#9030) diff --git a/changelog.d/fixes/9045-fix.plan.md b/changelog.d/fixes/9045-fix.plan.md new file mode 100644 index 0000000000..6065f9a181 --- /dev/null +++ b/changelog.d/fixes/9045-fix.plan.md @@ -0,0 +1 @@ +- fix(db): stream DB backup export instead of buffering entire file into memory (#9045) \ No newline at end of file diff --git a/changelog.d/fixes/9046-fix.md b/changelog.d/fixes/9046-fix.md new file mode 100644 index 0000000000..e80cc7b528 --- /dev/null +++ b/changelog.d/fixes/9046-fix.md @@ -0,0 +1 @@ +- fix(ui): normalize Free Pool API response payload to read from data.proxies (#9046) \ No newline at end of file diff --git a/changelog.d/fixes/9054-fix.plan.md b/changelog.d/fixes/9054-fix.plan.md new file mode 100644 index 0000000000..2efd3cf8f4 --- /dev/null +++ b/changelog.d/fixes/9054-fix.plan.md @@ -0,0 +1 @@ +- fix(api/analytics): stop charging :free models at arbitrary fallback price (#9054) diff --git a/changelog.d/fixes/9073-batches-list-limit-validation.md b/changelog.d/fixes/9073-batches-list-limit-validation.md new file mode 100644 index 0000000000..18f5538f82 --- /dev/null +++ b/changelog.d/fixes/9073-batches-list-limit-validation.md @@ -0,0 +1 @@ +- **fix(batches):** `GET /v1/batches` now validates the `limit` query param instead of passing `Number.parseInt(limit)` straight to the SQLite `LIMIT` bind. Previously `?limit=abc` threw an unhandled `datatype mismatch` (→ HTTP 500), `?limit=-1`/`0` returned an incoherent `has_more:true` empty page with `last_id:null`, and a large `?limit` read the entire `batches` table into memory. It now returns a `400` for any non-integer or out-of-range value (1–100, default 20), matching the `POST` handler's Zod validation and the OpenAI Batches contract ([#9073](https://github.com/diegosouzapw/OmniRoute/pull/9073)) diff --git a/changelog.d/fixes/9083-a2a-auth-timing-safe.md b/changelog.d/fixes/9083-a2a-auth-timing-safe.md new file mode 100644 index 0000000000..c5a64776c1 --- /dev/null +++ b/changelog.d/fixes/9083-a2a-auth-timing-safe.md @@ -0,0 +1 @@ +- **fix(a2a):** the A2A JSON-RPC router now compares the bearer token against `OMNIROUTE_API_KEY` in constant time (`crypto.timingSafeEqual`) instead of `===`, closing a token-length timing side-channel, and no longer logs the request URL to server logs on every call ([#9083](https://github.com/diegosouzapw/OmniRoute/pull/9083)) diff --git a/changelog.d/fixes/9088-skills-routes-error-sanitization.md b/changelog.d/fixes/9088-skills-routes-error-sanitization.md new file mode 100644 index 0000000000..7962220e6c --- /dev/null +++ b/changelog.d/fixes/9088-skills-routes-error-sanitization.md @@ -0,0 +1 @@ +- **fix(api/skills):** the `/api/skills/**` routes now run caught error messages through `sanitizeErrorMessage` before returning them, so a filesystem failure no longer leaks an absolute path (e.g. `/home//.omniroute/skills/...`) to the client; the `{ error: string }` response shape is preserved for the dashboard ([#9088](https://github.com/diegosouzapw/OmniRoute/pull/9088)) diff --git a/changelog.d/fixes/9102-fix.plan.md b/changelog.d/fixes/9102-fix.plan.md new file mode 100644 index 0000000000..bfbfed5c22 --- /dev/null +++ b/changelog.d/fixes/9102-fix.plan.md @@ -0,0 +1 @@ +- fix(providers): modal.com validation returns clear error when Base URL is missing, instead of leaking "Invalid outbound URL" (#9102) \ No newline at end of file diff --git a/changelog.d/fixes/9159-fix.plan.md b/changelog.d/fixes/9159-fix.plan.md new file mode 100644 index 0000000000..22d84fba2a --- /dev/null +++ b/changelog.d/fixes/9159-fix.plan.md @@ -0,0 +1 @@ +- fix(management): authorize mcp:connect-only keys on loopback/LAN when requireLogin is enabled (#9159) \ No newline at end of file diff --git a/changelog.d/fixes/9195-fix.plan.md b/changelog.d/fixes/9195-fix.plan.md new file mode 100644 index 0000000000..966b51cad7 --- /dev/null +++ b/changelog.d/fixes/9195-fix.plan.md @@ -0,0 +1,2 @@ +- fix(catalog): repair dead guard and synced-first ordering for custom model Vision capable override (#9195) +- fix(routing): consult customModels supportsVision flag in Combo vision filter (#9195) diff --git a/changelog.d/fixes/9201-web-search-proxy-bind.plan.md b/changelog.d/fixes/9201-web-search-proxy-bind.plan.md new file mode 100644 index 0000000000..67a72dd64f --- /dev/null +++ b/changelog.d/fixes/9201-web-search-proxy-bind.plan.md @@ -0,0 +1 @@ +- fix(web-search): bind each search provider attempt to its connection proxy (#9201) \ No newline at end of file diff --git a/changelog.d/fixes/9204-fix.plan.md b/changelog.d/fixes/9204-fix.plan.md new file mode 100644 index 0000000000..21981ed128 --- /dev/null +++ b/changelog.d/fixes/9204-fix.plan.md @@ -0,0 +1 @@ +- fix(auth): make antigravity and agy equivalent in credential selection (#9204) diff --git a/changelog.d/fixes/9237-fix.plan.md b/changelog.d/fixes/9237-fix.plan.md new file mode 100644 index 0000000000..fde574eb17 --- /dev/null +++ b/changelog.d/fixes/9237-fix.plan.md @@ -0,0 +1 @@ +- fix(lmarena): emit Uint8Array SSE chunks instead of strings to satisfy shared pipeline contract (#9237) \ No newline at end of file diff --git a/changelog.d/fixes/9259-rolling-rpm-leases.md b/changelog.d/fixes/9259-rolling-rpm-leases.md new file mode 100644 index 0000000000..a20f6c4367 --- /dev/null +++ b/changelog.d/fixes/9259-rolling-rpm-leases.md @@ -0,0 +1 @@ +- **fix(resilience):** Enforce RPM limits with rolling leases and atomic global/provider/account admission ([#9259](https://github.com/diegosouzapw/OmniRoute/pull/9259)). The configured global RPM budget is shared across all enabled provider connections within one process; provider/account overrides add narrower scopes. diff --git a/changelog.d/fixes/9277-fix.plan.md b/changelog.d/fixes/9277-fix.plan.md new file mode 100644 index 0000000000..b161675e43 --- /dev/null +++ b/changelog.d/fixes/9277-fix.plan.md @@ -0,0 +1 @@ +- fix(qoder): include actionable CLI_QODER_BIN hint in connection test when qodercli is not found (#9277) \ No newline at end of file diff --git a/changelog.d/fixes/9279-fix.plan.md b/changelog.d/fixes/9279-fix.plan.md new file mode 100644 index 0000000000..5dbc10c5f4 --- /dev/null +++ b/changelog.d/fixes/9279-fix.plan.md @@ -0,0 +1 @@ +- **fix(providers):** the web search fallback detector in `webSearchFallback.ts` used an exact `Set` (`web_search`, `web_search_preview`) that missed Anthropic's date-suffixed server-tool variant `web_search_20250305` (sent by Claude Code 2.1.220+). Changed to prefix regex `/^web_search/`, matching the two other detectors in the codebase, so the fallback intercepts versioned web search tools for OpenAI-compatible upstreams ([#9279](https://github.com/diegosouzapw/OmniRoute/pull/9279)) diff --git a/changelog.d/fixes/9289-fix.plan.md b/changelog.d/fixes/9289-fix.plan.md new file mode 100644 index 0000000000..284df06aec --- /dev/null +++ b/changelog.d/fixes/9289-fix.plan.md @@ -0,0 +1 @@ +- fix(credential-health): scheduler never retries failed connections due to static interval comparison (#9289) diff --git a/changelog.d/fixes/9293-fix.plan.md b/changelog.d/fixes/9293-fix.plan.md new file mode 100644 index 0000000000..96e6f6727a --- /dev/null +++ b/changelog.d/fixes/9293-fix.plan.md @@ -0,0 +1 @@ +- fix(api): specialty model catalog ignores hidden OpenRouter model flags (#9293) \ No newline at end of file diff --git a/changelog.d/fixes/9300-fix.plan.md b/changelog.d/fixes/9300-fix.plan.md new file mode 100644 index 0000000000..c83558b707 --- /dev/null +++ b/changelog.d/fixes/9300-fix.plan.md @@ -0,0 +1 @@ +- fix(catalog): cache getModelsDevPricing() to prevent OOM at startup (#9300) \ No newline at end of file diff --git a/changelog.d/fixes/9304-fix.plan.md b/changelog.d/fixes/9304-fix.plan.md new file mode 100644 index 0000000000..ad7e0b0ecb --- /dev/null +++ b/changelog.d/fixes/9304-fix.plan.md @@ -0,0 +1 @@ +- fix(providers): bump qwen-web SPA version header from 0.2.66 to 0.2.81 (#9304) diff --git a/changelog.d/fixes/9315-fix.plan.md b/changelog.d/fixes/9315-fix.plan.md new file mode 100644 index 0000000000..31fcc09f78 --- /dev/null +++ b/changelog.d/fixes/9315-fix.plan.md @@ -0,0 +1 @@ +- fix(backend): use accumulated responseBody for provider payload in dashboard log viewer to avoid stale data from truncated SSE events (#9315) \ No newline at end of file diff --git a/changelog.d/fixes/9319-fix.plan.md b/changelog.d/fixes/9319-fix.plan.md new file mode 100644 index 0000000000..dc5f04e762 --- /dev/null +++ b/changelog.d/fixes/9319-fix.plan.md @@ -0,0 +1 @@ +- fix(qoder): surface qodercli stderr in error message instead of generic 502 (#9319) diff --git a/changelog.d/fixes/9431-codex-gpt56-context.md b/changelog.d/fixes/9431-codex-gpt56-context.md new file mode 100644 index 0000000000..da11703298 --- /dev/null +++ b/changelog.d/fixes/9431-codex-gpt56-context.md @@ -0,0 +1 @@ +- **fix(providers):** Codex GPT-5.6 model metadata reports the 1M context window and 922K input limit ([#9431](https://github.com/diegosouzapw/OmniRoute/issues/9431)). diff --git a/changelog.d/fixes/9435-kiro-import-overwrite.md b/changelog.d/fixes/9435-kiro-import-overwrite.md new file mode 100644 index 0000000000..9081e7537b --- /dev/null +++ b/changelog.d/fixes/9435-kiro-import-overwrite.md @@ -0,0 +1 @@ +- fix(oauth): Kiro import token endpoint no longer overwrites existing connection when using shared cached OIDC clientId (#9435) diff --git a/changelog.d/fixes/9491-port-3005-auth-redirect-login.md b/changelog.d/fixes/9491-port-3005-auth-redirect-login.md new file mode 100644 index 0000000000..8c82bc1b43 --- /dev/null +++ b/changelog.d/fixes/9491-port-3005-auth-redirect-login.md @@ -0,0 +1 @@ +- **fix(auth):** redirect active sessions from /login by checking the session cookie before showing the login form. (thanks @DaDecky) diff --git a/changelog.d/fixes/9494-chat-history-cap-opt-in.md b/changelog.d/fixes/9494-chat-history-cap-opt-in.md new file mode 100644 index 0000000000..30e0be1e03 --- /dev/null +++ b/changelog.d/fixes/9494-chat-history-cap-opt-in.md @@ -0,0 +1 @@ +- fix(api): make the 800-message chat history cap opt-in so long conversations reach compression instead of a terminal 413 (#9494) diff --git a/changelog.d/fixes/9531-ci-combo-matrix.md b/changelog.d/fixes/9531-ci-combo-matrix.md new file mode 100644 index 0000000000..c5ff766166 --- /dev/null +++ b/changelog.d/fixes/9531-ci-combo-matrix.md @@ -0,0 +1 @@ +- fix(ci): include combo-matrix tests in test-integration job (#9531) diff --git a/changelog.d/fixes/9534-modelsdevsync-timers.md b/changelog.d/fixes/9534-modelsdevsync-timers.md new file mode 100644 index 0000000000..a12b4448c4 --- /dev/null +++ b/changelog.d/fixes/9534-modelsdevsync-timers.md @@ -0,0 +1 @@ +- fix(test): prevent flaky modelsDevSync timer assertions by serializing test execution within the file (#9534) diff --git a/changelog.d/fixes/9536-usage-misreporting.md b/changelog.d/fixes/9536-usage-misreporting.md new file mode 100644 index 0000000000..ad6daa28ee --- /dev/null +++ b/changelog.d/fixes/9536-usage-misreporting.md @@ -0,0 +1 @@ +- fix(backend): map cache tokens in OpenAI-to-Claude non-streaming usage translation (#9536) diff --git a/changelog.d/fixes/9541-fastpath-db-corruption.md b/changelog.d/fixes/9541-fastpath-db-corruption.md new file mode 100644 index 0000000000..b15f04fa65 --- /dev/null +++ b/changelog.d/fixes/9541-fastpath-db-corruption.md @@ -0,0 +1 @@ +- fix(db): add transient-error retry to corruption probe to prevent data loss under concurrent load (#9541) diff --git a/changelog.d/fixes/9543-searxng-auto-select.md b/changelog.d/fixes/9543-searxng-auto-select.md new file mode 100644 index 0000000000..2798fab967 --- /dev/null +++ b/changelog.d/fixes/9543-searxng-auto-select.md @@ -0,0 +1 @@ +- fix(search): mark searxng-search as fallbackOnly to prevent auto-select without instance (#9543) diff --git a/changelog.d/fixes/9545-gpt56-effort-tools.md b/changelog.d/fixes/9545-gpt56-effort-tools.md new file mode 100644 index 0000000000..7cc1a77bb3 --- /dev/null +++ b/changelog.d/fixes/9545-gpt56-effort-tools.md @@ -0,0 +1 @@ +- fix(providers): strip provider prefix in getModelTargetFormat to route GPT-5.6 models to /v1/responses (#9545) diff --git a/changelog.d/fixes/9550-amazon-q-alias.md b/changelog.d/fixes/9550-amazon-q-alias.md new file mode 100644 index 0000000000..b984b8bfc0 --- /dev/null +++ b/changelog.d/fixes/9550-amazon-q-alias.md @@ -0,0 +1 @@ +- fix(model): add "aq" alias for amazon-q provider so parseModel resolves it instead of falling back to OpenAI (#9550) diff --git a/changelog.d/fixes/9551-proxyfetch-context-bypass.md b/changelog.d/fixes/9551-proxyfetch-context-bypass.md new file mode 100644 index 0000000000..eeefa9d7e6 --- /dev/null +++ b/changelog.d/fixes/9551-proxyfetch-context-bypass.md @@ -0,0 +1 @@ +- fix(proxy): NO_PROXY now bypasses context-level proxy in resolveProxyForRequest (#9551) diff --git a/changelog.d/fixes/9553-prepublish-npm-entry-posix.md b/changelog.d/fixes/9553-prepublish-npm-entry-posix.md new file mode 100644 index 0000000000..af1b199ee3 --- /dev/null +++ b/changelog.d/fixes/9553-prepublish-npm-entry-posix.md @@ -0,0 +1 @@ +- **fix(build):** `npm run build:cli` (prepublish) no longer fails on POSIX with "npm-cli.js not found next to the running Node binary". The #8858 shim-free npm resolver only knew the Windows layout (`\node_modules\npm`); on GitHub hosted runners, nvm and system installs npm lives at `/lib/node_modules/npm` while node is `/bin/node`, so every fresh CI checkout died installing `@omniroute/opencode-plugin` deps (Fast Production Build + dast-smoke red on all PRs). The resolver, extracted to `scripts/build/resolveNpmEntry.ts`, now tries `npm_execpath` (exported by `npm run` itself) first, then the Windows layout, then the POSIX layout — covered by `tests/unit/build/resolve-npm-entry.test.ts` including a live POSIX regression guard. diff --git a/changelog.d/fixes/9554-file-size-inherited-drift-reconcile.md b/changelog.d/fixes/9554-file-size-inherited-drift-reconcile.md new file mode 100644 index 0000000000..095d7609d2 --- /dev/null +++ b/changelog.d/fixes/9554-file-size-inherited-drift-reconcile.md @@ -0,0 +1 @@ +- **fix(quality):** reconcile the accumulated file-size drift on `release/v3.8.50` — 13 files sat above their frozen LOC on the clean tip (measured by the gate itself), turning the absolute-mode check (nightly / local) permanently red while the PR-mode base-relative check (#8522) let every innocent PR pass. The per-PR rebaselines were lost across successive conflict resolutions of this hot file during the 08-05/06 merge batch. Frozen values updated to the measured tip for the 11 grown files (each annotated with its owning merged PR: #9024 #9324 #9329 #9193 #9332 #9228 #9260 #8934 #9196 #9163) and `open-sse/executors/default.ts` / `kiro.ts` (above the 1000 cap with no entry) added to the frozen set. diff --git a/changelog.d/fixes/9559-mcp-audit-vitest-seam.md b/changelog.d/fixes/9559-mcp-audit-vitest-seam.md new file mode 100644 index 0000000000..2117839f0b --- /dev/null +++ b/changelog.d/fixes/9559-mcp-audit-vitest-seam.md @@ -0,0 +1 @@ +- **fix(mcp):** the 3 `audit.test.ts` shutdown/fallback tests fail deterministically since #8959 switched the audit DB loader to `createRequire("better-sqlite3")` — `vi.doMock` only patches Vitest's ESM module graph, so the old better-sqlite3 mock never engaged and the tests hit a real empty sqlite file ("no such table: mcp_tool_audit"), redding the `Vitest (fast-path)` job on every PR (long misdiagnosed as a flake). Shutdown tests now inject the mock through the audit connection cache (`globalThis.__omnirouteMcpAuditDb`), and the node:sqlite fallback test drives a new test-only loader seam (`__setBetterSqliteLoaderForTests`) — the production `createRequire` path is unchanged. 3/3 red → 3/3 green; full `open-sse/mcp-server` vitest suite 88/88. diff --git a/changelog.d/fixes/9560-turbopack-nft-guard.md b/changelog.d/fixes/9560-turbopack-nft-guard.md new file mode 100644 index 0000000000..f6ec73d296 --- /dev/null +++ b/changelog.d/fixes/9560-turbopack-nft-guard.md @@ -0,0 +1 @@ +- fix(build): lazy-resolve module-level fs paths to avoid Turbopack NFT whole-source trace (#9560) diff --git a/changelog.d/fixes/9567-chatcore-sse-flaky.md b/changelog.d/fixes/9567-chatcore-sse-flaky.md new file mode 100644 index 0000000000..4dfefc22a0 --- /dev/null +++ b/changelog.d/fixes/9567-chatcore-sse-flaky.md @@ -0,0 +1 @@ +- fix(sse): replace timer-based waits with polling to fix flaky chatCore/SSE tests under CI load (#9567) diff --git a/changelog.d/fixes/9568-gemini-tool-casing.md b/changelog.d/fixes/9568-gemini-tool-casing.md new file mode 100644 index 0000000000..0629e40538 --- /dev/null +++ b/changelog.d/fixes/9568-gemini-tool-casing.md @@ -0,0 +1 @@ +- **fix(translator):** restore original tool name casing in Gemini/Antigravity response translators ([#9568](https://github.com/diegosouzapw/OmniRoute/issues/9568)) diff --git a/changelog.d/fixes/9575-tool-call-case.md b/changelog.d/fixes/9575-tool-call-case.md new file mode 100644 index 0000000000..dd3e888151 --- /dev/null +++ b/changelog.d/fixes/9575-tool-call-case.md @@ -0,0 +1 @@ +- fix(translator): add case-insensitive fallback for upstream tool call name lookups (#9575) diff --git a/changelog.d/fixes/9580-standalone-ws-multipart-uploads.md b/changelog.d/fixes/9580-standalone-ws-multipart-uploads.md new file mode 100644 index 0000000000..b22b6f7fc2 --- /dev/null +++ b/changelog.d/fixes/9580-standalone-ws-multipart-uploads.md @@ -0,0 +1 @@ +- **fix(standalone):** multipart uploads (`POST /v1/audio/transcriptions`) no longer hang — the WebDAV wrapper hands non-WebDAV requests to Next synchronously instead of losing the start of a streaming body ([#9580](https://github.com/diegosouzapw/OmniRoute/pull/9580)) diff --git a/changelog.d/fixes/9630-combo-false-503.md b/changelog.d/fixes/9630-combo-false-503.md new file mode 100644 index 0000000000..5558818649 --- /dev/null +++ b/changelog.d/fixes/9630-combo-false-503.md @@ -0,0 +1 @@ +- fix(combo): distinguish pre-dispatch skips from genuine failures to prevent false 503 ALL_ACCOUNTS_INACTIVE (#9630) diff --git a/changelog.d/fixes/ghe-copilot-oauth-lifecycle.md b/changelog.d/fixes/ghe-copilot-oauth-lifecycle.md new file mode 100644 index 0000000000..48101d76c6 --- /dev/null +++ b/changelog.d/fixes/ghe-copilot-oauth-lifecycle.md @@ -0,0 +1,2 @@ +- **fix(oauth):** GHE Copilot OAuth lifecycle — connecting an account and refreshing its token both failed. Adding a connection died with `gheUrl is required for GHE Copilot OAuth` because the poll handler's `ghe-copilot` branch was unreachable dead code: the provider is listed in `NO_PKCE_DEVICE_CODE_PROVIDERS`, and that set-based check ran first, calling `pollForToken()` without the `extraData` carrying `gheUrl`. Separately, every manual `Refresh` click surfaced `Token refresh failed — provider returned no new token`, and the proactive pre-request refresh never fired for GHE connections — the manual route, the health-check sweep and `checkAndRefreshToken()` all still special-cased plain `github`, while GHE Copilot's device-code flow never yields a `refresh_token` (only a GitHub access token plus a short-lived Copilot sub-token). `refreshCopilotToken()` now takes an optional `baseUrl` so it can target a GHE host's `/api/v3` Copilot token endpoint, and `ghe-copilot` is wired in alongside `github` at all four sites. +- **fix(health-check):** the access-token-only branch of the token health-check sweep no longer logs an unconditional `has no refresh token but has a GitHub access token` line on every tick. That path runs once per 60 s sweep for every `github` / `ghe-copilot` connection, so it emitted ~1440 identical entries per day per connection reporting that nothing had changed. It now logs only when the sweep actually attempted a Copilot sub-token refresh, and says whether that refresh succeeded or failed — so a genuine failure still surfaces instead of being buried in steady-state noise. diff --git a/changelog.d/fixes/prepublish-native-esbuild.md b/changelog.d/fixes/prepublish-native-esbuild.md new file mode 100644 index 0000000000..60c7b76d94 --- /dev/null +++ b/changelog.d/fixes/prepublish-native-esbuild.md @@ -0,0 +1 @@ +- fix(build): exec native esbuild binary directly in prepublish — esbuild ≥0.25 ships an ELF at bin/esbuild and running it through node crashed every build:cli (dast-smoke red on all PRs) diff --git a/changelog.d/maintenance/9063-cover-specificity-rules.md b/changelog.d/maintenance/9063-cover-specificity-rules.md new file mode 100644 index 0000000000..f4e0ef5ce6 --- /dev/null +++ b/changelog.d/maintenance/9063-cover-specificity-rules.md @@ -0,0 +1,7 @@ +- **test(sse):** added the first test suite for `open-sse/services/specificityRules.ts` — the + module was hotspot #7 in the coverage plan at 11.28% lines with no dedicated test; the 14 pure + detectors are now pinned edge-to-edge (token ladders, per-domain max-not-sum scoring, and the + min/max clamps), taking the file to ~100% line coverage. The suite also documents two quirks + left unchanged: `detectReasoningDepth` scores above 0 on marker-free input via its + always-applied message-depth bonus, and `detectErrorContext` returns non-integer scores because + it never rounds ([#9063](https://github.com/diegosouzapw/OmniRoute/pull/9063)) diff --git a/changelog.d/maintenance/rtl-physical-class-ratchet.md b/changelog.d/maintenance/rtl-physical-class-ratchet.md new file mode 100644 index 0000000000..16432ea051 --- /dev/null +++ b/changelog.d/maintenance/rtl-physical-class-ratchet.md @@ -0,0 +1 @@ +- chore(quality): add an RTL layout ratchet — counts physical directional Tailwind classes (ml/mr/pl/pr/left/right/text-left/border-l/rounded-l) that do not mirror under `dir=rtl`, seeded at 1011 so the backlog behind `tests/unit/ui/rtl-logical-classes.test.tsx` ("#3541, partial, core layout") cannot grow while it is worked through diff --git a/config/quality/complexity-baseline.json b/config/quality/complexity-baseline.json index 51d34cd861..f121ddbb24 100644 --- a/config/quality/complexity-baseline.json +++ b/config/quality/complexity-baseline.json @@ -1,5 +1,8 @@ { "_comment": "Catraca de complexidade (check-complexity.mjs, ESLint core rules complexity>=15 e max-lines-per-function>80 sobre src+open-sse+electron+bin via eslint.complexity.config.mjs). Conta total de violacoes; so pode cair. --update ratcheta.", + "_rebaseline_2026_07_25_dario_upstream_proxy_selector": "2130->2175. PR #8523 (Dario embedded service, upstream-proxy mode selector): check:complexity does not run on PR->release fast-gates, so cycle drift accrues unratcheted until a PR trips the gate (same pattern as every _rebaseline_ entry above). Measured base upstream/release/v3.8.49 tip locally at 2169 (with this PR\u0027s own commits removed); this branch measures 2173 local, 2175 on the CI runner (same local-vs-CI off-by-few convention documented in _rebaseline_2026_07_02_v3844_ci_observed). This PR\u0027s own genuine contribution is small (+4 to +6): the new mode + conditional fallback-backend ` for it exists in +`src/app/(dashboard)/dashboard/radar/page.tsx` yet. + +--- + +## Security model + +### Ed25519 signature over exact bytes + +The feed payload is signed with Ed25519. `verifyFeedBytes()` +(`src/lib/radar/verify.ts`) verifies the signature over the **exact response bytes** +received over the wire — the payload is never re-serialized before verification, so a +byte-for-byte re-encoding cannot silently invalidate or bypass the signature check. +Verification failure (`invalid_signature`) aborts the sync before the payload is ever +parsed or cached. + +### Pinned public key + rotation + +The verifying public key is pinned in `src/lib/radar/pinnedKeys.ts` +(`PINNED_FEED_PUBLIC_KEYS`), an array so a new key can be prepended ahead of a +rotation while old cached feeds signed with a previous key remain valid until +re-synced. + +### Fork-friendly env overrides + +Two env vars let forks and self-hosters point the client at their own feed instead of +the default OmniRoute service — see +[How to self-host a feed](#how-to-self-host-a-feed) below: + +| Var | Purpose | +| ------------------- | ------------------------------------------------------------------------------------------------------------ | +| `RADAR_FEED_URL` | Overrides the feed base URL (default `https://radar.omniroute.online`). | +| `RADAR_FEED_PUBKEY` | Overrides the pinned public key (base64-DER SPKI or PEM), replacing the built-in array with this single key. | + +### Version floor + +`syncRadar()` rejects a downloaded feed whose `version` is not strictly newer than the +currently cached version (`compareVersions()`, dotted `YYYY.MM.DD.n` comparison) — +`{ status: "stale" }`. This prevents a compromised or misconfigured feed endpoint from +rolling a client back to an older, differently-signed payload. + +### Schema validation + +The downloaded bytes are parsed and validated against `RadarFeedSchema` +(`src/lib/radar/feedSchema.ts`, a Zod schema) **after** signature verification. A +schema mismatch returns `{ status: "invalid_schema" }` and the cache is left +untouched. The cached payload is defensively re-validated again on every read +(`getRadarCatalog()`) — a corrupted or hand-edited cache row falls back to the +baseline rather than being served. + +### Response size cap (10 MB) + +`syncRadar()` enforces a **10 MB hard cap** on the feed response body — the signed +feed is a KB-scale JSON document, so anything past this points at a misconfigured or +hostile `RADAR_FEED_URL` (or an upstream serving garbage), not a legitimate catalog. +Enforcement is two-layered: + +1. A `Content-Length` preflight check skips reading the body entirely when the + header already declares a value over the cap. +2. A running-total check while reading the body enforces the cap even when + `Content-Length` is absent or understates the real size — the header is never + trusted on its own. Concatenating the accumulated chunks preserves the exact + bytes needed for the Ed25519 signature check afterward. + +Exceeding the cap returns `{ status: "too_large" }` and leaves the cache untouched, +following the same non-destructive pattern as every other sync failure +(`invalid_signature`, `invalid_schema`, `stale`). + +--- + +## Tiers: `community` and `live` + +The feed schema carries a `tier: "community" | "live"` field, decided **server-side** +by the feed service based on the request (presence and validity of the supporter key) +— the client never decides its own tier. + +- **`community`** — the free catalog delayed by roughly 30 days behind the freshest + data. This is what an unauthenticated or invalid-key request receives. +- **`live`** — the freshest catalog, served to requests carrying a valid supporter + key. + +**An invalid or expired supporter key degrades to `community` — it is never an +error.** The sync path only distinguishes signature/schema/version failures (all +recoverable, all non-fatal to the cached state) from a successful `{ status: +"updated", version, tier }`. There is no tier-specific error path a client needs to +handle. + +### The served tier comes from a response header, not the signed body + +The signed feed **body**'s `tier` field is always `"live"` — the feed service ships +**one signed artifact per version**, so the body cannot carry a per-request tier +without invalidating the Ed25519 signature (re-signing per request would defeat the +point of a pinned, cacheable, verifiable artifact). The tier actually served for a +given request is instead carried in the **`x-omniroute-feed-tier` response header**, +decided server-side from the request's `Authorization` key. + +`syncRadar()` (`src/lib/radar/sync.ts::parseServedTierHeader()`) is the single place +that resolves the tier a client should trust: + +1. Parse `x-omniroute-feed-tier` with `RadarTierSchema` (Zod) — an absent header, or + a value that isn't exactly `"community"` or `"live"`, is treated as **not + present** (never trusted into the cache/UI as-is; this also covers older feed + servers that predate the header). +2. Fall back to the signed body's `tier` field (always `"live"`) only when step 1 + yields nothing. +3. The resolved tier is what gets cached and returned as `{ status: "updated", + version, tier }` — this is the value the dashboard shows, never the raw body + field. + +--- + +## Read-time overlay merge rules + +`applyFeed()` (`src/lib/radar/applyFeed.ts`) merges the cached feed **over** the +static baseline at **read time**, inside `getRadarCatalog()`. The baseline array +(`FREE_MODEL_BUDGETS`) is never mutated — a `MergedEntry[]` is computed fresh on every +call. + +Four rules, in order of precedence: + +1. **Feed never overwrites a local override.** Per-field: if the operator has + customized a field on an entry (`localOverrides` map, keyed `provider:modelId`), + the feed's value for that specific field is skipped — the operator's value wins. +2. **`enabled: false` disables the entry, with provenance.** A feed entry that turns + an entry off sets `enabled: false` and `disabledBy: "radar"` on the merged result, + so the UI can explain _why_ an entry went from available to disabled. +3. **A user-added entry not present in the feed survives untouched.** Entries that + only exist in the baseline (or were added locally) and have no corresponding feed + entry pass through unchanged. +4. **A tombstoned entry is never resurrected.** If the operator explicitly deleted an + entry (`tombstones` set), the feed re-adding that `provider:modelId` in a later + version does not bring it back. + +### Provenance markers + +Every merged entry carries an `origin` field the UI renders as a badge: + +- `"baseline"` — untouched from the static release catalog. +- `"radar"` — one or more fields were refreshed by the feed. +- `"local"` — the operator has at least one local override on this entry (local + overrides always win over the feed per rule 1, regardless of what the feed says). + +--- + +## Local surfaces — never a feed proxy + +Five local routes back the UI, all under `src/app/api/radar/`: + +| Route | Method | Purpose | +| ----------------------- | ------ | -------------------------------------------------------------------------------------------------- | +| `/api/radar/catalog` | GET | Returns the merged catalog (`getRadarCatalog()`) from the local cache. | +| `/api/radar/sync` | POST | Triggers `syncRadar()` server-side; returns the resulting status. | +| `/api/radar/settings` | GET | Returns `{ optIn, hasSupporterKey, supporterKeyMasked }` — never the raw key. | +| `/api/radar/settings` | POST | Sets opt-in and/or the (encrypted) supporter key. | +| `/api/radar/referrals` | GET | Returns `{ fixed, campaigns, tier }` from the local cache — see [Referral links](#referral-links-free-credits) below. | + +**Hard rule: these routes never proxy the feed service.** The browser only ever talks +to the local OmniRoute server; `syncRadar()` is the single module in the whole client +that touches the network for Radar (`src/lib/radar/sync.ts`), and it always runs +server-side, never client-side. This keeps the feed URL and any supporter key +out of client-facing network traffic entirely. + +All five routes return `404` when `RADAR_ENABLED` is off (see +[Flag](#flag-radar_enabled-default-off) above), and route error responses through +`buildErrorBody()`/`sanitizeErrorMessage()` per the repo-wide error-sanitization rule +(`docs/security/ERROR_SANITIZATION.md`). + +### Authentication + +All five routes require authentication via `isAuthenticated()` +(`src/shared/utils/apiAuth.ts`) — a dashboard session cookie or a management-scoped +API key, the same gate that protects the rest of `/api/settings/*`. The flag-off +`404` check always runs **before** the auth check, so an install with `RADAR_ENABLED` +off stays byte-identical (no auth prompt just to learn the surface doesn't exist); +once the flag is on, an unauthenticated request gets `401` before any DB read or +write. `GET /api/radar/settings` never returns the raw supporter key regardless of +auth state — only the masked form and a `hasSupporterKey` boolean. + +--- + +## Referral links (free credits) + +The server-published feed carries a `referrals` section (server-side D28 work, already +in production — this section documents the **client** consumption only): + +```ts +referrals: { + fixed: RadarReferral[], // present in EVERY tier, including community + campaigns: RadarReferral[], // only populated on the live (supporter) tier; + // the community artifact always publishes [] +} +// RadarReferral = { provider, url, kind: "fixo" | "campanha", validUntil, +// requiredAction, isDefault } +``` + +The client never decides which tier it received or which referrals belong in which +tier — the server already publishes two artifacts (`live`/`community`) with +`campaigns` gated server-side, same principle as the [tiers](#tiers-community-and-live) +section above. `RadarFeedSchema` (`src/lib/radar/feedSchema.ts`) validates `referrals` +as a whole-object `.default({fixed:[],campaigns:[]})`, and `campaigns` defaults +independently inside it — so a feed cached before this section existed on the server +still parses cleanly, and `campaigns` alone can also be absent without failing +validation. Every `RadarReferral.url` must be `https://` — a `http://` url fails +schema validation. + +### Accessor + +`src/lib/radar/index.ts` exports two read-only accessors, both never throwing (same +defensive contract as `getRadarCatalog()` — flag off, no cache, or a corrupt/old cached +payload all resolve to the empty shape instead of an error): + +- `getRadarReferrals()` → `{ fixed: RadarReferral[], campaigns: RadarReferral[] }`. +- `getDefaultReferralFor(provider)` → the `fixed` referral with `isDefault: true` for + that provider, or `null`. Only looks at `fixed` — a campaign is never used as a + provider's "default" link. + +The actual "which referral is the default for a provider" rule lives in +`findDefaultReferral()` (`src/lib/radar/referrals.ts`), a small pure function with **no +DB import** — it is safe to import into a `"use client"` component. `getRadarReferrals`/ +`getDefaultReferralFor` (in `index.ts`) pull in `@/lib/db/radar` and therefore stay +server-only; the providers dashboard imports `referrals.ts` directly instead of +`index.ts` (see below) to avoid bundling `better-sqlite3` into the browser. + +### `GET /api/radar/referrals` + +Follows the exact same gate order as every other Radar route: `RADAR_ENABLED` off → +`404` (checked first, byte-identical inertia); unauthenticated → `401`; otherwise `200` +with `{ fixed, campaigns, tier }` — `tier` comes straight from the cache row and is +purely informative (drives the UI's soft upsell copy below), the route does no +gating of its own. Never proxies the feed server — same local-cache-only contract as +`/api/radar/catalog`. + +### Dashboard UI — "Free credits" tab on `/dashboard/radar` + +Reuses the existing Radar page (`src/app/(dashboard)/dashboard/radar/page.tsx`) as a +second tab instead of a new route — less routing/i18n surface for a feature that is a +variation on data the page already fetches. Once opted in, the tab bar offers +**Catalog** (existing table) and **Free credits**: + +- Fixed links are grouped by provider, each showing `requiredAction` (when present) + and a `target="_blank" rel="noopener noreferrer"` button to the referral URL. +- Campaigns show the same, plus `validUntil` when present. +- When `campaigns` is empty **and** the served tier is `community`, the UI shows a + short upsell note ("limited-time campaigns are a supporter extra") — this **never** + hides or gates the fixed links list, which stays fully populated for every tier. The + upsell is soft messaging only, never a block. + +### Referral link on the provider name (providers dashboard) + +`ProviderPageHeader` (`src/app/(dashboard)/dashboard/providers/[id]/components/`) +already linked the provider name to `providerInfo.website` when present, with one +precedent for a monetized link: the Kimi (Moonshot AI) partner-link note +(`providers.kimiPartnerLinkNote` i18n key). D28 reuses that exact same discreet-note +pattern for Radar default referrals instead of introducing a new key. + +Loose coupling, by design: + +- `resolveProviderHeaderLink()` (`src/app/(dashboard)/dashboard/providers/providerPageUtils.ts`) + is a **pure** function — `(staticWebsite, referralUrl) => { website, isReferralLink }` + — with no dependency on `@/lib/radar` or `@/lib/db/*`. `providerPageUtils.ts` as a + whole stays free of those imports (asserted by + `tests/unit/provider-header-referral-link.test.ts`). +- `ProviderDetailPageClient.tsx` (a `"use client"` component) is the one place allowed + to fetch Radar data — via `fetch("/api/radar/referrals")`, the same local-route + pattern the Radar dashboard page itself uses — and it computes the default referral + client-side with `findDefaultReferral()` from the DB-free `src/lib/radar/referrals.ts`. +- With `RADAR_ENABLED` off, the fetch 404s, `referralUrl` stays `null`, and + `resolveProviderHeaderLink()` returns the static catalog `website` unchanged — the + provider page is byte-identical to before this feature existed. Same outcome when + there is no cache yet or no default referral for that specific provider. +- When a default referral does apply, `ProviderPageHeader` receives `isReferralLink` + and shows the same discreet note/tooltip as the Kimi partner link (reusing the + `providers.kimiPartnerLinkNote` key) — never a new, separate visual treatment. + +--- + +## How to self-host a feed + +A fork or self-hoster that wants full control over the catalog can run their own feed +service without touching client code: + +1. Serve a `GET /v1/catalog/latest` endpoint returning a JSON body that satisfies + `RadarFeedSchema` (`src/lib/radar/feedSchema.ts`) — top-level `feed: +"omniroute-radar"`, `schemaVersion: 1`, `version`, `tier`, `providers`, `models`, + `quirks`, and `totals`. +2. Sign the exact response bytes with an Ed25519 key pair and return the base64 + signature in the `x-omniroute-feed-signature` response header. +3. Set `RADAR_FEED_URL` to the new base URL and `RADAR_FEED_PUBKEY` to the matching + public key (base64-DER SPKI or PEM) — see the + [env var reference](../reference/ENVIRONMENT.md#27-radar-feed-self-hosting). +4. Enable `RADAR_ENABLED` and opt in via `POST /api/radar/settings` + (`{ optIn: true }`). + +No other code changes are required — `verifyFeedBytes()` picks up the override +automatically (`getFeedPublicKeys()` in `src/lib/radar/pinnedKeys.ts`), and version +comparison, schema validation, and the merge rules apply identically to a self-hosted +feed. + +--- + +## Related docs + +- [`docs/security/ERROR_SANITIZATION.md`](../security/ERROR_SANITIZATION.md) — the + error-response pattern the five `/api/radar/*` routes follow. +- [`docs/reference/ENVIRONMENT.md`](../reference/ENVIRONMENT.md#27-radar-feed-self-hosting) + — `RADAR_FEED_URL` / `RADAR_FEED_PUBKEY` reference. diff --git a/docs/getting-started/AUTO-COMBO-GUIDE.md b/docs/getting-started/AUTO-COMBO-GUIDE.md index bc3bc66cd8..503e73b807 100644 --- a/docs/getting-started/AUTO-COMBO-GUIDE.md +++ b/docs/getting-started/AUTO-COMBO-GUIDE.md @@ -1,3 +1,9 @@ +--- +title: "Auto-Combo: Let OmniRoute Pick the Best AI for You" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Auto-Combo: Let OmniRoute Pick the Best AI for You > **TL;DR**: Set your model to `auto` and OmniRoute automatically picks the best AI provider for each request. No configuration needed. diff --git a/docs/getting-started/FREE-TIERS-GUIDE.md b/docs/getting-started/FREE-TIERS-GUIDE.md index c06ad1709e..da8ddd3589 100644 --- a/docs/getting-started/FREE-TIERS-GUIDE.md +++ b/docs/getting-started/FREE-TIERS-GUIDE.md @@ -1,3 +1,9 @@ +--- +title: "Free Tiers Guide: Get Free AI Without a Credit Card" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Free Tiers Guide: Get Free AI Without a Credit Card > **TL;DR**: OmniRoute aggregates free tiers from 50+ providers. Connect multiple free providers for unlimited free AI with automatic fallback. diff --git a/docs/getting-started/PROVIDERS-GUIDE.md b/docs/getting-started/PROVIDERS-GUIDE.md index 5331957d7f..c1c237862e 100644 --- a/docs/getting-started/PROVIDERS-GUIDE.md +++ b/docs/getting-started/PROVIDERS-GUIDE.md @@ -1,3 +1,9 @@ +--- +title: "Providers Guide: Connect AI Models to OmniRoute" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Providers Guide: Connect AI Models to OmniRoute > **TL;DR**: A provider is a connection to an AI service (like OpenAI, Anthropic, Google). You need at least one provider to use OmniRoute. diff --git a/docs/getting-started/QUICK-START.md b/docs/getting-started/QUICK-START.md index c15e8ed366..a451327602 100644 --- a/docs/getting-started/QUICK-START.md +++ b/docs/getting-started/QUICK-START.md @@ -1,3 +1,9 @@ +--- +title: "Quick Start: Get OmniRoute Running in 3 Minutes" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Quick Start: Get OmniRoute Running in 3 Minutes > **TL;DR**: Install → Connect a free provider → Point your IDE to OmniRoute. Done. diff --git a/docs/guides/DOCKER_RELEASE_CHANNELS.md b/docs/guides/DOCKER_RELEASE_CHANNELS.md new file mode 100644 index 0000000000..afc47318a0 --- /dev/null +++ b/docs/guides/DOCKER_RELEASE_CHANNELS.md @@ -0,0 +1,58 @@ +--- +title: "Docker Release Channels" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + +# Docker Release Channels + +OmniRoute publishes separate Docker channels for stable releases, active release-branch testing, and development builds. + +## Channel summary + +| Channel | Source | Mutability | Recommended use | +| --- | --- | --- | --- | +| `:` / `:-web` | Signed/versioned release | Immutable | Production deployments that pin an exact release | +| `:latest` / `:latest-web` | Highest stable release | Mutable stable pointer | Production deployments that intentionally follow stable releases | +| `:next` / `:next-web` | Current default `release/v*` branch | Mutable pre-release pointer | Testing fixes that have landed on the active release branch but are not yet in a stable release | +| `:main` / `:main-web` | `main` branch | Mutable development pointer | Development and integration testing only | + +## Using the pre-release channel + +The `next` channel is rebuilt on every push to the current default `release/v*` branch and is published for both AMD64 and ARM64. Older maintenance branches cannot overwrite it. The channel provides a pullable image for fixes that have merged into the active release branch before the next stable tag is cut. + +```bash +docker pull diegosouzapw/omniroute:next +docker pull diegosouzapw/omniroute:next-web +``` + +For Docker Compose, override the image tag used by the selected profile, then pull and recreate the service: + +```yaml +services: + omniroute: + image: diegosouzapw/omniroute:next +``` + +```bash +docker compose pull +docker compose up -d +``` + +## Safety and rollback + +`next` is a floating pre-release channel. It may change on any push to the active release branch and is **not supported for production use**. Pin the image digest while evaluating a specific build: + +```bash +docker pull diegosouzapw/omniroute:next +docker image inspect diegosouzapw/omniroute:next --format '{{index .RepoDigests 0}}' +``` + +Before testing, back up the OmniRoute data volume or bind-mounted data directory. To roll back, restore the previously used stable version or digest and recreate the container: + +```bash +docker pull diegosouzapw/omniroute: +docker compose up -d +``` + +A release-branch build can never move `latest`; only an eligible stable semantic version may promote the stable pointer. The `next` images retain the release image inspection and blocking CRITICAL-vulnerability gate. diff --git a/docs/guides/TROUBLESHOOTING.md b/docs/guides/TROUBLESHOOTING.md index 801cdbb7e1..4e928e04fc 100644 --- a/docs/guides/TROUBLESHOOTING.md +++ b/docs/guides/TROUBLESHOOTING.md @@ -40,19 +40,19 @@ Common problems and solutions for OmniRoute. ## Quick Fixes -| Problem | Solution | -| --------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -| First login not working | Set `INITIAL_PASSWORD` in `.env` (no hardcoded default) | -| Dashboard opens on wrong port | Set `PORT=20128` and `NEXT_PUBLIC_BASE_URL=http://localhost:20128` | -| No logs written to disk | Set `APP_LOG_TO_FILE=true` and verify call log capture is enabled | -| EACCES: permission denied | Set `DATA_DIR=/path/to/writable/dir` to override `~/.omniroute` | -| Routing strategy not saving | Update to the latest v3.x release (Zod schema fix for settings persistence shipped in earlier versions) | -| Login crash / blank page | Check Node.js version — see [Node.js Compatibility](#nodejs-compatibility) below | -| `dlopen` / `slice is not valid mach-o file` (macOS) | Run `cd $(npm root -g)/omniroute/app && npm rebuild better-sqlite3 && omniroute` — see [macOS native module rebuild](#macos-native-module-rebuild) below | -| Proxy "fetch failed" | Ensure proxy config is set at the correct level — see [Proxy Issues](#proxy-issues) below | +| Problem | Solution | +| ---------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | +| First login not working | Set `INITIAL_PASSWORD` in `.env` (no hardcoded default) | +| Dashboard opens on wrong port | Set `PORT=20128` and `NEXT_PUBLIC_BASE_URL=http://localhost:20128` | +| No logs written to disk | Set `APP_LOG_TO_FILE=true` and verify call log capture is enabled | +| EACCES: permission denied | Set `DATA_DIR=/path/to/writable/dir` to override `~/.omniroute` | +| Routing strategy not saving | Update to the latest v3.x release (Zod schema fix for settings persistence shipped in earlier versions) | +| Login crash / blank page | Check Node.js version — see [Node.js Compatibility](#nodejs-compatibility) below | +| `dlopen` / `slice is not valid mach-o file` (macOS) | Run `cd $(npm root -g)/omniroute/app && npm rebuild better-sqlite3 && omniroute` — see [macOS native module rebuild](#macos-native-module-rebuild) below | +| Proxy "fetch failed" | Ensure proxy config is set at the correct level — see [Proxy Issues](#proxy-issues) below | | Docker `curl: (56) Recv failure: Connection reset by peer` | Your Docker port bind may be landing on IPv6. Use `-p 127.0.0.1:20128:20128` to force IPv4, or test with `curl -4`. See [Docker IPv6](#docker-ipv6) below | -| Antivirus quarantines `README.md` | False positive — see [Antivirus false positives](#antivirus-false-positives) below | -| Kaspersky flags the Desktop app as a Trojan | Behavioral false positive on the unsigned installer — see [Antivirus false positives](#antivirus-false-positives) below | +| Antivirus quarantines `README.md` | False positive — see [Antivirus false positives](#antivirus-false-positives) below | +| Kaspersky flags the Desktop app as a Trojan | Behavioral false positive on the unsigned installer — see [Antivirus false positives](#antivirus-false-positives) below | --- @@ -95,7 +95,7 @@ dodge one vendor's heuristic would hurt every reader to satisfy a scanner bug. **This is a false positive from a behavioral heuristic. Nothing is infected.** Kaspersky's `PDM:` prefix means the verdict comes from its Proactive Defense Module (System Watcher), -which judges what the installer *does* rather than matching it against known malware. When +which judges what the installer _does_ rather than matching it against known malware. When it fires, Kaspersky "rolls back" the whole installation — deleting files it had already written — so the app ends up broken or missing. @@ -163,6 +163,36 @@ until it lands, new releases can repeat this. > **Supported secure versions:** `>=22.22.2 <23` or `>=24.0.0 <27`. Node.js 24.x LTS (Krypton) and Node.js 26 are fully supported. +### npm v11+: `better-sqlite3` not installed (Cannot find module) + + + +**Cause:** npm v11 (shipped with Node.js 24+) blocks install scripts for optional +dependencies by default. Since `better-sqlite3` is listed in `optionalDependencies` +and requires native compilation (`node-gyp rebuild`), npm silently skips it. + +**Symptoms:** + +- Server crashes on startup with `Cannot find module 'better-sqlite3'` +- `ls node_modules/better-sqlite3` shows "No such file or directory" +- `npm ls better-sqlite3` shows `(empty)` + +**Fix:** + +1. Approve the install scripts and reinstall: + ```bash + npm approve-scripts better-sqlite3 + npm install + ``` +2. Or install the prebuilt manually: + ```bash + npm pack better-sqlite3@13.0.1 + tar -xzf better-sqlite3-*.tgz -C node_modules + mv node_modules/package node_modules/better-sqlite3 + rm better-sqlite3-*.tgz + ``` +3. Verify it works: `node -e "require('better-sqlite3')(':memory:').close(); console.log('OK')"` + ### macOS: `dlopen` / "slice is not valid mach-o file" @@ -306,6 +336,7 @@ see [`docs/guides/KIRO_SETUP.md`](./KIRO_SETUP.md). **Cause:** `docker run -p 20128:20128` publishes on both `0.0.0.0` (IPv4) and `::` (IPv6), but the process inside the container listens on IPv4 only. On hosts where `localhost` resolves to `::1` first, the connection lands on the IPv6 published port with no listener behind it → connection reset. **Fix:** + 1. **Quick diagnostic:** Run `curl -4 http://localhost:20128/v1/models`. If it works with `-4` but fails without, you have an IPv6 bind mismatch. 2. **Permanent fix:** Bind to IPv4 explicitly by using `-p 127.0.0.1:20128:20128` in your `docker run` command: ```bash @@ -458,6 +489,59 @@ Provider profiles support these settings: When many concurrent requests hit a rate-limited provider, OmniRoute uses mutex + auto rate-limiting to serialize requests and prevent cascading failures. This is automatic for API key providers. +### Chat requests fail with 503 / chat_admission_busy + +**Symptoms:** + +- The chat completions endpoint returns a retryable `503` response whose error code is + `chat_admission_busy`. +- The response includes `Retry-After`; the byte-based path uses 2 seconds, while the + structure-based path uses 1 second and includes `reason: "structure_limit"`. +- This can happen while another heavyweight chat or long-running streaming response is still + in flight. + +The byte-based response body is: + +```json +{ + "error": { + "message": "Chat admission capacity is temporarily unavailable. Retry shortly.", + "type": "server_error", + "code": "chat_admission_busy" + } +} +``` + +The structure-based response uses the same type and code, with the message +`Structurally heavy chat request capacity is busy; retry shortly.` and +`reason: "structure_limit"`. +At the default thresholds, a request is structurally heavy when it has at least `200` messages, +at least `64` tools, or at least `32,000` estimated tokens, or when bounded structure estimation +exhausts its bounds of `10,000` visited nodes or depth `12`. + +**Cause:** This is deliberate load shedding inside OmniRoute, not an upstream-provider failure. +Each process uses a process-local guard to reserve limited heavyweight capacity before retaining +and parsing a large request body. A heavyweight lease remains held for the lifetime of an SSE +response. +Current heavyweight lease occupancy is not surfaced in the dashboard. +Settings → Resilience → Request Queue → Concurrent Requests does not control this; that setting +governs a separate provider request-queue mechanism. + +**Fix:** + +1. Retry first. Clients should honor `Retry-After` and use backoff rather than immediately + repeating the request. +2. If normal deployment traffic repeatedly exhausts the guard, you can cautiously raise + `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` from its default of `1`. Increase it one step at a time, + restart OmniRoute after each change, and observe memory headroom under representative load. + Every additional heavyweight request can increase concurrent V8 heap use and container or + host OOM risk. No value is safe for every deployment; validate the setting against your own + traffic and memory limits rather than assuming that `2` is universally safe. + +See the [environment-variable reference](../reference/ENVIRONMENT.md#4-security--authentication) +for the authoritative admission settings. Loosening the heavyweight classification thresholds +can let expensive requests bypass this guard and is riskier than a cautious in-flight increase. + --- ## Optional RAG / LLM failure taxonomy (16 problems) diff --git a/docs/i18n/pl/docs/ops/PROXY_GUIDE.md b/docs/i18n/pl/docs/ops/PROXY_GUIDE.md index 044a3ae69c..af1e0a812f 100644 --- a/docs/i18n/pl/docs/ops/PROXY_GUIDE.md +++ b/docs/i18n/pl/docs/ops/PROXY_GUIDE.md @@ -645,7 +645,7 @@ for (const s of statuses) { } // Force re-check a specific proxy -invalidateProxyHealth("http://user:pass@1.2.3.4:8080"); +invalidateProxyHealth("http://user:pass@203.0.113.7:8080"); ``` Flaga `stale` jest `true`, gdy wpis cache przekroczył `HEALTH_CACHE_TTL_MS` i następne żądanie wywoła świeży check. @@ -807,7 +807,7 @@ Gdy proxy systematycznie pada, oznacz je ręcznie, by rotator je pomijał: ```ts import { failOneproxyProxy } from "omniroute/oneproxyRotator"; -const removed = await failOneproxyProxy("1.2.3.4", 8080); +const removed = await failOneproxyProxy("203.0.113.7", 8080); if (removed) { console.log("Proxy marked as failed; rotator will skip it"); } diff --git a/docs/openapi.yaml b/docs/openapi.yaml index 9dfe25f56e..c4a6ee5420 100644 --- a/docs/openapi.yaml +++ b/docs/openapi.yaml @@ -3823,6 +3823,33 @@ paths: "400": description: Invalid request body + /api/services/9router/auto-restart-adopted: + post: + tags: [Embedded Services] + summary: Toggle 9Router auto-restart-when-adopted + description: >- + When enabled, an externally-adopted (not OmniRoute-spawned) 9Router + process is restarted under OmniRoute's own supervisor on the next + health-check cycle instead of being left as adopted-only. + **LOCAL_ONLY** — loopback only. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [enabled] + properties: + enabled: + type: boolean + responses: + "204": + description: Flag updated + "400": + description: Invalid request body + "500": + description: Update failed + /api/services/cliproxy/install: post: tags: [Embedded Services] @@ -3984,6 +4011,33 @@ paths: "400": description: Invalid request body + /api/services/cliproxy/auto-restart-adopted: + post: + tags: [Embedded Services] + summary: Toggle CLIProxyAPI auto-restart-when-adopted + description: >- + When enabled, an externally-adopted (not OmniRoute-spawned) CLIProxyAPI + process is restarted under OmniRoute's own supervisor on the next + health-check cycle instead of being left as adopted-only. + **LOCAL_ONLY** — loopback only. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [enabled] + properties: + enabled: + type: boolean + responses: + "204": + description: Flag updated + "400": + description: Invalid request body + "500": + description: Update failed + /api/services/mux/install: post: tags: [Embedded Services] @@ -4144,6 +4198,33 @@ paths: "400": description: Invalid request body + /api/services/mux/auto-restart-adopted: + post: + tags: [Embedded Services] + summary: Toggle Mux auto-restart-when-adopted + description: >- + When enabled, an externally-adopted (not OmniRoute-spawned) Mux + process is restarted under OmniRoute's own supervisor on the next + health-check cycle instead of being left as adopted-only. + **LOCAL_ONLY** — loopback only. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [enabled] + properties: + enabled: + type: boolean + responses: + "204": + description: Flag updated + "400": + description: Invalid request body + "500": + description: Update failed + /api/services/bifrost/install: post: tags: [Embedded Services] @@ -4254,6 +4335,459 @@ paths: "400": description: Invalid request body + /api/services/bifrost/auto-restart-adopted: + post: + tags: [Embedded Services] + summary: Toggle Bifrost auto-restart-when-adopted + description: >- + When enabled, an externally-adopted (not OmniRoute-spawned) Bifrost + process is restarted under OmniRoute's own supervisor on the next + health-check cycle instead of being left as adopted-only. + **LOCAL_ONLY** — loopback only. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [enabled] + properties: + enabled: + type: boolean + responses: + "204": + description: Flag updated + "400": + description: Invalid request body + "500": + description: Update failed + + /api/services/dario/install: + post: + tags: [Embedded Services] + summary: Install Dario from npm + description: >- + Installs the `@askalf/dario` npm package (Claude-account-pool proxy) under + DATA_DIR/services/dario/. Uses execFile (no shell interpolation — hard rule + #13). **LOCAL_ONLY** — loopback only. + requestBody: + required: false + content: + application/json: + schema: + type: object + properties: + version: + type: string + default: latest + description: npm version tag or semver to install + responses: + "200": + description: Install succeeded + content: + application/json: + schema: + type: object + properties: + ok: + type: boolean + installedVersion: + type: string + path: + type: string + "400": + description: Invalid request body + "500": + description: npm install failed + + /api/services/dario/start: + post: + tags: [Embedded Services] + summary: Start Dario + description: >- + Spawns the Dario process. Idempotent if already running. + **LOCAL_ONLY** — loopback only. + responses: + "200": + description: Service started (or already running) + content: + application/json: + schema: + $ref: "#/components/schemas/ServiceStatus" + "409": + description: Dario is not installed + "503": + description: Start failed + + /api/services/dario/stop: + post: + tags: [Embedded Services] + summary: Stop Dario + description: >- + Gracefully stops Dario. Idempotent — returns a stopped status even if no + supervisor is currently tracking the process. + **LOCAL_ONLY** — loopback only. + responses: + "200": + description: Service stopped + content: + application/json: + schema: + $ref: "#/components/schemas/ServiceStatus" + "500": + description: Stop failed + + /api/services/dario/restart: + post: + tags: [Embedded Services] + summary: Restart Dario + description: >- + Equivalent to stop() then start() under the operation lock. + **LOCAL_ONLY** — loopback only. + responses: + "200": + description: Service restarted + content: + application/json: + schema: + $ref: "#/components/schemas/ServiceStatus" + "409": + description: Dario is not installed + "503": + description: Restart failed + + /api/services/dario/update: + post: + tags: [Embedded Services] + summary: Update Dario to a newer npm version + description: >- + Stops the service (if running), installs the newer npm version, then + restarts it if it was running before the update. **LOCAL_ONLY** — loopback + only. + responses: + "200": + description: Update result (no-op if already on the latest version) + content: + application/json: + schema: + type: object + properties: + updated: + type: boolean + installedVersion: + type: string + latestVersion: + type: string + oldVersion: + type: string + nullable: true + newVersion: + type: string + "500": + description: Update failed + + /api/services/dario/status: + get: + tags: [Embedded Services] + summary: Get Dario status + description: >- + Returns combined live supervisor state and DB metadata, including the + auto-start / auto-restart-adopted flags and whether an update is available. + **LOCAL_ONLY** — loopback only. + responses: + "200": + description: Status response + content: + application/json: + schema: + $ref: "#/components/schemas/ServiceStatusExtended" + "500": + description: Status read failed + + /api/services/dario/auto-start: + post: + tags: [Embedded Services] + summary: Toggle Dario auto-start + description: >- + When enabled, Dario starts automatically on the next OmniRoute boot. + **LOCAL_ONLY** — loopback only. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [enabled] + properties: + enabled: + type: boolean + responses: + "204": + description: Auto-start flag updated + "400": + description: Invalid request body + "500": + description: Update failed + + /api/services/dario/auto-restart-adopted: + post: + tags: [Embedded Services] + summary: Toggle Dario auto-restart-when-adopted + description: >- + When enabled, an externally-adopted (not OmniRoute-spawned) Dario process + is restarted under OmniRoute's own supervisor on the next health-check + cycle instead of being left as adopted-only. + **LOCAL_ONLY** — loopback only. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [enabled] + properties: + enabled: + type: boolean + responses: + "204": + description: Flag updated + "400": + description: Invalid request body + "500": + description: Update failed + + /api/services/dario/admin/login-start: + post: + tags: [Embedded Services] + summary: Start a Dario account-pool login (device-code style) + description: >- + Forwards to the running Dario instance's `POST /admin/login/start` using + the stored admin token. The operator opens the returned `authorize_url`, + approves in their own Claude account, then posts the displayed code to + `/admin/login-complete`. **LOCAL_ONLY** — loopback only. + requestBody: + required: false + content: + application/json: + schema: + type: object + properties: + alias: + type: string + description: Optional account alias; Dario assigns one if omitted. + responses: + "200": + description: Login challenge created + content: + application/json: + schema: + type: object + properties: + alias: + type: string + authorize_url: + type: string + expires_at: + type: string + instructions: + type: string + "400": + description: Invalid request body + "401": + description: Missing or invalid admin auth + "502": + description: Dario did not respond or Dario is not running + + /api/services/dario/admin/login-complete: + post: + tags: [Embedded Services] + summary: Complete a Dario account-pool login + description: >- + Forwards to the running Dario instance's `POST /admin/login/complete`. + On success the account becomes routable immediately (Dario hot-reloads + its pool). **LOCAL_ONLY** — loopback only. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [alias, code] + properties: + alias: + type: string + code: + type: string + responses: + "200": + description: Account added + content: + application/json: + schema: + type: object + properties: + alias: + type: string + status: + type: string + expires_at: + type: string + "400": + description: Invalid request body + "401": + description: Missing or invalid admin auth + "502": + description: Dario did not respond or Dario is not running + + /api/services/dario/admin/accounts: + get: + tags: [Embedded Services] + summary: List Dario account-pool accounts + description: >- + Forwards to the running Dario instance's `GET /admin/accounts`. + **LOCAL_ONLY** — loopback only. + responses: + "200": + description: Account list + content: + application/json: + schema: + type: object + properties: + accounts: + type: array + items: + type: object + count: + type: integer + "401": + description: Missing or invalid admin auth + "502": + description: Dario did not respond or Dario is not running + delete: + tags: [Embedded Services] + summary: Remove a Dario account-pool account + description: >- + Forwards to the running Dario instance's `DELETE /admin/accounts/`. + The alias is taken from a `?alias=` query param or a `{ alias }` JSON body. + **LOCAL_ONLY** — loopback only. + parameters: + - name: alias + in: query + required: false + schema: + type: string + requestBody: + required: false + content: + application/json: + schema: + type: object + properties: + alias: + type: string + responses: + "200": + description: Account removed + content: + application/json: + schema: + type: object + properties: + alias: + type: string + removed: + type: boolean + "400": + description: Missing alias + "401": + description: Missing or invalid admin auth + "502": + description: Dario did not respond or Dario is not running + + /api/services/dario/admin/import-from-omniroute: + get: + tags: [Embedded Services] + summary: List OmniRoute claude connections eligible for Dario import + description: >- + Returns eligible OmniRoute `claude` OAuth provider connections (metadata + only — id/name/email/org tier, never tokens) so the UI can offer a picker + when more than one exists. **LOCAL_ONLY** — loopback only. + responses: + "200": + description: Eligible connections + content: + application/json: + schema: + type: object + properties: + connections: + type: array + items: + type: object + properties: + id: + type: string + name: + type: string + email: + type: string + nullable: true + organizationType: + type: string + nullable: true + organizationRateLimitTier: + type: string + nullable: true + "401": + description: Missing or invalid admin auth + post: + tags: [Embedded Services] + summary: Import an OmniRoute claude connection's OAuth tokens into Dario + description: >- + Writes the source connection's access/refresh token pair directly into + Dario's own account-file store (`~/.dario/accounts/.json`), reusing + the shared Claude Code OAuth client_id, then restarts the Dario supervisor + so it picks up the new account. **LOCAL_ONLY** — loopback only. + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [connectionId] + properties: + connectionId: + type: string + alias: + type: string + description: Optional custom alias; derived from the source email if omitted. + responses: + "200": + description: Account imported + content: + application/json: + schema: + type: object + properties: + alias: + type: string + imported: + type: boolean + sourceConnectionId: + type: string + sourceEmail: + type: string + nullable: true + "400": + description: Invalid request body, unsupported connection, or missing tokens + "401": + description: Missing or invalid admin auth + "404": + description: Connection not found + "500": + description: Import failed + /api/services/{name}/logs: get: tags: [Embedded Services] diff --git a/docs/ops/PROXY_GUIDE.md b/docs/ops/PROXY_GUIDE.md index ce588c988d..81535d1cbf 100644 --- a/docs/ops/PROXY_GUIDE.md +++ b/docs/ops/PROXY_GUIDE.md @@ -645,7 +645,7 @@ for (const s of statuses) { } // Force re-check a specific proxy -invalidateProxyHealth("http://user:pass@1.2.3.4:8080"); +invalidateProxyHealth("http://user:pass@203.0.113.7:8080"); ``` The `stale` flag is `true` when the cache entry has exceeded `HEALTH_CACHE_TTL_MS` and the next request will trigger a fresh check. @@ -807,7 +807,7 @@ When a proxy consistently fails, mark it manually so the rotator will skip it: ```ts import { failOneproxyProxy } from "omniroute/oneproxyRotator"; -const removed = await failOneproxyProxy("1.2.3.4", 8080); +const removed = await failOneproxyProxy("203.0.113.7", 8080); if (removed) { console.log("Proxy marked as failed; rotator will skip it"); } diff --git a/docs/ops/VM_DEPLOYMENT_GUIDE.md b/docs/ops/VM_DEPLOYMENT_GUIDE.md index b8dc7a5071..c0e64c74e7 100644 --- a/docs/ops/VM_DEPLOYMENT_GUIDE.md +++ b/docs/ops/VM_DEPLOYMENT_GUIDE.md @@ -422,3 +422,14 @@ See also [TUNNELS_GUIDE.md](./TUNNELS_GUIDE.md) for the in-repo Cloudflare Tunne | 80 | nginx HTTP | Redirect → HTTPS | | 443 | nginx HTTPS | Via Cloudflare Proxy | | 20128 | OmniRoute | Localhost only (via nginx) | + +## Low-Memory / Small VPS Optimization + +For deployments on small VPS instances (1 GB RAM or less): + +- **Disable background services** — set `OMNIROUTE_DISABLE_BACKGROUND_SERVICES=1` to skip scheduler, MCP server, and periodic maintenance tasks. See `docs/reference/ENVIRONMENT.md`. +- **Use SQLite WAL mode** — enabled by default, reduces peak memory during concurrent reads. +- **Cap the V8 heap** — set `OMNIROUTE_MEMORY_MB` (e.g. `512`) so the runtime does not calibrate a ceiling larger than the VM. See `docs/reference/ENVIRONMENT.md`. +- **Limit concurrent heavy requests** — lower `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` (default `1`); excess requests get a retryable `503` with `Retry-After` instead of competing for memory. +- **Avoid `next build` on the VPS** — build locally and deploy the standalone output (`.next/standalone/`). +- **Monitor with `top` / `free -m`** — OmniRoute typically uses 200-400 MB RSS at idle on a 1 GB VM. diff --git a/docs/proxy-port-clash-report.md b/docs/proxy-port-clash-report.md index 56536c01e0..5d09331fc2 100644 --- a/docs/proxy-port-clash-report.md +++ b/docs/proxy-port-clash-report.md @@ -1,3 +1,9 @@ +--- +title: "Proxy Port Clash Investigation" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Proxy Port Clash Investigation ## Summary diff --git a/docs/proxy-subscriptions.md b/docs/proxy-subscriptions.md index cae473954e..1a1e725029 100644 --- a/docs/proxy-subscriptions.md +++ b/docs/proxy-subscriptions.md @@ -1,3 +1,9 @@ +--- +title: "Operator Proxy Subscriptions (Karing-style)" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Operator Proxy Subscriptions (Karing-style) > Feature design + implementation notes for OmniRoute's operator-level proxy diff --git a/docs/redis-production-config.md b/docs/redis-production-config.md index 660ec4843d..e8749c7bbc 100644 --- a/docs/redis-production-config.md +++ b/docs/redis-production-config.md @@ -1,3 +1,9 @@ +--- +title: "Redis Production Configuration Guide" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Redis Production Configuration Guide ## Overview diff --git a/docs/reference/ENVIRONMENT.md b/docs/reference/ENVIRONMENT.md index 244d7024eb..161b9f1252 100644 --- a/docs/reference/ENVIRONMENT.md +++ b/docs/reference/ENVIRONMENT.md @@ -43,6 +43,7 @@ lastUpdated: 2026-06-28 - [22. Debugging](#22-debugging) - [23. GitHub Integration](#23-github-integration) - [24. Skills Sandbox (v3.8.0+)](#24-skills-sandbox-v380) +- [27. Radar Feed (Self-Hosting)](#27-radar-feed-self-hosting) - [Deployment Scenarios](#deployment-scenarios) - [Audit: Removed / Dead Variables](#audit-removed--dead-variables) @@ -193,8 +194,9 @@ OmniRoute uses **SQLite** (via `better-sqlite3`) for all persistence. These vari | `OMNIROUTE_CHAT_HEAVY_MESSAGE_COUNT` | `200` | `src/shared/middleware/chatBodyAdmission.ts` | Message count that classifies a chat request as heavyweight even when its body is below the byte threshold. | | `OMNIROUTE_CHAT_HEAVY_TOOL_COUNT` | `64` | `src/shared/middleware/chatBodyAdmission.ts` | Tool count that classifies a chat request as heavyweight even when its body is below the byte threshold. | | `OMNIROUTE_CHAT_HEAVY_ESTIMATED_TOKENS` | `32000` | `src/shared/middleware/chatBodyAdmission.ts` | Conservative string-size token estimate that classifies a request as heavyweight; this is an admission-cost proxy, not provider billing tokenization. | -| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `800` | `src/shared/middleware/chatBodyAdmission.ts` | Hard chat history cap. Requests above it receive structured compact-required `413` before compression, translation, or provider dispatch. | +| `OMNIROUTE_CHAT_HARD_MAX_MESSAGES` | `0` (disabled) | `src/shared/middleware/chatBodyAdmission.ts` | Optional opt-in chat history cap. Disabled by default: a message count is deployment policy, not a universal property of a request, and capping here rejects conversations with a terminal `413` before the compression pipeline can make them servable. Heap growth is bounded by `OMNIROUTE_CHAT_MAX_HEAVY_IN_FLIGHT` and the heap-pressure shed. Set a positive value on memory-constrained deployments that need a hard ceiling; excess then receives structured compact-required `413`. | | `OMNIROUTE_MAX_NONSTREAMING_RESPONSE_BYTES` | `67108864` (64 MB) | `open-sse/handlers/chatCore/nonStreamingResponseBody.ts` | Hard cap for a non-streaming upstream response buffered fully into memory. Past this the upstream reader is cancelled and the request fails fast instead of growing an unbounded string until the heap is exhausted. | +| `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES` | `768` | `open-sse/handlers/chatCore/responseHeaders.ts` | Max wire bytes forwarded from upstream response headers. When the budget is exceeded, lower-priority headers (e.g., custom `x-codex-*`, `x-oai-request-id`) are dropped to stay within common reverse-proxy header limits. Set higher to forward more upstream metadata at the cost of larger response header size. | | `CORS_ORIGIN` | _(unset)_ | `src/server/cors/origins.ts` | Legacy single-origin CORS allowlist. Prefer `CORS_ALLOWED_ORIGINS` for new deployments. CORS is only for cross-origin browser API clients; authenticated dashboard writes use same-origin requests plus session-bound CSRF protection instead. | | `CORS_ALLOWED_ORIGINS` | _(unset)_ | `src/server/cors/origins.ts` | Comma-separated CORS allowlist. No wildcard is sent unless `CORS_ALLOW_ALL=true` is explicitly configured. | | `CORS_ALLOW_ALL` | `false` | `src/server/cors/origins.ts` | Development-only escape hatch to echo any browser `Origin`. Do not enable on shared or production deployments. | @@ -379,6 +381,14 @@ Controls how OmniRoute discovers and launches CLI sidecars (Claude Code, Codex, | `CLI_QODER_BIN` | `qoder` | `src/shared/services/cliRuntime.ts` | Custom path to Qoder CLI binary. | | `CLI_QWEN_BIN` | `qwen` | `src/shared/services/cliRuntime.ts` | Custom path to the Qwen Code CLI binary. | | `CLI_DEVIN_BIN` | `devin` | `open-sse/executors/devin-cli.ts` | Custom path to the Devin CLI binary (v3.8.0). Used by the Windsurf/Devin executor. | +| `CLI_DEVIN_AGENTIC_BIN` | `devin` | `open-sse/executors/devin-cli-agentic.ts` | Agentic bridge-only Devin CLI override. The executor accepts only the local ACP stdio upstream. | +| `DEVIN_AGENTIC_HOME` | _(required)_ | `open-sse/executors/devin-cli-agentic.ts` | Absolute isolated home for the agentic Devin subprocess; accepted bridge paths are `/home/bridge` and task-local `.sandbox` paths. | +| `DEVIN_AGENTIC_ACP_TIMEOUT_MS` | `120000` | `open-sse/executors/devin-cli-agentic.ts` | Maximum duration of one Devin ACP turn before the bridge terminates the child and returns an explicit timeout. | +| `DEVIN_BRIDGE_MODEL` | `devin-cli-agentic/swe-1-7` | `docker/devin-bridge/compose.yml` | Main Claude Code model alias for the isolated bridge. The live harness replaces the example with a model returned by the current Devin account. | +| `DEVIN_BRIDGE_SONNET_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Isolated bridge alias used when Claude Code requests its Sonnet default. | +| `DEVIN_BRIDGE_OPUS_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Isolated bridge alias used when Claude Code requests its Opus default. | +| `DEVIN_BRIDGE_HAIKU_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Isolated bridge alias used when Claude Code requests its Haiku default. | +| `DEVIN_BRIDGE_SUBAGENT_MODEL` | `DEVIN_BRIDGE_MODEL` | `docker/devin-bridge/compose.yml` | Isolated bridge alias used for Claude Code subagents. | | `AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Absolute-path override for the Augment (Auggie) CLI binary used by the local `auggie` provider. Falls back to `CLI_AUGGIE_BIN`, then a PATH lookup. | | `CLI_AUGGIE_BIN` | `auggie` | `open-sse/executors/auggie.ts` | Alias override for the Augment (Auggie) CLI binary path (checked after `AUGGIE_BIN`). | | `HERMES_HOME` | `~/.hermes` | `src/lib/cli-helper/config-generator/hermesHome.ts` | Hermes Agent home directory where OmniRoute reads/writes the Hermes CLI config. Matches the env var the Hermes PowerShell installer sets on Windows (`%LOCALAPPDATA%\hermes`). | @@ -452,6 +462,7 @@ detection above). | `COMPRESSION_PIPELINE_BREAKER_THRESHOLD` | `3` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Consecutive cross-request failures before an engine's breaker opens. | | `COMPRESSION_PIPELINE_BREAKER_COOLDOWN_MS` | `30000` | `open-sse/services/compression/pipelineEngineBreaker.ts` | Milliseconds an opened engine stays skipped before a half-open probe. | | `COMPRESSION_CCR_RETRIEVAL_RAMP_FACTOR` | `2` | `open-sse/services/compression/engines/ccr/index.ts` | T08/H8 CCR retrieval-feedback ramp: each prior retrieval of a stored block raises its effective `minChars` linearly (frequently-retrieved content compresses less; `>=3` retrievals = never compressed). `1` disables the ramp (binary skip at the threshold only). | +| `COMPRESSION_CCR_DURABLE_STORE` | `true` | `open-sse/services/compression/engines/ccr/index.ts` | CCR durable block store (#9061). Backs the in-memory store with SQLite so a block survives LRU eviction, the TTL, a restart, or a retrieve landing on another instance. Set `false` to keep blocks in memory only. Blocks over 512KB and cloud runtimes stay memory-only regardless. | | `COMPRESSION_PREFIX_FREEZE_ENABLED` | `false` | `open-sse/services/compression/prefixFreeze.ts` | T08/H5 usage-observed prefix freeze master switch. **Opt-in (default off)** — when on, a system prompt observed `>=` the threshold is treated as a stable cacheable prefix and preserved from compression even for providers the static cache heuristic misses (freeze only *preserves*, never mutates). | | `COMPRESSION_PREFIX_FREEZE_THRESHOLD` | `3` | `open-sse/services/compression/prefixFreeze.ts` | Observations of a system prompt before it is treated as a frozen stable prefix. | | `OMNIROUTE_BOOTSTRAPPED` | `false` | `src/app/(dashboard)/dashboard/page.tsx` | Set `true` by bootstrap script after initial setup. Controls setup wizard visibility. | @@ -509,6 +520,10 @@ Built-in credentials for **localhost development**. For remote deployments, regi | `BLACKBOX_WEB_VALIDATED_TOKEN` | Blackbox Web | Frontend `tk` token to send as `validated` on `/api/chat`. Required when Blackbox enforces token matching; otherwise OmniRoute falls back to a random UUID. See issue #2252. | | `VISION_BRIDGE_BASE_URL` | Vision Bridge guardrail | OpenAI-compatible base URL for non-Anthropic vision-bridge calls. Defaults to the legacy OpenAI URL env or api.openai.com. Point at OmniRoute's `/v1` self-loop or any OpenAI-compat endpoint (Gemini OpenAI-compat, OpenRouter). Issue #2232. When the URL is OmniRoute's own `/v1`, the describe sub-request sends `x-omniroute-admission-bypass: internal` and authenticates with the resolved self-loop credential (`sk_omniroute` sentinel in local mode, or `OMNIROUTE_API_KEY` / `ROUTER_API_KEY` — #1350) so `REQUIRE_API_KEY=true` deployments work. | | `VISION_BRIDGE_API_KEY` | Vision Bridge guardrail | API key for the URL above. Overrides per-provider OpenAI / Google env vars for non-Anthropic vision-bridge calls. Anthropic models keep their dedicated Anthropic key path. Issue #2232. | +| `RAYCAST_BEARER_TOKEN` | Raycast Pro | Optional manual override for the Raycast access token (normally captured via macOS Auto-Import). No OAuth client_id/secret — reverse-engineered, local/personal use only. | +| `RAYCAST_DEVICE_ID` | Raycast Pro | Optional manual override for the Raycast device ID used to sign requests. | +| `RAYCAST_AID` | Raycast Pro | Optional manual override for the Raycast account/app ID; falls back to the device ID when unset. | +| `RAYCAST_SIG_SECRET` | Raycast Pro | Optional override for the request-signing HMAC secret. Defaults to a community-extracted value in `open-sse/services/raycast.ts`. | > [!WARNING] > @@ -671,6 +686,7 @@ REQUEST_TIMEOUT_MS (global override) | `OMNIROUTE_NOTION_TLS_GRACE_MS` | `10000` | JS-side grace added on top of the wire timeout when the native binding is wedged. | | `OMNIROUTE_BROWSER_POOL` | `on` | Shared Playwright browser pool for browser-backed web-cookie chat (`browserPool.ts`); set `off` to disable. | | `WEB_COOKIE_USE_BROWSER` | `0` | Opt a web-cookie chat request into the browser-backed path (`browserBackedChat.ts`); `1` to enable. | +| `OMNIROUTE_LOGIN_BROWSER_PATH` | _(auto-detected)_ | Path to a system Chrome/Edge executable for the Adobe Firefly interactive browser sign-in (`adobeFireflyBrowserLogin.ts`); overrides per-OS auto-detection. | Combo target attempts inherit the resolved upstream request timeout (`FETCH_TIMEOUT_MS`, or `REQUEST_TIMEOUT_MS` when it supplies the fetch default). Set `targetTimeoutMs` in a combo, @@ -764,9 +780,13 @@ Embedding layer, vector store and reranking knobs for the persistent memory subs | `MEMORY_TRANSFORMERS_MODEL` | `Xenova/all-MiniLM-L6-v2` | HF repo id for the opt-in `@huggingface/transformers` local MiniLM pipeline (~23 MB int8, ~400 MB RAM). | | `MEMORY_STATIC_MODEL` | `minishlab/potion-base-8M` | HF repo id for the static potion/Model2Vec lookup-table embedder. Downloaded lazily into the cache dir. | | `MEMORY_STATIC_CACHE_DIR` | `/embeddings` | Directory used to cache the static potion model files. Defaults under `DATA_DIR` when unset. | +| `HF_HUB_ENDPOINT` | `https://huggingface.co` | Override Hugging Face Hub base URL used by `staticPotion.ts` (e.g. mirror endpoint for air-gapped setups). | | `MEMORY_VEC_TOP_K` | `20` | Default top-K used by the `sqlite-vec` brute-force vector search inside `src/lib/memory/vectorStore.ts`. | | `MEMORY_RRF_K` | `60` | Reciprocal Rank Fusion constant `k` for hybrid FTS5 + vector retrieval (sqlite-vec recipe). | -| `HF_HUB_ENDPOINT` | `https://huggingface.co` | Override Hugging Face Hub base URL used by `staticPotion.ts` (e.g. mirror endpoint for air-gapped setups). | +| `NOTION_API_KEY` | _(unset)_ | API key for Notion backend (used by `genericBackend.ts` known backend preset). | +| `NOTION_API_URL` | `https://api.notion.com/v1`| Base URL for Notion API (can override for self-hosted Notion alternatives). | +| `OBSIDIAN_API_KEY` | _(unset)_ | API key for Obsidian Vault backend (used by `genericBackend.ts` known backend preset). | +| `OBSIDIAN_API_URL` | `http://localhost:27123` | Base URL for Obsidian Vault API (can override for remote vault). | | `MEMORY_TYPED_DECAY_ENABLED` | `false` | TV6 typed memory decay master switch. **Opt-in (default off)** — the sweep **deletes** decayed memories. With it off, `access_count`/`last_accessed_at` are pure telemetry and nothing is ever deleted. | | `MEMORY_TYPED_DECAY_EPISODIC_DAYS` | `30` | TTL (days) after which an unused `episodic` memory decays. `0` makes episodic immune too. Durable types (`factual`/`procedural`/`semantic`) are always immune. The decay clock re-bases on `last_accessed_at`. | | `MEMORY_TYPED_DECAY_ACCESS_IMMUNITY` | `3` | A memory injected `>=` this many times becomes immune to decay regardless of type. `0` disables access immunity. | @@ -833,6 +853,7 @@ Reverse-engineered session bridge for hyperagent.com (`src/shared/constants/prov | Variable | Default | Source File | Description | | ----------------------------------- | ------------- | ---------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `MODELS_DEV_SYNC_ENABLED` | `false` | `src/lib/modelsDevSync.ts` | Opt-in switch for the models.dev capability sync. Set to anything non-empty it wins over the `modelsDevSyncEnabled` setting (Dashboard > Settings > AI) in either direction, so a deployment can pin the sync on or off without depending on database state surviving a rebuild; unset, it defers to that setting. On for `1`, `true`, `yes` or `on` in any casing; any other value is off. | | `MODELS_DEV_SYNC_INTERVAL` | `86400` (24h) | `src/lib/modelsDevSync.ts` | Development-time model catalog sync interval in seconds. | | `CONTEXT_WINDOW_RECONCILE_INTERVAL` | `86400` (24h) | `src/lib/contextWindowResolver.ts` | Interval (seconds) for the self-correcting context-window reconciler (5004): pins provider-declared windows from `/models` discovery as `auto:discovery` overrides when they diverge from the catalog. Set to `0` to disable. Reuses already-synced data (no new fetch); never overwrites `manual` overrides. | @@ -848,6 +869,7 @@ Reverse-engineered session bridge for hyperagent.com (`src/shared/constants/prov | `NANOBANANA_POLL_INTERVAL_MS` | `2500` | `open-sse/handlers/imageGeneration.ts` | NanoBanana job polling frequency. | | `DESIGNER_WEB_POLL_TIMEOUT_MS` | `60000` | `open-sse/handlers/imageGeneration/providers/designerWeb.ts` | Max wait for microsoft-designer-web image generation jobs. | | `DESIGNER_WEB_POLL_INTERVAL_MS` | `2000` | `open-sse/handlers/imageGeneration/providers/designerWeb.ts` | microsoft-designer-web job polling frequency. | +| `ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS` | `8000` | `open-sse/services/adobeFireflyUpscale.ts` | Base delay for the Adobe Firefly upscale submit-retry exponential backoff. | | `AWS_REGION` | _(unset)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Region used to construct AWS Bedrock endpoints (Kiro, audio). | | `AWS_DEFAULT_REGION` | _(unset)_ | `src/lib/providers/validation.ts`, `open-sse/handlers/audioSpeech.ts` | Fallback when `AWS_REGION` is not set. | | `CLOUDFLARE_ACCOUNT_ID` | _(unset)_ | `open-sse/executors/cloudflare-ai.ts` | Account ID for Cloudflare Workers AI. | @@ -869,6 +891,10 @@ Reverse-engineered session bridge for hyperagent.com (`src/shared/constants/prov | `CLIPROXYAPI_PORT` | `5544` | `open-sse/executors/cliproxyapi.ts` | CLIProxyAPI bridge port. | | `CLIPROXYAPI_CONFIG_DIR` | `~/.cli-proxy-api` | `src/lib/versionManager/processManager.ts` | CLIProxyAPI config directory. | | `MUX_SERVICE_PORT` | `8322` | `src/lib/services/bootstrap.ts` | Override the port where the embedded Mux (coder/mux) agent-orchestration daemon listens (always 127.0.0.1). | +| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Dario embedded-service bind/connect host (loopback only by default). | +| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Dario embedded-service port. | +| `DARIO_HOST` | `127.0.0.1` | `open-sse/executors/dario.ts` | Dario embedded-service bind/connect host (loopback only by default). | +| `DARIO_PORT` | `3456` | `open-sse/executors/dario.ts` | Dario embedded-service port. | | `LOCAL_HOSTNAMES` | _(empty)_ | `open-sse/config/providerRegistry.ts` | Comma-separated additional hostnames treated as "local" (Docker service names, etc.). | `ENABLE_CC_COMPATIBLE_PROVIDER` is only for third-party relays that accept Claude Code clients @@ -1149,6 +1175,13 @@ Provider quota endpoints, network tunnels (Tailscale, Ngrok, MITM debug proxy), | `OMNIROUTE_LOCAL_ENDPOINTS_TOKEN` | _(unset)_ | `src/lib/security/localEndpoints.ts` | Bearer token for `/api/local/*` callers that aren't on loopback (e.g. the desktop app). When set, requests from non-loopback IPs must carry `Authorization: Bearer `. Required when `OMNIROUTE_LOCAL_ENDPOINTS_ENABLED=1` in non-loopback deployments. | | `OMNIROUTE_REDIS_CONTAINER_NAME` | `omniroute-redis` | `bin/cli/commands/redis.mjs` | Container name for the 1-click Redis launcher (`omniroute redis up`). Used by both the CLI and the `RedisLauncherPanel` GUI. | | `OMNIROUTE_REDIS_HOST_PORT` | `6379` | `bin/cli/commands/redis.mjs` | Host port for the 1-click Redis launcher. Bump if the host already binds 6379. The container's internal port stays 6379. | +| `OMNIROUTE_REDIS_BIND_HOST` | `127.0.0.1` | `bin/cli/commands/redis.mjs` | Host interface the 1-click Redis launcher publishes on. The launcher starts Redis WITHOUT a password, so binding `0.0.0.0` hands every host on your LAN an unauthenticated Redis — only widen this if you also set a password on the instance yourself. | +| `REDIS_BIND_HOST` | `127.0.0.1` | `docker-compose.yml` | Host interface docker-compose publishes the Redis sidecar on (#9286). The compose Redis runs without `requirepass`; app containers reach it over the compose network (`redis:6379`) — the published port exists only for host-side tooling. `0.0.0.0` exposes an unauthenticated Redis to the whole LAN. | +| `REDIS_PORT` | `6379` | `docker-compose.yml` | Host port for the compose Redis sidecar. | +| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | _(unset — mechanism disabled)_ | `src/lib/api/internalServiceAuth.ts` | Shared secret for identity-preserving internal REST hops (#9260): OmniRoute components calling other local OmniRoute routes send it as `x-omniroute-internal-service-token` so the original caller identity is preserved. Compared with `timingSafeEqual`. | +| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | _(unset)_ | `src/lib/api/internalServiceAuth.ts` | Secret-file variant of the internal service token: path to a file whose trimmed content is the token. Only consulted when the inline var is unset. | +| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | `src/lib/catalog/openrouterProviderStats.ts` | Enrich the dashboard providers list with OpenRouter weekly ranking stats (#9324). On by default; set `false` to skip the background fetch entirely (non-blocking, never fatal). | +| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `86400000` (24h) | `src/lib/catalog/openrouterProviderStats.ts` | Cache TTL for the OpenRouter provider-stats snapshot, in milliseconds. | | `OMNIROUTE_REDIS_IMAGE` | `redis:7-alpine` | `bin/cli/commands/redis.mjs` | Redis image used by the 1-click Redis launcher. Override to `redis:8-alpine` or a private registry mirror as needed. | | `QDRANT_HOST` | `qdrant` | _(opt-in cluster profile)_ | Hostname of the Qdrant sidecar when `--profile memory` is active. Default points to the in-network qdrant service name; override for an external deployment. Only consumed when `qdrantEnabled` is `true` in code (`src/lib/memory/vectorStore.ts:108`). | | `QDRANT_PORT` | `6333` | _(opt-in cluster profile)_ | REST port of the Qdrant sidecar. | @@ -1174,6 +1207,17 @@ Provider quota endpoints, network tunnels (Tailscale, Ngrok, MITM debug proxy), | `OMNIROUTE_ROTATE_400_THRESHOLD` | `1` | `open-sse/services/rotationConfig.ts` | Number of `400` errors within `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` required before the account is rotated (only consulted when `OMNIROUTE_ROTATE_ON_400=true`). | | `OMNIROUTE_ROTATE_400_WINDOW_SECONDS` | `120` | `open-sse/services/rotationConfig.ts` | Sliding window (seconds) over which `400` errors are counted toward `OMNIROUTE_ROTATE_400_THRESHOLD`. | +### Claude Warmup Scheduler + +Cron-driven warmup for opted-in Anthropic OAuth connections, so the 5-hour rate-limit window is opened by a trivial scheduled request instead of by the first real one (#8848). The scheduler is off unless `OMNIROUTE_WARMUP_ENABLED` is truthy **and** the connection is flagged in `settings.claudeWarmup.connections`; an empty connection list means nothing is warmed even with the env var on. + +| Variable | Default | Source File | Description | +| ----------------------------- | -------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_WARMUP_ENABLED` | _(unset → off)_ | `src/lib/warmupScheduler.ts` | Master switch for the warmup scheduler. Accepts `1`/`true`/`yes`/`on` (case-insensitive, trimmed). Any other value, or unset, leaves the scheduler off. | +| `OMNIROUTE_WARMUP_CRON` | `0 7 * * *` | `src/lib/warmupScheduler.ts` | Five-field cron expression for the warmup tick, evaluated in `America/Los_Angeles` (Anthropic's reset timezone) regardless of the host clock. | +| `OMNIROUTE_WARMUP_CONCURRENCY` | `3` | `src/lib/warmupScheduler.ts` | How many connections are warmed in parallel per tick. Clamped to `1`-`10`; a non-numeric value falls back to `3`. | +| `OMNIROUTE_WARMUP_MODEL` | `claude-3-5-haiku-20241022` | `src/lib/warmupScheduler.ts` | Model used for the warmup request. Override only if the default is unavailable on your plan; pick the cheapest model that still opens the window. | + ### Browser-Login VNC Sessions & Data-Dir Alias Containerized Chromium+VNC used for interactive browser-login credential capture (`/api/vnc-session`), plus a legacy `DATA_DIR` alias. All optional — the VNC defaults target the bundled `omniroute-vnc-chromium:local` image and are only overridden for a custom container image, ports, or lifecycle tuning. @@ -1238,6 +1282,25 @@ that should be able to run the docs translator. --- +## 27. Radar Feed (Self-Hosting) + +Optional add-on gated by the RADAR_ENABLED feature flag (default off — a feature +flag toggled via Settings/DB, not an env var; see +[docs/frameworks/RADAR.md](../frameworks/RADAR.md#flag-radar_enabled-default-off)). +The four variables below are optional overrides used only to point the client at a +self-hosted or forked feed / supporter-key flow instead of the default OmniRoute +Radar service. See [docs/frameworks/RADAR.md](../frameworks/RADAR.md) for the full +module doc. + +| Variable | Default | Source File | Description | +| -------------------------------- | --------------------------------------------------- | ------------------------------ | ------------------------------------------------------------------------------------------------ | +| `RADAR_FEED_URL` | `https://radar.omniroute.online` | `src/lib/radar/sync.ts` | Base URL of the Radar feed service. Override to point at a self-hosted or forked feed. | +| `RADAR_FEED_PUBKEY` | _(pinned default key)_ | `src/lib/radar/pinnedKeys.ts` | Ed25519 public key (base64-DER SPKI or PEM) used to verify feed signatures from a custom feed. | +| `RADAR_CONTRIBUTOR_CLAIM_URL` | `https://radar.omniroute.online/auth/github` | `src/lib/radar/links.ts` | URL the "I'm a contributor" dashboard button opens (GitHub OAuth supporter-key claim flow). | +| `RADAR_SUPPORTER_PLANS_URL` | `https://radar.omniroute.online/planos` | `src/lib/radar/links.ts` | URL the "Support the project" dashboard button opens (payment/plans page). | + +--- + ## Audit: Removed / Dead Variables The following variables appeared in previous versions of `.env.example` but have **no runtime references** in the current codebase. They have been removed: @@ -1304,3 +1367,25 @@ Used by `src/lib/vncSession/manifest.ts` to configure Docker-based headless Chro | `OMNIROUTE_VNC_READY_MS` | `45000` | `src/lib/vncSession/manifest.ts` | Browser readiness timeout (ms). | | `OMNIROUTE_VNC_HARVEST_MS` | `20000` | `src/lib/vncSession/manifest.ts` | Harvest/cleanup timeout (ms). | | `VIBEPROXY_DATA_DIR` | _(unset)_ | `open-sse/services/notionThreadSessions.ts` | Directory for Notion thread session persistence. | + +### Internal service auth + +| Variable | Default | Description | +| --- | --- | --- | +| `OMNIROUTE_INTERNAL_SERVICE_TOKEN` | – | Inline token for management-plane service-to-service authentication. | +| `OMNIROUTE_INTERNAL_SERVICE_TOKEN_FILE` | – | Path to a file containing the internal service token (preferred in containers; overrides the inline variable). | + +### OpenRouter provider stats + +| Variable | Default | Description | +| --- | --- | --- | +| `OPENROUTER_PROVIDER_STATS_ENABLED` | `true` | Set to `false` to skip fetching OpenRouter per-provider stats for catalog enrichment. | +| `OPENROUTER_PROVIDER_STATS_TTL_MS` | `3600000` | Cache TTL (ms) for the fetched OpenRouter provider stats. | + +### Embedded Redis binding + +| Variable | Default | Description | +| --- | --- | --- | +| `REDIS_BIND_HOST` | `127.0.0.1` | Bind address for the embedded Redis service. | +| `REDIS_PORT` | `6379` | Port for the embedded Redis service. | +| `OMNIROUTE_REDIS_BIND_HOST` | – | OmniRoute-scoped override for the embedded Redis bind address. | diff --git a/docs/sessions/20260714-issue-agent-executable-triage/00_SESSION_OVERVIEW.md b/docs/sessions/20260714-issue-agent-executable-triage/00_SESSION_OVERVIEW.md index 378c4454e9..ee14070eb6 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/00_SESSION_OVERVIEW.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/00_SESSION_OVERVIEW.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Session Overview" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Session Overview Machine status: `in_progress` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/01_RESEARCH.md b/docs/sessions/20260714-issue-agent-executable-triage/01_RESEARCH.md index d0af543d87..242e08186d 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/01_RESEARCH.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/01_RESEARCH.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Research" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Research Machine status: `complete_for_current_phase` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/02_SPECIFICATIONS.md b/docs/sessions/20260714-issue-agent-executable-triage/02_SPECIFICATIONS.md index 636b543a54..5024487d7b 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/02_SPECIFICATIONS.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/02_SPECIFICATIONS.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Specifications" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Specifications Machine status: `in_progress` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/03_DAG_WBS.md b/docs/sessions/20260714-issue-agent-executable-triage/03_DAG_WBS.md index 284a885c5c..959660d714 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/03_DAG_WBS.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/03_DAG_WBS.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: DAG and WBS" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: DAG and WBS Machine status: `in_progress` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/04_IMPLEMENTATION_STRATEGY.md b/docs/sessions/20260714-issue-agent-executable-triage/04_IMPLEMENTATION_STRATEGY.md index 1c59174973..42909529c2 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/04_IMPLEMENTATION_STRATEGY.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/04_IMPLEMENTATION_STRATEGY.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Implementation Strategy" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Implementation Strategy Machine status: `in_progress` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/05_KNOWN_ISSUES.md b/docs/sessions/20260714-issue-agent-executable-triage/05_KNOWN_ISSUES.md index 6c3f0fbe0e..45e24ca42a 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/05_KNOWN_ISSUES.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/05_KNOWN_ISSUES.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Known Issues" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Known Issues Machine status: `open` diff --git a/docs/sessions/20260714-issue-agent-executable-triage/06_TESTING_STRATEGY.md b/docs/sessions/20260714-issue-agent-executable-triage/06_TESTING_STRATEGY.md index 006908ef71..5ecdc9cc8f 100644 --- a/docs/sessions/20260714-issue-agent-executable-triage/06_TESTING_STRATEGY.md +++ b/docs/sessions/20260714-issue-agent-executable-triage/06_TESTING_STRATEGY.md @@ -1,3 +1,9 @@ +--- +title: "Issue-Agent Executable Triage: Testing Strategy" +version: 3.8.50 +lastUpdated: 2026-08-06 +--- + # Issue-Agent Executable Triage: Testing Strategy Machine status: `in_progress` diff --git a/docs/superpowers/plans/2026-07-27-devin-claude-bridge.md b/docs/superpowers/plans/2026-07-27-devin-claude-bridge.md new file mode 100644 index 0000000000..3afd97bbe1 --- /dev/null +++ b/docs/superpowers/plans/2026-07-27-devin-claude-bridge.md @@ -0,0 +1,252 @@ +# Devin Claude Bridge Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Build a fail-closed `devin-cli-agentic` provider that serves local Anthropic Messages requests through Devin CLI ACP stdio while preserving Claude Code tool-use semantics. + +**Architecture:** Add a separate Claude-format provider and executor instead of changing the existing OpenAI-format `devin-cli` summarizer. Keep parsing, prompt serialization, Anthropic response rendering, and ACP process handling in focused files under `open-sse/executors/devin-agentic/`, then wire them into the existing provider and executor registries. + +**Tech Stack:** TypeScript ES modules, Node child process stdio, Anthropic Messages JSON/SSE, JSON-RPC 2.0 ACP, Node test runner. + +--- + +### Task 1: Agentic Bridge Core + +**Files:** +- Create: `open-sse/executors/devin-agentic/types.ts` +- Create: `open-sse/executors/devin-agentic/serializer.ts` +- Create: `open-sse/executors/devin-agentic/toolParser.ts` +- Create: `open-sse/executors/devin-agentic/anthropicResponse.ts` +- Test: `tests/unit/executor-devin-cli-agentic-core.test.ts` + +- [ ] **Implement and prove serialization, parsing, validation, and Anthropic rendering** + +Interfaces: + +```ts +export function serializeAnthropicForDevin(body: unknown): DevinPrompt; +export function parseDevinToolRequest(text: string, tools: AnthropicTool[]): ParsedToolRequest | null; +export function buildClaudeTextResponse(args: ClaudeResponseArgs): Record; +export function buildClaudeToolUseResponse(args: ClaudeToolUseArgs): Record; +export function buildClaudeSseFrames(message: Record): string; +``` + +Invariants: + +- Preserve `text`, `tool_use`, `tool_result`, `thinking`, and `redacted_thinking`. +- Reject `image` with a clear error. +- Reject unknown content block types. +- Allow only one tool request per model turn. +- Validate tool arguments against object JSON Schema with `required`, `type`, `properties`, `additionalProperties`, `enum`, `items`, and scalar types. +- Generate deterministic ids from tool name and canonicalized arguments. + +Run: `node --import tsx/esm --test tests/unit/executor-devin-cli-agentic-core.test.ts` +Expected: core tests pass after dependencies are installed. + +### Task 2: ACP Executor And Provider Wiring + +**Files:** +- Create: `open-sse/executors/devin-cli-agentic.ts` +- Modify: `open-sse/executors/index.ts` +- Create: `open-sse/config/providers/registry/devin-cli-agentic/index.ts` +- Modify: `open-sse/config/providers/index.ts` +- Test: `tests/unit/executor-devin-cli-agentic-acp.test.ts` + +- [ ] **Implement and prove fail-closed ACP execution** + +Behavior: + +- `buildUrl()` returns `devin://acp/stdio`. +- `buildHeaders()` returns `{}`. +- `execute()` spawns only `devin acp` by default or the explicit `CLI_DEVIN_AGENTIC_BIN`/`CLI_DEVIN_BIN` override. +- The child environment removes Anthropic and Claude routing credentials before spawn. +- The executor sends `initialize`, `session/new`, and `session/prompt`. +- The executor collects `agent_message_chunk` text and `session/prompt` final result. +- Non-streaming Claude clients receive native Anthropic JSON. +- Streaming Claude clients receive native Anthropic SSE lifecycle frames. +- Spawn failure, ACP error, timeout, and early exit produce non-2xx responses with sanitized messages. + +Run: `node --import tsx/esm --test tests/unit/executor-devin-cli-agentic-acp.test.ts` +Expected: ACP mock tests pass after dependencies are installed. + +### Task 3: Isolation Scripts And Documentation + +**Files:** +- Create: `scripts/devin-bridge/verify-anthropic-isolation` +- Create: `scripts/devin-bridge/test-unit` +- Create: `scripts/devin-bridge/launch` +- Create: `docs/DEVIN_CLAUDE_BRIDGE.md` +- Modify: `.gitignore` + +- [ ] **Implement offline guardrails and operator docs** + +Behavior: + +- `verify-anthropic-isolation` fails if `CLAUDE_CONFIG_DIR` is missing, points outside an isolated path, or if Anthropic routing env vars are present. +- `test-unit` runs the focused unit tests. +- `launch` refuses to start unless `ENABLE_LIVE_DEVIN_TESTS=1` for live Devin or `DEVIN_BRIDGE_OFFLINE=1` for offline mock mode. +- Documentation distinguishes tested offline behavior from live Devin opt-in behavior. + +Run: `./scripts/devin-bridge/verify-anthropic-isolation` with explicit isolated env. +Expected: exits 0 with isolated env and non-zero without it. + +### Task 4: Verification + +**Files:** +- No additional source files. + +- [ ] **Run proportional checks and capture real output** + +Commands: + +```bash +./scripts/devin-bridge/test-unit +npm test +``` + +Expected in this workspace before installing dependencies: both commands fail with `ERR_MODULE_NOT_FOUND` for `tsx`. Expected after `npm install`: focused tests pass; `npm test` outcome must be reported from real output. + +### Task 5: Close Core Security And Protocol Gaps + +**Files:** +- Modify: `open-sse/executors/devin-cli-agentic.ts` +- Modify: `open-sse/executors/devin-agentic/*.ts` +- Modify: `tests/unit/executor-devin-cli-agentic-*.test.ts` + +- [ ] **Prove environment allowlisting, response-id correlation, strict standalone tool envelopes, unique ids, bounded repair, size limits, cancellation cleanup, sanitized errors, and explicit `devin://acp/stdio` validation** + +Run with `HOME`, `DATA_DIR`, and `SQLITE_FILE` under `.sandbox`; expected: all focused tests pass and an outside-path test fails closed. + +### Task 6: Build Reproducible Containers And Network Guard + +**Files:** +- Create: `docker/devin-bridge/Dockerfile` +- Create: `docker/devin-bridge/compose.yml` +- Create: `docker/devin-bridge/network-guard/*` +- Create: `docker/devin-bridge/mock-devin/*` +- Create: `.env.devin-bridge.example` + +- [ ] **Pin Claude Code 2.1.220 and Devin CLI 3000.2.17, create non-root offline/live profiles, separate auth/config volumes, explicit env allowlist, no host credential mounts, and denied-domain telemetry** + +Run: `docker compose -f docker/devin-bridge/compose.yml --profile offline config`; expected: no forbidden mounts/env inheritance and only internal runtime networks. + +### Task 7: Deliver Isolation And Operator Scripts + +**Files:** +- Create/modify: `scripts/devin-bridge/{build,test-unit,test-contract,test-e2e-mock,verify-anthropic-isolation,login-devin,test-live-devin,launch,clean}` + +- [ ] **Make every command idempotent, sandbox-scoped, fail-closed, and secret-safe** + +Run: `./scripts/devin-bridge/verify-anthropic-isolation`; expected: positive offline proof passes and each deliberately removed guard returns non-zero. + +### Task 8: Real Claude Code Offline E2E + +**Files:** +- Create: `tests/fixtures/devin-bridge/e2e-workspace/*` +- Create: `tests/e2e/devin-claude-bridge.e2e.*` + +- [ ] **Run pinned Claude Code in the offline container through local `/v1/messages` and mock ACP, proving CLAUDE.md, skill, command, hook, Read/Edit/Bash, tests, multi-turn continuation, and no Anthropic traffic** + +Run: `./scripts/devin-bridge/test-e2e-mock`; expected: workspace diff and tests prove Claude Code executed tools while mock Devin only requested them. + +### Task 9: Regression, Documentation, Live Gate, And Delivery + +**Files:** +- Modify: `docs/DEVIN_CLAUDE_BRIDGE.md` +- Create: `docs/DEVIN_CLAUDE_BRIDGE_PROGRESS.md` + +- [ ] **Run focused suites, typecheck, lint, build, docs checks, offline E2E, and isolation proof with fresh output; then run live only after official in-container Devin login** + +If login is unavailable, record live as not tested and expose exactly `./scripts/devin-bridge/login-devin` followed by `./scripts/devin-bridge/test-live-devin`. Commit each reversible unit; do not merge or publish until all offline critical checks are green. + +### Task 10: Close The Authenticated Live Runtime + +**Files:** +- Modify: `open-sse/executors/devin-cli-agentic.ts` +- Modify: `docker/devin-bridge/compose.yml` +- Create: `docker/devin-bridge/network-guard/policy.mjs` +- Modify: `docker/devin-bridge/network-guard/proxy.mjs` +- Modify: `scripts/devin-bridge/select-live-model.mjs` +- Modify: `scripts/devin-bridge/common` +- Modify: `scripts/devin-bridge/login-devin` +- Modify: `scripts/devin-bridge/test-live-devin` +- Modify: `scripts/devin-bridge/verify-anthropic-isolation` +- Modify: `tests/unit/executor-devin-cli-agentic-acp.test.ts` +- Create: `tests/unit/devin-bridge-live-runtime.test.ts` + +- [ ] **Implement and prove the authenticated network, auth, and catalog boundaries with block-level TDD** + +Invariants: + +- The ACP child receives proxy variables only when `DEVIN_BRIDGE_PROXY_URL` is exactly + `http://network-guard:8080`; arbitrary inherited proxy and credential variables stay absent. +- The guard permits suffixes `.devin.ai` and `.cognition.ai`, exact hosts + `server.codeium.com` and `unleash.codeium.com`, and nothing else. +- Claude services cannot mount `devin-auth`; non-Claude services cannot mount the Claude config. +- A zero exit from `devin auth status` is insufficient when output contains a server-fetch failure. +- `family_uid: swe-1.7-lightning` resolves to catalog id `swe-1-7-lightning`; unknown normalized + values fail instead of becoming model ids. +- Login uses the official manual-token flow so no container loopback callback is required. + +Run: + +```bash +./scripts/devin-bridge/test-unit +node --import tsx/esm --test tests/unit/devin-bridge-live-runtime.test.ts +./scripts/devin-bridge/verify-anthropic-isolation --static +``` + +Expected: focused tests and static isolation pass; deliberate untrusted proxy, host, mount, auth +status, and model fixtures fail closed. + +- [ ] **Commit the reversible live-runtime repair** + +```bash +git add open-sse/executors/devin-cli-agentic.ts docker/devin-bridge \ + scripts/devin-bridge tests/unit/devin-bridge-live-runtime.test.ts \ + tests/unit/executor-devin-cli-agentic-acp.test.ts +git commit -m "fix: close Devin bridge live runtime gaps" +``` + +### Task 11: Prove Offline And Live Completion + +**Files:** +- Modify: `docker/devin-bridge/run-claude-live-e2e.sh` +- Modify: `docs/DEVIN_CLAUDE_BRIDGE.md` +- Modify: `docs/DEVIN_CLAUDE_BRIDGE_PROGRESS.md` + +- [ ] **Run the complete deterministic bridge proof before any paid request** + +```bash +./scripts/devin-bridge/test-unit +./scripts/devin-bridge/test-contract +./scripts/devin-bridge/test-e2e-mock +./scripts/devin-bridge/verify-anthropic-isolation +npm run typecheck:core +npm run lint +npm run build +npm run check:docs-all +``` + +Expected: all bridge-specific checks, typecheck, lint, build, and documentation checks pass with +isolated data paths. Any unrelated full-suite infrastructure hang is recorded separately and is +not converted into a pass. + +- [ ] **Run exactly the three authorized live scenarios and the no-fallback failure probe** + +```bash +ENABLE_LIVE_DEVIN_TESTS=1 ./scripts/devin-bridge/test-live-devin +``` + +Expected: dynamic discovery selects a returned Devin catalog model; Claude Code reads without +editing, then edits and runs the fixture test, then executes the fixture command. Evidence shows +native tool use by Claude Code, only `devin-cli-agentic` routing, no allowed non-Devin egress, +and an Anthropic-shaped error after the Devin backend is deliberately made unavailable. + +- [ ] **Update verified documentation and commit the evidence-backed delivery state** + +```bash +git add docker/devin-bridge/run-claude-live-e2e.sh docs/DEVIN_CLAUDE_BRIDGE.md \ + docs/DEVIN_CLAUDE_BRIDGE_PROGRESS.md +git commit -m "docs: record verified Devin bridge live delivery" +``` diff --git a/docs/superpowers/specs/2026-07-27-devin-claude-bridge-design.md b/docs/superpowers/specs/2026-07-27-devin-claude-bridge-design.md new file mode 100644 index 0000000000..2d19519b9f --- /dev/null +++ b/docs/superpowers/specs/2026-07-27-devin-claude-bridge-design.md @@ -0,0 +1,134 @@ +# Devin Claude Bridge Design + +## Baseline + +- Branch: `release/v3.8.49` +- HEAD: `ed7db3ee5f89a144b2d931d8605534522f83de30` +- Package version: `3.8.49` +- Node: `v26.0.0` +- npm: `11.12.1` +- Pre-existing worktree state: `.tug/` untracked +- Dependency state: `node_modules` is absent; the first focused test run failed before loading tests because `tsx` was not installed. +- Tugline state: `tug` exists, but `tug search` failed with MCP connection closed and `tug doctor` hung; it was interrupted. +- Upstream check: `git ls-remote` failed because GitHub DNS was unavailable. Web search of the public repository showed the existing `devin-cli` summarizer provider, but no evidence of `devin-cli-agentic`. + +## Source Anchors + +- `/v1/messages`: `src/app/api/v1/messages/route.ts` +- Existing Devin provider: `open-sse/config/providers/registry/devin-cli/index.ts` +- Existing Devin executor: `open-sse/executors/devin-cli.ts` +- Executor registry: `open-sse/executors/index.ts` +- Provider registry: `open-sse/config/providers/index.ts` +- Format detection: `open-sse/services/provider.ts` +- Claude non-streaming response conversion: `open-sse/handlers/responseTranslator.ts` +- Existing Devin ACP unit test: `tests/unit/executor-devin-cli-acp-protocol-8406.test.ts` + +## Findings + +The existing `devin-cli` provider is intentionally OpenAI-format and summarizer-oriented. Its executor spawns `devin acp --agent-type summarizer`, flattens the message history into a single text prompt, and emits OpenAI SSE text chunks. It does not preserve Anthropic `tool_use` and `tool_result` blocks. + +The safest implementation is a new provider id, `devin-cli-agentic`, with a separate executor. This leaves `devin-cli`, Anthropic OAuth, Claude OAuth, Claude Web, and all host Claude configuration code untouched. The new provider is fail-closed: it only resolves to `devin://acp/stdio`, uses the official Devin CLI ACP stdio path, and has no fallback provider. + +## Architecture + +Claude Code sends Anthropic Messages requests to local OmniRoute. OmniRoute resolves model ids prefixed with `devin-cli-agentic/` to a new Claude-format provider. The new executor translates the complete Anthropic request into an explicit text prompt for Devin ACP, including system text, structured message history, tool schemas, and prior tool results. + +Devin remains a model backend. The executor starts the official fixed no-tools summarizer +role with `devin acp --agent-type summarizer` and frames the serialized request as an +execution trace. Devin must request client-owned tool execution by emitting a strict +XML-wrapped JSON block: + +```xml + +{"name":"Read","arguments":{"file_path":"src/index.ts"}} + +``` + +The bridge parses exactly one tool request per model turn, validates that the tool name was supplied in the incoming request, validates arguments against a minimal JSON Schema validator, generates a stable `tool_devin_...` id, and returns a native Anthropic `tool_use` block. If no valid tool request is present, the bridge returns text with `stop_reason: "end_turn"`. + +## Error And Safety Rules + +- Unsupported Anthropic content blocks fail explicitly; images are rejected. +- Unknown tools fail explicitly. +- Invalid tool arguments fail explicitly. +- Invalid tool XML/JSON fails explicitly. +- Narrative claims that a tool was executed are returned as text, not actions. +- ACP spawn, timeout, early exit, and stderr-only failures return explicit Devin errors. +- The executor never reads `~/.claude`, `~/.claude.json`, macOS Keychain paths, or host Claude config. +- Live Devin is outside normal tests and remains opt-in via `ENABLE_LIVE_DEVIN_TESTS=1`. + +## Test Strategy + +Focused unit tests cover serialization, tool parsing, validation, Anthropic JSON, Anthropic SSE, malformed tool output, unknown tools, invalid arguments, image rejection, timeout, and spawn failure. Environment scripts provide an offline isolation verifier without reading host Claude credentials. + +## Mandatory Runtime Isolation + +The bridge runs only through `docker/devin-bridge/compose.yml`. The runtime image is non-root, uses a private `/home/bridge`, and mounts only disposable workspaces, evidence, and bridge harness files. Application source is copied into the image. It never mounts the host home, Docker socket, SSH, cloud credentials, or global Claude configuration. The container receives an explicit environment allowlist; the executor also constructs an allowlisted child environment instead of copying `process.env`. + +Build-time network access installs Claude Code `2.1.220` and Devin CLI `3000.2.17` with pinned integrity/checksum. Runtime profiles are separate: `offline` uses only an internal Compose network; `live-devin` exposes egress only through a proxy guard whose allowlist contains Devin/Cognition suffixes and whose default is denial. Devin authentication lives only in the named `devin-auth` volume. Claude configuration lives in a different named volume and is initialized empty. + +## Fail-Closed Routing + +`devin-cli-agentic` accepts only the synthetic `devin://acp/stdio` target and an explicit Devin binary path inside the container. It cannot use provider combos, auto routing, account fallback, fallback URLs, or an HTTP upstream. Model aliases resolve only to models returned by the Devin catalog or explicitly configured Devin model ids. An ACP failure, timeout, cancellation, invalid frame, unavailable model, or stopped sidecar becomes an Anthropic-shaped error response; no secondary provider is attempted. + +## Agentic Contract + +The serializer preserves request order, `system`, `tool_choice`, exact tool schemas, `text`, `tool_use`, `tool_result`, `thinking`, and `redacted_thinking`. It rejects unsupported blocks and caps large tool results with an explicit truncation marker and original size. The parser accepts exactly one standalone `` envelope, validates with Zod/JSON Schema infrastructure already present in OmniRoute, rejects unknown tools and mixed narrative/action output, and performs at most one bounded repair prompt. Tool ids combine a per-request nonce with canonical arguments so repeated identical calls remain unique while their association is stable within the turn. + +## Required Proof + +The offline profile must prove the ACP lifecycle, fragmented frames, stderr, early exit, hang/cancel, Anthropic JSON/SSE order, no fallback, and a real pinned Claude Code run that reads, edits, runs tests, observes `CLAUDE.md`, loads a skill and command, fires a hook, and completes at least one `tool_use -> tool_result -> continuation` loop. The isolation verifier checks env, mounts, UID, config paths, DNS/connection logs, local inference destination, selected provider, and fail-closed behavior. Live Devin is proved only by official in-container login and three isolated agentic scenarios. + +## Safety Incident During Baseline + +The first focused test was run without `DATA_DIR` isolation and initialized `/Users/lucasisrael/.omniroute/storage.sqlite`; logs reported schema-column additions. No Anthropic data was accessed. The external database will not be touched again or destructively rolled back. Every bridge command and test now must set `HOME`, `DATA_DIR`, `SQLITE_FILE`, and temporary directories inside `.sandbox`, and an automated guard must reject paths outside the task workspace. + +## Live Completion Repair + +The first authenticated live attempt disproved four assumptions in the initial container +design. The official CLI reports a valid login even when its server-status request fails; +that request uses the exact hosts `server.codeium.com` and `unleash.codeium.com`, which the +guard denied. The OmniRoute executor also built a fresh allowlisted child environment that +omitted the proxy, so `devin acp` could not leave the internal network. Model discovery emits +family identifiers such as `swe-1.7`, while the OmniRoute catalog uses canonical ids such as +`swe-1-7`. Finally, browser login redirects to a loopback listener inside the one-off +container, which is not reachable from the host browser. + +The repair keeps the fully containerized architecture and does not weaken the deny-by-default +network. The guard gains an exact-host allowlist for the two Codeium control-plane hosts while +retaining suffix-based access only for Devin and Cognition; telemetry destinations such as +Sentry remain denied. Compose supplies `DEVIN_BRIDGE_PROXY_URL` with the single accepted value +`http://network-guard:8080`, and the executor derives `HTTP_PROXY` and `HTTPS_PROXY` from that +explicit bridge setting instead of inheriting arbitrary host proxy variables. Claude services +mount only the Claude config volume, and only the OmniRoute live service mounts the Devin auth +volume. + +Fresh login uses the official `devin auth login --force-manual-token-flow`, which is intended +for remote environments where localhost redirects cannot work. The credential is pasted only +into the interactive CLI terminal and never appears in arguments, logs, evidence, or Git. +Authentication validation requires both the logged-in marker and the absence of a server-fetch +failure. Model discovery accepts the real `family_uid`/`model_uid` fields, maps punctuation to a +catalog id only after an exact normalized match, and prefers the already-proved lightning model +when available. + +Tests first prove the trusted proxy boundary, exact host policy, volume separation, strict auth +status gate, and catalog normalization. The live gate then runs three real Claude Code scenarios +through the authenticated in-container Devin CLI and requires local Read/Edit/Bash activity, +passing fixture tests, Devin-only routing, no allowed non-Devin egress, and an explicit error +when the Devin backend is stopped. + +## Final Live Result + +The default-agent design was rejected after live evidence showed that `ask` mode can still +emit Devin-owned ACP tool calls. The pinned CLI does not apply its top-level agent +configuration to `devin acp`, so an `allowed-tools: []` configuration could not create a +neutral backend. The fixed summarizer role is the only official ACP role in this version that +is structurally no-tools. + +The execution-trace adaptation passed the authenticated live gate with +`swe-1-7-lightning`. Three Claude Code processes completed analysis, edit/test, and local +command/skill scenarios. Structured evidence proved that Claude Code issued `Read`, `Edit`, +and `Bash` tool calls; two client-owned `npm test` calls succeeded. The guard audit proved +Devin-only outbound access and zero Claude egress. Intermediate summary-shaped responses and +transient ACP timeouts remain explicit failure modes; the adapter performs one bounded repair +and the harness spaces scenarios to avoid bursty session creation. diff --git a/electron/README.md b/electron/README.md index b03e3a919d..ea13c6f6e2 100644 --- a/electron/README.md +++ b/electron/README.md @@ -114,19 +114,23 @@ Built applications are placed in `dist-electron/`: 4. Launch from Applications. > ⚠️ **Note:** The app is not signed with an Apple Developer certificate yet. If macOS blocks the app, run: +> > ```bash > xattr -cr /Applications/OmniRoute.app > ``` +> > Or right-click the app → Open → Open (to bypass Gatekeeper on first launch). ### Windows **Installer (Recommended):** + 1. Download `OmniRoute.Setup.*.exe` from [Releases](https://github.com/diegosouzapw/OmniRoute/releases). 2. Run the installer. 3. Launch from Start Menu or Desktop shortcut. **Portable (No Installation):** + 1. Download `OmniRoute.exe` from [Releases](https://github.com/diegosouzapw/OmniRoute/releases). 2. Run directly from any folder. @@ -147,20 +151,44 @@ Built applications are placed in `dist-electron/`: - **Server Readiness** — Waits for health check before showing window - **System Tray** — Minimize to tray with quick actions (open, port change, quit) - **Port Management** — Change port from tray menu (server restarts automatically) +- **Remote Server Mode** — Point the shell at an already-running OmniRoute server (e.g. a Docker/OrbStack container, or another machine) instead of spawning a local one — see below - **Window Controls** — Custom minimize, maximize, close via IPC - **Content Security Policy** — Restrictive CSP via session headers - **Offline Support** — Bundled Next.js standalone server - **Single Instance** — Only one app instance can run at a time +## Remote Server Mode + +By default the desktop shell spawns and manages its own bundled Next.js server. If you +already run OmniRoute elsewhere — most commonly in a Docker/OrbStack container, so +provider credentials and env-var handling stay isolated from the host — you can point the +shell at that instance instead, so it's purely a native window + tray onto a server you +already run. + +**Via the tray menu:** _Remote Server → Connect to Remote Server…_, enter the server's +URL (e.g. `http://localhost:20128`), and save. Leave the field blank and save to +disconnect and go back to the local embedded server. The preference persists across +restarts in `/electron-preferences.json` (see `DATA_DIR` above for where that +lives on your platform). + +**Via environment variable:** set `OMNIROUTE_REMOTE_URL` before launching the app (e.g. +`OMNIROUTE_REMOTE_URL=http://localhost:20128 npm run dev`, or export it in the +environment that launches the packaged app). The env var always wins over the persisted +preference and is session-scoped — it doesn't get written to the prefs file. + +Only `http://` and `https://` URLs are accepted; anything else is rejected before the +window loads. + ## Configuration ### Environment Variables -| Variable | Default | Description | -| --------------------- | ------------ | --------------------------------- | -| `OMNIROUTE_PORT` | `20128` | Server port | -| `OMNIROUTE_MEMORY_MB` | `512` | Node.js heap limit (64–16384 MB) | -| `NODE_ENV` | `production` | Set to `development` for dev mode | +| Variable | Default | Description | +| ---------------------- | ------------ | ----------------------------------------------------------------------------------------------------- | +| `OMNIROUTE_PORT` | `20128` | Server port | +| `OMNIROUTE_MEMORY_MB` | `512` | Node.js heap limit (64–16384 MB) | +| `OMNIROUTE_REMOTE_URL` | _(unset)_ | Attach to this server instead of spawning a local one — see [Remote Server Mode](#remote-server-mode) | +| `NODE_ENV` | `production` | Set to `development` for dev mode | ### Custom Icon @@ -175,12 +203,12 @@ Place your icons in `assets/`: ### Invoke (Renderer → Main, async) -| Channel | Returns | Description | -| ---------------- | ------------- | --------------------------------------------- | -| `get-app-info` | `AppInfo` | App name, version, platform, isDev, port | -| `open-external` | `void` | Open URL in default browser (http/https only) | -| `get-data-dir` | `string` | Get userData directory path | -| `restart-server` | `{ success }` | Stop + restart server (5s timeout + SIGKILL) | +| Channel | Returns | Description | +| ---------------- | ------------- | --------------------------------------------------------- | +| `get-app-info` | `AppInfo` | App name, version, platform, isDev, port, remoteServerUrl | +| `open-external` | `void` | Open URL in default browser (http/https only) | +| `get-data-dir` | `string` | Get userData directory path | +| `restart-server` | `{ success }` | Stop + restart server (5s timeout + SIGKILL) | ### Send (Renderer → Main, fire-and-forget) diff --git a/electron/assets/remoteServerPrompt.html b/electron/assets/remoteServerPrompt.html new file mode 100644 index 0000000000..80ae972942 --- /dev/null +++ b/electron/assets/remoteServerPrompt.html @@ -0,0 +1,86 @@ + + + + + + Connect to Remote Server + + + +

+ Point this desktop app at an already-running OmniRoute server (e.g. a Docker/OrbStack + container) instead of spawning a local one. Leave blank and Save to disconnect. +

+ +
+
+ + +
+ + + + diff --git a/electron/lib/remoteServerPreferences.js b/electron/lib/remoteServerPreferences.js new file mode 100644 index 0000000000..21b683290f --- /dev/null +++ b/electron/lib/remoteServerPreferences.js @@ -0,0 +1,75 @@ +"use strict"; + +const fs = require("fs"); +const path = require("path"); + +/** + * remoteServerPreferences.js — pure read/write helpers for the small JSON + * preferences file that persists the operator-configured remote server URL + * across app restarts (see resolveRemoteServerUrl.js for how it's consumed). + * + * Deliberately a plain flat JSON file rather than the app's SQLite database: + * this preference must be readable before deciding whether to spawn (or even + * reach) the local server, so it cannot depend on any server-owned storage. + * + * Extracted as pure, dependency-injectable helpers so they can be unit-tested + * without importing the full Electron main process. + * + * @param {string} prefsPath - absolute path to electron-preferences.json + * @param {(p: string) => boolean} [existsSync] + * @param {(p: string, enc: string) => string} [readFileSync] + * @returns {{remoteServerUrl: string|null}} + */ +function readPreferences(prefsPath, existsSync = fs.existsSync, readFileSync = fs.readFileSync) { + if (!existsSync(prefsPath)) return { remoteServerUrl: null }; + try { + const parsed = JSON.parse(readFileSync(prefsPath, "utf8")); + const remoteServerUrl = + typeof parsed.remoteServerUrl === "string" && parsed.remoteServerUrl.trim() + ? parsed.remoteServerUrl.trim() + : null; + return { remoteServerUrl }; + } catch { + return { remoteServerUrl: null }; + } +} + +/** + * Persist the remote server URL preference. Pass `null` to clear it (reverts + * to spawning the local embedded server on next restart). + * + * @param {string} prefsPath + * @param {string|null} remoteServerUrl + * @param {(p: string) => boolean} [existsSync] + * @param {(p: string, enc: string) => string} [readFileSync] + * @param {(p: string, data: string, enc: string) => void} [writeFileSync] + * @param {(p: string, opts: object) => void} [mkdirSync] + */ +function writeRemoteServerUrl( + prefsPath, + remoteServerUrl, + { + existsSync = fs.existsSync, + readFileSync = fs.readFileSync, + writeFileSync = fs.writeFileSync, + mkdirSync = fs.mkdirSync, + } = {} +) { + try { + const dir = path.dirname(prefsPath); + if (!existsSync(dir)) { + mkdirSync(dir, { recursive: true }); + } + + const current = readPreferences(prefsPath, existsSync, readFileSync); + const next = { ...current, remoteServerUrl: remoteServerUrl || null }; + writeFileSync(prefsPath, JSON.stringify(next, null, 2) + "\n", "utf8"); + } catch (err) { + console.error( + `[remoteServerPreferences] Failed to write preferences to ${prefsPath}:`, + err instanceof Error ? err.message : String(err) + ); + } +} + +module.exports = { readPreferences, writeRemoteServerUrl }; diff --git a/electron/lib/resolveRemoteServerUrl.js b/electron/lib/resolveRemoteServerUrl.js new file mode 100644 index 0000000000..97703b6308 --- /dev/null +++ b/electron/lib/resolveRemoteServerUrl.js @@ -0,0 +1,79 @@ +"use strict"; + +const fs = require("fs"); + +/** + * resolveRemoteServerUrl.js — pure helper for resolving an operator-configured + * remote OmniRoute server URL, so the Electron shell can attach to an + * already-running instance (e.g. a Docker/OrbStack container, or a server on + * another machine on the LAN) instead of spawning its own bundled Next.js + * server. + * + * Some environments make the bundled local server impractical — for example, + * a host that injects provider API keys via a secrets manager in a way the + * packaged app's env-file loading doesn't expect. Running the real server in + * an isolated container and pointing the desktop shell at it sidesteps that + * entirely. + * + * Precedence: + * 1. OMNIROUTE_REMOTE_URL env var (explicit, session-scoped override) + * 2. `remoteServerUrl` key in /electron-preferences.json (persisted + * via the tray menu's "Connect to Remote Server…" prompt) + * 3. null — caller falls back to spawning the local embedded server + * + * Extracted as a pure helper (env + fs injectable) so it can be unit-tested + * without importing the full Electron main process (which requires the + * Electron binary). + * + * @param {object} opts + * @param {NodeJS.ProcessEnv} opts.env - injectable process.env (for tests) + * @param {string} opts.prefsPath - absolute path to electron-preferences.json + * @param {(p: string) => boolean} [opts.existsSync] - injectable fs.existsSync + * @param {(p: string, enc: string) => string} [opts.readFileSync] - injectable fs.readFileSync + * @returns {string|null} the validated http(s) remote URL (no trailing slash), or null if none configured + */ +function resolveRemoteServerUrl({ + env, + prefsPath, + existsSync = fs.existsSync, + readFileSync = fs.readFileSync, +}) { + const candidate = readCandidate({ env, prefsPath, existsSync, readFileSync }); + if (!candidate) return null; + return isValidHttpUrl(candidate) ? stripTrailingSlash(candidate) : null; +} + +function readCandidate({ env, prefsPath, existsSync, readFileSync }) { + const fromEnv = (env.OMNIROUTE_REMOTE_URL || "").trim(); + if (fromEnv) return fromEnv; + + if (!prefsPath || !existsSync(prefsPath)) return null; + try { + const prefs = JSON.parse(readFileSync(prefsPath, "utf8")); + const fromPrefs = typeof prefs.remoteServerUrl === "string" ? prefs.remoteServerUrl.trim() : ""; + return fromPrefs || null; + } catch { + // Corrupt/partial prefs file — fall back to spawning the local server + // rather than crashing the app on startup. + return null; + } +} + +/** + * @param {string} candidate + * @returns {boolean} + */ +function isValidHttpUrl(candidate) { + try { + const parsed = new URL(candidate); + return parsed.protocol === "http:" || parsed.protocol === "https:"; + } catch { + return false; + } +} + +function stripTrailingSlash(url) { + return url.replace(/\/+$/, ""); +} + +module.exports = { resolveRemoteServerUrl, isValidHttpUrl }; diff --git a/electron/main.js b/electron/main.js index a949bef103..b98692b295 100644 --- a/electron/main.js +++ b/electron/main.js @@ -37,6 +37,8 @@ const { loginManager } = require("./loginManager"); const { killProcessTree } = require("./processTree"); const { resolveServerEntry } = require("./lib/resolveServerEntry"); const { resolveDarwinHelperExecutable } = require("./lib/resolveNodeHelper"); +const { resolveRemoteServerUrl, isValidHttpUrl } = require("./lib/resolveRemoteServerUrl"); +const { writeRemoteServerUrl } = require("./lib/remoteServerPreferences"); // ── Single Instance Lock ─────────────────────────────────── const gotTheLock = app.requestSingleInstanceLock(); @@ -67,8 +69,23 @@ let tray = null; let nextServer = null; let serverPort = 20128; let isServerStopped = false; +let remoteServerPromptWindow = null; -const getServerUrl = () => `http://localhost:${serverPort}`; +// ── Remote Server Mode ────────────────────────────────────── +// Lets the desktop shell attach to an already-running OmniRoute server (e.g. a +// Docker/OrbStack container, or another machine) instead of spawning its own +// bundled Next.js server. See lib/resolveRemoteServerUrl.js for precedence +// (OMNIROUTE_REMOTE_URL env var, then the persisted prefs file below). +const REMOTE_SERVER_PREFS_PATH = path.join( + resolveDataDir(null, process.env), + "electron-preferences.json" +); +let remoteServerUrl = resolveRemoteServerUrl({ + env: process.env, + prefsPath: REMOTE_SERVER_PREFS_PATH, +}); + +const getServerUrl = () => remoteServerUrl || `http://localhost:${serverPort}`; function resolveNodeExecutable(env = process.env) { // #1081: Ensure Next.js standalone runs using Electron's Node runtime @@ -456,6 +473,23 @@ function createTray() { { label: "3000", click: () => changePort(3000) }, { label: "8080", click: () => changePort(8080) }, ], + enabled: !remoteServerUrl, + }, + { + label: "Remote Server", + submenu: [ + { + label: remoteServerUrl ? `Connected: ${remoteServerUrl}` : "Using local embedded server", + enabled: false, + }, + { type: "separator" }, + { label: "Connect to Remote Server…", click: () => showRemoteServerPrompt() }, + { + label: "Disconnect (use Local Server)", + enabled: Boolean(remoteServerUrl), + click: () => setRemoteServerUrl(null), + }, + ], }, { type: "separator" }, { @@ -512,8 +546,97 @@ async function changePort(newPort) { console.log(`[Electron] Port changed: ${oldPort} → ${serverPort}`); } +// ── Remote Server Mode: prompt window ────────────────────── +function showRemoteServerPrompt() { + if (remoteServerPromptWindow && !remoteServerPromptWindow.isDestroyed()) { + remoteServerPromptWindow.show(); + remoteServerPromptWindow.focus(); + return; + } + + remoteServerPromptWindow = new BrowserWindow({ + width: 480, + height: 210, + resizable: false, + minimizable: false, + maximizable: false, + fullscreenable: false, + title: "Connect to Remote Server", + parent: mainWindow || undefined, + modal: Boolean(mainWindow), + webPreferences: { + preload: path.join(__dirname, "remoteServerPromptPreload.js"), + contextIsolation: true, + nodeIntegration: false, + sandbox: true, + }, + }); + + remoteServerPromptWindow.setMenuBarVisibility(false); + remoteServerPromptWindow.loadFile(path.join(__dirname, "assets", "remoteServerPrompt.html")); + + remoteServerPromptWindow.on("closed", () => { + remoteServerPromptWindow = null; + }); +} + +// ── Remote Server Mode: apply a new URL (or clear it) ────── +async function setRemoteServerUrl(nextUrl) { + const normalized = (nextUrl || "").trim() || null; + if (normalized === remoteServerUrl) return; + + // Reject invalid URLs — only http:// and https:// are accepted. + if (normalized !== null && !isValidHttpUrl(normalized)) { + console.warn("[Electron] Rejected invalid remote server URL:", normalized); + return; + } + + sendToRenderer("server-status", { status: "restarting", port: serverPort }); + + // Stop any locally-spawned server before switching modes in either direction. + const serverToStop = nextServer; + stopNextServer(); + await waitForServerExit(serverToStop); + + remoteServerUrl = normalized; + writeRemoteServerUrl(REMOTE_SERVER_PREFS_PATH, remoteServerUrl); + + startNextServer(); + try { + await waitForServer(`${getServerUrl()}/api/monitoring/health`); + } catch (err) { + console.warn("[Electron] Server did not become ready after remote-server change:", err.message); + } + + if (mainWindow && !mainWindow.isDestroyed()) { + mainWindow.loadURL(getServerUrl()); + } + createTray(); + + sendToRenderer("server-status", { + status: "running", + port: serverPort, + remoteUrl: remoteServerUrl, + }); + console.log( + remoteServerUrl + ? `[Electron] Now connected to remote server: ${remoteServerUrl}` + : "[Electron] Disconnected from remote server — spawning local server again" + ); +} + // ── Server Lifecycle (#1, #5, #10) ───────────────────────── function startNextServer() { + if (remoteServerUrl) { + console.log("[Electron] Remote server mode — connecting to", remoteServerUrl); + sendToRenderer("server-status", { + status: "running", + port: serverPort, + remoteUrl: remoteServerUrl, + }); + return; + } + if (isDev) { console.log("[Electron] Dev mode — connect to existing Next.js server"); sendToRenderer("server-status", { status: "running", port: serverPort }); @@ -777,8 +900,22 @@ function setupIpcHandlers() { platform: process.platform, isDev, port: serverPort, + remoteServerUrl, })); + // ── Remote Server Mode: prompt window IPC (main-process-only trust + // boundary — this window never loads remote/untrusted content) ── + ipcMain.handle("remote-server-prompt:get-initial-url", () => remoteServerUrl || ""); + + ipcMain.on("remote-server-prompt:submit", (_event, url) => { + remoteServerPromptWindow?.close(); + void setRemoteServerUrl(url); + }); + + ipcMain.on("remote-server-prompt:cancel", () => { + remoteServerPromptWindow?.close(); + }); + ipcMain.handle("open-external", (_event, url) => { try { const parsedUrl = new URL(url); diff --git a/electron/package-lock.json b/electron/package-lock.json index fc70141ce1..7909fcd7ec 100644 --- a/electron/package-lock.json +++ b/electron/package-lock.json @@ -1,12 +1,12 @@ { "name": "omniroute-desktop", - "version": "3.8.49", + "version": "3.8.50", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "omniroute-desktop", - "version": "3.8.49", + "version": "3.8.50", "license": "MIT", "dependencies": { "electron-updater": "^6.8.9" @@ -297,45 +297,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@electron/windows-sign": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", - "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "peer": true, - "dependencies": { - "cross-dirname": "^0.1.0", - "debug": "^4.3.4", - "fs-extra": "^11.1.1", - "minimist": "^1.2.8", - "postject": "^1.0.0-alpha.6" - }, - "bin": { - "electron-windows-sign": "bin/electron-windows-sign.js" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@electron/windows-sign/node_modules/fs-extra": { - "version": "11.3.6", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.6.tgz", - "integrity": "sha512-w8ZNZr2mKIc7qeNaQ9AVPT1+iFaI+Avd4xudVOvdDJ8VytREi1Ft5Ih7hd9jjehod8vAM5GMsfQ/TpPf4EyoEA==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@isaacs/fs-minipass": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", @@ -1130,15 +1091,6 @@ "dev": true, "license": "MIT" }, - "node_modules/cross-dirname": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", - "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -1459,19 +1411,6 @@ "node": ">=14.0.0" } }, - "node_modules/electron-builder-squirrel-windows": { - "version": "26.15.3", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz", - "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "app-builder-lib": "26.15.3", - "builder-util": "26.15.3", - "electron-winstaller": "5.4.0" - } - }, "node_modules/electron-publish": { "version": "26.15.3", "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", @@ -1506,66 +1445,6 @@ "tiny-typed-emitter": "^2.1.0" } }, - "node_modules/electron-winstaller": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", - "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@electron/asar": "^3.2.1", - "debug": "^4.1.1", - "fs-extra": "^7.0.1", - "lodash": "^4.17.21", - "temp": "^0.9.0" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "@electron/windows-sign": "^1.1.2" - } - }, - "node_modules/electron-winstaller/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/electron-winstaller/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "license": "MIT", - "peer": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-winstaller/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1696,9 +1575,9 @@ "license": "MIT" }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "dev": true, "funding": [ { @@ -2480,20 +2359,6 @@ "node": ">= 18" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2757,36 +2622,6 @@ "node": ">=18" } }, - "node_modules/postject": { - "version": "1.0.0-alpha.6", - "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", - "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "commander": "^9.4.0" - }, - "bin": { - "postject": "dist/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/postject/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": "^12.20.0 || >=14" - } - }, "node_modules/proc-log": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", @@ -2981,21 +2816,6 @@ "node": ">= 4" } }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "license": "ISC", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -3251,21 +3071,6 @@ "node": ">=18" } }, - "node_modules/temp": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", - "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "mkdirp": "^0.5.1", - "rimraf": "~2.6.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/temp-file": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz", @@ -3372,9 +3177,9 @@ } }, "node_modules/undici": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", - "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", "dev": true, "license": "MIT", "engines": { diff --git a/electron/package.json b/electron/package.json index a2bb7614b5..73fb51ec40 100644 --- a/electron/package.json +++ b/electron/package.json @@ -37,7 +37,7 @@ "plist": "^4.0.0", "form-data": "^4.0.6", "js-yaml": "^4.2.0", - "undici": "^7.28.0" + "undici": "^7.29.0" }, "build": { "appId": "online.omniroute.desktop", @@ -60,8 +60,13 @@ "loginManager.js", "processTree.js", "sqlite-inspection.js", + "remoteServerPromptPreload.js", + "remoteServerPromptRenderer.js", "lib/resolveServerEntry.js", "lib/resolveNodeHelper.js", + "lib/resolveRemoteServerUrl.js", + "lib/remoteServerPreferences.js", + "assets/remoteServerPrompt.html", "package.json", "node_modules/**/*" ], diff --git a/electron/preload.js b/electron/preload.js index 0eabaa2748..21a40b178e 100644 --- a/electron/preload.js +++ b/electron/preload.js @@ -106,8 +106,15 @@ const VALID_CHANNELS = { "login:start", "login:cancel", "login:status", + "remote-server-prompt:get-initial-url", + ], + send: [ + "window-minimize", + "window-maximize", + "window-close", + "remote-server-prompt:submit", + "remote-server-prompt:cancel", ], - send: ["window-minimize", "window-maximize", "window-close"], receive: ["server-status", "port-changed", "update-status", "login:status"], }; @@ -160,6 +167,9 @@ contextBridge.exposeInMainWorld("electronAPI", { // ── Receive (event listeners) ──────────────────────────── // Fix #6: Returns a disposer function for precise cleanup + // "server-status" payloads include remoteUrl when running in Remote Server + // Mode (see electron/main.js setRemoteServerUrl) — surfaced here read-only; + // the actual URL is configured via the tray menu, not the renderer. onServerStatus: (callback) => safeOn("server-status", callback), onPortChanged: (callback) => safeOn("port-changed", callback), onUpdateStatus: (callback) => safeOn("update-status", callback), diff --git a/electron/remoteServerPromptPreload.js b/electron/remoteServerPromptPreload.js new file mode 100644 index 0000000000..af05f55b9c --- /dev/null +++ b/electron/remoteServerPromptPreload.js @@ -0,0 +1,15 @@ +/** + * Preload for the small "Connect to Remote Server" prompt window. + * + * Kept separate from the main preload.js — this window only ever loads our + * own bundled remoteServerPrompt.html (never remote/untrusted content), but we + * still keep contextIsolation on and expose the minimum surface needed. + */ + +const { contextBridge, ipcRenderer } = require("electron"); + +contextBridge.exposeInMainWorld("remoteServerPrompt", { + getInitialUrl: () => ipcRenderer.invoke("remote-server-prompt:get-initial-url"), + submit: (url) => ipcRenderer.send("remote-server-prompt:submit", url), + cancel: () => ipcRenderer.send("remote-server-prompt:cancel"), +}); diff --git a/electron/remoteServerPromptRenderer.js b/electron/remoteServerPromptRenderer.js new file mode 100644 index 0000000000..f1689920ec --- /dev/null +++ b/electron/remoteServerPromptRenderer.js @@ -0,0 +1,40 @@ +(function () { + const input = document.getElementById("url-input"); + const errorEl = document.getElementById("error"); + const saveBtn = document.getElementById("save-btn"); + const cancelBtn = document.getElementById("cancel-btn"); + + function isValidOrEmpty(value) { + const trimmed = value.trim(); + if (!trimmed) return true; // empty = disconnect, handled by main process + try { + const parsed = new URL(trimmed); + return parsed.protocol === "http:" || parsed.protocol === "https:"; + } catch { + return false; + } + } + + window.remoteServerPrompt.getInitialUrl().then((url) => { + input.value = url || ""; + input.focus(); + }); + + saveBtn.addEventListener("click", () => { + const value = input.value.trim(); + if (!isValidOrEmpty(value)) { + errorEl.textContent = "Enter a valid http:// or https:// URL, or leave blank to disconnect."; + return; + } + window.remoteServerPrompt.submit(value); + }); + + cancelBtn.addEventListener("click", () => { + window.remoteServerPrompt.cancel(); + }); + + input.addEventListener("keydown", (event) => { + if (event.key === "Enter") saveBtn.click(); + if (event.key === "Escape") cancelBtn.click(); + }); +})(); diff --git a/electron/types.d.ts b/electron/types.d.ts index c93a04fc77..c78fbaf2b1 100644 --- a/electron/types.d.ts +++ b/electron/types.d.ts @@ -14,11 +14,15 @@ export interface AppInfo { platform: "win32" | "darwin" | "linux"; isDev: boolean; port: number; + /** Set when Remote Server Mode is active (tray → Remote Server → Connect…). */ + remoteServerUrl: string | null; } export interface ServerStatus { status: "starting" | "running" | "stopped" | "restarting" | "error"; port: number; + /** Present only while connected to a remote server instead of the embedded one. */ + remoteUrl?: string; } export interface ElectronAPI { diff --git a/next.config.mjs b/next.config.mjs index 8eccf141e3..e1c2e7cc1a 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -173,6 +173,10 @@ const nextConfig = { serverActions: { bodySizeLimit: process.env.OMNIROUTE_SERVER_ACTIONS_BODY_LIMIT || "50mb", }, + // Reduce peak heap during production builds (Next.js 15+). + webpackMemoryOptimizations: true, + // Run webpack in a separate Node worker, lowering main-process memory. + webpackBuildWorker: true, // Next.js proxy (middleware) has a default 10MB body clone limit. File // uploads (OpenAI-compatible /v1/files) routinely exceed this. Match the // 512 MB server-side cap; tune via env if needed. diff --git a/open-sse/config/antigravityModelAliases.ts b/open-sse/config/antigravityModelAliases.ts index d1fd5eb8aa..61aac462a8 100644 --- a/open-sse/config/antigravityModelAliases.ts +++ b/open-sse/config/antigravityModelAliases.ts @@ -144,6 +144,9 @@ export const ANTIGRAVITY_PUBLIC_MODELS = Object.freeze([ export const ANTIGRAVITY_MODEL_ALIASES = Object.freeze({ // gemini-3.1-pro-low is not aliased: the upstream accepts it verbatim. + // gemini-3.1-pro-high: the discovery slot returns HTTP 400 on v1internal; + // the live upstream id is gemini-pro-agent (see ANTIGRAVITY_PUBLIC_MODELS). + "gemini-3.1-pro-high": "gemini-pro-agent", "gemini-3-pro-image-preview": "gemini-3-pro-image", // Legacy Claude display ids → current upstream ids. NOTE: an earlier comment here // assumed Claude was removed from Antigravity 2.0 and would 404; discussion #3184 diff --git a/open-sse/config/antigravityUpstream.ts b/open-sse/config/antigravityUpstream.ts index 1ed328d7f3..aa015ef3ae 100644 --- a/open-sse/config/antigravityUpstream.ts +++ b/open-sse/config/antigravityUpstream.ts @@ -12,6 +12,12 @@ export const ANTIGRAVITY_BOOTSTRAP_BASE_URLS = Object.freeze([ "https://cloudcode-pa.googleapis.com", ]); +export const ANTIGRAVITY_ONBOARD_PATH = "/v1internal:onboardUser"; + +export function getAntigravityOnboardUrls(): string[] { + return ANTIGRAVITY_BOOTSTRAP_BASE_URLS.map((base) => `${base}${ANTIGRAVITY_ONBOARD_PATH}`); +} + const ANTIGRAVITY_MODELS_PATH = "/v1internal:models"; const ANTIGRAVITY_FETCH_AVAILABLE_MODELS_PATH = "/v1internal:fetchAvailableModels"; diff --git a/open-sse/config/audioRegistry.ts b/open-sse/config/audioRegistry.ts index 6ee45169fd..1b3be02db7 100644 --- a/open-sse/config/audioRegistry.ts +++ b/open-sse/config/audioRegistry.ts @@ -145,6 +145,19 @@ export const AUDIO_TRANSCRIPTION_PROVIDERS: Record = { ], }, + soniox: { + id: "soniox", + baseUrl: "https://api.soniox.com/v1/transcriptions", + authType: "apikey", + authHeader: "bearer", + async: true, + format: "soniox", + models: [ + { id: "stt-async-v5", name: "Soniox STT Async v5" }, + { id: "stt-async-v4", name: "Soniox STT Async v4" }, + ], + }, + nvidia: { id: "nvidia", baseUrl: "https://integrate.api.nvidia.com/v1/audio/transcriptions", @@ -320,6 +333,15 @@ export const AUDIO_SPEECH_PROVIDERS: Record = { ], }, + soniox: { + id: "soniox", + baseUrl: "https://tts-rt.soniox.com/tts", + authType: "apikey", + authHeader: "bearer", + format: "soniox-tts", + models: [{ id: "tts-rt-v1", name: "Soniox TTS RT v1" }], + }, + elevenlabs: { id: "elevenlabs", baseUrl: "https://api.elevenlabs.io/v1/text-to-speech", diff --git a/open-sse/config/freeModelCatalog.data.ts b/open-sse/config/freeModelCatalog.data.ts index 9893a08fd4..42ec705f8c 100644 --- a/open-sse/config/freeModelCatalog.data.ts +++ b/open-sse/config/freeModelCatalog.data.ts @@ -115,10 +115,7 @@ export const FREE_MODEL_BUDGETS: FreeModelBudget[] = [ { provider: "cerebras", modelId: "zai-glm-4.7", displayName: "GLM 4.7", monthlyTokens: 30000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "cerebras", tos: "caution" }, { provider: "cerebras", modelId: "gpt-oss-120b", displayName: "GPT OSS 120B", monthlyTokens: 30000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "cerebras", tos: "caution" }, { provider: "cloudflare-ai", modelId: "@cf/meta/llama-3.3-70b-instruct", displayName: "Llama 3.3 70B (🆓 ~150 resp/day)", monthlyTokens: 30000000, creditTokens: 0, freeType: "recurring-daily", poolKey: "cloudflare-ai", tos: "caution" }, - { provider: "cloudflare-ai", modelId: "@cf/meta/llama-3.1-8b-instruct", displayName: "Llama 3.1 8B (🆓)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "cloudflare-ai", tos: "caution" }, { provider: "cloudflare-ai", modelId: "@cf/google/gemma-3-12b-it", displayName: "Gemma 3 12B (🆓)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "cloudflare-ai", tos: "caution" }, - { provider: "cloudflare-ai", modelId: "@cf/mistral/mistral-7b-instruct-v0.2-lora", displayName: "Mistral 7B (🆓)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "cloudflare-ai", tos: "caution" }, - { provider: "cloudflare-ai", modelId: "@cf/qwen/qwen2.5-coder-15b-instruct", displayName: "Qwen 2.5 Coder 15B (🆓)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "cloudflare-ai", tos: "caution" }, { provider: "cloudflare-ai", modelId: "@cf/qwen/qwen2.5-coder-32b-instruct", displayName: "Qwen 2.5 Coder 32B (🆓)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "cloudflare-ai", tos: "caution" }, { provider: "cloudflare-ai", modelId: "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", displayName: "DeepSeek R1 Distill 32B (🆓)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "cloudflare-ai", tos: "caution" }, { provider: "cloudflare-ai", modelId: "@cf/meta/llama-3.3-70b-instruct-fp8-fast", displayName: "Llama 3.3 70B (FP8 Fast 🆓)", monthlyTokens: 0, creditTokens: 0, freeType: "recurring-daily", poolKey: "cloudflare-ai", tos: "caution" }, diff --git a/open-sse/config/imageRegistry.ts b/open-sse/config/imageRegistry.ts index becb18e008..386dbf1485 100644 --- a/open-sse/config/imageRegistry.ts +++ b/open-sse/config/imageRegistry.ts @@ -711,6 +711,20 @@ export const IMAGE_PROVIDERS: Record = { name: "Firefly Runway Gen-4 Image", inputModalities: ["text", "image"], }, + // Topaz Labs upscalers (inputMediaUseCase: ["upscaling"]). + // Served by firefly-3p /v2/3p-images/upsample — see config/upscaleRegistry.ts. + { + id: "topaz-standard", + name: "Firefly Topaz Upscale (Standard)", + inputModalities: ["image"], + imageRequired: true, + }, + { + id: "topaz-bloom", + name: "Firefly Topaz Bloom (Creative Upscale)", + inputModalities: ["image"], + imageRequired: true, + }, ], supportedSizes: ["1:1", "16:9", "9:16", "4:3", "3:4", "1024x1024", "1792x1024", "1024x1792"], }, @@ -943,7 +957,6 @@ export function getImageModelAliases() { export function isRegisteredImageModel(providerId, modelId) { return Boolean(findImageModelConfig(providerId, modelId)); } - export function getImageModelEntry(modelStr) { if (!modelStr) return null; diff --git a/open-sse/config/providerModels.ts b/open-sse/config/providerModels.ts index 4051e00e93..75099bad83 100644 --- a/open-sse/config/providerModels.ts +++ b/open-sse/config/providerModels.ts @@ -12,27 +12,27 @@ export const PROVIDER_MODELS: Record = new Proxy( {} as Record, { get(_, prop) { - if (typeof prop === 'symbol') return undefined; + if (typeof prop === "symbol") return undefined; return Reflect.get(initModels(), prop, _models); }, has(_, prop) { - if (typeof prop === 'symbol') return false; + if (typeof prop === "symbol") return false; return Reflect.has(initModels(), prop); }, ownKeys() { return Reflect.ownKeys(initModels()); }, getOwnPropertyDescriptor(_, prop) { - if (typeof prop === 'symbol') return undefined; + if (typeof prop === "symbol") return undefined; return Object.getOwnPropertyDescriptor(initModels(), prop); }, set(_, prop, value) { - if (typeof prop === 'symbol') return false; + if (typeof prop === "symbol") return false; (initModels() as Record)[prop] = value; return true; }, deleteProperty(_, prop) { - if (typeof prop === 'symbol') return false; + if (typeof prop === "symbol") return false; return Reflect.deleteProperty(initModels(), prop); }, } @@ -41,27 +41,27 @@ export const PROVIDER_ID_TO_ALIAS: Record = new Proxy( {} as Record, { get(_, prop) { - if (typeof prop === 'symbol') return undefined; + if (typeof prop === "symbol") return undefined; return Reflect.get(initAliases(), prop, _aliases); }, has(_, prop) { - if (typeof prop === 'symbol') return false; + if (typeof prop === "symbol") return false; return Reflect.has(initAliases(), prop); }, ownKeys() { return Reflect.ownKeys(initAliases()); }, getOwnPropertyDescriptor(_, prop) { - if (typeof prop === 'symbol') return undefined; + if (typeof prop === "symbol") return undefined; return Object.getOwnPropertyDescriptor(initAliases(), prop); }, set(_, prop, value) { - if (typeof prop === 'symbol') return false; + if (typeof prop === "symbol") return false; (initAliases() as Record)[prop] = value; return true; }, deleteProperty(_, prop) { - if (typeof prop === 'symbol') return false; + if (typeof prop === "symbol") return false; return Reflect.deleteProperty(initAliases(), prop); }, } @@ -116,7 +116,13 @@ export function findModelName(aliasOrId: string, modelId: string): string { export function getModelTargetFormat(aliasOrId: string, modelId: string): string | null { const models = PROVIDER_MODELS[aliasOrId]; - const found = models?.find((m) => m.id === modelId); + // Strip provider prefix if present: "openai/gpt-5.6-luna" → "gpt-5.6-luna" + const prefix = aliasOrId + "/"; + const bareModelId = + typeof modelId === "string" && modelId.startsWith(prefix) + ? modelId.slice(prefix.length) + : modelId; + const found = models?.find((m) => m.id === bareModelId); if (found?.targetFormat) return found.targetFormat; // #5842: OpenAI "*-pro" reasoning models (o1-pro, gpt-5.x-pro) are only served by // the native /v1/responses endpoint — /v1/chat/completions 404s ("only supported @@ -124,7 +130,7 @@ export function getModelTargetFormat(aliasOrId: string, modelId: string): string // covers dynamically-synced ids that post-date the catalog (same spirit as the gh // executor's /codex/i routing, 9router#102). Scoped to the openai alias so other // providers shipping *-pro ids keep their own endpoint semantics. - if (aliasOrId === "openai" && /-pro$/i.test(modelId)) return "openai-responses"; + if (aliasOrId === "openai" && /-pro$/i.test(bareModelId)) return "openai-responses"; return null; } diff --git a/open-sse/config/providerRegistry.ts b/open-sse/config/providerRegistry.ts index 70f6ce831c..bb3b6e0f9f 100644 --- a/open-sse/config/providerRegistry.ts +++ b/open-sse/config/providerRegistry.ts @@ -180,6 +180,24 @@ export function getRegistryEntry(provider: string): RegistryEntry | null { return REGISTRY[provider] || _byAlias.get(provider) || null; } +/** + * Decide whether a non-empty live catalog may exclude omitted static models + * during request routing and wildcard expansion. + * + * Live discovery is authoritative by default, including for dynamic providers. + * Providers with intentionally partial discovery must explicitly opt out in + * their registry entry. + */ +export function providerUsesAuthoritativeLiveCatalog(provider: string): boolean { + const entry = getRegistryEntry(provider); + + if (entry && typeof entry.liveCatalogAuthoritative === "boolean") { + return entry.liveCatalogAuthoritative; + } + + return true; +} + /** Get all registered provider IDs */ export function getRegisteredProviders(): string[] { return Object.keys(REGISTRY); diff --git a/open-sse/config/providers/index.ts b/open-sse/config/providers/index.ts index b12a6963f6..47a5896784 100644 --- a/open-sse/config/providers/index.ts +++ b/open-sse/config/providers/index.ts @@ -22,6 +22,7 @@ import { glmProvider } from "./registry/glm/index.ts"; import { glmtProvider } from "./registry/glm/t/index.ts"; import { glm_cnProvider } from "./registry/glm/cn/index.ts"; import { traeProvider } from "./registry/trae/index.ts"; +import { raycastProvider } from "./registry/raycast/index.ts"; import { muse_spark_webProvider } from "./registry/muse-spark-web/index.ts"; import { lmarenaProvider } from "./registry/lmarena/index.ts"; import { kilocodeProvider } from "./registry/kilocode/index.ts"; @@ -147,6 +148,7 @@ import { siliconflowProvider } from "./registry/siliconflow/index.ts"; import { gitlab_duoProvider } from "./registry/gitlab-duo/index.ts"; import { command_codeProvider } from "./registry/command-code/index.ts"; import { novitaProvider } from "./registry/novita/index.ts"; +import { regoloProvider } from "./registry/regolo/index.ts"; import { windsurfProvider } from "./registry/windsurf/index.ts"; import { zed_hostedProvider } from "./registry/zed-hosted/index.ts"; import { nanogptProvider } from "./registry/nanogpt/index.ts"; @@ -169,6 +171,7 @@ import { kilo_gatewayProvider } from "./registry/kilo-gateway/index.ts"; import { bailian_coding_planProvider } from "./registry/bailian-coding-plan/index.ts"; import { gigachatProvider } from "./registry/gigachat/index.ts"; import { devin_cliProvider } from "./registry/devin-cli/index.ts"; +import { devin_cli_agenticProvider } from "./registry/devin-cli-agentic/index.ts"; import { auggieProvider } from "./registry/auggie/index.ts"; import { chutesProvider } from "./registry/chutes/index.ts"; import { chenzkProvider } from "./registry/chenzk/index.ts"; @@ -243,6 +246,7 @@ export const REGISTRY: Record = { glmt: glmtProvider, "glm-cn": glm_cnProvider, trae: traeProvider, + raycast: raycastProvider, "muse-spark-web": muse_spark_webProvider, lmarena: lmarenaProvider, kilocode: kilocodeProvider, @@ -368,6 +372,7 @@ export const REGISTRY: Record = { "gitlab-duo": gitlab_duoProvider, "command-code": command_codeProvider, novita: novitaProvider, + regolo: regoloProvider, windsurf: windsurfProvider, "zed-hosted": zed_hostedProvider, nanogpt: nanogptProvider, @@ -389,6 +394,7 @@ export const REGISTRY: Record = { "bailian-coding-plan": bailian_coding_planProvider, gigachat: gigachatProvider, "devin-cli": devin_cliProvider, + "devin-cli-agentic": devin_cli_agenticProvider, auggie: auggieProvider, chutes: chutesProvider, chenzk: chenzkProvider, diff --git a/open-sse/config/providers/registry/anyapi/index.ts b/open-sse/config/providers/registry/anyapi/index.ts new file mode 100644 index 0000000000..fcb118a771 --- /dev/null +++ b/open-sse/config/providers/registry/anyapi/index.ts @@ -0,0 +1,11 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const anyapiProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "anyapi", + alias: "anyapi", + baseUrl: "https://api.anyapi.ai/v1/chat/completions", + modelsUrl: "https://api.anyapi.ai/v1/models", + models: [], + passthroughModels: true, +}); diff --git a/open-sse/config/providers/registry/cloudflare-ai/index.ts b/open-sse/config/providers/registry/cloudflare-ai/index.ts index f90d67137a..907138aa48 100644 --- a/open-sse/config/providers/registry/cloudflare-ai/index.ts +++ b/open-sse/config/providers/registry/cloudflare-ai/index.ts @@ -12,10 +12,7 @@ export const cloudflare_aiProvider: RegistryEntry = { // 10K Neurons/day free: ~150 LLM responses or 500s Whisper audio — global edge models: [ { id: "@cf/meta/llama-3.3-70b-instruct", name: "Llama 3.3 70B (🆓 ~150 resp/day)" }, - { id: "@cf/meta/llama-3.1-8b-instruct", name: "Llama 3.1 8B (🆓)" }, { id: "@cf/google/gemma-3-12b-it", name: "Gemma 3 12B (🆓)" }, - { id: "@cf/mistral/mistral-7b-instruct-v0.2-lora", name: "Mistral 7B (🆓)" }, - { id: "@cf/qwen/qwen2.5-coder-15b-instruct", name: "Qwen 2.5 Coder 15B (🆓)" }, { id: "@cf/qwen/qwen2.5-coder-32b-instruct", name: "Qwen 2.5 Coder 32B (🆓)" }, { id: "@cf/deepseek-ai/deepseek-r1-distill-qwen-32b", name: "DeepSeek R1 Distill 32B (🆓)" }, // Sweep 2026-06-19: + current Workers AI catalog ids (developers.cloudflare.com/workers-ai/models). diff --git a/open-sse/config/providers/registry/command-code/index.ts b/open-sse/config/providers/registry/command-code/index.ts index affe935180..23a73efe46 100644 --- a/open-sse/config/providers/registry/command-code/index.ts +++ b/open-sse/config/providers/registry/command-code/index.ts @@ -8,6 +8,9 @@ export const command_codeProvider: RegistryEntry = { baseUrl: "https://api.commandcode.ai", chatPath: "/alpha/generate", modelsUrl: "https://api.commandcode.ai/provider/v1/models", + // The discovery response is a partial routing catalog; static registry + // entries omitted from it can still be accepted by the gateway. + liveCatalogAuthoritative: false, authType: "apikey", authHeader: "Authorization", authPrefix: "Bearer ", diff --git a/open-sse/config/providers/registry/deepseek/web/index.ts b/open-sse/config/providers/registry/deepseek/web/index.ts index ba20e12e0d..08fc142564 100644 --- a/open-sse/config/providers/registry/deepseek/web/index.ts +++ b/open-sse/config/providers/registry/deepseek/web/index.ts @@ -9,27 +9,49 @@ export const deepseek_webProvider: RegistryEntry = { authType: "apikey", authHeader: "bearer", models: [ - { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", toolCalling: false }, - { id: "deepseek-v4-pro-think", name: "DeepSeek V4 Pro Think", supportsReasoning: true }, - { id: "deepseek-v4-pro-search", name: "DeepSeek V4 Pro Search", toolCalling: false }, + { id: "deepseek-v4-pro", name: "DeepSeek V4 Pro", toolCalling: true }, + { + id: "deepseek-v4-pro-think", + name: "DeepSeek V4 Pro Think", + toolCalling: true, + supportsReasoning: true, + }, + { id: "deepseek-v4-pro-search", name: "DeepSeek V4 Pro Search", toolCalling: true }, { id: "deepseek-v4-pro-think-search", name: "DeepSeek V4 Pro Think+Search", + toolCalling: true, supportsReasoning: true, }, - { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", toolCalling: false }, - { id: "deepseek-v4-flash-think", name: "DeepSeek V4 Flash Think", supportsReasoning: true }, - { id: "deepseek-v4-flash-search", name: "DeepSeek V4 Flash Search", toolCalling: false }, + { id: "deepseek-v4-flash", name: "DeepSeek V4 Flash", toolCalling: true }, + { + id: "deepseek-v4-flash-think", + name: "DeepSeek V4 Flash Think", + toolCalling: true, + supportsReasoning: true, + }, + { id: "deepseek-v4-flash-search", name: "DeepSeek V4 Flash Search", toolCalling: true }, { id: "deepseek-v4-flash-think-search", name: "DeepSeek V4 Flash Think+Search", + toolCalling: true, supportsReasoning: true, }, - { id: "deepseek-chat", name: "DeepSeek Chat", toolCalling: false }, - { id: "deepseek-reasoner", name: "DeepSeek Reasoner", supportsReasoning: true }, - { id: "DeepSeek-R1", name: "DeepSeek R1", supportsReasoning: true }, - { id: "DeepSeek-R1-Search", name: "DeepSeek R1 Search", supportsReasoning: true }, - { id: "DeepSeek-V3.2", name: "DeepSeek V3.2", toolCalling: false }, - { id: "DeepSeek-Search", name: "DeepSeek Search", toolCalling: false }, + { id: "deepseek-chat", name: "DeepSeek Chat", toolCalling: true }, + { + id: "deepseek-reasoner", + name: "DeepSeek Reasoner", + toolCalling: true, + supportsReasoning: true, + }, + { id: "DeepSeek-R1", name: "DeepSeek R1", toolCalling: true, supportsReasoning: true }, + { + id: "DeepSeek-R1-Search", + name: "DeepSeek R1 Search", + toolCalling: true, + supportsReasoning: true, + }, + { id: "DeepSeek-V3.2", name: "DeepSeek V3.2", toolCalling: true }, + { id: "DeepSeek-Search", name: "DeepSeek Search", toolCalling: true }, ], }; diff --git a/open-sse/config/providers/registry/devin-cli-agentic/index.ts b/open-sse/config/providers/registry/devin-cli-agentic/index.ts new file mode 100644 index 0000000000..3001936e25 --- /dev/null +++ b/open-sse/config/providers/registry/devin-cli-agentic/index.ts @@ -0,0 +1,21 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { DEVIN_MODEL_CATALOG } from "../devin/catalog.ts"; + +export const devin_cli_agenticProvider: RegistryEntry = { + id: "devin-cli-agentic", + alias: "dva", + format: "claude", + executor: "devin-cli-agentic", + baseUrl: "devin://acp/stdio", + // Authentication is owned exclusively by the official Devin CLI inside its + // isolated volume. OmniRoute must not import or persist a host credential. + authType: "none", + authHeader: "none", + defaultContextLength: 200000, + models: DEVIN_MODEL_CATALOG.map((model) => ({ + ...model, + toolCalling: true, + supportsReasoning: false, + supportsVision: false, + })), +}; diff --git a/open-sse/config/providers/registry/electronhub/index.ts b/open-sse/config/providers/registry/electronhub/index.ts new file mode 100644 index 0000000000..b1b0cce56f --- /dev/null +++ b/open-sse/config/providers/registry/electronhub/index.ts @@ -0,0 +1,11 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const electronhubProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "electronhub", + alias: "electronhub", + baseUrl: "https://api.electronhub.ai/v1/chat/completions", + modelsUrl: "https://api.electronhub.ai/v1/models", + models: [], + passthroughModels: true, +}); diff --git a/open-sse/config/providers/registry/fastrouter/index.ts b/open-sse/config/providers/registry/fastrouter/index.ts new file mode 100644 index 0000000000..622c612065 --- /dev/null +++ b/open-sse/config/providers/registry/fastrouter/index.ts @@ -0,0 +1,11 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const fastrouterProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "fastrouter", + alias: "fastrouter", + baseUrl: "https://api.fastrouter.ai/api/v1/chat/completions", + modelsUrl: "https://api.fastrouter.ai/api/v1/models", + models: [], + passthroughModels: true, +}); diff --git a/open-sse/config/providers/registry/llm-kiwi/index.ts b/open-sse/config/providers/registry/llm-kiwi/index.ts new file mode 100644 index 0000000000..d929afec29 --- /dev/null +++ b/open-sse/config/providers/registry/llm-kiwi/index.ts @@ -0,0 +1,14 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const llmKiwiProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "llm-kiwi", + alias: "llmkiwi", + baseUrl: "https://api.llm.kiwi/v1/chat/completions", + modelsUrl: "https://api.llm.kiwi/v1/models", + models: [ + { id: "auto", name: "Auto" }, + { id: "hrLLM", name: "hrLLM" }, + ], + passthroughModels: true, +}); diff --git a/open-sse/config/providers/registry/llmgateway/index.ts b/open-sse/config/providers/registry/llmgateway/index.ts new file mode 100644 index 0000000000..972a3a8930 --- /dev/null +++ b/open-sse/config/providers/registry/llmgateway/index.ts @@ -0,0 +1,11 @@ +import type { RegistryEntry } from "../../shared.ts"; +import { buildOpenAiCompatibleRegistryEntry } from "../../shared.ts"; + +export const llmgatewayProvider: RegistryEntry = buildOpenAiCompatibleRegistryEntry({ + id: "llmgateway", + alias: "llmgateway", + baseUrl: "https://api.llmgateway.io/v1/chat/completions", + modelsUrl: "https://api.llmgateway.io/v1/models", + models: [], + passthroughModels: true, +}); diff --git a/open-sse/config/providers/registry/opencode/zen/index.ts b/open-sse/config/providers/registry/opencode/zen/index.ts index db06fe8042..a241b043ce 100644 --- a/open-sse/config/providers/registry/opencode/zen/index.ts +++ b/open-sse/config/providers/registry/opencode/zen/index.ts @@ -85,14 +85,13 @@ export const opencode_zenProvider: RegistryEntry = { { id: "qwen3.6-plus", name: "Qwen3.6 Plus", targetFormat: "claude", supportsVision: false }, // ── Free Tier ────────────────────────────────────────────── + // #6998 (2026-07-14): upstream free tier rotated — minimax-m2.5-free, + // nemotron-3-super-free and qwen3.6-plus-free were delisted (401). Replaced + // by the 4 entries below with upstream-verified limits. { id: "deepseek-v4-flash-free", name: "DeepSeek V4 Flash Free", supportsReasoning: true }, - { id: "minimax-m2.5-free", name: "MiniMax M2.5 Free", contextLength: 204800 }, - { id: "nemotron-3-super-free", name: "Nemotron 3 Super Free", contextLength: 1000000 }, - { - id: "qwen3.6-plus-free", - name: "Qwen3.6 Plus Free", - targetFormat: "claude", - contextLength: 200000, - }, + { id: "mimo-v2.5-free", name: "MiMo V2.5 Free", contextLength: 200000 }, + { id: "hy3-free", name: "HY3 Free", contextLength: 200000 }, + { id: "nemotron-3-ultra-free", name: "Nemotron 3 Ultra Free", contextLength: 1000000 }, + { id: "north-mini-code-free", name: "North Mini Code Free", contextLength: 200000 }, ], }; diff --git a/open-sse/config/providers/registry/openrouter/index.ts b/open-sse/config/providers/registry/openrouter/index.ts index a770a5e5e7..1116badd4d 100644 --- a/open-sse/config/providers/registry/openrouter/index.ts +++ b/open-sse/config/providers/registry/openrouter/index.ts @@ -13,5 +13,12 @@ export const openrouterProvider: RegistryEntry = { "HTTP-Referer": "https://endpoint-proxy.local", "X-Title": "Endpoint Proxy", }, + // OpenRouter multiplexes hundreds of independent upstream models behind one + // connection/API key — without this flag, hasPerModelQuota() (accountFallback.ts) + // falls through to connection-wide cooldown on any model-specific failure (e.g. a + // 404 "No endpoints found" for one dead/renamed model), poisoning every OTHER + // OpenRouter model on the same connection for the cooldown window and surfacing + // that first model's stale error message on their unrelated requests. + passthroughModels: true, models: [{ id: "auto", name: "Auto (Best Available)" }], }; diff --git a/open-sse/config/providers/registry/raycast/index.ts b/open-sse/config/providers/registry/raycast/index.ts new file mode 100644 index 0000000000..cd55a343ff --- /dev/null +++ b/open-sse/config/providers/registry/raycast/index.ts @@ -0,0 +1,33 @@ +/** + * @file index.ts + * @description Raycast Pro AI provider registry entry (reverse-engineered, unofficial API). + * + * @changes + * - [2026-07-28] [Composer] - Initial Raycast provider registry module + */ + +import type { RegistryEntry } from "../../shared.ts"; + +/** Seed catalog — full list synced from Raycast /api/v1/ai/models on connect/import. */ +export const raycastProvider: RegistryEntry = { + id: "raycast", + alias: "rc", + format: "openai", + executor: "raycast", + baseUrl: "https://backend.raycast.com/api/v1/ai", + authType: "oauth", + authHeader: "bearer", + defaultContextLength: 128000, + models: [ + { id: "openai-gpt-5-mini", name: "GPT-5 Mini" }, + { id: "openai-gpt-4o-mini", name: "GPT-4o Mini" }, + { id: "anthropic-claude-sonnet-4-6", name: "Claude Sonnet 4.6" }, + { id: "google-gemini-2.5-flash", name: "Gemini 2.5 Flash" }, + { id: "raycast-ray1", name: "Ray1" }, + { id: "raycast-ray1-mini", name: "Ray1 Mini" }, + { id: "perplexity-sonar", name: "Sonar" }, + { id: "perplexity-sonar-pro", name: "Sonar Pro" }, + { id: "mistral-open-mistral-nemo", name: "Mistral Nemo" }, + { id: "xai-grok-3-mini", name: "Grok 3 Mini" }, + ], +}; diff --git a/open-sse/config/providers/registry/regolo/index.ts b/open-sse/config/providers/registry/regolo/index.ts new file mode 100644 index 0000000000..323d4dfdfd --- /dev/null +++ b/open-sse/config/providers/registry/regolo/index.ts @@ -0,0 +1,16 @@ +import type { RegistryEntry } from "../../shared.ts"; + +export const regoloProvider: RegistryEntry = { + id: "regolo", + alias: "regolo", + format: "openai", + executor: "default", + baseUrl: "https://api.regolo.ai", + authType: "apikey", + authHeader: "bearer", + models: [ + { id: "regolo-chat", name: "Regolo Chat" }, + { id: "regolo-fast", name: "Regolo Fast" }, + ], + passthroughModels: true, +}; diff --git a/open-sse/config/providers/shared.ts b/open-sse/config/providers/shared.ts index e8e2e96d75..44cea91c05 100644 --- a/open-sse/config/providers/shared.ts +++ b/open-sse/config/providers/shared.ts @@ -139,6 +139,15 @@ export interface RegistryEntry { clientVersion?: string; timeoutMs?: number; passthroughModels?: boolean; + /** + * Whether a non-empty synchronized live model list is exhaustive enough + * to reject static registry IDs that it omits. + * + * Defaults to true. Set this explicitly to false for providers whose + * discovery endpoint is known to return only a partial subset of the models + * that the provider can route. + */ + liveCatalogAuthoritative?: boolean; /** Default context window for all models in this provider (can be overridden per-model) */ defaultContextLength?: number; /** Maximum OpenAI-compatible function name length accepted by this provider. */ @@ -262,16 +271,14 @@ export const GPT_5_6_API_CAPABILITIES = { maxOutputTokens: 128000, } as const; -// Codex's live catalog reports a 272K input context window for GPT-5.6. -// Keep the input and output limits explicit for catalog consumers that expose them separately. export const GPT_5_6_CODEX_CAPABILITIES = { targetFormat: "openai-responses", toolCalling: true, supportsReasoning: true, supportsVision: true, supportsXHighEffort: true, - contextLength: 272000, - maxInputTokens: 272000, + contextLength: 1050000, + maxInputTokens: 922000, maxOutputTokens: 128000, } as const; diff --git a/open-sse/config/searchRegistry.ts b/open-sse/config/searchRegistry.ts index 2b366547d3..b742ad4914 100644 --- a/open-sse/config/searchRegistry.ts +++ b/open-sse/config/searchRegistry.ts @@ -207,6 +207,7 @@ export const SEARCH_PROVIDERS: Record = { maxMaxResults: 50, timeoutMs: 10_000, cacheTTLMs: 3 * 60 * 1000, + fallbackOnly: true, }, "ollama-search": { diff --git a/open-sse/config/upscaleRegistry.ts b/open-sse/config/upscaleRegistry.ts new file mode 100644 index 0000000000..fd383e5252 --- /dev/null +++ b/open-sse/config/upscaleRegistry.ts @@ -0,0 +1,228 @@ +/** + * Image Upscale Provider Registry + * + * Providers that serve `POST /v1/images/upscale` — image→image super-resolution. + * Upscaling is a distinct capability from generation: there is no text-to-image + * path, an input image is always mandatory, and the meaningful controls are the + * scale factor and (for generative upscalers) a creativity level. + * + * Only providers whose upscale API is already implemented here are listed: + * - adobe-firefly → Topaz models on firefly-3p `/v2/3p-images/upsample` + * - stability-ai → `/v2beta/stable-image/upscale/{fast,conservative,creative}` + * - topaz → Topaz Labs `/image/v1/enhance` (native API key) + * + * Credentials/proxy resolution reuses each provider's existing connection, so a + * configured Adobe Firefly / Stability AI / Topaz Labs account works with no + * extra setup. + */ + +import { parseModelFromRegistry, getAllModelsFromRegistry } from "./registryUtils.ts"; + +/** Scale factors offered by default when a model does not restrict them. */ +export const DEFAULT_UPSCALE_FACTORS: readonly number[] = Object.freeze([2, 4]); + +export interface UpscaleModelEntry { + id: string; + name: string; + /** Discrete scale factors the upstream accepts (in x). */ + factors: number[]; + /** Model exposes a creativity / re-imagine control (0-100 % on the wire-agnostic API). */ + supportsCreativity?: boolean; + /** Model accepts an optional guidance prompt. */ + supportsPrompt?: boolean; + /** Upstream rejects the request without a prompt. */ + promptRequired?: boolean; + description?: string; +} + +export interface UpscaleProviderConfig { + id: string; + alias?: string; + baseUrl: string; + authType: "apikey" | "none"; + authHeader: string; + format: "adobe-firefly-upscale" | "stability-upscale" | "topaz-upscale"; + models: UpscaleModelEntry[]; +} + +export const UPSCALE_PROVIDERS: Record = { + // Adobe Firefly (unofficial) — Topaz Labs models exposed through the Firefly 3P + // async upsample job API. Live capture: web_providers/upsample.txt. + // Discovery (web_providers/upscale.txt) lists modelId "topaz" with the image + // modelVersions default/standard/reimagine carrying inputMediaUseCase ["upscaling"]; + // starlight-*/astra-2 are video upscalers and intentionally excluded here. + "adobe-firefly": { + id: "adobe-firefly", + alias: "firefly", + baseUrl: "https://firefly-3p.ff.adobe.io/v2/3p-images/upsample", + authType: "apikey", + authHeader: "bearer", + format: "adobe-firefly-upscale", + models: [ + { + id: "topaz", + name: "Firefly Topaz Upscale", + factors: [2, 4], + description: "Topaz Labs detail-preserving upscale (standard).", + }, + { + id: "topaz-standard", + name: "Firefly Topaz Upscale (Standard)", + factors: [2, 4], + description: "Topaz Labs detail-preserving upscale — no invented detail.", + }, + { + id: "topaz-bloom", + name: "Firefly Topaz Bloom (Creative)", + factors: [2, 4], + supportsCreativity: true, + description: "Topaz Bloom generative upscale — creativity adds synthesized detail.", + }, + ], + }, + + // Stability AI stable-image upscale family. `fast` is a 4x deterministic pass; + // `conservative` and `creative` are prompt-guided (creative is an async job). + "stability-ai": { + id: "stability-ai", + baseUrl: "https://api.stability.ai", + authType: "apikey", + authHeader: "bearer", + format: "stability-upscale", + models: [ + { + id: "fast", + name: "Stability Fast Upscale (4x)", + factors: [4], + description: "Lightweight 4x upscale, no prompt.", + }, + { + id: "conservative", + name: "Stability Conservative Upscale", + factors: [4], + supportsPrompt: true, + promptRequired: true, + description: "Up to ~4 MP while preserving every detail. Prompt required upstream.", + }, + { + id: "creative", + name: "Stability Creative Upscale", + factors: [4], + supportsCreativity: true, + supportsPrompt: true, + promptRequired: true, + description: "Heavily reimagines low-quality inputs (async job). Prompt required upstream.", + }, + ], + }, + + // Topaz Labs native Image API (own api key, synchronous). + topaz: { + id: "topaz", + baseUrl: "https://api.topazlabs.com", + authType: "apikey", + authHeader: "x-api-key", + format: "topaz-upscale", + models: [ + { + id: "topaz-enhance", + name: "Topaz Labs Enhance", + factors: [2, 4], + description: "Topaz Labs Image Enhance (auto model selection).", + }, + ], + }, +}; + +export function getUpscaleProvider(providerId: string | null | undefined): UpscaleProviderConfig | null { + if (!providerId) return null; + return UPSCALE_PROVIDERS[providerId] || null; +} + +/** Parse `provider/model` (or a bare, unambiguous model id) against the upscale registry. */ +export function parseUpscaleModel(modelStr: string | null) { + return parseModelFromRegistry(modelStr, UPSCALE_PROVIDERS); +} + +/** Flat catalog for `GET /v1/images/upscale`. */ +export function getAllUpscaleModels() { + return getAllModelsFromRegistry(UPSCALE_PROVIDERS, (_providerId, config) => ({ + format: config.format, + })); +} + +/** Registry row for a `provider/model` string, or null when unknown. */ +export function getUpscaleModelEntry( + modelStr: string | null +): { provider: string; providerConfig: UpscaleProviderConfig; entry: UpscaleModelEntry } | null { + const { provider, model } = parseUpscaleModel(modelStr); + if (!provider || !model) return null; + const providerConfig = UPSCALE_PROVIDERS[provider]; + if (!providerConfig) return null; + const entry = providerConfig.models.find((m) => m.id === model); + if (!entry) return null; + return { provider, providerConfig, entry }; +} + +/** True when `provider/model` (or bare id) names a registered upscale model. */ +export function isRegisteredUpscaleModel(modelStr: string | null): boolean { + return getUpscaleModelEntry(modelStr) !== null; +} + +/** + * Normalize a requested scale factor to one the model actually supports. + * + * Accepts numbers and the loose strings clients send (`"2"`, `"2x"`, `"x4"`, `"4X"`). + * Unparseable/out-of-range values snap to the nearest allowed factor rather than + * failing the request — a 3x ask on a {2,4} model is better served at 4x than 400ed. + */ +export function normalizeUpscaleFactor( + value: unknown, + allowed: readonly number[] = DEFAULT_UPSCALE_FACTORS +): number { + const factors = allowed.length > 0 ? [...allowed] : [...DEFAULT_UPSCALE_FACTORS]; + const fallback = factors.includes(2) ? 2 : factors[0]!; + + let n: number = NaN; + if (typeof value === "number") { + n = value; + } else if (typeof value === "string") { + const match = /(\d+(?:\.\d+)?)/.exec(value.trim()); + if (match) n = Number(match[1]); + } + if (!Number.isFinite(n) || n <= 0) return fallback; + + let best = factors[0]!; + let bestDelta = Math.abs(factors[0]! - n); + for (const f of factors) { + const delta = Math.abs(f - n); + if (delta < bestDelta) { + best = f; + bestDelta = delta; + } + } + return best; +} + +/** + * Normalize a creativity input to a 0-100 percentage. + * + * The public API is percentage-based so every provider gets the same control + * regardless of its native scale (Firefly uses an integer level, Stability a + * 0.1-0.5 float). A fractional value strictly between 0 and 1 is read as a + * fraction (0.35 → 35 %); everything else is read as a percentage, so an + * integer `1` stays 1 % instead of silently becoming 100 %. + */ +export function normalizeCreativityPercent(value: unknown, fallback = 0): number { + let n: number = NaN; + if (typeof value === "number") n = value; + else if (typeof value === "string" && value.trim()) n = Number(value.trim().replace("%", "")); + if (!Number.isFinite(n)) return clampPercent(fallback); + if (n > 0 && n < 1) return clampPercent(n * 100); + return clampPercent(n); +} + +function clampPercent(n: number): number { + if (!Number.isFinite(n)) return 0; + return Math.max(0, Math.min(100, Math.round(n))); +} diff --git a/open-sse/executors/antigravity.ts b/open-sse/executors/antigravity.ts index 1188b1116d..85ca290ba7 100644 --- a/open-sse/executors/antigravity.ts +++ b/open-sse/executors/antigravity.ts @@ -13,6 +13,7 @@ import { getAntigravityOAuthUserAgent, } from "../services/antigravityHeaders.ts"; import { classify429, decide429, type Decision } from "../services/antigravity429Engine.ts"; +import { lockExactModel } from "../services/accountFallback.ts"; import { shouldRetryWithCredits, shouldUseCreditsFirst, @@ -22,6 +23,11 @@ import { import { persistCreditBalance, getAllPersistedCreditBalances } from "@/lib/db/creditBalance"; import { setConnectionRateLimitUntil } from "@/lib/db/providers"; import { getMitmAlias } from "@/lib/db/models"; +import { + MAX_ANTIGRAVITY_OUTPUT_TOKENS, + resolveAntigravityOutputCap, +} from "./antigravityOutputCap.ts"; +export { MAX_ANTIGRAVITY_OUTPUT_TOKENS } from "./antigravityOutputCap.ts"; import { ensureAntigravityProjectAssigned } from "../services/antigravityProjectBootstrap.ts"; import { persistDiscoveredAntigravityProjectId } from "../services/antigravityProjectPersist.ts"; import { @@ -278,18 +284,10 @@ async function cleanModelName(model: string, modelIdOverride?: string): Promise< return clean; } -/** - * Hard ceiling on `generationConfig.maxOutputTokens` for Antigravity Cloud Code. - * - * Ports decolua/9router#779 (lukmanfauzie): VS Code GitHub Copilot Chat in - * Agent mode regularly requests 32K–65K output tokens, which the Antigravity - * backend rejects with HTTP 400 "Invalid Argument". 16384 matches the - * upstream-accepted ceiling confirmed via successful 200 OK runs with - * claude-sonnet-4-6 and gemini-pro-agent across both Ask and Agent modes. - */ -export const MAX_ANTIGRAVITY_OUTPUT_TOKENS = 16384; - -function applyAntigravityGenerationDefaults(request: Record): void { +function applyAntigravityGenerationDefaults( + request: Record, + modelId?: string | null +): void { const generationConfig = request.generationConfig && typeof request.generationConfig === "object" ? (request.generationConfig as Record) @@ -321,9 +319,10 @@ function applyAntigravityGenerationDefaults(request: Record): v // (32K–65K) that trigger upstream 400 "Invalid Argument". Clamp silently // — the cap is provider-driven, not client-driven, and only matters when // the request would otherwise be rejected outright. + const cap = resolveAntigravityOutputCap(modelId); const finalMax = Number(generationConfig.maxOutputTokens); - if (Number.isFinite(finalMax) && finalMax > MAX_ANTIGRAVITY_OUTPUT_TOKENS) { - generationConfig.maxOutputTokens = MAX_ANTIGRAVITY_OUTPUT_TOKENS; + if (Number.isFinite(finalMax) && finalMax > cap) { + generationConfig.maxOutputTokens = cap; } request.generationConfig = generationConfig; @@ -665,7 +664,7 @@ export class AntigravityExecutor extends BaseExecutor { ) : rawTransformedRequest; - applyAntigravityGenerationDefaults(transformedRequest); + applyAntigravityGenerationDefaults(transformedRequest, upstreamModel); const { project: _project, @@ -1424,6 +1423,7 @@ export class AntigravityExecutor extends BaseExecutor { const { response, url, + model, headers, transformedBody, credentials, @@ -1443,10 +1443,9 @@ export class AntigravityExecutor extends BaseExecutor { // 1. Try to parse explicit retry time from message const parsedRetryMs = this.parseRetryFromErrorMessage(errorMessage); - // 2. Classify 429, then decide the final retry time BEFORE the credits - // retry so that full_quota_exhausted can skip the credits attempt - // entirely (avoids ~41s hold on an already-exhausted account) and - // persist the cooldown to DB for post-restart routing. + // 2. Classify 429, then decide the final retry time BEFORE the credits retry so + // full_quota_exhausted can skip the credits attempt entirely (avoids ~41s hold + // on an already-exhausted account) and locks only this exact model. const category = classify429(errorMessage); const decision: Decision = decide429(category, parsedRetryMs); const retryMs = decision.retryAfterMs; @@ -1460,10 +1459,9 @@ export class AntigravityExecutor extends BaseExecutor { !creditsRetryState.attempted && shouldRetryWithCredits(credentials?.accessToken || "", creditsMode); - // Retry mode gets one credits attempt before the account cooldown is persisted. - // All other full-quota paths fail closed immediately. + // Retry mode gets one credits attempt before the exact-model lock is persisted. if (decision.kind === "full_quota_exhausted" && retryMs && !creditsRetryEligible) { - markConnectionQuotaExhausted(accountId, retryMs); + lockExactModel(this.provider, accountId, model, "quota_exhausted", retryMs); } if (category === "quota_exhausted" && creditsAlreadyInjected) { diff --git a/open-sse/executors/antigravityOutputCap.ts b/open-sse/executors/antigravityOutputCap.ts new file mode 100644 index 0000000000..c3d173cd92 --- /dev/null +++ b/open-sse/executors/antigravityOutputCap.ts @@ -0,0 +1,52 @@ +import { getExplicitModelOutputCap } from "@/lib/modelCapabilities"; + +/** + * Fallback ceiling on `generationConfig.maxOutputTokens` for Antigravity + * Cloud Code, used when the model is unknown to the catalogue. + * + * Ports decolua/9router#779 (lukmanfauzie): VS Code GitHub Copilot Chat in + * Agent mode regularly requests 32K–65K output tokens, which the Antigravity + * backend rejects with HTTP 400 "Invalid Argument". 16384 was the ceiling + * confirmed safe at the time, via successful 200 OK runs with + * claude-sonnet-4-6 and gemini-pro-agent across both Ask and Agent modes. + * + * Both of those models are catalogue-known today, so neither one reaches this + * constant anymore: they get their own declared limit via + * `resolveAntigravityOutputCap` (65536 and 65535, respectively). The higher + * limit holds against the live upstream. A gemini-3.6-flash-high request came + * back with completion_tokens 16754 and finish_reason "stop", which exceeds + * 16384 on its own and so cannot be an artifact of thinking-token accounting. + * + * Note also that #779 was reported against Copilot Chat in Agent mode, a path + * that does not reach this executor, so 16384 arrived with that port rather + * than from a limit measured here. Beware of re-deriving it from a running + * instance: the clamp below rewrites maxOutputTokens before the request + * leaves, so a build still carrying a low constant measures its own clamp and + * reports it as an upstream ceiling. + */ +export const MAX_ANTIGRAVITY_OUTPUT_TOKENS = 16384; + +/** + * The output ceiling this specific model accepts, or the conservative + * fallback above when the id is not in the catalogue. + * + * The declared limits are not uniform: most Antigravity models publish + * 65535 or 65536, but gpt-oss-120b-medium publishes 32768. A single global + * ceiling either starves the first group or lets an oversized request + * through to the second, so the number has to come from the model. + */ +export function resolveAntigravityOutputCap(modelId: string | null | undefined): number { + const id = typeof modelId === "string" ? modelId.trim() : ""; + if (!id) return MAX_ANTIGRAVITY_OUTPUT_TOKENS; + try { + const declared = getExplicitModelOutputCap({ provider: "antigravity", model: id }); + return typeof declared === "number" && Number.isFinite(declared) && declared > 0 + ? declared + : MAX_ANTIGRAVITY_OUTPUT_TOKENS; + } catch { + // DB not available (build phase, transient error) -- fall through to the + // conservative fallback, the same guard cleanModelName uses above for + // its own MITM alias lookup. + return MAX_ANTIGRAVITY_OUTPUT_TOKENS; + } +} diff --git a/open-sse/executors/azure-openai.ts b/open-sse/executors/azure-openai.ts index 812733ce31..9b910d5c95 100644 --- a/open-sse/executors/azure-openai.ts +++ b/open-sse/executors/azure-openai.ts @@ -28,7 +28,11 @@ export class AzureOpenAIExecutor extends DefaultExecutor { void urlIndex; const providerSpecificData = credentials?.providerSpecificData || {}; - const baseUrl = normalizeAzureBaseUrl(providerSpecificData.baseUrl || this.config.baseUrl); + const baseUrl = normalizeAzureBaseUrl( + typeof providerSpecificData.baseUrl === "string" + ? providerSpecificData.baseUrl + : this.config.baseUrl + ); const apiVersion = typeof providerSpecificData.apiVersion === "string" && providerSpecificData.apiVersion.trim() ? providerSpecificData.apiVersion.trim() diff --git a/open-sse/executors/base.ts b/open-sse/executors/base.ts index a4312778d9..c3391278bf 100644 --- a/open-sse/executors/base.ts +++ b/open-sse/executors/base.ts @@ -234,71 +234,11 @@ export function mergeAbortSignals(primary: AbortSignal, secondary: AbortSignal): return controller.signal; } -function hasActiveClaudeThinking(body: Record): boolean { - const thinking = body.thinking as Record | undefined; - return thinking?.type === "enabled" || thinking?.type === "adaptive"; -} - -/** - * Collect every `thinkingConfig` object in a transformed request body that holds - * a thinking budget, wherever the provider's envelope nests it: - * - body.generationConfig.thinkingConfig (native Gemini / openai→gemini) - * - body.request.generationConfig.thinkingConfig (Antigravity Cloud Code envelope) - * Returns only objects that actually carry a `thinkingBudget`/`thinking_budget` - * field — a request without thinking config is never mutated. - */ -function collectThinkingConfigs(body: unknown): Array> { - if (!body || typeof body !== "object") return []; - const root = body as Record; - const configs: Array> = []; - const envelopes: unknown[] = [ - root.generationConfig, - (root.request as Record | undefined)?.generationConfig, - ]; - for (const env of envelopes) { - if (!env || typeof env !== "object") continue; - const tc = (env as Record).thinkingConfig; - if (tc && typeof tc === "object") { - const tcr = tc as Record; - if ("thinkingBudget" in tcr || "thinking_budget" in tcr) configs.push(tcr); - } - } - return configs; -} - -/** - * Read the first thinking budget found in the body (any supported nest / naming). - * Returns null when the body carries no readable numeric budget. - */ -function readNestedThinkingBudget(body: unknown): number | null { - for (const tc of collectThinkingConfigs(body)) { - const raw = tc.thinkingBudget ?? tc.thinking_budget; - const n = Number(raw); - if (Number.isFinite(n)) return n; - } - return null; -} - -/** - * Clamp every thinking budget in the body down to `max` (only lowers; never - * raises a budget already below max). Mutates in place. Returns true when at - * least one budget was actually lowered (i.e. a retry would send a different - * body) — false means the 400 was not caused by an over-max budget we hold, so - * retrying would resend an identical body and loop. - */ -function clampNestedThinkingBudget(body: unknown, max: number): boolean { - let changed = false; - for (const tc of collectThinkingConfigs(body)) { - for (const key of ["thinkingBudget", "thinking_budget"] as const) { - const n = Number(tc[key]); - if (Number.isFinite(n) && n > max) { - tc[key] = max; - changed = true; - } - } - } - return changed; -} +import { + hasActiveClaudeThinking, + readNestedThinkingBudget, + clampNestedThinkingBudget, +} from "../utils/thinkingBudget.ts"; /** * Strip the OmniRoute provider prefix from tool model fields (e.g. @@ -324,7 +264,11 @@ export function stripVersionedToolModelPrefix(tools: unknown): void { for (const t of tools as Array>) { if (typeof t.model !== "string") continue; const model = t.model; - if (typeof t.type === "string" && /^[a-z][a-z0-9_]*_\d{8}$/.test(t.type) && model.includes("/")) { + if ( + typeof t.type === "string" && + /^[a-z][a-z0-9_]*_\d{8}$/.test(t.type) && + model.includes("/") + ) { t.model = model.split("/").pop(); } else { const prefix = CLAUDE_TOOL_MODEL_PREFIXES.find((candidate) => model.startsWith(candidate)); @@ -1571,7 +1515,8 @@ export class BaseExecutor { if (/content[_-]blocked/i.test(wafErrText)) { retryAttemptsByUrl[urlIndex] = (retryAttemptsByUrl[urlIndex] ?? 0) + 1; const wafAttempt = retryAttemptsByUrl[urlIndex]; - const wafBackoff = BaseExecutor.WAF_RETRY_CONFIG.delayMs * + const wafBackoff = + BaseExecutor.WAF_RETRY_CONFIG.delayMs * Math.pow(BaseExecutor.WAF_RETRY_CONFIG.backoffMultiplier, wafAttempt - 1); log?.debug?.( "WAF_RETRY", diff --git a/open-sse/executors/base/reasoningEffort.ts b/open-sse/executors/base/reasoningEffort.ts index 6c87a25ce7..6e1528caff 100644 --- a/open-sse/executors/base/reasoningEffort.ts +++ b/open-sse/executors/base/reasoningEffort.ts @@ -151,7 +151,8 @@ export function supportsMaxEffortForProvider(provider: string, model: string): b // Ollama Cloud also accepts literal max (for example GLM 5.2 supports // low|medium|high|max|none) and rejects xhigh. const isOpencodeGoDeepSeek = - provider === "opencode-go" && model.toLowerCase().includes("deepseek"); + (provider === "opencode-go" || provider === "opencode-zen") && + model.toLowerCase().includes("deepseek"); const isOllamaCloud = provider === "ollama-cloud"; const isMoonshotK3 = (provider === "moonshot" || provider === "kimi") && /^kimi-k3(?:$|-)/i.test(model); @@ -252,6 +253,16 @@ export function sanitizeReasoningEffortForProvider( const effortStr = typeof c.effort === "string" ? c.effort.toLowerCase() : ""; const modelStr = model || ""; + // Oh My Pi exposes `minimal`, while Codex's Responses API starts at `low`. + // Normalize every carrier before the Codex executor sends the upstream request. + if (provider === "codex" && effortStr === "minimal") { + log?.info?.( + "REASONING_SANITIZE", + `${provider}/${modelStr}: normalized reasoning_effort minimal → low` + ); + return writeEffortValue(b, "low", c); + } + const githubOptIn = provider === "github" && GITHUB_REASONING_EFFORT_OPT_IN_PATTERN.test(modelStr); const rejecting = diff --git a/open-sse/executors/chatgpt-web.ts b/open-sse/executors/chatgpt-web.ts index 15fc3b7355..c96db39586 100644 --- a/open-sse/executors/chatgpt-web.ts +++ b/open-sse/executors/chatgpt-web.ts @@ -2816,11 +2816,14 @@ export class ChatGptWebExecutor extends BaseExecutor { }; } - // Tool-call emulation (#5240): inject a `` contract when `tools` are - // present; parsed back on the response side. Mirrors qwen-web/perplexity-web. + // Tool-call emulation (#5240, #7679): inject a `` contract when tools + // are present; parsed back on the response side. Hardened for thinking models. + const resolvedModel = resolveChatGptModel(model, body, credentials.providerSpecificData); + const modelSlug = resolvedModel.slug; const { hasTools, requestedTools, effectiveMessages } = prepareToolMessages( (body || {}) as Record, - messages as Array<{ role: string; content: unknown }> + messages as Array<{ role: string; content: unknown }>, + { hardened: isThinkingCapableModel(model, modelSlug) } ); if (!credentials.apiKey) { @@ -2918,12 +2921,9 @@ export class ChatGptWebExecutor extends BaseExecutor { log ); - // 2a''. Resolve model + effort and apply thinking-effort preference for - // thinking-capable models. Dedicated thinking models mirror the browser's - // user-config PATCH; GPT-5.5 Pro sends the effort with the conversation - // body because the Pro standard/extended budget is part of that turn. - const resolvedModel = resolveChatGptModel(model, body, credentials.providerSpecificData); - const modelSlug = resolvedModel.slug; + // 2a''. Apply thinking-effort preference for thinking models. + // Dedicated thinking models mirror the browser's user-config PATCH; + // GPT-5.5 Pro effort is sent with the conversation body. const requestedEffort = resolvedModel.effort; if (requestedEffort && isThinkingCapableModel(model, modelSlug)) { await setUserThinkingEffort( diff --git a/open-sse/executors/claudeIdentity.ts b/open-sse/executors/claudeIdentity.ts index 68cc708e4a..78ee1c8b0f 100644 --- a/open-sse/executors/claudeIdentity.ts +++ b/open-sse/executors/claudeIdentity.ts @@ -378,8 +378,7 @@ export function selectBetaFlags( // Code sends effort on every request and never sends ATU, so treating effort as // a proxy for ATU force-injects the heavy-agent pair the client never negotiated — // the same class of mutation #3415 closed. Opaque clients keep the full set. - const allowHeavy = - clientBetaSet === null || clientBetaSet.has("advanced-tool-use-2025-11-20"); + const allowHeavy = clientBetaSet === null || clientBetaSet.has("advanced-tool-use-2025-11-20"); const hasSystem = !!b.system && (typeof b.system === "string" || (Array.isArray(b.system) && b.system.length > 0)); diff --git a/open-sse/executors/commandCode.ts b/open-sse/executors/commandCode.ts index fe056eab8f..cc2642de5c 100644 --- a/open-sse/executors/commandCode.ts +++ b/open-sse/executors/commandCode.ts @@ -461,14 +461,31 @@ function applyEventToAggregateOrThrow(event: JsonRecord, state: AggregateState): function usageFromCommandCode(usage: JsonRecord | null) { if (!usage) return undefined; const details = isRecord(usage.inputTokenDetails) ? usage.inputTokenDetails : {}; - const prompt = - (numberValue(usage.inputTokens) || 0) + (numberValue(details.cacheReadTokens) || 0); + const cacheRead = numberValue(details.cacheReadTokens) || 0; + const noCache = numberValue(details.noCacheTokens) || 0; + // Command Code's totalUsage.inputTokens is the FULL prompt total and already + // includes the cached portion (noCacheTokens + cacheReadTokens = inputTokens), + // so we must NOT add cacheRead back — that would double-count. There is no + // cache-write field in the upstream payload, so cache creation stays unset. + const inputTokens = numberValue(usage.inputTokens) || 0; + const prompt = inputTokens; const completion = numberValue(usage.outputTokens) || 0; - return { + const result: JsonRecord = { prompt_tokens: prompt, completion_tokens: completion, total_tokens: prompt + completion, }; + // Surface the cache breakdown as informational fields so logUsage prints + // `| cache_read=X | no_cache=Y` and appendRequestLog persists them. These are + // NOT added to prompt_tokens (already included) — metering stays accurate. + if (cacheRead > 0) result.cache_read_input_tokens = cacheRead; + if (noCache > 0) result.no_cache_tokens = noCache; + // Keep reasoning_token_details (reasoningTokens) when present so stream.ts's + // extractUsage can surface it as reasoning_tokens. + const reasoningDetails = isRecord(usage.reasoningTokenDetails) ? usage.reasoningTokenDetails : {}; + const reasoning = numberValue(reasoningDetails.reasoningTokens); + if (reasoning !== undefined && reasoning > 0) result.reasoning_tokens = reasoning; + return result; } function createStreamResponse( @@ -549,6 +566,22 @@ function createStreamResponse( state.finishReason = mapFinishReason(event.finishReason); state.usage = isRecord(event.totalUsage) ? event.totalUsage : null; controller.enqueue(sse(chatCompletionChunk(id, model, {}, state.finishReason))); + // Emit a standards-compliant usage-only chunk (choices: []) before + // [DONE] when upstream reported usage. stream.ts's extractUsage + // recognizes this shape (see stream.ts:1661) and logs the ACTUAL + // token counts (in/out/cache_read/no_cache) instead of estimates. + const usagePayload = usageFromCommandCode(state.usage); + if (usagePayload) { + controller.enqueue( + sse({ + id, + object: "chat.completion.chunk", + model, + usage: usagePayload, + choices: [], + }) + ); + } controller.enqueue(encoder.encode("data: [DONE]\n\n")); closed = true; controller.close(); diff --git a/open-sse/executors/cursor.ts b/open-sse/executors/cursor.ts index 3941cdb3e7..61250dfe4c 100644 --- a/open-sse/executors/cursor.ts +++ b/open-sse/executors/cursor.ts @@ -1219,6 +1219,9 @@ export class CursorExecutor extends BaseExecutor { if (isToolFollowUp) { session = cursorSessionManager.acquire(conversationId); + // #9029: content-based session match when client lacks conversation_id. + if (!session && !body.conversation_id) session = cursorSessionManager.findByToolCallIds( + messages.filter(m => m.role === "tool" && m.tool_call_id).map(m => m.tool_call_id!)); } if (session) { diff --git a/open-sse/executors/dario.ts b/open-sse/executors/dario.ts new file mode 100644 index 0000000000..be834102b5 --- /dev/null +++ b/open-sse/executors/dario.ts @@ -0,0 +1,290 @@ +/** + * Dario Executor — routes requests to a local Dario (@askalf/dario) instance. + * + * Dario is a local OpenAI- and Anthropic-compatible proxy that authenticates + * with the operator's own Claude Pro/Max subscription (Claude Code OAuth) and + * rebuilds every request into Claude Code's exact wire shape. It plays the same + * role for the `claude` provider that CLIProxyAPI's "claude-native" deep mode + * does — an alternative/failover backend for Claude-Code-shaped proxying. + * + * Unlike CliproxyapiExecutor this is a deliberately MINIMAL passthrough: + * - shape detection (Anthropic Messages vs OpenAI Chat Completions) + endpoint + * routing only — the same dual-shape convention CLIProxyAPI uses; + * - NO MCP tool-name rewriting, NO Anthropic-extras stripping. + * Dario is a different, actively-maintained project explicitly built to track + * Anthropic's wire-shape drift itself (live capture off an installed `claude` + * binary), so the extras-billing-gate workarounds CliproxyapiExecutor carries + * are Dario's own responsibility, not ours. Add such request-mangling here only + * if live testing proves Dario needs it too — start clean. + * + * Activation (parallel to, and independent of, CLIProxyAPI): + * 1. Per-connection darioMode === "claude-native" in providerSpecificData (UI) + * 2. Per-provider upstream_proxy_config (mode="dario", or mode="fallback" with + * fallbackBackend="dario"). See handlers/chatCore/executorProxy.ts. + */ + +import { + BaseExecutor, + mergeUpstreamExtraHeaders, + mergeAbortSignals, + type ProviderCredentials, + type ExecutorLog, +} from "./base.ts"; +import { HTTP_STATUS, FETCH_TIMEOUT_MS } from "../config/constants.ts"; +import { getProviderPluginManifestHeader } from "../config/providerPluginManifestUrl.ts"; + +const DEFAULT_PORT = 3456; +const DEFAULT_HOST = "127.0.0.1"; +const HEALTH_CHECK_TIMEOUT_MS = 5000; + +// Cached URL from settings (loaded once, invalidated via clearDarioUrlCache). +let _cachedSettingsUrl: { url: string; ts: number } | null = null; +const URL_CACHE_TTL_MS = 60_000; + +export function clearDarioUrlCache() { + _cachedSettingsUrl = null; +} + +// Pre-load settings URL at module init so the sync path has a cache hit. +// Runs once when the executor module is first imported (mirrors cliproxyapi.ts). +(async () => { + try { + const { getSettings } = await import("@/lib/db/settings"); + const settings = await getSettings(); + if (typeof settings.dario_url === "string" && settings.dario_url.trim()) { + _cachedSettingsUrl = { url: settings.dario_url.trim(), ts: Date.now() }; + } + } catch { + /* env vars will be used as fallback */ + } +})(); + +/** + * Resolve Dario base URL. Priority: + * 1. Settings table `dario_url` (set via UI) + * 2. Environment variables DARIO_HOST / DARIO_PORT + * 3. Defaults (127.0.0.1:3456) + */ +async function resolveDarioBaseUrl(): Promise { + if (_cachedSettingsUrl && Date.now() - _cachedSettingsUrl.ts < URL_CACHE_TTL_MS) { + return _cachedSettingsUrl.url; + } + + try { + const { getSettings } = await import("@/lib/db/settings"); + const settings = await getSettings(); + if (typeof settings.dario_url === "string" && settings.dario_url.trim()) { + const url = settings.dario_url.trim(); + _cachedSettingsUrl = { url, ts: Date.now() }; + return url; + } + } catch { + /* fall through to env vars */ + } + + const host = process.env.DARIO_HOST || DEFAULT_HOST; + const port = parseInt(process.env.DARIO_PORT || String(DEFAULT_PORT), 10); + const url = `http://${host}:${port}`; + _cachedSettingsUrl = { url, ts: Date.now() }; + return url; +} + +// Sync wrapper for backward compatibility (constructor default, health checks, tests). +function resolveDarioBaseUrlSync(): string { + if (_cachedSettingsUrl && Date.now() - _cachedSettingsUrl.ts < URL_CACHE_TTL_MS) { + return _cachedSettingsUrl.url; + } + const host = process.env.DARIO_HOST || DEFAULT_HOST; + const port = parseInt(process.env.DARIO_PORT || String(DEFAULT_PORT), 10); + return `http://${host}:${port}`; +} + +export { resolveDarioBaseUrl }; + +/** + * Check if a connection has Dario deep mode enabled via UI toggle. + * Mirrors isCliproxyapiDeepModeEnabled but keys off a SEPARATE field + * (`darioMode`) so a connection can opt into Dario or CLIProxyAPI independently. + * Used by chatCore's resolveExecutorWithProxy to decide routing. + */ +export function isDarioDeepModeEnabled( + providerSpecificData?: Record | null +): boolean { + return providerSpecificData?.darioMode === "claude-native"; +} + +export class DarioExecutor extends BaseExecutor { + private readonly upstreamBaseUrl: string; + + constructor(baseUrl?: string) { + const effectiveBase = baseUrl ?? resolveDarioBaseUrlSync(); + super("dario", { + id: "dario", + baseUrl: effectiveBase + "/v1/chat/completions", + headers: { "Content-Type": "application/json" }, + }); + this.upstreamBaseUrl = effectiveBase; + } + + buildUrl( + _model: string, + _stream: boolean, + _urlIndex = 0, + _credentials: ProviderCredentials | null = null + ): string { + // Default endpoint when called without body context (kept for back-compat). + // execute() picks the right endpoint from the body shape; see selectEndpoint(). + return `${this.upstreamBaseUrl}/v1/chat/completions`; + } + + /** + * Returns true when the body matches the Anthropic Messages wire shape. + * Same detection heuristics as CliproxyapiExecutor.isAnthropicShape: an + * Anthropic-source client (`/v1/messages`, anthropic-version header, claude/* + * model) is not openai-translated by chatCore, so the executor sees the + * original Anthropic body. Dario exposes both `/v1/messages` (Anthropic SSE) + * and `/v1/chat/completions` (OpenAI SSE) on the same port with the shape + * auto-detected — route to the matching one so Anthropic-SDK clients get + * proper `event: message_start` / `content_block_delta` frames. + */ + private isAnthropicShape(body: unknown): boolean { + if (!body || typeof body !== "object") return false; + const b = body as Record; + // Top-level `system` is unique to the Anthropic Messages API. + if (b.system !== undefined) return true; + // Top-level `thinking` is Anthropic-only (OpenAI uses reasoning*). + if (b.thinking !== undefined) return true; + // metadata.user_id is the CC wire-image identifier; OpenAI bodies lack it. + if ( + b.metadata && + typeof b.metadata === "object" && + (b.metadata as Record).user_id !== undefined + ) + return true; + // messages[0].content as an array of Anthropic content blocks. + const msgs = b.messages; + if (Array.isArray(msgs) && msgs.length > 0) { + const first = msgs[0] as Record; + if (Array.isArray(first?.content)) return true; + } + return false; + } + + private selectEndpoint(body: unknown): string { + return this.isAnthropicShape(body) ? "/v1/messages" : "/v1/chat/completions"; + } + + buildHeaders(credentials: ProviderCredentials | null, stream = true): Record { + // On loopback-only LLM routes Dario does not require a real bearer token + // (its proxy-key auth is mandatory only when binding non-loopback). We still + // forward whatever key is on the credentials if present — harmless — and + // default to the documented "dario" placeholder so an Authorization header + // is always present. + const key = credentials?.apiKey || credentials?.accessToken || "dario"; + + const headers: Record = { + "Content-Type": "application/json", + ...getProviderPluginManifestHeader(), + }; + + headers["Authorization"] = `Bearer ${key}`; + if (stream) { + headers["Accept"] = "text/event-stream"; + } + + return headers; + } + + transformRequest( + model: string, + body: unknown, + _stream: boolean, + _credentials: ProviderCredentials | null + ): unknown { + // Minimal passthrough: only ensure the model field matches the routed model. + // Dario handles Claude-Code wire-shape reconstruction itself. + if (!body || typeof body !== "object") return body; + const transformed = { ...(body as Record) }; + if (transformed.model !== model) { + transformed.model = model; + } + return transformed; + } + + async execute(input: { + model: string; + body: unknown; + stream: boolean; + credentials: ProviderCredentials; + signal?: AbortSignal | null; + log?: ExecutorLog | null; + upstreamExtraHeaders?: Record | null; + }) { + // Resolve URL dynamically so settings table dario_url is respected. + // Uses 60s cache to avoid DB reads on every request. + const baseUrl = await resolveDarioBaseUrl(); + const endpoint = this.selectEndpoint(input.body); + const url = `${baseUrl}${endpoint}`; + const shape = endpoint === "/v1/messages" ? "anthropic" : "openai"; + const headers = this.buildHeaders(input.credentials, input.stream); + const transformedBody = this.transformRequest( + input.model, + input.body, + input.stream, + input.credentials + ); + mergeUpstreamExtraHeaders(headers, input.upstreamExtraHeaders); + + const timeoutSignal = AbortSignal.timeout(FETCH_TIMEOUT_MS); + const combinedSignal = input.signal + ? mergeAbortSignals(input.signal, timeoutSignal) + : timeoutSignal; + + input.log?.info?.("DARIO", `Dario → ${url} (model: ${input.model}, shape: ${shape})`); + + const response = await fetch(url, { + method: "POST", + headers, + body: JSON.stringify(transformedBody), + signal: combinedSignal, + }); + + if (response.status === HTTP_STATUS.RATE_LIMITED) { + input.log?.warn?.("DARIO", `Dario rate limited: ${response.status}`); + } + + return { response, url, headers, transformedBody }; + } + + /** + * Health check — verifies Dario is reachable. + * + * Dario's `/health` returns 200 {status:"ok"} once ≥1 healthy account exists + * and 503 {status:"degraded"} while zero accounts are configured (or all are + * in auth-cooldown). We treat this as a plain `res.ok` check: 503-while-empty + * is semantically correct ("reachable but not yet useful"), so the dashboard + * shows running+degraded until the operator completes the Claude OAuth login. + */ + async healthCheck(): Promise<{ ok: boolean; latencyMs: number; error?: string }> { + const start = Date.now(); + try { + const baseUrl = await resolveDarioBaseUrl(); + const res = await fetch(`${baseUrl}/health`, { + signal: AbortSignal.timeout(HEALTH_CHECK_TIMEOUT_MS), + }); + return { + ok: res.ok, + latencyMs: Date.now() - start, + ...(!res.ok ? { error: `HTTP ${res.status}` } : {}), + }; + } catch (err) { + return { + ok: false, + latencyMs: Date.now() - start, + error: err instanceof Error ? err.message : String(err), + }; + } + } +} + +export default DarioExecutor; diff --git a/open-sse/executors/default.ts b/open-sse/executors/default.ts index 4b44537ce4..8836b79dfb 100644 --- a/open-sse/executors/default.ts +++ b/open-sse/executors/default.ts @@ -31,6 +31,7 @@ import { getTargetFormat, isClaudeCodeCompatible, } from "../services/provider.ts"; +import { ensureToolMessageNames } from "./kimiToolNames.ts"; import { getSapResourceGroup } from "../config/sap.ts"; import { normalizeBailianMessagesUrl, @@ -670,6 +671,20 @@ export class DefaultExecutor extends BaseExecutor { transformRequest(model, body, stream, credentials) { const cleanedBody = super.transformRequest(model, body, stream, credentials); let withDefaults = applyProviderRequestDefaults(cleanedBody, this.config.requestDefaults); + + // ponytail: backfill missing tool message names for strict OpenAI-compatible providers. + // Kimi K3 and some BYOK endpoints reject tool messages whose `name` field was stripped + // during combo routing or format translation. Build a tool_call_id → function.name + // lookup from assistant messages and restore missing names before forwarding. + if ( + withDefaults && + typeof withDefaults === "object" && + !Array.isArray(withDefaults) && + Array.isArray((withDefaults as Record).messages) + ) { + withDefaults = ensureToolMessageNames(withDefaults as Record); + } + withDefaults = this.applyJsonSchemaFallback(withDefaults); withDefaults = this.defaultResponsesTextFormat(withDefaults); diff --git a/open-sse/executors/devin-agentic/anthropicResponse.ts b/open-sse/executors/devin-agentic/anthropicResponse.ts new file mode 100644 index 0000000000..d637ab1612 --- /dev/null +++ b/open-sse/executors/devin-agentic/anthropicResponse.ts @@ -0,0 +1,104 @@ +import { + estimateTokens, + type ClaudeResponseArgs, + type ClaudeToolUseArgs, + type JsonRecord, +} from "./types.ts"; + +function usage(inputTokens: number, outputTokens: number) { + return { + input_tokens: inputTokens, + output_tokens: outputTokens, + }; +} + +export function buildClaudeTextResponse(args: ClaudeResponseArgs): JsonRecord { + return { + id: args.id, + type: "message", + role: "assistant", + model: args.model, + content: [{ type: "text", text: args.text }], + stop_reason: "end_turn", + stop_sequence: null, + usage: usage(args.inputTokens, args.outputTokens || estimateTokens(args.text)), + }; +} + +export function buildClaudeToolUseResponse(args: ClaudeToolUseArgs): JsonRecord { + return { + id: args.id, + type: "message", + role: "assistant", + model: args.model, + content: [ + { + type: "tool_use", + id: args.tool.id, + name: args.tool.name, + input: args.tool.input, + }, + ], + stop_reason: "tool_use", + stop_sequence: null, + usage: usage(args.inputTokens, args.outputTokens), + }; +} + +function frame(event: string, data: JsonRecord): string { + return `event: ${event}\ndata: ${JSON.stringify(data)}\n\n`; +} + +export function buildClaudeSseFrames(message: JsonRecord): string { + const content = Array.isArray(message.content) ? message.content : []; + const startMessage = { ...message, content: [], stop_reason: null, stop_sequence: null }; + let out = frame("message_start", { type: "message_start", message: startMessage }); + + content.forEach((block, index) => { + const blockRecord = block as JsonRecord; + if (blockRecord.type === "text") { + out += frame("content_block_start", { + type: "content_block_start", + index, + content_block: { type: "text", text: "" }, + }); + out += frame("content_block_delta", { + type: "content_block_delta", + index, + delta: { type: "text_delta", text: String(blockRecord.text || "") }, + }); + out += frame("content_block_stop", { type: "content_block_stop", index }); + return; + } + + if (blockRecord.type === "tool_use") { + out += frame("content_block_start", { + type: "content_block_start", + index, + content_block: { + type: "tool_use", + id: blockRecord.id, + name: blockRecord.name, + input: {}, + }, + }); + out += frame("content_block_delta", { + type: "content_block_delta", + index, + delta: { + type: "input_json_delta", + partial_json: JSON.stringify(blockRecord.input || {}), + }, + }); + out += frame("content_block_stop", { type: "content_block_stop", index }); + } + }); + + out += frame("message_delta", { + type: "message_delta", + delta: { stop_reason: message.stop_reason, stop_sequence: null }, + usage: { output_tokens: (message.usage as JsonRecord | undefined)?.output_tokens || 0 }, + }); + out += frame("message_stop", { type: "message_stop" }); + return out; +} diff --git a/open-sse/executors/devin-agentic/serializer.ts b/open-sse/executors/devin-agentic/serializer.ts new file mode 100644 index 0000000000..0f37bd1d1b --- /dev/null +++ b/open-sse/executors/devin-agentic/serializer.ts @@ -0,0 +1,217 @@ +import { + asRecord, + DevinAgenticBridgeError, + estimateTokens, + type AnthropicTool, + type DevinPrompt, +} from "./types.ts"; +import { createHash } from "node:crypto"; + +export const MAX_TOOL_RESULT_CHARS = 65536; + +function stringifyContentValue(value: unknown): string { + if (typeof value === "string") return value; + if (value == null) return ""; + return JSON.stringify(value); +} + +function boundedToolResult(value: unknown): string { + const text = stringifyContentValue(value); + if (text.length <= MAX_TOOL_RESULT_CHARS) return text; + const removed = text.length - MAX_TOOL_RESULT_CHARS; + return `${text.slice(0, MAX_TOOL_RESULT_CHARS)}\n[TRUNCATED ${removed} CHARACTERS BY OMNIROUTE]`; +} + +function serializeSystem(system: unknown): string[] { + if (typeof system === "string" && system.trim()) return [`[System]\n${system}`]; + if (!Array.isArray(system)) return []; + + const parts: string[] = []; + for (const block of system) { + const record = asRecord(block); + if (record.type === "text") { + parts.push(String(record.text || "")); + } else if (Object.keys(record).length > 0) { + throw new DevinAgenticBridgeError( + `Unsupported Anthropic system block type: ${String(record.type || "unknown")}`, + "unsupported_system_block" + ); + } + } + return parts.length > 0 ? [`[System]\n${parts.join("\n")}`] : []; +} + +function serializeBlock( + block: unknown, + knownToolUses: Set, + tools: AnthropicTool[] +): string { + const record = asRecord(block); + const type = String(record.type || ""); + + if (type === "text") return String(record.text || ""); + if (type === "thinking") return `[Thinking]\n${String(record.thinking || "")}`; + if (type === "redacted_thinking") return "[Redacted Thinking]"; + if (type === "tool_use") { + const id = String(record.id || "").trim(); + const name = String(record.name || "").trim(); + if (!id || knownToolUses.has(id)) { + throw new DevinAgenticBridgeError( + id ? `Duplicate Anthropic tool_use id: ${id}` : "Anthropic tool_use is missing id", + id ? "duplicate_tool_use_id" : "missing_tool_use_id" + ); + } + const declared = tools.find((tool) => tool.name === name); + if (!declared) { + throw new DevinAgenticBridgeError( + `Historical tool_use references undeclared tool: ${name || "unknown"}`, + "undeclared_historical_tool" + ); + } + knownToolUses.add(id); + return [ + "[Assistant Tool Use]", + `id: ${id}`, + `name: ${name}`, + "arguments:", + JSON.stringify(record.input || {}, null, 2), + ].join("\n"); + } + if (type === "tool_result") { + const toolUseId = String(record.tool_use_id || "").trim(); + if (!toolUseId || !knownToolUses.has(toolUseId)) { + throw new DevinAgenticBridgeError( + `Anthropic tool_result references unknown tool_use id: ${toolUseId || "missing"}`, + "orphan_tool_result" + ); + } + return [ + "[Tool Result]", + `tool_use_id: ${toolUseId}`, + `is_error: ${record.is_error === true ? "true" : "false"}`, + "content:", + boundedToolResult(record.content), + ].join("\n"); + } + if (type === "image") { + throw new DevinAgenticBridgeError( + "Anthropic image blocks are not supported by devin-cli-agentic", + "unsupported_image_block" + ); + } + + throw new DevinAgenticBridgeError( + `Unsupported Anthropic content block type: ${type || "unknown"}`, + "unsupported_content_block" + ); +} + +function serializeMessage( + message: unknown, + knownToolUses: Set, + tools: AnthropicTool[] +): string { + const record = asRecord(message); + const role = String(record.role || "user"); + if (role !== "user" && role !== "assistant") { + throw new DevinAgenticBridgeError( + `Unsupported Anthropic message role: ${role}`, + "unsupported_role" + ); + } + const label = role === "assistant" ? "Assistant" : role === "system" ? "System" : "User"; + const content = record.content; + + if (typeof content === "string") return `[${label}]\n${content}`; + if (!Array.isArray(content)) return `[${label}]\n${stringifyContentValue(content)}`; + + return `[${label}]\n${content + .map((block) => serializeBlock(block, knownToolUses, tools)) + .join("\n\n")}`; +} + +function normalizeTools(tools: unknown): AnthropicTool[] { + if (tools == null) return []; + if (!Array.isArray(tools)) { + throw new DevinAgenticBridgeError("Anthropic tools must be an array", "invalid_tools"); + } + + return tools.map((tool) => { + const record = asRecord(tool); + const name = typeof record.name === "string" ? record.name.trim() : ""; + if (!name) { + throw new DevinAgenticBridgeError("Anthropic tool is missing name", "invalid_tool_name"); + } + return { + name, + description: typeof record.description === "string" ? record.description : undefined, + input_schema: asRecord(record.input_schema), + }; + }); +} + +function serializeToolCatalog(tools: AnthropicTool[]): string[] { + if (tools.length === 0) return []; + return [ + [ + "[Available Tools]", + "When a tool is required, respond with exactly one XML-wrapped JSON object:", + '{"name":"ToolName","arguments":{}}', + "Use only the tools listed below. Do not claim that a tool was executed.", + "Do not execute tools inside Devin or emit ACP tool-call events; request them only with the XML envelope.", + "Never describe a future tool action in plain text; emit the tool envelope instead.", + ].join("\n"), + ...tools.map((tool) => + [ + `[Tool] ${tool.name}`, + tool.description ? `description: ${tool.description}` : "description:", + "input_schema:", + JSON.stringify(tool.input_schema || { type: "object", properties: {} }, null, 2), + ].join("\n") + ), + ]; +} + +function serializeToolChoice(value: unknown, tools: AnthropicTool[]): string[] { + if (value == null) return []; + const choice = asRecord(value); + const type = String(choice.type || ""); + if (type === "auto") return ["[Tool Choice]\nauto"]; + if (type === "any") return ["[Tool Choice]\nA tool call is required."]; + if (type === "none") return ["[Tool Choice]\nDo not call a tool."]; + if (type === "tool") { + const name = String(choice.name || "").trim(); + if (!tools.some((tool) => tool.name === name)) { + throw new DevinAgenticBridgeError( + `tool_choice references unknown tool: ${name}`, + "invalid_tool_choice" + ); + } + return [`[Tool Choice]\nCall exactly this tool: ${name}`]; + } + throw new DevinAgenticBridgeError( + `Unsupported Anthropic tool_choice type: ${type || "missing"}`, + "invalid_tool_choice" + ); +} + +export function serializeAnthropicForDevin(body: unknown): DevinPrompt { + const record = asRecord(body); + const messages = Array.isArray(record.messages) ? record.messages : []; + const tools = normalizeTools(record.tools); + const knownToolUses = new Set(); + const sections: string[] = [ + ...serializeSystem(record.system), + ...serializeToolCatalog(tools), + ...serializeToolChoice(record.tool_choice, tools), + ...messages.map((message) => serializeMessage(message, knownToolUses, tools)), + ].filter((section) => section.trim().length > 0); + + if (sections.length === 0) { + throw new DevinAgenticBridgeError("Anthropic request contains no messages", "empty_messages"); + } + + const text = sections.join("\n\n---\n\n"); + const idSeed = createHash("sha256").update(text).digest("hex").slice(0, 24); + return { text, tools, inputTokensEstimate: estimateTokens(text), idSeed }; +} diff --git a/open-sse/executors/devin-agentic/toolParser.ts b/open-sse/executors/devin-agentic/toolParser.ts new file mode 100644 index 0000000000..fcebe8a1a8 --- /dev/null +++ b/open-sse/executors/devin-agentic/toolParser.ts @@ -0,0 +1,117 @@ +import { createHash } from "node:crypto"; +import { asRecord, DevinAgenticBridgeError, type AnthropicTool, type JsonRecord } from "./types.ts"; + +function stableJson(value: unknown): string { + if (Array.isArray(value)) return `[${value.map((item) => stableJson(item)).join(",")}]`; + if (value && typeof value === "object") { + return `{${Object.entries(value as JsonRecord) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([key, val]) => `${JSON.stringify(key)}:${stableJson(val)}`) + .join(",")}}`; + } + return JSON.stringify(value); +} + +function typeOf(value: unknown): string { + if (Array.isArray(value)) return "array"; + if (value === null) return "null"; + return typeof value; +} + +function validateSchema(value: unknown, schema: JsonRecord, path: string): string[] { + const errors: string[] = []; + const expectedType = schema.type; + if (typeof expectedType === "string") { + const actual = typeOf(value); + if (expectedType === "integer") { + if (!Number.isInteger(value)) errors.push(`${path} must be integer`); + } else if (actual !== expectedType) { + errors.push(`${path} must be ${expectedType}, got ${actual}`); + } + } + + if (Array.isArray(schema.enum) && !schema.enum.some((item) => item === value)) { + errors.push( + `${path} must be one of ${schema.enum.map((item) => JSON.stringify(item)).join(", ")}` + ); + } + + if (schema.type === "object" || (value && typeof value === "object" && !Array.isArray(value))) { + const record = asRecord(value); + const required = Array.isArray(schema.required) ? schema.required.map(String) : []; + for (const key of required) { + if (!(key in record)) errors.push(`${path}.${key} is required`); + } + + const properties = asRecord(schema.properties); + for (const [key, propSchema] of Object.entries(properties)) { + if (key in record) + errors.push(...validateSchema(record[key], asRecord(propSchema), `${path}.${key}`)); + } + + if (schema.additionalProperties === false) { + for (const key of Object.keys(record)) { + if (!(key in properties)) errors.push(`${path}.${key} is not allowed`); + } + } + } + + if (Array.isArray(value) && schema.items) { + const itemSchema = asRecord(schema.items); + value.forEach((item, index) => + errors.push(...validateSchema(item, itemSchema, `${path}[${index}]`)) + ); + } + + return errors; +} + +export function parseDevinToolRequest(text: string, tools: AnthropicTool[], idSeed = "") { + const matches = [...text.matchAll(/\s*([\s\S]*?)\s*<\/tool>/g)]; + if (matches.length === 0) return null; + if (matches.length > 1) { + throw new DevinAgenticBridgeError( + "Devin response contained more than one tool request; parallel tool use is not supported", + "multiple_tool_requests" + ); + } + + if (text.trim() !== matches[0][0].trim()) { + throw new DevinAgenticBridgeError( + "Devin tool request must be a standalone tool envelope without narrative text", + "mixed_tool_narrative" + ); + } + + let payload: JsonRecord; + try { + payload = asRecord(JSON.parse(matches[0][1] || "{}")); + } catch { + throw new DevinAgenticBridgeError("Devin tool request was not valid JSON", "invalid_tool_json"); + } + + const name = typeof payload.name === "string" ? payload.name.trim() : ""; + if (!name) + throw new DevinAgenticBridgeError("Devin tool request is missing name", "missing_tool_name"); + + const tool = tools.find((candidate) => candidate.name === name); + if (!tool) { + throw new DevinAgenticBridgeError(`Devin requested unknown tool: ${name}`, "unknown_tool"); + } + + const input = asRecord(payload.arguments); + const schema = tool.input_schema || { type: "object", properties: {} }; + const errors = validateSchema(input, schema, "arguments"); + if (errors.length > 0) { + throw new DevinAgenticBridgeError( + `Devin tool arguments failed schema validation: ${errors.join("; ")}`, + "invalid_tool_arguments" + ); + } + + const digest = createHash("sha256") + .update(`${idSeed}:${name}:${stableJson(input)}`) + .digest("hex") + .slice(0, 16); + return { id: `tool_devin_${digest}`, name, input }; +} diff --git a/open-sse/executors/devin-agentic/types.ts b/open-sse/executors/devin-agentic/types.ts new file mode 100644 index 0000000000..8cde997407 --- /dev/null +++ b/open-sse/executors/devin-agentic/types.ts @@ -0,0 +1,56 @@ +export type JsonRecord = Record; + +export type AnthropicTool = { + name: string; + description?: string; + input_schema?: JsonRecord; +}; + +export type DevinPrompt = { + text: string; + tools: AnthropicTool[]; + inputTokensEstimate: number; + idSeed: string; +}; + +export type ParsedToolRequest = { + id: string; + name: string; + input: JsonRecord; +}; + +export type ClaudeResponseArgs = { + id: string; + model: string; + text: string; + inputTokens: number; + outputTokens: number; +}; + +export type ClaudeToolUseArgs = { + id: string; + model: string; + tool: ParsedToolRequest; + inputTokens: number; + outputTokens: number; +}; + +export class DevinAgenticBridgeError extends Error { + status: number; + code: string; + + constructor(message: string, code = "devin_agentic_error", status = 400) { + super(message); + this.name = "DevinAgenticBridgeError"; + this.code = code; + this.status = status; + } +} + +export function asRecord(value: unknown): JsonRecord { + return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {}; +} + +export function estimateTokens(text: string): number { + return Math.max(1, Math.ceil(text.length / 4)); +} diff --git a/open-sse/executors/devin-cli-agentic.ts b/open-sse/executors/devin-cli-agentic.ts new file mode 100644 index 0000000000..9180a02c61 --- /dev/null +++ b/open-sse/executors/devin-cli-agentic.ts @@ -0,0 +1,571 @@ +import { spawn } from "node:child_process"; +import path from "node:path"; +import os from "node:os"; +import fs from "node:fs"; +import { randomUUID } from "node:crypto"; +import { BaseExecutor, type ExecuteInput } from "./base.ts"; +import { DEVIN_MODEL_CATALOG } from "../config/providers/registry/devin/catalog.ts"; +import { buildErrorBody, sanitizeErrorMessage } from "../utils/error.ts"; +import { + buildClaudeSseFrames, + buildClaudeTextResponse, + buildClaudeToolUseResponse, +} from "./devin-agentic/anthropicResponse.ts"; +import { serializeAnthropicForDevin } from "./devin-agentic/serializer.ts"; +import { parseDevinToolRequest } from "./devin-agentic/toolParser.ts"; +import { asRecord, DevinAgenticBridgeError, estimateTokens } from "./devin-agentic/types.ts"; + +type AcpMessage = { + jsonrpc: "2.0"; + id?: number | null; + method?: string; + params?: unknown; + result?: unknown; + error?: { code: number; message: string }; +}; + +const ACP_PROTOCOL_VERSION = 1; +const MAX_ACP_OUTPUT_CHARS = 1024 * 1024; +const TRUSTED_DEVIN_BRIDGE_PROXY_URL = "http://network-guard:8080"; +const REPAIRABLE_TOOL_ERRORS = new Set([ + "invalid_tool_json", + "missing_tool_name", + "unknown_tool", + "invalid_tool_arguments", + "multiple_tool_requests", + "mixed_tool_narrative", + "unexecuted_tool_intent", +]); + +function describesUnexecutedToolIntent(text: string): boolean { + const action = "(?:read|inspect|examine|edit|fix|run|check|test|start)"; + const futureAction = new RegExp( + `\\b(?:(?:next(?: immediate)?|immediate next)\\s+(?:task|step)|planned actions?)\\b[\\s\\S]{0,320}\\b${action}\\b`, + "i" + ); + return ( + futureAction.test(text) || + new RegExp(`\\b(?:i(?:'ll| will)|let me)\\b[^\\n.!?]{0,160}\\b${action}\\b`, "i").test(text) || + new RegExp(`\\bnext steps?\\s*:\\s*${action}\\b`, "i").test(text) || + new RegExp(`\\bnext immediate (?:task|step)\\s*:\\s*${action}\\b`, "i").test(text) || + new RegExp(`\\bplanned actions?\\s*:\\s*${action}\\b`, "i").test(text) || + new RegExp(`\\b(?:still|now)\\s+(?:need|needs|required)\\s+to\\s+${action}\\b`, "i").test( + text + ) || + /\btests?\s+(?:have|has|were|was)?\s*not\s+(?:yet\s+)?(?:been\s+)?run\b/i.test(text) + ); +} + +function framePromptForNoToolsSummarizer(promptText: string): string { + return [ + "[Devin Summarizer Bridge]", + "Treat the content below as an execution trace whose next assistant output must be determined.", + "If another client-owned action is required, return exactly one JSON envelope using the catalog in the trace and no prose.", + "The client will execute that tool; never execute or claim to execute a tool inside Devin.", + "The client workspace is /workspace; /home/bridge is only the isolated Devin process home.", + "If the task is complete, return only a concise final answer.", + "Do not wrap the response in Markdown fences or a element.", + "", + "[Execution Trace]", + promptText, + ].join("\n"); +} + +const CLAUDE_ENV_BLOCKLIST = [ + "ANTHROPIC_API_KEY", + "CLAUDE_CODE_OAUTH_TOKEN", + "ANTHROPIC_BEDROCK_BASE_URL", + "ANTHROPIC_VERTEX_BASE_URL", + "CLAUDE_CODE_USE_BEDROCK", + "CLAUDE_CODE_USE_VERTEX", + "CLAUDE_CODE_USE_FOUNDRY", +]; + +function resolveDevinBin(): string { + const envBin = process.env.CLI_DEVIN_AGENTIC_BIN?.trim() || process.env.CLI_DEVIN_BIN?.trim(); + if (envBin) return envBin; + + if (process.platform === "win32") { + const localAppData = process.env.LOCALAPPDATA || path.join(os.homedir(), "AppData", "Local"); + const winPath = path.join(localAppData, "devin", "cli", "bin", "devin.exe"); + if (fs.existsSync(winPath)) return winPath; + return "devin.exe"; + } + + for (const candidate of [ + path.join(os.homedir(), ".local", "share", "devin", "bin", "devin"), + path.join(os.homedir(), ".devin", "bin", "devin"), + ]) { + if (fs.existsSync(candidate)) return candidate; + } + return "devin"; +} + +function rpc(method: string, params: unknown, id: number): string { + return JSON.stringify({ jsonrpc: "2.0", id, method, params }) + "\n"; +} + +export function assertLocalAcpUrl(url: string): void { + if (url !== "devin://acp/stdio") { + throw new DevinAgenticBridgeError( + "devin-cli-agentic accepts only the local Devin ACP stdio upstream", + "invalid_acp_upstream", + 500 + ); + } +} + +function isIsolatedHome(value: string): boolean { + return value === "/home/bridge" || value.includes("/.sandbox/"); +} + +export function buildDevinChildEnv( + _credentials: ExecuteInput["credentials"], + source: NodeJS.ProcessEnv = process.env +): NodeJS.ProcessEnv { + const home = source.DEVIN_AGENTIC_HOME?.trim() || ""; + if (!home || !path.isAbsolute(home) || !isIsolatedHome(home)) { + throw new DevinAgenticBridgeError( + "DEVIN_AGENTIC_HOME must be an absolute path inside the bridge sandbox", + "unsafe_devin_home", + 500 + ); + } + + const env: NodeJS.ProcessEnv = { + HOME: home, + XDG_CONFIG_HOME: path.join(home, ".config"), + XDG_DATA_HOME: path.join(home, ".local", "share"), + XDG_CACHE_HOME: path.join(home, ".cache"), + PATH: source.PATH || "/usr/local/bin:/usr/bin:/bin", + LANG: source.LANG || "C.UTF-8", + CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: "1", + DISABLE_TELEMETRY: "1", + DISABLE_ERROR_REPORTING: "1", + DISABLE_AUTOUPDATER: "1", + }; + if (source.LC_ALL) env.LC_ALL = source.LC_ALL; + if (source.TERM) env.TERM = source.TERM; + if (source.DEVIN_BRIDGE_MOCK_LOG === "/evidence/mock-acp.jsonl") { + env.DEVIN_BRIDGE_MOCK_LOG = source.DEVIN_BRIDGE_MOCK_LOG; + } + if (source.DEVIN_BRIDGE_PROXY_URL === TRUSTED_DEVIN_BRIDGE_PROXY_URL) { + env.HTTP_PROXY = TRUSTED_DEVIN_BRIDGE_PROXY_URL; + env.HTTPS_PROXY = TRUSTED_DEVIN_BRIDGE_PROXY_URL; + } + + for (const key of CLAUDE_ENV_BLOCKLIST) delete env[key]; + return env; +} + +function errorBody(error: unknown) { + const bridge = error instanceof DevinAgenticBridgeError ? error : null; + const status = bridge?.status || 500; + const message = bridge?.message || (error instanceof Error ? error.message : String(error)); + return buildErrorBody(status, sanitizeErrorMessage(message), undefined, { + type: "devin_agentic_error", + code: bridge?.code || "devin_agentic_error", + }); +} + +export async function runAcpTurn(args: { + devinBin: string; + env: NodeJS.ProcessEnv; + model: string; + promptText: string; + signal?: AbortSignal | null; + log?: ExecuteInput["log"]; +}) { + const timeoutMs = Number(process.env.DEVIN_AGENTIC_ACP_TIMEOUT_MS || 120000); + const child = spawn(args.devinBin, ["acp", "--agent-type", "summarizer"], { + env: args.env, + cwd: args.env.HOME, + stdio: ["pipe", "pipe", "pipe"], + shell: false, + }); + + let nextId = 1; + let buffer = ""; + let text = ""; + let phase: "initialize" | "session" | "prompt" = "initialize"; + let sessionId = ""; + let initializeRequestId = 0; + let sessionRequestId = 0; + let promptRequestId = 0; + let settled = false; + + return await new Promise((resolve, reject) => { + const abortHandler = () => { + finish(new DevinAgenticBridgeError("Devin ACP request was cancelled", "acp_cancelled", 499)); + }; + + const finish = (err: Error | null, value = "") => { + if (settled) return; + settled = true; + clearTimeout(timer); + args.signal?.removeEventListener("abort", abortHandler); + try { + child.stdin.end(); + } catch {} + if (!child.killed) child.kill("SIGTERM"); + if (err) reject(err); + else resolve(value); + }; + + const timer = setTimeout(() => { + finish( + new DevinAgenticBridgeError(`Devin ACP timed out after ${timeoutMs}ms`, "acp_timeout", 504) + ); + }, timeoutMs); + timer.unref?.(); + + const send = (method: string, params: unknown) => { + const id = nextId++; + child.stdin.write(rpc(method, params, id)); + return id; + }; + + if (args.signal?.aborted) return abortHandler(); + args.signal?.addEventListener("abort", abortHandler, { once: true }); + + child.on("error", (err) => { + const message = + err.message.includes("ENOENT") || err.message.includes("not found") + ? `Devin CLI not found: ${args.devinBin}. Install the official Devin CLI or set CLI_DEVIN_AGENTIC_BIN.` + : `Devin CLI spawn error: ${err.message}`; + finish(new DevinAgenticBridgeError(message, "spawn_failed", 502)); + }); + + child.stderr.on("data", (chunk: Buffer) => { + args.log?.debug?.("DEVIN_AGENTIC", `stderr: ${chunk.toString("utf8").slice(0, 200)}`); + }); + + child.stdout.on("data", (chunk: Buffer) => { + buffer += chunk.toString("utf8"); + if (buffer.length + text.length > MAX_ACP_OUTPUT_CHARS) { + finish( + new DevinAgenticBridgeError( + "Devin ACP output exceeded the bridge limit", + "acp_output_too_large", + 502 + ) + ); + return; + } + let nl: number; + while ((nl = buffer.indexOf("\n")) !== -1) { + const line = buffer.slice(0, nl).trim(); + buffer = buffer.slice(nl + 1); + if (!line) continue; + + let msg: AcpMessage; + try { + msg = JSON.parse(line); + } catch { + finish( + new DevinAgenticBridgeError( + "Devin ACP emitted invalid JSON on stdout", + "invalid_acp_frame", + 502 + ) + ); + return; + } + + if (msg.error) { + finish( + new DevinAgenticBridgeError( + `Devin ACP error ${msg.error.code}: ${msg.error.message}`, + "acp_error", + 502 + ) + ); + return; + } + + if (phase === "initialize" && msg.id === initializeRequestId && msg.result !== undefined) { + const protocolVersion = Number(asRecord(msg.result).protocolVersion); + if (protocolVersion !== ACP_PROTOCOL_VERSION) { + finish( + new DevinAgenticBridgeError( + `Devin ACP negotiated unsupported protocol version: ${String(protocolVersion)}`, + "unsupported_acp_version", + 502 + ) + ); + return; + } + phase = "session"; + sessionRequestId = send("session/new", { + cwd: args.env.HOME, + mcpServers: [], + model: args.model || undefined, + }); + continue; + } + + if (phase === "session" && msg.id === sessionRequestId && msg.result !== undefined) { + const sessionResult = asRecord(msg.result); + sessionId = String(sessionResult.sessionId || ""); + if (!sessionId) { + finish( + new DevinAgenticBridgeError( + "Devin ACP session/new returned no sessionId", + "missing_session_id", + 502 + ) + ); + return; + } + + phase = "prompt"; + promptRequestId = send("session/prompt", { + sessionId, + prompt: [{ type: "text", text: framePromptForNoToolsSummarizer(args.promptText) }], + }); + continue; + } + + if (msg.method === "session/update" || msg.method === "$/update") { + const params = asRecord(msg.params); + const updateSessionId = String(params.sessionId || ""); + if (updateSessionId && sessionId && updateSessionId !== sessionId) { + finish( + new DevinAgenticBridgeError( + "Devin ACP update referenced a different session", + "acp_session_mismatch", + 502 + ) + ); + return; + } + const update = asRecord(params.update); + const kind = String(update.sessionUpdate || params.type || ""); + if (kind === "tool_call" || kind === "tool_call_update") { + finish( + new DevinAgenticBridgeError( + "Devin attempted to execute a tool internally; Claude Code must own all tool execution", + "devin_internal_tool_execution", + 502 + ) + ); + return; + } + if (kind === "agent_message_chunk") { + text += extractText(update.content); + } else if ( + kind === "message_delta" || + kind === "text_delta" || + kind === "content_delta" + ) { + text += String(params.content || params.delta || params.text || ""); + } + continue; + } + + if (phase === "prompt" && msg.id === promptRequestId && msg.result !== undefined) { + const stopReason = String(asRecord(msg.result).stopReason || ""); + if (stopReason === "cancelled") { + finish( + new DevinAgenticBridgeError("Devin ACP cancelled the turn", "acp_cancelled", 502) + ); + return; + } + const resultText = + extractText(asRecord(msg.result).content) || extractText(asRecord(msg.result).message); + const finalText = text || resultText; + if (!finalText) { + finish( + new DevinAgenticBridgeError( + `Devin ACP completed without model output (stopReason=${stopReason || "missing"})`, + "empty_acp_output", + 502 + ) + ); + return; + } + finish(null, finalText); + continue; + } + + if (msg.id !== undefined && msg.id !== null && !msg.method) { + finish( + new DevinAgenticBridgeError( + `Devin ACP returned an unexpected response id: ${String(msg.id)}`, + "unexpected_acp_response", + 502 + ) + ); + return; + } + } + }); + + child.on("close", (code) => { + if (settled) return; + if (code === 0 && text) finish(null, text); + else + finish( + new DevinAgenticBridgeError( + `Devin CLI exited before completing the turn with code ${code}`, + "acp_early_exit", + 502 + ) + ); + }); + + initializeRequestId = send("initialize", { + protocolVersion: ACP_PROTOCOL_VERSION, + clientInfo: { name: "omniroute-devin-cli-agentic", version: "1.0" }, + clientCapabilities: {}, + }); + }); +} + +function assertKnownDevinModel(model: string): void { + if (!DEVIN_MODEL_CATALOG.some((entry) => entry.id === model)) { + throw new DevinAgenticBridgeError( + `Model is not present in the current Devin catalog: ${model}`, + "unknown_devin_model", + 400 + ); + } +} + +async function generateAgenticOutput( + args: Omit[0], "promptText">, + promptText: string +) { + const first = await runAcpTurn({ ...args, promptText }); + return first; +} + +function extractText(value: unknown): string { + if (typeof value === "string") return value; + if (Array.isArray(value)) return value.map((item) => extractText(item)).join(""); + const record = asRecord(value); + if (typeof record.text === "string") return record.text; + if (typeof record.content === "string") return record.content; + return ""; +} + +export class DevinCliAgenticExecutor extends BaseExecutor { + constructor() { + super("devin-cli-agentic", { id: "devin-cli-agentic", baseUrl: "devin://acp/stdio" }); + } + + buildUrl(): string { + const url = "devin://acp/stdio"; + assertLocalAcpUrl(url); + return url; + } + + buildHeaders(): Record { + return {}; + } + + transformRequest(): unknown { + return null; + } + + async execute({ model, body, stream, credentials, signal, log }: ExecuteInput) { + try { + assertKnownDevinModel(model); + const prompt = serializeAnthropicForDevin(body); + const devinBin = resolveDevinBin(); + log?.info?.("DEVIN_AGENTIC", `devin acp → model=${model}, bin=${devinBin}`); + + const turnArgs = { + devinBin, + env: buildDevinChildEnv(credentials), + model, + signal, + log, + }; + + let text = await generateAgenticOutput(turnArgs, prompt.text); + let tool; + try { + if (prompt.tools.length > 0 && describesUnexecutedToolIntent(text)) { + throw new DevinAgenticBridgeError( + "The response described a future action without performing it; call exactly one tool now", + "unexecuted_tool_intent" + ); + } + tool = parseDevinToolRequest(text, prompt.tools, prompt.idSeed); + } catch (error) { + if ( + !(error instanceof DevinAgenticBridgeError) || + !REPAIRABLE_TOOL_ERRORS.has(error.code) + ) { + throw error; + } + const requiresToolOnRepair = error.code === "unexecuted_tool_intent"; + const repairPrompt = [ + prompt.text, + "", + "---", + "", + "[Single Repair Attempt]", + `The previous output was rejected: ${sanitizeErrorMessage(error.message)}`, + requiresToolOnRepair + ? "Plain text is not accepted for this repair. Return exactly one standalone JSON envelope now." + : "Return either plain final text or exactly one standalone JSON envelope.", + "Do not narrate a tool action.", + ].join("\n"); + text = await generateAgenticOutput(turnArgs, repairPrompt); + tool = parseDevinToolRequest(text, prompt.tools, prompt.idSeed); + if (requiresToolOnRepair && !tool) { + throw new DevinAgenticBridgeError( + "Devin repeated a narrated tool action instead of requesting a tool", + "unexecuted_tool_intent", + 502 + ); + } + } + + const id = `msg_devin_${randomUUID().replaceAll("-", "")}`; + const outputTokens = estimateTokens(text); + const message = tool + ? buildClaudeToolUseResponse({ + id, + model, + tool, + inputTokens: prompt.inputTokensEstimate, + outputTokens, + }) + : buildClaudeTextResponse({ + id, + model, + text, + inputTokens: prompt.inputTokensEstimate, + outputTokens, + }); + + const responseBody = stream ? buildClaudeSseFrames(message) : JSON.stringify(message); + return { + response: new Response(responseBody, { + status: 200, + headers: { + "Content-Type": stream ? "text/event-stream" : "application/json", + "Cache-Control": "no-cache", + }, + }), + url: "devin://acp/stdio", + headers: {}, + transformedBody: { model, promptLength: prompt.text.length }, + }; + } catch (error) { + const bridge = error instanceof DevinAgenticBridgeError ? error : null; + return { + response: new Response(JSON.stringify(errorBody(error)), { + status: bridge?.status || 500, + headers: { "Content-Type": "application/json" }, + }), + url: "devin://acp/stdio", + headers: {}, + transformedBody: { model }, + }; + } + } +} diff --git a/open-sse/executors/firecrawl-fetch.ts b/open-sse/executors/firecrawl-fetch.ts index 00c6c3cbea..aa54ee89c4 100644 --- a/open-sse/executors/firecrawl-fetch.ts +++ b/open-sse/executors/firecrawl-fetch.ts @@ -20,9 +20,15 @@ const FIRECRAWL_DEFAULT_BASE_URL = "https://api.firecrawl.dev"; const FIRECRAWL_DEFAULT_TIMEOUT_MS = 30_000; /** Resolve the configured Firecrawl base URL, falling back to the public cloud API. */ -function getFirecrawlBaseUrl(): string { +function getFirecrawlBaseUrl(credentials?: WebFetchCredentials): string { const envBase = process.env.FIRECRAWL_BASE_URL?.trim(); - return envBase ? envBase.replace(/\/+$/, "") : FIRECRAWL_DEFAULT_BASE_URL; + if (envBase) return envBase.replace(/\/+$/, ""); + const providerData = credentials?.providerSpecificData; + const credBase = typeof credentials?.baseUrl === "string" ? credentials.baseUrl : providerData?.baseUrl; + if (typeof credBase === "string" && credBase.trim()) { + return credBase.trim().replace(/\/+$/, ""); + } + return FIRECRAWL_DEFAULT_BASE_URL; } /** Whether the given base URL is the default Firecrawl cloud endpoint. */ @@ -67,7 +73,7 @@ interface FirecrawlScrapeOptions { export async function firecrawlFetch(opts: FirecrawlScrapeOptions): Promise { const { url, format, depth, waitForSelector, includeMetadata, credentials } = opts; - const baseUrl = getFirecrawlBaseUrl(); + const baseUrl = getFirecrawlBaseUrl(credentials); const isDefaultBaseUrl = isDefaultFirecrawlBaseUrl(baseUrl); // The API key is mandatory for the public Firecrawl cloud API, but optional diff --git a/open-sse/executors/index.ts b/open-sse/executors/index.ts index 767d087927..b25f4d9555 100644 --- a/open-sse/executors/index.ts +++ b/open-sse/executors/index.ts @@ -15,6 +15,7 @@ import { OpencodeExecutor } from "./opencode.ts"; import { PuterExecutor } from "./puter.ts"; import { VertexExecutor } from "./vertex.ts"; import { CliproxyapiExecutor } from "./cliproxyapi.ts"; +import { DarioExecutor } from "./dario.ts"; import { NineRouterExecutor } from "./ninerouter.ts"; import { PerplexityWebExecutor } from "./perplexity-web.ts"; import { GrokWebExecutor } from "./grok-web.ts"; @@ -30,6 +31,7 @@ import { NlpCloudExecutor } from "./nlpcloud.ts"; import { WindsurfExecutor } from "./windsurf.ts"; import { ZedHostedExecutor } from "./zed-hosted.ts"; import { DevinCliExecutor } from "./devin-cli.ts"; +import { DevinCliAgenticExecutor } from "./devin-cli-agentic.ts"; import { AuggieExecutor } from "./auggie.ts"; import { DeepSeekWebExecutor } from "./deepseek-web.ts"; import { DeepSeekWebWithAutoRefreshExecutor } from "./deepseek-web-with-auto-refresh.ts"; @@ -54,6 +56,7 @@ import { CheaperInferenceExecutor } from "./cheaperinference.ts"; import { KimiWebExecutor } from "./kimi-web.ts"; import { DoubaoWebExecutor } from "./doubao-web.ts"; import { QwenWebExecutor } from "./qwen-web.ts"; +import { RaycastExecutor } from "./raycast.ts"; import { HailuoWebExecutor } from "./hailuo-web.ts"; import { ZaiWebExecutor } from "./zai-web.ts"; import { KimiExecutor } from "./kimi.ts"; @@ -104,6 +107,8 @@ const executors = { "vertex-partner": new VertexExecutor(), cliproxyapi: new CliproxyapiExecutor(), cpa: new CliproxyapiExecutor(), // Alias + dario: new DarioExecutor(), + dr: new DarioExecutor(), // Alias "9router": new NineRouterExecutor(), nr: new NineRouterExecutor(), // Alias "perplexity-web": new PerplexityWebExecutor(), @@ -125,6 +130,7 @@ const executors = { ws: new WindsurfExecutor(), // Alias "zed-hosted": new ZedHostedExecutor(), "devin-cli": new DevinCliExecutor(), + "devin-cli-agentic": new DevinCliAgenticExecutor(), devin: new DevinCliExecutor(), // Alias "deepseek-web": new DeepSeekWebWithAutoRefreshExecutor(), "ds-web": new DeepSeekWebWithAutoRefreshExecutor(), // Alias @@ -173,6 +179,8 @@ const executors = { "doubao-web": new DoubaoWebExecutor(), db: new DoubaoWebExecutor(), // Alias "qwen-web": new QwenWebExecutor(), + raycast: new RaycastExecutor(), + rc: new RaycastExecutor(), // Alias "hailuo-web": new HailuoWebExecutor(), "zai-web": new ZaiWebExecutor(), zw: new ZaiWebExecutor(), // Alias @@ -244,6 +252,7 @@ export { CloudflareAIExecutor } from "./cloudflare-ai.ts"; export { OpencodeExecutor } from "./opencode.ts"; export { PuterExecutor } from "./puter.ts"; export { CliproxyapiExecutor } from "./cliproxyapi.ts"; +export { DarioExecutor } from "./dario.ts"; export { NineRouterExecutor } from "./ninerouter.ts"; export { VertexExecutor } from "./vertex.ts"; export { PerplexityWebExecutor } from "./perplexity-web.ts"; @@ -260,6 +269,7 @@ export { NlpCloudExecutor } from "./nlpcloud.ts"; export { WindsurfExecutor } from "./windsurf.ts"; export { ZedHostedExecutor } from "./zed-hosted.ts"; export { DevinCliExecutor } from "./devin-cli.ts"; +export { DevinCliAgenticExecutor } from "./devin-cli-agentic.ts"; export { AuggieExecutor } from "./auggie.ts"; export { CopilotWebExecutor } from "./copilot-web.ts"; export { CopilotM365WebExecutor } from "./copilot-m365-web.ts"; diff --git a/open-sse/executors/kimi.ts b/open-sse/executors/kimi.ts index 8364f0909f..1a3ec3463f 100644 --- a/open-sse/executors/kimi.ts +++ b/open-sse/executors/kimi.ts @@ -7,6 +7,7 @@ import { import { FORMATS } from "../translator/formats.ts"; import { DefaultExecutor } from "./default.ts"; import type { ProviderCredentials } from "./base.ts"; +import { ensureToolMessageNames } from "./kimiToolNames.ts"; type JsonRecord = Record; type KimiProtocol = "openai" | "claude"; @@ -410,11 +411,17 @@ export class KimiExecutor extends DefaultExecutor { const cleanedBody = super.transformRequest(model, body, stream, credentials); const record = asRecord(cleanedBody); if (!record) return cleanedBody; + + // ponytail: backfill missing tool message names before protocol normalization. + // Kimi K3 rejects tool messages whose `name` field was stripped during + // combo routing or format translation. + const withNames = ensureToolMessageNames(record); + const policy = getThinkingPolicy(credentials); const normalized = - resolveKimiProtocol(credentials, record) === "claude" - ? normalizeAnthropicRequest(record, policy) - : normalizeOpenAIRequest(record, stream, policy); + resolveKimiProtocol(credentials, withNames) === "claude" + ? normalizeAnthropicRequest(withNames, policy) + : normalizeOpenAIRequest(withNames, stream, policy); return stream ? { ...normalized, stream: true } : normalized; } } diff --git a/open-sse/executors/kimiToolNames.ts b/open-sse/executors/kimiToolNames.ts new file mode 100644 index 0000000000..664f85c9ff --- /dev/null +++ b/open-sse/executors/kimiToolNames.ts @@ -0,0 +1,42 @@ +type JsonRecord = Record; + +function asRecord(value: unknown): JsonRecord | null { + return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : null; +} + +// ponytail: Kimi K3 (Moonshot) enforces a stricter tool-message contract than most +// OpenAI-compatible APIs: every role:"tool" message must carry a `name` field matching +// the function that issued the tool_call_id. When requests arrive through combo routing +// or format translation, the `name` field is frequently stripped, causing a 400. +// This builds a tool_call_id -> function.name lookup from assistant tool_calls and +// backfills missing names. Shared by KimiExecutor and DefaultExecutor (for BYOK providers). +// Upgrade path: if Moonshot relaxes this requirement, this function becomes a no-op. +export function ensureToolMessageNames(record: JsonRecord): JsonRecord { + if (!Array.isArray(record.messages)) return record; + + const callIdToName = new Map(); + for (const msg of record.messages) { + const m = asRecord(msg); + if (!m || m.role !== "assistant" || !Array.isArray(m.tool_calls)) continue; + for (const tc of m.tool_calls as { id?: string; function?: { name?: string } }[]) { + if (tc?.id && typeof tc.function?.name === "string") { + callIdToName.set(String(tc.id), tc.function.name); + } + } + } + + if (callIdToName.size === 0) return record; + + let modified = false; + const messages = record.messages.map((msg: unknown) => { + const m = asRecord(msg); + if (!m || m.role !== "tool" || typeof m.name === "string") return msg; + const callId = String(m.tool_call_id ?? ""); + const resolvedName = callIdToName.get(callId); + if (!resolvedName) return msg; + modified = true; + return { ...m, name: resolvedName }; + }); + + return modified ? { ...record, messages } : record; +} diff --git a/open-sse/executors/lmarena/response.ts b/open-sse/executors/lmarena/response.ts index 64aef907c9..da058e9eee 100644 --- a/open-sse/executors/lmarena/response.ts +++ b/open-sse/executors/lmarena/response.ts @@ -165,7 +165,7 @@ function baseChunk(model: string) { } function enqueueSse(controller: ReadableStreamDefaultController, chunk: Record) { - controller.enqueue(`data: ${JSON.stringify(chunk)}\n\n`); + controller.enqueue(new TextEncoder().encode(`data: ${JSON.stringify(chunk)}\n\n`)); } function emitStopAndDone(controller: ReadableStreamDefaultController, model: string) { @@ -173,7 +173,7 @@ function emitStopAndDone(controller: ReadableStreamDefaultController, model: str ...baseChunk(model), choices: [{ index: 0, delta: {}, finish_reason: "stop" }], }); - controller.enqueue("data: [DONE]\n\n"); + controller.enqueue(new TextEncoder().encode("data: [DONE]\n\n")); controller.close(); } @@ -213,7 +213,7 @@ export function createOpenAIArenaStream(opts: { model: string; signal?: AbortSignal; log?: { error?: (scope: string, msg: string) => void }; -}): ReadableStream { +}): ReadableStream { const { reader, model, signal, log } = opts; const decoder = new TextDecoder(); let buffer = ""; diff --git a/open-sse/executors/opencode.ts b/open-sse/executors/opencode.ts index 8b66d6e421..12dccb1b02 100644 --- a/open-sse/executors/opencode.ts +++ b/open-sse/executors/opencode.ts @@ -40,6 +40,31 @@ const OPENCODE_COOLDOWN_MAX_MS = 60_000; const EFFORT_LEVELS = ["low", "medium", "high", "max"] as const; +/** + * Models that work WITHOUT any API key on the free/noauth opencode tier. + * + * The upstream free tier rotates frequently — when a `-free` suffix model is + * delisted upstream, the upstream returns "Model X is not supported" (a separate + * issue from this gate). The set is defined by two data sources: + * + * 1. **Known free models** — models explicitly listed in the noauth + * `opencode` provider registry (`open-sse/config/providers/registry/opencode/index.ts`). + * These are the canonical free models. `deepseek-v4-flash-free` appears in both + * the noauth AND the zen registry (it is free on both tiers). + * 2. **`-free` suffix** — any model whose id ends in `-free`. This automatically + * covers upstream free-tier additions without a code deploy. + * + * For `opencode-go`, there is no free tier — ALL models require an API key. + */ +const OPENCODE_FREE_MODELS = new Set([ + "big-pickle", + "deepseek-v4-flash-free", + "mimo-v2.5-free", + "hy3-free", + "nemotron-3-ultra-free", + "north-mini-code-free", +]); + /** * Models on opencode-go that support effort-tier aliases. Each entry maps the * canonical base id to the set of effort suffixes the upstream supports. @@ -86,7 +111,31 @@ export function parseEffortLevel(model: string): { baseModel: string; effort: st return null; } +/** + * Determine whether a model requires an API key on the given opencode provider. + * + * - `opencode-go`: ALL models require a key (no free tier). + * - `opencode` / `opencode-zen`: premium = any model NOT in the free set (known + * free models OR ending in `-free`). + * - Unknown models are assumed premium (fail-safe). + */ +export function isPremiumOpencodeModel(model: string, provider: string): boolean { + // opencode-go has no free tier — every model requires a key. + if (provider === "opencode-go") return true; + + // Models ending in `-free` are always free on the noauth/zen tier. + if (model.endsWith("-free")) return false; + + // Check the known free model catalog. + return !OPENCODE_FREE_MODELS.has(model); +} + export class OpencodeExecutor extends BaseExecutor { + /** Delegates to `isPremiumOpencodeModel`. Exported for testability. */ + static isPremiumModel(model: string, provider: string): boolean { + return isPremiumOpencodeModel(model, provider); + } + _requestFormat: string | null = null; /** @@ -181,6 +230,34 @@ export class OpencodeExecutor extends BaseExecutor { async execute(input: ExecuteInput) { this._requestFormat = getModelTargetFormat(this.provider, input.model) || "openai"; + + // #8681: Gate premium opencode models behind a usable API key. + // When the connection is keyless (no apiKey, no accessToken) and the model + // is a premium model (not on the free tier), return a clear 402 error + // instead of proxying the raw upstream 401 "Missing API key" response. + const creds = input.credentials; + const isKeyless = + !creds?.apiKey && !creds?.accessToken && !creds?.providerSpecificData?.extraApiKeys; + if (isKeyless && isPremiumOpencodeModel(input.model, this.provider)) { + const bodyJson = JSON.stringify({ + error: { + message: + "This model requires an opencode API key — add one in Settings → Providers.", + type: "invalid_request_error", + code: "premium_model_requires_key", + }, + }); + return { + response: new Response(bodyJson, { + status: 402, + headers: { "Content-Type": "application/json" }, + }), + url: "", + headers: {} as Record, + transformedBody: null, + }; + } + try { this.syncAccountsFromCredentials(input.credentials); diff --git a/open-sse/executors/qoder.ts b/open-sse/executors/qoder.ts index 7dfa139462..1b19289a1a 100644 --- a/open-sse/executors/qoder.ts +++ b/open-sse/executors/qoder.ts @@ -372,8 +372,16 @@ export class QoderExecutor extends BaseExecutor { const { text, isError, errorMessage } = parseQoderCliResult(run.stdout); if (isError) { + // When qodercli exits 0 but returns is_error=true with an empty result, + // the real upstream error is almost always on stderr. Surface it instead + // of the generic "qodercli returned an error" fallback (#9319). + let effectiveError = errorMessage; + if (errorMessage === "qodercli returned an error" && run.stderr.trim()) { + const stderrTrimmed = run.stderr.trim().slice(0, 300); + effectiveError = `qodercli returned an error: ${stderrTrimmed}`; + } return { - response: createQoderErrorResponse(parseQoderCliFailure(errorMessage)), + response: createQoderErrorResponse(parseQoderCliFailure(effectiveError)), url, headers: {}, transformedBody: body, diff --git a/open-sse/executors/qwen-web.ts b/open-sse/executors/qwen-web.ts index 6c0a710862..57036a3cbb 100644 --- a/open-sse/executors/qwen-web.ts +++ b/open-sse/executors/qwen-web.ts @@ -47,8 +47,8 @@ const BX_UMIDTOKEN_FALLBACK = "T2gA0000000000000000000000000000000000000000"; // header the upstream returns HTTP 200 with `{"success":false,"data":{"code":"Bad_Request"}}` // for every completion request, even with a valid session. The version string is // the SPA build identifier shipped in the React client's `version` request header. -// Pinned from a live capture (2026-07); bump if Qwen ships a breaking change. -const QWEN_SPA_VERSION = "0.2.66"; +// Pinned from a live capture (2026-08); bump if Qwen ships a breaking change. +const QWEN_SPA_VERSION = "0.2.81"; const MODEL_ALIASES: Record = { // Legacy OmniRoute ids → current upstream catalog (GET /api/models). diff --git a/open-sse/executors/raycast.ts b/open-sse/executors/raycast.ts new file mode 100644 index 0000000000..4f788c115c --- /dev/null +++ b/open-sse/executors/raycast.ts @@ -0,0 +1,224 @@ +/** + * @file raycast.ts + * @description Executor for Raycast Pro AI (reverse-engineered backend.raycast.com API). + * + * @changes + * - [2026-07-27] [Composer] - Initial Raycast Pro local-dev executor + */ + +import { BaseExecutor, mergeUpstreamExtraHeaders, type ProviderCredentials } from "./base.ts"; +import { PROVIDERS } from "../config/constants.ts"; +import { sanitizeErrorMessage } from "../utils/error.ts"; +import { + RAYCAST_CHAT_URL, + buildRaycastChatBody, + buildRaycastHeaders, + parseRaycastSseText, +} from "../services/raycast.ts"; + +type JsonRecord = Record; +type ChatMessage = { role?: string; content?: unknown }; + +export class RaycastExecutor extends BaseExecutor { + constructor() { + super("raycast", PROVIDERS.raycast); + } + + buildUrl(): string { + return RAYCAST_CHAT_URL; + } + + buildHeaders(credentials: ProviderCredentials, payload?: string): Record { + const body = payload || "{}"; + return buildRaycastHeaders(body, credentials as JsonRecord); + } + + async execute({ model, body, stream, credentials, signal, upstreamExtraHeaders }) { + const reqBody = body as { messages?: ChatMessage[]; temperature?: number }; + let payload: string; + + try { + payload = buildRaycastChatBody(model as string, reqBody.messages || [], reqBody.temperature); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { + response: new Response( + JSON.stringify({ + error: { message: sanitizeErrorMessage(message), type: "invalid_request_error", code: "" }, + }), + { status: 400, headers: { "Content-Type": "application/json" } } + ), + url: RAYCAST_CHAT_URL, + headers: {}, + transformedBody: body, + }; + } + + const headers = this.buildHeaders(credentials as ProviderCredentials, payload); + mergeUpstreamExtraHeaders(headers, upstreamExtraHeaders as Record | null); + + let raycastResponse: Response; + try { + raycastResponse = await fetch(RAYCAST_CHAT_URL, { + method: "POST", + headers, + body: payload, + signal: signal || undefined, + }); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + return { + response: new Response( + JSON.stringify({ + error: { message: sanitizeErrorMessage(message), type: "api_error", code: "" }, + }), + { status: 502, headers: { "Content-Type": "application/json" } } + ), + url: RAYCAST_CHAT_URL, + headers, + transformedBody: payload, + }; + } + + if (!raycastResponse.ok) { + const errorText = await raycastResponse.text(); + return { + response: new Response( + JSON.stringify({ + error: { + message: sanitizeErrorMessage(`Raycast API error (${raycastResponse.status})`), + type: "api_error", + code: String(raycastResponse.status), + }, + }), + { status: raycastResponse.status, headers: { "Content-Type": "application/json" } } + ), + url: RAYCAST_CHAT_URL, + headers, + transformedBody: payload, + }; + } + + const responseId = `chatcmpl-raycast-${Date.now()}`; + const created = Math.floor(Date.now() / 1000); + const modelId = model as string; + + if (stream !== false) { + const raycastBody = raycastResponse.body; + if (!raycastBody) { + return { + response: new Response( + JSON.stringify({ + error: { message: "Raycast returned empty stream body", type: "api_error", code: "" }, + }), + { status: 502, headers: { "Content-Type": "application/json" } } + ), + url: RAYCAST_CHAT_URL, + headers, + transformedBody: payload, + }; + } + + const sseStream = new ReadableStream({ + async start(controller) { + const encoder = new TextEncoder(); + const reader = raycastBody.getReader(); + const decoder = new TextDecoder(); + let buffer = ""; + + try { + while (true) { + const { done, value } = await reader.read(); + if (done) break; + + buffer += decoder.decode(value, { stream: true }); + let newlineIndex: number; + while ((newlineIndex = buffer.indexOf("\n")) >= 0) { + const line = buffer.slice(0, newlineIndex).trim(); + buffer = buffer.slice(newlineIndex + 1); + if (!line.startsWith("data:")) continue; + + try { + const data = JSON.parse(line.slice(5).trim()) as { + text?: string; + finish_reason?: string | null; + complete?: boolean; + }; + const hasContent = typeof data.text === "string" && data.text.length > 0; + const hasFinishReason = + data.finish_reason !== undefined && data.finish_reason !== null; + if (data.complete || (!hasContent && !hasFinishReason)) continue; + + const chunk = { + id: responseId, + object: "chat.completion.chunk", + created, + model: modelId, + choices: [ + { + index: 0, + delta: { content: data.text || "" }, + finish_reason: hasFinishReason ? data.finish_reason : null, + }, + ], + }; + controller.enqueue(encoder.encode(`data: ${JSON.stringify(chunk)}\n\n`)); + } catch { + // Ignore malformed SSE data. + } + } + } + controller.enqueue(encoder.encode("data: [DONE]\n\n")); + controller.close(); + } catch (err) { + controller.error(err); + } + }, + }); + + return { + response: new Response(sseStream, { + status: 200, + headers: { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + Connection: "keep-alive", + }, + }), + url: RAYCAST_CHAT_URL, + headers, + transformedBody: payload, + }; + } + + const responseText = await raycastResponse.text(); + const content = parseRaycastSseText(responseText); + + return { + response: new Response( + JSON.stringify({ + id: responseId, + object: "chat.completion", + created, + model: modelId, + choices: [ + { + index: 0, + message: { role: "assistant", content, refusal: null }, + finish_reason: "stop", + }, + ], + usage: { + prompt_tokens: 0, + completion_tokens: 0, + total_tokens: 0, + }, + }), + { status: 200, headers: { "Content-Type": "application/json" } } + ), + url: RAYCAST_CHAT_URL, + headers, + transformedBody: payload, + }; + } +} diff --git a/open-sse/executors/vertex.ts b/open-sse/executors/vertex.ts index 0344a456d6..9d9ed6502f 100644 --- a/open-sse/executors/vertex.ts +++ b/open-sse/executors/vertex.ts @@ -138,13 +138,149 @@ function isPartnerModel(model: string) { return [...PARTNER_MODELS].some((prefix) => normalizedModel.startsWith(prefix)); } +// Anthropic models need their own branch: they use Vertex's native Anthropic Messages API +// (publishers/anthropic/.../rawPredict), not the generic OpenAI-compatible partner endpoint the +// other PARTNER_MODELS entries (DeepSeek, Qwen, Llama, Mistral, GLM) go through — the OpenAI-shaped +// endpoint 404s/"malformed argument"s for Claude models on at least some projects. +function isClaudeModel(model: string) { + return model.toLowerCase().startsWith("claude-"); +} + +// Defensive normalizer: target-format resolution for manually-added custom Claude models under +// "vertex"/"vertex-partner" was observed sending a Gemini-shaped body (contents/parts) to the +// Anthropic rawPredict endpoint instead of the configured "claude" format, causing a hard +// "messages: Field required" error upstream regardless of the stored per-model targetFormat. This +// converts a Gemini-shaped body to Anthropic Messages shape so the executor works either way, +// independent of that unresolved upstream resolution gap. +function toAnthropicBody(body: Record): Record { + const contents = body.contents as Array<{ role?: string; parts?: Array<{ text?: string }> }> | undefined; + if (!Array.isArray(contents)) return body; + + const messages = contents.map((c) => ({ + role: c.role === "model" ? "assistant" : "user", + content: (c.parts || []).map((p) => p.text || "").join(""), + })); + const generationConfig = body.generationConfig as { maxOutputTokens?: number } | undefined; + const systemInstruction = body.systemInstruction as { parts?: Array<{ text?: string }> } | undefined; + + const converted: Record = { + messages, + max_tokens: generationConfig?.maxOutputTokens || 4096, + }; + if (systemInstruction?.parts?.length) { + converted.system = systemInstruction.parts.map((p) => p.text || "").join(""); + } + return converted; +} + +// rawPredict always returns a single complete JSON body, never real SSE framing (see buildUrl). +// When the caller actually requested a stream, synthesize a genuine Anthropic-native event +// sequence from that JSON so the existing claude-to-openai.ts (and sibling) response translators +// — which already parse real message_start/content_block_*/message_delta/message_stop events — +// can consume it correctly, instead of relying on the OpenAI-`choices`-only JSON→SSE fallback +// (open-sse/utils/jsonToSse.ts) which cannot represent Anthropic's native response shape at all. +function synthesizeClaudeSse(response: Record): string { + const messageId = typeof response.id === "string" ? response.id : `msg_${Date.now()}`; + const model = typeof response.model === "string" ? response.model : ""; + const usage = (response.usage as Record) || {}; + const stopReason = typeof response.stop_reason === "string" ? response.stop_reason : "end_turn"; + const stopSequence = (response.stop_sequence as string | null | undefined) ?? null; + const content = Array.isArray(response.content) ? response.content : []; + + const events: Array<{ event: string; data: Record }> = []; + + events.push({ + event: "message_start", + data: { + type: "message_start", + message: { + id: messageId, + type: "message", + role: "assistant", + content: [], + model, + stop_reason: null, + stop_sequence: null, + usage: { input_tokens: usage.input_tokens || 0, output_tokens: 0 }, + }, + }, + }); + + content.forEach((block: Record, index: number) => { + if (block.type === "text") { + events.push({ + event: "content_block_start", + data: { type: "content_block_start", index, content_block: { type: "text", text: "" } }, + }); + if (block.text) { + events.push({ + event: "content_block_delta", + data: { + type: "content_block_delta", + index, + delta: { type: "text_delta", text: block.text }, + }, + }); + } + events.push({ event: "content_block_stop", data: { type: "content_block_stop", index } }); + } else if (block.type === "tool_use") { + events.push({ + event: "content_block_start", + data: { + type: "content_block_start", + index, + content_block: { type: "tool_use", id: block.id, name: block.name, input: {} }, + }, + }); + events.push({ + event: "content_block_delta", + data: { + type: "content_block_delta", + index, + delta: { type: "input_json_delta", partial_json: JSON.stringify(block.input ?? {}) }, + }, + }); + events.push({ event: "content_block_stop", data: { type: "content_block_stop", index } }); + } else if (block.type === "thinking") { + events.push({ + event: "content_block_start", + data: { type: "content_block_start", index, content_block: { type: "thinking", thinking: "" } }, + }); + if (block.thinking) { + events.push({ + event: "content_block_delta", + data: { + type: "content_block_delta", + index, + delta: { type: "thinking_delta", thinking: block.thinking }, + }, + }); + } + events.push({ event: "content_block_stop", data: { type: "content_block_stop", index } }); + } + }); + + events.push({ + event: "message_delta", + data: { + type: "message_delta", + delta: { stop_reason: stopReason, stop_sequence: stopSequence }, + usage: { output_tokens: usage.output_tokens || 0 }, + }, + }); + + events.push({ event: "message_stop", data: { type: "message_stop" } }); + + return events.map((e) => `event: ${e.event}\ndata: ${JSON.stringify(e.data)}\n\n`).join(""); +} + export class VertexExecutor extends BaseExecutor { constructor() { super("vertex", PROVIDERS.vertex); } async execute(input: ExecuteInput) { - const { credentials, log } = input; + const { credentials, log, model, stream } = input; // Defensive: trim stray surrounding whitespace from a pasted credential. if (typeof credentials.apiKey === "string") { credentials.apiKey = credentials.apiKey.trim(); @@ -160,7 +296,53 @@ export class VertexExecutor extends BaseExecutor { throw err; } } - return super.execute(input); + if (isClaudeModel(model) && input.body && typeof input.body === "object") { + let body = input.body as Record; + if (!Array.isArray(body.messages)) { + body = toAnthropicBody(body); + input.body = body; + } + // The rawPredict endpoint requires "anthropic_version" in the body (Vertex's substitute + // for the "anthropic-version" header used by Anthropic's direct API). + body.anthropic_version ??= "vertex-2023-10-16"; + // Unlike Anthropic's direct API (which reads the model from the body), Vertex's + // rawPredict endpoint already encodes project/region/model in the URL and 400s with + // "model: Extra inputs are not permitted" if the translated request body still carries + // one (the openai→claude request translator copies the client's model field over). + delete body.model; + } + + const result = await super.execute(input); + + if (isClaudeModel(model) && stream) { + const response = result instanceof Response ? result : result?.response; + if (response?.ok) { + const contentType = response.headers.get("content-type") || ""; + if (contentType.includes("application/json") && !contentType.includes("text/event-stream")) { + const jsonText = await response.text(); + let newBody = jsonText; + let newContentType = contentType; + try { + newBody = synthesizeClaudeSse(JSON.parse(jsonText)); + newContentType = "text/event-stream"; + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + log?.warn?.("VERTEX", `Failed to synthesize Claude SSE stream: ${message}`); + } + const newHeaders = new Headers(response.headers); + newHeaders.set("content-type", newContentType); + newHeaders.delete("content-length"); + const newResponse = new Response(newBody, { + status: response.status, + statusText: response.statusText, + headers: newHeaders, + }); + return result instanceof Response ? newResponse : { ...result, response: newResponse }; + } + } + } + + return result; } buildUrl(model: string, stream: boolean, urlIndex = 0, credentials: any = null) { @@ -189,6 +371,13 @@ export class VertexExecutor extends BaseExecutor { } } + if (isClaudeModel(model)) { + // streamRawPredict?alt=sse was verified to return a single plain JSON body (not real SSE + // framing) rather than actual chunked events, which breaks the SSE parser upstream + // ("stream ended before producing a non-ping SSE event"). rawPredict is confirmed reliable + // for both streaming and non-streaming requests; always use it here. + return `https://aiplatform.googleapis.com/v1/projects/${project}/locations/${region}/publishers/anthropic/models/${model}:rawPredict`; + } if (isPartnerModel(model)) { return `https://aiplatform.googleapis.com/v1/projects/${project}/locations/global/endpoints/openapi/chat/completions`; } diff --git a/open-sse/executors/yuanbao-web.ts b/open-sse/executors/yuanbao-web.ts index 75a3d2c615..243e9ba7ae 100644 --- a/open-sse/executors/yuanbao-web.ts +++ b/open-sse/executors/yuanbao-web.ts @@ -457,9 +457,12 @@ function transformYuanbaoStream( if (event.type === "think" && event.content) { ensureRole(); emit({ reasoning_content: event.content }); - } else if (event.type === "text" && typeof event.msg === "string" && event.msg) { - ensureRole(); - emit({ content: event.msg }); + } else if (event.type === "text") { + const text = event.msg ?? event.content; + if (text) { + ensureRole(); + emit({ content: text }); + } } } } @@ -498,7 +501,10 @@ async function collectYuanbaoResponse( const event = parseYuanbaoDataLine(line); if (!event) continue; if (event.type === "think" && event.content) reasoning += event.content; - else if (event.type === "text" && typeof event.msg === "string") content += event.msg; + else if (event.type === "text") { + const text = event.msg ?? event.content; + if (text) content += text; + } } } } finally { diff --git a/open-sse/handlers/audioSpeech.ts b/open-sse/handlers/audioSpeech.ts index b931f6d543..912c81e27f 100644 --- a/open-sse/handlers/audioSpeech.ts +++ b/open-sse/handlers/audioSpeech.ts @@ -228,6 +228,35 @@ async function handleDeepgramSpeech(providerConfig, body, modelId, token) { return audioStreamResponse(res); } +/** + * Handle Soniox TTS (OpenAI speech shape → Soniox /tts, returns raw audio bytes) + */ +async function handleSonioxSpeech(providerConfig, body, modelId, token) { + const fmt = typeof body.response_format === "string" ? body.response_format : "mp3"; + const audioFormat = fmt === "pcm" ? "pcm_s16le" : fmt; + + const res = await fetch(providerConfig.baseUrl, { + method: "POST", + headers: { + "Content-Type": "application/json", + ...buildAuthHeaders(providerConfig, token), + }, + body: JSON.stringify({ + text: body.input, + model: modelId, + ...(body.voice ? { voice: body.voice } : {}), + audio_format: audioFormat, + }), + }); + + if (!res.ok) { + return upstreamErrorResponse(res, await res.text()); + } + + const contentType = fmt === "wav" ? "audio/wav" : fmt === "opus" ? "audio/opus" : "audio/mpeg"; + return audioStreamResponse(res, contentType); +} + /** * Handle ElevenLabs TTS * POST {baseUrl}/{voice_id} with { text, model_id } @@ -846,6 +875,10 @@ export async function handleAudioSpeech({ return handleDeepgramSpeech(providerConfig, body, modelId, token); } + if (providerConfig.format === "soniox-tts") { + return handleSonioxSpeech(providerConfig, body, modelId, token); + } + if (providerConfig.format === "elevenlabs") { return handleElevenLabsSpeech(providerConfig, body, modelId, token); } diff --git a/open-sse/handlers/audioTranscription.ts b/open-sse/handlers/audioTranscription.ts index aea16a0377..9fe9d2277e 100644 --- a/open-sse/handlers/audioTranscription.ts +++ b/open-sse/handlers/audioTranscription.ts @@ -336,6 +336,78 @@ async function handleGladiaTranscription(providerConfig, file, modelId, token) { return errorResponse(504, "Gladia transcription timed out after 120s"); } +/** + * Handle Soniox transcription (async: upload file → create job → poll → get transcript) + */ +async function handleSonioxTranscription(providerConfig, file, modelId, token) { + const authHeaders = buildAuthHeaders(providerConfig, token); + + const { body: uploadBody, contentType: uploadContentType } = await buildMultipartBody(file, {}); + const uploadRes = await fetch("https://api.soniox.com/v1/files", { + method: "POST", + headers: { ...authHeaders, "Content-Type": uploadContentType }, + body: uploadBody, + }); + if (!uploadRes.ok) { + return upstreamErrorResponse(uploadRes, await uploadRes.text()); + } + const fileId = (await uploadRes.json()).id; + + const createRes = await fetch(providerConfig.baseUrl, { + method: "POST", + headers: { ...authHeaders, "Content-Type": "application/json" }, + body: JSON.stringify({ + model: modelId, + file_id: fileId, + enable_language_identification: true, + }), + }); + if (!createRes.ok) { + return upstreamErrorResponse(createRes, await createRes.text()); + } + const { id: transcriptionId } = await createRes.json(); + + const statusUrl = `${providerConfig.baseUrl}/${transcriptionId}`; + const maxWait = 120_000; + const start = Date.now(); + let completed = false; + while (Date.now() - start < maxWait) { + await new Promise((r) => setTimeout(r, 2000)); + const pollRes = await fetch(statusUrl, { headers: authHeaders }); + if (!pollRes.ok) { + continue; + } + const result = await pollRes.json(); + if (result.status === "completed") { + completed = true; + break; + } + if (result.status === "error") { + return errorResponse( + 500, + result.error_message || result.error || "Soniox transcription failed" + ); + } + } + if (!completed) { + return errorResponse(504, "Soniox transcription timed out after 120s"); + } + + const transcriptRes = await fetch(`${statusUrl}/transcript`, { headers: authHeaders }); + if (!transcriptRes.ok) { + return upstreamErrorResponse(transcriptRes, await transcriptRes.text()); + } + const transcript = await transcriptRes.json(); + const text = + typeof transcript.text === "string" && transcript.text.length > 0 + ? transcript.text + : Array.isArray(transcript.tokens) + ? transcript.tokens.map((t: { text?: string }) => t.text ?? "").join("") + : ""; + + return Response.json({ text }, { headers: { ...CORS_HEADERS } }); +} + /** * Handle Nvidia NIM transcription * Multipart POST, transform response to { text } @@ -735,6 +807,10 @@ export async function handleAudioTranscription({ return handleGladiaTranscription(providerConfig, file, modelId, token); } + if (providerConfig.format === "soniox") { + return handleSonioxTranscription(providerConfig, file, modelId, token); + } + if (providerConfig.format === "nvidia-asr") { return handleNvidiaTranscription(providerConfig, file, modelId, token); } diff --git a/open-sse/handlers/chatCore.ts b/open-sse/handlers/chatCore.ts index b74ec33890..2b110b47f4 100644 --- a/open-sse/handlers/chatCore.ts +++ b/open-sse/handlers/chatCore.ts @@ -223,6 +223,7 @@ import { recordCost } from "@/domain/costRules"; import { calculateCost } from "@/lib/usage/costCalculator"; import { buildClaudePassthroughToolNameMap, + mergeResponseToolNameMap, normalizeOpenAIToolFinishReasons, restoreNonStreamingToolNames, } from "./chatCore/passthroughToolNames.ts"; @@ -303,6 +304,7 @@ import { markBlocked as markAccountSemaphoreBlocked, } from "../services/accountSemaphore.ts"; import { lockModel, lockModelIfPerModelQuota } from "../services/accountFallback.ts"; +import { lockExactModel } from "../services/accountFallback.ts"; import { generateSignature, getCachedResponse, @@ -488,9 +490,10 @@ export async function handleChatCore({ model, provider, apiKeyInfo, + headers: clientRawRequest?.headers, log, }); - if (pluginGate.blocked) { + if (pluginGate.blocked === true) { return { success: false, status: 403, @@ -920,6 +923,15 @@ export async function handleChatCore({ ? credentials.providerSpecificData.customUserAgent.trim() : ""; + // #8369: connection-level custom upstream headers from provider_specific_data. + const connectionCustomHeaders = + credentials?.providerSpecificData && + typeof credentials.providerSpecificData === "object" && + typeof credentials.providerSpecificData.customHeaders === "object" && + !Array.isArray(credentials.providerSpecificData.customHeaders) + ? (credentials.providerSpecificData.customHeaders as Record) + : undefined; + // Upstream extra-header building extracted to chatCore/upstreamExecuteHeaders.ts (#3501); bind the // per-request inputs once and delegate so the existing call sites stay byte-identical. const buildUpstreamHeadersForExecute = (modelToCall: string): Record => @@ -931,6 +943,7 @@ export async function handleChatCore({ resolvedModel, sourceFormat, connectionCustomUserAgent, + connectionCustomHeaders, settings, }); @@ -1712,14 +1725,16 @@ export async function handleChatCore({ comboConfig as unknown as { name: string; models: unknown[] }, allCombosData as unknown as { name: string; models: unknown[] }[] ); - comboTargetLimits = targets.map((t: { modelStr?: string; provider?: string }) => - // Fall back to ResolvedComboTarget.provider when modelStr lacks a - // provider/ prefix — parseModel alone returns provider:null (#8716). - getComboTargetTokenLimit({ - modelStr: t.modelStr, - provider: t.provider, - }) - ); + // Fall back to ResolvedComboTarget.provider when modelStr lacks a + // provider/ prefix — parseModel alone returns provider:null (#8716). + comboTargetLimits = targets + .map((t: { modelStr?: string; provider?: string }) => + getComboTargetTokenLimit({ modelStr: t.modelStr, provider: t.provider }) + ) + .filter( + (limit): limit is number => + typeof limit === "number" && Number.isFinite(limit) && limit > 0 + ); } // chatCore executes per concrete target (handleSingleModel resolves // provider/effectiveModel before delegating). Compress against THIS @@ -1869,7 +1884,7 @@ export async function handleChatCore({ modelOutputCap, toPositiveInteger(resolveInputTokenCapForGate({ provider, model: effectiveModel }, { isCombo })) ); - if (!outputBudget.ok) { + if (outputBudget.ok === false) { const exceededInputCap = outputBudget.maxInputTokens !== undefined; const message = `Input exceeds ${exceededInputCap ? "maximum input tokens" : "context window"} for ${provider}/${effectiveModel}: ` + @@ -2292,10 +2307,24 @@ export async function handleChatCore({ const nativeClaudeToolNameMap = isClaudePassthrough ? buildClaudePassthroughToolNameMap(body) : null; - const toolNameMap = + let toolNameMap: Map | null = translatedToolNameMap instanceof Map && translatedToolNameMap.size > 0 ? translatedToolNameMap : nativeClaudeToolNameMap; + + // For providers whose _toolNameMap was extracted as requestToolIdentityMap + // before the Kiro merge block (Gemini/Antigravity), merge it into the + // response toolNameMap so the response translator can restore tool names + // from their lowercased form (#9568). Only merge string-valued entries + // (tool name aliases), not object-valued namespace identities (#7936). + if (!toolNameMap && requestToolIdentityMap instanceof Map && requestToolIdentityMap.size > 0) { + const hasStringValues = [...requestToolIdentityMap.values()].every( + (v: unknown) => typeof v === "string" + ); + if (hasStringValues) { + toolNameMap = requestToolIdentityMap; + } + } delete translatedBody._toolNameMap; delete translatedBody._disableToolPrefix; @@ -3698,7 +3727,8 @@ export async function handleChatCore({ markAccountSemaphoreBlocked(accountSemaphoreKey, quotaCooldownMs); } if (isModelScope() && errorConnectionId) { - lockModel(provider, errorConnectionId, model, "quota_exhausted", quotaCooldownMs); + const lockFn = provider === "antigravity" ? lockExactModel : lockModel; + lockFn(provider, errorConnectionId, model, "quota_exhausted", quotaCooldownMs); console.warn( `[provider] Node ${errorConnectionId} ModelScope model quota exhausted (${statusCode}) for ${model} - ${Math.ceil(quotaCooldownMs / 1000)}s (connection stays active)` ); @@ -4593,6 +4623,7 @@ export async function handleChatCore({ model, provider, apiKeyInfo, + headers: clientRawRequest?.headers, response: { status: 200, data: translatedResponse }, }); @@ -4983,6 +5014,7 @@ export async function handleChatCore({ model, provider, apiKeyInfo, + headers: clientRawRequest?.headers, response: { status: 200, streamed: true }, }); diff --git a/open-sse/handlers/chatCore/comboContextCache.ts b/open-sse/handlers/chatCore/comboContextCache.ts index da2c3d3c15..1a4f2c5b2c 100644 --- a/open-sse/handlers/chatCore/comboContextCache.ts +++ b/open-sse/handlers/chatCore/comboContextCache.ts @@ -1,4 +1,5 @@ import { getUpstreamProxyConfig } from "@/lib/localDb"; +import type { FallbackBackend } from "@/lib/db/upstreamProxy"; /** * Module-level cache for upstream proxy config (shared across all requests). @@ -8,6 +9,8 @@ type UpstreamProxyConfigCacheEntry = { mode: string; enabled: boolean; cliproxyapiModelMapping: Record | null; + // #dario: retry-leg backend when mode === "fallback". + fallbackBackend: FallbackBackend; ts: number; }; @@ -67,9 +70,16 @@ export async function getUpstreamProxyConfigCached(providerId: string) { mode: cfg.mode, enabled: cfg.enabled, cliproxyapiModelMapping: cfg.cliproxyapiModelMapping ?? null, + fallbackBackend: cfg.fallbackBackend, ts: Date.now(), } - : { mode: "native" as const, enabled: false, cliproxyapiModelMapping: null, ts: Date.now() }; + : { + mode: "native" as const, + enabled: false, + cliproxyapiModelMapping: null, + fallbackBackend: "cliproxyapi" as const, + ts: Date.now(), + }; _proxyConfigCache.set(providerId, result); return result; } diff --git a/open-sse/handlers/chatCore/executorProxy.ts b/open-sse/handlers/chatCore/executorProxy.ts index c791e9c5a4..19dc55f4d0 100644 --- a/open-sse/handlers/chatCore/executorProxy.ts +++ b/open-sse/handlers/chatCore/executorProxy.ts @@ -4,15 +4,24 @@ * * Extracted from handleChatCore: resolves the executor for a provider honoring the configured * upstream proxy mode. `native` / disabled → the provider's own executor; `cliproxyapi` → the - * CLIProxyAPI passthrough executor; `fallback` → a wrapper that tries the native executor first and - * retries via CLIProxyAPI on configured failure codes (default 5xx + 429 + network) or on a thrown - * error. Behaviour is byte-identical to the previous inline closure (it only captured `log`). + * CLIProxyAPI passthrough executor; `dario` → the Dario passthrough executor; `fallback` → a + * wrapper that tries the native executor first and retries via the configured fallback backend + * (CLIProxyAPI by default, or Dario) on configured failure codes (default 5xx + 429 + network) + * or on a thrown error. + * + * Dario (@askalf/dario) is wired as a parallel, independent backend choice at both levels + * (per-connection `darioMode` + provider `mode`/`fallbackBackend`) WITHOUT changing any existing + * CLIProxyAPI behaviour. Dario needs neither the dedicated-credential substitution nor the + * per-provider model-mapping wrappers CLIProxyAPI uses: it authenticates via its own OAuth + * account pool (not a configured bearer key) and has its own server-side model-alias mechanism. */ import { getExecutor } from "../../executors/index.ts"; import { isCliproxyapiDeepModeEnabled } from "../../executors/cliproxyapi.ts"; +import { isDarioDeepModeEnabled } from "../../executors/dario.ts"; import { getCachedSettings } from "@/lib/db/readCache"; import { getUpstreamProxyConfigCached } from "./comboContextCache.ts"; +import type { FallbackBackend } from "@/lib/db/upstreamProxy"; import { wrapExecutorWithCliproxyapiModelMapping } from "./cliproxyModelMapping.ts"; import { resolveDedicatedCliproxyapiApiKey, @@ -62,6 +71,21 @@ async function loadCliproxyapiSettings(): Promise<{ } } +/** + * Resolve the CLIProxyAPI passthrough executor with its model-mapping + + * dedicated-credential wrappers applied. Used by the direct `cliproxyapi` leg + * and the CLIProxyAPI branch of `fallback`. + */ +function resolveCliproxyapiExecutor( + cliproxyapiModelMapping: Record | null, + dedicatedApiKey: string | null +) { + return wrapExecutorWithCliproxyapiCredentials( + wrapExecutorWithCliproxyapiModelMapping(getExecutor("cliproxyapi"), cliproxyapiModelMapping), + dedicatedApiKey + ); +} + export async function resolveExecutorWithProxy( prov: string, log?: LoggerLike, @@ -81,29 +105,50 @@ export async function resolveExecutorWithProxy( return getExecutor("cliproxyapi"); } + // Sibling per-connection override for Dario (#dario). Checked AFTER the + // CLIProxyAPI check above by deliberate design: if a connection somehow sets + // BOTH cliproxyapiMode and darioMode to "claude-native", CLIProxyAPI's + // existing behaviour keeps winning — the least-surprising precedence for + // configs that predate this field, and the simplest to reason about. + if (isDarioDeepModeEnabled(providerSpecificData)) { + log?.info?.( + "UPSTREAM_PROXY", + `${prov} routed through Dario (per-connection claude-native override)` + ); + return getExecutor("dario"); + } + const cfg = await getUpstreamProxyConfigCached(prov); if (!cfg.enabled || cfg.mode === "native") return getExecutor(prov); if (cfg.mode === "cliproxyapi") { log?.info?.("UPSTREAM_PROXY", `${prov} routed through CLIProxyAPI (passthrough)`); const { dedicatedApiKey } = await loadCliproxyapiSettings(); - return wrapExecutorWithCliproxyapiCredentials( - wrapExecutorWithCliproxyapiModelMapping(getExecutor("cliproxyapi"), cfg.cliproxyapiModelMapping), - dedicatedApiKey - ); + return resolveCliproxyapiExecutor(cfg.cliproxyapiModelMapping, dedicatedApiKey); } - // mode === "fallback": try native first, retry via CLIProxyAPI on specific failures. - // The model mapping applies only to the CLIProxyAPI retry leg (proxyExec) — the - // native leg must keep seeing the original, unmapped model. + if (cfg.mode === "dario") { + // Direct Dario passthrough. No credential/model-mapping wrappers: Dario + // authenticates via its own OAuth pool and has its own model-alias layer. + log?.info?.("UPSTREAM_PROXY", `${prov} routed through Dario (passthrough)`); + return getExecutor("dario"); + } + + // mode === "fallback": try native first, retry via the configured fallback + // backend on specific failures. The backend defaults to CLIProxyAPI so every + // pre-existing fallback config behaves exactly as before; fallbackBackend + // === "dario" opts the retry leg over to Dario instead. const nativeExec = getExecutor(prov); + const fallbackBackend: FallbackBackend = cfg.fallbackBackend; const { fallbackCodes, dedicatedApiKey } = await loadCliproxyapiSettings(); - // #7645: the CLIProxyAPI retry leg must authenticate with the dedicated - // key, never the native provider's own (already-failed) credential. - const proxyExec = wrapExecutorWithCliproxyapiCredentials( - wrapExecutorWithCliproxyapiModelMapping(getExecutor("cliproxyapi"), cfg.cliproxyapiModelMapping), - dedicatedApiKey - ); + + // The model mapping applies only to the CLIProxyAPI retry leg (proxyExec) — + // the native leg must keep seeing the original, unmapped model. + const proxyExec = + fallbackBackend === "dario" + ? getExecutor("dario") + : resolveCliproxyapiExecutor(cfg.cliproxyapiModelMapping, dedicatedApiKey); + const backendLabel = fallbackBackend === "dario" ? "Dario" : "CLIProxyAPI"; const isRetryableStatus = (s: number) => fallbackCodes.includes(s) || s === 0; const wrapper = Object.create(nativeExec); @@ -121,12 +166,12 @@ export async function resolveExecutorWithProxy( result = await nativeExec.execute(input); } catch (err) { const errMsg = err instanceof Error ? err.message : String(err); - log?.info?.("UPSTREAM_PROXY", `${prov} native error (${errMsg}), retrying via CLIProxyAPI`); + log?.info?.("UPSTREAM_PROXY", `${prov} native error (${errMsg}), retrying via ${backendLabel}`); try { return await proxyExec.execute(input); } catch (proxyErr) { const proxyMsg = proxyErr instanceof Error ? proxyErr.message : String(proxyErr); - log?.error?.("UPSTREAM_PROXY", `${prov} CLIProxyAPI fallback also failed: ${proxyMsg}`); + log?.error?.("UPSTREAM_PROXY", `${prov} ${backendLabel} fallback also failed: ${proxyMsg}`); throw proxyErr; } } @@ -136,13 +181,13 @@ export async function resolveExecutorWithProxy( } log?.info?.( "UPSTREAM_PROXY", - `${prov} native failed (${result.response.status}), retrying via CLIProxyAPI` + `${prov} native failed (${result.response.status}), retrying via ${backendLabel}` ); try { return await proxyExec.execute(input); } catch (proxyErr) { const proxyMsg = proxyErr instanceof Error ? proxyErr.message : String(proxyErr); - log?.error?.("UPSTREAM_PROXY", `${prov} CLIProxyAPI fallback also failed: ${proxyMsg}`); + log?.error?.("UPSTREAM_PROXY", `${prov} ${backendLabel} fallback also failed: ${proxyMsg}`); throw proxyErr; } }; diff --git a/open-sse/handlers/chatCore/pluginOnRequest.ts b/open-sse/handlers/chatCore/pluginOnRequest.ts index 170c276c5e..a4737d53af 100644 --- a/open-sse/handlers/chatCore/pluginOnRequest.ts +++ b/open-sse/handlers/chatCore/pluginOnRequest.ts @@ -10,13 +10,10 @@ */ type LoggerLike = - | { info?: (...args: unknown[]) => void; debug?: (...args: unknown[]) => void } - | null - | undefined; + { info?: (...args: unknown[]) => void; debug?: (...args: unknown[]) => void } | null | undefined; export type PluginOnRequestGate = - | { blocked: true; response: Response } - | { blocked: false; body?: unknown }; + { blocked: true; response: Response } | { blocked: false; body?: unknown }; const JSON_HEADERS = { status: 403, headers: { "Content-Type": "application/json" } } as const; @@ -26,6 +23,7 @@ export async function runPluginOnRequestHook(args: { model: string | null | undefined; provider: string | null | undefined; apiKeyInfo: unknown; + headers?: Record; log?: LoggerLike; }): Promise { try { @@ -36,6 +34,7 @@ export async function runPluginOnRequestHook(args: { model: args.model, provider: args.provider, apiKeyInfo: args.apiKeyInfo, + headers: args.headers, metadata: {}, }; const pluginResult = await runOnRequest(pluginCtx); diff --git a/open-sse/handlers/chatCore/pluginOnResponse.ts b/open-sse/handlers/chatCore/pluginOnResponse.ts index 1d74ca2989..63055e2e74 100644 --- a/open-sse/handlers/chatCore/pluginOnResponse.ts +++ b/open-sse/handlers/chatCore/pluginOnResponse.ts @@ -24,6 +24,7 @@ export async function runPluginOnResponseHook(args: { model: string | null | undefined; provider: string | null | undefined; apiKeyInfo: unknown; + headers?: Record; response: PluginOnResponsePayload; }): Promise { try { @@ -35,6 +36,7 @@ export async function runPluginOnResponseHook(args: { model: args.model, provider: args.provider, apiKeyInfo: args.apiKeyInfo, + headers: args.headers, metadata: {}, }, args.response diff --git a/open-sse/handlers/chatCore/responseHeaders.ts b/open-sse/handlers/chatCore/responseHeaders.ts index 60701d9495..43fdc5a88e 100644 --- a/open-sse/handlers/chatCore/responseHeaders.ts +++ b/open-sse/handlers/chatCore/responseHeaders.ts @@ -30,12 +30,27 @@ const STREAMING_RESPONSE_HEADER_DENYLIST = new Set([ "x-accel-buffering", ]); +const DEFAULT_FORWARDED_HEADER_BUDGET_BYTES = 768; + +/** + * Resolve the forwarded upstream response-header budget from an optional string value + * (typically `process.env.OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES`). Returns the + * default of 768 when the input is unset, empty, or non-positive. + * Extracted as a pure function so unit tests can pass values directly without + * module-cache manipulation. + */ +export function resolveForwardedHeaderBudget(env?: string): number { + const parsed = Number.parseInt(String(env ?? process.env.OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES), 10); + return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_FORWARDED_HEADER_BUDGET_BYTES; +} + /** * Keep upstream-derived headers comfortably below common reverse-proxy response-header limits. * This budget includes each header name, separator, value, and trailing CRLF. OmniRoute's own * response metadata and framework/security headers are added separately. + * Override with `OMNIROUTE_FORWARDING_HEADER_BUDGET_BYTES`. */ -export const MAX_FORWARDED_UPSTREAM_RESPONSE_HEADER_BYTES = 768; +export const MAX_FORWARDED_UPSTREAM_RESPONSE_HEADER_BYTES = resolveForwardedHeaderBudget(); const MAX_LOGGED_DROPPED_RESPONSE_HEADERS = 20; const responseHeaderEncoder = new TextEncoder(); diff --git a/open-sse/handlers/chatCore/sanitization.ts b/open-sse/handlers/chatCore/sanitization.ts index 62b43615ed..b93f3ac2c3 100644 --- a/open-sse/handlers/chatCore/sanitization.ts +++ b/open-sse/handlers/chatCore/sanitization.ts @@ -46,7 +46,7 @@ export function sanitizeChatRequestBody( } if (Array.isArray(body.tools)) { - body.tools = body.tools.filter((tool: Record) => { + const tools = body.tools.filter((tool: Record) => { const toolType = typeof tool.type === "string" ? tool.type : ""; if (toolType && toolType !== "function" && !tool.function && tool.name === undefined) { return true; @@ -56,7 +56,7 @@ export function sanitizeChatRequestBody( return name && String(name).trim().length > 0; }); - body.tools = body.tools.map((tool) => sanitizeOpenAITool(tool) as (typeof body.tools)[number]); + body.tools = tools.map((tool) => sanitizeOpenAITool(tool)); } return body; diff --git a/open-sse/handlers/chatCore/targetFormat.ts b/open-sse/handlers/chatCore/targetFormat.ts index e5f00eb81a..cde4be6162 100644 --- a/open-sse/handlers/chatCore/targetFormat.ts +++ b/open-sse/handlers/chatCore/targetFormat.ts @@ -46,13 +46,15 @@ export function resolveChatCoreTargetFormat(opts: { sourceFormat === FORMATS.CLAUDE) ? sourceFormat : undefined; + // #8994: model-level targetFormat overrides (from registry or custom-model DB override) + // take precedence over apiFormat="responses" — otherwise Vertex Claude models with + // targetFormat="claude" get wrongly routed to OpenAI Responses format. let targetFormat = - apiFormat === "responses" + modelTargetFormat || + customModelTargetFormat || + (apiFormat === "responses" ? FORMATS.OPENAI_RESPONSES - : modelTargetFormat || - customModelTargetFormat || - inferredAgentRouterTargetFormat || - getTargetFormat(provider, providerSpecificData); + : inferredAgentRouterTargetFormat || getTargetFormat(provider, providerSpecificData)); if (nativeXaiResponsesPassthrough) targetFormat = FORMATS.OPENAI_RESPONSES; return { alias, targetFormat }; } diff --git a/open-sse/handlers/chatCore/upstreamExecuteHeaders.ts b/open-sse/handlers/chatCore/upstreamExecuteHeaders.ts index cb8adae950..fcf14196ec 100644 --- a/open-sse/handlers/chatCore/upstreamExecuteHeaders.ts +++ b/open-sse/handlers/chatCore/upstreamExecuteHeaders.ts @@ -12,6 +12,7 @@ import { getModelUpstreamExtraHeaders } from "@/lib/db/models"; import { resolveModelAlias } from "../../services/modelDeprecation.ts"; import { CPA_FORCE_FAST_MODE_HEADER, shouldRequestClaudeFastMode } from "@/lib/providers/claudeFastMode"; +import { isForbiddenCustomHeaderName } from "@/shared/constants/upstreamHeaders"; export function buildUpstreamHeadersForExecute(opts: { modelToCall: string; @@ -21,6 +22,7 @@ export function buildUpstreamHeadersForExecute(opts: { resolvedModel: string; sourceFormat: string; connectionCustomUserAgent: string; + connectionCustomHeaders?: Record; settings: unknown; }): Record { const { @@ -31,6 +33,7 @@ export function buildUpstreamHeadersForExecute(opts: { resolvedModel, sourceFormat, connectionCustomUserAgent, + connectionCustomHeaders, settings, } = opts; @@ -55,6 +58,23 @@ export function buildUpstreamHeadersForExecute(opts: { } } + // #8369: merge connection-level custom headers UNDER model-level so model-level wins on the + // same case-insensitive header name. Forbidden header names (hop-by-hop, auth) are silently + // skipped via isForbiddenCustomHeaderName(). + if (connectionCustomHeaders) { + for (const [key, value] of Object.entries(connectionCustomHeaders)) { + const keyLower = key.trim().toLowerCase(); + if (!keyLower) continue; + if (isForbiddenCustomHeaderName(key)) continue; + const existingKey = Object.keys(upstreamHeaders).find( + (k) => k.toLowerCase() === keyLower + ); + if (!existingKey) { + upstreamHeaders[key] = value; + } + } + } + // Claude Fast Mode opt-in. When enabled in Settings > AI AND the target provider is the canonical // Anthropic `claude` provider (Claude Code-compatible CPA bridges are excluded since they select // their own entrypoint) AND the model id matches the configured list, signal to a paired diff --git a/open-sse/handlers/imageGeneration/providers/adobeFirefly.ts b/open-sse/handlers/imageGeneration/providers/adobeFirefly.ts index 4270894188..24f2ba361d 100644 --- a/open-sse/handlers/imageGeneration/providers/adobeFirefly.ts +++ b/open-sse/handlers/imageGeneration/providers/adobeFirefly.ts @@ -15,15 +15,14 @@ import { saveImageErrorResult, saveImageSuccessResult } from "../../imageGenerat import { AdobeFireflyError, adobeFireflyGenerateImage, + adobeFireflyImageTimeoutMs, + adobeFireflyMaxImageRefs, resolveAdobeAccessToken, resolveAdobeSourceImageIds, resolveAdobeImageModel, } from "../../../services/adobeFireflyClient.ts"; - -function normalizePositiveNumber(value: unknown, fallback: number): number { - const n = Number(value); - return Number.isFinite(n) && n > 0 ? n : fallback; -} +import { isAdobeFireflyUpscaleModel } from "../../../services/adobeFireflyUpscale.ts"; +import { handleAdobeFireflyImageUpscale } from "../../imageUpscale/adobeFirefly.ts"; export async function handleAdobeFireflyImageGeneration({ model, @@ -57,6 +56,19 @@ export async function handleAdobeFireflyImageGeneration({ }) { const startTime = Date.now(); const prompt = typeof body.prompt === "string" ? body.prompt.trim() : ""; + + // Topaz upscalers share adobe-firefly but use /v2/3p-images/upsample (no prompt). + if (isAdobeFireflyUpscaleModel(model)) { + return handleAdobeFireflyImageUpscale({ + model, + provider, + body: body as Record, + credentials, + log, + fetchImpl, + }); + } + if (!prompt) { return saveImageErrorResult({ provider, @@ -69,7 +81,6 @@ export async function handleAdobeFireflyImageGeneration({ try { const accessToken = await resolveAdobeAccessToken(credentials, fetchImpl); - const timeoutMs = normalizePositiveNumber(body.timeout_ms, 180_000); const seed = typeof body.seed === "number" ? body.seed @@ -87,12 +98,10 @@ export async function handleAdobeFireflyImageGeneration({ ? credentials.accessToken : undefined); - // Cap uploads by model family (matches MediaViewModel GetSourceImageLimit). + // Cap uploads by model family. gpt-image: 2 subject refs max (3–4+ stalls colligo → 504). + // nano: 4 general refs for multi-panel composition. const { id: resolvedId } = resolveAdobeImageModel(model); - const maxRefs = - resolvedId.includes("nano-banana") || resolvedId.includes("gpt-image") - ? 4 - : 2; + const maxRefs = adobeFireflyMaxImageRefs(resolvedId); const sourceImageIds = await resolveAdobeSourceImageIds({ accessToken, @@ -104,10 +113,22 @@ export async function handleAdobeFireflyImageGeneration({ log, }); + const explicitTimeout = + typeof body.timeout_ms === "number" + ? body.timeout_ms + : typeof body.timeout_ms === "string" && body.timeout_ms.trim() + ? Number(body.timeout_ms) + : undefined; + const timeoutMs = adobeFireflyImageTimeoutMs({ + timeoutMs: explicitTimeout, + refCount: sourceImageIds.length, + }); + log?.info?.( "IMAGE", `${provider}/${model} (adobe-firefly) | prompt: "${prompt.slice(0, 60)}${prompt.length > 60 ? "..." : ""}"` + - (sourceImageIds.length ? ` | refs: ${sourceImageIds.length}` : "") + (sourceImageIds.length ? ` | refs: ${sourceImageIds.length}/${maxRefs}` : "") + + ` | pollTimeoutMs=${timeoutMs}` ); const result = await adobeFireflyGenerateImage({ diff --git a/open-sse/handlers/imageUpscale.ts b/open-sse/handlers/imageUpscale.ts new file mode 100644 index 0000000000..0c8956a18d --- /dev/null +++ b/open-sse/handlers/imageUpscale.ts @@ -0,0 +1,110 @@ +/** + * Image Upscale Handler + * + * Handles `POST /v1/images/upscale` — image→image super-resolution. + * + * Request (OpenAI-adjacent, deliberately minimal): + * { + * "model": "adobe-firefly/topaz-bloom", + * "image": "data:image/png;base64,...", // or image_url / http(s) URL + * "factor": 2, // 2 | 4 (snapped to what the model supports) + * "creativity": 40, // 0-100 % (generative upscalers only) + * "prompt": "…", // required by Stability conservative/creative + * "response_format": "url" | "b64_json" + * } + * + * Response is shaped like `/v1/images/generations` (`{ created, data: [{ url | b64_json }] }`) + * plus an `upscale` metadata block, so existing image clients need no changes. + */ + +import { getUpscaleProvider, parseUpscaleModel } from "../config/upscaleRegistry.ts"; +import { handleAdobeFireflyImageUpscale } from "./imageUpscale/adobeFirefly.ts"; +import { handleStabilityImageUpscale } from "./imageUpscale/stability.ts"; +import { handleTopazImageUpscale } from "./imageUpscale/topaz.ts"; +import type { + UpscaleCredentials, + UpscaleHandlerResult, + UpscaleLogger, +} from "./imageUpscale/shared.ts"; + +export type { UpscaleHandlerResult } from "./imageUpscale/shared.ts"; + +export async function handleImageUpscale({ + body, + credentials, + log, + fetchImpl, +}: { + body: Record; + credentials: UpscaleCredentials | null; + log?: UpscaleLogger; + fetchImpl?: typeof fetch; +}): Promise { + const requestedModel = typeof body.model === "string" ? body.model : ""; + const { provider, model } = parseUpscaleModel(requestedModel); + + if (!provider || !model) { + return { + success: false, + status: 400, + error: + `Invalid upscale model: ${requestedModel || "(missing)"}. ` + + `Use format: provider/model (e.g. adobe-firefly/topaz-bloom).`, + }; + } + + const providerConfig = getUpscaleProvider(provider); + if (!providerConfig) { + return { success: false, status: 400, error: `Unknown upscale provider: ${provider}` }; + } + + if (!providerConfig.models.some((entry) => entry.id === model)) { + return { + success: false, + status: 400, + error: + `Unsupported upscale model for ${provider}: ${model}. ` + + `Available: ${providerConfig.models.map((entry) => entry.id).join(", ")}.`, + }; + } + + const resolvedCredentials = credentials ?? {}; + + switch (providerConfig.format) { + case "adobe-firefly-upscale": + return handleAdobeFireflyImageUpscale({ + model, + provider, + body, + credentials: resolvedCredentials, + log, + ...(fetchImpl ? { fetchImpl } : {}), + }); + case "stability-upscale": + return handleStabilityImageUpscale({ + model, + provider, + providerConfig, + body, + credentials: resolvedCredentials, + log, + ...(fetchImpl ? { fetchImpl } : {}), + }); + case "topaz-upscale": + return handleTopazImageUpscale({ + model, + provider, + providerConfig, + body, + credentials: resolvedCredentials, + log, + ...(fetchImpl ? { fetchImpl } : {}), + }); + default: + return { + success: false, + status: 400, + error: `Upscale is not implemented for provider format: ${providerConfig.format}`, + }; + } +} diff --git a/open-sse/handlers/imageUpscale/adobeFirefly.ts b/open-sse/handlers/imageUpscale/adobeFirefly.ts new file mode 100644 index 0000000000..63b8b7c277 --- /dev/null +++ b/open-sse/handlers/imageUpscale/adobeFirefly.ts @@ -0,0 +1,177 @@ +/** + * Adobe Firefly upscale handler — Topaz Labs models on firefly-3p `/v2/3p-images/upsample`. + * + * Flow (mirrors the SPA and the Firefly generate path): + * 1. Resolve the durable session (JWT + Cookie → ARP rebuild, sticky ARP, submit gate). + * 2. Upload the source image to `/v2/storage/image` → blob id, reusing that ARP. + * 3. POST the upsample job, poll the BKS result link, return the presigned URL. + */ + +import { + AdobeFireflyError, + resolveAdobeAccessToken, + resolveAdobeSourceImageIds, +} from "../../services/adobeFireflyClient.ts"; +import { + adobeFireflyUpscaleImage, + resolveAdobeUpscaleModel, +} from "../../services/adobeFireflyUpscale.ts"; +import { sanitizeErrorMessage } from "../../utils/error.ts"; +import { + extractUpscaleSourceImage, + saveUpscaleErrorResult, + saveUpscaleSuccessResult, + type UpscaleCredentials, + type UpscaleHandlerResult, + type UpscaleLogger, +} from "./shared.ts"; + +export async function handleAdobeFireflyImageUpscale({ + model, + provider, + body, + credentials, + log, + fetchImpl = fetch, +}: { + model: string; + provider: string; + body: Record; + credentials: UpscaleCredentials; + log?: UpscaleLogger; + fetchImpl?: typeof fetch; +}): Promise { + const startTime = Date.now(); + + const resolved = resolveAdobeUpscaleModel(model); + if (!resolved) { + return saveUpscaleErrorResult({ + provider, + model, + status: 400, + startTime, + error: `Unsupported Adobe Firefly upscale model: ${model}. Use topaz-standard or topaz-bloom.`, + }); + } + + if (!extractUpscaleSourceImage(body)) { + return saveUpscaleErrorResult({ + provider, + model, + status: 400, + startTime, + error: "Adobe Firefly upscale requires a source image", + }); + } + + try { + const accessToken = await resolveAdobeAccessToken(credentials, fetchImpl); + // Keep the raw credential blob for Cookie + sherlockToken (x-arp-session-id). + const psd = (credentials as { providerSpecificData?: { cookie?: string } })?.providerSpecificData; + const sessionCookie = + (typeof psd?.cookie === "string" && psd.cookie.trim()) || + (typeof credentials?.apiKey === "string" && credentials.apiKey.trim()) || + (typeof credentials?.accessToken === "string" && credentials.accessToken.includes(";") + ? credentials.accessToken + : undefined); + + // Upscale consumes exactly one source; upload it under the same ARP as submit. + const blobIds = await resolveAdobeSourceImageIds({ + accessToken, + body, + max: 1, + sessionCookie, + prompt: "upsample", + fetchImpl, + log, + }); + + if (blobIds.length === 0) { + return saveUpscaleErrorResult({ + provider, + model, + status: 400, + startTime, + error: "Adobe Firefly upscale could not resolve the source image", + }); + } + + const timeoutMs = normalizePositiveNumber(body.timeout_ms, 0); + const result = await adobeFireflyUpscaleImage({ + accessToken, + model, + blobId: blobIds[0]!, + upsamplerFactor: readFactor(body), + creativityPercent: readCreativityPercent(body), + creativityLevel: body.creativity_level ?? body.creativityLevel, + sessionCookie, + ...(timeoutMs > 0 ? { timeoutMs } : {}), + fetchImpl, + log, + }); + + log?.info?.( + "IMAGE", + `${provider}/${model} (adobe-firefly upsample) | ${result.factor}x` + + (resolved.spec.supportsCreativity ? ` | creativityLevel=${result.creativityLevel}` : "") + ); + + return saveUpscaleSuccessResult({ + provider, + model, + startTime, + images: [{ url: result.url }], + meta: { + provider, + model, + factor: result.factor, + ...(resolved.spec.supportsCreativity ? { creativity_level: result.creativityLevel } : {}), + }, + }); + } catch (err) { + if (err instanceof AdobeFireflyError) { + log?.error?.("IMAGE", `${provider} adobe-firefly upscale error ${err.status}: ${err.message}`); + return saveUpscaleErrorResult({ + provider, + model, + status: err.status, + startTime, + error: err.message, + }); + } + const errorText = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + log?.error?.("IMAGE", `${provider} adobe-firefly upscale exception: ${errorText}`); + return saveUpscaleErrorResult({ + provider, + model, + status: 500, + startTime, + error: errorText, + }); + } +} + +function readFactor(body: Record): unknown { + return ( + body.factor ?? + body.scale ?? + body.upscale_factor ?? + body.upscaleFactor ?? + body.upsampler_factor ?? + body.upsamplerFactor + ); +} + +function readCreativityPercent(body: Record): number | undefined { + const raw = body.creativity ?? body.creativity_percent ?? body.creativityPercent; + if (raw === undefined || raw === null) return undefined; + const n = typeof raw === "number" ? raw : Number(String(raw).replace("%", "").trim()); + if (!Number.isFinite(n)) return undefined; + if (n > 0 && n < 1) return Math.max(0, Math.min(100, n * 100)); + return Math.max(0, Math.min(100, n)); +} + +function normalizePositiveNumber(value: unknown, fallback: number): number { + const n = Number(value); + return Number.isFinite(n) && n > 0 ? n : fallback; +} diff --git a/open-sse/handlers/imageUpscale/shared.ts b/open-sse/handlers/imageUpscale/shared.ts new file mode 100644 index 0000000000..cf37e99910 --- /dev/null +++ b/open-sse/handlers/imageUpscale/shared.ts @@ -0,0 +1,391 @@ +/** + * Shared plumbing for the `/v1/images/upscale` provider handlers. + * + * Kept separate from `handlers/imageGeneration.ts` on purpose: upscaling needs raw + * source bytes + pixel dimensions (to turn a 2x/4x factor into an output size for + * providers that only accept absolute targets), neither of which the generation + * handler exposes. + */ + +import { saveCallLog } from "@/lib/usageDb"; +import { fetchRemoteImage } from "@/shared/network/remoteImageFetch"; + +export const UPSCALE_CALL_LOG_PATH = "/v1/images/upscale"; + +/** Hard cap on a decoded source image (matches the Firefly storage upload limit). */ +export const MAX_UPSCALE_SOURCE_BYTES = 20 * 1024 * 1024; + +export interface UpscaleImageSource { + buffer: Buffer; + base64: string; + contentType: string; +} + +export interface UpscaleHandlerResult { + success: boolean; + status?: number; + error?: unknown; + data?: unknown; +} + +export interface UpscaleLogger { + info?: (scope: string, message: string) => void; + error?: (scope: string, message: string) => void; +} + +/** + * Credential shape the upscale handlers need. Mirrors what + * `getProviderCredentialsWithQuotaPreflight` yields for these providers: an API key or + * access token, plus (for Adobe Firefly) the connection's `providerSpecificData`, which + * is where a pasted firefly.adobe.com Cookie lives. + */ +export interface UpscaleCredentials { + apiKey?: string; + accessToken?: string; + providerSpecificData?: { + cookie?: unknown; + access_token?: unknown; + accessToken?: unknown; + } | null; +} + +/** + * `Buffer` is typed as `Buffer`, which TypeScript will not accept as a + * `BlobPart` (a Blob part must be backed by a plain `ArrayBuffer`). Copy the bytes into a + * fresh `ArrayBuffer` so multipart bodies typecheck without an unsafe cast. + */ +export function toBlobBytes(buffer: Buffer): ArrayBuffer { + const out = new ArrayBuffer(buffer.byteLength); + new Uint8Array(out).set(buffer); + return out; +} + +/** + * Collect the source image from an OpenAI-ish / Media-page body. + * + * Only ONE image is meaningful for an upscale, so the first resolvable candidate + * wins. Field order mirrors `extractAdobeSourceImageSources` so a body built for + * generation keeps working here. + */ +export function extractUpscaleSourceImage(body: unknown): string | null { + if (!body || typeof body !== "object") return null; + const b = body as Record; + const providerOptions = + b.provider_options && typeof b.provider_options === "object" && !Array.isArray(b.provider_options) + ? (b.provider_options as Record) + : {}; + + const keys = [ + "image_url", + "imageUrl", + "input_image", + "source_image", + "promptImage", + "prompt_image", + "image", + "images", + "image_urls", + "imageUrls", + "input_images", + "reference_images", + "referenceImages", + "reference_image", + ]; + + for (const key of keys) { + const found = firstImageCandidate(b[key]) || firstImageCandidate(providerOptions[key]); + if (found) return found; + } + + if (Array.isArray(b.messages)) { + for (const msg of b.messages) { + if (!msg || typeof msg !== "object") continue; + const content = (msg as Record).content; + if (!Array.isArray(content)) continue; + for (const part of content) { + if (!part || typeof part !== "object") continue; + const p = part as Record; + if (p.type === "image_url" || p.type === "image") { + const found = firstImageCandidate(p.image_url ?? p.image ?? p.url); + if (found) return found; + } + } + } + } + + return null; +} + +function firstImageCandidate(value: unknown): string | null { + if (typeof value === "string") { + const trimmed = value.trim(); + if (!trimmed || trimmed === "null" || trimmed === "undefined") return null; + return trimmed; + } + if (Array.isArray(value)) { + for (const item of value) { + const found = firstImageCandidate(item); + if (found) return found; + } + return null; + } + if (value && typeof value === "object") { + const o = value as Record; + if (typeof o.url === "string") return firstImageCandidate(o.url); + if (typeof o.image_url === "string") return firstImageCandidate(o.image_url); + if (o.image_url && typeof o.image_url === "object") { + return firstImageCandidate((o.image_url as Record).url); + } + if (typeof o.b64_json === "string") return `data:image/png;base64,${o.b64_json}`; + if (typeof o.base64 === "string") return `data:image/png;base64,${o.base64}`; + } + return null; +} + +/** Decode a data URL / http(s) URL / bare base64 string into bytes. */ +export async function resolveUpscaleImageSource(source: string): Promise { + const trimmed = String(source || "").trim(); + if (!trimmed) throw new Error("Invalid image source"); + + const dataUri = /^data:([^;,]+)?(?:;charset=[^;,]+)?;base64,([\s\S]+)$/i.exec(trimmed); + if (dataUri) { + const contentType = (dataUri[1] || "image/png").trim().toLowerCase(); + const base64 = (dataUri[2] || "").replace(/\s/g, ""); + const buffer = Buffer.from(base64, "base64"); + assertSourceBytes(buffer); + return { + buffer, + base64, + contentType: contentType.startsWith("image/") ? contentType : "image/png", + }; + } + + if (/^https?:\/\//i.test(trimmed)) { + const remote = await fetchRemoteImage(trimmed); + assertSourceBytes(remote.buffer); + // fetchRemoteImage falls back to application/octet-stream; sniff whenever the + // server did not send a usable image/* type so multipart uploads stay correct. + const declared = (remote.contentType || "").split(";")[0]!.trim().toLowerCase(); + return { + buffer: remote.buffer, + base64: remote.buffer.toString("base64"), + contentType: declared.startsWith("image/") ? declared : sniffImageMime(remote.buffer), + }; + } + + const buffer = Buffer.from(trimmed.replace(/\s/g, ""), "base64"); + assertSourceBytes(buffer); + return { buffer, base64: buffer.toString("base64"), contentType: sniffImageMime(buffer) }; +} + +function assertSourceBytes(buffer: Buffer): void { + if (!buffer.length) throw new Error("Source image decoded to empty bytes"); + if (buffer.length > MAX_UPSCALE_SOURCE_BYTES) { + throw new Error( + `Source image too large (${buffer.length} bytes; max ${MAX_UPSCALE_SOURCE_BYTES})` + ); + } +} + +/** Best-effort MIME sniff from the magic bytes (falls back to PNG). */ +export function sniffImageMime(buffer: Buffer): string { + if (buffer.length >= 3 && buffer[0] === 0xff && buffer[1] === 0xd8 && buffer[2] === 0xff) { + return "image/jpeg"; + } + if (buffer.length >= 8 && buffer[0] === 0x89 && buffer.toString("ascii", 1, 4) === "PNG") { + return "image/png"; + } + if (buffer.length >= 6 && buffer.toString("ascii", 0, 3) === "GIF") return "image/gif"; + if ( + buffer.length >= 12 && + buffer.toString("ascii", 0, 4) === "RIFF" && + buffer.toString("ascii", 8, 12) === "WEBP" + ) { + return "image/webp"; + } + if (buffer.length >= 2 && buffer.toString("ascii", 0, 2) === "BM") return "image/bmp"; + return "image/png"; +} + +/** + * Read pixel dimensions straight from the container header — no image library needed. + * Supports PNG, JPEG (SOFn scan), GIF, WebP (VP8 / VP8L / VP8X) and BMP. + * Returns null when the format is unknown or the header is truncated. + */ +export function readImageDimensions(buffer: Buffer): { width: number; height: number } | null { + try { + if ( + buffer.length >= 24 && + buffer[0] === 0x89 && + buffer.toString("ascii", 1, 4) === "PNG" + ) { + // IHDR is always the first chunk: 8-byte signature + 4 length + 4 "IHDR". + return { width: buffer.readUInt32BE(16), height: buffer.readUInt32BE(20) }; + } + + if (buffer.length >= 6 && buffer.toString("ascii", 0, 3) === "GIF") { + return { width: buffer.readUInt16LE(6), height: buffer.readUInt16LE(8) }; + } + + if (buffer.length >= 26 && buffer.toString("ascii", 0, 2) === "BM") { + return { width: buffer.readInt32LE(18), height: Math.abs(buffer.readInt32LE(22)) }; + } + + if ( + buffer.length >= 30 && + buffer.toString("ascii", 0, 4) === "RIFF" && + buffer.toString("ascii", 8, 12) === "WEBP" + ) { + return readWebpDimensions(buffer); + } + + if (buffer.length >= 4 && buffer[0] === 0xff && buffer[1] === 0xd8) { + return readJpegDimensions(buffer); + } + } catch { + return null; + } + return null; +} + +function readWebpDimensions(buffer: Buffer): { width: number; height: number } | null { + const chunk = buffer.toString("ascii", 12, 16); + if (chunk === "VP8 " && buffer.length >= 30) { + // Lossy: 3-byte frame tag + 3-byte sync code, then 14-bit width/height. + return { + width: buffer.readUInt16LE(26) & 0x3fff, + height: buffer.readUInt16LE(28) & 0x3fff, + }; + } + if (chunk === "VP8L" && buffer.length >= 25) { + const bits = buffer.readUInt32LE(21); + return { width: (bits & 0x3fff) + 1, height: ((bits >> 14) & 0x3fff) + 1 }; + } + if (chunk === "VP8X" && buffer.length >= 30) { + const width = 1 + (buffer[24]! | (buffer[25]! << 8) | (buffer[26]! << 16)); + const height = 1 + (buffer[27]! | (buffer[28]! << 8) | (buffer[29]! << 16)); + return { width, height }; + } + return null; +} + +function readJpegDimensions(buffer: Buffer): { width: number; height: number } | null { + let offset = 2; + while (offset + 9 < buffer.length) { + if (buffer[offset] !== 0xff) { + offset += 1; + continue; + } + const marker = buffer[offset + 1]!; + // Standalone markers (no length payload). + if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) { + offset += 2; + continue; + } + const length = buffer.readUInt16BE(offset + 2); + // SOF0..SOF15 except DHT(c4)/JPGA(c8)/DAC(cc) carry the frame dimensions. + const isSof = + marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc; + if (isSof) { + return { height: buffer.readUInt16BE(offset + 5), width: buffer.readUInt16BE(offset + 7) }; + } + if (length <= 0) return null; + offset += 2 + length; + } + return null; +} + +/** + * Absolute output size for a scale factor, clamped to `maxEdge` so a 4x pass on an + * already-large source cannot ask for an impossible canvas. Returns null when the + * source dimensions could not be read. + */ +export function scaleDimensions( + buffer: Buffer, + factor: number, + maxEdge = 32000 +): { width: number; height: number } | null { + const source = readImageDimensions(buffer); + if (!source || source.width <= 0 || source.height <= 0) return null; + const safeFactor = Number.isFinite(factor) && factor > 0 ? factor : 2; + const scale = Math.min( + safeFactor, + maxEdge / Math.max(source.width, source.height) + ); + return { + width: Math.max(1, Math.round(source.width * Math.max(1, scale))), + height: Math.max(1, Math.round(source.height * Math.max(1, scale))), + }; +} + +/** OpenAI-images-shaped success envelope + call log. */ +export function saveUpscaleSuccessResult(opts: { + provider: string; + model: string; + startTime: number; + images: Array>; + requestBody?: unknown; + responseBody?: unknown; + meta?: Record; +}): UpscaleHandlerResult { + saveCallLog({ + method: "POST", + path: UPSCALE_CALL_LOG_PATH, + status: 200, + model: `${opts.provider}/${opts.model}`, + provider: opts.provider, + duration: Date.now() - opts.startTime, + requestBody: opts.requestBody ?? null, + responseBody: opts.responseBody ?? { images_count: opts.images.length }, + }).catch(() => {}); + + return { + success: true, + data: { + created: Math.floor(Date.now() / 1000), + data: opts.images, + ...(opts.meta ? { upscale: opts.meta } : {}), + }, + }; +} + +export function saveUpscaleErrorResult(opts: { + provider: string; + model: string; + status: number; + startTime: number; + error: unknown; + requestBody?: unknown; +}): UpscaleHandlerResult { + saveCallLog({ + method: "POST", + path: UPSCALE_CALL_LOG_PATH, + status: opts.status, + model: `${opts.provider}/${opts.model}`, + provider: opts.provider, + duration: Date.now() - opts.startTime, + error: + typeof opts.error === "string" + ? opts.error.slice(0, 500) + : String(opts.error).slice(0, 500), + requestBody: opts.requestBody ?? null, + }).catch(() => {}); + + return { success: false, status: opts.status, error: opts.error }; +} + +/** `{ url }` or `{ b64_json }` depending on the requested response_format. */ +export function buildUpscaleImageEntry(opts: { + buffer?: Buffer | null; + contentType?: string; + url?: string | null; + responseFormat?: unknown; +}): Record { + const wantsBase64 = String(opts.responseFormat ?? "").toLowerCase() === "b64_json"; + if (opts.buffer && opts.buffer.length > 0) { + const base64 = opts.buffer.toString("base64"); + const mime = opts.contentType || sniffImageMime(opts.buffer); + return wantsBase64 ? { b64_json: base64 } : { url: `data:${mime};base64,${base64}` }; + } + return { url: String(opts.url || "") }; +} diff --git a/open-sse/handlers/imageUpscale/stability.ts b/open-sse/handlers/imageUpscale/stability.ts new file mode 100644 index 0000000000..4b323ea222 --- /dev/null +++ b/open-sse/handlers/imageUpscale/stability.ts @@ -0,0 +1,335 @@ +/** + * Stability AI upscale handler — `/v2beta/stable-image/upscale/{fast,conservative,creative}`. + * + * Wire contract (platform.stability.ai): + * - all three take multipart/form-data with an `image` part + * - `Accept: application/json` → `{ image: , finish_reason, seed }` + * - `fast` : no prompt, fixed 4x + * - `conservative` : prompt REQUIRED, `creativity` 0.2-0.5 (default 0.35), synchronous + * - `creative` : prompt REQUIRED, `creativity` 0-0.35 (default 0.3), **async** — + * responds `{ id }`, then `GET /v2beta/results/{id}` returns 202 while + * running and 200 with the base64 image when finished. + * + * The generation handler's stability path does not poll, so the async `creative` + * variant is implemented here rather than delegated. + */ + +import { + buildUpscaleImageEntry, + extractUpscaleSourceImage, + resolveUpscaleImageSource, + saveUpscaleErrorResult, + saveUpscaleSuccessResult, + toBlobBytes, + type UpscaleCredentials, + type UpscaleHandlerResult, + type UpscaleLogger, +} from "./shared.ts"; +import { sanitizeErrorMessage } from "../../utils/error.ts"; + +const UPSCALE_ENDPOINTS: Record = { + fast: "/v2beta/stable-image/upscale/fast", + conservative: "/v2beta/stable-image/upscale/conservative", + creative: "/v2beta/stable-image/upscale/creative", +}; + +/** Documented `creativity` range per model — a 0-100 % request is mapped into it. */ +const CREATIVITY_RANGES: Record = { + conservative: { min: 0.2, max: 0.5, fallback: 0.35 }, + creative: { min: 0, max: 0.35, fallback: 0.3 }, +}; + +/** Models whose upstream rejects a request without a prompt. */ +const PROMPT_REQUIRED = new Set(["conservative", "creative"]); + +/** `creative` is an async job. */ +const ASYNC_MODELS = new Set(["creative"]); + +const RESULT_POLL_INTERVAL_MS = 3000; +const DEFAULT_RESULT_TIMEOUT_MS = 300_000; +const ALLOWED_OUTPUT_FORMATS = ["png", "jpeg", "webp"]; + +export async function handleStabilityImageUpscale({ + model, + provider, + providerConfig, + body, + credentials, + log, + fetchImpl = fetch, +}: { + model: string; + provider: string; + providerConfig: { baseUrl: string }; + body: Record; + credentials: UpscaleCredentials; + log?: UpscaleLogger; + fetchImpl?: typeof fetch; +}): Promise { + const startTime = Date.now(); + const endpoint = UPSCALE_ENDPOINTS[model]; + if (!endpoint) { + return saveUpscaleErrorResult({ + provider, + model, + status: 400, + startTime, + error: `Unsupported Stability AI upscale model: ${model}. Use fast, conservative or creative.`, + }); + } + + const token = credentials.apiKey || credentials.accessToken; + if (!token) { + return saveUpscaleErrorResult({ + provider, + model, + status: 401, + startTime, + error: "Missing Stability AI API key", + }); + } + + const source = extractUpscaleSourceImage(body); + if (!source) { + return saveUpscaleErrorResult({ + provider, + model, + status: 400, + startTime, + error: `Stability AI upscale model ${model} requires a source image`, + }); + } + + const prompt = typeof body.prompt === "string" ? body.prompt.trim() : ""; + if (PROMPT_REQUIRED.has(model) && !prompt) { + return saveUpscaleErrorResult({ + provider, + model, + status: 400, + startTime, + error: + `Stability AI "${model}" upscale requires a prompt describing the image. ` + + `Use the "fast" model for a prompt-free 4x upscale.`, + }); + } + + const outputFormat = normalizeOutputFormat(body.output_format ?? body.format); + const creativity = CREATIVITY_RANGES[model] + ? mapCreativity(body, CREATIVITY_RANGES[model]!) + : null; + + const requestSummary: Record = { model, output_format: outputFormat }; + if (prompt) requestSummary.prompt = prompt; + if (creativity !== null) requestSummary.creativity = creativity; + + try { + const imageSource = await resolveUpscaleImageSource(source); + + const formData = new FormData(); + formData.append( + "image", + new Blob([toBlobBytes(imageSource.buffer)], { type: imageSource.contentType || "image/png" }), + "image" + ); + formData.append("output_format", outputFormat); + if (prompt) formData.append("prompt", prompt); + if (typeof body.negative_prompt === "string" && body.negative_prompt.trim()) { + formData.append("negative_prompt", body.negative_prompt.trim()); + } + if (creativity !== null) formData.append("creativity", String(creativity)); + if (body.seed !== undefined && body.seed !== null && String(body.seed).trim()) { + formData.append("seed", String(body.seed)); + } + if (typeof body.style_preset === "string" && body.style_preset.trim()) { + formData.append("style_preset", body.style_preset.trim()); + } + + log?.info?.( + "IMAGE", + `${provider}/${model} (stability upscale)` + + (creativity !== null ? ` | creativity=${creativity}` : "") + + ` | output=${outputFormat}` + ); + + const baseUrl = providerConfig.baseUrl.replace(/\/$/, ""); + const response = await fetchImpl(`${baseUrl}${endpoint}`, { + method: "POST", + headers: { Accept: "application/json", Authorization: `Bearer ${token}` }, + body: formData, + }); + + if (!response.ok) { + const errorText = await response.text().catch(() => ""); + log?.error?.( + "IMAGE", + `${provider} stability upscale error ${response.status}: ${errorText.slice(0, 200)}` + ); + return saveUpscaleErrorResult({ + provider, + model, + status: response.status, + startTime, + error: errorText || `HTTP ${response.status}`, + requestBody: requestSummary, + }); + } + + const payload = (await response.json().catch(() => ({}))) as Record; + + let finalPayload = payload; + if (ASYNC_MODELS.has(model) && typeof payload.id === "string" && payload.id) { + finalPayload = await pollStabilityResult({ + baseUrl, + token, + id: payload.id, + timeoutMs: normalizePositiveNumber(body.timeout_ms, DEFAULT_RESULT_TIMEOUT_MS), + fetchImpl, + log, + }); + } + + const finishReason = String(finalPayload.finish_reason ?? "").toUpperCase(); + if (finishReason === "CONTENT_FILTERED") { + return saveUpscaleErrorResult({ + provider, + model, + status: 400, + startTime, + error: "Stability AI filtered the upscale result (CONTENT_FILTERED)", + requestBody: requestSummary, + }); + } + + const base64 = typeof finalPayload.image === "string" ? finalPayload.image : ""; + if (!base64) { + return saveUpscaleErrorResult({ + provider, + model, + status: 502, + startTime, + error: "Stability AI upscale returned no image", + requestBody: requestSummary, + }); + } + + const buffer = Buffer.from(base64, "base64"); + return saveUpscaleSuccessResult({ + provider, + model, + startTime, + requestBody: requestSummary, + images: [ + buildUpscaleImageEntry({ + buffer, + contentType: `image/${outputFormat === "jpeg" ? "jpeg" : outputFormat}`, + responseFormat: body.response_format, + }), + ], + meta: { + provider, + model, + factor: 4, + ...(creativity !== null ? { creativity } : {}), + ...(finalPayload.seed !== undefined ? { seed: finalPayload.seed } : {}), + }, + }); + } catch (err) { + const errorText = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + log?.error?.("IMAGE", `${provider} stability upscale exception: ${errorText}`); + return saveUpscaleErrorResult({ + provider, + model, + status: 502, + startTime, + error: `Image upscale provider error: ${errorText}`, + requestBody: requestSummary, + }); + } +} + +/** Poll `GET /v2beta/results/{id}` until the async creative upscale finishes. */ +async function pollStabilityResult(opts: { + baseUrl: string; + token: string; + id: string; + timeoutMs: number; + fetchImpl: typeof fetch; + log?: UpscaleLogger; +}): Promise> { + const deadline = Date.now() + opts.timeoutMs; + let attempt = 0; + + while (Date.now() < deadline) { + attempt += 1; + const response = await opts.fetchImpl( + `${opts.baseUrl}/v2beta/results/${encodeURIComponent(opts.id)}`, + { + method: "GET", + headers: { Accept: "application/json", Authorization: `Bearer ${opts.token}` }, + } + ); + + if (response.status === 202) { + opts.log?.info?.("IMAGE", `stability creative upscale pending #${attempt}`); + await sleep(RESULT_POLL_INTERVAL_MS); + continue; + } + + if (!response.ok) { + const text = await response.text().catch(() => ""); + if (response.status === 429 || response.status >= 500) { + await sleep(RESULT_POLL_INTERVAL_MS); + continue; + } + throw new Error( + `Stability AI upscale result failed (${response.status}): ${text.slice(0, 300)}` + ); + } + + return (await response.json().catch(() => ({}))) as Record; + } + + throw new Error("Stability AI creative upscale timed out"); +} + +function normalizeOutputFormat(value: unknown): string { + const raw = String(value ?? "").trim().toLowerCase(); + if (raw === "jpg") return "jpeg"; + return ALLOWED_OUTPUT_FORMATS.includes(raw) ? raw : "png"; +} + +/** + * Map the API's 0-100 % creativity onto the model's documented float range. + * An explicit in-range float (`creativity: 0.4`) is passed through untouched so + * power users keep exact control. + */ +function mapCreativity( + body: Record, + range: { min: number; max: number; fallback: number } +): number { + const raw = body.creativity ?? body.creativity_percent ?? body.creativityPercent; + if (raw === undefined || raw === null || String(raw).trim() === "") return range.fallback; + + const n = typeof raw === "number" ? raw : Number(String(raw).replace("%", "").trim()); + if (!Number.isFinite(n)) return range.fallback; + + // Values that already look like a native Stability creativity float (< 1 and not a + // whole percent) are honored as-is, clamped to the documented range. + if (n > 0 && n < 1) return round2(Math.max(range.min, Math.min(range.max, n))); + + const percent = Math.max(0, Math.min(100, n)); + return round2(range.min + ((range.max - range.min) * percent) / 100); +} + +function round2(n: number): number { + return Math.round(n * 100) / 100; +} + +function normalizePositiveNumber(value: unknown, fallback: number): number { + const n = Number(value); + return Number.isFinite(n) && n > 0 ? n : fallback; +} + +async function sleep(ms: number): Promise { + await new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/open-sse/handlers/imageUpscale/topaz.ts b/open-sse/handlers/imageUpscale/topaz.ts new file mode 100644 index 0000000000..100102a37b --- /dev/null +++ b/open-sse/handlers/imageUpscale/topaz.ts @@ -0,0 +1,271 @@ +/** + * Topaz Labs upscale handler — native Image API `POST /image/v1/enhance`. + * + * Wire contract (docs.topazlabs.com Image API v1): + * headers: X-API-Key: , accept: image/ + * multipart/form-data: + * image (required) source bytes + * model (optional) e.g. "Standard V2" / "High Fidelity V2" / "Low Resolution V2" + * output_width (optional) absolute target width + * output_height (optional) absolute target height + * output_format (optional) jpeg | png | webp + * sharpen / denoise / fix_compression (optional) 0-1 strengths + * face_enhancement (optional) boolean + * → raw image bytes of the enhanced result. + * + * The endpoint only accepts an ABSOLUTE target size, so a 2x/4x factor is turned into + * `output_width`/`output_height` by reading the source dimensions out of the container + * header (`scaleDimensions`). When the dimensions cannot be read the factor is dropped + * and Topaz's own default upscale applies, rather than failing the request. + */ + +import { + buildUpscaleImageEntry, + extractUpscaleSourceImage, + resolveUpscaleImageSource, + saveUpscaleErrorResult, + saveUpscaleSuccessResult, + scaleDimensions, + sniffImageMime, + toBlobBytes, + type UpscaleCredentials, + type UpscaleHandlerResult, + type UpscaleLogger, +} from "./shared.ts"; +import { sanitizeErrorMessage } from "../../utils/error.ts"; + +/** Topaz caps a single output edge well below this; keeps a 4x pass on a huge source sane. */ +const MAX_OUTPUT_EDGE = 16000; +const ALLOWED_OUTPUT_FORMATS = ["png", "jpeg", "webp"]; + +export async function handleTopazImageUpscale({ + model, + provider, + providerConfig, + body, + credentials, + log, + fetchImpl = fetch, +}: { + model: string; + provider: string; + providerConfig: { baseUrl: string }; + body: Record; + credentials: UpscaleCredentials; + log?: UpscaleLogger; + fetchImpl?: typeof fetch; +}): Promise { + const startTime = Date.now(); + const token = credentials.apiKey || credentials.accessToken; + if (!token) { + return saveUpscaleErrorResult({ + provider, + model, + status: 401, + startTime, + error: "Missing Topaz Labs API key", + }); + } + + const source = extractUpscaleSourceImage(body); + if (!source) { + return saveUpscaleErrorResult({ + provider, + model, + status: 400, + startTime, + error: `Topaz Labs upscale model ${model} requires a source image`, + }); + } + + const factor = normalizeFactor(body); + const outputFormat = normalizeOutputFormat(body.output_format ?? body.format); + const requestSummary: Record = { model, factor, output_format: outputFormat }; + + try { + const imageSource = await resolveUpscaleImageSource(source); + + const formData = new FormData(); + formData.append( + "image", + new Blob([toBlobBytes(imageSource.buffer)], { type: imageSource.contentType || "image/png" }), + "image" + ); + formData.append("output_format", outputFormat); + + const explicitSize = parseExplicitSize(body.size ?? body.output_size); + const target = explicitSize ?? scaleDimensions(imageSource.buffer, factor, MAX_OUTPUT_EDGE); + if (target) { + formData.append("output_width", String(target.width)); + formData.append("output_height", String(target.height)); + requestSummary.output_width = target.width; + requestSummary.output_height = target.height; + } else { + log?.info?.( + "IMAGE", + `${provider}/${model} (topaz upscale) | source dimensions unknown — using Topaz default scale` + ); + } + + const topazModel = typeof body.topaz_model === "string" ? body.topaz_model.trim() : ""; + if (topazModel) { + formData.append("model", topazModel); + requestSummary.topaz_model = topazModel; + } + + appendUnitFloat(formData, "sharpen", body.sharpen, requestSummary); + appendUnitFloat(formData, "denoise", body.denoise, requestSummary); + appendUnitFloat(formData, "fix_compression", body.fix_compression, requestSummary); + + if (body.face_enhancement !== undefined && body.face_enhancement !== null) { + const enabled = toBoolean(body.face_enhancement); + formData.append("face_enhancement", enabled ? "true" : "false"); + requestSummary.face_enhancement = enabled; + // Topaz exposes creativity/strength only when face enhancement is on. + if (enabled) { + appendUnitFloat( + formData, + "face_enhancement_creativity", + body.creativity ?? body.face_enhancement_creativity, + requestSummary, + /* percentAware */ true + ); + appendUnitFloat( + formData, + "face_enhancement_strength", + body.face_enhancement_strength, + requestSummary + ); + } + } + + log?.info?.( + "IMAGE", + `${provider}/${model} (topaz upscale) | ${factor}x` + + (target ? ` → ${target.width}x${target.height}` : "") + + ` | output=${outputFormat}` + ); + + const baseUrl = providerConfig.baseUrl.replace(/\/$/, ""); + const response = await fetchImpl(`${baseUrl}/image/v1/enhance`, { + method: "POST", + headers: { + Accept: `image/${outputFormat}`, + "X-API-Key": token, + }, + body: formData, + }); + + if (!response.ok) { + const errorText = await response.text().catch(() => ""); + log?.error?.( + "IMAGE", + `${provider} topaz upscale error ${response.status}: ${errorText.slice(0, 200)}` + ); + return saveUpscaleErrorResult({ + provider, + model, + status: response.status, + startTime, + error: errorText || `HTTP ${response.status}`, + requestBody: requestSummary, + }); + } + + const buffer = Buffer.from(await response.arrayBuffer()); + if (!buffer.length) { + return saveUpscaleErrorResult({ + provider, + model, + status: 502, + startTime, + error: "Topaz Labs upscale returned an empty body", + requestBody: requestSummary, + }); + } + + const declared = (response.headers.get("content-type") || "").split(";")[0]!.trim().toLowerCase(); + const contentType = declared.startsWith("image/") ? declared : sniffImageMime(buffer); + + return saveUpscaleSuccessResult({ + provider, + model, + startTime, + requestBody: requestSummary, + images: [ + buildUpscaleImageEntry({ buffer, contentType, responseFormat: body.response_format }), + ], + meta: { provider, model, factor, ...(target ? { width: target.width, height: target.height } : {}) }, + }); + } catch (err) { + const errorText = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + log?.error?.("IMAGE", `${provider} topaz upscale exception: ${errorText}`); + return saveUpscaleErrorResult({ + provider, + model, + status: 502, + startTime, + error: `Image upscale provider error: ${errorText}`, + requestBody: requestSummary, + }); + } +} + +function normalizeFactor(body: Record): number { + const raw = + body.factor ?? + body.scale ?? + body.upscale_factor ?? + body.upscaleFactor ?? + body.upsampler_factor ?? + body.upsamplerFactor; + let n = typeof raw === "number" ? raw : Number(String(raw ?? "").replace(/[^\d.]/g, "")); + if (!Number.isFinite(n) || n <= 0) return 2; + return Math.abs(n - 4) < Math.abs(n - 2) ? 4 : 2; +} + +function normalizeOutputFormat(value: unknown): string { + const raw = String(value ?? "").trim().toLowerCase(); + if (raw === "jpg") return "jpeg"; + return ALLOWED_OUTPUT_FORMATS.includes(raw) ? raw : "png"; +} + +function parseExplicitSize(value: unknown): { width: number; height: number } | null { + if (typeof value !== "string") return null; + const match = /^(\d+)\s*[x×]\s*(\d+)$/i.exec(value.trim()); + if (!match) return null; + const width = Number(match[1]); + const height = Number(match[2]); + if (!Number.isFinite(width) || !Number.isFinite(height) || width <= 0 || height <= 0) return null; + return { + width: Math.min(width, MAX_OUTPUT_EDGE), + height: Math.min(height, MAX_OUTPUT_EDGE), + }; +} + +/** + * Append a 0-1 strength. Percent-aware fields also accept 0-100 (the shared UI + * creativity slider), which is divided down; anything non-numeric is skipped. + */ +function appendUnitFloat( + formData: FormData, + key: string, + value: unknown, + summary: Record, + percentAware = false +): void { + if (value === undefined || value === null || String(value).trim() === "") return; + let n = typeof value === "number" ? value : Number(String(value).replace("%", "").trim()); + if (!Number.isFinite(n)) return; + if (percentAware && n > 1) n = n / 100; + n = Math.max(0, Math.min(1, n)); + const rounded = Math.round(n * 100) / 100; + formData.append(key, String(rounded)); + summary[key] = rounded; +} + +function toBoolean(value: unknown): boolean { + if (typeof value === "boolean") return value; + const raw = String(value ?? "").trim().toLowerCase(); + return raw === "true" || raw === "1" || raw === "yes" || raw === "on"; +} diff --git a/open-sse/handlers/responseTranslator.ts b/open-sse/handlers/responseTranslator.ts index 35f66e1087..165e292dc0 100644 --- a/open-sse/handlers/responseTranslator.ts +++ b/open-sse/handlers/responseTranslator.ts @@ -6,7 +6,10 @@ import { import { normalizeOpenAICompatibleFinishReasonString } from "../utils/finishReason.ts"; import { containsTextualToolCallMarker } from "../utils/textualToolCall.ts"; import { getAnyReasoningValue } from "../utils/reasoningFields.ts"; -import { restoreOpenAIToolNames } from "../translator/helpers/toolCallHelper.ts"; +import { + caseInsensitiveToolNameLookup, + restoreOpenAIToolNames, +} from "../translator/helpers/toolCallHelper.ts"; type JsonRecord = Record; @@ -206,7 +209,7 @@ export function translateNonStreamingResponse( typeof argsToEmit === "string" ? argsToEmit : JSON.stringify(argsToEmit || {}); const rawName = toString(itemObj.name); // Strip Claude OAuth proxy_ prefix using toolNameMap - const resolvedName = toolNameMap?.get(rawName) ?? rawName; + const resolvedName = caseInsensitiveToolNameLookup(rawName, toolNameMap) ?? rawName; toolCalls.push({ id: callId, type: "function", @@ -388,7 +391,8 @@ export function translateNonStreamingResponse( if (partObj.functionCall) { const fn = toRecord(partObj.functionCall); const rawName = toString(fn.name); - const restoredName = toolNameMap?.get(rawName) ?? rawName; + const restoredName = + caseInsensitiveToolNameLookup(rawName, toolNameMap) ?? rawName; const nativeId = toString(fn.id); const toolCallId = nativeId.length > 0 @@ -507,7 +511,7 @@ export function translateNonStreamingResponse( thinkingContent += toString(blockObj.thinking); } else if (blockObj.type === "tool_use") { const rawName = toString(blockObj.name); - const strippedName = toolNameMap?.get(rawName) ?? rawName; + const strippedName = caseInsensitiveToolNameLookup(rawName, toolNameMap) ?? rawName; toolCalls.push({ id: toString(blockObj.id, `call_${Date.now()}_${toolCalls.length}`), type: "function", @@ -687,6 +691,35 @@ function convertOpenAINonStreamingToClaude(openaiResponse: JsonRecord): JsonReco if (stopReason === "tool_calls") stopReason = "tool_use"; const usageSrc = toRecord(openaiResponse.usage); + const promptTokens = toNumber(usageSrc.prompt_tokens, 0); + const outputTokens = toNumber(usageSrc.completion_tokens, 0); + + // Extract cache tokens from prompt_tokens_details (mirrors the streaming + // translator in open-sse/translator/response/openai-to-claude.ts lines 119-148). + const promptDetails = toRecord(usageSrc.prompt_tokens_details); + const cachedTokens = toNumber(promptDetails.cached_tokens, 0); + const cacheCreationTokens = toNumber(promptDetails.cache_creation_tokens, 0); + + // OpenAI's prompt_tokens includes all prompt-side tokens (cached + non-cached). + // Claude expects input_tokens to be only non-cached tokens, with cached tokens + // exposed separately as cache_read_input_tokens. + const inputTokens = promptTokens - cachedTokens - cacheCreationTokens; + + const usage: JsonRecord = { + input_tokens: inputTokens, + output_tokens: outputTokens, + }; + + // Add cache_read_input_tokens if present + if (cachedTokens > 0) { + usage.cache_read_input_tokens = cachedTokens; + } + + // Add cache_creation_input_tokens if present + if (cacheCreationTokens > 0) { + usage.cache_creation_input_tokens = cacheCreationTokens; + } + const claudeResponse: JsonRecord = { id: toString(openaiResponse.id, `msg_${Date.now()}`), type: "message", @@ -695,10 +728,7 @@ function convertOpenAINonStreamingToClaude(openaiResponse: JsonRecord): JsonReco content, stop_reason: stopReason, stop_sequence: null, - usage: { - input_tokens: toNumber(usageSrc.prompt_tokens, 0), - output_tokens: toNumber(usageSrc.completion_tokens, 0), - }, + usage, }; return claudeResponse; diff --git a/open-sse/handlers/search.ts b/open-sse/handlers/search.ts index b5e909abe9..502bc2ee73 100644 --- a/open-sse/handlers/search.ts +++ b/open-sse/handlers/search.ts @@ -27,6 +27,7 @@ import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; import { z } from "zod"; import { sanitizeErrorMessage } from "../utils/error.ts"; +import { resolveSearchProxy, executeProviderFetch } from "./search/searchProxy.ts"; export interface SearchResult { title: string; @@ -96,6 +97,9 @@ interface SearchHandlerOptions { alternateProvider?: string; alternateCredentials?: Record | null; log?: any; + /** Connection ID (proxy resolution + call-log attribution) and API key ID (per-key proxy). */ + connectionId?: string; + apiKeyId?: string; } // ── Constants ──────────────────────────────────────────────────────────── @@ -1195,6 +1199,8 @@ export async function handleSearch(options: SearchHandlerOptions): Promise, credentials: Record, globalStartTime: number, - log?: any + log?: any, + connectionId?: string, + apiKeyId?: string ): Promise { const startTime = Date.now(); const providerSpecificData = @@ -1421,6 +1440,10 @@ async function tryProvider( }; } + // Resolve proxy for the selected connection (see search/searchProxy.ts for the + // resolveProxyForConnection precedence chain: per-key, account, provider, combo, global). + const { proxy, proxyLevel } = await resolveSearchProxy(connectionId, apiKeyId, config.id); + // Timeout: min of provider timeout and remaining global timeout const remainingGlobal = GLOBAL_TIMEOUT_MS - (Date.now() - globalStartTime); const timeout = Math.min(config.timeoutMs, Math.max(remainingGlobal, 1000)); @@ -1431,105 +1454,22 @@ async function tryProvider( log.info("SEARCH", `${config.id} | query: "${query.slice(0, 80)}" | type: ${searchType}`); } - try { - const response = await fetch(url, { ...init, signal: controller.signal }); - clearTimeout(timer); - - if (!response.ok) { - const errorText = await response.text(); - if (log) { - log.error("SEARCH", `${config.id} error ${response.status}: ${errorText.slice(0, 200)}`); - } - - saveCallLog({ - method: config.method, - path: "/v1/search", - status: response.status, - model: config.id, - provider: config.id, - duration: Date.now() - startTime, - requestType: "search", - error: errorText.slice(0, 500), - requestBody: { - query: query.slice(0, 200), - search_type: searchType, - max_results: maxResults, - }, - }).catch(() => { - /* non-critical — logging must not block search response */ - }); - - return { - success: false, - status: response.status, - error: `Search provider ${config.id} returned ${response.status}`, - }; - } - - const data = await response.json(); - const normalized = normalizeResponse(config.id, data, query, searchType); - // Enforce max_results — some providers return more than requested - const results = normalized.results.slice(0, maxResults); - const totalResults = normalized.totalResults; - const duration = Date.now() - startTime; - - saveCallLog({ - method: config.method, - path: "/v1/search", - status: 200, - model: config.id, - provider: config.id, - duration, - requestType: "search", - tokens: { prompt_tokens: 0, completion_tokens: 0 }, - requestBody: { query: query.slice(0, 200), search_type: searchType, max_results: maxResults }, - responseBody: { results_count: results.length, cached: false }, - }).catch(() => { - /* non-critical — logging must not block search response */ - }); - - return { - success: true, - data: { - provider: config.id, - query, - results, - answer: null, - usage: { queries_used: 1, search_cost_usd: config.costPerQuery }, - metrics: { - response_time_ms: duration, - upstream_latency_ms: duration, - total_results_available: totalResults, - }, - errors: [], - }, - }; - } catch (err: any) { - clearTimeout(timer); - - const isTimeout = err.name === "AbortError"; - if (log) { - log.error("SEARCH", `${config.id} ${isTimeout ? "timeout" : "fetch error"}: ${err.message}`); - } - - saveCallLog({ - method: config.method, - path: "/v1/search", - status: isTimeout ? 504 : 502, - model: config.id, - provider: config.id, - duration: Date.now() - startTime, - requestType: "search", - error: err.message, - requestBody: { query: query.slice(0, 200), search_type: searchType, max_results: maxResults }, - }).catch(() => { - /* non-critical — logging must not block search response */ - }); - - return { - success: false, - status: isTimeout ? 504 : 502, - error: `Search provider ${isTimeout ? "timeout" : "error"}: ${sanitizeErrorMessage(err.message)}`, - }; - } + // Delegate the fetch + response handling (proxy fetch, call-log, sanitized + // proxy event, result shaping) to the shared chokepoint in searchProxy.ts. + return executeProviderFetch({ + config, + url, + init, + controller, + timer, + query, + searchType, + maxResults, + startTime, + connectionId, + proxy, + proxyLevel, + log, + normalize: normalizeResponse, + }); } diff --git a/open-sse/handlers/search/firecrawlSearch.ts b/open-sse/handlers/search/firecrawlSearch.ts index 350f7b2bb8..9885486e94 100644 --- a/open-sse/handlers/search/firecrawlSearch.ts +++ b/open-sse/handlers/search/firecrawlSearch.ts @@ -5,6 +5,8 @@ export interface FirecrawlSearchParams { searchType: string; maxResults: number; token?: string; + baseUrl?: string; + providerSpecificData?: Record; country?: string; language?: string; timeRange?: string; @@ -68,7 +70,11 @@ export function buildFirecrawlSearchRequest( params: FirecrawlSearchParams ): { url: string; init: RequestInit } { const envBase = process.env.FIRECRAWL_BASE_URL?.trim().replace(/\/+$/, ""); - const url = envBase ? `${envBase}/v2/search` : config.baseUrl; + const providerData = params.providerSpecificData as Record | undefined; + const paramBase = typeof params.baseUrl === "string" ? params.baseUrl : providerData?.baseUrl; + const customBase = typeof paramBase === "string" && paramBase.trim() ? paramBase.trim().replace(/\/+$/, "") : undefined; + const rawBase = envBase || customBase; + const url = rawBase ? `${rawBase}/v2/search` : config.baseUrl; const { includes, excludes } = parseDomainFilter(params.domainFilter); const source = params.searchType === "news" ? "news" : "web"; diff --git a/open-sse/handlers/search/searchProxy.ts b/open-sse/handlers/search/searchProxy.ts new file mode 100644 index 0000000000..f134b4a3bd --- /dev/null +++ b/open-sse/handlers/search/searchProxy.ts @@ -0,0 +1,245 @@ +/** + * Per-attempt proxy binding for web search provider calls. + * + * Extracted from ../search.ts (tryProvider) to keep the provider-dispatch + * chokepoint under the frozen file-size cap. Resolves the proxy for a given + * connection/apiKey/provider triple, wraps a fetch in that proxy context, + * and emits a sanitized proxy event for observability (never includes + * query, API key, or proxy credentials). + */ + +import { saveCallLog } from "@/lib/usageDb"; +import { sanitizeErrorMessage } from "../../utils/error.ts"; +import type { SearchProviderConfig } from "../../config/searchRegistry.ts"; +import type { SearchResult } from "../search.ts"; + +/** Resolved proxy binding for a single provider attempt. */ +export interface ResolvedSearchProxy { + proxy: unknown; + proxyLevel: string; +} + +/** + * Resolve the proxy for the selected connection. Uses the existing + * resolveProxyForConnection(connectionId, apiKeyId, providerId) precedence + * chain so per-key, account, provider, combo, and global proxy rules apply + * consistently with other data-plane routes. + * + * Never throws — proxy resolution failure must not block the search. + */ +export async function resolveSearchProxy( + connectionId: string | undefined, + apiKeyId: string | undefined, + providerId: string +): Promise { + if (!connectionId) { + return { proxy: null, proxyLevel: "direct" }; + } + try { + const { resolveProxyForConnection } = await import("@/lib/db/settings"); + const proxyInfo = await resolveProxyForConnection(connectionId, apiKeyId, providerId); + return { proxy: proxyInfo.proxy, proxyLevel: proxyInfo.level || "direct" }; + } catch { + return { proxy: null, proxyLevel: "direct" }; + } +} + +/** + * Run a fetch, routed through the resolved proxy context when one is set. + * Wraps the patched globalThis.fetch so the upstream call egresses via the + * configured proxy instead of directly. + */ +export async function fetchWithSearchProxy( + proxy: unknown, + doFetch: () => Promise +): Promise { + if (!proxy) return doFetch(); + const { runWithProxyContext } = await import("../../utils/proxyFetch.ts"); + return runWithProxyContext(proxy, doFetch); +} + +/** + * Emit a sanitized proxy event for a search provider attempt. + * Never includes query, API key, proxy username, or proxy password. + */ +export async function emitSearchProxyEvent( + provider: string, + connectionId: string | undefined, + proxy: unknown, + proxyLevel: string, + targetUrl: string, + startTime: number, + status: string +): Promise { + try { + const { logProxyEvent } = await import("@/lib/proxyLogger"); + let targetOrigin = ""; + let targetPath = ""; + try { + const u = new URL(targetUrl); + targetOrigin = u.origin; + targetPath = u.pathname; + } catch { + targetOrigin = targetUrl.slice(0, 80); + } + const proxyRecord = + proxy && typeof proxy === "object" ? (proxy as Record) : null; + const proxyInfo = proxyRecord + ? { + type: String(proxyRecord.type || "http"), + host: String(proxyRecord.host || ""), + port: Number(proxyRecord.port || 0), + } + : null; + logProxyEvent({ + status, + proxy: proxyInfo, + level: proxyLevel, + levelId: connectionId || null, + provider: provider || null, + targetUrl: `${targetOrigin}${targetPath}`, + latencyMs: Date.now() - startTime, + connectionId: connectionId || null, + account: connectionId ? connectionId.slice(0, 8) : null, + }); + } catch { + // Non-critical — proxy logging must not block search response + } +} + +/** Loose result shape mirroring SearchHandlerResult in ../search.ts. */ +export interface ProviderFetchResult { + success: boolean; + status?: number; + error?: string; + data?: { + provider: string; + query: string; + results: SearchResult[]; + answer: null; + usage: { queries_used: number; search_cost_usd: number }; + metrics: { response_time_ms: number; upstream_latency_ms: number; total_results_available: number | null }; + errors: []; + }; +} + +/** Minimal logger shape used by the search handlers (pino-compatible). */ +export interface SearchLog { + info: (tag: string, message: string) => void; + error: (tag: string, message: string) => void; + warn?: (tag: string, message: string) => void; +} + +export interface ExecuteProviderFetchParams { + config: SearchProviderConfig; + url: string; + init: RequestInit; + controller: AbortController; + timer: ReturnType; + query: string; + searchType: string; + maxResults: number; + startTime: number; + connectionId?: string; + proxy: unknown; + proxyLevel: string; + log?: SearchLog; + normalize: ( + providerId: string, + data: unknown, + query: string, + searchType: string + ) => { results: SearchResult[]; totalResults: number | null }; +} + +/** + * Perform the upstream search HTTP call (through the resolved proxy, if any), + * then handle the success/error/exception branches: call-log persistence, + * sanitized proxy-event emission, and SearchHandlerResult construction. + * This is the single chokepoint tryProvider() delegates to after building + * the request and resolving the proxy — keeps search.ts to wiring only. + */ +export async function executeProviderFetch(p: ExecuteProviderFetchParams): Promise { + const { config, url, init, controller, timer, query, searchType, maxResults, startTime } = p; + const { connectionId, proxy, proxyLevel, log, normalize } = p; + const emitEvent = (status: string) => + emitSearchProxyEvent(config.id, connectionId, proxy, proxyLevel, url, startTime, status); + const logCall = (fields: Record) => + saveCallLog({ + method: config.method, + path: "/v1/search", + model: config.id, + provider: config.id, + connectionId: connectionId || null, + requestType: "search", + requestBody: { query: query.slice(0, 200), search_type: searchType, max_results: maxResults }, + ...fields, + }).catch(() => { + /* non-critical — logging must not block search response */ + }); + + try { + const response = await fetchWithSearchProxy(proxy, () => + fetch(url, { ...init, signal: controller.signal }) + ); + clearTimeout(timer); + + if (!response.ok) { + const errorText = await response.text(); + if (log) { + log.error("SEARCH", `${config.id} error ${response.status}: ${errorText.slice(0, 200)}`); + } + logCall({ status: response.status, duration: Date.now() - startTime, error: errorText.slice(0, 500) }); + await emitEvent("error"); + return { + success: false, + status: response.status, + error: `Search provider ${config.id} returned ${response.status}`, + }; + } + + const data = await response.json(); + const normalized = normalize(config.id, data, query, searchType); + const results = normalized.results.slice(0, maxResults); + const duration = Date.now() - startTime; + + logCall({ + status: 200, + duration, + tokens: { prompt_tokens: 0, completion_tokens: 0 }, + responseBody: { results_count: results.length, cached: false }, + }); + await emitEvent("success"); + + return { + success: true, + data: { + provider: config.id, + query, + results, + answer: null, + usage: { queries_used: 1, search_cost_usd: config.costPerQuery }, + metrics: { + response_time_ms: duration, + upstream_latency_ms: duration, + total_results_available: normalized.totalResults, + }, + errors: [], + }, + }; + } catch (err: unknown) { + clearTimeout(timer); + const error = err instanceof Error ? err : new Error(String(err)); + const isTimeout = error.name === "AbortError"; + if (log) { + log.error("SEARCH", `${config.id} ${isTimeout ? "timeout" : "fetch error"}: ${error.message}`); + } + logCall({ status: isTimeout ? 504 : 502, duration: Date.now() - startTime, error: error.message }); + await emitEvent(isTimeout ? "timeout" : "error"); + return { + success: false, + status: isTimeout ? 504 : 502, + error: `Search provider ${isTimeout ? "timeout" : "error"}: ${sanitizeErrorMessage(error.message)}`, + }; + } +} diff --git a/open-sse/handlers/sseParser.ts b/open-sse/handlers/sseParser.ts index d75f3a72b8..49eaefc3c8 100644 --- a/open-sse/handlers/sseParser.ts +++ b/open-sse/handlers/sseParser.ts @@ -713,8 +713,7 @@ export function parseSSEToResponsesOutput(rawSSE, fallbackModel) { // part. Place deltas at summary[summary_index] (growing the array) so // segments are preserved for later "\n\n" joining on the non-stream path, // instead of overwriting summary[0] regardless of index. - const summaryIndex = - typeof evt.summary_index === "number" ? evt.summary_index : 0; + const summaryIndex = typeof evt.summary_index === "number" ? evt.summary_index : 0; const part = summary[summaryIndex] && typeof summary[summaryIndex] === "object" ? { ...toRecord(summary[summaryIndex]) } @@ -733,8 +732,7 @@ export function parseSSEToResponsesOutput(rawSSE, fallbackModel) { ); const summary = Array.isArray(reasoningItem.summary) ? reasoningItem.summary : []; // #9500 — respect summary_index on the terminal done event too. - const summaryIndex = - typeof evt.summary_index === "number" ? evt.summary_index : 0; + const summaryIndex = typeof evt.summary_index === "number" ? evt.summary_index : 0; const part = summary[summaryIndex] && typeof summary[summaryIndex] === "object" ? { ...toRecord(summary[summaryIndex]) } diff --git a/open-sse/handlers/webFetch.ts b/open-sse/handlers/webFetch.ts index 27179ab289..8b6c25660a 100644 --- a/open-sse/handlers/webFetch.ts +++ b/open-sse/handlers/webFetch.ts @@ -50,6 +50,8 @@ export interface WebFetchResult { export interface WebFetchCredentials { apiKey?: string; + baseUrl?: string; + providerSpecificData?: Record; } const WEB_FETCH_PROVIDERS = ["firecrawl", "jina-reader", "tavily-search", "tinyfish"] as const; diff --git a/open-sse/mcp-server/__tests__/audit.test.ts b/open-sse/mcp-server/__tests__/audit.test.ts index 19f69ffb8d..829acaf4af 100644 --- a/open-sse/mcp-server/__tests__/audit.test.ts +++ b/open-sse/mcp-server/__tests__/audit.test.ts @@ -18,6 +18,13 @@ function createStatementMock() { }; } +// #8959 made the production loader use createRequire() (Electron/global-install +// resolution), which vi.doMock CANNOT intercept — it only patches Vitest's ESM +// module graph. The old better-sqlite3 doMock therefore never engaged: the code +// opened a REAL sqlite file in the temp DATA_DIR ("no such table" on stderr) +// and every mock assertion counted 0 calls. The shutdown tests now inject the +// mock through the audit connection cache (globalThis.__omnirouteMcpAuditDb), +// and the fallback test uses the __setBetterSqliteLoaderForTests seam. describe("MCP audit shutdown", () => { let dataDir: string; let dbFile: string; @@ -46,15 +53,10 @@ describe("MCP audit shutdown", () => { close: vi.fn(), open: true, }; - const MockDatabase = vi.fn(function MockDatabase() { - return mockDb; - }); - - vi.doMock("better-sqlite3", () => ({ - default: MockDatabase, - })); const audit = await import("../audit.ts"); + // Inject through the connection cache — the seam the module itself uses. + globalThis.__omnirouteMcpAuditDb = mockDb as unknown as typeof globalThis.__omnirouteMcpAuditDb; await audit.logToolCall("omniroute_get_health", { ok: true }, { ok: true }, 12, true); expect(mockDb.prepare).toHaveBeenCalledTimes(1); @@ -80,15 +82,9 @@ describe("MCP audit shutdown", () => { close: vi.fn(), open: true, }; - const MockDatabase = vi.fn(function MockDatabase() { - return mockDb; - }); - - vi.doMock("better-sqlite3", () => ({ - default: MockDatabase, - })); const audit = await import("../audit.ts"); + globalThis.__omnirouteMcpAuditDb = mockDb as unknown as typeof globalThis.__omnirouteMcpAuditDb; await audit.logToolCall("omniroute_get_health", {}, {}, 5, true); expect(audit.closeAuditDb()).toBe(true); @@ -103,26 +99,16 @@ describe("MCP audit shutdown", () => { // Simulate a global-install scenario where the bundled native binary // never landed in dist/node_modules/better-sqlite3/build/Release/. + // Thrown from the loader seam because the real load path is + // createRequire("better-sqlite3"), unreachable by vi.doMock. const bindingErr = new Error( "Could not locate the bindings file. Tried: …/better_sqlite3.node" ) as Error & { code?: string }; bindingErr.code = "MODULE_NOT_FOUND"; - // Simulate the binding-missing failure as the better-sqlite3 default - // constructor throwing — this matches reality (`new Database()` throws - // "Could not locate the bindings file" when the prebuilt .node is absent) - // and reaches the adapter's `catch (nativeErr)`. A factory that itself - // throws is reported by vitest as a mock-setup error and never reaches - // the code under test. - const ThrowingDatabase = vi.fn(function ThrowingDatabase() { - throw bindingErr; - }); - vi.doMock("better-sqlite3", () => ({ - default: ThrowingDatabase, - })); - // node:sqlite's DatabaseSync does not expose a boolean `open` property, - // so the mock intentionally omits it — the adapter tracks open state in - // a local closure and exposes it via a getter. + // node:sqlite IS loaded via dynamic import(), so doMock works for it. + // Its DatabaseSync does not expose a boolean `open` property — the + // adapter tracks open state in a local closure. const mockNodeDb = { prepare: vi.fn(() => createStatementMock()), exec: vi.fn(), @@ -134,17 +120,24 @@ describe("MCP audit shutdown", () => { vi.doMock("node:sqlite", () => ({ DatabaseSync })); const audit = await import("../audit.ts"); + audit.__setBetterSqliteLoaderForTests(() => { + throw bindingErr; + }); - await audit.logToolCall("omniroute_get_health", { ok: true }, { ok: true }, 4, true); - expect(DatabaseSync).toHaveBeenCalledWith(dbFile); - expect(mockNodeDb.prepare).toHaveBeenCalled(); + try { + await audit.logToolCall("omniroute_get_health", { ok: true }, { ok: true }, 4, true); + expect(DatabaseSync).toHaveBeenCalledWith(dbFile); + expect(mockNodeDb.prepare).toHaveBeenCalled(); - expect(audit.closeAuditDb()).toBe(true); - expect(mockNodeDb.exec).toHaveBeenCalledWith("PRAGMA wal_checkpoint(TRUNCATE)"); - expect(mockNodeDb.close).toHaveBeenCalledTimes(1); + expect(audit.closeAuditDb()).toBe(true); + expect(mockNodeDb.exec).toHaveBeenCalledWith("PRAGMA wal_checkpoint(TRUNCATE)"); + expect(mockNodeDb.close).toHaveBeenCalledTimes(1); - // Cache is cleared after close, so a second close is a no-op. - expect(audit.closeAuditDb()).toBe(false); - expect(mockNodeDb.close).toHaveBeenCalledTimes(1); + // Cache is cleared after close, so a second close is a no-op. + expect(audit.closeAuditDb()).toBe(false); + expect(mockNodeDb.close).toHaveBeenCalledTimes(1); + } finally { + audit.__setBetterSqliteLoaderForTests(null); + } }); }); diff --git a/open-sse/mcp-server/__tests__/createComboTool.test.ts b/open-sse/mcp-server/__tests__/createComboTool.test.ts new file mode 100644 index 0000000000..a0c4ce0ee0 --- /dev/null +++ b/open-sse/mcp-server/__tests__/createComboTool.test.ts @@ -0,0 +1,193 @@ +import { describe, it, expect, vi, beforeEach, afterEach } from "vitest"; +import { Client } from "@modelcontextprotocol/sdk/client/index.js"; +import { InMemoryTransport } from "@modelcontextprotocol/sdk/inMemory.js"; +import { MCP_TOOLS, MCP_TOOL_MAP, createComboInput, createComboTool } from "../schemas/tools.ts"; +import { createMcpServer } from "../server.ts"; + +const mockFetch = vi.fn(); +vi.stubGlobal("fetch", mockFetch); + +const mockLogToolCall = vi.hoisted(() => vi.fn().mockResolvedValue(undefined)); +vi.mock("../audit.ts", () => ({ + logToolCall: mockLogToolCall, +})); + +describe("omniroute_create_combo MCP tool schema", () => { + it("should be registered in MCP_TOOLS and MCP_TOOL_MAP", () => { + const tool = MCP_TOOLS.find((t) => t.name === "omniroute_create_combo"); + expect(tool).toBeDefined(); + expect(MCP_TOOL_MAP["omniroute_create_combo"]).toBeDefined(); + }); + + it("should require write:combos scope", () => { + expect(createComboTool.scopes).toContain("write:combos"); + }); + + it("should validate a minimal payload (name + models)", () => { + const result = createComboInput.safeParse({ + name: "My Combo", + models: [{ provider: "anthropic", model: "claude-sonnet" }], + }); + expect(result.success).toBe(true); + }); + + it("should validate a full payload with description and strategy", () => { + const result = createComboInput.safeParse({ + name: "My Combo", + description: "A test combo", + strategy: "priority", + models: [ + { provider: "anthropic", model: "claude-sonnet" }, + { provider: "google", model: "gemini-pro" }, + ], + }); + expect(result.success).toBe(true); + }); + + it("should reject a payload missing name", () => { + const result = createComboInput.safeParse({ + models: [{ provider: "anthropic", model: "claude-sonnet" }], + }); + expect(result.success).toBe(false); + }); + + it("should reject a payload with an empty models array", () => { + const result = createComboInput.safeParse({ name: "My Combo", models: [] }); + expect(result.success).toBe(false); + }); + + it("should reject an unknown strategy value", () => { + const result = createComboInput.safeParse({ + name: "My Combo", + strategy: "not-a-real-strategy", + models: [{ provider: "anthropic", model: "claude-sonnet" }], + }); + expect(result.success).toBe(false); + }); +}); + +describe("omniroute_create_combo handler (via MCP dispatch)", () => { + let client: Client; + + beforeEach(async () => { + mockFetch.mockReset(); + mockLogToolCall.mockClear(); + + const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair(); + const server = createMcpServer(); + await server.connect(serverTransport); + client = new Client({ name: "create-combo-test", version: "1.0.0" }); + await client.connect(clientTransport); + }); + + afterEach(async () => { + await client.close(); + }); + + it("should appear in tools/list after registration", async () => { + const { tools } = await client.listTools(); + const tool = tools.find((t) => t.name === "omniroute_create_combo"); + expect(tool).toBeDefined(); + expect(tool?.description).toContain("Registers new combo"); + }); + + it("should POST to /api/combos and return the created combo on success", async () => { + mockFetch.mockResolvedValueOnce({ + ok: true, + json: async () => ({ + success: true, + combo: { id: "combo-123", name: "My Combo", strategy: "priority", enabled: true }, + }), + }); + + const args = { + name: "My Combo", + models: [{ provider: "anthropic", model: "claude-sonnet" }], + }; + + const result = await client.callTool({ name: "omniroute_create_combo", arguments: args }); + + expect(result.isError).toBeFalsy(); + const content = result.content[0] as { type: string; text: string }; + const data = JSON.parse(content.text); + expect(data.success).toBe(true); + expect(data.combo.id).toBe("combo-123"); + expect(data.combo.name).toBe("My Combo"); + + expect(mockFetch).toHaveBeenCalledWith( + expect.stringContaining("/api/combos"), + expect.objectContaining({ method: "POST" }) + ); + const [, options] = mockFetch.mock.calls[0]; + const body = JSON.parse(options.body as string); + expect(body.name).toBe("My Combo"); + expect(body.models).toHaveLength(1); + + // Audit: the invocation must be logged to mcp_audit (via logToolCall). + expect(mockLogToolCall).toHaveBeenCalledWith( + "omniroute_create_combo", + expect.objectContaining({ name: "My Combo" }), + expect.objectContaining({ success: true }), + expect.any(Number), + true + ); + }); + + it("should pass through optional description and strategy fields", async () => { + mockFetch.mockResolvedValueOnce({ + ok: true, + json: async () => ({ + success: true, + combo: { id: "combo-456", name: "Cost Saver", strategy: "cost-optimized", enabled: true }, + }), + }); + + await client.callTool({ + name: "omniroute_create_combo", + arguments: { + name: "Cost Saver", + description: "Prefers cheaper models", + strategy: "cost-optimized", + models: [ + { provider: "anthropic", model: "claude-haiku" }, + { provider: "google", model: "gemini-flash" }, + ], + }, + }); + + const [, options] = mockFetch.mock.calls[0]; + const body = JSON.parse(options.body as string); + expect(body.description).toBe("Prefers cheaper models"); + expect(body.strategy).toBe("cost-optimized"); + expect(body.models).toHaveLength(2); + }); + + it("should return isError and log the failure when the backend rejects the combo (e.g. name collision)", async () => { + mockFetch.mockResolvedValueOnce({ + ok: false, + status: 409, + text: async () => "Combo name already exists", + }); + + const result = await client.callTool({ + name: "omniroute_create_combo", + arguments: { + name: "Duplicate Combo", + models: [{ provider: "anthropic", model: "claude-sonnet" }], + }, + }); + + expect(result.isError).toBe(true); + const content = result.content[0] as { type: string; text: string }; + expect(content.text).toContain("Error"); + + expect(mockLogToolCall).toHaveBeenCalledWith( + "omniroute_create_combo", + expect.objectContaining({ name: "Duplicate Combo" }), + null, + expect.any(Number), + false, + expect.stringContaining("Combo name already exists") + ); + }); +}); diff --git a/open-sse/mcp-server/__tests__/essentialTools.test.ts b/open-sse/mcp-server/__tests__/essentialTools.test.ts index 5784b50a7f..88353eed92 100644 --- a/open-sse/mcp-server/__tests__/essentialTools.test.ts +++ b/open-sse/mcp-server/__tests__/essentialTools.test.ts @@ -22,9 +22,10 @@ describe("MCP Essential Tools", () => { }); describe("Tool schema validation", () => { - it("should have exactly 11 essential tools (includes web_search + web_fetch + tool_search)", () => { + it("should have exactly 12 essential tools (includes web_search + web_fetch + tool_search)", () => { + // 11 -> 12: #8925 shipped omniroute_create_combo as a phase-1 tool. const schemas = MCP_ESSENTIAL_TOOLS; - expect(schemas).toHaveLength(11); + expect(schemas).toHaveLength(12); }); it("all tools should have omniroute_ prefix", () => { diff --git a/open-sse/mcp-server/audit.ts b/open-sse/mcp-server/audit.ts index da1e4eaf8f..a658d3af7f 100644 --- a/open-sse/mcp-server/audit.ts +++ b/open-sse/mcp-server/audit.ts @@ -206,11 +206,27 @@ function toString(value: unknown): string { return typeof value === "string" ? value : ""; } +/** + * Test-only seam: the production load path uses `createRequire()` (so the + * Electron/global-install resolution works — #8959), which `vi.doMock` cannot + * intercept (it only patches Vitest's ESM module graph). Tests inject a + * throwing/mocked loader here to exercise the node:sqlite fallback. + */ +let betterSqliteLoaderForTests: (() => unknown) | null = null; +export function __setBetterSqliteLoaderForTests(loader: (() => unknown) | null): void { + betterSqliteLoaderForTests = loader; +} + async function openBetterSqliteAuditDb(dbPath: string): Promise { - const { createRequire } = await import("node:module"); - const _require = createRequire(import.meta.url); - const mod = _require("better-sqlite3"); - const Database = (mod?.default || mod) as unknown as new ( + let mod: unknown; + if (betterSqliteLoaderForTests) { + mod = betterSqliteLoaderForTests(); + } else { + const { createRequire } = await import("node:module"); + const _require = createRequire(import.meta.url); + mod = _require("better-sqlite3"); + } + const Database = ((mod as { default?: unknown })?.default || mod) as unknown as new ( dbPath: string ) => AuditDatabase; return new Database(dbPath); diff --git a/open-sse/mcp-server/schemas/tools.ts b/open-sse/mcp-server/schemas/tools.ts index 012198baf8..4db6a850dc 100644 --- a/open-sse/mcp-server/schemas/tools.ts +++ b/open-sse/mcp-server/schemas/tools.ts @@ -192,6 +192,53 @@ export const switchComboTool: McpToolDefinition = + { + name: "omniroute_create_combo", + description: + "Registers a new combo (model chain) with a name, ordered model list, and optional routing strategy. Full validation (name collisions, nested-combo DAG, composite tiers) is enforced by the combos API.", + inputSchema: createComboInput, + outputSchema: createComboOutput, + scopes: ["write:combos"], + auditLevel: "full", + phase: 1, + sourceEndpoints: ["/api/combos"], + }; + // --- Tool 5: omniroute_check_quota --- export const checkQuotaInput = z.object({ provider: z @@ -1460,6 +1507,7 @@ export const MCP_TOOLS = [ listCombosTool, getComboMetricsTool, switchComboTool, + createComboTool, checkQuotaTool, routeRequestTool, costReportTool, diff --git a/open-sse/mcp-server/server.ts b/open-sse/mcp-server/server.ts index 9f8a536744..d61b654f3c 100644 --- a/open-sse/mcp-server/server.ts +++ b/open-sse/mcp-server/server.ts @@ -12,6 +12,7 @@ import { listCombosInput, getComboMetricsInput, switchComboInput, + createComboInput, checkQuotaInput, routeRequestInput, costReportInput, @@ -393,6 +394,27 @@ async function handleSwitchCombo(args: { comboId: string; active: boolean }) { } } +async function handleCreateCombo(args: { + name: string; + description?: string; + strategy?: string; + models: { provider: string; model: string }[]; +}) { + const start = Date.now(); + try { + const result = await omniRouteFetch("/api/combos", { + method: "POST", + body: JSON.stringify(args), + }); + await logToolCall("omniroute_create_combo", args, result, Date.now() - start, true); + return { content: [{ type: "text" as const, text: JSON.stringify(result, null, 2) }] }; + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + await logToolCall("omniroute_create_combo", args, null, Date.now() - start, false, msg); + return { content: [{ type: "text" as const, text: `Error: ${msg}` }], isError: true }; + } +} + async function handleCheckQuota(args: { provider?: string; connectionId?: string }) { const start = Date.now(); try { @@ -738,6 +760,17 @@ export function createMcpServer(): McpServer { ) ); + server.registerTool( + "omniroute_create_combo", + { + description: "Registers a new combo (model chain) with name, models, and strategy", + inputSchema: createComboInput, + }, + withScopeEnforcement("omniroute_create_combo", (args) => + handleCreateCombo(createComboInput.parse(args)) + ) + ); + server.registerTool( "omniroute_check_quota", { @@ -1370,6 +1403,10 @@ export function createMcpServer(): McpServer { * Called when `omniroute --mcp` is used. */ export async function startMcpStdio(): Promise { + // Stdout is reserved for JSON-RPC — bin/mcpStdioConsoleGuard.mjs is preloaded via + // `node --import` (see bin/mcp-server.mjs) so console.log/warn already redirect to + // stderr before this module's own imports evaluate (DB init happens as a side effect of + // createMcpServer()'s tool registration, earlier than any code placed here could catch). const server = createMcpServer(); const transport = new StdioServerTransport(); const version = process.env.npm_package_version || "1.8.1"; diff --git a/open-sse/package.json b/open-sse/package.json index b2f90507e1..858e80d0c8 100644 --- a/open-sse/package.json +++ b/open-sse/package.json @@ -1,18 +1,7 @@ { "name": "@omniroute/open-sse", "version": "3.8.50", - "description": "Express SSE sidecar for OmniRoute — handles streaming, protocol translation, and provider orchestration", + "description": "OmniRoute streaming engine — handles provider dispatch, protocol translation, and SSE streaming", "type": "module", - "main": "index.js", - "types": "types.d.ts", - "private": true, - "exports": { - ".": "./index.js", - "./*": "./*" - }, - "dependencies": { - "@toon-format/toon": "^4.1.0", - "safe-regex": "^2.1.1", - "smol-toml": "1.7.1" - } + "private": true } diff --git a/open-sse/services/__tests__/antigravity-quota-family.test.ts b/open-sse/services/__tests__/antigravity-quota-family.test.ts index c23d79926b..b1983a0909 100644 --- a/open-sse/services/__tests__/antigravity-quota-family.test.ts +++ b/open-sse/services/__tests__/antigravity-quota-family.test.ts @@ -7,7 +7,10 @@ import { clearAllModelLockouts, getModelLockoutInfo, isModelLocked, + lockModelIfPerModelQuota, + lockExactModel, recordModelLockoutFailure, + clearModelLock, } from "@omniroute/open-sse/services/accountFallback.ts"; const provider = "antigravity"; @@ -74,6 +77,38 @@ describe("Antigravity account quota-family cooldown", () => { expect(isModelLocked(provider, "account-a", "gemini-3.5-flash-low")).toBe(false); }); + it("can isolate a confirmed Antigravity quota exhaustion to one exact model", () => { + lockExactModel( + provider, + "account-a", + "claude-opus-4-6-thinking", + "quota_exhausted", + 60_000 + ); + + expect(isModelLocked(provider, "account-a", "claude-opus-4-6-thinking")).toBe(true); + expect(isModelLocked(provider, "account-a", "claude-sonnet-4-6-thinking")).toBe(false); + expect(isModelLocked(provider, "account-a", "gemini-3.5-flash-medium")).toBe(false); + + expect(clearModelLock(provider, "account-a", "claude-opus-4-6-thinking")).toBe(true); + expect(isModelLocked(provider, "account-a", "claude-opus-4-6-thinking")).toBe(false); + }); + + it("uses an exact model lock for Antigravity in the generic per-model quota path", () => { + expect( + lockModelIfPerModelQuota( + provider, + "account-a", + "claude-opus-4-6-thinking", + "quota_exhausted", + 60_000 + ) + ).toBe(true); + + expect(isModelLocked(provider, "account-a", "claude-opus-4-6-thinking")).toBe(true); + expect(isModelLocked(provider, "account-a", "claude-sonnet-4-6-thinking")).toBe(false); + }); + it("honors exact upstream cooldowns and otherwise uses bounded inferred cooldown", () => { const upstream = recordModelLockoutFailure( provider, diff --git a/open-sse/services/__tests__/claudeTlsClient.test.ts b/open-sse/services/__tests__/claudeTlsClient.test.ts index 940883600f..7eb2479b1a 100644 --- a/open-sse/services/__tests__/claudeTlsClient.test.ts +++ b/open-sse/services/__tests__/claudeTlsClient.test.ts @@ -273,9 +273,15 @@ describe("claudeTlsClient", () => { await tlsFetchClaude("https://claude.ai/test", {}); - // The proxyUrl should reflect environment resolution + // The testOverride is called with the raw options object BEFORE proxy + // resolution occurs (see claudeTlsClient.ts line 258: + // `if (testOverride) return testOverride(url, options)`). + // Proxy resolution (env var → proxyUrl) only runs inside the real + // tls-client path, which is bypassed when an override is active. + // So callOptions here is exactly the {} we passed — no proxyUrl injected. + expect(mockFn).toHaveBeenCalledOnce(); const callOptions = mockFn.mock.calls[0][1]; - expect(callOptions).toHaveProperty("proxyUrl"); + expect(callOptions.proxyUrl).toBeUndefined(); __setTlsFetchOverrideForTesting(null); delete process.env.HTTPS_PROXY; diff --git a/open-sse/services/__tests__/fail-fast-concurrency-gate.test.ts b/open-sse/services/__tests__/fail-fast-concurrency-gate.test.ts new file mode 100644 index 0000000000..cd969fb352 --- /dev/null +++ b/open-sse/services/__tests__/fail-fast-concurrency-gate.test.ts @@ -0,0 +1,30 @@ +import { describe, it, expect, beforeEach } from "vitest"; +import { acquire, isAccountSemaphoreFull, resetAll } from "../accountSemaphore.ts"; + +describe("isAccountSemaphoreFull fail-fast concurrency gate", () => { + beforeEach(() => { + resetAll(); + }); + + it("returns false when no semaphore gate exists", () => { + expect(isAccountSemaphoreFull("featherless-ai", "conn-1", 1)).toBe(false); + }); + + it("returns false when maxConcurrency is null, <= 0, or bypassed", () => { + expect(isAccountSemaphoreFull("featherless-ai", "conn-1", null)).toBe(false); + expect(isAccountSemaphoreFull("featherless-ai", "conn-1", 0)).toBe(false); + }); + + it("returns false when running < maxConcurrency", async () => { + const release = await acquire("featherless-ai:conn-1", { maxConcurrency: 2 }); + expect(isAccountSemaphoreFull("featherless-ai", "conn-1", 2)).toBe(false); + release(); + }); + + it("returns true immediately when running >= maxConcurrency", async () => { + const release = await acquire("featherless-ai:conn-1", { maxConcurrency: 1 }); + expect(isAccountSemaphoreFull("featherless-ai", "conn-1", 1)).toBe(true); + release(); + expect(isAccountSemaphoreFull("featherless-ai", "conn-1", 1)).toBe(false); + }); +}); diff --git a/open-sse/services/__tests__/manifestAdapter.test.ts b/open-sse/services/__tests__/manifestAdapter.test.ts index b391e6b152..e9430851a4 100644 --- a/open-sse/services/__tests__/manifestAdapter.test.ts +++ b/open-sse/services/__tests__/manifestAdapter.test.ts @@ -1,5 +1,4 @@ -import { describe, it } from "node:test"; -import assert from "node:assert/strict"; +import { describe, it, expect } from "vitest"; import { generateRoutingHints, compareByCostEffectiveness, @@ -27,8 +26,8 @@ describe("ManifestAdapter", () => { const hints = generateRoutingHints([], { messages: [{ content: "Hello" }], }); - assert.equal(hints.strategyModifier, "prefer-free"); - assert.equal(hints.specificityLevel, "trivial"); + expect(hints.strategyModifier).toBe("prefer-free"); + expect(hints.specificityLevel).toBe("trivial"); }); }); @@ -43,7 +42,7 @@ describe("ManifestAdapter", () => { ], }); const validModifiers = ["prefer-free", "prefer-cheap", "require-premium", "default"]; - assert.ok(validModifiers.includes(hints.strategyModifier)); + expect(validModifiers.includes(hints.strategyModifier)).toBe(true); }); }); @@ -53,15 +52,15 @@ describe("ManifestAdapter", () => { const hints = generateRoutingHints(targets, { messages: [{ content: "Hi" }], }); - assert.ok(hints.eligibleTargets.length >= 0); + expect(hints.eligibleTargets.length).toBeGreaterThanOrEqual(0); }); it("handles empty targets array gracefully", () => { const hints = generateRoutingHints([], { messages: [{ content: "Hello" }], }); - assert.equal(hints.eligibleTargets.length, 0); - assert.equal(hints.underqualifiedTargets.length, 0); + expect(hints.eligibleTargets.length).toBe(0); + expect(hints.underqualifiedTargets.length).toBe(0); }); it("classifies mixed targets for simple query", () => { @@ -69,7 +68,7 @@ describe("ManifestAdapter", () => { const hints = generateRoutingHints(targets, { messages: [{ content: "Hello" }], }); - assert.ok(hints.eligibleTargets.length >= 0); + expect(hints.eligibleTargets.length).toBeGreaterThanOrEqual(0); }); }); @@ -81,7 +80,7 @@ describe("ManifestAdapter", () => { messages: [{ content: "Test" }], }); const result = compareByCostEffectiveness(a, b, hints); - assert.equal(typeof result, "number"); + expect(typeof result).toBe("number"); }); it("returns negative when a is cheaper than b", () => { @@ -91,7 +90,7 @@ describe("ManifestAdapter", () => { messages: [{ content: "Test" }], }); const result = compareByCostEffectiveness(a, b, hints); - assert.ok(result < 0, "deepseek should be cheaper than openai"); + expect(result, "deepseek should be cheaper than openai").toBeLessThan(0); }); }); @@ -99,19 +98,19 @@ describe("ManifestAdapter", () => { it("returns 0 for free providers", () => { const target = makeTarget("kiro", "claude-sonnet-4.5"); const cost = estimateRequestCost(target, 1000, 500); - assert.equal(cost, 0); + expect(cost).toBe(0); }); it("returns non-zero for premium provider", () => { const target = makeTarget("openai", "gpt-4o"); const cost = estimateRequestCost(target, 1000000, 500000); - assert.ok(cost > 0, "gpt-4o should have non-zero cost"); + expect(cost, "gpt-4o should have non-zero cost").toBeGreaterThan(0); }); it("handles zero tokens", () => { const target = makeTarget("openai", "gpt-4o"); const cost = estimateRequestCost(target, 0, 0); - assert.equal(cost, 0); + expect(cost).toBe(0); }); }); @@ -120,17 +119,17 @@ describe("ManifestAdapter", () => { const hints = generateRoutingHints([], { messages: [{ content: "Hello" }], }); - assert.equal(hints.eligibleTargets.length, 0); - assert.equal(hints.underqualifiedTargets.length, 0); + expect(hints.eligibleTargets.length).toBe(0); + expect(hints.underqualifiedTargets.length).toBe(0); }); it("returns valid hints structure with no targets", () => { const hints = generateRoutingHints([], { messages: [{ content: "Test" }], }); - assert.ok("specificityLevel" in hints); - assert.ok("strategyModifier" in hints); - assert.ok("recommendedMinTier" in hints); + expect("specificityLevel" in hints).toBe(true); + expect("strategyModifier" in hints).toBe(true); + expect("recommendedMinTier" in hints).toBe(true); }); }); }); diff --git a/open-sse/services/__tests__/specificityDetector.test.ts b/open-sse/services/__tests__/specificityDetector.test.ts index 9e18996248..b93e90725f 100644 --- a/open-sse/services/__tests__/specificityDetector.test.ts +++ b/open-sse/services/__tests__/specificityDetector.test.ts @@ -1,5 +1,4 @@ -import { describe, it } from "node:test"; -import assert from "node:assert/strict"; +import { describe, it, expect } from "vitest"; import { analyzeSpecificity, getSpecificityLevel, @@ -12,13 +11,13 @@ describe("SpecificityDetector", () => { describe("analyzeSpecificity - trivial query", () => { it("returns score <= 5 for greeting", () => { const result = analyzeSpecificity({ messages: [{ content: "Hello, how are you?" }] }); - assert.ok(result.score <= 5); + expect(result.score).toBeLessThanOrEqual(5); }); it("level is 'trivial' for greeting", () => { const result = analyzeSpecificity({ messages: [{ content: "Hi there!" }] }); const level = getSpecificityLevel(result.score); - assert.equal(level, "trivial"); + expect(level).toBe("trivial"); }); }); @@ -27,8 +26,8 @@ describe("SpecificityDetector", () => { const result = analyzeSpecificity({ messages: [{ content: "What is the capital of France?" }], }); - assert.ok(result.score >= 0); - assert.ok(result.score <= 20); + expect(result.score).toBeGreaterThanOrEqual(0); + expect(result.score).toBeLessThanOrEqual(20); }); it("returns 'simple' or lower for factual question", () => { @@ -36,7 +35,7 @@ describe("SpecificityDetector", () => { messages: [{ content: "Who invented Python?" }], }); const level = getSpecificityLevel(result.score); - assert.ok(["trivial", "simple"].includes(level)); + expect(["trivial", "simple"].includes(level)).toBe(true); }); }); @@ -45,14 +44,14 @@ describe("SpecificityDetector", () => { const result = analyzeSpecificity({ messages: [{ content: "```ts\nfunction foo(){}\n```" }], }); - assert.ok(result.score >= 5, `Expected >= 5, got ${result.score}`); + expect(result.score, `Expected >= 5, got ${result.score}`).toBeGreaterThanOrEqual(5); }); it("code complexity is detected in code blocks", () => { const result = analyzeSpecificity({ messages: [{ content: "```ts\nfunction foo(){}\n```" }], }); - assert.ok(result.breakdown.codeComplexity > 0); + expect(result.breakdown.codeComplexity).toBeGreaterThan(0); }); it("returns higher score for code + reasoning", () => { @@ -66,7 +65,7 @@ describe("SpecificityDetector", () => { { content: "```typescript\nclass BST { insert(val: T): void {} }\n```" }, ], }); - assert.ok(result.score >= 10, `Expected >= 10, got ${result.score}`); + expect(result.score, `Expected >= 10, got ${result.score}`).toBeGreaterThanOrEqual(10); }); }); @@ -80,82 +79,82 @@ describe("SpecificityDetector", () => { }, ], }); - assert.ok(result.breakdown.reasoningDepth > 0); + expect(result.breakdown.reasoningDepth).toBeGreaterThan(0); }); }); describe("getSpecificityLevel", () => { it("returns 'trivial' for score 0-5", () => { - assert.equal(getSpecificityLevel(0), "trivial"); - assert.equal(getSpecificityLevel(3), "trivial"); - assert.equal(getSpecificityLevel(5), "trivial"); + expect(getSpecificityLevel(0)).toBe("trivial"); + expect(getSpecificityLevel(3)).toBe("trivial"); + expect(getSpecificityLevel(5)).toBe("trivial"); }); it("returns 'simple' for score 6-20", () => { - assert.equal(getSpecificityLevel(6), "simple"); - assert.equal(getSpecificityLevel(10), "simple"); - assert.equal(getSpecificityLevel(20), "simple"); + expect(getSpecificityLevel(6)).toBe("simple"); + expect(getSpecificityLevel(10)).toBe("simple"); + expect(getSpecificityLevel(20)).toBe("simple"); }); it("returns 'moderate' for score 6-40", () => { - assert.equal(getSpecificityLevel(21), "moderate"); - assert.equal(getSpecificityLevel(30), "moderate"); - assert.equal(getSpecificityLevel(40), "moderate"); + expect(getSpecificityLevel(21)).toBe("moderate"); + expect(getSpecificityLevel(30)).toBe("moderate"); + expect(getSpecificityLevel(40)).toBe("moderate"); }); it("returns 'complex' for score 41+", () => { - assert.equal(getSpecificityLevel(41), "complex"); - assert.equal(getSpecificityLevel(46), "complex"); - assert.equal(getSpecificityLevel(65), "complex"); + expect(getSpecificityLevel(41)).toBe("complex"); + expect(getSpecificityLevel(46)).toBe("complex"); + expect(getSpecificityLevel(65)).toBe("complex"); }); it("returns 'expert' for score 66+", () => { - assert.equal(getSpecificityLevel(66), "expert"); - assert.equal(getSpecificityLevel(80), "expert"); - assert.equal(getSpecificityLevel(100), "expert"); + expect(getSpecificityLevel(66)).toBe("expert"); + expect(getSpecificityLevel(80)).toBe("expert"); + expect(getSpecificityLevel(100)).toBe("expert"); }); }); describe("getRecommendedMinTier", () => { it("returns 'free' for 'trivial'", () => { - assert.equal(getRecommendedMinTier("trivial"), "free"); + expect(getRecommendedMinTier("trivial")).toBe("free"); }); it("returns 'free' for 'simple'", () => { - assert.equal(getRecommendedMinTier("simple"), "free"); + expect(getRecommendedMinTier("simple")).toBe("free"); }); it("returns 'cheap' for 'moderate'", () => { - assert.equal(getRecommendedMinTier("moderate"), "cheap"); + expect(getRecommendedMinTier("moderate")).toBe("cheap"); }); it("returns 'premium' for 'complex'", () => { - assert.equal(getRecommendedMinTier("complex"), "cheap"); + expect(getRecommendedMinTier("complex")).toBe("cheap"); }); it("returns 'premium' for 'expert'", () => { - assert.equal(getRecommendedMinTier("expert"), "premium"); + expect(getRecommendedMinTier("expert")).toBe("premium"); }); }); describe("isHighSpecificity", () => { it("returns false for trivial query", () => { const result = analyzeSpecificity({ messages: [{ content: "Hi" }] }); - assert.equal(isHighSpecificity(result), false); + expect(isHighSpecificity(result)).toBe(false); }); it("returns false for simple query", () => { const result = analyzeSpecificity({ messages: [{ content: "What is Python?" }], }); - assert.equal(isHighSpecificity(result), false); + expect(isHighSpecificity(result)).toBe(false); }); }); describe("isLowSpecificity", () => { it("returns true for trivial query", () => { const result = analyzeSpecificity({ messages: [{ content: "Hi" }] }); - assert.equal(isLowSpecificity(result), true); + expect(isLowSpecificity(result)).toBe(true); }); it("returns false for complex query", () => { @@ -172,45 +171,45 @@ describe("SpecificityDetector", () => { }, ], }); - assert.equal(isLowSpecificity(result), false); + expect(isLowSpecificity(result)).toBe(false); }); }); describe("analyzeSpecificity returns complete result", () => { it("returns score, breakdown, rulesTriggered, inputTokens, confidence", () => { const result = analyzeSpecificity({ messages: [{ content: "Test" }] }); - assert.ok("score" in result); - assert.ok("breakdown" in result); - assert.ok("rulesTriggered" in result); - assert.ok("inputTokens" in result); - assert.ok("confidence" in result); + expect("score" in result).toBe(true); + expect("breakdown" in result).toBe(true); + expect("rulesTriggered" in result).toBe(true); + expect("inputTokens" in result).toBe(true); + expect("confidence" in result).toBe(true); }); it("returns all 6 breakdown categories", () => { const result = analyzeSpecificity({ messages: [{ content: "Test" }] }); - assert.ok("codeComplexity" in result.breakdown); - assert.ok("mathComplexity" in result.breakdown); - assert.ok("reasoningDepth" in result.breakdown); - assert.ok("contextSize" in result.breakdown); - assert.ok("toolCalling" in result.breakdown); - assert.ok("domainSpecificity" in result.breakdown); + expect("codeComplexity" in result.breakdown).toBe(true); + expect("mathComplexity" in result.breakdown).toBe(true); + expect("reasoningDepth" in result.breakdown).toBe(true); + expect("contextSize" in result.breakdown).toBe(true); + expect("toolCalling" in result.breakdown).toBe(true); + expect("domainSpecificity" in result.breakdown).toBe(true); }); it("returns non-negative scores for all categories", () => { const result = analyzeSpecificity({ messages: [{ content: "Hello" }] }); - assert.ok(result.breakdown.codeComplexity >= 0); - assert.ok(result.breakdown.mathComplexity >= 0); - assert.ok(result.breakdown.reasoningDepth >= 0); - assert.ok(result.breakdown.contextSize >= 0); - assert.ok(result.breakdown.toolCalling >= 0); - assert.ok(result.breakdown.domainSpecificity >= 0); + expect(result.breakdown.codeComplexity).toBeGreaterThanOrEqual(0); + expect(result.breakdown.mathComplexity).toBeGreaterThanOrEqual(0); + expect(result.breakdown.reasoningDepth).toBeGreaterThanOrEqual(0); + expect(result.breakdown.contextSize).toBeGreaterThanOrEqual(0); + expect(result.breakdown.toolCalling).toBeGreaterThanOrEqual(0); + expect(result.breakdown.domainSpecificity).toBeGreaterThanOrEqual(0); }); }); describe("tool calling detection", () => { it("returns 0 when no tools defined", () => { const result = analyzeSpecificity({ messages: [{ content: "Hello" }] }); - assert.equal(result.breakdown.toolCalling, 0); + expect(result.breakdown.toolCalling).toBe(0); }); it("returns positive score when tools present", () => { @@ -221,7 +220,7 @@ describe("SpecificityDetector", () => { { type: "function", function: { name: "weather", description: "get weather" } }, ], }); - assert.ok(result.breakdown.toolCalling > 0); + expect(result.breakdown.toolCalling).toBeGreaterThan(0); }); }); @@ -234,7 +233,7 @@ describe("SpecificityDetector", () => { const t0 = performance.now(); analyzeSpecificity({ messages: msgs }); const elapsed = performance.now() - t0; - assert.ok(elapsed < 5, `Expected < 5ms, got ${elapsed.toFixed(2)}ms`); + expect(elapsed, `Expected < 5ms, got ${elapsed.toFixed(2)}ms`).toBeLessThan(5); }); }); }); diff --git a/open-sse/services/__tests__/tierResolver.test.ts b/open-sse/services/__tests__/tierResolver.test.ts index 2a1fdd2e2a..06836772c3 100644 --- a/open-sse/services/__tests__/tierResolver.test.ts +++ b/open-sse/services/__tests__/tierResolver.test.ts @@ -3,8 +3,7 @@ * Tests: classifyTier, setTierConfig, clearTierCache, getTierStats, classifyTiers */ -import { describe, it, beforeEach } from "node:test"; -import assert from "node:assert/strict"; +import { describe, it, expect, beforeEach } from "vitest"; import { classifyTier, setTierConfig, @@ -27,94 +26,94 @@ describe("TierResolver", () => { describe("classifyTier - free providers", () => { it("classifies Kiro as free", () => { const result = classifyTier("kiro", "claude-sonnet-4.5"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifies Qoder as free", () => { const result = classifyTier("qoder", "kimi-k2-thinking"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifies Pollinations as free", () => { const result = classifyTier("pollinations", "gpt-5"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifies LongCat as free", () => { const result = classifyTier("longcat", "LongCat-2.0"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifies Cloudflare AI as free", () => { const result = classifyTier("cloudflare-ai", "llama-3.3-70b"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifies NVIDIA NIM as free", () => { const result = classifyTier("nvidia-nim", "llama-3.1-8b"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifies Cerebras as free", () => { const result = classifyTier("cerebras", "llama-3.1-70b"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifies Groq as free", () => { const result = classifyTier("groq", "llama-3.3-70b"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("sets costPer1MInput to 0 for free providers", () => { const result = classifyTier("kiro", "claude-sonnet-4.5"); - assert.equal(result.costPer1MInput, 0); - assert.equal(result.costPer1MOutput, 0); + expect(result.costPer1MInput).toBe(0); + expect(result.costPer1MOutput).toBe(0); }); }); describe("classifyTier - cost-based classification", () => { it("classifies DeepSeek as cheap ($0.27/M < $1.00/M)", () => { const result = classifyTier("deepseek", "deepseek-chat"); - assert.equal(result.tier, PROVIDER_TIER.CHEAP); - assert.ok(result.costPer1MInput <= 1.0); + expect(result.tier).toBe(PROVIDER_TIER.CHEAP); + expect(result.costPer1MInput).toBeLessThanOrEqual(1.0); }); it("classifies GLM as cheap ($0.60/M < $1.00/M)", () => { const result = classifyTier("glm", "glm-4.7"); - assert.equal(result.tier, PROVIDER_TIER.CHEAP); - assert.ok(result.costPer1MInput <= 1.0); + expect(result.tier).toBe(PROVIDER_TIER.CHEAP); + expect(result.costPer1MInput).toBeLessThanOrEqual(1.0); }); it("classifies MiniMax as cheap ($0.20/M < $1.00/M)", () => { const result = classifyTier("minimax", "minimax-m2.1"); - assert.equal(result.tier, PROVIDER_TIER.CHEAP); - assert.ok(result.costPer1MInput <= 1.0); + expect(result.tier).toBe(PROVIDER_TIER.CHEAP); + expect(result.costPer1MInput).toBeLessThanOrEqual(1.0); }); it("classifies GPT-4o as premium ($2.50/M > $1.00/M)", () => { const result = classifyTier("openai", "gpt-4o"); - assert.equal(result.tier, PROVIDER_TIER.PREMIUM); - assert.ok(result.costPer1MInput > 1.0); + expect(result.tier).toBe(PROVIDER_TIER.PREMIUM); + expect(result.costPer1MInput).toBeGreaterThan(1.0); }); it("classifies Claude Opus as premium ($15.00/M > $1.00/M)", () => { const result = classifyTier("anthropic", "claude-opus-4-7"); - assert.equal(result.tier, PROVIDER_TIER.PREMIUM); - assert.ok(result.costPer1MInput > 1.0); + expect(result.tier).toBe(PROVIDER_TIER.PREMIUM); + expect(result.costPer1MInput).toBeGreaterThan(1.0); }); it("defaults unknown providers to premium", () => { const result = classifyTier("unknown-provider", "unknown-model"); - assert.equal(result.tier, PROVIDER_TIER.PREMIUM); - assert.equal(result.costPer1MInput, 5.0); // default premium pricing + expect(result.tier).toBe(PROVIDER_TIER.PREMIUM); + expect(result.costPer1MInput).toBe(5.0); // default premium pricing }); }); @@ -122,8 +121,8 @@ describe("TierResolver", () => { it("respects provider-level tier override", () => { setTierConfig({ providerOverrides: [{ provider: "openai", tier: "cheap" }] }); const result = classifyTier("openai", "gpt-4o"); - assert.equal(result.tier, PROVIDER_TIER.CHEAP); - assert.ok(result.reason.includes("override")); + expect(result.tier).toBe(PROVIDER_TIER.CHEAP); + expect(result.reason.includes("override")).toBe(true); }); it("respects model-level glob pattern override", () => { @@ -131,7 +130,7 @@ describe("TierResolver", () => { modelOverrides: [{ provider: "openai", modelPattern: "gpt-4o-mini*", tier: "cheap" }], }); const result = classifyTier("openai", "gpt-4o-mini-2024-07-18"); - assert.equal(result.tier, PROVIDER_TIER.CHEAP); + expect(result.tier).toBe(PROVIDER_TIER.CHEAP); }); it("glob pattern gpt-4o-mini* matches gpt-4o-mini-2024-07-18", () => { @@ -139,15 +138,15 @@ describe("TierResolver", () => { modelOverrides: [{ provider: "openai", modelPattern: "gpt-4o-mini*", tier: "cheap" }], }); const result = classifyTier("openai", "gpt-4o-mini-2024-07-18"); - assert.equal(result.tier, PROVIDER_TIER.CHEAP); + expect(result.tier).toBe(PROVIDER_TIER.CHEAP); }); it("config change invalidates cache", () => { const before = classifyTier("openai", "gpt-4o"); - assert.equal(before.tier, PROVIDER_TIER.PREMIUM); + expect(before.tier).toBe(PROVIDER_TIER.PREMIUM); setTierConfig({ providerOverrides: [{ provider: "openai", tier: "free" }] }); const after = classifyTier("openai", "gpt-4o"); - assert.equal(after.tier, PROVIDER_TIER.FREE); + expect(after.tier).toBe(PROVIDER_TIER.FREE); }); }); @@ -157,15 +156,15 @@ describe("TierResolver", () => { const t0 = performance.now(); classifyTier("openai", "gpt-4o"); const elapsed = performance.now() - t0; - assert.ok(elapsed < 0.1, "cache hit should be <0.1ms"); + expect(elapsed, "cache hit should be <0.1ms").toBeLessThan(0.1); }); it("clearTierCache() forces re-classification", () => { const first = classifyTier("openai", "gpt-4o"); clearTierCache(); const second = classifyTier("openai", "gpt-4o"); - assert.equal(first.tier, second.tier); - assert.ok(second.costPer1MInput > 0); + expect(first.tier).toBe(second.tier); + expect(second.costPer1MInput).toBeGreaterThan(0); }); }); @@ -185,20 +184,25 @@ describe("TierResolver", () => { { provider: "unknown", model: "unknown-model" }, ]; const results = classifyTiers(targets); - assert.equal(results.length, 9); - assert.equal(results[0].tier, PROVIDER_TIER.FREE); // kiro - assert.equal(results[1].tier, PROVIDER_TIER.PREMIUM); // openai gpt-4o ($2.50/M) - assert.equal(results[2].tier, PROVIDER_TIER.CHEAP); // deepseek - assert.equal(results[8].tier, PROVIDER_TIER.PREMIUM); // unknown + expect(results.length).toBe(9); + expect(results[0].tier).toBe(PROVIDER_TIER.FREE); // kiro + expect(results[1].tier).toBe(PROVIDER_TIER.PREMIUM); // openai gpt-4o ($2.50/M) + expect(results[2].tier).toBe(PROVIDER_TIER.CHEAP); // deepseek + expect(results[8].tier).toBe(PROVIDER_TIER.PREMIUM); // unknown }); it("uses cache for repeated models", () => { - classifyTiers([ + clearTierCache(); + const results = classifyTiers([ { provider: "openai", model: "gpt-4o" }, { provider: "openai", model: "gpt-4o" }, ]); - // If cache works, second call should be instant; test passes if no error - assert.ok(true); + // Observable effect of the cache: the duplicate resolves to the same tier and only + // ONE entry is memoized (getTierStats counts cache entries, not classify calls). + assert.equal(results.length, 2); + assert.equal(results[0].tier, results[1].tier); + const stats = getTierStats(); + assert.equal(stats.free + stats.cheap + stats.premium, 1); }); }); @@ -208,8 +212,8 @@ describe("TierResolver", () => { classifyTier("kiro", "claude-sonnet-4.5"); classifyTier("deepseek", "deepseek-chat"); const stats = getTierStats(); - assert.ok(stats[PROVIDER_TIER.FREE] >= 1); - assert.ok(stats[PROVIDER_TIER.CHEAP] >= 1); + expect(stats[PROVIDER_TIER.FREE]).toBeGreaterThanOrEqual(1); + expect(stats[PROVIDER_TIER.CHEAP]).toBeGreaterThanOrEqual(1); }); }); @@ -227,58 +231,64 @@ describe("TierResolver", () => { "cerebras", "groq", ]) { - assert.ok(LEGACY_FREE_PROVIDERS.includes(id), `expected ${id} in LEGACY_FREE_PROVIDERS`); + expect(LEGACY_FREE_PROVIDERS.includes(id), `expected ${id} in LEGACY_FREE_PROVIDERS`).toBe( + true + ); } }); it("deriveNoAuthFreeProviders includes all chat-tier noAuth providers", () => { const derived = deriveNoAuthFreeProviders(); // opencode + mimocode are the ones the bug report called out - assert.ok(derived.includes("opencode"), "opencode should be in derived noAuth-free list"); - assert.ok(derived.includes("mimocode"), "mimocode should be in derived noAuth-free list"); - assert.ok(derived.includes("duckduckgo-web")); + expect(derived.includes("opencode"), "opencode should be in derived noAuth-free list").toBe( + true + ); + expect(derived.includes("mimocode"), "mimocode should be in derived noAuth-free list").toBe( + true + ); + expect(derived.includes("duckduckgo-web")).toBe(true); }); it("deriveNoAuthFreeProviders excludes non-LLM noAuth providers", () => { const derived = deriveNoAuthFreeProviders(); - assert.ok( - !derived.includes("veoaifree-web"), + expect( + derived.includes("veoaifree-web"), "veoaifree-web (serviceKinds: video) must not be classified as chat-free" - ); + ).toBe(false); }); it("DEFAULT_TIER_CONFIG.freeProviders contains the union of legacy + noAuth-derived", () => { const expected = new Set([...LEGACY_FREE_PROVIDERS, ...deriveNoAuthFreeProviders()]); const actual = new Set(DEFAULT_TIER_CONFIG.freeProviders); - assert.deepEqual(actual, expected, "freeProviders must be the union, deduplicated"); + expect(actual).toEqual(expected); }); it("classifyTier classifies opencode/big-pickle as free via noAuth derivation", () => { // No provider override, no cost-based match (big-pickle has no KNOWN_MODEL_PRICING row). // The fix is that 'opencode' is now in freeProviders. const result = classifyTier("opencode", "big-pickle"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifyTier classifies mimocode/mimo-auto as free via noAuth derivation", () => { const result = classifyTier("mimocode", "mimo-auto"); - assert.equal(result.tier, PROVIDER_TIER.FREE); - assert.equal(result.hasFreeTier, true); + expect(result.tier).toBe(PROVIDER_TIER.FREE); + expect(result.hasFreeTier).toBe(true); }); it("classifyTier still returns cheap for paid glm-5.1 (no regression)", () => { // glm-5.1 is not in freeProviders, costs $0.50/M → cheap tier. // Make sure the new noAuth derivation didn't accidentally pull it into free. const result = classifyTier("opencode-go", "glm-5.1"); - assert.equal(result.tier, PROVIDER_TIER.CHEAP); + expect(result.tier).toBe(PROVIDER_TIER.CHEAP); }); it("userConfig.freeProviders is merged on top of the noAuth-derived list", () => { // Re-merge with a new free provider (e.g. local-llama) and confirm it's added. setTierConfig({ freeProviders: ["local-llama"] }); const result = classifyTier("local-llama", "anything"); - assert.equal(result.tier, PROVIDER_TIER.FREE); + expect(result.tier).toBe(PROVIDER_TIER.FREE); clearTierCache(); }); }); diff --git a/open-sse/services/__tests__/volumeDetector.test.ts b/open-sse/services/__tests__/volumeDetector.test.ts index e29684f912..7b71289478 100644 --- a/open-sse/services/__tests__/volumeDetector.test.ts +++ b/open-sse/services/__tests__/volumeDetector.test.ts @@ -1,5 +1,12 @@ -import { describe, it } from "node:test"; -import assert from "node:assert/strict"; +import { describe, it, expect, vi } from "vitest"; + +// Mock the DB so recommendStrategyOverride sees adaptiveVolumeRouting = true. +// Without this the real getSettings() throws (no SQLite in test env), the +// catch block fires, and the function returns noOverride before any rule runs. +vi.mock("@/lib/localDb", () => ({ + getSettings: vi.fn().mockResolvedValue({ adaptiveVolumeRouting: true }), +})); + import { detectVolumeSignals, recommendStrategyOverride } from "../volumeDetector"; describe("volumeDetector", async () => { @@ -9,11 +16,11 @@ describe("volumeDetector", async () => { messages: [{ role: "user", content: "Hello" }], }; const signals = detectVolumeSignals(body); - assert.equal(signals.batchSize, 1); - assert.ok(signals.estimatedTokens < 100); - assert.equal(signals.toolCount, 0); - assert.equal(signals.hasBrowser, false); - assert.equal(signals.complexity, "trivial"); + expect(signals.batchSize).toBe(1); + expect(signals.estimatedTokens).toBeLessThan(100); + expect(signals.toolCount).toBe(0); + expect(signals.hasBrowser).toBe(false); + expect(signals.complexity).toBe("trivial"); }); it("detects tool-heavy request as high complexity", async () => { @@ -27,8 +34,8 @@ describe("volumeDetector", async () => { ], }; const signals = detectVolumeSignals(body); - assert.equal(signals.toolCount, 4); - assert.equal(signals.complexity, "critical"); + expect(signals.toolCount).toBe(4); + expect(signals.complexity).toBe("critical"); }); it("detects browser keywords", async () => { @@ -36,7 +43,7 @@ describe("volumeDetector", async () => { messages: [{ role: "user", content: "Navigate to the page and take a screenshot" }], }; const signals = detectVolumeSignals(body); - assert.equal(signals.hasBrowser, true); + expect(signals.hasBrowser).toBe(true); }); it("detects batch from multi-part content", async () => { @@ -48,7 +55,7 @@ describe("volumeDetector", async () => { messages: [{ role: "user", content: parts }], }; const signals = detectVolumeSignals(body); - assert.equal(signals.batchSize, 20); + expect(signals.batchSize).toBe(20); }); it("detects security keywords as high complexity", async () => { @@ -56,10 +63,10 @@ describe("volumeDetector", async () => { messages: [{ role: "user", content: "Refactor the authentication module for production" }], }; const signals = detectVolumeSignals(body); - assert.ok( + expect( signals.complexity === "critical" || signals.complexity === "high", `expected critical or high, got ${signals.complexity}` - ); + ).toBe(true); }); }); @@ -67,9 +74,9 @@ describe("volumeDetector", async () => { it("recommends round-robin for large batches", async () => { const signals = detectVolumeSignals({ input: Array(60).fill("item") }); const override = await recommendStrategyOverride(signals, "priority"); - assert.equal(override.shouldOverride, true); - assert.equal(override.strategy, "round-robin"); - assert.equal(override.preferEconomy, true); + expect(override.shouldOverride).toBe(true); + expect(override.strategy).toBe("round-robin"); + expect(override.preferEconomy).toBe(true); }); it("recommends premium-first for browser tasks", async () => { @@ -82,9 +89,9 @@ describe("volumeDetector", async () => { complexity: "high" as const, }; const override = await recommendStrategyOverride(signals, "round-robin"); - assert.equal(override.shouldOverride, true); - assert.equal(override.strategy, "priority"); - assert.equal(override.forcePremium, true); + expect(override.shouldOverride).toBe(true); + expect(override.strategy).toBe("priority"); + expect(override.forcePremium).toBe(true); }); it("flags economy for tiny requests without changing strategy", async () => { @@ -97,8 +104,8 @@ describe("volumeDetector", async () => { complexity: "trivial" as const, }; const override = await recommendStrategyOverride(signals, "priority"); - assert.equal(override.shouldOverride, false); - assert.equal(override.preferEconomy, true); + expect(override.shouldOverride).toBe(false); + expect(override.preferEconomy).toBe(true); }); it("no override for normal medium requests", async () => { @@ -111,8 +118,8 @@ describe("volumeDetector", async () => { complexity: "low" as const, }; const override = await recommendStrategyOverride(signals, "priority"); - assert.equal(override.shouldOverride, false); - assert.equal(override.preferEconomy, false); + expect(override.shouldOverride).toBe(false); + expect(override.preferEconomy).toBe(false); }); }); }); diff --git a/open-sse/services/accountFallback.ts b/open-sse/services/accountFallback.ts index 5204c7410d..b51cace449 100644 --- a/open-sse/services/accountFallback.ts +++ b/open-sse/services/accountFallback.ts @@ -58,6 +58,7 @@ import { evictLockoutOverflow } from "./accountFallback/lockoutEviction.ts"; export { MODEL_LOCKOUT_EVICTION_CAP } from "./accountFallback/lockoutEviction.ts"; import { capScaledCooldownMs } from "./accountFallback/cooldownCap.ts"; import { resolveApiKeyForbiddenFallback } from "./accountFallback/nonRetryableUpstream.ts"; +import * as exactModelLock from "./accountFallback/exactModelLock.ts"; export type ProviderProfile = { baseCooldownMs: number; useUpstreamRetryHints: boolean; @@ -183,6 +184,12 @@ export const CREDITS_EXHAUSTED_SIGNALS = [ "out of credits", "payment required", "free tier of the model has been exhausted", + // #8631: narrower than a bare "has been exhausted" — that generic phrase also + // appears in Gemini's transient RPM/TPM 429 body ("Resource has been exhausted + // (e.g. check quota)."), which must stay RATE_LIMIT_EXCEEDED, not terminal. + // Anchoring on "tier" keeps free-tier depletion wording matched while excluding + // Gemini's "resource has been exhausted" rate-limit phrasing. + "tier has been exhausted", // #5239: providers (e.g. DeepSeek/GLM-style) return "Insufficient account balance" // on a depleted key. 402 is already terminalized by status, but catch non-402 // out-of-credit bodies here too. @@ -442,6 +449,12 @@ function getModelLockKey( return `${canonicalProvider}:${connectionId}:${lockModel}`; } +const buildExactKey = exactModelLock.buildExactModelLockKey; // see exactModelLock.ts +const getModelLockKeys = exactModelLock.createGetModelLockKeys( + getModelLockKey, + getCanonicalLockProvider +); + function getFailureWindowMs(profile: ProviderProfile | null = null, fallbackMs = 30 * 60 * 1000) { const configured = profile?.resetTimeoutMs; return typeof configured === "number" && configured > 0 ? configured : fallbackMs; @@ -559,6 +572,14 @@ export function lockModel( }); } +// Lock only this exact provider/account/model tuple, never a quota family — see exactModelLock.ts. +export const lockExactModel = exactModelLock.createLockExactModel( + modelLockouts, + ensureCleanupTimer, + cleanupModelLockKey, + getCanonicalLockProvider +); + /** * Pick the `exactCooldownMs` to apply to a model lockout (#1308). * @@ -591,6 +612,7 @@ export function recordModelLockoutFailure( options: { exactCooldownMs?: number | null; maxCooldownMs?: number; + scope?: "exact" | "quota_family"; /** * #6863 vs #7940: set true only when `exactCooldownMs` came from an actual * upstream signal (Retry-After header, X-RateLimit-Reset, or a reset parsed @@ -606,7 +628,10 @@ export function recordModelLockoutFailure( } = {} ) { ensureCleanupTimer(); - const key = getModelLockKey(provider, connectionId, model, reason, status); + const key = + options.scope === "exact" + ? buildExactKey(getCanonicalLockProvider(provider), connectionId, model) + : getModelLockKey(provider, connectionId, model, reason, status); const now = Date.now(); cleanupModelLockKey(key, now); @@ -656,7 +681,8 @@ export function recordModelLockoutFailure( lastCooldownMs: cooldownMs, }); - lockModel(provider, connectionId, model, reason, cooldownMs, { + const lockFn = options.scope === "exact" ? lockExactModel : lockModel; + lockFn(provider, connectionId, model, reason, cooldownMs, { failureCount, lastFailureAt: now, resetAfterMs, @@ -675,16 +701,11 @@ export function clearModelLock( model: string | null | undefined ): boolean { if (!model) return false; - const familyKey = getModelLockKey(provider, connectionId, model); - const exactKey = `${getCanonicalLockProvider(provider)}:${connectionId}:${model}`; - - const hadLock1 = modelLockouts.delete(familyKey); - const hadFailure1 = modelFailureState.delete(familyKey); - - const hadLock2 = modelLockouts.delete(exactKey); - const hadFailure2 = modelFailureState.delete(exactKey); - - return hadLock1 || hadFailure1 || hadLock2 || hadFailure2; + return exactModelLock.clearMultiKeyLock( + modelLockouts, + modelFailureState, + getModelLockKeys(provider, connectionId, model) + ); } /** @@ -708,6 +729,7 @@ export function hasPerModelQuota( return connectionPassthroughModels; } if (!provider) return false; + if (getCanonicalLockProvider(provider) === "antigravity") return true; if (getCanonicalLockProvider(provider) === "codex") return true; if (provider === "gemini" || provider === "github") return true; if (getPassthroughProviders().has(provider)) return true; @@ -731,7 +753,8 @@ export function lockModelIfPerModelQuota( // Skip model-level lock if the entire provider is in circuit-breaker cooldown. // The provider cooldown already prevents all requests, so a model lock is redundant. if (isProviderInCooldown(provider)) return false; - lockModel(provider, connectionId, model, reason, cooldownMs); + const lockFn = getCanonicalLockProvider(provider) === "antigravity" ? lockExactModel : lockModel; + lockFn(provider, connectionId, model, reason, cooldownMs); return true; } @@ -800,14 +823,11 @@ export function isModelLocked( model: string | null | undefined ): boolean { if (!model) return false; - - const exactKey = `${getCanonicalLockProvider(provider)}:${connectionId}:${model}`; - cleanupModelLockKey(exactKey); - if (modelLockouts.has(exactKey)) return true; - - const familyKey = getModelLockKey(provider, connectionId, model); - cleanupModelLockKey(familyKey); - return modelLockouts.has(familyKey); + return exactModelLock.isAnyKeyLocked( + modelLockouts, + cleanupModelLockKey, + getModelLockKeys(provider, connectionId, model) + ); } /** @@ -819,32 +839,18 @@ export function getModelLockoutInfo( model: string | null | undefined ) { if (!model) return null; - - const exactKey = `${getCanonicalLockProvider(provider)}:${connectionId}:${model}`; - cleanupModelLockKey(exactKey); - const exactEntry = modelLockouts.get(exactKey); - if (exactEntry) { - return { - reason: exactEntry.reason, - remainingMs: exactEntry.until - Date.now(), - lockedAt: new Date(exactEntry.lockedAt).toISOString(), - failureCount: exactEntry.failureCount, - }; - } - - const familyKey = getModelLockKey(provider, connectionId, model); - cleanupModelLockKey(familyKey); - const familyEntry = modelLockouts.get(familyKey); - if (familyEntry) { - return { - reason: familyEntry.reason, - remainingMs: familyEntry.until - Date.now(), - lockedAt: new Date(familyEntry.lockedAt).toISOString(), - failureCount: familyEntry.failureCount, - }; - } - - return null; + const entry = exactModelLock.findLatestLockEntry( + modelLockouts, + cleanupModelLockKey, + getModelLockKeys(provider, connectionId, model) + ); + if (!entry) return null; + return { + reason: entry.reason, + remainingMs: entry.until - Date.now(), + lockedAt: new Date(entry.lockedAt).toISOString(), + failureCount: entry.failureCount, + }; } export type ModelLockoutInfo = { @@ -1625,7 +1631,11 @@ export function checkFallbackError( !errorStr.toLowerCase().includes("hour quota") && !errorStr.toLowerCase().includes("quota has been exceeded") ) { - return resolveApiKeyForbiddenFallback(errorStr, buildRetryableFallback, RateLimitReason.AUTH_ERROR); + return resolveApiKeyForbiddenFallback( + errorStr, + buildRetryableFallback, + RateLimitReason.AUTH_ERROR + ); } } @@ -1947,6 +1957,8 @@ export function applyErrorState( return nextState; } +export { isAccountSemaphoreFull } from "./accountSemaphore.ts"; + /** * Get account health score (0-100) for P2C selection (Phase 9) * @param {object} account diff --git a/open-sse/services/accountFallback/exactModelLock.ts b/open-sse/services/accountFallback/exactModelLock.ts new file mode 100644 index 0000000000..838d6a9173 --- /dev/null +++ b/open-sse/services/accountFallback/exactModelLock.ts @@ -0,0 +1,158 @@ +/** + * accountFallback/exactModelLock.ts — exact-model (non-family-scoped) lockout key + entry math. + * + * Extracted from services/accountFallback.ts (file-size gate, #8630): pure helpers for the + * opt-in "exact model" lockout scope introduced for Antigravity — a confirmed exhaustion on + * one specific model (e.g. one Claude model) must not lock the whole quota family (Gemini or + * other Claude models on the same account). Pure w.r.t. module state — accountFallback.ts + * still owns the modelLockouts/modelFailureState maps, canonical-provider resolution, and the + * cleanup timer; it calls into these with its own map instances. + */ + +import type { ModelLockoutEntry, ModelFailureState } from "../accountFallback.ts"; + +/** Build the "exact" scoped lockout key — a distinct namespace from the quota-family key. */ +export function buildExactModelLockKey( + canonicalProvider: string, + connectionId: string, + model: string +): string { + return `${canonicalProvider}:${connectionId}:exact:${model.trim().toLowerCase()}`; +} + +/** Dedupe the 3 lockout key shapes callers must check: quota-family, #8050 not_found, exact. */ +export function collectModelLockKeys( + familyKey: string, + notFoundKey: string, + exactKey: string +): string[] { + return Array.from(new Set([familyKey, notFoundKey, exactKey])); +} + +/** + * DI factory for `getModelLockKeys` — accountFallback.ts's own `getModelLockKey` (quota-family + * scoping) and `getCanonicalLockProvider` (alias resolution) are private, so this closes over + * them here rather than duplicating that logic in the leaf. + */ +export function createGetModelLockKeys( + getModelLockKey: ( + provider: string, + connectionId: string, + model: string, + reason?: string | null, + status?: number | null + ) => string, + getCanonicalLockProvider: (provider: string) => string +) { + return function getModelLockKeys(provider: string, connectionId: string, model: string) { + return collectModelLockKeys( + getModelLockKey(provider, connectionId, model), + getModelLockKey(provider, connectionId, model, "not_found", 404), + buildExactModelLockKey(getCanonicalLockProvider(provider), connectionId, model) + ); + }; +} + +/** + * Compute the next ModelLockoutEntry for an exact-model lock, merging with any existing entry + * the same way lockModel() does (extend failureCount on a shorter re-lock instead of shrinking + * the remaining cooldown). Returns null when the caller should leave state untouched. + */ +export function computeExactModelLockEntry( + existing: ModelLockoutEntry | undefined, + reason: string, + cooldownMs: number, + metadata: Partial +): ModelLockoutEntry | null { + const now = Date.now(); + const newUntil = now + cooldownMs; + if (existing && existing.until > newUntil) { + if (!metadata.failureCount || metadata.failureCount <= existing.failureCount) return null; + return { + ...existing, + failureCount: metadata.failureCount, + lastFailureAt: metadata.lastFailureAt ?? existing.lastFailureAt, + resetAfterMs: metadata.resetAfterMs ?? existing.resetAfterMs, + }; + } + return { + reason, + until: newUntil, + lockedAt: now, + failureCount: metadata.failureCount ?? existing?.failureCount ?? 1, + lastFailureAt: metadata.lastFailureAt ?? now, + resetAfterMs: metadata.resetAfterMs ?? existing?.resetAfterMs ?? 0, + }; +} + +/** + * Delete every one of the 3 lockout key shapes from both maps — a success on any one + * of them must clear the lock regardless of which reason originally wrote it. + */ +export function clearMultiKeyLock( + modelLockouts: Map, + modelFailureState: Map, + keys: string[] +): boolean { + let cleared = false; + for (const key of keys) { + cleared = modelLockouts.delete(key) || cleared; + cleared = modelFailureState.delete(key) || cleared; + } + return cleared; +} + +/** True when any of the 3 lockout key shapes is currently active (post-cleanup). */ +export function isAnyKeyLocked( + modelLockouts: Map, + cleanup: (key: string) => void, + keys: string[] +): boolean { + return keys.some((key) => { + cleanup(key); + return modelLockouts.has(key); + }); +} + +/** The active entry with the most remaining time across the 3 lockout key shapes. */ +export function findLatestLockEntry( + modelLockouts: Map, + cleanup: (key: string) => void, + keys: string[] +): ModelLockoutEntry | undefined { + return keys + .map((key) => { + cleanup(key); + return modelLockouts.get(key); + }) + .filter((value): value is ModelLockoutEntry => Boolean(value)) + .sort((a, b) => b.until - a.until)[0]; +} + +/** + * DI factory for the exported `lockExactModel` — accountFallback.ts owns the + * modelLockouts map + cleanup timer/key private functions and closes over them here so + * the full lock-only-this-exact-tuple implementation lives in this leaf, not the god-file. + */ +export function createLockExactModel( + modelLockouts: Map, + ensureCleanupTimer: () => void, + cleanupModelLockKey: (key: string) => void, + getCanonicalLockProvider: (provider: string) => string +) { + return function lockExactModel( + provider: string, + connectionId: string, + model: string | null | undefined, + reason: string, + cooldownMs: number, + metadata: Partial = {} + ): void { + if (!model) return; + ensureCleanupTimer(); + const key = buildExactModelLockKey(getCanonicalLockProvider(provider), connectionId, model); + cleanupModelLockKey(key); + const next = computeExactModelLockEntry(modelLockouts.get(key), reason, cooldownMs, metadata); + if (next) modelLockouts.set(key, next); + }; +} diff --git a/open-sse/services/accountSemaphore.ts b/open-sse/services/accountSemaphore.ts index affb06a41f..2d3a1f50b8 100644 --- a/open-sse/services/accountSemaphore.ts +++ b/open-sse/services/accountSemaphore.ts @@ -54,8 +54,21 @@ export function buildAccountSemaphoreKey({ return `${String(provider)}:${String(accountKey)}`; } +/** + * Effective positive cap, or null when the semaphore is bypassed (unset/<=0). + * + * Narrowing companion of {@link isBypassed}: that one returns a plain boolean, so + * TypeScript cannot narrow `number | null` to `number` in its else-branch (a + * `x is null | undefined` predicate would be unsound — 0 bypasses too). Callers + * that need the VALUE after the guard go through here instead of casting. + */ +function resolveActiveCap(maxConcurrency?: number | null): number | null { + if (maxConcurrency == null || maxConcurrency <= 0) return null; + return maxConcurrency; +} + function isBypassed(maxConcurrency?: number | null): boolean { - return maxConcurrency == null || maxConcurrency <= 0; + return resolveActiveCap(maxConcurrency) === null; } function createNoopReleaseFn(): () => void { @@ -192,7 +205,8 @@ export function acquire( maxQueueSize = DEFAULT_MAX_QUEUE_SIZE, }: AcquireAccountSemaphoreOptions = {} ): Promise<() => void> { - if (isBypassed(maxConcurrency)) { + const activeCap = resolveActiveCap(maxConcurrency); + if (activeCap === null) { return Promise.resolve(createNoopReleaseFn()); } @@ -200,7 +214,7 @@ export function acquire( return Promise.reject(makeAbortError(signal)); } - const gate = ensureGate(semaphoreKey, maxConcurrency); + const gate = ensureGate(semaphoreKey, activeCap); clearCleanupTimer(gate); if (gate.running < gate.maxConcurrency && !isBlocked(gate)) { @@ -342,6 +356,24 @@ export function getStats(): Record { return stats; } +/** + * Check if an account semaphore key is currently at or over its max concurrency limit. + * Returns true if running >= maxConcurrency or blocked. + */ +export function isAccountSemaphoreFull( + provider: string, + accountKey: string, + maxConcurrency?: number | null +): boolean { + if (isBypassed(maxConcurrency)) return false; + const key = buildAccountSemaphoreKey({ provider, accountKey }); + const gate = gates.get(key); + if (!gate) return false; + const effectiveCap = maxConcurrency ?? gate.maxConcurrency; + if (isBypassed(effectiveCap)) return false; + return gate.running >= effectiveCap || isBlocked(gate); +} + /** * Reset a single key and reject queued waiters. */ diff --git a/open-sse/services/adobeFireflyBrowserLogin.ts b/open-sse/services/adobeFireflyBrowserLogin.ts new file mode 100644 index 0000000000..1482971c3e --- /dev/null +++ b/open-sse/services/adobeFireflyBrowserLogin.ts @@ -0,0 +1,482 @@ +/** + * Adobe Firefly browser login (packaged-backend safe). + * + * Firefly needs an Adobe IMS access_token JWT (Bearer) issued for + * client_id `clio-playground-web`. That JWT is NEVER present in + * cookies/localStorage тАФ the SPA only holds it in memory and attaches it + * as `Authorization: Bearer ` on XHRs to firefly-3p.ff.adobe.io. + * + * IMPORTANT: The VibeProxyServices.exe is a pkg-packaged Node binary. + * Dynamic `import("playwright")` fails there (native bindings / browsers + * are not in the package). This module launches the **system** Chrome or + * Edge with `--remote-debugging-port` and talks pure Chrome DevTools + * Protocol over WebSocket тАФ zero Playwright dependency. + */ +import { spawn, type ChildProcess } from "node:child_process"; +import { existsSync, mkdtempSync, rmSync } from "node:fs"; +import { createServer } from "node:net"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { sanitizeErrorMessage } from "../utils/error.ts"; + +const FIREFLY_HOME_URL = "https://firefly.adobe.com/"; +const FIREFLY_3P_HOST_SUFFIX = "firefly-3p.ff.adobe.io"; +// Bounded quantifiers (Hard Rule: avoid ReDoS on adversarial Authorization headers). +const ADOBE_BEARER_REGEX = + /^Bearer\s+(eyJ[A-Za-z0-9_-]{1,4096}\.[A-Za-z0-9_-]{1,4096}\.[A-Za-z0-9_-]{1,4096})/i; + +const DEFAULT_LOGIN_TIMEOUT_MS = 300_000; +const MIN_LOGIN_TIMEOUT_MS = 15_000; +const MAX_LOGIN_TIMEOUT_MS = 600_000; +const POLL_INTERVAL_MS = 400; +const CDP_READY_TIMEOUT_MS = 30_000; + +export interface AdobeFireflyBrowserLoginResult { + success: boolean; + credentials?: { accessToken?: string; cookie?: string }; + /** Best-effort Adobe account label (email or user id) decoded from the JWT. */ + account?: string; + error?: string; +} + +export function clampAdobeFireflyLoginTimeout(value: unknown): number { + if (typeof value !== "number" || !Number.isFinite(value)) return DEFAULT_LOGIN_TIMEOUT_MS; + return Math.max(MIN_LOGIN_TIMEOUT_MS, Math.min(MAX_LOGIN_TIMEOUT_MS, Math.trunc(value))); +} + +/** Extract an IMS JWT from an Authorization header value. Exported for unit tests. */ +export function extractAdobeBearerTokenFromAuthorization(authHeader: string): string { + const m = String(authHeader || "").match(ADOBE_BEARER_REGEX); + return m?.[1] || ""; +} + +/** Build a single cookie header from relevant Firefly cookies. Exported for unit tests. */ +export function buildAdobeFireflyCookieHeader( + cookies: Array<{ name: string; value: string; domain?: string }> +): string { + const wanted = ["sherlockToken", "forterToken", "aux_sid", "ff_session_guid"]; + const parts: string[] = []; + for (const wantedName of wanted) { + const c = cookies.find( + (candidate) => + candidate.name === wantedName && + typeof candidate.value === "string" && + candidate.value.length > 0 && + !/[\r\n;]/.test(candidate.value) + ); + if (c) parts.push(`${wantedName}=${c.value}`); + } + return parts.join("; "); +} + +/** Best-effort account label from an IMS JWT payload. Exported for unit tests. */ +export function accountLabelFromAdobeJwt(token: string): string { + try { + const part = String(token || "").split(".")[1]; + if (!part) return ""; + const json = Buffer.from(part.replace(/-/g, "+").replace(/_/g, "/"), "base64").toString("utf8"); + const obj = JSON.parse(json) as Record; + for (const key of ["email", "preferred_username", "user_id", "sub"]) { + const v = obj[key]; + if (typeof v === "string" && v.trim()) return v.trim(); + } + } catch { + // ignore + } + return ""; +} + +/** Resolve system Chrome/Edge executable. Exported for unit tests. */ +export function resolveSystemBrowserExecutable(): string | null { + const configured = process.env.OMNIROUTE_LOGIN_BROWSER_PATH?.trim(); + if (configured && existsSync(configured)) return configured; + + const pf = process.env.ProgramFiles || "C:\\Program Files"; + const pf86 = process.env["ProgramFiles(x86)"] || "C:\\Program Files (x86)"; + const local = process.env.LOCALAPPDATA || ""; + const candidates = [ + join(pf, "Google", "Chrome", "Application", "chrome.exe"), + join(pf86, "Google", "Chrome", "Application", "chrome.exe"), + join(local, "Google", "Chrome", "Application", "chrome.exe"), + join(pf, "Microsoft", "Edge", "Application", "msedge.exe"), + join(pf86, "Microsoft", "Edge", "Application", "msedge.exe"), + join(local, "Microsoft", "Edge", "Application", "msedge.exe"), + "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome", + "/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge", + "/usr/bin/google-chrome-stable", + "/usr/bin/google-chrome", + "/usr/bin/chromium-browser", + "/usr/bin/chromium", + "/usr/bin/microsoft-edge", + "/usr/bin/microsoft-edge-stable", + ]; + for (const path of candidates) { + if (path && existsSync(path)) return path; + } + return null; +} + +async function getFreeLoopbackPort(): Promise { + return new Promise((resolve, reject) => { + const server = createServer(); + server.once("error", reject); + server.listen(0, "127.0.0.1", () => { + const addr = server.address(); + if (!addr || typeof addr === "string") { + server.close(); + reject(new Error("Could not allocate a free loopback port for Chrome DevTools")); + return; + } + const { port } = addr; + server.close((err) => (err ? reject(err) : resolve(port))); + }); + }); +} + +async function waitForCdpReady( + port: number, + timeoutMs: number +): Promise<{ webSocketDebuggerUrl: string }> { + const deadline = Date.now() + timeoutMs; + let lastError = "CDP endpoint not ready"; + while (Date.now() < deadline) { + try { + const res = await fetch(`http://127.0.0.1:${port}/json/version`, { + signal: AbortSignal.timeout(2000), + }); + if (res.ok) { + const body = (await res.json()) as { webSocketDebuggerUrl?: string }; + if (body.webSocketDebuggerUrl) { + return { webSocketDebuggerUrl: body.webSocketDebuggerUrl }; + } + } + lastError = `CDP /json/version HTTP ${res.status}`; + } catch (err) { + lastError = err instanceof Error ? err.message : String(err); + } + await new Promise((r) => setTimeout(r, 250)); + } + throw new Error(`Chrome DevTools did not become ready: ${lastError}`); +} + +type CdpCookie = { name: string; value: string; domain?: string }; + +class CdpSocket { + private ws: WebSocket; + private nextId = 1; + private pending = new Map< + number, + { resolve: (v: unknown) => void; reject: (e: Error) => void } + >(); + private onEvent: (method: string, params: Record) => void; + + constructor(ws: WebSocket, onEvent: (method: string, params: Record) => void) { + this.ws = ws; + this.onEvent = onEvent; + this.ws.addEventListener("message", (ev) => { + let data: Record; + try { + data = JSON.parse(String(ev.data)) as Record; + } catch { + return; + } + if (typeof data.id === "number" && this.pending.has(data.id)) { + const p = this.pending.get(data.id)!; + this.pending.delete(data.id); + if (data.error) { + const errObj = data.error as { message?: string }; + p.reject(new Error(errObj.message || "CDP error")); + } else { + p.resolve(data.result); + } + return; + } + if (typeof data.method === "string") { + this.onEvent(data.method, (data.params || {}) as Record); + } + }); + } + + send(method: string, params?: Record, sessionId?: string): Promise { + const id = this.nextId++; + const msg: Record = { id, method }; + if (params) msg.params = params; + if (sessionId) msg.sessionId = sessionId; + return new Promise((resolve, reject) => { + this.pending.set(id, { resolve, reject }); + try { + this.ws.send(JSON.stringify(msg)); + } catch (err) { + this.pending.delete(id); + reject(err instanceof Error ? err : new Error(String(err))); + } + }); + } + + close(): void { + try { + this.ws.close(); + } catch { + /* ignore */ + } + } + + get open(): boolean { + return this.ws.readyState === WebSocket.OPEN; + } +} + +async function openCdp(url: string): Promise { + const WebSocketCtor = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket; + if (!WebSocketCtor) { + throw new Error("WebSocket is unavailable in this Node runtime"); + } + return new Promise((resolve, reject) => { + const ws = new WebSocketCtor(url); + const onErr = () => reject(new Error(`Failed to connect CDP: ${url}`)); + ws.addEventListener("error", onErr); + ws.addEventListener("open", () => { + ws.removeEventListener("error", onErr); + resolve(ws); + }); + }); +} + +/** + * Capture Firefly IMS JWT by watching Network.requestWillBeSent on all page targets. + */ +async function captureViaCdp(opts: { + port: number; + browserWsUrl: string; + timeoutMs: number; +}): Promise<{ accessToken: string; cookies: CdpCookie[] }> { + let capturedAccessToken = ""; + const pageSockets = new Map(); + let browserCdp: CdpSocket | null = null; + + const onEvent = (method: string, params: Record) => { + if (method === "Network.requestWillBeSent") { + if (capturedAccessToken) return; + const request = params.request as + { url?: string; headers?: Record } | undefined; + if (!request?.url) return; + let host: string; + try { + host = new URL(request.url).hostname.toLowerCase(); + } catch { + return; + } + if (host !== FIREFLY_3P_HOST_SUFFIX && !host.endsWith(`.${FIREFLY_3P_HOST_SUFFIX}`)) return; + const headers = request.headers || {}; + const auth = headers.Authorization || headers.authorization || headers.AUTHORIZATION || ""; + const token = extractAdobeBearerTokenFromAuthorization(auth); + if (token) capturedAccessToken = token; + } else if (method === "Target.attachedToTarget") { + const sessionId = String(params.sessionId || ""); + const targetInfo = params.targetInfo as { type?: string; targetId?: string } | undefined; + if (sessionId && targetInfo?.type === "page" && browserCdp) { + void browserCdp.send("Network.enable", {}, sessionId).catch(() => undefined); + } + } + }; + + try { + const browserWs = await openCdp(opts.browserWsUrl); + browserCdp = new CdpSocket(browserWs, onEvent); + await browserCdp.send("Target.setDiscoverTargets", { discover: true }).catch(() => undefined); + await browserCdp + .send("Target.setAutoAttach", { + autoAttach: true, + waitForDebuggerOnStart: false, + flatten: true, + }) + .catch(() => undefined); + + const deadline = Date.now() + opts.timeoutMs; + while (Date.now() < deadline) { + // Attach to every page target listed by the DevTools HTTP API. + try { + const list = (await fetch(`http://127.0.0.1:${opts.port}/json/list`, { + signal: AbortSignal.timeout(2000), + }).then((r) => r.json())) as Array<{ + id?: string; + type?: string; + url?: string; + webSocketDebuggerUrl?: string; + }>; + for (const t of list) { + if (t.type !== "page" || !t.webSocketDebuggerUrl || !t.id) continue; + if (pageSockets.has(t.id)) continue; + try { + const ws = await openCdp(t.webSocketDebuggerUrl); + const cdp = new CdpSocket(ws, onEvent); + pageSockets.set(t.id, cdp); + await cdp.send("Network.enable"); + if (!t.url || t.url === "about:blank" || t.url.startsWith("chrome://")) { + await cdp.send("Page.enable").catch(() => undefined); + await cdp.send("Page.navigate", { url: FIREFLY_HOME_URL }).catch(() => undefined); + } + } catch { + // page may navigate away mid-connect + } + } + } catch { + // list may fail briefly while Chrome starts + } + + if (capturedAccessToken) { + // Prefer cookies from any live page socket; fall back to empty. + for (const cdp of pageSockets.values()) { + if (!cdp.open) continue; + try { + const result = (await cdp.send("Network.getAllCookies")) as { + cookies?: CdpCookie[]; + }; + return { + accessToken: capturedAccessToken, + cookies: Array.isArray(result?.cookies) ? result.cookies : [], + }; + } catch { + /* try next */ + } + } + return { accessToken: capturedAccessToken, cookies: [] }; + } + + await new Promise((r) => setTimeout(r, POLL_INTERVAL_MS)); + } + + throw new Error( + "Adobe Firefly sign-in timed out. Complete sign-in at firefly.adobe.com and trigger an action " + + "(open Generate) so the browser sends the Firefly request, then try again." + ); + } finally { + for (const cdp of pageSockets.values()) cdp.close(); + browserCdp?.close(); + } +} + +function killProcessTree(child: ChildProcess | null): void { + if (!child?.pid) return; + try { + if (process.platform === "win32") { + spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], { + stdio: "ignore", + windowsHide: true, + }); + } else { + child.kill("SIGTERM"); + setTimeout(() => { + try { + child.kill("SIGKILL"); + } catch { + /* ignore */ + } + }, 2000).unref?.(); + } + } catch { + try { + child.kill(); + } catch { + /* ignore */ + } + } +} + +/** + * Launch system Chrome/Edge at firefly.adobe.com, intercept firefly-3p + * Authorization Bearer via CDP, return JWT + useful cookies. + */ +export async function startAdobeFireflyBrowserLogin( + requestedTimeout?: unknown +): Promise { + const timeout = clampAdobeFireflyLoginTimeout(requestedTimeout); + const browserPath = resolveSystemBrowserExecutable(); + if (!browserPath) { + return { + success: false, + error: + "No Chrome or Edge browser found for Adobe Firefly sign-in. " + + "Install Google Chrome or Microsoft Edge, or set OMNIROUTE_LOGIN_BROWSER_PATH, " + + "or paste the IMS Bearer JWT from firefly-3p.ff.adobe.io.", + }; + } + + let userDataDir: string | null = null; + let child: ChildProcess | null = null; + try { + userDataDir = mkdtempSync(join(tmpdir(), "omniroute-firefly-login-")); + const port = await getFreeLoopbackPort(); + + const args = [ + `--remote-debugging-port=${port}`, + `--user-data-dir=${userDataDir}`, + "--no-first-run", + "--no-default-browser-check", + "--disable-sync", + "--disable-background-networking", + "--window-size=1280,800", + FIREFLY_HOME_URL, + ]; + + child = spawn(browserPath, args, { + stdio: "ignore", + windowsHide: false, + detached: false, + }); + + // If Chrome exits immediately, fail fast with a clear message. + const earlyExit = new Promise((_, reject) => { + child?.once("exit", (code) => { + reject(new Error(`Browser exited early (code ${code}). Is the executable runnable?`)); + }); + child?.once("error", (err) => { + reject(new Error(`Failed to launch browser: ${err.message}`)); + }); + }); + + const ready = waitForCdpReady(port, CDP_READY_TIMEOUT_MS); + const { webSocketDebuggerUrl } = await Promise.race([ready, earlyExit]); + + // Detach exit handler so normal user close after capture is fine + child.removeAllListeners("exit"); + child.removeAllListeners("error"); + + const captured = await Promise.race([ + captureViaCdp({ + port, + browserWsUrl: webSocketDebuggerUrl, + timeoutMs: timeout, + }), + earlyExit, + ]); + + const cookie = buildAdobeFireflyCookieHeader(captured.cookies); + const account = accountLabelFromAdobeJwt(captured.accessToken); + return { + success: true, + credentials: { + accessToken: captured.accessToken, + ...(cookie ? { cookie } : {}), + }, + ...(account ? { account } : {}), + }; + } catch (error) { + return { + success: false, + error: sanitizeErrorMessage(error instanceof Error ? error.message : error), + }; + } finally { + killProcessTree(child); + child = null; + if (userDataDir) { + // Give Chrome a moment to release the profile directory. + await new Promise((r) => setTimeout(r, 300)); + try { + rmSync(userDataDir, { recursive: true, force: true }); + } catch { + // Profile may still be locked; temp cleaner will reclaim later. + } + } + } +} diff --git a/open-sse/services/adobeFireflyClient.ts b/open-sse/services/adobeFireflyClient.ts index b9ee9e1589..16d491637a 100644 --- a/open-sse/services/adobeFireflyClient.ts +++ b/open-sse/services/adobeFireflyClient.ts @@ -49,11 +49,57 @@ const DEFAULT_USER_AGENT = const DEFAULT_SEC_CH_UA = '"Not;A=Brand";v="8", "Chromium";v="150", "Google Chrome";v="150"'; const DEFAULT_POLL_INTERVAL_MS = 3000; -const DEFAULT_IMAGE_TIMEOUT_MS = 180_000; +/** + * Poll budget for image generate-async. Multi-ref gpt-image / nano jobs commonly + * exceed 3 minutes (upload + colligo + render at detailLevel 5). 180s was the + * previous default and produced widespread 504s on listing assets with screenshots. + */ +export const DEFAULT_IMAGE_TIMEOUT_MS = 300_000; const DEFAULT_VIDEO_TIMEOUT_MS = 300_000; +/** Extra poll budget per uploaded reference blob (large screenshots + image2image). */ +export const ADOBE_FIREFLY_IMAGE_TIMEOUT_PER_REF_MS = 60_000; +export const ADOBE_FIREFLY_IMAGE_TIMEOUT_MAX_MS = 600_000; +/** + * gpt-image family accepts subject refs, but the live SPA and colligo are reliable + * with 1–2 only. Sending 3–4+ (e.g. Store listing "5 screenshots") often hangs until + * poll timeout. Nano multi-ref composition supports more via usage "general". + */ +export const ADOBE_FIREFLY_GPT_IMAGE_MAX_REFS = 2; +export const ADOBE_FIREFLY_NANO_MAX_REFS = 4; +export const ADOBE_FIREFLY_GENERIC_IMAGE_MAX_REFS = 2; const FIREFLY_ORIGIN = "https://firefly.adobe.com"; const FIREFLY_REFERER = "https://firefly.adobe.com/"; +/** Cap reference uploads by Firefly image model family. */ +export function adobeFireflyMaxImageRefs(model: string): number { + const raw = String(model || "").toLowerCase(); + if (raw.includes("nano-banana") || raw.includes("nanobanana") || raw.includes("gemini-flash")) { + return ADOBE_FIREFLY_NANO_MAX_REFS; + } + if (raw.includes("gpt-image") || raw.includes("gptimage")) { + return ADOBE_FIREFLY_GPT_IMAGE_MAX_REFS; + } + return ADOBE_FIREFLY_GENERIC_IMAGE_MAX_REFS; +} + +/** + * Resolve poll timeout: explicit body.timeout_ms wins; else base + per-ref budget. + * Covers multi-screenshot listing jobs without unbounded waits. + */ +export function adobeFireflyImageTimeoutMs(opts?: { + timeoutMs?: number; + refCount?: number; +}): number { + const explicit = Number(opts?.timeoutMs); + if (Number.isFinite(explicit) && explicit > 0) { + return Math.min(ADOBE_FIREFLY_IMAGE_TIMEOUT_MAX_MS, Math.floor(explicit)); + } + const refs = Math.max(0, Math.floor(Number(opts?.refCount) || 0)); + const budget = + DEFAULT_IMAGE_TIMEOUT_MS + refs * ADOBE_FIREFLY_IMAGE_TIMEOUT_PER_REF_MS; + return Math.min(ADOBE_FIREFLY_IMAGE_TIMEOUT_MAX_MS, budget); +} + export type AdobeFireflyImageModelId = | "nano-banana-pro" | "nano-banana" @@ -716,9 +762,14 @@ export function buildAdobeImagePayload(opts: { }; if (opts.sourceImageIds?.length) { // gpt-image subject references (mask path uses separate mask blob when present). + // Cap to wire-stable count — extra subject blobs stall colligo until poll 504. + const refIds = opts.sourceImageIds + .map((id) => String(id)) + .filter(Boolean) + .slice(0, ADOBE_FIREFLY_GPT_IMAGE_MAX_REFS); payload.generationMetadata = { module: "image2image", submodule: "ff-image-generate" }; - payload.referenceBlobs = opts.sourceImageIds.map((id) => ({ - id: String(id), + payload.referenceBlobs = refIds.map((id) => ({ + id, usage: "subject", })); payload.modelSpecificPayload = {}; @@ -751,8 +802,16 @@ export function buildAdobeImagePayload(opts: { if (Object.keys(genSettings).length) payload.generationSettings = genSettings; if (opts.sourceImageIds?.length) { - payload.referenceBlobs = opts.sourceImageIds.map((id) => ({ - id: String(id), + const maxRefs = + opts.modelSpec.family === "generic" + ? ADOBE_FIREFLY_GENERIC_IMAGE_MAX_REFS + : ADOBE_FIREFLY_NANO_MAX_REFS; + const refIds = opts.sourceImageIds + .map((id) => String(id)) + .filter(Boolean) + .slice(0, maxRefs); + payload.referenceBlobs = refIds.map((id) => ({ + id, usage: "general", })); // Flux / Seedream / Runway image historically used image2image; nano keeps text2image. @@ -1967,7 +2026,7 @@ async function sleep(ms: number): Promise { await new Promise((resolve) => setTimeout(resolve, ms)); } -async function pollAdobeJob(opts: { +export async function pollAdobeJob(opts: { pollUrl: string; accessToken: string; kind: "image" | "video"; @@ -2167,11 +2226,15 @@ export async function adobeFireflyGenerateImage(opts: { } pollUrl = normalizeAdobePollUrl(pollUrl); + const pollTimeoutMs = adobeFireflyImageTimeoutMs({ + timeoutMs: opts.timeoutMs, + refCount: opts.sourceImageIds?.length ?? 0, + }); const { mediaUrl, latest } = await pollAdobeJob({ pollUrl, accessToken: opts.accessToken, kind: "image", - timeoutMs: opts.timeoutMs && opts.timeoutMs > 0 ? opts.timeoutMs : DEFAULT_IMAGE_TIMEOUT_MS, + timeoutMs: pollTimeoutMs, fetchImpl, log: opts.log, }); diff --git a/open-sse/services/adobeFireflyUpscale.ts b/open-sse/services/adobeFireflyUpscale.ts new file mode 100644 index 0000000000..92edc6b340 --- /dev/null +++ b/open-sse/services/adobeFireflyUpscale.ts @@ -0,0 +1,437 @@ +/** + * Adobe Firefly (unofficial) image **upsample** client — Topaz Labs models. + * + * Wire contract from a live firefly.adobe.com capture (web_providers/upsample.txt): + * + * POST https://firefly-3p.ff.adobe.io/v2/3p-images/upsample + * headers: Authorization: Bearer + * x-api-key: clio-playground-web + * x-arp-session-id: (NO x-nonce on this endpoint) + * content-type: application/json + * body: { + * "modelId": "topaz", + * "modelVersion": "reimagine", + * "generationMetadata": { "module": "image-editing", "submodule": "ff-image-editor", ... }, + * "referenceBlobs": [{ "id": "", "usage": "general" }], + * "upsamplerFactor": 2, + * "creativityLevel": 0 + * } + * → 200 { "links": { "cancel": {...}, "result": { "href": ".../jobs/result/" } } } + * + * The job link is polled with the same BKS rewrite + status semantics as + * generate-async, so `pollAdobeJob` from `adobeFireflyClient.ts` is reused verbatim. + * + * Model discovery (web_providers/upscale.txt) lists modelId `topaz` with image + * modelVersions `default` / `standard` / `reimagine`, each carrying + * `inputMediaUseCase: ["upscaling"]`. `starlight-*` and `astra-2` are the VIDEO + * upscalers of the same family (`acModelFamilyId: topaz-video`) and are not served + * by this image endpoint, so they are deliberately absent. + */ + +import { + AdobeFireflyError, + buildAdobeArpSessionId, + buildAdobeSubmitHeaders, + extractAdobeArpSessionId, + extractAdobeCookieHeader, + extractAdobeResultLink, + formatAdobeSystemUnderLoadError, + isAdobeTransientSubmitError, + normalizeAdobePollUrl, + pollAdobeJob, +} from "./adobeFireflyClient.ts"; +import { sanitizeErrorMessage } from "../utils/error.ts"; + +export const ADOBE_FIREFLY_IMAGE_UPSAMPLE_URL = + "https://firefly-3p.ff.adobe.io/v2/3p-images/upsample"; + +/** Firefly image upscale timeout — Topaz jobs are slower than a 1K generate. */ +export const ADOBE_FIREFLY_UPSCALE_TIMEOUT_MS = 300_000; + +/** Same submit-retry budget as generate-async (colligo 408 recovery). */ +const SUBMIT_MAX_ATTEMPTS = 5; + +/** + * Firefly Topaz upsample wire range for `creativityLevel`. + * + * Live colligo on `/v2/3p-images/upsample` rejects values > 1 + * (`less_than_equal`, `le: 1.0`). The browser capture sends `0` (off). + * Discovery docs mention a 1–5 integer scale for *other* Topaz endpoints — + * that scale is NOT accepted by upsample, so we stay on 0–1. + */ +export const ADOBE_FIREFLY_MAX_CREATIVITY_LEVEL = 1; + +export type AdobeFireflyUpscaleModelId = "topaz" | "topaz-standard" | "topaz-bloom"; + +export interface AdobeFireflyUpscaleModelSpec { + upstreamModelId: string; + upstreamModelVersion: string; + /** Scale factors accepted for this version. */ + factors: number[]; + /** `creativityLevel` is only meaningful on the generative (reimagine) version. */ + supportsCreativity: boolean; +} + +export const ADOBE_FIREFLY_UPSCALE_MODELS: Record< + AdobeFireflyUpscaleModelId, + AdobeFireflyUpscaleModelSpec +> = { + // Bare `topaz` maps to the standard version rather than the discovery-listed + // "default" alias: both resolve to bksGenerationModel firefly_3p:external:topaz_standard, + // and pinning the explicit version avoids depending on an alias we have not captured. + topaz: { + upstreamModelId: "topaz", + upstreamModelVersion: "standard", + factors: [2, 4], + supportsCreativity: false, + }, + "topaz-standard": { + upstreamModelId: "topaz", + upstreamModelVersion: "standard", + factors: [2, 4], + supportsCreativity: false, + }, + "topaz-bloom": { + upstreamModelId: "topaz", + upstreamModelVersion: "reimagine", + factors: [2, 4], + supportsCreativity: true, + }, +}; + +/** + * Resolve a catalog id (with or without an `adobe-firefly/` prefix) to its upstream + * modelId/modelVersion pair. Returns null for anything that is not a Firefly image + * upscaler, so callers can fall through instead of silently upscaling with a default. + */ +export function resolveAdobeUpscaleModel(model: string): { + id: AdobeFireflyUpscaleModelId; + spec: AdobeFireflyUpscaleModelSpec; +} | null { + const raw = String(model || "") + .trim() + .toLowerCase() + .replace(/^adobe-firefly\//, "") + .replace(/^firefly\//, ""); + + if (!raw) return null; + if (raw in ADOBE_FIREFLY_UPSCALE_MODELS) { + const id = raw as AdobeFireflyUpscaleModelId; + return { id, spec: ADOBE_FIREFLY_UPSCALE_MODELS[id] }; + } + + // Accept the upstream version names and common spellings. + if (raw.includes("bloom") || raw.includes("reimagine")) { + return { id: "topaz-bloom", spec: ADOBE_FIREFLY_UPSCALE_MODELS["topaz-bloom"] }; + } + if (raw.includes("topaz")) { + return { id: "topaz-standard", spec: ADOBE_FIREFLY_UPSCALE_MODELS["topaz-standard"] }; + } + return null; +} + +/** True when the model id names a Firefly image upscaler (used to split the generate path). */ +export function isAdobeFireflyUpscaleModel(model: string): boolean { + return resolveAdobeUpscaleModel(model) !== null; +} + +/** + * Map a 0-100 creativity percentage onto Firefly upsample's `creativityLevel` (0–1 float). + * + * Precedence: + * 1. explicit `creativityLevel` — if in (1, 5] treat as legacy 1–5 integer scale + * and map onto 0–1 (`level / 5`); otherwise clamp to 0–1 + * 2. `creativityPercent` 0–100 → 0–1 + * 3. default 0 (browser default / off) + */ +export function resolveAdobeCreativityLevel(opts: { + creativityPercent?: number | null; + creativityLevel?: unknown; +}): number { + const explicit = opts.creativityLevel; + if (typeof explicit === "number" && Number.isFinite(explicit)) { + return clampLevel(normalizeExplicitCreativity(explicit)); + } + if (typeof explicit === "string" && explicit.trim() && Number.isFinite(Number(explicit))) { + return clampLevel(normalizeExplicitCreativity(Number(explicit))); + } + + const percent = typeof opts.creativityPercent === "number" && Number.isFinite(opts.creativityPercent) + ? Math.max(0, Math.min(100, opts.creativityPercent)) + : 0; + return clampLevel(percent / 100); +} + +/** Legacy 1–5 integer scale (discovery docs) → 0–1 wire float. Values already in 0–1 pass through. */ +function normalizeExplicitCreativity(value: number): number { + if (value > ADOBE_FIREFLY_MAX_CREATIVITY_LEVEL && value <= 5) { + return value / 5; + } + return value; +} + +/** Clamp to the upsample wire range [0, 1], two decimal places. */ +function clampLevel(value: number): number { + if (!Number.isFinite(value)) return 0; + const clamped = Math.max(0, Math.min(ADOBE_FIREFLY_MAX_CREATIVITY_LEVEL, value)); + return Math.round(clamped * 100) / 100; +} + +/** + * Headers for the upsample submit. + * + * Identical to generate-async EXCEPT `x-nonce`, which the live upsample request does + * not send (there is no prompt to derive a deterministic nonce from). We mirror the + * capture exactly rather than adding a header colligo never sees from the SPA. + */ +export function buildAdobeUpsampleHeaders( + accessToken: string, + extras?: { arpSessionId?: string; cookie?: string } +): Record { + const headers = buildAdobeSubmitHeaders(accessToken, { + arpSessionId: extras?.arpSessionId, + cookie: extras?.cookie, + prompt: "upsample", + }); + delete headers["x-nonce"]; + return headers; +} + +export function buildAdobeUpsamplePayload(opts: { + modelSpec: AdobeFireflyUpscaleModelSpec; + blobId: string; + upsamplerFactor: number; + creativityLevel?: number; +}): Record { + const payload: Record = { + modelId: opts.modelSpec.upstreamModelId, + modelVersion: opts.modelSpec.upstreamModelVersion, + generationMetadata: { + module: "image-editing", + submodule: "ff-image-editor", + sourceDocumentId: null, + originalPrompt: null, + filterString: null, + subPrompts: null, + canvasImageReference: null, + }, + referenceBlobs: [{ id: String(opts.blobId), usage: "general" }], + upsamplerFactor: opts.upsamplerFactor, + }; + + // creativityLevel is optional/nullable upstream — only the generative version + // consumes it, so the standard pass omits it entirely. + if (opts.modelSpec.supportsCreativity) { + payload.creativityLevel = Number.isFinite(opts.creativityLevel as number) + ? (opts.creativityLevel as number) + : 0; + } + + return payload; +} + +/** + * Submit + poll a Firefly Topaz upscale job. + * + * `blobId` must already be a Firefly storage id — callers upload the source image with + * `resolveAdobeSourceImageIds`/`uploadAdobeFireflyImage` first, reusing the same ARP so + * colligo sees one coherent risk session for upload + submit. + */ +export async function adobeFireflyUpscaleImage(opts: { + accessToken: string; + model: string; + blobId: string; + upsamplerFactor?: unknown; + creativityPercent?: number; + creativityLevel?: unknown; + sessionCookie?: string; + arpSessionId?: string; + sessionFingerprint?: string; + timeoutMs?: number; + fetchImpl?: typeof fetch; + log?: { info?: (...args: unknown[]) => void; error?: (...args: unknown[]) => void }; +}): Promise<{ url: string; latest: unknown; factor: number; creativityLevel: number }> { + const fetchImpl = opts.fetchImpl || fetch; + const resolved = resolveAdobeUpscaleModel(opts.model); + if (!resolved) { + throw new AdobeFireflyError( + `Unsupported Adobe Firefly upscale model: ${opts.model}. ` + + `Use topaz-standard or topaz-bloom.`, + 400, + "bad_model" + ); + } + const { spec } = resolved; + + const blobId = String(opts.blobId || "").trim(); + if (!blobId) { + throw new AdobeFireflyError( + "Adobe Firefly upscale requires a source image", + 400, + "bad_image" + ); + } + + const factor = normalizeFactor(opts.upsamplerFactor, spec.factors); + const creativityLevel = spec.supportsCreativity + ? resolveAdobeCreativityLevel({ + creativityPercent: opts.creativityPercent ?? null, + creativityLevel: opts.creativityLevel, + }) + : 0; + + const payload = buildAdobeUpsamplePayload({ + modelSpec: spec, + blobId, + upsamplerFactor: factor, + creativityLevel, + }); + + const sessionCookie = String(opts.sessionCookie || "").trim(); + const cookieHeader = extractAdobeCookieHeader(sessionCookie); + const browserArp = extractAdobeArpSessionId(cookieHeader || sessionCookie); + const hadBrowserArp = Boolean(browserArp); + let arpSessionId = + (opts.arpSessionId && String(opts.arpSessionId).trim()) || + browserArp || + buildAdobeArpSessionId(); + const accessToken = opts.accessToken; + let submitData: unknown = {}; + let submitHeaders: Headers | Record = new Headers(); + let lastSubmitError = ""; + let sawSystemUnderLoad = false; + let submitted = false; + + for (let attempt = 1; attempt <= SUBMIT_MAX_ATTEMPTS; attempt++) { + const submitResp = await fetchImpl(ADOBE_FIREFLY_IMAGE_UPSAMPLE_URL, { + method: "POST", + headers: buildAdobeUpsampleHeaders(accessToken, { + arpSessionId, + cookie: cookieHeader || undefined, + }), + body: JSON.stringify(payload), + }); + + if (submitResp.status === 401 || submitResp.status === 403) { + if ((submitResp.headers.get("x-access-error") || "") === "taste_exhausted") { + throw new AdobeFireflyError( + "Adobe Firefly quota exhausted for this account", + 429, + "quota_exhausted" + ); + } + throw new AdobeFireflyError( + "Adobe Firefly token invalid or expired. Paste a fresh IMS JWT (Authorization: Bearer on " + + "firefly-3p) plus the firefly.adobe.com Cookie once.", + 401, + "auth" + ); + } + + if (!submitResp.ok) { + const text = await submitResp.text().catch(() => ""); + if (isAdobeTransientSubmitError(submitResp.status, text)) sawSystemUnderLoad = true; + lastSubmitError = + `Adobe Firefly image upscale submit failed (${submitResp.status}): ` + + sanitizeErrorMessage(text.slice(0, 300)); + + if (isAdobeTransientSubmitError(submitResp.status, text) && attempt < SUBMIT_MAX_ATTEMPTS) { + // Rotate synthetic ARP on transient 408; real browser ARP is reused as-is. + if (!hadBrowserArp) { + arpSessionId = buildAdobeArpSessionId(); + } + const delay = submitRetryDelayMs(attempt); + opts.log?.info?.( + "ADOBE-FIREFLY", + `upscale submit transient ${submitResp.status}, retry ${attempt}/${SUBMIT_MAX_ATTEMPTS} in ${delay}ms` + ); + await sleep(delay); + continue; + } + + if (sawSystemUnderLoad && isAdobeTransientSubmitError(submitResp.status, text)) { + throw new AdobeFireflyError( + formatAdobeSystemUnderLoadError("image", attempt), + 408, + "system_under_load" + ); + } + throw new AdobeFireflyError( + lastSubmitError, + submitResp.status >= 400 && submitResp.status < 500 ? submitResp.status : 502 + ); + } + + submitData = await submitResp.json().catch(() => ({})); + submitHeaders = submitResp.headers; + submitted = true; + break; + } + + if (!submitted) { + throw new AdobeFireflyError( + lastSubmitError || "Adobe Firefly upscale submit failed after retries", + 502 + ); + } + + let pollUrl = extractAdobeResultLink(submitHeaders, submitData); + if (!pollUrl) { + if (sawSystemUnderLoad) { + throw new AdobeFireflyError( + formatAdobeSystemUnderLoadError("image", SUBMIT_MAX_ATTEMPTS), + 408, + "system_under_load" + ); + } + throw new AdobeFireflyError( + lastSubmitError || "Adobe Firefly upscale submit succeeded but no poll URL was returned", + 502 + ); + } + pollUrl = normalizeAdobePollUrl(pollUrl); + + const { mediaUrl, latest } = await pollAdobeJob({ + pollUrl, + accessToken, + kind: "image", + timeoutMs: + opts.timeoutMs && opts.timeoutMs > 0 ? opts.timeoutMs : ADOBE_FIREFLY_UPSCALE_TIMEOUT_MS, + fetchImpl, + log: opts.log, + }); + + return { url: mediaUrl, latest, factor, creativityLevel }; +} + +function normalizeFactor(value: unknown, allowed: readonly number[]): number { + const factors = allowed.length > 0 ? [...allowed] : [2, 4]; + let n = typeof value === "number" ? value : Number(String(value ?? "").replace(/[^\d.]/g, "")); + if (!Number.isFinite(n) || n <= 0) n = 2; + let best = factors[0]!; + let bestDelta = Math.abs(best - n); + for (const f of factors) { + const delta = Math.abs(f - n); + if (delta < bestDelta) { + best = f; + bestDelta = delta; + } + } + return best; +} + +function submitRetryDelayMs(attempt: number): number { + const raw = process.env.ADOBE_FIREFLY_SUBMIT_BASE_DELAY_MS; + const base = + raw != null && raw !== "" + ? Math.max(0, Number(raw) || 0) + : process.env.NODE_ENV === "test" || process.env.VITEST || process.env.NODE_TEST_CONTEXT + ? 20 + : 8000; + if (base <= 50) return base; + return Math.min(90_000, base * Math.pow(2, attempt - 1)) + Math.floor(Math.random() * 1500); +} + +async function sleep(ms: number): Promise { + await new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/open-sse/services/antigravity429Engine.ts b/open-sse/services/antigravity429Engine.ts index a29b0dba2e..7c859c673b 100644 --- a/open-sse/services/antigravity429Engine.ts +++ b/open-sse/services/antigravity429Engine.ts @@ -61,6 +61,14 @@ const FULL_QUOTA_COOLDOWN_MS = 24 * 60 * 60 * 1000; // 24 hours export function classify429(errorMessage: string): Category { const lower = (errorMessage || "").toLowerCase(); + // Cloud Code may report an exhausted-capacity message with a zero reset + // window for a burst/RPM throttle. The explicit zero reset is stronger + // evidence than the generic wording, so retry briefly instead of applying + // the durable quota cooldown. + if (/\breset\s+(?:after|in)\s+0s\b/.test(lower)) { + return "rate_limited"; + } + // Check for quota exhaustion first (most specific) for (const kw of QUOTA_EXHAUSTED_KEYWORDS) { if (lower.includes(kw)) return "quota_exhausted"; diff --git a/open-sse/services/antigravityProjectBootstrap.ts b/open-sse/services/antigravityProjectBootstrap.ts index 169066d42f..7d69216f1e 100644 --- a/open-sse/services/antigravityProjectBootstrap.ts +++ b/open-sse/services/antigravityProjectBootstrap.ts @@ -1,5 +1,5 @@ /** - * Antigravity project bootstrap — loadCodeAssist. + * Antigravity project bootstrap — loadCodeAssist + onboardUser. * * The Google Cloud Code Assist API (/v1internal:models) requires a prior * /v1internal:loadCodeAssist call to assign a project context to the @@ -10,52 +10,70 @@ * attempt. Results are memoized per-token for the process lifetime to * avoid redundant round-trips. * - * Based on the Antigravity loadCodeAssist flow and the CLIProxyAPI reference - * implementation in internal/runtime/executor/antigravity_executor.go. + * When loadCodeAssist returns no project (account never onboarded), + * the fallback calls onboardUser to create the project, then retries. */ import { getAntigravityContentHeaders, getAntigravityLoadCodeAssistMetadata, } from "./antigravityHeaders.ts"; +import { extractCodeAssistOnboardTierId } from "./codeAssistSubscription.ts"; import type { AntigravityClientProfile } from "./antigravityClientProfile.ts"; -import { ANTIGRAVITY_BOOTSTRAP_BASE_URLS } from "../config/antigravityUpstream.ts"; +import { ANTIGRAVITY_BOOTSTRAP_BASE_URLS, getAntigravityOnboardUrls } from "../config/antigravityUpstream.ts"; const LOAD_CODE_ASSIST_PATH = "/v1internal:loadCodeAssist"; const BOOTSTRAP_TIMEOUT_MS = 8_000; +const ONBOARD_TIMEOUT_MS = 15_000; +const DEFAULT_TIER_ID = "legacy-tier"; -/** Ordered list of loadCodeAssist endpoint URLs (mirrors the models discovery order). */ +/** Ordered list of loadCodeAssist endpoint URLs. */ export function getAntigravityLoadCodeAssistUrls(): string[] { return ANTIGRAVITY_BOOTSTRAP_BASE_URLS.map((base) => `${base}${LOAD_CODE_ASSIST_PATH}`); } +/** Max entries in the per-token caches (prevents unbounded growth). */ +const MAX_CACHE_SIZE = 256; + +/** LRU-style Map: deleting and re-inserting moves the key to the end. */ +function evictOldest(cache: Map): void { + if (cache.size >= MAX_CACHE_SIZE) { + const oldest = cache.keys().next().value; + if (oldest !== undefined) cache.delete(oldest); + } +} + /** Per-token memoization cache (lives for the process lifetime). */ const projectCache = new Map(); +/** Per-key lock to prevent concurrent onboard attempts for the same token. */ +const onboardLocks = new Map>(); + type FetchLike = (url: string, init?: RequestInit) => Promise; function getProjectCacheKey(accessToken: string, clientProfile: AntigravityClientProfile): string { return `${clientProfile}:${accessToken}`; } +type LoadCodeAssistResult = { projectId: string | null; tierId: string }; + /** * Attempt loadCodeAssist against each known base URL in order. - * Returns the discovered project id, or null if all endpoints fail. + * Returns the discovered project id and tier id, or null projectId if all endpoints fail. */ async function tryLoadCodeAssist( accessToken: string, fetchImpl: FetchLike, clientProfile: AntigravityClientProfile, signal?: AbortSignal -): Promise { +): Promise { const urls = getAntigravityLoadCodeAssistUrls(); const headers = getAntigravityContentHeaders(clientProfile, accessToken); - for (const url of urls) { + for (let i = 0; i < urls.length; i++) { + const url = urls[i]; if (signal?.aborted) throw signal.reason; try { - // Combine the caller's cancellation signal (#8098) with the per-attempt - // bootstrap timeout so an aborted request tears down immediately. const timeoutSignal = AbortSignal.timeout(BOOTSTRAP_TIMEOUT_MS); const response = await fetchImpl(url, { method: "POST", @@ -75,7 +93,7 @@ async function tryLoadCodeAssist( // cloudaicompanionProject may be a plain string or an object with an id field. const raw = data.cloudaicompanionProject; - let projectId = + const projectId = typeof raw === "string" ? raw.trim() : raw && @@ -84,16 +102,21 @@ async function tryLoadCodeAssist( ? ((raw as Record).id as string).trim() : ""; + const tierId = extractCodeAssistOnboardTierId(data) || DEFAULT_TIER_ID; + if (projectId) { - return projectId; + return { projectId, tierId }; } + // Continue to next URL if available — a different endpoint might + // have the project. Only return empty when this is the last URL. + if (i === urls.length - 1) { + return { projectId: null, tierId }; + } console.warn( `[models] antigravity loadCodeAssist at ${url} returned no project id — trying next` ); } catch (error) { - // A caller-initiated abort (#8098) must propagate, not be swallowed as a - // "try next URL" transient — otherwise a cancelled request silently proceeds. if (signal?.aborted || (error instanceof Error && error.name === "AbortError")) { throw signal?.reason ?? error; } @@ -101,7 +124,65 @@ async function tryLoadCodeAssist( console.warn(`[models] antigravity loadCodeAssist threw for ${url}: ${msg} — trying next`); } } - return null; + return { projectId: null, tierId: DEFAULT_TIER_ID }; +} + +/** + * Attempt onboardUser to create a Cloud Code project for the account. + * Called when loadCodeAssist returns no project — the account has never + * been onboarded. Returns true if any endpoint reports success. + */ +async function tryOnboardUser( + accessToken: string, + fetchImpl: FetchLike, + clientProfile: AntigravityClientProfile, + tierId: string, + signal?: AbortSignal +): Promise { + const urls = getAntigravityOnboardUrls(); + const headers = getAntigravityContentHeaders(clientProfile, accessToken); + + for (const url of urls) { + if (signal?.aborted) throw signal.reason; + try { + const timeoutSignal = AbortSignal.timeout(ONBOARD_TIMEOUT_MS); + const response = await fetchImpl(url, { + method: "POST", + headers, + body: JSON.stringify({ + tier_id: tierId, + metadata: getAntigravityLoadCodeAssistMetadata(), + }), + signal: signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal, + }); + + if (response.ok) { + return true; + } + + console.warn( + `[models] antigravity onboardUser failed at ${url} (${response.status}) — trying next` + ); + } catch (error) { + if (signal?.aborted || (error instanceof Error && error.name === "AbortError")) { + throw signal?.reason ?? error; + } + const msg = error instanceof Error ? error.message : String(error); + console.warn(`[models] antigravity onboardUser threw for ${url}: ${msg} — trying next`); + } + } + return false; +} + +/** Per-token memoization for accounts we already tried onboarding (avoid repeated calls). */ +const onboardAttemptedCache = new Set(); + +function addToOnboardAttemptedCache(key: string): void { + if (onboardAttemptedCache.size >= MAX_CACHE_SIZE) { + const oldest = onboardAttemptedCache.values().next().value; + if (oldest !== undefined) onboardAttemptedCache.delete(oldest); + } + onboardAttemptedCache.add(key); } /** @@ -123,22 +204,72 @@ export async function ensureAntigravityProjectAssigned( ): Promise { const cacheKey = getProjectCacheKey(accessToken, clientProfile); if (projectCache.has(cacheKey)) { - return projectCache.get(cacheKey); // already bootstrapped for this token + const cached = projectCache.get(cacheKey)!; + // Touch on read: delete+reinsert moves this entry to the end (LRU). + projectCache.delete(cacheKey); + projectCache.set(cacheKey, cached); + return cached; } - const projectId = await tryLoadCodeAssist(accessToken, fetchImpl, clientProfile, signal); + const { projectId: initialProjectId, tierId } = await tryLoadCodeAssist( + accessToken, fetchImpl, clientProfile, signal + ); + + let projectId = initialProjectId; + + // loadCodeAssist is read-only — if the account was never onboarded, it returns + // empty. Call onboardUser to create the project, then retry discovery. + if (!projectId && !onboardAttemptedCache.has(cacheKey)) { + // Per-key lock: concurrent calls for the same token share one onboard attempt. + let lock = onboardLocks.get(cacheKey); + if (!lock) { + lock = (async () => { + let aborted = false; + try { + const onboarded = await tryOnboardUser( + accessToken, fetchImpl, clientProfile, tierId, signal + ); + if (onboarded) { + const retry = await tryLoadCodeAssist( + accessToken, fetchImpl, clientProfile, signal + ); + if (retry.projectId) { + evictOldest(projectCache); + projectCache.set(cacheKey, retry.projectId); + return true; + } + } + return false; + } catch (e) { + aborted = signal?.aborted === true; + return false; + } finally { + onboardLocks.delete(cacheKey); + if (!aborted) addToOnboardAttemptedCache(cacheKey); + } + })(); + onboardLocks.set(cacheKey, lock); + } + const success = await lock; + if (success) { + const cached = projectCache.get(cacheKey); + if (cached) return cached; + } + } if (projectId) { + evictOldest(projectCache); projectCache.set(cacheKey, projectId); return projectId; } - // Non-fatal: if all endpoints failed, we proceed without caching. return undefined; } /** Exported for tests. */ export function clearAntigravityProjectCache(): void { projectCache.clear(); + onboardAttemptedCache.clear(); + onboardLocks.clear(); } /** Exported for tests — inspect cache state. */ diff --git a/open-sse/services/antigravityProjectPersist.ts b/open-sse/services/antigravityProjectPersist.ts index 8a0d1070a5..1068c4d3ec 100644 --- a/open-sse/services/antigravityProjectPersist.ts +++ b/open-sse/services/antigravityProjectPersist.ts @@ -22,6 +22,43 @@ import { updateProviderConnection } from "@/lib/db/providers"; * Best-effort / non-fatal by design: a persistence failure must never block * the in-flight request, which already has the discovered id in hand. */ +/** + * Selection-side companion of the persistence write path (#8894): given a pool + * of Antigravity/AGY connections, prefer the ones that already carry a stored + * projectId — they can serve a request without the `loadCodeAssist` discovery + * round-trip. "Prefer", not "require": when NO connection has a stored project + * the pool is returned unchanged, so a fresh install never empties its + * candidate list. + * + * Sync on purpose (called inside the quota-strategy connection expansion, which + * builds candidate lists without awaiting per-connection work). Tolerates + * `providerSpecificData` arriving either parsed or as the raw DB JSON string. + */ +export function preferAntigravityConnectionsWithStoredProject>( + connections: T[] +): T[] { + if (!Array.isArray(connections) || connections.length === 0) return connections; + const hasStoredProject = (connection: T): boolean => { + if (typeof connection.projectId === "string" && connection.projectId) return true; + let psd = connection.providerSpecificData; + if (typeof psd === "string") { + try { + psd = JSON.parse(psd); + } catch { + return false; + } + } + return Boolean( + psd && + typeof psd === "object" && + typeof (psd as Record).projectId === "string" && + (psd as Record).projectId + ); + }; + const withStoredProject = connections.filter(hasStoredProject); + return withStoredProject.length > 0 ? withStoredProject : connections; +} + export async function persistDiscoveredAntigravityProjectId( connectionId: string | undefined | null, discoveredProjectId: string | undefined | null, diff --git a/open-sse/services/antigravityProjectPersistence.ts b/open-sse/services/antigravityProjectPersistence.ts new file mode 100644 index 0000000000..f34445fe00 --- /dev/null +++ b/open-sse/services/antigravityProjectPersistence.ts @@ -0,0 +1,13 @@ +/** + * Re-export from `antigravityProjectPersist.ts` plus a connection-preference helper. + */ +import { persistDiscoveredAntigravityProjectId } from "./antigravityProjectPersist.ts"; +export { persistDiscoveredAntigravityProjectId }; + +export function preferAntigravityConnectionsWithStoredProject( + connections: Array> +): Array> { + return connections.filter( + (conn) => conn != null && typeof conn.projectId === "string" && conn.projectId.trim().length > 0 + ); +} diff --git a/open-sse/services/autoCombo/pipelineRouter.ts b/open-sse/services/autoCombo/pipelineRouter.ts index e957fd83f7..5fbc9eea02 100644 --- a/open-sse/services/autoCombo/pipelineRouter.ts +++ b/open-sse/services/autoCombo/pipelineRouter.ts @@ -54,6 +54,7 @@ const INTENT_TO_TASK: Record = { export interface PipelineComboParams { body: Record; combo: Record; + availableModels?: readonly string[]; handleChatCore: (body: Record, modelStr?: string) => Promise; log: { info: (...args: unknown[]) => void; @@ -85,7 +86,7 @@ export interface StageExecutorResult { */ function resolveModelForTier( tier: FitnessTier, - availableModels: string[], + availableModels: readonly string[], taskType: string ): string { // Score each available model for this task type and tier @@ -125,7 +126,7 @@ function createStageExecutor( body: Record, handleChatCore: (body: Record, modelStr?: string) => Promise, log: { info: (...args: unknown[]) => void; warn: (...args: unknown[]) => void }, - availableModels: string[], + availableModels: readonly string[], taskType: string ): (args: StageExecutorArgs & { fitnessTier?: FitnessTier }) => Promise { return async ({ @@ -222,6 +223,7 @@ function estimateTokens(messages: Array<{ role: string; content: unknown }>): nu export async function handlePipelineCombo({ body, combo, + availableModels: routedModels, handleChatCore, log, settings, @@ -291,7 +293,13 @@ export async function handlePipelineCombo({ }) .filter((model): model is string => typeof model === "string" && model.length > 0) : []; - const availableModels = comboModels.length ? comboModels : ["deepseek-chat"]; + const availableModels = + routedModels === undefined + ? comboModels.length + ? comboModels + : ["deepseek-chat"] + : routedModels; + if (availableModels.length === 0) throw new Error("PIPELINE_NO_MODELS"); // ── Create stage executor ───────────────────────────────────────────────── const stageExecutor = createStageExecutor(body, handleChatCore, log, availableModels, taskType); diff --git a/open-sse/services/autoCombo/scoring.ts b/open-sse/services/autoCombo/scoring.ts index ed410c36be..a8758df00c 100644 --- a/open-sse/services/autoCombo/scoring.ts +++ b/open-sse/services/autoCombo/scoring.ts @@ -201,16 +201,43 @@ function calculateSpecificityMatch( } } +/** + * Pool-wide maxima used to normalize cost/latency/stability factors. These are + * identical for every candidate in a given pool, so callers scoring many + * candidates against the same pool should compute this ONCE via + * computePoolMaxima() and pass it to calculateFactors — recomputing it inside + * a per-candidate loop turns an O(n) scoring pass into O(n^2) (#OOM incident: + * a zero-config "auto" combo with no explicit candidatePool can expand the + * pool to 1000s of provider/model targets, at which point the repeated + * `pool.map()` + spread here dominates heap churn and can OOM the process). + */ +export interface PoolMaxima { + maxCost: number; + maxLatency: number; + maxStdDev: number; +} + +export function computePoolMaxima(pool: ProviderCandidate[]): PoolMaxima { + let maxCost = 0.001; + let maxLatency = 1; + let maxStdDev = 0.001; + for (const p of pool) { + if (p.costPer1MTokens > maxCost) maxCost = p.costPer1MTokens; + if (p.p95LatencyMs > maxLatency) maxLatency = p.p95LatencyMs; + if (p.latencyStdDev > maxStdDev) maxStdDev = p.latencyStdDev; + } + return { maxCost, maxLatency, maxStdDev }; +} + export function calculateFactors( candidate: ProviderCandidate, pool: ProviderCandidate[], taskType: string, getTaskFitness: (model: string, taskType: string) => number, - manifestHint?: RoutingHint | null + manifestHint?: RoutingHint | null, + precomputedMaxima?: PoolMaxima ): ScoringFactors { - const maxCost = Math.max(...pool.map((p) => p.costPer1MTokens), 0.001); - const maxLatency = Math.max(...pool.map((p) => p.p95LatencyMs), 1); - const maxStdDev = Math.max(...pool.map((p) => p.latencyStdDev), 0.001); + const { maxCost, maxLatency, maxStdDev } = precomputedMaxima ?? computePoolMaxima(pool); // Every factor is contractually [0,1]. clamp01 guards against bad telemetry // (negative quota / cost / latency, NaN, out-of-range candidate-supplied @@ -245,9 +272,17 @@ export function scorePool( getTaskFitness: (model: string, taskType: string) => number = () => 0.5, manifestHint?: RoutingHint | null ): ScoredProvider[] { + const poolMaxima = computePoolMaxima(pool); return pool .map((candidate) => { - const factors = calculateFactors(candidate, pool, taskType, getTaskFitness, manifestHint); + const factors = calculateFactors( + candidate, + pool, + taskType, + getTaskFitness, + manifestHint, + poolMaxima + ); return { provider: candidate.provider, model: candidate.model, diff --git a/open-sse/services/browserBackedChat.ts b/open-sse/services/browserBackedChat.ts index 567e22338a..433da826fb 100644 --- a/open-sse/services/browserBackedChat.ts +++ b/open-sse/services/browserBackedChat.ts @@ -90,7 +90,7 @@ export function __resetHttpBackedChatOverrideForTesting(): void { // Helper to make Playwright waitForTimeout abortable via AbortSignal function waitWithSignal(ms: number, signal?: AbortSignal | null): Promise { - return new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { if (signal?.aborted) return reject(new DOMException("Aborted", "AbortError")); const onAbort = () => { clearTimeout(timer); diff --git a/open-sse/services/claudeCodeObfuscation.ts b/open-sse/services/claudeCodeObfuscation.ts index 3a8423cbf1..92c7c86d6e 100644 --- a/open-sse/services/claudeCodeObfuscation.ts +++ b/open-sse/services/claudeCodeObfuscation.ts @@ -87,9 +87,18 @@ export function obfuscateInBody(body: Record): void { if (typeof content === "string") { msg.content = obfuscateSensitiveWords(content); } else if (Array.isArray(content)) { - for (const block of content as Array>) { - if (typeof block.text === "string") { - block.text = obfuscateSensitiveWords(block.text); + // Anthropic verifies a signature over a thinking turn. Mutating a text + // sibling in that same turn invalidates it and makes the next request + // fail with `Invalid signature in thinking block`. + const blocks = content as Array>; + const hasSignedThinking = blocks.some( + (block) => block?.type === "thinking" || block?.type === "redacted_thinking" + ); + if (!hasSignedThinking) { + for (const block of blocks) { + if (typeof block.text === "string") { + block.text = obfuscateSensitiveWords(block.text); + } } } } diff --git a/open-sse/services/combo.ts b/open-sse/services/combo.ts index c4a0d5cc63..c817296a0e 100644 --- a/open-sse/services/combo.ts +++ b/open-sse/services/combo.ts @@ -14,6 +14,7 @@ import { getModelLockoutInfo, getRuntimeProviderProfile, hasPerModelQuota, + isAccountSemaphoreFull, isModelLocked, MODEL_ACCESS_DENIED_PATTERNS, recordModelLockoutFailure, @@ -570,6 +571,7 @@ export async function handleComboChat({ signal, apiKeyAllowedConnections = null, nesting = null, + hiddenModelsByProvider = getHiddenModelsByProvider(), }: HandleComboChatOptions): Promise { const comboCtx = createComboContext({ body, combo, settings, relayOptions, log }); const { @@ -607,6 +609,7 @@ export async function handleComboChat({ clientRequestedStream, handleSingleModelWithTimeout, log, + hiddenModelsByProvider, }); if (pinnedDispatch) return pinnedDispatch; } @@ -628,6 +631,7 @@ export async function handleComboChat({ relayOptions, signal, apiKeyAllowedConnections, + hiddenModelsByProvider, runCombo: handleComboChat, }); if (fusionDispatch) return fusionDispatch; @@ -636,7 +640,12 @@ export async function handleComboChat({ // chaosEngine.ts (dispatchChaosFromCombo), returning null when not chaos-enabled. const chaosDispatch = dispatchChaosFromCombo({ cfg, - comboModels: combo.models || [], + comboModels: resolveComboTargets( + combo, + allCombos, + clampComboDepth(config.maxComboDepth), + hiddenModelsByProvider + ).map((target) => target.modelStr), comboName: combo.name, body, handleSingleModel: handleSingleModelWithTimeout, @@ -649,8 +658,10 @@ export async function handleComboChat({ combo, config, strategy, + allCombos, handleSingleModelWithTimeout, log, + hiddenModelsByProvider, }); if (pipelineDispatch) return pipelineDispatch; @@ -669,6 +680,7 @@ export async function handleComboChat({ relayOptions, signal, apiKeyAllowedConnections, + hiddenModelsByProvider, runCombo: handleComboChat, }); if (runtimeUnitDispatch) return runtimeUnitDispatch; @@ -684,6 +696,7 @@ export async function handleComboChat({ settings, allCombos, signal, + hiddenModelsByProvider, }); } @@ -708,6 +721,7 @@ export async function handleComboChat({ isModelAvailable, handleSingleModelWithTimeout, buildAutoCandidates, + hiddenModelsByProvider, }); if ("earlyResponse" in targetResolution) return targetResolution.earlyResponse; const { stickyWeightedLimit, getWeightedStepKeyForTarget, preScreenMap } = targetResolution; @@ -749,7 +763,7 @@ export async function handleComboChat({ combo, config, body, - resolveShadowTargets(combo, config, allCombos), + resolveShadowTargets(combo, config, allCombos, hiddenModelsByProvider), handleSingleModel, isModelAvailable, strategy, @@ -999,6 +1013,20 @@ export async function handleComboChat({ if (i > 0) fallbackCount++; return null; } + + // Concurrency gate: fail-fast skip when connection is at max_concurrent capacity (e.g. Featherless 1/1) + const maxConcurrentCap = await lookupPositiveCap(connectionId); + if ( + maxConcurrentCap && + isAccountSemaphoreFull(provider, connectionId, maxConcurrentCap) + ) { + log.info( + "COMBO", + `Skipping ${modelStr} — connection ${connectionId} is at max concurrency cap (${maxConcurrentCap})` + ); + if (i > 0) fallbackCount++; + return null; + } } // Retry loop for transient errors @@ -2009,15 +2037,26 @@ export async function handleComboChat({ // All set retries exhausted — return the final error if (!lastStatus) { + if (recordedAttempts === 0) { + notifyWebhookEvent("request.failed", { + combo: combo.name, + reason: "ALL_TARGETS_SKIPPED", + latencyMs, + fallbackCount, + }); + return errorResponseWithComboDiagnostics( + 503, + "Service temporarily unavailable: all targets were skipped by pre-dispatch filters", + buildComboDiag("all_targets_skipped"), + { code: "ALL_TARGETS_SKIPPED", type: "service_unavailable" } + ); + } notifyWebhookEvent("request.failed", { combo: combo.name, reason: "ALL_ACCOUNTS_INACTIVE", latencyMs, fallbackCount, }); - // Silent-stop fix: bump the failure counter so the session pin clears on the 3rd - // consecutive all-inactive cascade; buildRecoveryHint emits `switch-combo` with a - // next-step that points the user at /dashboard/providers. recordComboFailure(effectiveSessionId, combo.name); return errorResponseWithComboDiagnostics( 503, @@ -2184,6 +2223,7 @@ async function handleRoundRobinCombo({ settings, allCombos, signal, + hiddenModelsByProvider = getHiddenModelsByProvider(), }: HandleRoundRobinOptions): Promise { const config = settings ? resolveComboConfig(combo, settings) @@ -2225,7 +2265,8 @@ async function handleRoundRobinCombo({ const orderedTargets = resolveComboTargets( rrExpandedCombo, rrExpandedAllCombos, - clampComboDepth(config.maxComboDepth) + clampComboDepth(config.maxComboDepth), + hiddenModelsByProvider ); const tagFilteredTargets = await applyRequestTagRouting(orderedTargets, body, log); const evalRankedTargets = orderTargetsByEvalScores(tagFilteredTargets, config.evalRouting, log); @@ -2298,7 +2339,7 @@ async function handleRoundRobinCombo({ combo, config, body, - resolveShadowTargets(combo, config, allCombos), + resolveShadowTargets(combo, config, allCombos, hiddenModelsByProvider), handleSingleModel, isModelAvailable, "round-robin", @@ -2975,6 +3016,18 @@ async function handleRoundRobinCombo({ } if (!lastStatus) { + if (recordedAttempts === 0) { + return new Response( + JSON.stringify({ + error: { + message: "Service temporarily unavailable: all targets were skipped by pre-dispatch filters", + type: "service_unavailable", + code: "ALL_TARGETS_SKIPPED", + }, + }), + { status: 503, headers: { "Content-Type": "application/json" } } + ); + } return new Response( JSON.stringify({ error: { diff --git a/open-sse/services/combo/applyStrategyOrdering.ts b/open-sse/services/combo/applyStrategyOrdering.ts index a2eba3a555..34514c881d 100644 --- a/open-sse/services/combo/applyStrategyOrdering.ts +++ b/open-sse/services/combo/applyStrategyOrdering.ts @@ -205,7 +205,7 @@ export async function applyStrategyOrdering( if (resolvePromptCacheAffinityKey(body)) { orderedTargets = await expandPromptCacheAffinityTargets(orderedTargets); } - const affinity = applyPromptCacheAffinity(orderedTargets, body); + const affinity = applyPromptCacheAffinity(orderedTargets, body, true, "global"); orderedTargets = affinity.targets; log.info( "COMBO", diff --git a/open-sse/services/combo/autoStrategy.ts b/open-sse/services/combo/autoStrategy.ts index e5c2a1e5a8..cdb0124de2 100644 --- a/open-sse/services/combo/autoStrategy.ts +++ b/open-sse/services/combo/autoStrategy.ts @@ -33,6 +33,7 @@ import { getTaskFitness } from "../autoCombo/taskFitness.ts"; import { calculateFactors, calculateScore, + computePoolMaxima, type ProviderCandidate, type ScoringWeights, } from "../autoCombo/scoring.ts"; @@ -351,6 +352,11 @@ export function scoreAutoTargets( ) { const targetByExecutionKey = new Map(targets.map((target) => [target.executionKey, target])); const activeCandidates = candidates.filter((candidate) => candidate.quotaCutoffBlocked !== true); + // Computed once per scoring pass, not per candidate — see computePoolMaxima's + // doc comment (scoring.ts) for the O(n^2) OOM this avoids on large auto-combo + // candidate pools (#OOM incident, zero-config auto combo expanding to 1000s + // of provider/model targets). + const poolMaxima = computePoolMaxima(activeCandidates as unknown as ProviderCandidate[]); return activeCandidates .map((candidate) => { @@ -373,10 +379,11 @@ export function scoreAutoTargets( }; const factors = calculateFactors( candidate as ProviderCandidate, - activeCandidates, + activeCandidates as unknown as ProviderCandidate[], taskType ?? "general", getTaskFitness, - manifestHint ?? undefined + manifestHint ?? undefined, + poolMaxima ); let score = calculateScore(factors, weights); // B17: Quota Share soft-policy deprioritization @@ -447,11 +454,16 @@ export async function expandAutoComboCandidatePool( .filter((p): p is string => typeof p === "string" && p.length > 0) ), ]; + // Pre-build a Set of already-present modelStr values so candidate-pool + // expansion doesn't turn into O(n^2) per provider. See #OOM incident + // (zero-config auto combo expanding to 1000s of provider/model targets). + const seenModelStrs = new Set(eligibleTargets.map((t) => t.modelStr)); for (const providerId of providerIds) { const providerModels = getProviderModels(providerId); for (const model of providerModels) { const modelStr = `${providerId}/${model.id}`; - if (!eligibleTargets.some((t) => t.modelStr === modelStr)) { + if (!seenModelStrs.has(modelStr)) { + seenModelStrs.add(modelStr); eligibleTargets.push({ kind: "model", stepId: modelStr, diff --git a/open-sse/services/combo/comboStructure.ts b/open-sse/services/combo/comboStructure.ts index 554e162985..176f41a99f 100644 --- a/open-sse/services/combo/comboStructure.ts +++ b/open-sse/services/combo/comboStructure.ts @@ -8,16 +8,20 @@ * getComboModelsFromData, validateComboDAG, resolveNestedComboModels, * filterTargetsByRequestCompatibility) are re-exported from combo.ts for the * ~20 external consumers (chatCore.ts, the /api/combos routes, embeddings, etc.). + * Context-window metadata is advisory: known-fitting targets are ordered first, + * while catalog-too-small targets remain available for runtime fallback. * No barrel import — depends only on sibling leaves. */ import { getModelContextLimit } from "../../../src/lib/modelCapabilities"; +import { getHiddenModelsByProvider } from "../../../src/lib/db/models"; import { getComboModelString, normalizeComboStep } from "../../../src/lib/combos/steps.ts"; import { getProviderByAlias, getProviderById } from "../../../src/shared/constants/providers.ts"; import { estimateTokens } from "../contextManager.ts"; import { getResolvedModelCapabilities } from "../modelCapabilities.ts"; import { parseModel, stripContextWindowSuffix } from "../model.ts"; import { dedupeTargetsByExecutionKey, isRecord } from "./comboData.ts"; +import { isComboModelVisible } from "./comboVisibility.ts"; import { getTargetProvider, MAX_COMBO_DEPTH } from "./comboPredicates.ts"; import { evaluateContextLimit } from "./contextOverrideGate.ts"; import { hasEstimableContent } from "./knownContextOverflow.ts"; @@ -32,6 +36,7 @@ import type { ComboLike, ComboLogger, ComboRuntimeStep, + HiddenModelsByProvider, NestedComboMode, ResolvedComboTarget, ResolvedComboUnit, @@ -132,15 +137,30 @@ function normalizeRuntimeStep( : {}), weight, label, + // `prompt` is a per-step pipeline input and only exists on a model step — + // #8894 widened the union with ComboProviderWildcardStep, which has no prompt. + prompt: (step.kind === "model" ? step.prompt : null) || null, } satisfies ResolvedComboTarget; } -function getDirectComboTargets(combo: ComboLike): ResolvedComboTarget[] { - return getOrderedTopLevelRuntimeSteps(combo, null).filter( - (entry): entry is ResolvedComboTarget => entry?.kind === "model" +function isComboTargetVisible( + target: ResolvedComboTarget, + hiddenModelsByProvider: HiddenModelsByProvider +): boolean { + return isComboModelVisible( + target.modelStr, + target.providerId || target.provider, + hiddenModelsByProvider ); } +export function filterVisibleComboTargets( + targets: ResolvedComboTarget[], + hiddenModelsByProvider: HiddenModelsByProvider = getHiddenModelsByProvider() +): ResolvedComboTarget[] { + return targets.filter((target) => isComboTargetVisible(target, hiddenModelsByProvider)); +} + function getTopLevelRuntimeSteps( combo: ComboLike, allCombos: ComboCollectionLike, @@ -515,9 +535,7 @@ function hasKnownCompatibleContextLimit( return evaluateContextLimit(capabilities, requirements, target.modelStr) === true; } -function hasOnlyContextWindowFailures(reasons: string[]): boolean { - return reasons.length > 0 && reasons.every((reason) => reason === "context_window"); -} +const HARD_COMPAT_REASONS = new Set(["tools", "vision", "structured_output", "output_tokens"]); /** * #8332: vision is a hard requirement, not a soft preference — a target whose vision @@ -602,12 +620,6 @@ export type CompatFilterOptions = { failOpen?: boolean; }; -const HARD_COMPAT_REASONS = new Set(["tools", "vision", "structured_output"]); - -function hasHardCapabilityFailure(reasons: string[]): boolean { - return reasons.some((reason) => HARD_COMPAT_REASONS.has(reason)); -} - /** * Summarize a capability-filter exhaustion for a 400-class combo error (#8488). * Returns null when the empty pool is not attributable to hard requirements. @@ -678,73 +690,42 @@ export function filterTargetsByRequestCompatibility( if (!needsFiltering) return targets; const rejected: Array<{ target: ResolvedComboTarget; reasons: string[] }> = []; - const compatible = targets.filter((target) => { + const targetReasons = new Map(); + for (const target of targets) { const reasons = getTargetCompatibilityFailures(target, requirements); - if (reasons.length === 0) return true; - rejected.push({ target, reasons }); - return false; - }); + targetReasons.set(target, reasons); + if (reasons.length > 0) rejected.push({ target, reasons }); + } - // Unknown context limits are safe only as a fallback. If this request already - // filtered at least one known-too-small target and known-good targets remain, - // prefer the known-good set over unknown metadata gaps. If no known-good - // context target remains, fall back to the strategy order for context-only - // candidates instead of letting unknown metadata be the only survivors. - const rejectedForContextWindow = rejected.some((entry) => + // Context metadata is advisory. Keep every target that has no hard capability + // mismatch, but prefer targets whose known limit fits. A stale catalog entry must + // never remove the only target that could accept the request at runtime. + const compatible = targets.filter((target) => { + const reasons = targetReasons.get(target) || []; + return !reasons.some((reason) => HARD_COMPAT_REASONS.has(reason)); + }); + const hadKnownTooSmallContextTarget = rejected.some((entry) => entry.reasons.includes("context_window") ); - if (requirements.requiredContextTokens > 0 && rejectedForContextWindow) { + if ( + requirements.requiredContextTokens > 0 && + hadKnownTooSmallContextTarget && + compatible.length > 1 + ) { const knownContextCompatible = compatible.filter((target) => hasKnownCompatibleContextLimit(target, requirements) ); - if (knownContextCompatible.length > 0 && knownContextCompatible.length < compatible.length) { - const knownContextCompatibleTargets = new Set(knownContextCompatible); - for (const target of compatible) { - if (!knownContextCompatibleTargets.has(target)) { - rejected.push({ target, reasons: ["context_window_unknown"] }); - } - } - - log.info( - "COMBO", - `${label}: kept ${knownContextCompatible.length}/${targets.length} targets for request requirements` - ); - log.debug?.( - "COMBO", - `${label}: rejected targets ${rejected - .map((entry) => `${entry.target.modelStr}(${entry.reasons.join("+")})`) - .join(", ")}` - ); - return knownContextCompatible; - } - - if (knownContextCompatible.length === 0 && compatible.length > 0) { - const rejectedByTarget = new Map(rejected.map((entry) => [entry.target, entry.reasons])); - const contextOnlyFallback = targets.filter((target) => { - const reasons = rejectedByTarget.get(target); - return !reasons || hasOnlyContextWindowFailures(reasons); - }); - - if (contextOnlyFallback.length > compatible.length) { - log.warn( - "COMBO", - `${label}: no known-compatible context target remains; preserving strategy order for context-only candidates` - ); - log.debug?.( - "COMBO", - `${label}: rejected targets ${rejected - .map((entry) => `${entry.target.modelStr}(${entry.reasons.join("+")})`) - .join(", ")}` - ); - return contextOnlyFallback; - } + const knownSet = new Set(knownContextCompatible); + return [...knownContextCompatible, ...compatible.filter((target) => !knownSet.has(target))]; } } if (compatible.length === targets.length) return targets; if (compatible.length === 0) { - const hardRejected = rejected.some((entry) => hasHardCapabilityFailure(entry.reasons)); + const hardRejected = rejected.some((entry) => + entry.reasons.some((r) => HARD_COMPAT_REASONS.has(r)) + ); const failOpen = options?.failOpen === true; log.debug?.( @@ -832,36 +813,50 @@ export function sortTargetsByContextSize(targets: ResolvedComboTarget[]) { export function resolveComboTargets( combo: ComboLike, allCombos: ComboCollectionLike, - maxDepth: number = MAX_COMBO_DEPTH + maxDepth: number = MAX_COMBO_DEPTH, + hiddenModelsByProvider: HiddenModelsByProvider = getHiddenModelsByProvider() ): ResolvedComboTarget[] { - return allCombos - ? resolveNestedComboTargets(combo, allCombos, new Set(), 0, [], maxDepth) - : getDirectComboTargets(combo); + return filterVisibleComboTargets( + allCombos + ? resolveNestedComboTargets(combo, allCombos, new Set(), 0, [], maxDepth) + : getOrderedTopLevelRuntimeSteps(combo, null).filter( + (entry): entry is ResolvedComboTarget => entry?.kind === "model" + ), + hiddenModelsByProvider + ); } export function resolveComboRuntimeUnits( combo: ComboLike, allCombos: ComboCollectionLike, mode: NestedComboMode, - maxDepth: number = MAX_COMBO_DEPTH + maxDepth: number = MAX_COMBO_DEPTH, + hiddenModelsByProvider: HiddenModelsByProvider = getHiddenModelsByProvider() ): ResolvedComboUnit[] { - if (mode === "flatten" || !allCombos) return resolveComboTargets(combo, allCombos, maxDepth); + if (mode === "flatten" || !allCombos) + return resolveComboTargets(combo, allCombos, maxDepth, hiddenModelsByProvider); validateComboDAG(combo.name, allCombos, new Set(), 0, maxDepth); - return getOrderedTopLevelRuntimeSteps(combo, allCombos); + return getOrderedTopLevelRuntimeSteps(combo, allCombos).filter( + (unit) => unit.kind === "combo-ref" || isComboTargetVisible(unit, hiddenModelsByProvider) + ); } export function resolveWeightedStepGroups( combo: ComboLike, - allCombos: ComboCollectionLike + allCombos: ComboCollectionLike, + hiddenModelsByProvider: HiddenModelsByProvider = getHiddenModelsByProvider() ): Array<{ step: ComboRuntimeStep; targets: ResolvedComboTarget[] }> { return getOrderedTopLevelRuntimeSteps(combo, allCombos) .map((step) => ({ step, - targets: !allCombos - ? step.kind === "model" - ? [step] - : [] - : expandRuntimeStep(step, allCombos, new Set([combo.name])), + targets: filterVisibleComboTargets( + !allCombos + ? step.kind === "model" + ? [step] + : [] + : expandRuntimeStep(step, allCombos, new Set([combo.name])), + hiddenModelsByProvider + ), })) .filter((group) => group.targets.length > 0); } diff --git a/open-sse/services/combo/comboVisibility.ts b/open-sse/services/combo/comboVisibility.ts new file mode 100644 index 0000000000..e3d363ef59 --- /dev/null +++ b/open-sse/services/combo/comboVisibility.ts @@ -0,0 +1,23 @@ +import { getHiddenModelsByProvider } from "../../../src/lib/db/models"; +import { parseModel, resolveCanonicalProviderModel } from "../model.ts"; +import type { HiddenModelsByProvider } from "./types.ts"; + +export function isComboModelVisible( + modelStr: string, + providerId: string | null = null, + hiddenModelsByProvider: HiddenModelsByProvider = getHiddenModelsByProvider() +): boolean { + const parsed = parseModel(modelStr); + const hasExplicitProvider = + providerId && providerId !== parsed.provider && providerId !== parsed.providerAlias; + const rawModel = hasExplicitProvider ? modelStr : parsed.model || modelStr; + const resolved = resolveCanonicalProviderModel( + providerId || parsed.provider || parsed.providerAlias, + rawModel + ); + return ( + !resolved.provider || + !resolved.model || + !hiddenModelsByProvider.get(resolved.provider)?.has(resolved.model) + ); +} diff --git a/open-sse/services/combo/contextRequirements.ts b/open-sse/services/combo/contextRequirements.ts index e5c2886acd..0a608d18db 100644 --- a/open-sse/services/combo/contextRequirements.ts +++ b/open-sse/services/combo/contextRequirements.ts @@ -9,6 +9,7 @@ import type { ComboLogger, ResolvedComboTarget } from "./types.ts"; export interface ContextRequirements { minContextWindow?: number; + maxContextWindow?: number; preferLargeContext?: boolean; contextFilterMode?: "strict" | "lenient"; } @@ -51,10 +52,15 @@ export function applyContextRequirements( ): ResolvedComboTarget[] { if (!requirements || targets.length === 0) return targets; - const { minContextWindow, preferLargeContext, contextFilterMode = "lenient" } = requirements; + const { + minContextWindow, + maxContextWindow, + preferLargeContext, + contextFilterMode = "lenient", + } = requirements; // No requirements specified - if (!minContextWindow && !preferLargeContext) return targets; + if (!minContextWindow && !maxContextWindow && !preferLargeContext) return targets; let filtered = targets; @@ -108,6 +114,34 @@ export function applyContextRequirements( } } + // Apply maxContextWindow filtering + if (maxContextWindow && maxContextWindow > 0) { + const beforeFilterCount = filtered.length; + + filtered = filtered.filter((target) => { + const contextWindow = getTargetContextWindow(target); + + // Unknown context limit handling + if (contextWindow === null) { + return contextFilterMode === "lenient"; + } + + // Known context limit - check threshold + return contextWindow <= maxContextWindow; + }); + + if (filtered.length < beforeFilterCount) { + log.info( + "COMBO", + `Context requirements: filtered ${beforeFilterCount} → ${filtered.length} targets (maxContextWindow: ${maxContextWindow}, mode: ${contextFilterMode})` + ); + log.debug?.( + "COMBO", + `Context requirements: kept models ${filtered.map((t) => t.modelStr).join(", ")}` + ); + } + } + // Apply preferLargeContext sorting if (preferLargeContext && filtered.length > 1) { filtered = [...filtered].sort((a, b) => { diff --git a/open-sse/services/combo/dispatchPrelude.ts b/open-sse/services/combo/dispatchPrelude.ts index 69d2576c00..65dd76e175 100644 --- a/open-sse/services/combo/dispatchPrelude.ts +++ b/open-sse/services/combo/dispatchPrelude.ts @@ -21,6 +21,7 @@ import { handlePipelineChat, type PipelineStep } from "../pipeline.ts"; import type { resolveComboSetupConfig } from "../comboConfig.ts"; import { clampComboDepth, MAX_GLOBAL_ATTEMPTS, resolveDelayMs } from "./comboPredicates.ts"; import { resolveComboRuntimeUnits, resolveComboTargets } from "./comboStructure.ts"; +import { isComboModelVisible } from "./comboVisibility.ts"; import { buildFusionHandleSingleModel, extractFusionPanelSpec } from "./fusionPanel.ts"; import { clampStickyWeightedTargetLimit, @@ -45,6 +46,7 @@ import type { HandleComboChatOptions, HandleSingleModel, IsModelAvailable, + HiddenModelsByProvider, NestedComboMode, ResolvedComboUnit, SingleModelTarget, @@ -68,6 +70,7 @@ type PreludeBaseOptionArgs = { relayOptions?: HandleComboChatOptions["relayOptions"]; signal?: AbortSignal | null; apiKeyAllowedConnections?: string[] | null; + hiddenModelsByProvider?: HiddenModelsByProvider; }; /** Rebuild handleComboChat's option bag verbatim for a recursive dispatch. */ @@ -83,6 +86,7 @@ function buildBaseOptions(a: PreludeBaseOptionArgs): HandleComboChatOptions { relayOptions: a.relayOptions, signal: a.signal, apiKeyAllowedConnections: a.apiKeyAllowedConnections, + hiddenModelsByProvider: a.hiddenModelsByProvider, }; } @@ -232,6 +236,7 @@ export async function tryPinnedModelDispatch(args: { clientRequestedStream: boolean; handleSingleModelWithTimeout: HandleSingleModel; log: ComboLogger; + hiddenModelsByProvider?: HiddenModelsByProvider; }): Promise { const { body, @@ -242,6 +247,7 @@ export async function tryPinnedModelDispatch(args: { clientRequestedStream, handleSingleModelWithTimeout, log, + hiddenModelsByProvider, } = args; // The pin is read from session_model_history (a PRIOR turn) and may name a // model that has since been removed from this combo, or a provider whose @@ -254,11 +260,12 @@ export async function tryPinnedModelDispatch(args: { // when allCombos is authoritative (non-empty) so we can resolve combo-refs; // the auto-combo redirect path passes an empty list and keeps prior behavior. const haveFullCombos = Array.isArray(allCombos) ? allCombos.length > 0 : !!allCombos; - const pinInCombo = - !haveFullCombos || - resolveComboTargets(combo, allCombos, clampComboDepth(config.maxComboDepth)).some( - (t) => t.modelStr === pinnedModel - ); + const pinInCombo = resolveComboTargets( + combo, + haveFullCombos ? allCombos : null, + clampComboDepth(config.maxComboDepth), + hiddenModelsByProvider + ).some((target) => target.modelStr === pinnedModel); // Honor the pin only if it is still a combo target AND its provider is not // DURABLY down. Without the health gate a pin keeps routing a session to a // dead/credits-exhausted/throttled account forever (strategy bypassed, no @@ -330,15 +337,24 @@ export async function tryFusionDispatch(args: { relayOptions?: HandleComboChatOptions["relayOptions"]; signal?: AbortSignal | null; apiKeyAllowedConnections?: string[] | null; + hiddenModelsByProvider?: HiddenModelsByProvider; runCombo: RunCombo; }): Promise { const { cfg, combo, config, strategy, log } = args; - const judgeModel = typeof cfg.judgeModel === "string" ? cfg.judgeModel : undefined; + const configuredJudge = typeof cfg.judgeModel === "string" ? cfg.judgeModel : undefined; + // The panel is filtered for hidden models by resolveComboTargets, but the + // explicit judge is a bare string that never passes through it (#8878). Drop a + // hidden judge so fusion falls back to a surviving panel member instead of + // dispatching a model the operator hid. + const judgeModel = + configuredJudge && !isComboModelVisible(configuredJudge, null, args.hiddenModelsByProvider) + ? undefined + : configuredJudge; const fusionTuning = cfg.fusionTuning && typeof cfg.fusionTuning === "object" ? (cfg.fusionTuning as FusionTuning) : undefined; - if (strategy !== "fusion" && (judgeModel || fusionTuning)) { + if (strategy !== "fusion" && (configuredJudge || fusionTuning)) { log.warn( "COMBO", `Combo "${combo.name}" sets config.judgeModel/fusionTuning but strategy is "${strategy}" — these fields are only consumed by the fusion strategy and will be ignored (#6455)` @@ -346,10 +362,29 @@ export async function tryFusionDispatch(args: { } if (strategy !== "fusion") return null; - const { panel: fusionModels, comboRefUnits } = extractFusionPanelSpec( - combo.models || [], + const resolvedFusionTargets = resolveComboTargets( + combo, + args.allCombos, + clampComboDepth(config.maxComboDepth), + args.hiddenModelsByProvider + ); + // extractFusionPanelSpec only understands model strings / combo refs, so the + // resolved targets have to be flattened before it runs. Keep them indexed so + // the panel can be rehydrated below — dispatching the bare strings strips + // `providerId` and every panel member loses its provider identity (#8878). + const resolvedByModelStr = new Map(); + for (const target of resolvedFusionTargets) { + if (!resolvedByModelStr.has(target.modelStr)) resolvedByModelStr.set(target.modelStr, target); + } + const { panel: fusionPanel, comboRefUnits } = extractFusionPanelSpec( + resolvedFusionTargets.map((target) => target.modelStr), combo.name, - args.allCombos + null + ); + // A panel entry naming a combo ref stays a string (it is a combo name, not a + // model); everything else regains its resolved target. + const fusionModels = fusionPanel.map((entry) => + comboRefUnits.has(entry) ? entry : (resolvedByModelStr.get(entry) ?? entry) ); // Untyped like the existing `nestingContext` further down — `nesting` is // already `ComboNestingContext | null` per HandleComboChatOptions, no new @@ -389,26 +424,28 @@ export async function tryPipelineDispatch(args: { combo: ComboLike; config: ComboSetupConfig; strategy: string; + allCombos?: ComboCollectionLike; handleSingleModelWithTimeout: HandleSingleModel; log: ComboLogger; + hiddenModelsByProvider?: HiddenModelsByProvider; }): Promise { - const { body, combo, config, strategy, handleSingleModelWithTimeout, log } = args; + const { + body, + combo, + config, + strategy, + allCombos, + handleSingleModelWithTimeout, + log, + hiddenModelsByProvider, + } = args; if (strategy !== "pipeline") return null; - const pipelineSteps = (combo.models || []) - .map((m): PipelineStep | null => { - if (typeof m === "string") return { model: m }; - if (m && typeof m === "object") { - const obj = m as Record; - if (typeof obj.model === "string") { - return { - model: obj.model, - prompt: typeof obj.prompt === "string" ? obj.prompt : undefined, - }; - } - } - return null; - }) - .filter((s): s is PipelineStep => Boolean(s)); + const pipelineSteps: PipelineStep[] = resolveComboTargets( + combo, + allCombos, + clampComboDepth(config.maxComboDepth), + hiddenModelsByProvider + ).map((target) => ({ target, prompt: target.prompt })); return handlePipelineChat({ body, steps: pipelineSteps, @@ -523,6 +560,7 @@ export async function tryRuntimeUnitDispatch(args: { relayOptions?: HandleComboChatOptions["relayOptions"]; signal?: AbortSignal | null; apiKeyAllowedConnections?: string[] | null; + hiddenModelsByProvider?: HiddenModelsByProvider; runCombo: RunCombo; }): Promise { const { body, combo, config, strategy, allCombos, log, settings } = args; @@ -531,7 +569,13 @@ export async function tryRuntimeUnitDispatch(args: { const executeModeUnits = nestedComboMode === "execute" && allCombos - ? resolveComboRuntimeUnits(combo, allCombos, "execute", nestingContext.maxDepth) + ? resolveComboRuntimeUnits( + combo, + allCombos, + "execute", + nestingContext.maxDepth, + args.hiddenModelsByProvider + ) : []; const hasExecutableComboRef = executeModeUnits.some((unit) => unit.kind === "combo-ref"); const simpleExecuteStrategies = new Set([ @@ -575,6 +619,7 @@ export async function tryRuntimeUnitDispatch(args: { nesting: nestingContext, baseOptions: buildBaseOptions(args), runCombo: args.runCombo, + hiddenModelsByProvider: args.hiddenModelsByProvider, }); recordRuntimeUnitStickySuccess({ strategy, diff --git a/open-sse/services/combo/fusionPanel.ts b/open-sse/services/combo/fusionPanel.ts index 6397c5120c..a0f3d36d30 100644 --- a/open-sse/services/combo/fusionPanel.ts +++ b/open-sse/services/combo/fusionPanel.ts @@ -10,7 +10,7 @@ * literal `auto/*` string panel member already behaves via the single- * dispatch safety net in src/sse/handlers/chat.ts. */ -import { normalizeComboStep } from "../../../src/lib/combos/steps.ts"; +import { getComboModelString, normalizeComboStep } from "../../../src/lib/combos/steps.ts"; import { executeComboRefUnit } from "./runtimeUnits.ts"; import type { ComboCollectionLike, @@ -51,7 +51,11 @@ export function extractFusionPanelSpec( panel.push(step.comboName); return; } - panel.push(step.model); + // #8894 widened ComboStep with ComboProviderWildcardStep, which carries a + // modelPattern instead of a model. getComboModelString() already resolves any + // step shape (and returns null for the ones with no concrete model id). + const modelStr = getComboModelString(step); + if (modelStr) panel.push(modelStr); }); return { panel, comboRefUnits }; } diff --git a/open-sse/services/combo/promptCacheAffinity.ts b/open-sse/services/combo/promptCacheAffinity.ts index 070e50f84e..4433e7b69d 100644 --- a/open-sse/services/combo/promptCacheAffinity.ts +++ b/open-sse/services/combo/promptCacheAffinity.ts @@ -266,14 +266,32 @@ export function shouldProtectOriginalFirst( } /** - * Order eligible targets using rendezvous hashing. The original order is used - * as the final tie-breaker, so targets sharing one account identity remain - * stable without using modelStr as the affinity identity. + * Extract the base model identity from a target's executionKey or modelStr. + * This strips any per-connection suffix (@connectionId) to identify the model itself. + */ +function getBaseModelIdentity(target: ResolvedComboTarget): string { + // executionKey format: "stepId@connectionId" when expanded, or just "stepId" + const executionKey = target.executionKey || ""; + const baseExecutionKey = executionKey.split("@")[0]; + + // modelStr format: "provider/model" or "provider/model:version" + const modelStr = target.modelStr || ""; + + // Use executionKey as primary (preserves stepId grouping), fall back to modelStr + return baseExecutionKey || modelStr; +} + +/** + * Order eligible targets using rendezvous hashing. + * @param scope - "model": sort only within same-model groups, preserving inter-model order; + * "global": sort across all targets (original behavior). + * Defaults to "global" for backward compatibility. */ export function applyPromptCacheAffinity( targets: ResolvedComboTarget[], body: Record | null | undefined, - enabled: boolean = true + enabled: boolean = true, + scope: "model" | "global" = "global" ): PromptCacheAffinityResult { const resolution = enabled ? resolvePromptCacheAffinityKey(body) : null; if (!resolution || targets.length <= 1) { @@ -290,19 +308,61 @@ export function applyPromptCacheAffinity( index, identity: promptCacheTargetIdentity(target), score: rendezvousScore(resolution.key, promptCacheTargetIdentity(target)), + baseModel: scope === "model" ? getBaseModelIdentity(target) : null, })); - ranked.sort((a, b) => { - if (a.score > b.score) return -1; - if (a.score < b.score) return 1; - const identityOrder = a.identity.localeCompare(b.identity); - return identityOrder !== 0 ? identityOrder : a.index - b.index; - }); + if (scope === "model") { + // Group by base model identity, preserving original group order + const groups = new Map(); + const groupOrder: string[] = []; - return { - targets: ranked.map((entry) => entry.target), - applied: true, - source: resolution.source, - fingerprint: resolution.fingerprint, - }; + for (const entry of ranked) { + // baseModel is guaranteed non-null when scope === "model" (see map above) + const baseModel = entry.baseModel as string; + if (!groups.has(baseModel)) { + groups.set(baseModel, []); + groupOrder.push(baseModel); + } + groups.get(baseModel)!.push(entry); + } + + // Sort within each group by score, then identity, then original index + const sortedGroups = groupOrder.map((baseModel) => { + const group = groups.get(baseModel)!; + return group.sort((a, b) => { + if (a.score > b.score) return -1; + if (a.score < b.score) return 1; + const identityOrder = a.identity.localeCompare(b.identity); + return identityOrder !== 0 ? identityOrder : a.index - b.index; + }); + }); + + // Flatten groups in original order + const sortedTargets = sortedGroups.flatMap((group) => group.map((entry) => entry.target)); + + // Check if the order actually changed (for applied flag) + const orderChanged = !targets.every((target, i) => target === sortedTargets[i]); + + return { + targets: sortedTargets, + applied: orderChanged, // Only true if the order actually changed + source: resolution.source, + fingerprint: resolution.fingerprint, + }; + } else { + // Original global sorting behavior + ranked.sort((a, b) => { + if (a.score > b.score) return -1; + if (a.score < b.score) return 1; + const identityOrder = a.identity.localeCompare(b.identity); + return identityOrder !== 0 ? identityOrder : a.index - b.index; + }); + + return { + targets: ranked.map((entry) => entry.target), + applied: true, + source: resolution.source, + fingerprint: resolution.fingerprint, + }; + } } diff --git a/open-sse/services/combo/providerWildcard.ts b/open-sse/services/combo/providerWildcard.ts index fdc5cd60ab..d27c168cd5 100644 --- a/open-sse/services/combo/providerWildcard.ts +++ b/open-sse/services/combo/providerWildcard.ts @@ -31,7 +31,7 @@ import { wildcardMatch } from "../wildcardRouter.ts"; import { getProviderModels } from "../../config/providerModels.ts"; -import { getSyncedAvailableModels } from "../../../src/lib/db/models.ts"; +import { getActiveSyncedCatalog } from "../../../src/lib/db/models/activeSyncedCatalog.ts"; import type { ComboLike } from "./types.ts"; /** Sentinel pattern used for "all models of a provider". */ @@ -116,39 +116,18 @@ function parseWildcardEntry(entry: unknown): ProviderWildcardSpec | null { } /** - * Collect candidate model IDs for a provider from two sources: - * 1. Synced available models in the DB (runtime-dynamic; custom/OAuth providers) - * 2. Static provider registry (built-in providers bundled with the release) - * - * The union is deduped by model id. + * Collect candidate model IDs using the active synced catalog as the + * authoritative source when it is non-empty. Static registry models remain a + * fail-open fallback when no active usable catalog exists. */ async function collectProviderModelIds(providerId: string): Promise { - const seen = new Set(); - const ids: string[] = []; + const liveCatalog = await getActiveSyncedCatalog(providerId); - // 1. Synced DB models (highest priority — reflects the live catalog) - try { - const synced = await getSyncedAvailableModels(providerId); - for (const m of synced) { - if (m.id && !seen.has(m.id)) { - seen.add(m.id); - ids.push(m.id); - } - } - } catch { - // Non-fatal — DB may be offline in tests or at early init. + if (liveCatalog.authoritative) { + return liveCatalog.models.map((model) => model.id); } - // 2. Static registry models (fallback / built-in providers) - const registryModels = getProviderModels(providerId); - for (const m of registryModels) { - if (m.id && !seen.has(m.id)) { - seen.add(m.id); - ids.push(m.id); - } - } - - return ids; + return getProviderModels(providerId).map((model) => model.id); } /** diff --git a/open-sse/services/combo/quotaScoring.ts b/open-sse/services/combo/quotaScoring.ts index 8f9dbbca92..4a853b1455 100644 --- a/open-sse/services/combo/quotaScoring.ts +++ b/open-sse/services/combo/quotaScoring.ts @@ -177,46 +177,113 @@ function normalizeWindowPercentUsed(value: unknown): number | null { return clamp01(numericValue); } +type QuotaWindowSnapshot = { percentUsed: number | null; resetAt: string | null }; + +/** + * Pick the first candidate that actually carries a reset instant, falling back + * to the first present candidate. A window can be structurally present but + * carry `resetAt: null` (e.g. Codex's `window7d` placeholder when the upstream + * only reported the primary limit); a plain `a || b` short-circuit would let + * that empty window shadow a sibling that does know when it resets — #9330. + */ +function pickWindowWithResetAt( + ...candidates: Array +): QuotaWindowSnapshot | null { + return candidates.find((candidate) => candidate?.resetAt) ?? candidates.find(Boolean) ?? null; +} + function getNamedQuotaWindow( quota: unknown, windowName: ResetWindowName -): { percentUsed: number | null; resetAt: string | null } | null { +): QuotaWindowSnapshot | null { if (!quota || !isRecord(quota)) return null; if (windowName === "session") return getQuotaWindow(quota, "window5h"); if (windowName === "weekly") { - return getQuotaWindow(quota, "window7d") || getQuotaWindow(quota, "windowWeekly"); + return pickWindowWithResetAt( + getQuotaWindow(quota, "window7d"), + getQuotaWindow(quota, "windowWeekly") + ); } if (windowName === "monthly") return getQuotaWindow(quota, "windowMonthly"); return null; } -function getWindowsMapQuotaWindow( - quota: unknown, - windowName: ResetWindowName -): { percentUsed: number | null; resetAt: string | null } | null { - if (!quota || !isRecord(quota) || !isRecord(quota.windows)) return null; - const candidates = Object.entries(quota.windows) - .map(([key, value]) => ({ key: key.toLowerCase(), value })) - .filter(({ key }) => key === windowName || key.startsWith(`${windowName} `)); - - if (candidates.length === 0) return null; - candidates.sort((a, b) => a.key.localeCompare(b.key)); - const window = candidates[0].value; +function toWindowSnapshot(window: unknown): QuotaWindowSnapshot | null { if (!isRecord(window)) return null; - return { percentUsed: normalizeWindowPercentUsed(window.percentUsed), resetAt: normalizeResetAt(window.resetAt), }; } +/** + * Every entry of the snapshot's `windows` map, name lower-cased. + * + * Deliberately reads `windows` only, never Codex's wider `allWindows`: for a + * Spark request `fetchCodexQuota` narrows `windows` to the Spark scope on + * purpose, and pulling the normal-scope entries back in would rank a request + * against a window it cannot spend. + */ +function getQuotaWindowEntries( + quota: unknown +): Array<{ key: string; window: QuotaWindowSnapshot }> { + if (!quota || !isRecord(quota) || !isRecord(quota.windows)) return []; + const entries: Array<{ key: string; window: QuotaWindowSnapshot }> = []; + for (const [key, value] of Object.entries(quota.windows)) { + const window = toWindowSnapshot(value); + if (window) entries.push({ key: key.toLowerCase(), window }); + } + return entries; +} + +function getWindowsMapQuotaWindow( + quota: unknown, + windowName: ResetWindowName +): QuotaWindowSnapshot | null { + const candidates = getQuotaWindowEntries(quota).filter( + ({ key }) => key === windowName || key.startsWith(`${windowName} `) + ); + + if (candidates.length === 0) return null; + candidates.sort((a, b) => a.key.localeCompare(b.key)); + // Prefer a candidate that knows when it resets (e.g. "weekly" vs a scoped + // "weekly (spark)" placeholder without a resetAt) — #9330. + return pickWindowWithResetAt( + ...candidates.filter(({ window }) => window.resetAt).map(({ window }) => window), + candidates[0].window + ); +} + function resolveQuotaWindowByName( quota: unknown, windowName: ResetWindowName -): { percentUsed: number | null; resetAt: string | null } | null { - return getNamedQuotaWindow(quota, windowName) || getWindowsMapQuotaWindow(quota, windowName); +): QuotaWindowSnapshot | null { + return pickWindowWithResetAt( + getNamedQuotaWindow(quota, windowName), + getWindowsMapQuotaWindow(quota, windowName) + ); +} + +/** + * Earliest reset instant across EVERY window a snapshot exposes, regardless of + * how the provider named it. + * + * Last-resort normalizer for #9330: providers routed through + * `genericQuotaFetcher.convertUsageToQuotaInfo` key their `windows` map by + * MODEL ID (Antigravity: "gemini-3-flash", "claude-sonnet-5", …), so none of + * the canonical "weekly" | "session" | "monthly" lookups match. Without this + * those accounts resolved to `Infinity` ("never resets") and were sorted behind + * a Codex account whose secondary window was 26 days out. + */ +function getEarliestWindowResetMs(quota: unknown): number { + let earliest = Infinity; + for (const { window } of getQuotaWindowEntries(quota)) { + const resetMs = parseResetTimeMs(window.resetAt); + if (Number.isFinite(resetMs)) earliest = Math.min(earliest, resetMs); + } + return earliest; } function getResetUrgency(resetAt: string | null | undefined, windowMs: number): number { @@ -276,6 +343,23 @@ export function scoreResetAwareQuota( return { score }; } +/** + * Absolute epoch-ms instant at which the configured quota window next resets, + * or `Infinity` when the snapshot exposes no parseable reset (which sorts the + * target last under the `reset-window` strategy). + * + * Resolution order — each step only runs when the previous one found nothing: + * 1. the configured windows, by canonical name (structural `window5h` / + * `window7d` / `windowWeekly` / `windowMonthly` fields, then a `windows` + * map keyed by "weekly" | "session" | "monthly"); + * 2. the earliest reset across every entry of the `windows` map, whatever the + * provider named them (Antigravity keys its map by model id — #9330); + * 3. the single-signal top-level `quota.resetAt`. + * + * Step 2 sits ahead of step 3 deliberately: `quota.resetAt` is populated from + * the most-USED window, which is not necessarily the one resetting soonest, and + * is left null entirely while every window is still at 0% used. + */ export function getResetWindowTimestampMs(quota: unknown, windows: ResetWindowName[]): number { if (!quota || !isRecord(quota) || quota.limitReached === true) return Infinity; @@ -288,6 +372,10 @@ export function getResetWindowTimestampMs(quota: unknown, windows: ResetWindowNa } } + if (!Number.isFinite(selectedResetMs)) { + selectedResetMs = getEarliestWindowResetMs(quota); + } + if (!Number.isFinite(selectedResetMs)) { selectedResetMs = parseResetTimeMs(normalizeResetAt(quota.resetAt)); } @@ -295,6 +383,26 @@ export function getResetWindowTimestampMs(quota: unknown, windows: ResetWindowNa return Number.isFinite(selectedResetMs) ? selectedResetMs : Infinity; } +/** + * Milliseconds remaining until the configured window resets — the uniform + * metric the `reset-window` strategy sorts on (ascending: soonest first). + * + * Normalizing to a duration (rather than comparing raw epoch timestamps) keeps + * every provider on one scale and collapses already-elapsed resets to 0, so a + * snapshot that is stale by three days ties with one that reset a second ago + * instead of jumping the queue by virtue of being older. `Infinity` means "no + * known reset" and sorts last. + */ +export function getResetWindowRemainingMs( + quota: unknown, + windows: ResetWindowName[], + now: number = Date.now() +): number { + const resetMs = getResetWindowTimestampMs(quota, windows); + if (!Number.isFinite(resetMs)) return Infinity; + return Math.max(0, resetMs - now); +} + function getResetWindowHorizonMs(windows: ResetWindowName[]): number { if (windows.includes("monthly")) return 30 * 24 * 60 * 60 * 1000; if (windows.includes("weekly")) return RESET_AWARE_WEEKLY_WINDOW_MS; diff --git a/open-sse/services/combo/quotaStrategies.ts b/open-sse/services/combo/quotaStrategies.ts index 3e0f27ee99..4234b29433 100644 --- a/open-sse/services/combo/quotaStrategies.ts +++ b/open-sse/services/combo/quotaStrategies.ts @@ -18,10 +18,18 @@ * and orderTargetsByResetWindow shares the same rrCounters Map from ./rrState.ts * (D7a) so reset-aware tie rotation stays consistent with round-robin routing. * + * @changes + * - [2026-07-24] [Composer] - Exclude Antigravity accounts without stored projectId from reset-aware pool + * - [2026-07-24] [Composer] - Skip quota-exhausted and rate-limited connections in reset-aware expansion + * * Pure leaf: this module never imports from the combo barrel. */ -import { getRuntimeProviderProfile, type ProviderProfile } from "../accountFallback.ts"; +import { + getRuntimeProviderProfile, + isAccountUnavailable, + type ProviderProfile, +} from "../accountFallback.ts"; import { PRE_SCREEN_CONCURRENCY } from "../comboConfig.ts"; import { getQuotaFetcher } from "../quotaPreflight.ts"; import { getCircuitBreaker } from "../../../src/shared/utils/circuitBreaker"; @@ -33,10 +41,12 @@ import { resolveResetWindowConfig, getResetAwareProvider, scoreResetAwareQuota, - getResetWindowTimestampMs, + getResetWindowRemainingMs, type QuotaFetchCacheConfig, } from "./quotaScoring.ts"; import { rankByHeadroom, type HeadroomSaturation } from "./headroomRanking.ts"; +import { preferAntigravityConnectionsWithStoredProject } from "../antigravityProjectPersist.ts"; +import { isQuotaExhaustedForRequest } from "../../../src/domain/quotaCache.ts"; const RESET_AWARE_CONNECTION_CACHE_TTL_MS = 30_000; const RESET_AWARE_QUOTA_FETCH_CONCURRENCY = 5; @@ -75,9 +85,14 @@ async function getQuotaAwareConnectionsForTarget( (async () => { try { const connections = await getCachedProviderConnections({ provider, isActive: true }); - const activeConnections = Array.isArray(connections) + let activeConnections = Array.isArray(connections) ? (connections as Array>) : []; + if (provider === "antigravity" || provider === "agy") { + activeConnections = preferAntigravityConnectionsWithStoredProject( + activeConnections + ) as Array>; + } if ( !resetAwareConnectionCache.has(provider) && resetAwareConnectionCache.size >= MAX_RESET_AWARE_CACHE @@ -199,6 +214,18 @@ async function expandTargetsByQuotaAwareConnections( } for (const connectionId of connectionIds) { + const provider = getResetAwareProvider(target); + const connection = connectionById.get(connectionId); + if ( + connection && + typeof connection.rateLimitedUntil === "string" && + isAccountUnavailable(connection.rateLimitedUntil) + ) { + continue; + } + if (provider && isQuotaExhaustedForRequest(connectionId, provider, target.modelStr || null)) { + continue; + } expandedTargets.push({ ...target, connectionId, @@ -509,27 +536,35 @@ export async function orderTargetsByResetWindow( apiKeyAllowedConnectionIds ); + // One `now` snapshot for the whole ranking: quota fetches run concurrently and + // can take seconds, so re-reading the clock per target would compare remaining + // times measured against different instants (#9330). + const now = Date.now(); const scoredTargets = await scoreQuotaAwareTargets({ comboName, config, connectionById, expandedTargets, log, - scoreQuota: (quota) => ({ resetMs: getResetWindowTimestampMs(quota, config.windows) }), + scoreQuota: (quota) => ({ + remainingMs: getResetWindowRemainingMs(quota, config.windows, now), + }), }); + // Ascending: the account whose quota resets SOONEST goes first. Targets with + // no known reset (Infinity) fall to the back, ordered by combo priority. scoredTargets.sort((a, b) => { - if (a.resetMs !== b.resetMs) return a.resetMs - b.resetMs; + if (a.remainingMs !== b.remainingMs) return a.remainingMs - b.remainingMs; return a.index - b.index; }); - const bestResetMs = scoredTargets[0]?.resetMs ?? Infinity; - if (!Number.isFinite(bestResetMs) || config.tieBandMs <= 0) { + const bestRemainingMs = scoredTargets[0]?.remainingMs ?? Infinity; + if (!Number.isFinite(bestRemainingMs) || config.tieBandMs <= 0) { return scoredTargets.map((entry) => entry.target); } const tiedTargets = scoredTargets.filter( - (entry) => entry.resetMs - bestResetMs <= config.tieBandMs + (entry) => entry.remainingMs - bestRemainingMs <= config.tieBandMs ); if (tiedTargets.length <= 1) return scoredTargets.map((entry) => entry.target); diff --git a/open-sse/services/combo/runtimeUnitCapacity.ts b/open-sse/services/combo/runtimeUnitCapacity.ts new file mode 100644 index 0000000000..6af5430043 --- /dev/null +++ b/open-sse/services/combo/runtimeUnitCapacity.ts @@ -0,0 +1,90 @@ +/** + * @file runtimeUnitCapacity.ts + * @description Concurrency-capacity checks for nested combo execute-mode units so + * ordered strategies overflow to the next slot instead of queueing on a full connection. + * + * @changes + * - [2026-07-24] [Composer] - Initial capacity pre-check for execute-mode runtime units + */ +import { isAccountSemaphoreFull } from "../accountSemaphore.ts"; +import { resolveComboTargets } from "./comboStructure.ts"; +import { lookupPositiveCap } from "./concurrencyCaps.ts"; +import type { + ComboCollectionLike, + ComboLike, + HiddenModelsByProvider, + ResolvedComboUnit, +} from "./types.ts"; + +type CapLookup = (connectionId: string) => Promise; + +function isRecord(value: unknown): value is Record { + return !!value && typeof value === "object" && !Array.isArray(value); +} + +function getCombosList(allCombos: ComboCollectionLike): ComboLike[] { + const combos = Array.isArray(allCombos) ? allCombos : allCombos?.combos || []; + return combos.filter( + (combo): combo is ComboLike => isRecord(combo) && typeof combo.name === "string" + ); +} + +function findComboByName(allCombos: ComboCollectionLike, name: string): ComboLike | null { + return getCombosList(allCombos).find((combo) => combo.name === name) || null; +} + +async function isConnectionAtConcurrencyCap( + provider: string, + connectionId: string, + lookupCap: CapLookup +): Promise { + const cap = await lookupCap(connectionId); + if (!cap) return false; + return isAccountSemaphoreFull(provider, connectionId, cap); +} + +/** + * Returns true when the runtime unit should be skipped because every limited + * connection it would use is already at max_concurrent. + */ +export async function isRuntimeUnitAtConcurrencyCap( + unit: ResolvedComboUnit, + allCombos: ComboCollectionLike, + lookupCap: CapLookup = lookupPositiveCap, + // Threaded from the caller so the hidden-model snapshot resolved once per + // request is reused. Without it resolveComboTargets falls back to its default + // getHiddenModelsByProvider(), i.e. a fresh full key_value read per nested + // combo-ref unit on EVERY request (#8878 threaded the other call sites). + hiddenModelsByProvider?: HiddenModelsByProvider +): Promise { + if (unit.kind === "model") { + if (!unit.connectionId || !unit.provider) return false; + return isConnectionAtConcurrencyCap(unit.provider, unit.connectionId, lookupCap); + } + + const childCombo = findComboByName(allCombos, unit.comboName); + if (!childCombo) return false; + + const targets = resolveComboTargets(childCombo, allCombos, 1, hiddenModelsByProvider); + const byConnection = new Map(); + for (const target of targets) { + if (!target.connectionId || !target.provider) continue; + byConnection.set(target.connectionId, { + provider: target.provider, + connectionId: target.connectionId, + }); + } + if (byConnection.size === 0) return false; + + let sawLimitedConnection = false; + for (const { provider, connectionId } of byConnection.values()) { + const cap = await lookupCap(connectionId); + if (!cap) continue; + sawLimitedConnection = true; + if (!isAccountSemaphoreFull(provider, connectionId, cap)) { + return false; + } + } + + return sawLimitedConnection; +} diff --git a/open-sse/services/combo/runtimeUnits.ts b/open-sse/services/combo/runtimeUnits.ts index e839fc01bb..90ad1c2cac 100644 --- a/open-sse/services/combo/runtimeUnits.ts +++ b/open-sse/services/combo/runtimeUnits.ts @@ -1,7 +1,14 @@ -// Nested combo runtime unit execution — see combo.ts for integration. +/** + * @file runtimeUnits.ts + * @description Nested combo runtime unit execution — see combo.ts for integration. + * + * @changes + * - [2026-07-24] [Composer] - Skip execute-mode units at concurrency cap before dispatch + */ import { errorResponse } from "../../utils/error.ts"; import { recordComboRequest } from "../comboMetrics.ts"; import { resolveDelayMs } from "./comboPredicates.ts"; +import { isRuntimeUnitAtConcurrencyCap } from "./runtimeUnitCapacity.ts"; import { validateResponseQuality, releaseQualityClone } from "./validateQuality.ts"; import type { ResponseValidationConfig } from "./responseValidation.ts"; import type { @@ -11,6 +18,7 @@ import type { ComboNestingContext, HandleComboChatOptions, HandleSingleModel, + HiddenModelsByProvider, IsModelAvailable, ResolvedComboRefTarget, ResolvedComboUnit, @@ -179,6 +187,7 @@ export async function executeRuntimeUnitCombo(args: { nesting: ComboNestingContext; baseOptions: HandleComboChatOptions; runCombo: RuntimeUnitRunner; + hiddenModelsByProvider?: HiddenModelsByProvider; }): Promise { const maxRetries = Number(args.config.maxRetries ?? 1); const retryDelayMs = resolveDelayMs(args.config.retryDelayMs, 2000); @@ -190,6 +199,22 @@ export async function executeRuntimeUnitCombo(args: { let fallbackCount = 0; for (const unit of orderedUnits) { + if ( + await isRuntimeUnitAtConcurrencyCap( + unit, + args.allCombos, + undefined, + args.hiddenModelsByProvider + ) + ) { + args.log.info( + "COMBO", + `Skipping ${unit.kind} ${unitDisplayName(unit)} — concurrency cap reached` + ); + fallbackCount += 1; + continue; + } + for (let retry = 0; retry <= maxRetries; retry += 1) { if (args.signal?.aborted) return { response: errorResponse(499, "Client disconnected"), unit }; diff --git a/open-sse/services/combo/shadowRouting.ts b/open-sse/services/combo/shadowRouting.ts index 5483b4320d..a04a23687f 100644 --- a/open-sse/services/combo/shadowRouting.ts +++ b/open-sse/services/combo/shadowRouting.ts @@ -16,13 +16,14 @@ import { secureRandomFloat } from "../../../src/shared/utils/secureRandom"; import { recordComboShadowRequest } from "../comboMetrics.ts"; import { isRecord } from "./comboData.ts"; -import { resolveNestedComboTargets } from "./comboStructure.ts"; +import { filterVisibleComboTargets, resolveNestedComboTargets } from "./comboStructure.ts"; import { toRecordedTarget } from "./comboPredicates.ts"; import type { ComboLike, ComboCollectionLike, ComboLogger, HandleSingleModel, + HiddenModelsByProvider, IsModelAvailable, ResolvedComboTarget, ShadowRoutingConfig, @@ -47,7 +48,8 @@ function normalizeShadowRoutingConfig(config: Record): ShadowRo export function resolveShadowTargets( combo: ComboLike, config: Record, - allCombos: ComboCollectionLike + allCombos: ComboCollectionLike, + hiddenModelsByProvider?: HiddenModelsByProvider ): ResolvedComboTarget[] { const shadowConfig = normalizeShadowRoutingConfig(config); if (!shadowConfig.enabled || shadowConfig.targets.length === 0) return []; @@ -58,7 +60,10 @@ export function resolveShadowTargets( name: `${combo.name}:shadow`, models: shadowConfig.targets, }; - return resolveNestedComboTargets(shadowCombo, allCombos, new Set([combo.name]), 0, ["shadow"]) + return filterVisibleComboTargets( + resolveNestedComboTargets(shadowCombo, allCombos, new Set([combo.name]), 0, ["shadow"]), + hiddenModelsByProvider + ) .slice(0, shadowConfig.maxTargets) .map((target) => ({ ...target, diff --git a/open-sse/services/combo/targetResolution.ts b/open-sse/services/combo/targetResolution.ts index 82f23b8c3d..0b1189aa7e 100644 --- a/open-sse/services/combo/targetResolution.ts +++ b/open-sse/services/combo/targetResolution.ts @@ -88,6 +88,7 @@ import type { ComboRuntimeStep, HandleSingleModel, IsModelAvailable, + HiddenModelsByProvider, ResolvedComboTarget, } from "./types.ts"; @@ -111,6 +112,7 @@ export interface ResolveComboTargetPipelineDeps { * this leaf), so importing it directly would create an import cycle. */ buildAutoCandidates: ResolveAutoStrategyDeps["buildAutoCandidates"]; + hiddenModelsByProvider?: HiddenModelsByProvider; } export interface ResolvedComboTargetPipeline { @@ -204,10 +206,15 @@ async function collectWeightedEligibility( expandedCombo: ComboLike, expandedAllCombos: ComboCollectionLike, resilienceSettings: ResilienceSettings, - isModelAvailable?: IsModelAvailable + isModelAvailable?: IsModelAvailable, + hiddenModelsByProvider?: HiddenModelsByProvider ): Promise<{ stepGroups: WeightedStepGroups; weightedEligibleKeys: Set }> { const weightedEligibleKeys = new Set(); - const stepGroups = resolveWeightedStepGroups(expandedCombo, expandedAllCombos); + const stepGroups = resolveWeightedStepGroups( + expandedCombo, + expandedAllCombos, + hiddenModelsByProvider + ); for (const group of stepGroups) { const availability = await Promise.all( group.targets.map((target) => @@ -260,7 +267,8 @@ async function resolveWeightedSelection( expandedCombo, expandedAllCombos, deps.resilienceSettings, - deps.isModelAvailable + deps.isModelAvailable, + deps.hiddenModelsByProvider ); stepGroups = eligibility.stepGroups; weightedEligibleKeys = eligibility.weightedEligibleKeys; @@ -351,7 +359,8 @@ function logTargetPoolSize( * auto routing (pipeline disabled, below token threshold, or dispatch failure). */ async function dispatchSmartPipeline( - deps: ResolveComboTargetPipelineDeps + deps: ResolveComboTargetPipelineDeps, + availableModels: readonly string[] ): Promise { const { body, combo, strategy, config, settings, signal, log } = deps; if (strategy !== "auto") return null; @@ -362,6 +371,7 @@ async function dispatchSmartPipeline( const pipelineRaw = await handlePipelineCombo({ body, combo, + availableModels, handleChatCore: deps.handleSingleModelWithTimeout, log: { info: log.info, @@ -648,10 +658,24 @@ async function applyPromptCacheStage( promptCacheAffinityEnabled && resolvePromptCacheAffinityKey(body) ? await expandPromptCacheAffinityTargets(orderedTargets) : orderedTargets; + + // Determine affinity scope: restrict to model-level for deterministic strategies + // to preserve operator-defined model order; keep global for cross-model + // strategies. Per #8370, lkgp/auto/cache-optimized explicitly support promoting + // a previously-successful model ahead of the declared order, so they must stay + // cross-model ("global") rather than be locked into a single model step. + const modelOrderPreservingStrategies = new Set([ + "priority", + "weighted", + "fill-first", + "quota-share", + ]); + const isDeterministicStrategy = modelOrderPreservingStrategies.has(strategy); const promptCacheAffinity = applyPromptCacheAffinity( promptCacheAffinityTargets, body, - promptCacheAffinityEnabled + promptCacheAffinityEnabled, + isDeterministicStrategy ? "model" : "global" ); if (!promptCacheAffinity.applied) return orderedTargets; const protectedOriginal = @@ -687,7 +711,8 @@ export async function resolveComboTargetPipeline( : resolveComboTargets( expandedCombo, expandedAllCombos, - clampComboDepth(config.maxComboDepth) + clampComboDepth(config.maxComboDepth), + deps.hiddenModelsByProvider ); orderedTargets = await applyRequestTagRouting(orderedTargets, body, log); @@ -699,7 +724,10 @@ export async function resolveComboTargetPipeline( logTargetPoolSize(strategy, allCombos, orderedTargets, stickyWeightedKey, log); - const pipelineResponse = await dispatchSmartPipeline(deps); + const pipelineResponse = await dispatchSmartPipeline( + deps, + orderedTargets.map((target) => target.modelStr) + ); if (pipelineResponse) return { earlyResponse: pipelineResponse }; const ordering = await orderByStrategy(deps, orderedTargets); diff --git a/open-sse/services/combo/types.ts b/open-sse/services/combo/types.ts index 9371d11529..ca00fedbce 100644 --- a/open-sse/services/combo/types.ts +++ b/open-sse/services/combo/types.ts @@ -95,6 +95,8 @@ export type ComboNestingContext = { attemptBudget: { count: number; limit: number }; }; +export type HiddenModelsByProvider = ReadonlyMap>; + export type HandleComboChatOptions = { body: Record; combo: ComboLike; @@ -107,6 +109,7 @@ export type HandleComboChatOptions = { signal?: AbortSignal | null; apiKeyAllowedConnections?: string[] | null; nesting?: ComboNestingContext | null; + hiddenModelsByProvider?: HiddenModelsByProvider; }; export type HandleRoundRobinOptions = Omit< @@ -167,6 +170,7 @@ export type ResolvedComboTarget = { allowedConnectionIds?: string[] | null; weight: number; label: string | null; + prompt?: string | null; failoverBeforeRetry?: unknown; trafficType?: "production" | "shadow"; /** diff --git a/open-sse/services/comboConfig.ts b/open-sse/services/comboConfig.ts index 9bae96b52e..4489b6194a 100644 --- a/open-sse/services/comboConfig.ts +++ b/open-sse/services/comboConfig.ts @@ -179,6 +179,7 @@ const DEFAULT_COMBO_CONFIG = { contextRequirements: undefined as | { minContextWindow?: number; + maxContextWindow?: number; preferLargeContext?: boolean; contextFilterMode?: "strict" | "lenient"; } diff --git a/open-sse/services/compression/bodyAdapter.ts b/open-sse/services/compression/bodyAdapter.ts index 64edaca84e..467575349f 100644 --- a/open-sse/services/compression/bodyAdapter.ts +++ b/open-sse/services/compression/bodyAdapter.ts @@ -400,13 +400,24 @@ export function adaptBodyForCompression( }); const cleanedInput = nextInput.filter((item) => { - if (!isRecord(item) || item.type !== "function_call") return true; + if (!isRecord(item)) return true; + const t = item.type; + if ( + t !== "function_call" && + t !== "custom_tool_call" && + t !== "local_shell_call" && + t !== "apply_patch_call" + ) { + return true; + } if (typeof item.call_id !== "string" || item.call_id.length === 0) return true; const hadMappedOutput = mappings.some((mapping) => { const original = mapping.item; return ( (original.type === "function_call_output" || - original.type === "custom_tool_call_output") && + original.type === "custom_tool_call_output" || + original.type === "local_shell_call_output" || + original.type === "apply_patch_call_output") && original.call_id === item.call_id ); }); diff --git a/open-sse/services/compression/engines/ccr/index.ts b/open-sse/services/compression/engines/ccr/index.ts index e52755129f..d0b5ba10e7 100644 --- a/open-sse/services/compression/engines/ccr/index.ts +++ b/open-sse/services/compression/engines/ccr/index.ts @@ -37,6 +37,13 @@ */ import crypto from "node:crypto"; +import { + deleteAllCcrBlocks, + deleteCcrBlockRow, + loadCcrBlock, + persistCcrBlock, + touchCcrBlock, +} from "../../../../../src/lib/db/ccrBlocks.ts"; import { createCompressionStats } from "../../stats.ts"; import { queryBlock, type CcrQuery } from "./ccrQuery.ts"; import { injectCcrProtocolInstruction } from "./protocolInstruction.ts"; @@ -156,6 +163,151 @@ function buildStoreKey(hash: string, principalId?: string): string { return `${principalId ?? ANON} ${hash}`; } +// ─── durable second tier (#9061) ────────────────────────────────────────────── + +/** + * The map above is the hot cache. It loses entries to cross-principal LRU eviction, to + * the TTL, to restarts, and to a retrieve landing on another instance, while + * `fidelityGateStep` waives fidelity checks for sampling engines on the grounds that + * their drop is "CCR-recoverable", and the protocol instruction promises the model a + * verbatim block. These helpers put the block on disk so that promise survives. + * + * Every one of them is best-effort: a store without a usable database (compression + * preview, unit tests, a read-only volume) degrades to today's in-memory behaviour + * rather than failing the request. + * + * Three guards keep this from changing what the deployment stores at rest more than it + * has to. They follow the call-log artifact path, which faced the same question: + * + * 1. Blocks over `MAX_DURABLE_BLOCK_BYTES` stay memory-only. `MAX_CCR_BLOCK_BYTES` is + * 2 MB, and 5,000 of those would be 10 GB of prompt text in SQLite. 512 KB is the + * ceiling #1647 already set on call artifacts for this exact reason. + * 2. No durable tier on a cloud runtime, which has no local disk to write to. + * 3. `COMPRESSION_CCR_DURABLE_STORE=false` turns it off. The content is prompt text, and an + * operator who does not want that on disk needs a switch that is not a rebuild. + * + * The switch defaults to on because the model is already told, by the CCR protocol + * instruction, that it can retrieve the block verbatim. Leaving it off by default would + * keep that promise hollow for everyone who never reads this file. + */ +const MAX_DURABLE_BLOCK_BYTES = 512 * 1024; + +/** Matches the detection call-log artifacts use (`callLogArtifacts.ts`). */ +const isCloudRuntime = typeof globalThis.caches === "object" && globalThis.caches !== null; + +function durableTierEnabled(): boolean { + return !isCloudRuntime && process.env.COMPRESSION_CCR_DURABLE_STORE !== "false"; +} + +const loggedDurableErrors = new Set(); + +function warnDurableError(operation: string, error: unknown): void { + if (process.env.NODE_ENV === "test") return; + if (loggedDurableErrors.has(operation)) return; + if (loggedDurableErrors.size >= 20) { + const first = loggedDurableErrors.values().next().value; + if (first !== undefined) loggedDurableErrors.delete(first); + } + loggedDurableErrors.add(operation); + const message = error instanceof Error ? error.message : String(error); + console.warn(`[ccr] durable ${operation} failed: ${message}`); +} + +/** + * Writes are deferred off the request path. Measured on this repo, a synchronous + * `persistCcrBlock` costs 0.032 ms at the 600-char minimum block but 1.77 ms at 500 KB, + * past the 1 ms this engine declares in its metadata, and roughly 7x the sha256 it + * already pays over the same bytes. The block is in the map before the defer runs, so an + * in-process retrieve never waits for the disk; only a crash inside that tick loses the + * durable copy, and the client's next request re-stores it under the same hash. + * + * Persist and delete share this queue so they cannot reorder: `setImmediate` is FIFO, and + * a delete that overtook its own persist would resurrect the block it just removed. + */ +const MAX_PENDING_DURABLE_WRITES = 1_000; +let pendingDurableWrites = 0; +let droppedDurableWrites = 0; + +function deferDurable(operation: string, work: () => void, droppable = false): void { + // Backpressure. A burst faster than SQLite drains would otherwise queue without bound + // and hold every block's content live in the closure. Dropping a persist is safe: the + // block is still in the map, and the client re-stores it under the same hash on its + // next request. Deletes are never dropped, or a deleted block would come back. + if (droppable && pendingDurableWrites >= MAX_PENDING_DURABLE_WRITES) { + droppedDurableWrites++; + return; + } + pendingDurableWrites++; + setImmediate(() => { + pendingDurableWrites--; + try { + work(); + } catch (error) { + warnDurableError(operation, error); + } + }); +} + +function persistEntry(entry: CcrEntry): void { + if (!durableTierEnabled()) return; + if (entry.bytes > MAX_DURABLE_BLOCK_BYTES) return; + const snapshot = { ...entry }; + deferDurable("persist", () => persistCcrBlock(snapshot), true); +} + +function forgetEntry(hash: string, principalId: string): void { + if (!durableTierEnabled()) return; + deferDurable("delete", () => deleteCcrBlockRow(principalId, hash)); +} + +/** + * Read a block the map no longer holds and put it back in the map, so the LRU/byte + * accounting keeps working from there. Returns null when there is no durable row, which + * is also what a missing database looks like. + */ +function rehydrateEntry(hash: string, principalId: string, now: number): CcrEntry | null { + if (!durableTierEnabled()) return null; + let row: ReturnType; + try { + row = loadCcrBlock(principalId, hash, now); + } catch (error) { + warnDurableError("load", error); + return null; + } + if (!row) return null; + + const entry: CcrEntry = { + hash: row.hash, + principalId: row.principalId, + content: row.content, + bytes: row.bytes, + chars: row.chars, + lines: row.lines, + contentType: row.contentType, + source: row.source as CcrEntrySource, + createdAt: row.createdAt, + lastAccessedAt: now, + expiresAt: row.expiresAt, + }; + + // Re-admit through the same budgets a fresh store would face. If the block no longer + // fits, it stays on disk and is served straight from the row instead of being cached. + const { principalId: owner, bytes } = entry; + if (enforcePrincipalBudget(owner, bytes) && enforceGlobalBudget(owner, bytes)) { + const key = buildStoreKey(hash, principalId === ANON ? undefined : principalId); + ccrStore.set(key, entry); + ccrTotalBytes += entry.bytes; + principalBytesMap.set(entry.principalId, principalBytes(entry.principalId) + entry.bytes); + } + + try { + touchCcrBlock(entry.principalId, hash, now); + } catch (error) { + warnDurableError("touch", error); + } + return entry; +} + function readLifecycleCounters(principalId: string): CcrLifecycleCounters { return ( lifecycleByPrincipal.get(principalId) ?? { @@ -203,7 +355,12 @@ function removeEntry(key: string, reason?: "expired" | "capacity"): boolean { if (remainingPrincipalBytes === 0) principalBytesMap.delete(entry.principalId); else principalBytesMap.set(entry.principalId, remainingPrincipalBytes); const counters = mutableLifecycleCounters(entry.principalId); - if (reason === "expired") counters.expiredEvictions++; + if (reason === "expired") { + counters.expiredEvictions++; + // Expiry is the one eviction that means the block is finished. Capacity eviction is + // not: that block stays on disk, which is the point of the durable tier (#9061). + forgetEntry(entry.hash, entry.principalId); + } if (reason === "capacity") counters.capacityEvictions++; return true; } @@ -350,6 +507,7 @@ export function tryStoreBlock( ccrStore.set(key, entry); ccrTotalBytes += bytes; principalBytesMap.set(owner, principalBytes(owner) + bytes); + persistEntry(entry); return { stored: true, hash, metadata: publicMetadata(entry) }; } @@ -372,7 +530,12 @@ export function storeBlock( export function retrieveBlock(hash: string, principalId?: string, now = Date.now()): string | null { const key = buildStoreKey(hash, principalId); const entry = getActiveEntry(key, now); - if (!entry) return null; + if (!entry) { + // Miss in the hot cache is not proof the block is gone (#9061): LRU eviction, the TTL + // sweep, a restart, or another instance all land here while the row is still on disk. + const restored = rehydrateEntry(hash, principalId ?? ANON, now); + return restored ? restored.content : null; + } entry.lastAccessedAt = now; ccrStore.delete(key); ccrStore.set(key, entry); @@ -435,6 +598,14 @@ export function resetCcrStore(): void { principalBytesMap.clear(); ccrTotalBytes = 0; lifecycleByPrincipal.clear(); + // Through the same queue as persist/delete, so a reset cannot overtake a write it was + // meant to clear. + deferDurable("reset", deleteAllCcrBlocks); +} + +/** Resolves once the deferred durable writes queued so far have run. */ +export function flushCcrDurableWrites(): Promise { + return new Promise((resolve) => setImmediate(resolve)); } export function inspectCcrBlock( @@ -469,7 +640,11 @@ export function listCcrBlocks( } export function deleteCcrBlock(hash: string, principalId?: string, _now = Date.now()): boolean { - return removeEntry(buildStoreKey(hash, principalId)); + const removedFromCache = removeEntry(buildStoreKey(hash, principalId)); + // An explicit delete must reach the durable tier too, otherwise the next retrieve + // rehydrates the block the caller just deleted. + forgetEntry(hash, principalId ?? ANON); + return removedFromCache; } export function getCcrStoreStats(principalId?: string, now = Date.now()): CcrStoreStats { diff --git a/open-sse/services/compression/engines/llmlingua/onnxWorker.ts b/open-sse/services/compression/engines/llmlingua/onnxWorker.ts index 61dfb69018..1552158607 100644 --- a/open-sse/services/compression/engines/llmlingua/onnxWorker.ts +++ b/open-sse/services/compression/engines/llmlingua/onnxWorker.ts @@ -84,7 +84,68 @@ async function getCompressor(entry: LlmlinguaModelEntry, modelPath?: string): Pr logger: () => {}, }); - return promptCompressor; + return { compressor: promptCompressor, oai }; +} + +/** + * Chunk-overflow guard for the BERT position-embedding table. + * + * The library's chunkContext() splits input at `max_seq_length - 2` = 510 + * o200k (tiktoken) tokens, then decodes each chunk to text and re-tokenizes it + * with the model's wordpiece tokenizer for inference. The round-trip can + * EXPAND (510 tiktoken tokens → 516 wordpiece tokens observed), and the + * expanded sequence (plus [CLS]/[SEP]) overruns the model's + * max_position_embeddings=512 → onnxruntime fails with a broadcast error on + * `/bert/embeddings/Add_1` (512 by 516) and the whole call fail-opens. + * + * Fix: never hand the library a single text larger than MAX_SEG_TOKENS + * o200k tokens. The library then emits one chunk per call and the wordpiece + * round-trip stays safely under 512. Sentence-boundary backtracking keeps the + * cuts at natural breaks so compression quality is unaffected. + * + * Empirically measured on the TinyBERT meetingbank model: o200k→wordpiece + * expansion ≈ 1.09x, so cap 450 → max ~494 wordpiece (incl. [CLS]/[SEP]), + * while cap 470 → ~514 and overflows the position-embedding table. + */ +const MAX_SEG_TOKENS = 450; + +async function compressSegmented( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + compressor: any, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + oai: any, + text: string, + rate: number +): Promise { + const tokens = oai.encode(text); + if (tokens.length <= MAX_SEG_TOKENS) { + return compressor.compress(text, { rate }); + } + + const segments: string[] = []; + const END_TOKENS = new Set([".", "\n", "!", "?", ";"]); + let st = 0; + while (st < tokens.length) { + let ed = Math.min(st + MAX_SEG_TOKENS, tokens.length); + // Backtrack to the last sentence boundary inside the segment (≤ 80 tokens back). + for (let j = 0; j < Math.min(80, ed - st); j++) { + // js-tiktoken/lite exposes only encode/decode — decode a single-token slice. + const tok = oai.decode(tokens.slice(ed - 1 - j, ed - j)); + if (END_TOKENS.has(tok)) { + ed = ed - j; + break; + } + } + if (ed <= st) ed = Math.min(st + MAX_SEG_TOKENS, tokens.length); // no boundary — hard cut + segments.push(oai.decode(tokens.slice(st, ed))); + st = ed; + } + + const out: string[] = []; + for (const seg of segments) { + out.push(await compressor.compress(seg, { rate })); + } + return out.join("\n"); } if (parentPort) { @@ -104,9 +165,9 @@ if (parentPort) { }); } - const compressor = await pending; + const { compressor, oai } = await pending; const rate = typeof msg.compressionRate === "number" ? msg.compressionRate : 0.5; - const out: string = await compressor.compress(text, { rate }); + const out: string = await compressSegmented(compressor, oai, text, rate); parentPort!.postMessage({ id, ok: true, text: out }); } catch { diff --git a/open-sse/services/compression/engines/session-dedup/index.ts b/open-sse/services/compression/engines/session-dedup/index.ts index 0faafbb5a0..67424e1662 100644 --- a/open-sse/services/compression/engines/session-dedup/index.ts +++ b/open-sse/services/compression/engines/session-dedup/index.ts @@ -47,14 +47,19 @@ const DEFAULT_MIN_BLOCK_CHARS = 80; /** Minimum number of lines a block must span to be a dedup candidate. */ const MIN_BLOCK_LINES = 3; /** - * Request-wide ceiling for the suffix strings materialized by the exact pass. - * 32 MiB keeps ordinary sessions byte-identical while preventing line-rich inputs - * from retaining a quadratic graph of suffix copies. + * O(n²) guard for {@link findSuffixBlocks} (OOM incident): a single message with + * thousands of lines otherwise generates one full-length suffix string PER line, + * all retained at once. A real agent conversation embedding a large + * line-numbered file view (e.g. a tool result pasting a multi-thousand-line + * file back into the chat) drove ~1.7GB of live suffix strings and OOM-killed + * the 2GB heap (heap snapshot confirmed 6801 `{ block }` objects). These bound + * both the number of suffix starts scanned + * and the total bytes of retained blocks, so memory is O(budget) instead of O(n²). + * Dedup is best-effort — skipping the tail only forgoes some compression, never + * changes output correctness. */ -const MAX_SUFFIX_WORK_CHARS = 32 * 1024 * 1024; -const SUFFIX_WORK_BUDGET_WARNING = "session-dedup: skipped (suffix work budget exceeded)"; - -type SuffixWorkBudget = { remaining: number }; +const MAX_SUFFIX_STARTS = 2000; +const MAX_TOTAL_BLOCK_BYTES = 8 * 1024 * 1024; // ─── hash helper (SHA-256 prefix, collision-resistant) ─────────────────────── @@ -67,24 +72,6 @@ function hashBlock(text: string): string { // ─── suffix-block extraction ────────────────────────────────────────────────── -/** - * Reserves the characters that findSuffixBlocks() would materialize for one text. - * The scan observes line starts without splitting or constructing any suffix strings. - */ -function reserveSuffixWork(text: string, passCount: number, budget: SuffixWorkBudget): boolean { - let start = 0; - while (start <= text.length) { - const suffixChars = (text.length - start) * passCount; - if (suffixChars > budget.remaining) return false; - budget.remaining -= suffixChars; - - const nextNewline = text.indexOf("\n", start); - if (nextNewline === -1) break; - start = nextNewline + 1; - } - return true; -} - /** * For each starting line position, emit the suffix block `lines[start..end]` * (i.e. from `start` to the end of the line array). This ensures that any @@ -102,12 +89,19 @@ function findSuffixBlocks( const seen = new Set(); const results: Array<{ block: string; startLine: number }> = []; - for (let start = 0; start < n; start++) { + // O(n²) guard (#OOM): cap the number of suffix starts and the total retained + // block bytes so a huge message can't materialize thousands of full-length + // suffix strings at once. See MAX_SUFFIX_STARTS / MAX_TOTAL_BLOCK_BYTES. + const maxStarts = Math.min(n, MAX_SUFFIX_STARTS); + let totalBlockBytes = 0; + for (let start = 0; start < maxStarts; start++) { const block = lines.slice(start).join("\n"); const blockLines = n - start; if (blockLines >= MIN_BLOCK_LINES && block.length >= minBlockChars && !seen.has(block)) { seen.add(block); results.push({ block, startLine: start }); + totalBlockBytes += block.length; + if (totalBlockBytes >= MAX_TOTAL_BLOCK_BYTES) break; } } return results; @@ -145,9 +139,7 @@ function dedupeWithinMessage( for (const { block } of sortedBlocks) { // Only dedup blocks that appear 2+ times in the text. - const occurrences = ( - result.match(new RegExp(block.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || [] - ).length; + const occurrences = (result.match(new RegExp(block.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "g")) || []).length; if (occurrences < 2) continue; const sha = hashBlock(block); @@ -269,7 +261,7 @@ type MessageLike = { function processMessages( messages: MessageLike[], minBlockChars: number -): { messages: MessageLike[]; dedupCount: number; suffixWorkBudgetExceeded: boolean } { +): { messages: MessageLike[]; dedupCount: number } { // Collect (msgIdx, text) for non-system string-content messages. // For multipart, index each text part separately. const msgTexts: Array<{ msgIdx: number; text: string }> = []; @@ -291,24 +283,13 @@ function processMessages( } if (msgTexts.length === 0) { - return { messages, dedupCount: 0, suffixWorkBudgetExceeded: false }; - } - - // Single-message exact dedup enumerates suffixes once; cross-message dedup does so - // in both passes. Reserve the request-wide work up front so no quadratic suffix graph - // is partially materialized before the engine decides to fail open. - const suffixWorkBudget: SuffixWorkBudget = { remaining: MAX_SUFFIX_WORK_CHARS }; - const passCount = msgTexts.length === 1 ? 1 : 2; - for (const { text } of msgTexts) { - if (!reserveSuffixWork(text, passCount, suffixWorkBudget)) { - return { messages, dedupCount: 0, suffixWorkBudgetExceeded: true }; - } + return { messages, dedupCount: 0 }; } const { deduped, dedupCount } = dedupMessageTexts(msgTexts, minBlockChars); if (dedupCount === 0) { - return { messages, dedupCount: 0, suffixWorkBudgetExceeded: false }; + return { messages, dedupCount: 0 }; } const result = messages.map((msg, i) => { @@ -337,7 +318,7 @@ function processMessages( return { ...msg }; }); - return { messages: result, dedupCount, suffixWorkBudgetExceeded: false }; + return { messages: result, dedupCount }; } // ─── schema & validation ────────────────────────────────────────────────────── @@ -383,8 +364,7 @@ function validateSessionDedupConfig(config: Record): EngineVali const f = config["fuzzy"]; if (typeof f === "object" && f !== null) { const fe = (f as Record)["enabled"]; - if (fe !== undefined && typeof fe !== "boolean") - errors.push("fuzzy.enabled must be a boolean"); + if (fe !== undefined && typeof fe !== "boolean") errors.push("fuzzy.enabled must be a boolean"); } else if (typeof f !== "boolean") { errors.push("fuzzy must be an object { enabled } or a boolean"); } @@ -435,18 +415,10 @@ export const sessionDedupEngine: CompressionEngine = { } const start = performance.now(); - const { - messages: exactMessages, - dedupCount, - suffixWorkBudgetExceeded, - } = processMessages(messages as MessageLike[], minBlockChars); - - if (suffixWorkBudgetExceeded) { - const durationMs = Math.round(performance.now() - start); - const stats = createCompressionStats(body, body, "stacked", [], undefined, durationMs); - stats.validationWarnings = [SUFFIX_WORK_BUDGET_WARNING]; - return { body, compressed: false, stats }; - } + const { messages: exactMessages, dedupCount } = processMessages( + messages as MessageLike[], + minBlockChars + ); const { messages: finalMessages, fuzzyCount } = runFuzzyPass( exactMessages, diff --git a/open-sse/services/compression/languageDetector.ts b/open-sse/services/compression/languageDetector.ts index bbd4a79f83..9e1851443c 100644 --- a/open-sse/services/compression/languageDetector.ts +++ b/open-sse/services/compression/languageDetector.ts @@ -1,4 +1,5 @@ const LANGUAGE_HINTS: Record = { + it: [/\b(?:perche|perché|pero|però|cioe|cioè|quindi|potresti|vorrei|adesso|errore|grazie|devo|voglio|questo|quello|anche|sono|molto)\b/i], "pt-BR": [/\b(?:voce|você|preciso|arquivo|codigo|código|erro|falha|obrigado)\b/i], // NOTE: English-ambiguous words are intentionally excluded — "error" (es) and // "configuration" (fr) are identical in English and would misclassify English text. @@ -6,6 +7,7 @@ const LANGUAGE_HINTS: Record = { es: [/\b(?:necesito|archivo|codigo|código|fallo|gracias|puedes)\b/i], de: [/\b(?:ich|datei|fehler|bitte|kannst|konfiguration|danke)\b/i], fr: [/\b(?:fichier|erreur|merci|peux|besoin)\b/i], + ru: [/\b(?:\u044d\u0442\u043e|\u0447\u0442\u043e|\u043a\u0430\u043a|\u0435\u0441\u043b\u0438|\u0447\u0442\u043e\u0431\u044b|\u043a\u043e\u0442\u043e\u0440\u044b\u0439|\u043c\u043e\u0436\u0435\u0442|\u043d\u0443\u0436\u043d\u043e|\u0435\u0441\u0442\u044c|\u0431\u044b\u043b\u043e|\u0431\u0443\u0434\u0435\u0442|\u043c\u043e\u0436\u043d\u043e|\u0434\u043e\u043b\u0436\u0435\u043d|\u0444\u0430\u0439\u043b|\u043e\u0448\u0438\u0431\u043a\u0430|\u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430|\u0434\u0430\u043d\u043d\u044b\u0435)\b/i, /[\u0430-\u044f\u0451]/i], ja: [/[\u3040-\u30ff]/], id: [/\b(?:saya|kamu|anda|dengan|untuk|yang|tidak|bisa|terima\s+kasih|dari)\b/i], }; diff --git a/open-sse/services/compression/rules/it/context.json b/open-sse/services/compression/rules/it/context.json new file mode 100644 index 0000000000..745b6d0116 --- /dev/null +++ b/open-sse/services/compression/rules/it/context.json @@ -0,0 +1,70 @@ +{ + "language": "it", + "category": "context", + "rules": [ + { + "name": "it_context_setup", + "pattern": "\\b(?:ecco (?:qui )?il codice|questo è il codice|qui sotto (?:c'è |trovi )?il codice|di seguito il codice|ti allego il codice)\\b\\s*[:.]?\\s*", + "replacement": "Codice:", + "context": "user", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "it_intent", + "pattern": "\\b(?:il mio obiettivo è|quello che (?:mi serve|voglio|devo fare) è|quello che sto cercando di fare è|l'idea è (?:quella di |))\\b\\s*", + "replacement": "Obiettivo:", + "context": "user", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "it_error_report", + "pattern": "\\b(?:mi (?:dà|da) (?:questo |il seguente |)errore|ricevo (?:questo |il seguente |)errore|ottengo (?:questo |il seguente |)errore|l'errore che (?:mi dà|ricevo) è)\\b\\s*[:.]?\\s*", + "replacement": "Errore:", + "context": "user", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "it_expected_behavior", + "pattern": "\\b(?:quello che mi aspetto è|dovrebbe (?:invece |)(?:fare|succedere|restituire)|il comportamento atteso è)\\b\\s*[:.]?\\s*", + "replacement": "Atteso:", + "context": "user", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "it_already_tried", + "pattern": "\\b(?:ho (?:già |)provato a|ho tentato di|ho cercato di)\\b\\s*", + "replacement": "Provato:", + "context": "user", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "it_question_directive", + "pattern": "\\b(?:mi (?:sapresti |sai |puoi |)dire (?:se|come|cosa|quando|perché)|(?:sai|sapresti) (?:dirmi )?(?:se|come|cosa|quando|perché))\\b\\s*", + "replacement": "", + "context": "user", + "category": "context", + "minIntensity": "lite" + }, + { + "name": "it_environment_preamble", + "pattern": "\\b(?:sto (?:lavorando|usando|utilizzando)|nel mio (?:progetto|sistema|ambiente))\\b\\s*", + "replacement": "", + "context": "user", + "category": "context", + "minIntensity": "full" + }, + { + "name": "it_scope_note", + "pattern": "\\b(?:tieni (?:presente|conto) che|considera che|nota che|da notare che)\\b\\s*", + "replacement": "NB:", + "context": "all", + "category": "context", + "minIntensity": "lite" + } + ] +} diff --git a/open-sse/services/compression/rules/it/dedup.json b/open-sse/services/compression/rules/it/dedup.json new file mode 100644 index 0000000000..8513e486d1 --- /dev/null +++ b/open-sse/services/compression/rules/it/dedup.json @@ -0,0 +1,38 @@ +{ + "language": "it", + "category": "dedup", + "rules": [ + { + "name": "it_repeated_context", + "pattern": "\\b(?:come (?:ti )?(?:ho )?(?:già |)(?:detto|accennato|scritto|spiegato) (?:prima|sopra|in precedenza)|come dicevo|come sopra|come menzionato)\\b[,.]?\\s*", + "replacement": "Vedi sopra. ", + "context": "all", + "category": "dedup", + "minIntensity": "lite" + }, + { + "name": "it_repeated_question", + "pattern": "\\b(?:stessa domanda di prima|te l'ho già chiesto|è la stessa domanda|come chiedevo prima)\\b[,.]?\\s*", + "replacement": "[stessa domanda] ", + "context": "user", + "category": "dedup", + "minIntensity": "lite" + }, + { + "name": "it_restating", + "pattern": "\\b(?:in altre parole|detto altrimenti|ovvero|vale a dire|cioè per essere chiari)\\b[,:]?\\s*", + "replacement": "cioè ", + "context": "all", + "category": "dedup", + "minIntensity": "full" + }, + { + "name": "it_recap_preamble", + "pattern": "\\b(?:ricapitolando|per ricapitolare|facciamo il punto|riepilogo)\\b[,:]?\\s*", + "replacement": "", + "context": "assistant", + "category": "dedup", + "minIntensity": "full" + } + ] +} diff --git a/open-sse/services/compression/rules/it/filler.json b/open-sse/services/compression/rules/it/filler.json new file mode 100644 index 0000000000..62649d7663 --- /dev/null +++ b/open-sse/services/compression/rules/it/filler.json @@ -0,0 +1,94 @@ +{ + "language": "it", + "category": "filler", + "rules": [ + { + "name": "it_polite_framing", + "pattern": "\\b(?:per favore|per cortesia|ti (?:pre|)gherei di|potresti|puoi|riusciresti a|ti dispiacerebbe|se puoi|se ti va|quando puoi|gentilmente)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_pleasantries", + "pattern": "\\b(?:ciao|buongiorno|buonasera|buon pomeriggio|salve|grazie mille|grazie tante|ti ringrazio|grazie)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_hedging", + "pattern": "\\b(?:credo che|penso che|mi sembra che|mi pare che|direi che|secondo me|a mio (?:parere|avviso)|forse|magari|probabilmente|presumibilmente|verosimilmente)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_filler_adverbs", + "pattern": "\\b(?:sostanzialmente|essenzialmente|fondamentalmente|praticamente|in realtà|in effetti|letteralmente|semplicemente|diciamo|insomma|comunque|appunto|ovviamente|chiaramente)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_self_reference", + "pattern": "^(?:sto cercando di|vorrei|volevo|avrei bisogno di|ho bisogno di|mi servirebbe|mi serve|vorrei sapere se|volevo sapere se|voglio)\\b\\s*", + "replacement": "", + "context": "user", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_verbose_request", + "pattern": "\\b(?:potresti spiegarmi|puoi spiegarmi|mi spieghi|mi puoi spiegare|potresti dettagliare|puoi dettagliare|mi sapresti dire|sapresti dirmi|mi dici)\\b\\s*", + "replacement": "spiega ", + "context": "user", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_assistant_servility", + "pattern": "\\b(?:certamente|assolutamente|volentieri|con piacere|sarei felice di aiutarti|sono felice di aiutarti|ottima domanda|bella domanda|buona domanda)\\b[,.!]?\\s*", + "replacement": "", + "context": "assistant", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_assistant_preamble", + "pattern": "^(?:ecco|ecco qui|ecco a te|allora|dunque|bene)\\b[,:]?\\s*", + "replacement": "", + "context": "assistant", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_closing_offer", + "pattern": "\\b(?:fammi sapere se (?:hai bisogno|ti serve|vuoi)[^.!?]*|se hai (?:altre |ulteriori )?(?:domande|dubbi)[^.!?]*|spero (?:che )?(?:questo )?(?:ti )?(?:sia (?:stato )?d'aiuto|aiuti)[^.!?]*)[.!?]\\s*", + "replacement": "", + "context": "assistant", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "it_apology", + "pattern": "\\b(?:mi scuso per|scusa per|chiedo scusa per|mi dispiace per)\\b[^.!?]*[.!?]\\s*", + "replacement": "", + "context": "assistant", + "category": "filler", + "minIntensity": "full" + }, + { + "name": "it_softeners", + "pattern": "\\b(?:un attimo|un momento|se non ti dispiace|se non è troppo disturbo|se possibile)\\b[,.]?\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + } + ] +} diff --git a/open-sse/services/compression/rules/it/structural.json b/open-sse/services/compression/rules/it/structural.json new file mode 100644 index 0000000000..1c87e76d3d --- /dev/null +++ b/open-sse/services/compression/rules/it/structural.json @@ -0,0 +1,102 @@ +{ + "language": "it", + "category": "structural", + "rules": [ + { + "name": "it_purpose", + "pattern": "\\b(?:al fine di|allo scopo di|con l'obiettivo di|in modo da poter|in modo da|così da|in maniera tale da)\\b\\s*", + "replacement": "per ", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "it_causal", + "pattern": "\\b(?:a causa del fatto che|per il fatto che|dal momento che|visto che|dato che|in quanto)\\b\\s*", + "replacement": "perché ", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "it_connectors", + "pattern": "\\b(?:inoltre|in aggiunta|per di più|d'altra parte|d'altro canto|oltre a ciò)\\b[,]?\\s*", + "replacement": "anche ", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "it_emphasis", + "pattern": "\\b(?:molto|davvero|veramente|estremamente|parecchio|piuttosto|abbastanza|super)\\s+(?=[a-zàèéìòùA-Z])", + "replacement": "", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "it_redundant_phrasing", + "pattern": "\\bnel caso in cui\\b", + "replacement": "se", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "it_time_redundancy", + "pattern": "\\b(?:nel momento in cui|nell'istante in cui|nel periodo in cui)\\b", + "replacement": "quando", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "it_place_redundancy", + "pattern": "\\b(?:all'interno di|nell'ambito di|nel contesto di)\\b", + "replacement": "in", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "it_recommendation", + "pattern": "\\b(?:ti (?:consiglierei|consiglio|suggerirei|suggerisco) di|sarebbe (?:meglio|opportuno|consigliabile)|converrebbe)\\b\\s*", + "replacement": "usa ", + "context": "assistant", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "it_possibility", + "pattern": "\\b(?:è possibile che|potrebbe essere che|può darsi che)\\b\\s*", + "replacement": "forse ", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "it_necessity", + "pattern": "\\b(?:è necessario che|occorre che|bisogna che|è indispensabile che)\\b\\s*", + "replacement": "serve che ", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "it_conclusion", + "pattern": "\\b(?:in conclusione|per concludere|riassumendo|in sintesi|tirando le somme)\\b[,:]?\\s*", + "replacement": "", + "context": "assistant", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "it_double_negation", + "pattern": "\\bnon è (?:possibile|fattibile) (?:non |)\\b", + "replacement": "non si può ", + "context": "all", + "category": "structural", + "minIntensity": "full" + } + ] +} diff --git a/open-sse/services/compression/rules/it/ultra.json b/open-sse/services/compression/rules/it/ultra.json new file mode 100644 index 0000000000..6d8c486677 --- /dev/null +++ b/open-sse/services/compression/rules/it/ultra.json @@ -0,0 +1,106 @@ +{ + "language": "it", + "category": "ultra", + "rules": [ + { + "name": "it_articles", + "pattern": "\\b(?:[Ii]l|[Ll]o|[Ll]a|[Ii]|[Gg]li|[Ll]e|[Uu]n|[Uu]no|[Uu]na)\\s+(?=[a-zàèéìòù])", + "flags": "g", + "replacement": "", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "it_leader_phrases", + "pattern": "^(?:posso|possiamo|vado a|andiamo a|proviamo a|fammi|lasciami|si può)\\s+(?=[a-zàèéìòù])", + "replacement": "", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "it_ultra_database", + "pattern": "\\bbase(?:e|) dati\\b|\\bbase di dati\\b", + "replacement": "DB", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "it_ultra_config", + "pattern": "\\bconfigurazion(?:e|i)\\b", + "replacement": "config", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "it_ultra_function", + "pattern": "\\bfunzion(?:e|i)\\b", + "replacement": "fn", + "context": "all", + "category": "terse", + "minIntensity": "ultra" + }, + { + "name": "it_ultra_variable", + "pattern": "\\bvariabil(?:e|i)\\b", + "replacement": "var", + "context": "all", + "category": "terse", + "minIntensity": "ultra" + }, + { + "name": "it_ultra_application", + "pattern": "\\bapplicazion(?:e|i)\\b", + "replacement": "app", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "it_ultra_implementation", + "pattern": "\\bimplementazion(?:e|i)\\b", + "replacement": "impl", + "context": "all", + "category": "terse", + "minIntensity": "ultra" + }, + { + "name": "it_ultra_directory", + "pattern": "\\b(?:cartell(?:a|e)|director(?:y|ies))\\b", + "replacement": "dir", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "it_ultra_error", + "pattern": "\\bmessaggio di errore\\b", + "replacement": "errore", + "context": "all", + "category": "terse", + "minIntensity": "full" + }, + { + "name": "it_copula_drop", + "pattern": "\\b(?:che )?(?:è|sono) (?:un|una|il|la|lo|gli|le)\\s+(?=[a-zàèéìòù])", + "replacement": "", + "context": "all", + "category": "terse", + "minIntensity": "ultra" + }, + { + "name": "it_ultra_environment", + "pattern": "\\bambiente di (?:sviluppo|produzione)\\b", + "replacementMap": { + "ambiente di sviluppo": "dev", + "ambiente di produzione": "prod" + }, + "context": "all", + "category": "terse", + "minIntensity": "ultra" + } + ] +} diff --git a/open-sse/services/compression/rules/ru/context.json b/open-sse/services/compression/rules/ru/context.json new file mode 100644 index 0000000000..26534688ff --- /dev/null +++ b/open-sse/services/compression/rules/ru/context.json @@ -0,0 +1,38 @@ +{ + "language": "ru", + "category": "context", + "rules": [ + { + "name": "subject_omission", + "pattern": "^(?:Я |Мы |Вы )(?:можем|должны|будем|хотим|нужно)\\b\\s*", + "replacement": "", + "context": "all", + "category": "context", + "minIntensity": "full" + }, + { + "name": "known_fact_hedging", + "pattern": "(?<=\\.)\\s*(?:Возможно|Наверное|Может быть),\\s+", + "replacement": "", + "context": "assistant", + "category": "context", + "minIntensity": "full" + }, + { + "name": "redundant_clarification", + "pattern": "\\b(?:как я уже говорил|как уже упоминалось|как было сказано)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "context", + "minIntensity": "full" + }, + { + "name": "obvious_continuation", + "pattern": "\\b(?:далее|затем|после этого|в итоге)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "context", + "minIntensity": "ultra" + } + ] +} diff --git a/open-sse/services/compression/rules/ru/dedup.json b/open-sse/services/compression/rules/ru/dedup.json new file mode 100644 index 0000000000..6678979858 --- /dev/null +++ b/open-sse/services/compression/rules/ru/dedup.json @@ -0,0 +1,30 @@ +{ + "language": "ru", + "category": "dedup", + "rules": [ + { + "name": "thought_repetition", + "pattern": "([^.!?]+[.!?])\\s+\\1", + "replacement": "$1", + "context": "all", + "category": "dedup", + "minIntensity": "full" + }, + { + "name": "word_duplication", + "pattern": "\\b(\\w+)\\s+\\1\\b", + "replacement": "$1", + "context": "all", + "category": "dedup", + "minIntensity": "lite" + }, + { + "name": "synonymous_repetition", + "pattern": "\\b(проблема|ошибка)\\b[^.!?]*\\b(проблема|ошибка)\\b", + "replacement": "$1", + "context": "all", + "category": "dedup", + "minIntensity": "full" + } + ] +} diff --git a/open-sse/services/compression/rules/ru/filler.json b/open-sse/services/compression/rules/ru/filler.json new file mode 100644 index 0000000000..aa28ae6153 --- /dev/null +++ b/open-sse/services/compression/rules/ru/filler.json @@ -0,0 +1,86 @@ +{ + "language": "ru", + "category": "filler", + "rules": [ + { + "name": "pleasantries", + "pattern": "\\b(?:конечно|с радостью|рад помочь|могу помочь|обязательно|безусловно|разумеется)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "polite_framing", + "pattern": "\\b(?:пожалуйста|если хотите|если можно|будьте добры|будьте любезны|прошу вас)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "verbal_wrapping", + "pattern": "\\b(?:давайте разберём|давайте посмотрим|попробуем разобраться|постараюсь помочь)\\b[,.!?\\s]*", + "replacement": "", + "context": "assistant", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "hedging", + "pattern": "\\b(?:возможно|наверное|может быть|скорее всего|вероятно|видимо|похоже)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "filler_adverbs", + "pattern": "\\b(?:в целом|на самом деле|в принципе|как правило|по сути|фактически|буквально)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "empty_qualifiers", + "pattern": "\\b(?:удобный|хороший|эффективный|мощный|отличный|прекрасный)(?!\\s+(?:вариант|способ|решение|метод|инструмент))\\b", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "redundant_openers", + "pattern": "^(?:Привет|Здравствуйте|Добрый день|Доброе утро|Добрый вечер)\\s*[,.!?\\s]?\\s*", + "replacement": "", + "context": "user", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "excessive_gratitude", + "pattern": "\\b(?:Большое спасибо|Огромное спасибо|Спасибо заранее|Заранее благодарю|Очень признателен)\\b[,.!?\\s]*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "softeners", + "pattern": "\\b(?:немного|немножко|чуть-чуть|слегка|несколько|как-то)\\b\\s*", + "replacement": "", + "context": "all", + "category": "filler", + "minIntensity": "lite" + }, + { + "name": "assistant_fillers", + "pattern": "^(?:Вот|Ниже|Это|Здесь)\\s+(?:есть|находится)?\\s*", + "replacement": "", + "context": "assistant", + "category": "filler", + "minIntensity": "lite" + } + ] +} diff --git a/open-sse/services/compression/rules/ru/structural.json b/open-sse/services/compression/rules/ru/structural.json new file mode 100644 index 0000000000..78bf745f29 --- /dev/null +++ b/open-sse/services/compression/rules/ru/structural.json @@ -0,0 +1,101 @@ +{ + "language": "ru", + "category": "structural", + "rules": [ + { + "name": "problem_phrasing", + "pattern": "\\b(?:проблема заключается в том, что|дело в том, что|суть в том, что)\\b\\s*", + "replacement": "проблема: ", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "causality_verbose", + "pattern": "\\b(?:это приводит к тому, что|это означает, что|из этого следует, что)\\b\\s*", + "replacement": "→ ", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "purpose_phrases", + "pattern": "\\b(?:для того чтобы|с целью того чтобы)\\b\\s*", + "replacement": "чтобы ", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "causality_phrases", + "pattern": "\\b(?:в связи с тем, что|по причине того, что|ввиду того, что)\\b\\s*", + "replacement": "из-за ", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "concession_phrases", + "pattern": "\\b(?:несмотря на то, что|хотя и)\\b\\s*", + "replacement": "хотя ", + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "note_phrases", + "pattern": "\\b(?:стоит отметить, что|следует иметь в виду, что|важно понимать, что|необходимо учитывать, что)\\b\\s*", + "replacement": "", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "redundant_directive", + "pattern": "\\b(?:важно помнить|не забывайте|помните о том)\\b\\s*", + "replacement": "", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "approximation", + "pattern": "\\b(?:примерно|приблизительно)\\b\\s*", + "replacement": "≈ ", + "context": "all", + "category": "structural", + "minIntensity": "full" + }, + { + "name": "forbidden_abbreviations_dots", + "pattern": "\\b(?:т\\.к\\.|т\\.е\\.|и т\\.д\\.|и т\\.п\\.|см\\.|напр\\.|и др\\.|в т\\.ч\\.)\\b", + "replacement": "", + "replacementMap": { + "т.к.": "так как", + "т.е.": "то есть", + "и т.д.": "", + "и т.п.": "", + "см.": "см", + "напр.": "например", + "и др.": "", + "в т.ч.": "" + }, + "context": "all", + "category": "structural", + "minIntensity": "lite" + }, + { + "name": "forbidden_abbreviations_dash", + "pattern": "\\b(?:кол-во|к-рый|св-во)\\b", + "replacement": "", + "replacementMap": { + "кол-во": "количество", + "к-рый": "который", + "св-во": "свойство" + }, + "context": "all", + "category": "structural", + "minIntensity": "lite" + } + ] +} diff --git a/open-sse/services/compression/rules/ru/ultra.json b/open-sse/services/compression/rules/ru/ultra.json new file mode 100644 index 0000000000..ca2609aac7 --- /dev/null +++ b/open-sse/services/compression/rules/ru/ultra.json @@ -0,0 +1,46 @@ +{ + "language": "ru", + "category": "ultra", + "rules": [ + { + "name": "ultra_compression_conjunctions", + "pattern": "\\b(?:однако|тем не менее|в то время как)\\b\\s*", + "replacement": "—", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "ultra_compression_articles", + "pattern": "\\b(?:является|представляет собой)\\b\\s*", + "replacement": "—", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "ultra_compression_verbs", + "pattern": "\\b(?:необходимо|требуется|нужно)\\b\\s*", + "replacement": "", + "context": "all", + "category": "ultra", + "minIntensity": "ultra" + }, + { + "name": "ultra_punctuation", + "pattern": "[,:;]\\s+", + "replacement": " ", + "context": "all", + "category": "ultra", + "minIntensity": "notes" + }, + { + "name": "ultra_lowercase", + "pattern": "(?<=\\.)\\s+([А-ЯЁ])", + "replacement": " $1", + "context": "all", + "category": "ultra", + "minIntensity": "notes" + } + ] +} diff --git a/open-sse/services/cursorSessionManager.ts b/open-sse/services/cursorSessionManager.ts index 95af2b491b..74358c03ad 100644 --- a/open-sse/services/cursorSessionManager.ts +++ b/open-sse/services/cursorSessionManager.ts @@ -192,6 +192,29 @@ export class CursorSessionManager { if (oldest) this.close(oldest); } + /** + * Find a session that has one of the specified tool call IDs pending. + * Only matches sessions in "awaiting_tool_result" state. + * Transitions the found session to "running" (same as acquire). + * This is used when the client doesn't provide conversation_id + * (OpenAI-compatible clients), so we match by content instead of key. + * Returns undefined if no session has any of the given IDs pending. + */ + findByToolCallIds(toolCallIds: string[]): CursorSession | undefined { + this.evictExpired(); + for (const id of toolCallIds) { + for (const session of this.sessions.values()) { + if (session.state === "awaiting_tool_result" && session.pendingToolCalls.has(id)) { + this.clearIdleTimer(session); + session.state = "running"; + session.lastActivityTs = Date.now(); + return session; + } + } + } + return undefined; + } + // ─── Test / introspection helpers ──────────────────────────────────────── size(): number { diff --git a/open-sse/services/errorClassifier.ts b/open-sse/services/errorClassifier.ts index 7f1ff1dece..71bc81f5eb 100644 --- a/open-sse/services/errorClassifier.ts +++ b/open-sse/services/errorClassifier.ts @@ -245,6 +245,20 @@ export function classifyProviderError( if (recoverableProject403) { return PROVIDER_ERROR_TYPES.PROJECT_ROUTE_ERROR; } + // #8813 — ChatGPT Web's Cloudflare Sentinel/Turnstile 403 is a TERMINAL + // block: the user's IP/session needs a browser Turnstile challenge, and + // retrying the same connection will keep 403ing. Classify as FORBIDDEN so + // the connection gets banned and combo routing falls back to other providers. + // Must be checked BEFORE the generic apikey-403→null return below, which + // is designed for normal API-key auth 403s that ARE recoverable. + if ( + bodyStr.includes("SENTINEL_BLOCKED") || + /\bSentinel\b[^\n]{0,80}\bblocked\b/i.test(bodyStr) || + /\bTurnstile required\b/i.test(bodyStr) + ) { + return PROVIDER_ERROR_TYPES.FORBIDDEN; + } + if (provider && getProviderCategory(provider) === "apikey") { return null; } diff --git a/open-sse/services/firecrawlQuotaFetcher.ts b/open-sse/services/firecrawlQuotaFetcher.ts index d86e1ad116..021ccedfc9 100644 --- a/open-sse/services/firecrawlQuotaFetcher.ts +++ b/open-sse/services/firecrawlQuotaFetcher.ts @@ -104,15 +104,48 @@ export function parseFirecrawlCreditUsage(data: unknown): FirecrawlQuota | null }; } +export function getFirecrawlBaseUrl(connection?: Record): string | null { + const envBase = process.env.FIRECRAWL_BASE_URL?.trim(); + if (envBase && !envBase.includes("api.firecrawl.dev")) { + return envBase.replace(/\/+$/, ""); + } + const providerData = toRecord(connection?.providerSpecificData); + const connBase = + typeof connection?.baseUrl === "string" ? connection.baseUrl : providerData?.baseUrl; + if (typeof connBase === "string" && connBase.trim() && !connBase.includes("api.firecrawl.dev")) { + return connBase.trim().replace(/\/+$/, ""); + } + return null; +} + export async function fetchFirecrawlQuota( connectionId: string, connection?: Record -): Promise { + // FirecrawlQuota, not the base QuotaInfo: every return here is a full credit + // breakdown (remainingCredits / planCredits / extraCreditsInferred / overPlan), + // and the narrower annotation made the custom-base literal below an excess- + // property error. FirecrawlQuota extends QuotaInfo, so callers are unaffected. +): Promise { const cached = quotaCache.get(connectionId); if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) { return cached.quota; } + const customBase = getFirecrawlBaseUrl(connection); + if (customBase) { + return { + used: 0, + total: 0, + percentUsed: 0, + resetAt: null, + remainingCredits: 0, + planCredits: 0, + extraCreditsInferred: 0, + overPlan: false, + limitReached: false, + }; + } + const apiKey = extractFirecrawlApiKey(connection); if (!apiKey) { quotaCache.set(connectionId, { quota: null, fetchedAt: Date.now() }); diff --git a/open-sse/services/fusion.ts b/open-sse/services/fusion.ts index dd92c3bdbc..767da61531 100644 --- a/open-sse/services/fusion.ts +++ b/open-sse/services/fusion.ts @@ -20,7 +20,7 @@ */ import { errorResponse, sanitizeErrorMessage } from "../utils/error.ts"; import { extractTextContent } from "../translator/helpers/geminiHelper.ts"; -import type { ComboLogger, HandleSingleModel } from "./combo/types.ts"; +import type { ComboLogger, HandleSingleModel, ResolvedComboTarget } from "./combo/types.ts"; // Fusion tuning. Overridable per-combo via combo.config.fusionTuning. export const FUSION_DEFAULTS = { @@ -108,10 +108,7 @@ export function appendUserTurn(body: Body, text: string): Body { } else if (Array.isArray(body.input)) { next.input = [...(body.input as unknown[]), { role: "user", content: text }]; } else if (Array.isArray(body.contents)) { - next.contents = [ - ...(body.contents as unknown[]), - { role: "user", parts: [{ text }] }, - ]; + next.contents = [...(body.contents as unknown[]), { role: "user", parts: [{ text }] }]; } else { next.messages = [{ role: "user", content: text }]; } @@ -159,10 +156,7 @@ export function isToolBearingRequest(body: Body): boolean { type Sentinel = { __timeout?: true; __error?: unknown }; // Resolve a Response (or sentinel) within ms; the loser keeps running but is ignored. -function withTimeout( - promise: Promise, - ms: number -): Promise { +function withTimeout(promise: Promise, ms: number): Promise { return new Promise((resolve) => { const t = setTimeout(() => resolve({ __timeout: true }), ms); Promise.resolve(promise) @@ -224,16 +218,33 @@ export function collectPanel( }); } +export type FusionModel = ResolvedComboTarget | string; + export type HandleFusionChatOptions = { body: Body; - models: string[]; + models: FusionModel[]; handleSingleModel: HandleSingleModel; log: ComboLogger; comboName?: string; judgeModel?: string | null; + judgeTarget?: ResolvedComboTarget | null; tuning?: FusionTuning | null; }; +function getFusionModelString(model: FusionModel): string { + return typeof model === "string" ? model : model.modelStr; +} + +function dispatchFusionModel( + handleSingleModel: HandleSingleModel, + body: Body, + model: FusionModel +): Promise { + return typeof model === "string" + ? handleSingleModel(body, model) + : handleSingleModel(body, model.modelStr, model); +} + /** * Handle a fusion combo: fan the prompt out to every panel model in parallel, * then a judge model synthesizes one final answer from all panel responses. @@ -260,6 +271,7 @@ export async function handleFusionChat({ log, comboName, judgeModel, + judgeTarget, tuning, }: HandleFusionChatOptions): Promise { const panel = Array.isArray(models) ? models.filter(Boolean) : []; @@ -269,7 +281,7 @@ export async function handleFusionChat({ // A single-model fusion has nothing to fuse — just answer directly. if (panel.length === 1) { - return handleSingleModel(body, panel[0]); + return dispatchFusionModel(handleSingleModel, body, panel[0]); } // Reject an oversized panel BEFORE fan-out (issue #1905): fanning out N @@ -296,10 +308,10 @@ export async function handleFusionChat({ // gracefully via the answers.length===1 branch below (issue #6454). const minPanel = Math.min(Math.max(1, cfg.minPanel), panel.length); const hasExplicitJudge = Boolean(judgeModel && judgeModel.trim()); - const judge = hasExplicitJudge ? (judgeModel as string).trim() : panel[0]; + const judge = hasExplicitJudge ? (judgeModel as string).trim() : getFusionModelString(panel[0]); log.info( "FUSION", - `Combo "${comboName ?? ""}" | panel=${panel.length} [${panel.join(", ")}] | judge=${judge} | quorum=${minPanel}` + `Combo "${comboName ?? ""}" | panel=${panel.length} [${panel.map(getFusionModelString).join(", ")}] | judge=${judge} | quorum=${minPanel}` ); // Tool-bearing requests get no value from panel synthesis — panel members @@ -322,8 +334,8 @@ export async function handleFusionChat({ void _tc; const panelBody: Body = { ...rest, stream: false }; const t0 = Date.now(); - const calls = panel.map((m) => - withTimeout(handleSingleModel(panelBody, m), cfg.panelHardTimeoutMs) + const calls = panel.map((target) => + withTimeout(dispatchFusionModel(handleSingleModel, panelBody, target), cfg.panelHardTimeoutMs) ); const settled = await collectPanel(calls, { ...cfg, minPanel }); log.info("FUSION", `fan-out collected in ${Date.now() - t0}ms`); @@ -333,7 +345,7 @@ export async function handleFusionChat({ const failures: Array<{ model: string; reason: string }> = []; for (let i = 0; i < settled.length; i++) { const res = settled[i]; - const model = panel[i]; + const model = getFusionModelString(panel[i]); if (!res) { log.warn("FUSION", `Panel ${model} dropped (straggler/timeout)`); failures.push({ model, reason: "straggler_dropped" }); @@ -399,10 +411,7 @@ export async function handleFusionChat({ // synthesizing from a single source through itself would be redundant — // answer directly with the lone survivor (issue #6454). if (!hasExplicitJudge) { - log.info( - "FUSION", - `Only ${answers[0].model} succeeded — answering directly (no fusion)` - ); + log.info("FUSION", `Only ${answers[0].model} succeeded — answering directly (no fusion)`); return handleSingleModel(body, answers[0].model); } // An explicit judgeModel IS configured: honor it even with a single @@ -421,8 +430,8 @@ export async function handleFusionChat({ // SURVIVOR: prefer panel[0] when it survived, otherwise the first survivor. const effectiveJudge = hasExplicitJudge ? judge - : answers.some((a) => a.model === panel[0]) - ? panel[0] + : answers.some((a) => a.model === getFusionModelString(panel[0])) + ? getFusionModelString(panel[0]) : answers[0].model; if (answers.length === 1) { @@ -435,5 +444,7 @@ export async function handleFusionChat({ // 4. Judge analyzes + writes one final answer (streams to client if requested). const judgeBody = appendUserTurn(body, buildJudgePrompt(answers)); log.info("FUSION", `Judging ${answers.length} answers with ${effectiveJudge}`); - return handleSingleModel(judgeBody, effectiveJudge); + return judgeTarget + ? handleSingleModel(judgeBody, judgeTarget.modelStr, judgeTarget) + : handleSingleModel(judgeBody, effectiveJudge); } diff --git a/open-sse/services/model.ts b/open-sse/services/model.ts index 9bfc53a451..9465529a27 100644 --- a/open-sse/services/model.ts +++ b/open-sse/services/model.ts @@ -1,5 +1,6 @@ import { PROVIDER_ID_TO_ALIAS, PROVIDER_MODELS } from "../config/providerModels.ts"; import { resolveWildcardAlias } from "./wildcardRouter.ts"; +import { getRegisteredProviderEffortBaseModelId } from "../utils/registeredEffortVariants.ts"; type ProviderModelAliasMap = Record>; type ModelAliasValue = string | { provider?: string; model?: string }; @@ -53,6 +54,10 @@ ALIAS_TO_PROVIDER_ID["xiaomi"] = "xiaomi-mimo"; ALIAS_TO_PROVIDER_ID["llamacpp"] = "llama-cpp"; // agy/ is the short alias for antigravity provider. ALIAS_TO_PROVIDER_ID["agy"] = "antigravity"; +// aq/ is the user-visible prefix for the Amazon Q (AWS Builder ID) provider. +// The canonical provider ID is "amazon-q". Register it so parseModel("aq/") +// resolves provider = "amazon-q" instead of falling through to the identity fallback. +ALIAS_TO_PROVIDER_ID["aq"] = "amazon-q"; // Provider-scoped legacy model aliases. Used to normalize provider/model inputs // and keep backward compatibility when upstream IDs change. @@ -341,6 +346,48 @@ async function getActiveSyncedProvidersForModel(modelId: string) { } } +async function reconcileInferredProvidersWithActiveCatalog(providerIds: string[], modelId: string) { + const uniqueProviders = Array.from(new Set(providerIds)); + + try { + const { reconcileProvidersWithActiveSyncedCatalog } = + await import("@/lib/db/models/activeSyncedCatalog"); + + const reconciliations = await Promise.all( + uniqueProviders.map(async (provider) => { + const effortBaseModelId = getRegisteredProviderEffortBaseModelId(provider, modelId); + + const catalogModelId = effortBaseModelId ?? modelId; + + const reconciliation = await reconcileProvidersWithActiveSyncedCatalog( + [provider], + catalogModelId + ); + + return { + provider, + allowed: reconciliation.providers.includes(provider), + excluded: reconciliation.excludedProviders.includes(provider), + }; + }) + ); + + return { + providers: reconciliations + .filter((result) => result.allowed) + .map((result) => result.provider), + excludedProviders: reconciliations + .filter((result) => result.excluded) + .map((result) => result.provider), + }; + } catch { + return { + providers: uniqueProviders, + excludedProviders: [], + }; + } +} + function isTruthyEnv(value: string | undefined) { return typeof value === "string" && /^(1|true|yes|on)$/i.test(value.trim()); } @@ -597,19 +644,22 @@ async function resolveModelByProviderInference(modelId: string, extendedContext: }; } } - // #FIX: synced catalogs (populated from `/v1/models` per connection) can - // claim ownership of models the provider does not actually serve (e.g. a - // `kiro` upstream briefly advertising `claude-opus-5` before it was - // vendored into the registry). Without this filter the bare-routing path - // would forward traffic to providers that 404 on the upstream call. - // Auto-discovery still wins when no static registry entry exists for the - // model id — only entries that conflict with the static catalog are dropped. - const staticCatalogProviders = MODEL_TO_PROVIDERS.get(modelId) || []; - const validatedSyncedProviders = - staticCatalogProviders.length > 0 - ? activeSyncedProviders.filter((p) => staticCatalogProviders.includes(p)) - : activeSyncedProviders; - const providers = getInferredProvidersForModel(modelId, validatedSyncedProviders); + + const candidateProviders = getInferredProvidersForModel(modelId, activeSyncedProviders); + const { providers, excludedProviders } = await reconcileInferredProvidersWithActiveCatalog( + candidateProviders, + modelId + ); + + if (providers.length === 0 && excludedProviders.length > 0) { + return { + provider: null, + model: modelId, + extendedContext, + errorType: "model_not_found", + errorMessage: `Model '${modelId}' is not available in the active live catalog for provider(s): ${excludedProviders.join(", ")}.`, + }; + } const nonOpenAIProviders = providers.filter((p) => p !== "openai"); // Bare model IDs from Codex CLI do not preserve OmniRoute's `cx/` prefix. @@ -686,6 +736,25 @@ async function resolveModelByProviderInference(modelId: string, extendedContext: activeCandidates = canonicalCandidates.filter((p) => activeProviders.has(p)); } + // An authoritative active live catalog excluded at least one static + // candidate, and none of the remaining static candidates has an active + // connection. Do not escape the live-catalog decision by selecting an + // unrelated inactive provider that happens to share the same static model id. + if ( + activeProviders && + activeProviders.size > 0 && + activeCandidates.length === 0 && + excludedProviders.length > 0 + ) { + return { + provider: null, + model: modelId, + extendedContext, + errorType: "model_not_found", + errorMessage: `Model '${modelId}' is not available in the active live catalog for provider(s): ${excludedProviders.join(", ")}.`, + }; + } + // Auto-pick: // 1. If active providers match, pick from active candidates (first active provider). // 2. If no active providers filter applied, but canonical candidates deduplicate to 1 provider, pick it. diff --git a/open-sse/services/newApiAggregatorQuotaFetcher.ts b/open-sse/services/newApiAggregatorQuotaFetcher.ts new file mode 100644 index 0000000000..cdcfca3274 --- /dev/null +++ b/open-sse/services/newApiAggregatorQuotaFetcher.ts @@ -0,0 +1,225 @@ +/** + * newApiAggregatorQuotaFetcher.ts — Generalized New-API / One-API / Sub2API + * Aggregator Balance Quota Fetcher + * + * Generalizes the AgentRouter (agentrouterQuotaFetcher.ts) balance detection + * so any OpenAI/Anthropic-compatible custom node pointing at a self-hosted + * New-API / One-API / Sub2API gateway can report its balance. + * + * New-API (QuantumNous/new-api, a fork of One API) exposes: + * + * GET {base}/api/user/self + * Authorization: Bearer {systemAccessToken} + * New-Api-User: {userId} + * -> { "data": { "quota": } } (raw New-API credit units) + * + * `quota_per_unit` (units per $1) defaults to 500000, overridable via + * `providerSpecificData.quotaPerUnit`. + * + * Credentials: the System Access Token + New-Api-User id are read from + * `connection.providerSpecificData.consoleApiKey` (reusing the existing generic + * field, same precedent as AgentRouter/Bailian) and + * `connection.providerSpecificData.newApiUserId` respectively. + * + * The `newApiAggregatorBalance` boolean flag in providerSpecificData must be + * `true` for the fetcher to activate — this is the opt-in toggle. + * + * Cache: in-memory TTL (60s), same pattern as sibling fetchers. + * + * Registration: this module exports fetchNewApiAggregatorQuota for dynamic + * dispatch; it does NOT self-register against a static provider key. + * Dynamic dispatch is handled by quotaPreflight.ts + quotaMonitor.ts. + */ + +import type { QuotaInfo } from "./quotaPreflight.ts"; +import { throttleQuotaFetch } from "./quotaFetchThrottle.ts"; +import { toNumber } from "@/shared/utils/numeric"; + +const SELF_PATH = "/api/user/self"; + +// New-API-wide default: units per $1. See #6850 — can be hardcoded rather +// than fetched from /api/status on every call. +const DEFAULT_QUOTA_PER_UNIT = 500_000; + +const CACHE_TTL_MS = 60_000; // 60 seconds + +export interface NewApiAggregatorQuota extends QuotaInfo { + rawQuota: number; + dollarBalance: number; + limitReached: boolean; +} + +interface CacheEntry { + quota: NewApiAggregatorQuota; + fetchedAt: number; +} + +const quotaCache = new Map(); + +const _cacheCleanup = setInterval(() => { + const now = Date.now(); + for (const [key, entry] of quotaCache) { + if (now - entry.fetchedAt > CACHE_TTL_MS * 5) { + quotaCache.delete(key); + } + } +}, 5 * 60_000); + +if (typeof _cacheCleanup === "object" && "unref" in _cacheCleanup) { + (_cacheCleanup as { unref?: () => void }).unref?.(); +} + +function toRecord(value: unknown): Record { + return value && typeof value === "object" && !Array.isArray(value) + ? (value as Record) + : {}; +} + +/** + * Strip trailing `/v1` (or `/v1/`) from a baseUrl so that node URLs like + * `https://host/v1` still hit `{host}/api/user/self` rather than + * `{host}/v1/api/user/self`. + */ +function stripV1Suffix(baseUrl: string): string { + return baseUrl.replace(/\/v1\/?$/, ""); +} + +function extractCredentials(connection?: Record): { + systemAccessToken: string | null; + userId: string | null; + baseUrl: string | null; + quotaPerUnit: number; + aggregatorFlag: boolean; +} { + const providerSpecificData = toRecord(connection?.providerSpecificData); + const systemAccessToken = + typeof providerSpecificData.consoleApiKey === "string" && + providerSpecificData.consoleApiKey.trim().length > 0 + ? providerSpecificData.consoleApiKey + : null; + const userId = + typeof providerSpecificData.newApiUserId === "string" && + providerSpecificData.newApiUserId.trim().length > 0 + ? providerSpecificData.newApiUserId + : null; + const rawBaseUrl = + typeof providerSpecificData.baseUrl === "string" && + providerSpecificData.baseUrl.trim().length > 0 + ? providerSpecificData.baseUrl.trim() + : null; + const baseUrl = rawBaseUrl ? stripV1Suffix(rawBaseUrl) : null; + + const rawQuotaPerUnit = toNumber(providerSpecificData.quotaPerUnit, 0); + const quotaPerUnit = rawQuotaPerUnit > 0 ? rawQuotaPerUnit : DEFAULT_QUOTA_PER_UNIT; + + const aggregatorFlag = providerSpecificData.newApiAggregatorBalance === true; + + return { systemAccessToken, userId, baseUrl, quotaPerUnit, aggregatorFlag }; +} + +function parseNewApiAggregatorQuotaResponse( + data: unknown, + quotaPerUnit: number +): NewApiAggregatorQuota | null { + const obj = toRecord(data); + const dataObj = toRecord(obj.data); + + const rawQuotaValue = "quota" in dataObj ? dataObj.quota : obj.quota; + if (rawQuotaValue === undefined) return null; + + const rawQuota = toNumber(rawQuotaValue, -1); + if (rawQuota < 0) return null; + + const dollarBalance = rawQuota / quotaPerUnit; + const limitReached = rawQuota <= 0; + // No known upstream "total" grant to compute a real percentage against — follow + // DeepSeek's boolean-availability precedent (0% used = has balance, 100% = exhausted). + const percentUsed = limitReached ? 1 : 0; + + return { + used: percentUsed * 100, + total: 100, + percentUsed, + resetAt: null, + rawQuota, + dollarBalance, + limitReached, + }; +} + +/** + * Fetch current quota for a New-API / One-API / Sub2API aggregator connection. + * + * @param connectionId - Connection ID from the DB (used to key the cache) + * @param connection - Optional connection object with providerSpecificData credentials + * @returns NewApiAggregatorQuota or null if fetch fails / no credentials / not opted in + */ +export async function fetchNewApiAggregatorQuota( + connectionId: string, + connection?: Record +): Promise { + const cached = quotaCache.get(connectionId); + if (cached && Date.now() - cached.fetchedAt < CACHE_TTL_MS) { + return cached.quota; + } + + const { systemAccessToken, userId, baseUrl, quotaPerUnit, aggregatorFlag } = + extractCredentials(connection); + + if (!aggregatorFlag) return null; + if (!systemAccessToken || !userId || !baseUrl) return null; + + const url = `${baseUrl}${SELF_PATH}`; + + try { + await throttleQuotaFetch(); + + const response = await fetch(url, { + method: "GET", + headers: { + Authorization: `Bearer ${systemAccessToken}`, + "New-Api-User": userId, + "Content-Type": "application/json", + Accept: "application/json", + }, + signal: AbortSignal.timeout(8_000), + }); + + if (response.status === 401 || response.status === 403) { + quotaCache.delete(connectionId); + return null; + } + + if (!response.ok) { + return null; + } + + const data = await response.json(); + const quota = parseNewApiAggregatorQuotaResponse(data, quotaPerUnit); + + if (!quota) return null; + + quotaCache.set(connectionId, { quota, fetchedAt: Date.now() }); + return quota; + } catch { + return null; + } +} + +/** + * Force-invalidate the cache for a connection. + */ +export function invalidateNewApiAggregatorQuotaCache(connectionId: string): void { + quotaCache.delete(connectionId); +} + +/** + * Check whether a connection has opted in to New-API aggregator balance + * detection. Used by the dynamic dispatch in quotaPreflight / quotaMonitor. + */ +export function isNewApiAggregatorBalanceConnection( + connection?: Record +): boolean { + const providerSpecificData = toRecord(connection?.providerSpecificData); + return providerSpecificData.newApiAggregatorBalance === true; +} diff --git a/open-sse/services/pipeline.ts b/open-sse/services/pipeline.ts index 03dec5dc94..a759ddfeec 100644 --- a/open-sse/services/pipeline.ts +++ b/open-sse/services/pipeline.ts @@ -40,14 +40,30 @@ * a bad-request or auth error wastes quota and will never succeed. */ import { errorResponse } from "../utils/error.ts"; -import type { ComboLogger, HandleSingleModel } from "./combo/types.ts"; +import type { ComboLogger, HandleSingleModel, ResolvedComboTarget } from "./combo/types.ts"; // extractPanelText is a generic assistant-text extractor (OpenAI chat / Claude / // Gemini / Responses) — reused here to read each step's output, not fusion-specific. import { extractPanelText } from "./fusion.ts"; type Body = Record; -export type PipelineStep = { model: string; prompt?: string | null }; +export type PipelineStep = + | { + target: ResolvedComboTarget; + prompt?: string | null; + } + | { + model: string; + prompt?: string | null; + }; + +function getStepModel(step: PipelineStep): string { + return "target" in step ? step.target.modelStr : step.model; +} + +function getStepTarget(step: PipelineStep): ResolvedComboTarget | undefined { + return "target" in step ? step.target : undefined; +} /** * Prepend a system instruction to the client's original conversation (format-aware), @@ -146,23 +162,32 @@ export async function handlePipelineChat({ maxRetries = 0, retryDelayMs = 1000, }: HandlePipelineChatOptions): Promise { - const chain = (Array.isArray(steps) ? steps : []).filter((s) => s && s.model); + const chain = (Array.isArray(steps) ? steps : []).filter((step): step is PipelineStep => + Boolean(step && getStepModel(step)) + ); if (chain.length === 0) { return errorResponse(400, "Pipeline combo has no models"); } log.info( "PIPELINE", - `Combo "${comboName ?? ""}" | steps=${chain.length} [${chain.map((s) => s.model).join(" -> ")}]` + `Combo "${comboName ?? ""}" | steps=${chain.length} [${chain.map(getStepModel).join(" -> ")}]` ); // Single-step pipeline: nothing to chain — run it directly (streams to client). if (chain.length === 1) { - return handleSingleModel(prependSystemInstruction(body, chain[0].prompt), chain[0].model); + const step = chain[0]; + return handleSingleModel( + prependSystemInstruction(body, step.prompt), + getStepModel(step), + getStepTarget(step) + ); } let prevOutput = ""; for (let i = 0; i < chain.length; i++) { const step = chain[i]; + const stepModel = getStepModel(step); + const stepTarget = getStepTarget(step); const isFinal = i === chain.length - 1; const isFirst = i === 0; @@ -174,46 +199,55 @@ export async function handlePipelineChat({ if (!isFinal) stepBody = stripStreaming(stepBody); const t0 = Date.now(); - let res = await handleSingleModel(stepBody, step.model); + let res = await handleSingleModel(stepBody, stepModel, stepTarget); if (isFinal) { - log.info("PIPELINE", `Final step ${step.model} responded (${Date.now() - t0}ms)`); + log.info("PIPELINE", `Final step ${stepModel} responded (${Date.now() - t0}ms)`); return res; } // Transient retry: if the intermediate step failed with a retryable status // (429/502/503/504), retry the same step up to maxRetries times before // giving up. Non-transient errors (400/401/403/404) fail immediately. - for (let attempt = 0; attempt < maxRetries && !res.ok && TRANSIENT_STATUS.has(res.status); attempt++) { + for ( + let attempt = 0; + attempt < maxRetries && !res.ok && TRANSIENT_STATUS.has(res.status); + attempt++ + ) { log.warn( "PIPELINE", - `Step ${i + 1} (${step.model}) transient ${res.status}, retrying ${attempt + 1}/${maxRetries} in ${retryDelayMs}ms` + `Step ${i + 1} (${stepModel}) transient ${res.status}, retrying ${attempt + 1}/${maxRetries} in ${retryDelayMs}ms` ); await sleep(retryDelayMs); - res = await handleSingleModel(stepBody, step.model); + res = await handleSingleModel(stepBody, stepModel, stepTarget); } // An intermediate step must succeed with usable text — otherwise fail the whole // pipeline (never silently swallow; the client gets a clear, sanitized error). if (!res.ok) { - log.warn("PIPELINE", `Step ${i + 1} (${step.model}) failed`, { status: res.status }); + log.warn("PIPELINE", `Step ${i + 1} (${stepModel}) failed`, { + status: res.status, + }); const status = res.status >= 400 && res.status <= 599 ? res.status : 502; - return errorResponse(status, `Pipeline step ${i + 1} (${step.model}) failed`); + return errorResponse(status, `Pipeline step ${i + 1} (${stepModel}) failed`); } try { const json = await res.clone().json(); prevOutput = extractPanelText(json); } catch { - log.warn("PIPELINE", `Step ${i + 1} (${step.model}) returned an unparseable body`); - return errorResponse(502, `Pipeline step ${i + 1} (${step.model}) returned an unparseable body`); + log.warn("PIPELINE", `Step ${i + 1} (${stepModel}) returned an unparseable body`); + return errorResponse( + 502, + `Pipeline step ${i + 1} (${stepModel}) returned an unparseable body` + ); } if (!prevOutput.trim()) { - log.warn("PIPELINE", `Step ${i + 1} (${step.model}) returned empty output`); - return errorResponse(502, `Pipeline step ${i + 1} (${step.model}) returned empty output`); + log.warn("PIPELINE", `Step ${i + 1} (${stepModel}) returned empty output`); + return errorResponse(502, `Pipeline step ${i + 1} (${stepModel}) returned empty output`); } log.info( "PIPELINE", - `Step ${i + 1} ${step.model} ok (${prevOutput.length} chars, ${Date.now() - t0}ms)` + `Step ${i + 1} ${stepModel} ok (${prevOutput.length} chars, ${Date.now() - t0}ms)` ); } diff --git a/open-sse/services/providerDefaultRateLimit.ts b/open-sse/services/providerDefaultRateLimit.ts index 5560c71e76..8df2ab9624 100644 --- a/open-sse/services/providerDefaultRateLimit.ts +++ b/open-sse/services/providerDefaultRateLimit.ts @@ -11,8 +11,10 @@ * API (#6846 Phase 1). Every other provider still gets zero behavior change; the * whole path is a no-op unless an entry (or a resolved override, see below) exists. * - * Wired as a pre-schedule gate in `withRateLimit` (rateLimitManager.ts). Bottleneck - * still applies on top — this only adds a floor for header-less providers. + * Composed into the rolling lease gate in `withRateLimit` (rateLimitManager.ts). + * The exported acquire helpers remain available for provider-specific callers + * and tests, while the main request path acquires global and provider scopes + * atomically. */ import { SlidingWindowLimiter, type RateLimitWindow } from "./slidingWindowLimiter.ts"; diff --git a/open-sse/services/quotaMonitor.ts b/open-sse/services/quotaMonitor.ts index da647c5f73..7fe91cd865 100644 --- a/open-sse/services/quotaMonitor.ts +++ b/open-sse/services/quotaMonitor.ts @@ -8,7 +8,11 @@ * Alertas deduplicados por sessão (janela de 5min). */ -import { registerQuotaFetcher, type QuotaFetcher } from "./quotaPreflight.ts"; +import { + registerQuotaFetcher, + resolveDynamicQuotaFetcher, + type QuotaFetcher, +} from "./quotaPreflight.ts"; import { getSessionInfo } from "./sessionManager.ts"; export { registerQuotaFetcher }; @@ -199,7 +203,12 @@ function scheduleNextPoll(sessionId: string, intervalMs: number): void { } try { - const fetcher = quotaFetcherRegistry.get(provider); + let fetcher = quotaFetcherRegistry.get(provider); + // Dynamic fallback: for compatible-provider connections with the + // aggregator flag + feature flag, use the generalized New-API fetcher. + if (!fetcher && current.connectionSnapshot) { + fetcher = resolveDynamicQuotaFetcher(provider, current.connectionSnapshot); + } if (!fetcher) { current.status = current.lastQuotaPercent === null ? "idle" : current.status; scheduleNextPoll(sessionId, NORMAL_INTERVAL_MS); diff --git a/open-sse/services/quotaPreflight.ts b/open-sse/services/quotaPreflight.ts index 9b0d7b8233..a7db736c29 100644 --- a/open-sse/services/quotaPreflight.ts +++ b/open-sse/services/quotaPreflight.ts @@ -18,6 +18,10 @@ * it — once you invoke preflight, it runs the fetcher and evaluates. */ +import { isCompatibleProviderConnectionId } from "@/shared/utils/compatibleProviderId"; +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; +import { fetchNewApiAggregatorQuota } from "./newApiAggregatorQuotaFetcher.ts"; + export interface PreflightQuotaResult { proceed: boolean; reason?: string; @@ -231,6 +235,29 @@ export function evaluateQuotaCutoff( return quotaPercentCutoffResult(quota, thresholds); } +/** + * Resolve a dynamic quota fetcher for compatible-provider connections that + * opt in to New-API / One-API / Sub2API aggregator balance detection. + * Returns the fetcher when both the feature flag and the connection's + * aggregator flag are true; otherwise returns undefined. + */ +export function resolveDynamicQuotaFetcher( + provider: string, + connection: Record +): QuotaFetcher | undefined { + // Dynamic dispatch only for compatible-provider connection IDs + if (!isCompatibleProviderConnectionId(provider)) return undefined; + + // Connection must opt in via providerSpecificData.newApiAggregatorBalance + const psd = connection?.providerSpecificData as Record | undefined; + if (!psd || psd.newApiAggregatorBalance !== true) return undefined; + + // Feature flag must be enabled + if (!isFeatureFlagEnabled("NEWAPI_AGGREGATOR_BALANCE")) return undefined; + + return fetchNewApiAggregatorQuota; +} + export async function preflightQuota( provider: string, connectionId: string, @@ -239,9 +266,14 @@ export async function preflightQuota( ): Promise { // No legacy enable-flag gate here — the caller decides when to invoke us // (see file-level docstring). When there's no fetcher we proceed silently. - const fetcher = getQuotaFetcher(provider); + let fetcher = getQuotaFetcher(provider); if (!fetcher) { - return { proceed: true }; + // Dynamic fallback: for compatible-provider connections with the + // aggregator flag + feature flag, use the generalized New-API fetcher. + fetcher = resolveDynamicQuotaFetcher(provider, connection); + if (!fetcher) { + return { proceed: true }; + } } let quota: QuotaInfo | null = null; diff --git a/open-sse/services/rateLimitManager.ts b/open-sse/services/rateLimitManager.ts index 87f48a46fa..cb4350b2f8 100644 --- a/open-sse/services/rateLimitManager.ts +++ b/open-sse/services/rateLimitManager.ts @@ -13,7 +13,12 @@ import { parseRetryAfterFromBody } from "./accountFallback.ts"; import { getAntigravityQuotaFamily } from "./antigravityQuotaFamily.ts"; import { getProviderCategory } from "../config/providerRegistry.ts"; import { getCodexRateLimitKey } from "../executors/codex.ts"; -import { awaitProviderDefaultSlot, setProviderQuotaOverrides } from "./providerDefaultRateLimit.ts"; +import { + getProviderDefaultRateLimit, + setProviderQuotaOverrides, +} from "./providerDefaultRateLimit.ts"; +import { keyContainsConnection, RollingRpmGate } from "./rollingRpmGate.ts"; +import { toNumber } from "@/shared/utils/numeric"; import { DEFAULT_RESILIENCE_SETTINGS, resolveResilienceSettings, @@ -39,25 +44,36 @@ interface LearnedLimitEntry { interface LimiterUpdateSettings { maxConcurrent?: number | null; minTime: number; - reservoir?: number | null; - reservoirRefreshAmount?: number | null; - reservoirRefreshInterval?: number | null; } type JsonRecord = Record; +type QueueTimeoutReason = "local-queue" | "upstream-cooldown"; function toRecord(value: unknown): JsonRecord { return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {}; } -function toNumber(value: unknown, fallback = 0): number { - const parsed = - typeof value === "number" - ? value - : typeof value === "string" && value.trim().length > 0 - ? Number(value) - : Number.NaN; - return Number.isFinite(parsed) ? parsed : fallback; +function createQueueTimeoutError( + provider: string, + model: string | null, + maxWaitMs: number, + reason: QueueTimeoutReason = "local-queue", + cause?: unknown +) { + const target = model ? `${provider}/${model}` : provider; + const message = + reason === "upstream-cooldown" + ? `Request dropped after waiting ${maxWaitMs}ms for an upstream rate-limit cooldown for ${target}. ` + + `The provider cooldown outlasted OmniRoute's local wait budget; this is not local queue saturation.` + : `Request dropped after exceeding the local rate-limit queue budget maxWaitMs (${maxWaitMs}ms) for ` + + `${target} — this is OmniRoute's request queue ` + + `(resilienceSettings.requestQueue.maxWaitMs), not an upstream timeout. Raise it in ` + + `Settings → Resilience if this is queue saturation rather than a slow provider.`; + const queueErr = new Error(message, cause === undefined ? undefined : { cause }) as Error & { + code?: string; + }; + queueErr.code = "RATE_LIMIT_QUEUE_TIMEOUT"; + return queueErr; } function isNodeTestRunnerChild(): boolean { @@ -101,16 +117,15 @@ let initialized = false; let currentRequestQueueSettings: RequestQueueSettings = DEFAULT_RESILIENCE_SETTINGS.requestQueue; // Watchdog: detect Bottleneck limiters that are wedged (queue has work, but no -// jobs are dispatched). When the reservoir/refresh state desyncs from reality, -// this catches it and force-resets so traffic isn't stuck forever. +// jobs are dispatched). RPM admission happens before Bottleneck, so a queued +// Bottleneck job with no active work is a concurrency scheduler failure. const lastDispatchAt = new Map(); +let nextJobTraceId = 1; let watchdogInterval: ReturnType | null = null; const WATCHDOG_INTERVAL_MS = 30_000; -// Threshold has to exceed any *legitimate* gap between dispatches: -// - default reservoirRefreshInterval is 60s -// - adaptive minTime can climb to ~60s for 1-RPM providers (see updateFromHeaders) -// 120s gives a 2× margin against both, while still catching the actual wedge -// case we observed (queue stalled for 3+ minutes with no progress). +// Threshold has to exceed any legitimate gap caused by adaptive minTime while +// still catching the actual wedge case we observed (queue stalled for 3+ +// minutes with no progress). const WEDGE_THRESHOLD_MS = 120_000; /** @@ -128,19 +143,10 @@ function isAutoEnableActive(settings: RequestQueueSettings): boolean { return settings.autoEnableApiKeyProviders; } -// Sentinels for "no rate limit" / effectively infinite capacity. The reservoir -// value uses Number.MAX_SAFE_INTEGER so the bucket can never realistically be -// exhausted; maxConcurrent uses a smaller-but-still-vast ceiling since -// Bottleneck tracks concurrent jobs in memory and an unbounded number would -// risk internal counter overflow under sustained pressure. -const EFFECTIVELY_INFINITE = Number.MAX_SAFE_INTEGER; +// Bottleneck handles concurrency and pacing. RPM is enforced by the rolling +// lease limiter above rather than by a fixed-window reservoir. const EFFECTIVELY_INFINITE_CONCURRENCY = 1000; -// Resolve an RPM override. 0 or missing means "infinite" (no rate cap). -function resolveRpm(override: number | undefined | null): number { - return typeof override === "number" && override > 0 ? override : EFFECTIVELY_INFINITE; -} - // Resolve a minTime override. 0 or missing means "no minimum gap". function resolveMinTime(override: number | undefined | null): number { return typeof override === "number" && override > 0 ? override : 0; @@ -152,15 +158,9 @@ function resolveMaxConcurrent(override: number | undefined | null): number { } function buildLimiterDefaults() { - // 0 or missing values mean "infinite" / no rate limit applies. This treats - // the global request-queue settings the same way per-connection overrides - // are interpreted (see resolveRpm / resolveMinTime / resolveMaxConcurrent). return { maxConcurrent: resolveMaxConcurrent(currentRequestQueueSettings.concurrentRequests), minTime: resolveMinTime(currentRequestQueueSettings.minTimeBetweenRequestsMs), - reservoir: resolveRpm(currentRequestQueueSettings.requestsPerMinute), - reservoirRefreshAmount: resolveRpm(currentRequestQueueSettings.requestsPerMinute), - reservoirRefreshInterval: 60 * 1000, }; } @@ -271,12 +271,18 @@ function reconcileEnabledConnections( function watchdogTick() { const now = Date.now(); + rpmGate.cleanupExpired(now); // Clean up idle limiters that haven't been used recently for (const [key, limiter] of Array.from(limiters)) { const lastUsed = limiterLastUsed.get(key) ?? 0; if (now - lastUsed > INACTIVE_LIMITER_MS) { const counts = limiter.counts(); - if (counts.QUEUED === 0 && counts.RUNNING === 0 && counts.EXECUTING === 0) { + if ( + counts.RECEIVED === 0 && + counts.QUEUED === 0 && + counts.RUNNING === 0 && + counts.EXECUTING === 0 + ) { limiters.delete(key); lastDispatchAt.delete(key); limiterLastUsed.delete(key); @@ -289,7 +295,10 @@ function watchdogTick() { } for (const [key, limiter] of Array.from(limiters)) { const counts = limiter.counts(); - if (counts.QUEUED === 0) continue; + // RECEIVED-only work is still active and must not be evicted. Once a job + // is stably queued, Bottleneck reports it in QUEUED with RECEIVED=0; that + // is the state the wedge detector is designed to recover. + if (counts.RECEIVED > 0 || counts.QUEUED === 0) continue; if (counts.RUNNING > 0 || counts.EXECUTING > 0) continue; const lastDispatch = lastDispatchAt.get(key); // No heartbeat yet → seed it and skip this tick. Prevents false wedge @@ -302,7 +311,7 @@ function watchdogTick() { if (stalledMs < WEDGE_THRESHOLD_MS) continue; warnRateLimit( - `🚨 [RATE-LIMIT] WEDGED: ${key} queued=${counts.QUEUED} running=0 executing=0 stalled=${stalledMs}ms — force-resetting` + `🚨 [RATE-LIMIT] WEDGED: ${key} received=${counts.RECEIVED} queued=${counts.QUEUED} running=0 executing=0 stalled=${stalledMs}ms — force-resetting` ); // Live incident (log id 1784465227489-a2cbc0): disconnect() releases the // heartbeat timer but does NOT reject the QUEUED jobs already sitting on @@ -353,15 +362,38 @@ export function stopRateLimitWatchdog(): void { watchdogInterval = null; } +export function __installLimiterForTests( + provider: string, + connectionId: string, + limiter: Bottleneck, + model = null +): void { + const key = getLimiterKey(provider, connectionId, model); + limiters.set(key, limiter); + lastDispatchAt.set(key, Date.now()); + limiterLastUsed.set(key, Date.now()); +} + +export function __runRateLimitWatchdogForTests(): void { + watchdogTick(); +} + +export function __getLimiterForTests(provider: string, connectionId: string, model = null) { + return getLimiter(provider, connectionId, model); +} + +export function __setLastDispatchAtForTests( + provider: string, + connectionId: string, + model: string | null, + timestamp: number +): void { + lastDispatchAt.set(getLimiterKey(provider, connectionId, model), timestamp); +} + function evictWedgeLimiter(key: string, limiter: Bottleneck): void { if (limiters.get(key) !== limiter) return; - limiters.delete(key); - lastDispatchAt.delete(key); - limiterLastUsed.delete(key); - trackAsyncOperation(limiter.disconnect()); - trackAsyncOperation( - limiter.stop({ dropWaitingJobs: true, dropErrorMessage: "rate-limit-watchdog-wedge-reset" }) - ); + evictLimiterAndDropQueued(key, limiter, "rate-limit-watchdog-wedge-reset"); } /** @@ -422,13 +454,10 @@ export async function initializeRateLimits() { // budget + concurrency cap (nvidia today). No-op for every provider without // an entry in either providerQuotaOverrides or PROVIDER_DEFAULT_RATE_LIMITS. setProviderQuotaOverrides(resilience.providerQuotaOverrides); - const { explicitCount, autoCount } = reconcileEnabledConnections( - connections as unknown[], - currentRequestQueueSettings - ); - await updateAllLimiterSettings(); - // Load per-connection rate limit overrides + // Load per-connection rate limit overrides before reconciliation can create + // any limiter. The RPM gate reads these overrides at admission time, and + // Bottleneck still needs the non-RPM connection settings immediately. connectionRateLimitOverrides.clear(); for (const conn of connections as Array>) { const overrides = conn.rateLimitOverrides; @@ -437,6 +466,12 @@ export async function initializeRateLimits() { } } + const { explicitCount, autoCount } = reconcileEnabledConnections( + connections as unknown[], + currentRequestQueueSettings + ); + updateAllLimiterSettings(); + if (explicitCount > 0 || autoCount > 0) { logRateLimit( `🛡️ [RATE-LIMIT] Loaded ${explicitCount} explicit + ${autoCount} auto-enabled protection(s)` @@ -474,22 +509,14 @@ export function enableRateLimitProtection(connectionId) { */ export function disableRateLimitProtection(connectionId) { enabledConnections.delete(connectionId); - // Evict limiters for this connection from the cache. Do NOT call limiter.stop() — - // it permanently rejects future .schedule() calls with "This limiter has been stopped", - // and in-flight requests holding a reference to the old instance would fail with 502. - // Call disconnect() (not stop()) to release Bottleneck's internal heartbeat timer - // without permanently poisoning the instance for any remaining in-flight jobs. - // Eviction-only would leak the heartbeat timer until GC; disconnect() releases it - // synchronously so the runtime memory footprint stays flat under heavy connection churn. - // .stop() is reserved exclusively for SIGTERM/SIGINT shutdown (see shutdownLimiters). + // Drop queued jobs before evicting the limiter. Otherwise disconnect() leaves + // callers waiting on an instance that is no longer reachable from the cache. for (const [key, limiter] of Array.from(limiters)) { - if (key.includes(connectionId)) { - limiters.delete(key); - lastDispatchAt.delete(key); - limiterLastUsed.delete(key); - trackAsyncOperation(limiter.disconnect()); + if (keyContainsConnection(key, connectionId)) { + evictLimiterAndDropQueued(key, limiter, "rate-limit-connection-disabled"); } } + rpmGate.clearConnection(connectionId); } /** @@ -517,13 +544,11 @@ export function refreshConnectionRateLimits(connectionId, overrides) { } // Evict limiters referencing this connection so they get recreated on next use for (const [key, limiter] of Array.from(limiters)) { - if (key.includes(connectionId)) { - limiters.delete(key); - lastDispatchAt.delete(key); - limiterLastUsed.delete(key); - trackAsyncOperation(limiter.disconnect()); + if (keyContainsConnection(key, connectionId)) { + evictLimiterAndDropQueued(key, limiter, "rate-limit-settings-refresh"); } } + rpmGate.clearConnection(connectionId); } /** @@ -546,6 +571,15 @@ function getLimiterKey(provider, connectionId, model = null) { return `${provider}:${connectionId}`; } +const rpmGate = new RollingRpmGate({ + getGlobalRpm: () => currentRequestQueueSettings.requestsPerMinute, + getProviderWindow: getProviderDefaultRateLimit, + getConnectionRpm: (connectionId) => connectionRateLimitOverrides.get(connectionId)?.rpm, + getLimiterKey, + createQueueTimeoutError: (provider, model, maxWaitMs, reason) => + createQueueTimeoutError(provider, model, maxWaitMs, reason), +}); + function getLimiter(provider, connectionId, model = null) { const key = getLimiterKey(provider, connectionId, model); @@ -554,23 +588,14 @@ function getLimiter(provider, connectionId, model = null) { const overrides = connectionRateLimitOverrides.get(connectionId); if (overrides) { // 0 (or missing) means "no override — fall through to buildLimiterDefaults()". - // Without this guard, an rpm of 0 sets reservoir=0, which Bottleneck treats - // as "depleted" and blocks ALL requests indefinitely. Treating 0 as "use - // default" lets users effectively disable per-connection limits without - // globally raising the system default. if (typeof overrides.maxConcurrent === "number" && overrides.maxConcurrent > 0) { defaults.maxConcurrent = overrides.maxConcurrent; } if (typeof overrides.minTime === "number" && overrides.minTime > 0) { defaults.minTime = overrides.minTime; } - if (typeof overrides.rpm === "number" && overrides.rpm > 0) { - defaults.reservoir = overrides.rpm; - defaults.reservoirRefreshAmount = overrides.rpm; - defaults.reservoirRefreshInterval = 60 * 1000; - } // TODO: TPM/TPD integration — requires a token-bucket vs request-bucket - // separation (Bottleneck's reservoir is request-count, not token-count). + // separation. RPM is handled by the rolling lease gate below. // When added, treat 0/missing the same way: fall through to system default. } const limiter = new Bottleneck({ @@ -593,6 +618,15 @@ function getLimiter(provider, connectionId, model = null) { return limiters.get(key); } +function evictLimiterAndDropQueued(key: string, limiter: Bottleneck, reason: string): void { + if (limiters.get(key) === limiter) { + limiters.delete(key); + lastDispatchAt.delete(key); + limiterLastUsed.delete(key); + } + trackAsyncOperation(limiter.stop({ dropWaitingJobs: true, dropErrorMessage: reason })); +} + /** * Acquire a rate limit slot before making a request. * If rate limiting is disabled for this connection, returns immediately. @@ -604,32 +638,7 @@ function getLimiter(provider, connectionId, model = null) { * @param {AbortSignal} signal - Optional abort signal to cancel waiting * @returns {Promise} Result of fn() */ -async function getQueueHealthSnapshot(key: string, limiter: Bottleneck) { - const counts = limiter.counts(); - let reservoirRemaining: number | null = null; - try { - reservoirRemaining = await limiter.currentReservoir(); - } catch { - // Snapshot logging must never affect request handling. - } - const lastDispatch = lastDispatchAt.get(key); - return { - queued: counts.QUEUED, - running: counts.RUNNING, - executing: counts.EXECUTING, - reservoirRemaining, - lastDispatchAgeMs: lastDispatch ? Date.now() - lastDispatch : null, - }; -} - -export async function withRateLimit( - provider, - connectionId, - model, - fn, - signal = null, - retryAfterWedge = true -) { +export async function withRateLimit(provider, connectionId, model, fn, signal = null) { if (!enabledConnections.has(connectionId)) { return fn(); } @@ -642,18 +651,20 @@ export async function withRateLimit( throw err; } - // Proactive sliding-window fallback for header-less providers with a declared cap - // (Fase 8.2). No-op unless PROVIDER_DEFAULT_RATE_LIMITS has an entry for `provider`. - await awaitProviderDefaultSlot( + const maxWaitMs = currentRequestQueueSettings.maxWaitMs; + const queueStartedAt = Date.now(); + const rpmLease = await rpmGate.acquire( provider, connectionId, + model, signal, - currentRequestQueueSettings.maxWaitMs + maxWaitMs, + queueStartedAt ); - const limiter = getLimiter(provider, connectionId, model); - const maxWaitMs = currentRequestQueueSettings.maxWaitMs; - const scheduleOpts = maxWaitMs && maxWaitMs > 0 ? { expiration: maxWaitMs } : {}; + const key = getLimiterKey(provider, connectionId, model); + const jobId = `${key}:job-${nextJobTraceId++}`; + const scheduleOpts = { id: jobId }; // Issue #6593: opt-in admission cap — fast-reject before Bottleneck's // schedule() (and before any downstream compression/prompt work runs) when @@ -664,30 +675,77 @@ export async function withRateLimit( model ? `${provider}/${model}` : provider ); if (admissionErr) { + rpmLease?.release(); logRateLimit( `🚧 [RATE-LIMIT] ${getLimiterKey(provider, connectionId, model)} — queue full, rejecting fast (maxQueueDepth=${currentRequestQueueSettings.maxQueueDepth})` ); throw admissionErr; } + let dispatched = false; + let queueExpired = false; + let dispatchCancelled = false; + let queueTimer: ReturnType | undefined; + const remainingWaitMs = + maxWaitMs > 0 ? Math.max(1, maxWaitMs - (Date.now() - queueStartedAt)) : 0; + const queueTimeoutPromise = + remainingWaitMs > 0 + ? new Promise((_, reject) => { + queueTimer = setTimeout(() => { + if (dispatched) return; + queueExpired = true; + logRateLimit( + `⏰ [RATE-LIMIT] ${key} — job exceeded ${Math.ceil(maxWaitMs / 1000)}s queue wait budget, dropping` + ); + reject(new Error("rate-limit-queue-timeout")); + }, remainingWaitMs); + }) + : null; + const scheduled = limiter.schedule(scheduleOpts, async () => { + if (queueExpired) { + throw createQueueTimeoutError(provider, model, maxWaitMs); + } + if (dispatchCancelled) { + const error = new Error("The operation was aborted before limiter dispatch"); + error.name = "AbortError"; + throw error; + } + if (signal?.aborted) { + const error = new Error("The operation was aborted before limiter dispatch"); + error.name = "AbortError"; + throw error; + } + dispatched = true; + if (queueTimer) clearTimeout(queueTimer); + return fn(); + }); + try { if (signal) { let abortListener: (() => void) | undefined; const abortPromise = new Promise((_, reject) => { const onAbort = () => { const reason = signal.reason; - // Preserve native Error reasons (including AbortController's - // read-only DOMException) instead of mutating or wrapping them. + // Reject before evicting the queued job so the caller observes its + // abort reason instead of Bottleneck's internal drop error. if (reason instanceof Error) { reject(reason); - return; + } else { + const err = new Error( + typeof reason === "string" ? reason : "The operation was aborted" + ); + err.name = "AbortError"; + if (reason !== undefined) { + (err as Error & { cause?: unknown }).cause = reason; + } + reject(err); } - const err = new Error(typeof reason === "string" ? reason : "The operation was aborted"); - err.name = "AbortError"; - if (reason !== undefined) { - (err as Error & { cause?: unknown }).cause = reason; + if (!dispatched) { + dispatchCancelled = true; + if (queueTimer) clearTimeout(queueTimer); + // Leave the cancelled job in Bottleneck so queued peers are not dropped. + // Its scheduled callback will consume one queue turn and exit before fn(). } - reject(err); }; if (signal.aborted) { onAbort(); @@ -698,51 +756,30 @@ export async function withRateLimit( }); try { - return await Promise.race([limiter.schedule(scheduleOpts, fn), abortPromise]); + const races: Promise[] = [scheduled, abortPromise]; + if (queueTimeoutPromise) races.push(queueTimeoutPromise); + return await Promise.race(races); } finally { if (abortListener) { signal.removeEventListener("abort", abortListener); } } } else { - return await limiter.schedule(scheduleOpts, fn); + return await (queueTimeoutPromise + ? Promise.race([scheduled, queueTimeoutPromise]) + : scheduled); } } catch (err) { - // Bottleneck's raw `This job timed out after ms.` is - // indistinguishable from an upstream gateway timeout, so it leaks into 502 - // bodies / call-log `last_error` and gets misdiagnosed as a provider outage - // (#4165). Rewrite it into a clear, OmniRoute-owned error (knob named, - // upstream disclaimed, original kept as `cause`, `code` for classification). - // If the limiter is idle with capacity after the expiry, the scheduler is wedged. - // Reset it and retry this never-dispatched function once on a fresh limiter. - if (err?.message?.includes("This job timed out")) { - const key = getLimiterKey(provider, connectionId, model); - const queueState = await getQueueHealthSnapshot(key, limiter); - logRateLimit( - `⏰ [RATE-LIMIT] ${key} — job expired after ${Math.ceil((maxWaitMs || 0) / 1000)}s in queue, dropping` - ); - const limiterIsWedged = - retryAfterWedge && - queueState.running === 0 && - queueState.executing === 0 && - typeof queueState.reservoirRemaining === "number" && - queueState.reservoirRemaining > 0 && - typeof queueState.lastDispatchAgeMs === "number" && - queueState.lastDispatchAgeMs >= Math.max(1, maxWaitMs || 0); - if (limiterIsWedged) { - logRateLimit(`🔄 [RATE-LIMIT] ${key} — recovering idle limiter after queue expiry`); - evictWedgeLimiter(key, limiter); - return withRateLimit(provider, connectionId, model, fn, signal, false); - } - const queueErr = new Error( - `Request dropped after exceeding the local rate-limit queue budget maxWaitMs (${maxWaitMs}ms) for ` + - `${model ? `${provider}/${model}` : provider} — this is OmniRoute's request queue ` + - `(resilienceSettings.requestQueue.maxWaitMs), not an upstream timeout. Raise it in ` + - `Settings → Resilience if this is queue saturation rather than a slow provider.`, + if (queueTimer) clearTimeout(queueTimer); + if (!dispatched) rpmLease?.release(); + if (err?.message === "rate-limit-upstream-429") { + const rateLimitErr = new Error( + `Request dropped while the ${provider} connection was under an upstream rate-limit cooldown`, { cause: err } - ) as Error & { code?: string }; - queueErr.code = "RATE_LIMIT_QUEUE_TIMEOUT"; - throw queueErr; + ) as Error & { code?: string; status?: number }; + rateLimitErr.code = "RATE_LIMIT_UPSTREAM_429"; + rateLimitErr.status = 429; + throw rateLimitErr; } // The watchdog's stop({ dropWaitingJobs: true }) wedge-recovery (above) rejects // queued jobs with this exact message. Rewrite it the same way as the timeout @@ -759,6 +796,9 @@ export async function withRateLimit( wedgeErr.code = "RATE_LIMIT_QUEUE_WEDGED"; throw wedgeErr; } + if (err?.message === "rate-limit-queue-timeout") { + throw createQueueTimeoutError(provider, model, maxWaitMs); + } throw err; } } @@ -802,20 +842,12 @@ export function updateFromHeaders(provider, connectionId, headers, status, model `🚫 [RATE-LIMIT] ${provider}:${connectionId.slice(0, 8)} — 429 received, pausing for ${Math.ceil(retryAfterMs / 1000)}s, dropping ${counts.QUEUED} queued request(s)` ); - // Evict from the cache so follow-up learning from the same error body - // can materialize a fresh limiter immediately. Do NOT call limiter.stop() — - // it permanently rejects future .schedule() calls with "This limiter has been stopped". - // In-flight requests holding a reference to the evicted instance will fail (they - // were already going to fail — the 429 means the API rejected them), but future - // requests will get a fresh Bottleneck instance via getLimiter(). - // Call disconnect() (not stop()) to release Bottleneck's internal heartbeat timer - // without permanently poisoning the instance for any remaining in-flight jobs. - // Without disconnect() here, every 429 leaks a heartbeat timer until GC reclaims - // the abandoned Bottleneck; under sustained quota pressure that is a real leak. - limiters.delete(limiterKey); - lastDispatchAt.delete(limiterKey); - limiterLastUsed.delete(limiterKey); - trackAsyncOperation(limiter.disconnect()); + rpmGate.block(provider, connectionId, model, retryAfterMs); + + // Evict from the cache before stopping so follow-up requests get a fresh + // instance. Stopping the unreachable instance rejects its queued jobs and + // releases its heartbeat without poisoning the replacement limiter. + evictLimiterAndDropQueued(limiterKey, limiter, "rate-limit-upstream-429"); return; } @@ -830,28 +862,31 @@ export function updateFromHeaders(provider, connectionId, headers, status, model // Normal response — update limiter from headers if (!isNaN(limit) && limit > 0) { - const resetMs = parseResetTime(resetStr) || 60000; - // Calculate optimal minTime from RPM limit const minTime = Math.max(0, Math.floor(60000 / limit) - 10); // Small buffer const updates: LimiterUpdateSettings = { minTime }; + const resetMs = parseResetTime(resetStr) || 60000; - // If remaining is low (< 10% of limit), set reservoir to throttle immediately + // Keep adaptive pacing from response headers, but do not mutate an RPM + // reservoir. RPM admission is enforced by the rolling lease gate. if (!isNaN(remaining)) { if (remaining < limit * 0.1) { - updates.reservoir = remaining; - updates.reservoirRefreshAmount = limit; - updates.reservoirRefreshInterval = resetMs; + rpmGate.learnHeaderWindow( + provider, + connectionId, + model, + remaining, + resetMs, + Date.now() + resetMs + ); logRateLimit( `⚠️ [RATE-LIMIT] ${provider}:${connectionId.slice(0, 8)} — ${remaining}/${limit} remaining, throttling` ); } else if (remaining > limit * 0.5) { // Plenty of headroom — relax the limiter updates.minTime = 0; - updates.reservoir = null; - updates.reservoirRefreshAmount = null; - updates.reservoirRefreshInterval = null; + rpmGate.clearLearnedHeaderWindow(provider, connectionId, model); } } @@ -984,6 +1019,8 @@ export async function __resetRateLimitManagerForTests() { } limiters.clear(); enabledConnections.clear(); + connectionRateLimitOverrides.clear(); + rpmGate.reset(); initialized = false; lastDispatchAt.clear(); limiterLastUsed.clear(); @@ -1088,17 +1125,10 @@ export function updateFromResponseBody(provider, connectionId, responseBody, sta const { retryAfterMs, reason } = parseRetryAfterFromBody(responseBody); if (retryAfterMs && retryAfterMs > 0) { - const limiter = getLimiter(provider, connectionId, model); + getLimiter(provider, connectionId, model); logRateLimit( `🚫 [RATE-LIMIT] ${provider}:${connectionId.slice(0, 8)} — body-parsed retry: ${Math.ceil(retryAfterMs / 1000)}s (${reason})` ); - - trackAsyncOperation( - applyLimiterSettings(limiter, { - reservoir: 0, - reservoirRefreshAmount: 60, - reservoirRefreshInterval: retryAfterMs, - }) - ); + rpmGate.block(provider, connectionId, model, retryAfterMs); } } diff --git a/open-sse/services/raycast.ts b/open-sse/services/raycast.ts new file mode 100644 index 0000000000..801f2bf77a --- /dev/null +++ b/open-sse/services/raycast.ts @@ -0,0 +1,280 @@ +/** + * @file raycast.ts + * @description Raycast Pro AI reverse-engineered protocol (backend.raycast.com). + * Ported from szcharlesji/raycast-relay (Node, 2026-06) — V2 HMAC + V1 JWT signatures. + * + * @changes + * - [2026-07-27] [Composer] - Initial Raycast Pro local-dev provider protocol + */ + +import { createHmac, createHash, randomUUID } from "node:crypto"; + +import { resolvePublicCred } from "../utils/publicCreds.ts"; + +export const RAYCAST_CHAT_URL = "https://backend.raycast.com/api/v1/ai/chat_completions"; +export const RAYCAST_MODELS_URL = "https://backend.raycast.com/api/v1/ai/models"; +export const RAYCAST_DEFAULT_USER_AGENT = "Raycast/1.104.20 (macOS Version 26.5.1 (Build 25F80))"; +export const RAYCAST_DEFAULT_EXPERIMENTAL = "chatBranching, mcpHTTPServer"; + +/** + * Community-extracted default; override via providerSpecificData.sigSecret or + * RAYCAST_SIG_SECRET. Embedded through resolvePublicCred() per Hard Rule #11 — + * a public upstream credential must never be a string literal in the source + * (see docs/security/PUBLIC_CREDS.md). + */ +export const RAYCAST_DEFAULT_SIG_SECRET = resolvePublicCred( + "raycast_sig_secret", + "RAYCAST_SIG_SECRET" +); + +export type RaycastCredentials = { + accessToken?: string; + providerSpecificData?: { + deviceId?: string; + aid?: string; + sigSecret?: string; + userAgent?: string; + experimental?: string; + }; +}; + +export type RaycastModelEntry = { + id: string; + model: string; + name: string; + provider: string; + requires_better_ai?: boolean; + availability?: string; +}; + +type ChatMessage = { role?: string; content?: unknown }; + +export function rot13rot5(input: string): string { + return input.replace(/[A-Za-z0-9]/g, (char) => { + const code = char.charCodeAt(0); + if (code >= 65 && code <= 90) return String.fromCharCode(((code - 65 + 13) % 26) + 65); + if (code >= 97 && code <= 122) return String.fromCharCode(((code - 97 + 13) % 26) + 97); + return String.fromCharCode(((code - 48 + 5) % 10) + 48); + }); +} + +export function signatureV2( + timestamp: string, + deviceId: string, + payload: string, + secret: string +): string { + const bodyHash = createHash("sha256").update(payload).digest("hex"); + const message = [timestamp, deviceId, bodyHash].map(rot13rot5).join("."); + return createHmac("sha256", secret).update(message).digest("hex"); +} + +function base64UrlJson(value: Record): string { + return Buffer.from(JSON.stringify(value)).toString("base64url"); +} + +export function raycastJwt(aid: string, secret: string): string { + const iat = Date.now() / 1000; + const header = base64UrlJson({ typ: "JWT", alg: "HS256" }); + const payload = base64UrlJson({ aid, exp: iat + 60, iat }); + const signature = createHmac("sha256", secret).update(`${header}.${payload}`).digest("base64url"); + return `${header}.${payload}.${signature}`; +} + +export function decodeAidFromRaycastJwt(jwt: string): string | null { + const parts = jwt.trim().split("."); + if (parts.length < 2) return null; + try { + const payload = JSON.parse(Buffer.from(parts[1], "base64url").toString("utf8")) as { + aid?: string; + }; + return payload.aid || null; + } catch { + return null; + } +} + +export function resolveRaycastSecrets(credentials: RaycastCredentials): { + bearerToken: string; + deviceId: string; + aid: string; + sigSecret: string; +} { + const psd = credentials.providerSpecificData || {}; + const bearerToken = (credentials.accessToken || "").trim(); + const deviceId = (psd.deviceId || "").trim(); + const aid = (psd.aid || deviceId || "").trim(); + const sigSecret = ( + psd.sigSecret || + process.env.RAYCAST_SIG_SECRET || + RAYCAST_DEFAULT_SIG_SECRET + ).trim(); + + if (!bearerToken) throw new Error("Raycast bearer token is required"); + if (!deviceId) throw new Error("Raycast device ID is required"); + if (!sigSecret) throw new Error("Raycast signature secret is required"); + + return { bearerToken, deviceId, aid, sigSecret }; +} + +export function buildRaycastHeaders( + payload: string, + credentials: RaycastCredentials +): Record { + const { bearerToken, deviceId, aid, sigSecret } = resolveRaycastSecrets(credentials); + const psd = credentials.providerSpecificData || {}; + const timestamp = Math.floor(Date.now() / 1000).toString(); + + return { + Accept: "application/json", + Authorization: `Bearer ${bearerToken}`, + "X-Raycast-Timestamp": timestamp, + "Accept-Language": "en-US,en;q=0.9", + "X-Raycast-DeviceId": deviceId, + "Content-Type": "application/json", + "X-Raycast-Signature-v2": signatureV2(timestamp, deviceId, payload, sigSecret), + "X-Raycast-Experimental": psd.experimental || RAYCAST_DEFAULT_EXPERIMENTAL, + "X-Raycast-Signature": raycastJwt(aid, sigSecret), + "User-Agent": psd.userAgent || RAYCAST_DEFAULT_USER_AGENT, + }; +} + +export function contentToText(content: unknown): string { + if (typeof content === "string") return content; + if (!Array.isArray(content)) return JSON.stringify(content ?? ""); + + return content + .map((part) => { + if (typeof part === "string") return part; + if ( + part && + typeof part === "object" && + "type" in part && + (part as { type?: string }).type === "text" + ) { + return String((part as { text?: string }).text || ""); + } + return ""; + }) + .filter(Boolean) + .join("\n"); +} + +export function convertOpenAiMessages(messages: ChatMessage[]): { + raycastMessages: Array<{ author: string; content: { text: string } }>; + systemInstruction: string; +} { + let systemInstruction = "markdown"; + const raycastMessages: Array<{ author: string; content: { text: string } }> = []; + + for (const [index, message] of messages.entries()) { + if (message.role === "system" && index === 0) { + systemInstruction = contentToText(message.content); + continue; + } + + if (message.role === "user" || message.role === "assistant") { + raycastMessages.push({ + author: message.role, + content: { text: contentToText(message.content) }, + }); + } + } + + return { raycastMessages, systemInstruction }; +} + +export function inferProviderInfo(modelId: string): { provider: string; model: string } { + if (modelId.startsWith("openai_o1-")) { + return { provider: "openai", model: modelId.slice("openai_o1-".length) }; + } + + const providers = [ + "anthropic", + "baseten", + "google", + "groq", + "mistral", + "openai", + "perplexity", + "raycast", + "together", + "xai", + ]; + + for (const provider of providers) { + const prefix = `${provider}-`; + if (modelId.startsWith(prefix)) { + return { provider, model: modelId.slice(prefix.length) }; + } + } + + if (modelId.includes("/")) return { provider: "baseten", model: modelId }; + return { provider: "openai", model: modelId || "gpt-5-mini" }; +} + +export function buildRaycastChatBody( + modelId: string, + messages: ChatMessage[], + temperature?: number +): string { + const { provider, model } = inferProviderInfo(modelId); + const { raycastMessages, systemInstruction } = convertOpenAiMessages(messages); + + if (raycastMessages.length === 0) { + throw new Error("Raycast requires at least one user or assistant message"); + } + + return JSON.stringify({ + model, + provider, + messages: raycastMessages, + system_instruction: systemInstruction, + temperature: temperature ?? 0.5, + additional_system_instructions: "", + debug: false, + locale: "en-US", + source: "ai_chat", + thread_id: randomUUID(), + tools: [], + }); +} + +export function parseRaycastSseText(responseText: string): string { + let fullText = ""; + + for (const line of responseText.split("\n")) { + if (!line.startsWith("data:")) continue; + try { + const data = JSON.parse(line.slice(5).trim()) as { text?: string }; + if (data.text) fullText += data.text; + } catch { + // Ignore non-JSON SSE lines. + } + } + + return fullText; +} + +export async function fetchRaycastModels( + credentials: RaycastCredentials, + options?: { includePremium?: boolean; includeDeprecated?: boolean } +): Promise { + const payload = "{}"; + const headers = buildRaycastHeaders(payload, credentials); + const res = await fetch(RAYCAST_MODELS_URL, { method: "GET", headers }); + if (!res.ok) { + const text = await res.text(); + throw new Error(`Raycast models error [${res.status}]: ${text.slice(0, 300)}`); + } + + const data = (await res.json()) as { models?: RaycastModelEntry[] }; + const includePremium = options?.includePremium ?? true; + const includeDeprecated = options?.includeDeprecated ?? true; + + return (data.models || []).filter((model) => { + if (!includePremium && model.requires_better_ai) return false; + if (!includeDeprecated && model.availability === "deprecated") return false; + return true; + }); +} diff --git a/open-sse/services/reasoningCache.ts b/open-sse/services/reasoningCache.ts index 3d4a715fe0..e23a388d6a 100644 --- a/open-sse/services/reasoningCache.ts +++ b/open-sse/services/reasoningCache.ts @@ -22,6 +22,7 @@ import { getReasoningCacheStats, setReasoningCache, } from "../../src/lib/db/reasoningCache.ts"; +import { isInternalReasoningPlaceholder } from "../utils/reasoningPlaceholder.ts"; // ──────────────── Provider/Model Detection ──────────────── @@ -194,6 +195,9 @@ export function cacheReasoningByKey( reasoning: string ): void { if (!key || !reasoning) return; + // ponytail: never store the internal replay placeholder — models echo it + // and it poisons the cache (upstream echo loop, OmniRoute #9573). + if (isInternalReasoningPlaceholder(reasoning)) return; if (reasoning.length > MAX_ENTRY_BYTES) { reasoning = reasoning.slice(0, MAX_ENTRY_BYTES); @@ -259,6 +263,8 @@ export function cacheReasoningFromAssistantMessage( ? message.reasoning : ""; if (!reasoning) return 0; + // ponytail: don't capture the echoed placeholder into the cache. + if (isInternalReasoningPlaceholder(reasoning)) return 0; const toolCallIds = Array.isArray(message.tool_calls) ? (message.tool_calls as ToolCallLike[]) @@ -299,6 +305,12 @@ export function lookupReasoning(toolCallId: string): string | null { const mem = memoryCache.get(toolCallId); if (mem) { if (Date.now() < mem.expiresAt) { + // ponytail: never replay the internal placeholder from memory. + if (isInternalReasoningPlaceholder(mem.reasoning)) { + memoryCache.delete(toolCallId); + misses++; + return null; + } hits++; return mem.reasoning; } @@ -314,6 +326,11 @@ export function lookupReasoning(toolCallId: string): string | null { // DB lookup failure is non-fatal; treat it as a cache miss. } if (dbResult) { + // ponytail: never promote/replay the internal placeholder from DB. + if (isInternalReasoningPlaceholder(dbResult.reasoning)) { + misses++; + return null; + } hits++; let promotedReasoning = dbResult.reasoning; if (promotedReasoning.length > MAX_ENTRY_BYTES) { diff --git a/open-sse/services/rollingRpmGate.ts b/open-sse/services/rollingRpmGate.ts new file mode 100644 index 0000000000..e62912ba5a --- /dev/null +++ b/open-sse/services/rollingRpmGate.ts @@ -0,0 +1,236 @@ +import { + SlidingWindowLimiter, + type RateLimitScope, + type RateLimitWindow, + type SlidingWindowLease, +} from "./slidingWindowLimiter.ts"; + +type GetLimiterKey = (provider: string, connectionId: string, model?: string | null) => string; +type QueueTimeoutReason = "local-queue" | "upstream-cooldown"; +type QueueTimeoutErrorFactory = ( + provider: string, + model: string | null, + maxWaitMs: number, + reason?: QueueTimeoutReason +) => Error; + +export interface RollingRpmGateOptions { + getGlobalRpm: () => number | null | undefined; + getProviderWindow: (provider: string) => RateLimitWindow | undefined; + getConnectionRpm: (connectionId: string) => number | null | undefined; + getLimiterKey: GetLimiterKey; + createQueueTimeoutError: QueueTimeoutErrorFactory; +} + +interface LearnedHeaderWindow { + window: RateLimitWindow; + expiresAt: number; +} + +function createAbortError(signal: AbortSignal): Error { + const reason = signal.reason; + if (reason instanceof Error) return reason; + const error = new Error(typeof reason === "string" ? reason : "The operation was aborted"); + error.name = "AbortError"; + if (reason !== undefined) (error as Error & { cause?: unknown }).cause = reason; + return error; +} + +function sleepOrAbort(ms: number, signal: AbortSignal | null): Promise { + return new Promise((resolve, reject) => { + const timer = setTimeout(() => { + signal?.removeEventListener("abort", onAbort); + resolve(); + }, ms); + const onAbort = () => { + clearTimeout(timer); + signal?.removeEventListener("abort", onAbort); + reject(createAbortError(signal as AbortSignal)); + }; + if (signal) { + if (signal.aborted) onAbort(); + else signal.addEventListener("abort", onAbort, { once: true }); + } + }); +} + +/** + * Process-local trailing-window RPM admission. Distributed deployments need a + * shared coordination store before this scope can be treated as cluster-wide. + */ +export function keyContainsConnection(key: string, connectionId: string): boolean { + const marker = `:${connectionId}`; + return key.endsWith(marker) || key.includes(`${marker}:`); +} + +export class RollingRpmGate { + private readonly limiter = new SlidingWindowLimiter(); + private readonly blockedUntil = new Map(); + private readonly learnedHeaderWindows = new Map(); + private readonly windowMs = 60_000; + + constructor(private readonly options: RollingRpmGateOptions) {} + + async acquire( + provider: string, + connectionId: string, + model: string | null, + signal: AbortSignal | null, + maxWaitMs: number, + startedAt: number + ): Promise { + const blockKey = this.options.getLimiterKey(provider, connectionId, model); + let scopes = this.getScopes(provider, connectionId, model); + if (scopes.length === 0 && (this.blockedUntil.get(blockKey) ?? 0) <= Date.now()) { + return null; + } + for (;;) { + if (signal?.aborted) throw createAbortError(signal); + + scopes = this.getScopes(provider, connectionId, model); + if (scopes.length === 0 && (this.blockedUntil.get(blockKey) ?? 0) <= Date.now()) { + return null; + } + + const now = Date.now(); + const blockedUntil = this.blockedUntil.get(blockKey) ?? 0; + if (blockedUntil <= now) this.blockedUntil.delete(blockKey); + let scopeBlockedUntil = 0; + for (const scope of scopes) { + const scopeBlocked = this.blockedUntil.get(scope.key) ?? 0; + if (scopeBlocked > now) scopeBlockedUntil = Math.max(scopeBlockedUntil, scopeBlocked); + else if (scopeBlocked > 0) this.blockedUntil.delete(scope.key); + } + const forcedWaitMs = Math.max(0, blockedUntil - now, scopeBlockedUntil - now); + + if (forcedWaitMs === 0) { + const result = this.limiter.tryAcquireMany(scopes); + if (result.allowed) return result.lease ?? null; + const retryAfterMs = Math.max(1, result.retryAfterMs); + const remainingMs = maxWaitMs > 0 ? maxWaitMs - (now - startedAt) : retryAfterMs; + if (maxWaitMs > 0 && remainingMs <= 0) { + throw this.options.createQueueTimeoutError(provider, model, maxWaitMs); + } + await sleepOrAbort( + Math.min(retryAfterMs, maxWaitMs > 0 ? remainingMs : retryAfterMs), + signal + ); + continue; + } + + const remainingMs = maxWaitMs > 0 ? maxWaitMs - (now - startedAt) : forcedWaitMs; + if (maxWaitMs > 0 && remainingMs <= 0) { + throw this.options.createQueueTimeoutError(provider, model, maxWaitMs, "upstream-cooldown"); + } + await sleepOrAbort( + Math.min(forcedWaitMs, maxWaitMs > 0 ? remainingMs : forcedWaitMs), + signal + ); + } + } + + block(provider: string, connectionId: string, model: string | null, retryAfterMs: number): void { + if (retryAfterMs > 0) { + const key = this.options.getLimiterKey(provider, connectionId, model); + this.blockedUntil.set(key, Date.now() + retryAfterMs); + } + } + + learnHeaderWindow( + provider: string, + connectionId: string, + model: string | null, + requests: number, + windowMs: number, + expiresAt: number + ): void { + const key = `header:${this.options.getLimiterKey(provider, connectionId, model)}`; + if (requests <= 0) { + this.learnedHeaderWindows.delete(key); + this.blockedUntil.set(key, expiresAt); + return; + } + this.blockedUntil.delete(key); + this.learnedHeaderWindows.set(key, { + window: { requests, windowMs }, + expiresAt, + }); + } + + clearLearnedHeaderWindow(provider: string, connectionId: string, model: string | null): void { + const key = `header:${this.options.getLimiterKey(provider, connectionId, model)}`; + this.learnedHeaderWindows.delete(key); + this.blockedUntil.delete(key); + } + + clearConnection(connectionId: string): void { + for (const key of this.blockedUntil.keys()) { + if (keyContainsConnection(key, connectionId)) this.blockedUntil.delete(key); + } + for (const key of this.learnedHeaderWindows.keys()) { + if (keyContainsConnection(key, connectionId)) this.learnedHeaderWindows.delete(key); + } + } + + reset(): void { + this.limiter.reset(); + this.blockedUntil.clear(); + this.learnedHeaderWindows.clear(); + } + + cleanupExpired(now = Date.now()): void { + for (const [key, expiresAt] of this.blockedUntil) { + if (expiresAt <= now) this.blockedUntil.delete(key); + } + for (const [key, window] of this.learnedHeaderWindows) { + if (window.expiresAt <= now) this.learnedHeaderWindows.delete(key); + } + } + + private getScopes( + provider: string, + connectionId: string, + model: string | null + ): RateLimitScope[] { + const scopes: RateLimitScope[] = []; + const globalRpm = this.options.getGlobalRpm(); + if (typeof globalRpm === "number" && globalRpm > 0) { + scopes.push({ + key: "global", + window: { requests: globalRpm, windowMs: this.windowMs }, + }); + } + + const providerWindow = this.options.getProviderWindow(provider); + if (providerWindow) scopes.push({ key: `provider:${provider}`, window: providerWindow }); + + const connectionRpm = this.options.getConnectionRpm(connectionId); + if (typeof connectionRpm === "number" && connectionRpm > 0) { + scopes.push({ + key: `provider-account:${provider}:${connectionId}`, + window: { requests: connectionRpm, windowMs: this.windowMs }, + }); + } + + const headerKey = `header:${this.options.getLimiterKey(provider, connectionId, model)}`; + const headerBlockedUntil = this.blockedUntil.get(headerKey) ?? 0; + const headerRemainingMs = headerBlockedUntil - Date.now(); + if (headerRemainingMs > 0) { + scopes.push({ + key: headerKey, + window: { requests: 1, windowMs: headerRemainingMs }, + }); + return scopes; + } + if (headerBlockedUntil > 0) this.blockedUntil.delete(headerKey); + const headerWindow = this.learnedHeaderWindows.get(headerKey); + if (headerWindow) { + if (headerWindow.expiresAt > Date.now()) { + scopes.push({ key: headerKey, window: headerWindow.window }); + } else { + this.learnedHeaderWindows.delete(headerKey); + } + } + return scopes; + } +} diff --git a/open-sse/services/slidingWindowLimiter.ts b/open-sse/services/slidingWindowLimiter.ts index 71be85870f..651e82c2cc 100644 --- a/open-sse/services/slidingWindowLimiter.ts +++ b/open-sse/services/slidingWindowLimiter.ts @@ -27,13 +27,33 @@ export interface AcquireResult { retryAfterMs: number; } +export interface RateLimitScope { + key: string; + window: RateLimitWindow; +} + +export interface SlidingWindowLease { + /** Release a lease that was acquired but never dispatched upstream. */ + release(): void; +} + +export interface MultiAcquireResult extends AcquireResult { + lease?: SlidingWindowLease; +} + +interface Hit { + id: number; + timestamp: number; +} + // Hard ceiling on distinct keys tracked, so a pathological key space (e.g. a // per-request id leaking into the key) can never grow the map without bound. const MAX_KEYS = 5000; export class SlidingWindowLimiter { - private readonly hits = new Map(); + private readonly hits = new Map(); private readonly now: () => number; + private nextHitId = 1; constructor(opts: { now?: () => number } = {}) { this.now = opts.now ?? Date.now; @@ -45,26 +65,60 @@ export class SlidingWindowLimiter { * (without recording) when the trailing window is saturated. */ tryAcquire(key: string, window: RateLimitWindow): AcquireResult { - const { requests, windowMs } = window; - // A non-positive cap or window means "no limit configured" → always allow. - if (!(requests > 0) || !(windowMs > 0)) return { allowed: true, retryAfterMs: 0 }; + const result = this.tryAcquireMany([{ key, window }]); + return { allowed: result.allowed, retryAfterMs: result.retryAfterMs }; + } + + /** + * Acquire all supplied scopes atomically. No scope is recorded unless every + * configured scope has capacity, preventing a global lease from being held + * while a narrower provider/account lease is unavailable. + */ + tryAcquireMany(scopes: readonly RateLimitScope[]): MultiAcquireResult { + const activeScopes = scopes.filter(({ window }) => window.requests > 0 && window.windowMs > 0); + if (activeScopes.length === 0) return { allowed: true, retryAfterMs: 0 }; const now = this.now(); - const cutoff = now - windowMs; - const previous = this.hits.get(key); - // Drop timestamps that have aged out of the trailing window. - const live = previous ? previous.filter((ts) => ts > cutoff) : []; + const prepared = activeScopes.map((scope) => { + const cutoff = now - scope.window.windowMs; + const previous = this.hits.get(scope.key); + const live = previous ? previous.filter((hit) => hit.timestamp > cutoff) : []; + const retryAfterMs = + live.length >= scope.window.requests + ? Math.max(0, live[0].timestamp + scope.window.windowMs - now) + : 0; + return { scope, live, retryAfterMs }; + }); - if (live.length >= requests) { - // The oldest in-window hit is the first to expire and free a slot. - const retryAfterMs = Math.max(0, live[0] + windowMs - now); - this.hits.set(key, live); // persist the pruned list; do NOT record a blocked attempt - return { allowed: false, retryAfterMs }; - } + const retryAfterMs = prepared.reduce((max, entry) => Math.max(max, entry.retryAfterMs), 0); + for (const entry of prepared) this.set(entry.scope.key, entry.live); + if (retryAfterMs > 0) return { allowed: false, retryAfterMs }; - live.push(now); - this.set(key, live); - return { allowed: true, retryAfterMs: 0 }; + const entries = prepared.map((entry) => { + const hit = { id: this.nextHitId++, timestamp: now }; + entry.live.push(hit); + this.set(entry.scope.key, entry.live); + return { key: entry.scope.key, id: hit.id }; + }); + + let released = false; + return { + allowed: true, + retryAfterMs: 0, + lease: { + release: () => { + if (released) return; + released = true; + for (const entry of entries) { + const live = this.hits.get(entry.key); + if (!live) continue; + const remaining = live.filter((hit) => hit.id !== entry.id); + if (remaining.length > 0) this.hits.set(entry.key, remaining); + else this.hits.delete(entry.key); + } + }, + }, + }; } /** Clear history for one key, or all keys when called with no argument. */ @@ -73,7 +127,11 @@ export class SlidingWindowLimiter { else this.hits.delete(key); } - private set(key: string, live: number[]): void { + private set(key: string, live: Hit[]): void { + if (live.length === 0) { + this.hits.delete(key); + return; + } if (!this.hits.has(key) && this.hits.size >= MAX_KEYS) { // Evict the least-recently-inserted key (Map preserves insertion order). const oldest = this.hits.keys().next().value; diff --git a/open-sse/services/systemTransforms.ts b/open-sse/services/systemTransforms.ts index 813bd5350f..e7542619e3 100644 --- a/open-sse/services/systemTransforms.ts +++ b/open-sse/services/systemTransforms.ts @@ -341,9 +341,17 @@ function applyObfuscateWords(body: RequestBody, op: ObfuscateWordsOp): void { if (typeof content === "string") { msg.content = obfuscateWithList(content, words); } else if (Array.isArray(content)) { - for (const block of content as Array>) { - if (typeof block.text === "string") { - block.text = obfuscateWithList(block.text, words); + // A signed Anthropic thinking turn covers its text siblings too. Leave + // the entire turn byte-for-byte intact so its signature remains valid. + const blocks = content as Array>; + const hasSignedThinking = blocks.some( + (block) => block?.type === "thinking" || block?.type === "redacted_thinking" + ); + if (!hasSignedThinking) { + for (const block of blocks) { + if (typeof block.text === "string") { + block.text = obfuscateWithList(block.text, words); + } } } } diff --git a/open-sse/services/tokenRefresh/providers/copilot.ts b/open-sse/services/tokenRefresh/providers/copilot.ts index 92fe9d8b39..44e05b647f 100644 --- a/open-sse/services/tokenRefresh/providers/copilot.ts +++ b/open-sse/services/tokenRefresh/providers/copilot.ts @@ -5,12 +5,24 @@ import { getGitHubCopilotRefreshHeaders } from "../../../config/providerHeaderPr import { runWithProxyContext } from "../../../utils/proxyFetch.ts"; /** - * Refresh GitHub Copilot token using GitHub access token + * Refresh GitHub Copilot token using a GitHub access token. + * + * `baseUrl` defaults to github.com's Copilot API but can be overridden to a + * GitHub Enterprise host's `/api/v3` so the same helper serves both + * the `github` and `ghe-copilot` providers (GHE has its own per-enterprise + * Copilot token endpoint; api.github.com never issues a token scoped to a + * GHE account). */ -export async function refreshCopilotToken(githubAccessToken, log, proxyConfig: unknown = null) { +export async function refreshCopilotToken( + githubAccessToken, + log, + proxyConfig: unknown = null, + baseUrl: string = "https://api.github.com" +) { try { + const tokenUrl = `${baseUrl.replace(/\/+$/, "")}/copilot_internal/v2/token`; const response = await runWithProxyContext(proxyConfig, () => - fetch("https://api.github.com/copilot_internal/v2/token", { + fetch(tokenUrl, { headers: getGitHubCopilotRefreshHeaders(`token ${githubAccessToken}`), }) ); diff --git a/open-sse/services/usage.ts b/open-sse/services/usage.ts index 1123ca4951..679d4f263d 100644 --- a/open-sse/services/usage.ts +++ b/open-sse/services/usage.ts @@ -228,7 +228,7 @@ export async function getUsageForProvider( case "ha": return await getHyperAgentUsage(apiKey || accessToken, providerSpecificData); case "firecrawl": - return await getFirecrawlUsage(id || "", apiKey); + return await getFirecrawlUsage(id || "", apiKey, connection); default: return { message: `Usage API not implemented for ${provider}` }; } diff --git a/open-sse/services/usage/antigravity.ts b/open-sse/services/usage/antigravity.ts index 7b2f2ce13a..693771d681 100644 --- a/open-sse/services/usage/antigravity.ts +++ b/open-sse/services/usage/antigravity.ts @@ -272,21 +272,24 @@ async function fetchAntigravityUserQuotaCached( const promise = (async () => { try { - const response = await fetch( - "https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota", - { - method: "POST", - headers: getAntigravityContentHeaders(clientProfile, accessToken), - body: JSON.stringify({ project: projectId }), - signal: AbortSignal.timeout(10000), - } - ); + for (const baseUrl of ANTIGRAVITY_RUNTIME_BASE_URLS) { + const response = await fetch( + `${baseUrl}/v1internal:retrieveUserQuota`, + { + method: "POST", + headers: getAntigravityContentHeaders(clientProfile, accessToken), + body: JSON.stringify({ project: projectId }), + signal: AbortSignal.timeout(10000), + } + ); - if (!response.ok) return null; + if (!response.ok) continue; - const data = await response.json(); - _antigravityUserQuotaCache.set(cacheKey, { data, fetchedAt: Date.now() }); - return data; + const data = await response.json(); + _antigravityUserQuotaCache.set(cacheKey, { data, fetchedAt: Date.now() }); + return data; + } + return null; } catch { return null; } diff --git a/open-sse/services/usage/antigravityWeeklyQuota.ts b/open-sse/services/usage/antigravityWeeklyQuota.ts index 3aa4e78d18..a806eb4645 100644 --- a/open-sse/services/usage/antigravityWeeklyQuota.ts +++ b/open-sse/services/usage/antigravityWeeklyQuota.ts @@ -17,6 +17,7 @@ * `fetchAntigravityUserQuotaCached` pattern. */ +import { ANTIGRAVITY_RUNTIME_BASE_URLS } from "../../config/antigravityUpstream.ts"; import { toRecord, toNumber } from "./scalars.ts"; import { type UsageQuota, parseResetTime } from "./quota.ts"; import { getAntigravityContentHeaders } from "../antigravityHeaders.ts"; @@ -81,21 +82,24 @@ export async function fetchAntigravityUserQuotaSummaryCached( const promise = (async () => { try { - const response = await fetch( - "https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuotaSummary", - { - method: "POST", - headers: getAntigravityContentHeaders(clientProfile, accessToken), - body: JSON.stringify({ project: projectId }), - signal: AbortSignal.timeout(10000), - } - ); + for (const baseUrl of ANTIGRAVITY_RUNTIME_BASE_URLS) { + const response = await fetch( + `${baseUrl}/v1internal:retrieveUserQuotaSummary`, + { + method: "POST", + headers: getAntigravityContentHeaders(clientProfile, accessToken), + body: JSON.stringify({ project: projectId }), + signal: AbortSignal.timeout(10000), + } + ); - if (!response.ok) return null; + if (!response.ok) continue; - const data = await response.json(); - _weeklyQuotaCache.set(cacheKey, { data, fetchedAt: Date.now() }); - return data; + const data = await response.json(); + _weeklyQuotaCache.set(cacheKey, { data, fetchedAt: Date.now() }); + return data; + } + return null; } catch { return null; } diff --git a/open-sse/services/usage/firecrawl.ts b/open-sse/services/usage/firecrawl.ts index ea2ae1618f..793df7e673 100644 --- a/open-sse/services/usage/firecrawl.ts +++ b/open-sse/services/usage/firecrawl.ts @@ -5,7 +5,11 @@ * credits into the standard `{ plan, quotas }` response. */ -import { fetchFirecrawlQuota, type FirecrawlQuota } from "../firecrawlQuotaFetcher.ts"; +import { + fetchFirecrawlQuota, + getFirecrawlBaseUrl, + type FirecrawlQuota, +} from "../firecrawlQuotaFetcher.ts"; import { createQuotaFromUsage, parseResetTime } from "./quota.ts"; function createFirecrawlPlanQuota(q: FirecrawlQuota) { @@ -29,13 +33,31 @@ function createFirecrawlPlanQuota(q: FirecrawlQuota) { }; } -export async function getFirecrawlUsage(connectionId: string, apiKey?: string) { +export async function getFirecrawlUsage( + connectionId: string, + apiKey?: string, + connection?: Record +) { if (!connectionId) { return { message: "Firecrawl: connection id unavailable." }; } + const customBase = getFirecrawlBaseUrl(connection); + if (customBase) { + return { + plan: "Firecrawl · Self-Hosted Local", + quotas: {}, + message: `Connected to self-hosted Firecrawl instance (${customBase})`, + }; + } + try { - const live = await fetchFirecrawlQuota(connectionId, { apiKey }); + // The explicit `apiKey` argument was silently dropped when #91bb6aa619 moved + // this to fetchFirecrawlQuota(connectionId, connection): the fetcher reads the + // key off the connection record, so a caller that passes the key directly — + // without a connection carrying it — always got "API key not available". + const resolvedConnection = apiKey ? { ...(connection || {}), apiKey } : connection; + const live = await fetchFirecrawlQuota(connectionId, resolvedConnection); if (!live) { return { message: "Firecrawl API key not available or credit usage unavailable." }; } diff --git a/open-sse/services/webSearchFallback.ts b/open-sse/services/webSearchFallback.ts index 7ae1749803..0cc33fdac7 100644 --- a/open-sse/services/webSearchFallback.ts +++ b/open-sse/services/webSearchFallback.ts @@ -1,7 +1,10 @@ import { FORMATS } from "../translator/formats.ts"; export const OMNIROUTE_WEB_SEARCH_FALLBACK_TOOL_NAME = "omniroute_web_search"; -const WEB_SEARCH_TOOL_TYPES = new Set(["web_search", "web_search_preview"]); +// Prefix match — Anthropic sends date-suffixed variants (web_search_20250305, …). +// The other two detectors (openai-responses/helpers.ts, webSearchRouting.ts) already +// use /^web_search/ prefix matching; this aligns the fallback detector with them. +const WEB_SEARCH_TOOL_TYPES = /^web_search/; const SEARCH_CONTEXT_DEFAULTS: Record = { low: 5, medium: 8, @@ -27,13 +30,13 @@ function toRecord(value: unknown): JsonRecord { function isBuiltInWebSearchTool(tool: unknown): tool is JsonRecord { const toolRecord = toRecord(tool); const toolType = typeof toolRecord.type === "string" ? toolRecord.type : ""; - return WEB_SEARCH_TOOL_TYPES.has(toolType) && !toolRecord.function; + return WEB_SEARCH_TOOL_TYPES.test(toolType) && !toolRecord.function; } function isBuiltInWebSearchToolChoice(toolChoice: unknown): boolean { const choice = toRecord(toolChoice); const toolType = typeof choice.type === "string" ? choice.type : ""; - return WEB_SEARCH_TOOL_TYPES.has(toolType); + return WEB_SEARCH_TOOL_TYPES.test(toolType); } function buildFallbackDescription(tool: JsonRecord): string { diff --git a/open-sse/translator/helpers/toolCallHelper.ts b/open-sse/translator/helpers/toolCallHelper.ts index f0869951c7..817aabbf57 100644 --- a/open-sse/translator/helpers/toolCallHelper.ts +++ b/open-sse/translator/helpers/toolCallHelper.ts @@ -96,6 +96,37 @@ export function normalizeOpenAIToolNames(body: unknown, maxLength: number): Tool return aliases; } +/** + * Case-insensitive fallback for tool name lookups from upstream responses. + * + * Many upstream providers/models return tool call names in lowercase (e.g., "bash") + * even when the tool definition used PascalCase ("Bash"). This helper tries an exact + * match first (fast path for well-behaved providers), then falls back to a + * case-insensitive scan over the map entries. + * + * Returns the mapped value on match, or `undefined` when no entry matches. + */ +export function caseInsensitiveToolNameLookup( + name: string, + map: Map | null | undefined +): string | undefined { + if (!map || !name) return undefined; + + // Fast path: exact match (PascalCase-preserving providers) + const exact = map.get(name); + if (exact !== undefined) return exact; + + // Fallback: case-insensitive scan + const lowerName = name.toLowerCase(); + for (const [key, value] of map) { + if (key.toLowerCase() === lowerName) { + return value; + } + } + + return undefined; +} + /** Restore normalized function names in OpenAI Chat Completions responses. */ export function restoreOpenAIToolNames(body: unknown, aliases: unknown): boolean { if (!(aliases instanceof Map) || aliases.size === 0) return false; @@ -108,7 +139,7 @@ export function restoreOpenAIToolNames(body: unknown, aliases: unknown): boolean for (const toolCall of calls) { const fn = toRecord(toRecord(toolCall)?.function); if (!fn || typeof fn.name !== "string") continue; - const original = aliases.get(fn.name); + const original = caseInsensitiveToolNameLookup(fn.name, aliases); if (typeof original !== "string" || original === fn.name) continue; fn.name = original; changed = true; diff --git a/open-sse/translator/index.ts b/open-sse/translator/index.ts index e083787014..3e0c4a5a3c 100644 --- a/open-sse/translator/index.ts +++ b/open-sse/translator/index.ts @@ -14,6 +14,7 @@ import { resolveConnectionCacheOverride, } from "../utils/cacheControlPolicy.ts"; import { requiresAuthenticReasoningContent } from "../utils/reasoningContentInjector.ts"; +import { isInternalReasoningPlaceholder } from "../utils/reasoningPlaceholder.ts"; import { coerceToolSchemas, injectEmptyReasoningContentForToolCalls, @@ -25,6 +26,7 @@ import { bootstrapTranslatorRegistry } from "./bootstrap.ts"; import { hasThinkingConfig, normalizeThinkingConfig } from "../services/provider.ts"; import { applyThinkingBudget } from "../services/thinkingBudget.ts"; import { applyReasoningRuleDirective } from "@/lib/reasoningRouting/policy"; +import { getModelPreserveVideoUrl } from "@/lib/db/models/modelPreserveVideoUrl"; import { getResolvedModelCapabilities, supportsReasoning } from "../services/modelCapabilities.ts"; import { normalizeRoles } from "../services/roleNormalizer.ts"; import { hoistLeadingSystemMessage } from "./helpers/strictSystemHoist.ts"; @@ -368,8 +370,9 @@ export function translateRequest( providerHonorsOpenAIFormatCacheControl(provider, connectionCacheOverride), // #4849 regression guard: keep client reasoning_content for replay providers. preserveReasoningContent: isReasoner, - // Moonshot's Chat API accepts its own OpenAI-compatible `video_url` block. - preserveVideoUrl: normalizedProvider === "moonshot" || normalizedProvider === "kimi", + // Per-provider/model preserveVideoUrl flag from compat overrides. + // Falls back to true for moonshot/kimi when unset (legacy behavior). + preserveVideoUrl: getModelPreserveVideoUrl(normalizedProvider, options?.model ?? "") ?? (normalizedProvider === "moonshot" || normalizedProvider === "kimi"), }); } @@ -481,10 +484,11 @@ export function translateRequest( !hasNonEmptyReasoningContent(msg); if (!hasToolCalls && !hasToolUseBlocks && !shouldReplayReasoningOnly) { - // Strip empty reasoning_content on non-tool-call messages we are NOT - // replaying (e.g. non-DeepSeek targets); an empty string has no meaningful - // value to send and may confuse some upstreams. - if (msg.reasoning_content === "") { + // Strip empty or placeholder reasoning_content on non-tool-call messages + // we are NOT replaying. The placeholder is request scaffolding, never + // real reasoning — forwarding it makes the model continue its chain of + // thought FROM that text (echo → empty stop, #9573). + if (msg.reasoning_content === "" || isInternalReasoningPlaceholder(msg.reasoning_content)) { delete msg.reasoning_content; } continue; @@ -526,9 +530,17 @@ export function translateRequest( } // ── OpenAI-format message ── - // Skip if client already provided real reasoning_content + // Skip if client already provided real reasoning_content. The internal + // replay placeholder is NOT real reasoning: drop it and fall through to + // the cache lookup so it can be replaced with genuine cached reasoning. + // Forwarding it makes the model continue its chain of thought from that + // text (echo → empty stop), and the echo re-poisons cache + client + // history (#9573). if (hasNonEmptyReasoningContent(msg)) { - continue; + if (!isInternalReasoningPlaceholder(msg.reasoning_content)) { + continue; + } + delete msg.reasoning_content; } const cacheKey = hasToolCalls @@ -551,19 +563,17 @@ export function translateRequest( continue; } - // Cache miss fallback — use a non-empty placeholder. - // Empty string causes DeepSeek V4+ to reject with 400: - // "reasoning_content in the thinking mode must be passed back to the API." - // Note: injectEmptyReasoningContentForToolCalls may have pre-set - // reasoning_content="" before the cache lookup, so we check for - // both undefined AND empty string here. - // - // Applies to tool-call messages AND to plain (non-tool-call) assistant turns - // on DeepSeek replay targets (#1682). Without the placeholder on plain turns, - // a multi-turn text conversation whose reasoning_content the client stripped - // is forwarded to DeepSeek without the field and rejected with 400. + // Cache miss fallback — previously injected a non-empty placeholder + // (NON_ANTHROPIC_THINKING_PLACEHOLDER) to dodge an alleged DeepSeek V4 400 + // on missing reasoning_content. The placeholder is the root cause of this + // bug: the model echoes it as its own reasoning and stops (empty turns), + // and the echo re-poisons the cache + client history (#9573). Empirically, + // deepseek-v4-flash accepts an ABSENT reasoning_content field (the 400 is + // specific to empty-string, and even that is endpoint-dependent). Omit + // the field instead; providers that genuinely enforce the contract + // (kimi-coding, moonshot authentic-reasoning) have their own paths above. if ((hasToolCalls || shouldReplayReasoningOnly) && !msg.reasoning_content) { - msg.reasoning_content = NON_ANTHROPIC_THINKING_PLACEHOLDER; + delete msg.reasoning_content; } } } else if ( diff --git a/open-sse/translator/request/claude-to-gemini.ts b/open-sse/translator/request/claude-to-gemini.ts index 89807dfeca..a69540e49d 100644 --- a/open-sse/translator/request/claude-to-gemini.ts +++ b/open-sse/translator/request/claude-to-gemini.ts @@ -6,12 +6,12 @@ import { cleanJSONSchemaForAntigravity, } from "../helpers/geminiHelper.ts"; import { buildGeminiTools, sanitizeGeminiToolName } from "../helpers/geminiToolsSanitizer.ts"; -import { capMaxOutputTokens, capThinkingBudget } from "../../../src/lib/modelCapabilities.ts"; -import { getModelSpec } from "../../../src/shared/constants/modelSpecs.ts"; import { buildGeminiThoughtSignatureKey, resolveGeminiThoughtSignature, } from "../../services/geminiThoughtSignatureStore.ts"; +import { capMaxOutputTokens, capThinkingBudget } from "../../../src/lib/modelCapabilities.ts"; +import { getModelSpec } from "../../../src/shared/constants/modelSpecs.ts"; import { buildHistoricalToolResultContext } from "./openai-to-gemini/helpers.ts"; /** @@ -127,6 +127,9 @@ export function claudeToGeminiRequest(model, body, stream, credentials = null) { // ── Convert messages ─────────────────────────────────────────── if (body.messages && Array.isArray(body.messages)) { + // Tool-ids whose functionCall was omitted (no stored thought_signature) so the + // matching tool_result becomes text instead of a Gemini-400'd functionResponse. + const omittedToolCallIds = new Set(); for (const msg of body.messages) { const parts = []; let shouldUseEmbeddedSignature = true; @@ -161,9 +164,7 @@ export function claudeToGeminiRequest(model, body, stream, credentials = null) { } parts.push({ - ...(embeddedThoughtSignature - ? { thoughtSignature: embeddedThoughtSignature } - : {}), + ...(embeddedThoughtSignature ? { thoughtSignature: embeddedThoughtSignature } : {}), functionCall: { ...(stripFunctionCallId ? {} : { id: block.id }), name: sanitizeToolName(block.name), diff --git a/open-sse/translator/request/openai-to-gemini.ts b/open-sse/translator/request/openai-to-gemini.ts index f34ed7d082..14cc4d4e5e 100644 --- a/open-sse/translator/request/openai-to-gemini.ts +++ b/open-sse/translator/request/openai-to-gemini.ts @@ -734,11 +734,24 @@ function wrapInCloudCodeEnvelope(model, cloudCodeRequest, credentials = null) { envelope._toolNameMap = cloudCodeRequest._toolNameMap; } + // #9030 — Client system content must NOT be combined with default in systemInstruction + // + // The upstream Antigravity / Cloud Code endpoint rejects oversized systemInstruction + // with 429 RESOURCE_EXHAUSTED. Keep only the lightweight ANTIGRAVITY_DEFAULT_SYSTEM + // in systemInstruction and relocate any client system content (which can be very + // large — Hermes ~125k tokens) to the first user message. const defaultPart: GeminiPart = { text: ANTIGRAVITY_DEFAULT_SYSTEM }; - if (envelope.request.systemInstruction?.parts) { - envelope.request.systemInstruction.parts.unshift(defaultPart); - } else { - envelope.request.systemInstruction = { role: "system", parts: [defaultPart] }; + const clientParts = envelope.request.systemInstruction?.parts?.slice() ?? []; + envelope.request.systemInstruction = { role: "system", parts: [defaultPart] }; + + if (clientParts.length > 0) { + // Prepend client system parts to the first user message so they still guide + // the model's behavior early in the conversation. + if (envelope.request.contents && envelope.request.contents.length > 0) { + envelope.request.contents[0].parts.unshift(...clientParts); + } else { + envelope.request.contents = [{ role: "user", parts: [...clientParts] }]; + } } // Strip Gemini built-in tool *names* out of functionDeclarations: Antigravity's diff --git a/open-sse/translator/request/openai-to-gemini/helpers.ts b/open-sse/translator/request/openai-to-gemini/helpers.ts index 3dfd35cef1..810620d8f9 100644 --- a/open-sse/translator/request/openai-to-gemini/helpers.ts +++ b/open-sse/translator/request/openai-to-gemini/helpers.ts @@ -37,10 +37,22 @@ type OpenAIToolCallLike = { export function buildChangedToolNameMap( toolNameMap: Map ): Map | null { - const changedEntries = [...toolNameMap.entries()].filter( - ([sanitizedName, originalName]) => sanitizedName !== originalName - ); - return changedEntries.length > 0 ? new Map(changedEntries) : null; + if (toolNameMap.size === 0) return null; + + const result = new Map(); + for (const [sanitizedName, originalName] of toolNameMap.entries()) { + result.set(sanitizedName, originalName); + // Add lowercase-keyed alias so Gemini's lowercased tool names find the original. + // Gemini always lowercases tool names in functionCall responses, so even identity + // entries (Bash → Bash) need a lowercase key ("bash" → "Bash") for the response + // translator to look them up (#9568). + const lower = sanitizedName.toLowerCase(); + if (lower !== sanitizedName && !result.has(lower)) { + result.set(lower, originalName); + } + } + + return result; } export function extractClientThoughtSignature(toolCall: unknown): string | null { diff --git a/open-sse/translator/request/openai-to-kiro.ts b/open-sse/translator/request/openai-to-kiro.ts index 17a5f6d1d6..03bae61bb1 100644 --- a/open-sse/translator/request/openai-to-kiro.ts +++ b/open-sse/translator/request/openai-to-kiro.ts @@ -110,6 +110,59 @@ function buildKiroToolSpecs(tools: KiroToolInput[]): { return { specs, docs: docs.join("\n\n---\n\n") }; } +/** + * Does this message carry Anthropic-style `tool_result` content blocks? Such a + * user message is part of an open tool-result batch rather than new user input. + */ +function carriesToolResults(msg): boolean { + return Array.isArray(msg?.content) && msg.content.some((c) => c.type === "tool_result"); +} + +/** + * Lookahead for issue #8903: is the text-only assistant message at `index` + * genuinely sandwiched inside a tool-result batch? + * + * True only when a later `tool` message (or a `tool_result` content block on a + * user message) still belongs to the same assistant turn — i.e. it appears + * before the conversation moves on with real user text or a new assistant + * tool-call turn. Consecutive text-only assistant messages are skipped so a + * `tool -> assistant -> assistant -> tool` run still counts as interleaved. + * + * Returning false for the ordinary `tool -> assistant(final reply)` shape is + * what keeps that reply on the normal flush path instead of being deferred. + */ +function hasFollowingToolResult(messages, index: number): boolean { + for (let j = index + 1; j < messages.length; j++) { + const next = messages[j]; + if (next.role === "tool") return true; + + if (next.role === "user") { + const blocks = Array.isArray(next.content) ? next.content : []; + // A user message carrying only tool_result blocks is still part of the + // batch; one with real text ends it. + if (blocks.some((c) => c.type === "tool_result")) { + const hasText = blocks.some((c) => (c.type === "text" || c.text) && c.text?.trim()); + if (!hasText) return true; + } + return false; + } + + if (next.role === "assistant") { + const isTextOnly = + (!next.tool_calls || next.tool_calls.length === 0) && + !(Array.isArray(next.content) && next.content.some((c) => c.type === "tool_use")); + // Skip further text-only assistant messages; a new tool-call turn ends + // the current batch. + if (isTextOnly) continue; + return false; + } + + // system or any other role ends the batch + return false; + } + return false; +} + /** * Convert OpenAI messages to Kiro format * Rules: system/tool/user -> user role, merge consecutive same roles @@ -121,6 +174,11 @@ function convertMessages(messages, tools, model) { let pendingUserContent = []; let pendingAssistantContent = []; let pendingToolResults = []; + // Text-only assistant turns that arrived in the middle of an open tool-result + // batch. They are held back so the batch stays contiguous, then emitted as + // their own assistant turn right after the batch flushes — see + // `interruptsOpenToolBatch` below (issue #8903). + let deferredAssistantContent: string[] = []; let pendingImages: Array<{ format: string; source: { bytes: string } }> = []; let currentRole = null; let toolsAttached = false; @@ -193,6 +251,19 @@ function convertMessages(messages, tools, model) { pendingUserContent = []; pendingToolResults = []; pendingImages = []; + + // The tool batch is now closed, so any assistant text that was held back + // to keep it contiguous can be emitted as its own turn (issue #8903). + // Without this the deferred text would sit in a queue nothing drains and + // be silently dropped from the transcript. + if (deferredAssistantContent.length > 0) { + history.push({ + assistantResponseMessage: { + content: deferredAssistantContent.join("\n\n").trim() || "(empty)", + }, + }); + deferredAssistantContent = []; + } } else if (currentRole === "assistant") { const content = pendingAssistantContent.join("\n\n").trim() || "(empty)"; const assistantMsg = { @@ -215,11 +286,64 @@ function convertMessages(messages, tools, model) { } // If role changes, flush pending + // + // Exception: a text-only assistant message must not split a batch of tool + // results that answers a single assistant turn. `tool` is normalized to + // `user` above, so `tool -> assistant -> tool` looks like two role changes + // and the interleaved flush would emit the first tool result and drop the + // rest, leaving advertised `toolUses` without matching `toolResults`. + // Bedrock rejects that transcript with 400 "Expected toolResult blocks" + // (issue #8903). Defer the assistant text instead so the tool batch stays + // contiguous; the text is re-emitted as its own assistant turn as soon as + // the batch flushes. + // + // The lookahead matters: without it, an ordinary trailing assistant reply + // (`tool -> assistant`, with no further tool message) would also be + // deferred and its text lost. Only a genuine sandwich qualifies. + const isTextOnlyAssistant = + msg.role === "assistant" && + (!msg.tool_calls || msg.tool_calls.length === 0) && + !(Array.isArray(msg.content) && msg.content.some((c) => c.type === "tool_use")); + const interruptsOpenToolBatch = + isTextOnlyAssistant && + currentRole === "user" && + pendingToolResults.length > 0 && + hasFollowingToolResult(messages, i); + + if (interruptsOpenToolBatch) { + const deferredText = + typeof msg.content === "string" + ? msg.content.trim() + : Array.isArray(msg.content) + ? msg.content + .filter((c) => c.type === "text" || c.text) + .map((c) => c.text || "") + .join("\n") + .trim() + : ""; + if (deferredText) deferredAssistantContent.push(deferredText); + continue; + } + + // Once assistant text has been deferred, the tool batch is logically over + // as soon as a message arrives that is not itself a tool result. Flush now + // so the pending batch + deferred assistant turn are emitted before the new + // user text, instead of that text merging into the tool-result turn and + // leaving the deferred reply stranded after it (issue #8903). + if ( + deferredAssistantContent.length > 0 && + currentRole === "user" && + msg.role !== "tool" && + !carriesToolResults(msg) + ) { + flushPending(); + currentRole = null; + } + if (role !== currentRole && currentRole !== null) { flushPending(); } currentRole = role; - if (role === "user") { // Extract content let content = ""; diff --git a/open-sse/translator/response/gemini-to-claude.ts b/open-sse/translator/response/gemini-to-claude.ts index 61d4f4283a..3af3c48418 100644 --- a/open-sse/translator/response/gemini-to-claude.ts +++ b/open-sse/translator/response/gemini-to-claude.ts @@ -108,14 +108,16 @@ export function geminiToClaudeResponse(chunk, state) { } const fc = part.functionCall; const rawToolName = fc.name; - const restoredToolName = normalizeToolName(state.toolNameMap?.get(rawToolName) || rawToolName); + const mappedName = state.toolNameMap?.get(rawToolName); + // When the toolNameMap provides a match (e.g., lowercase "bash" → "Bash"), + // use it directly without passing through normalizeToolName(), which would + // reverse TitleCase back to lowercase via REVERSE_MAP (#9568). + const restoredToolName = mappedName || normalizeToolName(rawToolName); const idx = state.contentBlockIndex++; const toolId = fc.id || `toolu_${Date.now()}_${idx}`; const signatureForToolCall = - (typeof hasThoughtSig === "string" && hasThoughtSig.length > 0 - ? hasThoughtSig - : null) || + (typeof hasThoughtSig === "string" && hasThoughtSig.length > 0 ? hasThoughtSig : null) || (typeof state.pendingThoughtSignature === "string" && state.pendingThoughtSignature.length > 0 ? state.pendingThoughtSignature diff --git a/open-sse/translator/response/gemini-to-openai.ts b/open-sse/translator/response/gemini-to-openai.ts index 3f915b5ec2..2a8240e290 100644 --- a/open-sse/translator/response/gemini-to-openai.ts +++ b/open-sse/translator/response/gemini-to-openai.ts @@ -4,6 +4,7 @@ import { buildGeminiThoughtSignatureKey, storeGeminiThoughtSignature, } from "../../services/geminiThoughtSignatureStore.ts"; +import { caseInsensitiveToolNameLookup } from "../helpers/toolCallHelper.ts"; import { parseTextualToolCallCandidate, containsTextualToolCallMarker, @@ -256,7 +257,7 @@ function emitFunctionCallPart( results: Array> ) { const rawToolName = part.functionCall.name; - const fcName = state.toolNameMap?.get(rawToolName) || rawToolName; + const fcName = caseInsensitiveToolNameLookup(rawToolName, state.toolNameMap) ?? rawToolName; const fcArgs = normalizeToolCallArgs(part.functionCall.args || {}); const toolCallIndex = state.functionIndex++; const toolCall = { diff --git a/open-sse/translator/response/openai-responses.ts b/open-sse/translator/response/openai-responses.ts index 346c23ffa9..4533b30958 100644 --- a/open-sse/translator/response/openai-responses.ts +++ b/open-sse/translator/response/openai-responses.ts @@ -1185,10 +1185,8 @@ function openaiResponsesToOpenAIResponseStream(chunk, state) { !(state.reasoningItemsWithDelta instanceof Set && state.reasoningItemsWithDelta.size > 0); if (emittedForItem || emittedWithoutItemId) return null; - // #7095/#7176 reconciliation: computed WITHOUT mutating `item`, so an - // encrypted-only reasoning item (and its `encrypted_content`) is never - // rewritten with a fabricated `summary` — the placeholder only feeds this - // synthetic client-facing delta chunk. + // #7176/#7243: only synthesize from real upstream plaintext — never mutate + // `item` and never fabricate placeholder text for encrypted-only reasoning. const summaryText = getVisibleResponsesReasoningSummaryText(item); if (!summaryText) return null; return buildResponsesReasoningDeltaChunk(state, summaryText); diff --git a/open-sse/translator/response/openai-responses/pureHelpers.ts b/open-sse/translator/response/openai-responses/pureHelpers.ts index e35ad24854..01999f9ac9 100644 --- a/open-sse/translator/response/openai-responses/pureHelpers.ts +++ b/open-sse/translator/response/openai-responses/pureHelpers.ts @@ -177,27 +177,19 @@ export function extractResponsesReasoningSummaryText(item) { .join("\n\n"); } -// #7095/#7176 — when Codex exposes a reasoning item only as encrypted private -// reasoning (no plaintext summary), chat clients would otherwise see nothing in -// their thinking panel. Reconciles two goals that used to be in tension: -// - #7095 wants a visible placeholder in the chat client. -// - #7176 wants the upstream response item left untouched, so `encrypted_content` -// (needed by Codex for subsequent requests) is never overwritten by a -// fabricated `summary`. -// This function computes the placeholder text WITHOUT mutating `item` — callers -// use the returned text for synthetic client-facing events only. -const ENCRYPTED_REASONING_PLACEHOLDER = - "Codex is reasoning, but the upstream Responses API exposed this reasoning block only as encrypted private reasoning. OmniRoute cannot recover the plaintext."; - +// #7095/#7176/#7243 — when Codex exposes a reasoning item only as encrypted +// private reasoning (no plaintext summary), callers may synthesize client-facing +// reasoning summary events from this helper. Reconciles three goals: +// - #7176: never mutate the upstream item — `encrypted_content` (needed by +// Codex for subsequent requests) must not be overwritten with a fabricated +// `summary`. +// - #7095: real plaintext summaries from upstream are forwarded to chat +// clients that render a thinking panel. +// - #7243: when upstream provides no plaintext summary, do NOT fabricate an +// alarming error-like paragraph into `reasoning_summary_text.delta` — clients +// would display it as if it were real reasoning. Return empty so synthetic +// summary events are suppressed; the reasoning item (with `encrypted_content`) +// still arrives on `response.output_item.done`. export function getVisibleResponsesReasoningSummaryText(item) { - const existingSummary = extractResponsesReasoningSummaryText(item); - if (existingSummary) return existingSummary; - - const hasEncryptedReasoning = - item && - item.type === "reasoning" && - typeof item.encrypted_content === "string" && - item.encrypted_content.length > 0; - - return hasEncryptedReasoning ? ENCRYPTED_REASONING_PLACEHOLDER : ""; + return extractResponsesReasoningSummaryText(item); } diff --git a/open-sse/translator/response/openai-to-claude.ts b/open-sse/translator/response/openai-to-claude.ts index 6a5d1687ad..cac48d5848 100644 --- a/open-sse/translator/response/openai-to-claude.ts +++ b/open-sse/translator/response/openai-to-claude.ts @@ -1,6 +1,7 @@ import { register } from "../registry.ts"; import { FORMATS } from "../formats.ts"; import { CLAUDE_OAUTH_TOOL_PREFIX } from "../request/openai-to-claude.ts"; +import { caseInsensitiveToolNameLookup } from "../helpers/toolCallHelper.ts"; import { hasToolCallShim, applyToolCallShimToBuffer } from "../helpers/toolCallShim.ts"; import { appendToolCallArgumentDelta } from "../../utils/toolCallArguments.ts"; import { isAbortFinishReason } from "../../utils/finishReason.ts"; @@ -284,7 +285,7 @@ export function openaiToClaudeResponse(chunk, state) { // Strip the Claude OAuth prefix from an incoming tool name (if any). const incomingName = (() => { let n = tc.function?.name || ""; - n = state.toolNameMap?.get(n) || n; + n = caseInsensitiveToolNameLookup(n, state.toolNameMap) ?? n; if (n.startsWith(CLAUDE_OAUTH_TOOL_PREFIX)) n = n.slice(CLAUDE_OAUTH_TOOL_PREFIX.length); return n; })(); diff --git a/open-sse/translator/webTools.ts b/open-sse/translator/webTools.ts index ecc291ce26..7ae5c7732b 100644 --- a/open-sse/translator/webTools.ts +++ b/open-sse/translator/webTools.ts @@ -356,24 +356,18 @@ export function toArgumentsString(value: unknown): string { } } -/** - * Serialize an OpenAI `tools` array into a system-prompt block that instructs the - * web UI model how to invoke a tool (emit a `{...}` block). Returns an - * empty string when there are no usable tools. - * - * Each invocation generates a per-request nonce that is embedded in the tool format - * instructions. The parser (parseToolCallsFromText) requires this nonce in the model's - * `` JSON to distinguish legitimate tool calls from bare JSON, code-fenced JSON, - * or copy-attacked envelopes (#9343). - */ -export function serializeToolsToPrompt(tools: unknown): string { - if (!Array.isArray(tools) || tools.length === 0) return ""; +export interface SerializeToolOptions { + /** Hardened mode for thinking/reasoning models: repeat the instruction + * both before AND after the tool list, use a more distinctive tag format, + * and explicitly tell the model not to claim tools are unavailable. */ + hardened?: boolean; +} - const nonce = getToolNonce(tools); - if (!nonce) return ""; +// ── Tool list rendering (shared between standard and hardened) ───────────────── +function renderToolList(tools: OpenAIToolDef[]): string[] { const lines: string[] = []; - for (const t of tools as OpenAIToolDef[]) { + for (const t of tools) { const fn = t?.function; if (!fn?.name) continue; const desc = typeof fn.description === "string" && fn.description ? fn.description : ""; @@ -387,9 +381,47 @@ export function serializeToolsToPrompt(tools: unknown): string { `- ${fn.name}${desc ? `: ${desc}` : ""}${params ? `\n parameters: ${params}` : ""}` ); } + return lines; +} +/** + * Serialize an OpenAI `tools` array into a system-prompt block that instructs the + * web UI model how to invoke a tool (emit a `{...}` block). Returns an + * empty string when there are no usable tools. + * + * When `options.hardened` is set (intended for thinking/reasoning models), the + * contract is more emphatic: the `` format example is shown before the tool + * list, an explicit "IMPORTANT" directive is appended after the list, and the + * model is told not to claim tools are unavailable. + */ +export function serializeToolsToPrompt(tools: unknown, options?: SerializeToolOptions): string { + if (!Array.isArray(tools) || tools.length === 0) return ""; + + // #9343: the per-request nonce is mandatory in BOTH modes — the parser rejects + // any JSON without the matching `_nonce` binding. + const nonce = getToolNonce(tools); + if (!nonce) return ""; + + const defs = tools as OpenAIToolDef[]; + const lines = renderToolList(defs); if (lines.length === 0) return ""; + if (options?.hardened) { + return [ + "You have access to the following tools and you MUST use them when appropriate.", + "", + `{"name": "", "arguments": { ... }, "_nonce": "${nonce}"}`, + `Every tool call MUST include the secret binding "_nonce": "${nonce}" exactly as shown.`, + "", + "Available tools:", + ...lines, + "", + "IMPORTANT: You CAN and MUST use these tools. Do NOT say you cannot use tools or that", + "tools are unavailable — you have them and they are ready. If a task requires a tool,", + "call it using the TOOL block format described above.", + ].join("\n"); + } + return [ "You can call tools. To call a tool, reply with a single line containing a block", `with JSON that includes the secret binding "_nonce": "${nonce}":`, @@ -514,13 +546,14 @@ interface ToolPrepResult { */ export function prepareToolMessages( bodyObj: Record, - messages: Array<{ role: string; content: unknown }> + messages: Array<{ role: string; content: unknown }>, + options?: SerializeToolOptions ): ToolPrepResult { const requestedTools = bodyObj.tools; const hasTools = Array.isArray(requestedTools) && requestedTools.length > 0; if (!hasTools) return { hasTools: false, requestedTools, effectiveMessages: messages }; - const toolPrompt = serializeToolsToPrompt(requestedTools); + const toolPrompt = serializeToolsToPrompt(requestedTools, options); return { hasTools: true, requestedTools, diff --git a/open-sse/utils/aiSdkCompat.ts b/open-sse/utils/aiSdkCompat.ts index fb26394a4b..2973ac06a0 100644 --- a/open-sse/utils/aiSdkCompat.ts +++ b/open-sse/utils/aiSdkCompat.ts @@ -130,6 +130,16 @@ export function resolveStreamFlag( return false; } + // OpenAI Chat Completions: omitted `stream` defaults to false per the OpenAI + // contract. A client that says nothing is asking for a JSON object, not an + // SSE event stream. Honor a pure text/event-stream Accept as an explicit SSE + // opt-in; otherwise default to non-stream. The application/json check above + // already handles the Vercel/OpenAI SDK mixed-signature case. + if (sourceFormat === "openai") { + if (acceptsEventStream) return true; + return false; + } + // No explicit stream param — preserve OmniRoute's streaming default unless // the client explicitly asks for JSON and does not also accept SSE. return !clientWantsJsonResponse(acceptHeader); diff --git a/open-sse/utils/earlyStreamKeepalive.ts b/open-sse/utils/earlyStreamKeepalive.ts index 2a7fe25dff..b8c3c631f8 100644 --- a/open-sse/utils/earlyStreamKeepalive.ts +++ b/open-sse/utils/earlyStreamKeepalive.ts @@ -1,13 +1,18 @@ /** - * Early SSE keepalive wrapper for streaming route handlers. + * @file earlyStreamKeepalive.ts + * @description Early SSE keepalive wrapper so short idle-read clients stay connected + * while the handler waits on upstream first-byte (reasoning models, combo failover). + * + * @changes + * - [2026-07-28] [Cursor Grok 4.5] - Scrub omniroute from client-facing keepalive id/model/comment frames + * - [2026-07-28] [Cursor Grok 4.5] - Neutralize Responses startup thinking text (no OmniRoute brand leak) * * Strict HTTP clients (notably Codex CLI's `reqwest`, which has a ~5s idle-read * timeout) drop the connection if no bytes arrive shortly after the request. - * OmniRoute, however, holds the streaming response until `ensureStreamReadiness` - * observes the upstream's first useful byte — which can exceed 5s for reasoning - * models that "think" before emitting any token (#2544). `curl` has no such - * idle timeout, so it was never affected, which is why the bug looked - * client-specific. + * The proxy holds the streaming response until `ensureStreamReadiness` observes + * the upstream's first useful byte — which can exceed 5s for reasoning models + * that "think" before emitting any token (#2544). `curl` has no such idle + * timeout, so it was never affected, which is why the bug looked client-specific. * * This wrapper keeps the connection warm without disturbing the handler's * internal logic (combo failover, stream readiness, account cooldown all still @@ -27,12 +32,13 @@ */ const ENCODER = new TextEncoder(); -const KEEPALIVE_FRAME = ENCODER.encode(": omniroute-keepalive\n\n"); +const KEEPALIVE_FRAME = ENCODER.encode(": keepalive\n\n"); // OpenAI-compatible keepalive: a syntactically valid empty streaming chunk. // Some OpenAI-compatible clients parse every non-empty SSE line as JSON and // reject legal SSE comments before their first provider chunk arrives. +// id/model stay brand-neutral — these frames go to the client, not upstream. export const OPENAI_KEEPALIVE_FRAME = ENCODER.encode( - 'data: {"id":"omniroute-keepalive","object":"chat.completion.chunk","created":0,"model":"omniroute","choices":[{"index":0,"delta":{},"finish_reason":null}]}\n\n' + 'data: {"id":"chatcmpl-keepalive","object":"chat.completion.chunk","created":0,"model":"keepalive","choices":[{"index":0,"delta":{},"finish_reason":null}]}\n\n' ); // The first slow-path frame must be a valid OpenAI chunk without creating // visible reasoning that clients persist into the conversation. @@ -51,8 +57,9 @@ export const ANTHROPIC_PING_FRAME = ENCODER.encode('event: ping\ndata: {"type":" // real upstream response — once it arrives — starts its own independent // response.created lifecycle from scratch; this placeholder item never // carries a response_id and isn't meant to be continued. -const RESPONSES_STARTUP_ITEM_ID = "rs_omniroute_keepalive"; -const STARTUP_THINKING_TEXT = "OmniRoute: got request, sending to provider"; +const RESPONSES_STARTUP_ITEM_ID = "rs_keepalive"; +// Brand-neutral placeholder — clients persist this as visible reasoning. +const STARTUP_THINKING_TEXT = "✨"; export const RESPONSES_STARTUP_THINKING_FRAME = ENCODER.encode( [ { @@ -144,7 +151,7 @@ export type EarlyStreamKeepaliveOptions = { signal?: AbortSignal | null; /** * Frame emitted on each keepalive tick. Defaults to an SSE comment - * (`: omniroute-keepalive`). Anthropic-format routes (/v1/messages) must pass + * (`: keepalive`). Anthropic-format routes (/v1/messages) must pass * `ANTHROPIC_PING_FRAME` instead, because Anthropic clients ignore SSE comments * for their stream watchdog and only a real `event: ping` keeps them from aborting. */ diff --git a/open-sse/utils/proxyFetch.ts b/open-sse/utils/proxyFetch.ts index 6fa2c8c29c..a5080c6fbb 100644 --- a/open-sse/utils/proxyFetch.ts +++ b/open-sse/utils/proxyFetch.ts @@ -382,6 +382,10 @@ export function resolveProxyForRequest(targetUrl) { const contextProxy = proxyContext.getStore(); if (contextProxy) { + // #9551: NO_PROXY must bypass context-proxy too + if (target && noProxyMatch(targetUrl)) { + return { source: "direct", proxyUrl: null }; + } return { source: "context", proxyUrl: proxyConfigToUrl(contextProxy) }; } diff --git a/open-sse/utils/publicCreds.ts b/open-sse/utils/publicCreds.ts index 4f77a5591c..688cd759ac 100644 --- a/open-sse/utils/publicCreds.ts +++ b/open-sse/utils/publicCreds.ts @@ -207,6 +207,15 @@ const EMBEDDED_DEFAULTS = { // Firefly credits balance endpoint public x-api-key (`SunbreakWebUI1`) from // GET firefly.adobe.io/v1/credits/balance browser traffic. adobe_firefly_balance_api_key: [60, 24, 0, 11, 0, 10, 20, 31, 50, 72, 18, 32, 43, 93], + // Raycast Pro V2 request-signature secret (#8895). Community-extracted from the + // public Raycast macOS client — the SAME value ships to every install, so it is + // public by design, not a per-user credential. Overridable via RAYCAST_SIG_SECRET + // or providerSpecificData.sigSecret. + raycast_sig_secret: [ + 89, 15, 13, 93, 71, 90, 65, 67, 86, 24, 71, 67, 1, 9, 91, 0, 73, 64, 87, 88, 93, 90, 91, 68, 12, + 20, 18, 3, 21, 70, 66, 3, 13, 11, 1, 72, 69, 87, 88, 95, 87, 88, 17, 94, 20, 67, 92, 27, 72, 68, + 3, 10, 92, 6, 21, 21, 84, 95, 14, 15, 88, 70, 95, 77, + ], } as const; export type EmbeddedDefaultKey = keyof typeof EMBEDDED_DEFAULTS; diff --git a/open-sse/utils/reasoningFields.ts b/open-sse/utils/reasoningFields.ts index e0d045e10b..a8b858e25e 100644 --- a/open-sse/utils/reasoningFields.ts +++ b/open-sse/utils/reasoningFields.ts @@ -1,3 +1,5 @@ +import { stripInternalReasoningPlaceholder } from "./reasoningPlaceholder.ts"; + type JsonRecord = Record; export function asReasoningRecord(value: unknown): JsonRecord { @@ -69,4 +71,17 @@ export function copyOpenAICompatibleReasoningFields(source: JsonRecord, target: const mirrored = getUnsupportedReasoningValue(source); if (mirrored) target.reasoning_content = mirrored; } + // ponytail: the internal replay placeholder is request scaffolding, never + // real reasoning — models echo it and it poisons client history + the cache + // (#8081 echo). Strip it from anything we forward to the client. + if (typeof target.reasoning_content === "string") { + const stripped = stripInternalReasoningPlaceholder(target.reasoning_content); + if (stripped === "") delete target.reasoning_content; + else if (stripped !== target.reasoning_content) target.reasoning_content = stripped; + } + if (typeof target.reasoning === "string") { + const stripped = stripInternalReasoningPlaceholder(target.reasoning); + if (stripped === "") delete target.reasoning; + else if (stripped !== target.reasoning) target.reasoning = stripped; + } } diff --git a/open-sse/utils/reasoningPlaceholder.ts b/open-sse/utils/reasoningPlaceholder.ts index 915af48c92..4e0ab3646c 100644 --- a/open-sse/utils/reasoningPlaceholder.ts +++ b/open-sse/utils/reasoningPlaceholder.ts @@ -21,6 +21,8 @@ export function isInternalReasoningPlaceholder(value: unknown): boolean { * real content, or streamed deltas glue together with their spaces eaten. */ export function stripInternalReasoningPlaceholder(value: string): string { + if (!value.includes(NON_ANTHROPIC_THINKING_PLACEHOLDER)) return value; + const stripped = value.replaceAll(NON_ANTHROPIC_THINKING_PLACEHOLDER, ""); return stripped.trim() === "" ? "" : stripped; } diff --git a/open-sse/utils/registeredEffortVariants.ts b/open-sse/utils/registeredEffortVariants.ts new file mode 100644 index 0000000000..06e2d5dfc6 --- /dev/null +++ b/open-sse/utils/registeredEffortVariants.ts @@ -0,0 +1,36 @@ +import { getProviderModels } from "../config/providerModels.ts"; + +const REGISTERED_EFFORT_SUFFIXES = ["none", "low", "medium", "high", "max", "xhigh"] as const; + +/** + * Return the registered base model for an explicit effort variant. + * + * Both the exact variant and its base must exist in the provider registry. + * Callers with an authoritative live catalog must additionally verify that + * the returned base model is present in that live catalog. + */ +export function getRegisteredProviderEffortBaseModelId( + providerId: string, + modelId: string +): string | null { + const providerModels = getProviderModels(providerId); + + if (!providerModels.some((candidate) => candidate.id === modelId)) { + return null; + } + + for (const effort of REGISTERED_EFFORT_SUFFIXES) { + const suffix = `-${effort}`; + if (!modelId.endsWith(suffix)) continue; + + const baseModelId = modelId.slice(0, -suffix.length); + + return providerModels.some((candidate) => candidate.id === baseModelId) ? baseModelId : null; + } + + return null; +} + +export function isRegisteredProviderEffortVariant(providerId: string, modelId: string): boolean { + return getRegisteredProviderEffortBaseModelId(providerId, modelId) !== null; +} diff --git a/open-sse/utils/sseHeartbeat.ts b/open-sse/utils/sseHeartbeat.ts index a8c48a8732..eb58cd4fa4 100644 --- a/open-sse/utils/sseHeartbeat.ts +++ b/open-sse/utils/sseHeartbeat.ts @@ -1,3 +1,10 @@ +/** + * @file sseHeartbeat.ts + * @description Mid-stream SSE heartbeat transform (comment / Anthropic ping / OpenAI chunk). + * + * @changes + * - [2026-07-28] [Cursor Grok 4.5] - Brand-neutral default OpenAI keepalive id/model + */ export const DEFAULT_SSE_HEARTBEAT_INTERVAL_MS = 15_000; export const HEARTBEAT_SHAPES = { @@ -37,10 +44,10 @@ function buildHeartbeatPayload( return 'data: {"type":"response.in_progress"}\n\n'; case HEARTBEAT_SHAPES.OPENAI_CHUNK: { const payload = { - id: opts.chunkId ?? "omniroute-keepalive", + id: opts.chunkId ?? "chatcmpl-keepalive", object: "chat.completion.chunk", created: Math.floor(Date.now() / 1000), - model: opts.chunkModel ?? "omniroute", + model: opts.chunkModel ?? "keepalive", choices: [{ index: 0, delta: {}, finish_reason: null }], }; return `data: ${JSON.stringify(payload)}\n\n`; diff --git a/open-sse/utils/stream.ts b/open-sse/utils/stream.ts index 45b0d92c0c..2b16cfe64d 100644 --- a/open-sse/utils/stream.ts +++ b/open-sse/utils/stream.ts @@ -70,7 +70,10 @@ import { hasUnsupportedReasoningSignal, } from "./reasoningFields.ts"; import { applyThinkTag, flushThink, initThinkState } from "./thinkTagParser.ts"; -import { restoreOpenAIToolNames } from "../translator/helpers/toolCallHelper.ts"; +import { + caseInsensitiveToolNameLookup, + restoreOpenAIToolNames, +} from "../translator/helpers/toolCallHelper.ts"; import { normalizeFinalOpenAIStreamChunk } from "./openAIStreamChunk.ts"; /** @@ -578,7 +581,7 @@ function restoreClaudePassthroughToolUseName(parsed: JsonRecord, toolNameMap: un : null; if (!block || block.type !== "tool_use" || typeof block.name !== "string") return false; - const restoredName = toolNameMap.get(block.name) ?? block.name; + const restoredName = caseInsensitiveToolNameLookup(block.name, toolNameMap) ?? block.name; if (restoredName === block.name) return false; block.name = restoredName; return true; @@ -687,7 +690,8 @@ export function createSSEStream(options: StreamOptions = {}) { // Responses API, Anthropic SSE, and Antigravity/cloudcode terminate on // their own protocol events (response.completed / message_stop / last // response candidate respectively). - const shouldEmitDoneTerminator = !clientExpectsResponsesStream && !clientExpectsClaudeStream && !clientExpectsAntigravityStream; + const shouldEmitDoneTerminator = + !clientExpectsResponsesStream && !clientExpectsClaudeStream && !clientExpectsAntigravityStream; let buffer = ""; let usage: UsageTokenRecord | null = null; @@ -1047,9 +1051,9 @@ export function createSSEStream(options: StreamOptions = {}) { return; } - // #7095/#7176 reconciliation: compute the visible placeholder WITHOUT - // mutating `item` — the encrypted reasoning item (and its `encrypted_content`, - // required by Codex for subsequent requests) is forwarded to the client intact. + // #7176/#7243: only synthesize summary events from real upstream plaintext — + // never mutate `item` and never fabricate alarming placeholder text for + // encrypted-only reasoning (`encrypted_content` still forwards intact). const visibleSummary = getVisibleResponsesReasoningSummaryText(item); if (!visibleSummary) { @@ -2460,11 +2464,7 @@ export function createSSEStream(options: StreamOptions = {}) { usage, responseBody, providerPayload: providerPayloadCollector.build( - buildStreamSummaryFromEvents( - providerPayloadCollector.getEvents(), - sourceFormat, - model - ), + responseBody, { includeEvents: false } ), clientPayload: clientPayloadCollector.build(responseBody, { @@ -2735,11 +2735,7 @@ export function createSSEStream(options: StreamOptions = {}) { usage: state?.usage, responseBody, providerPayload: providerPayloadCollector.build( - buildStreamSummaryFromEvents( - providerPayloadCollector.getEvents(), - targetFormat, - model - ), + responseBody, { includeEvents: false } ), clientPayload: clientPayloadCollector.build(responseBody, { @@ -2782,7 +2778,7 @@ export function createSSETransformStreamWithLogger( body: unknown = null, onComplete: ((payload: StreamCompletePayload) => void) | null = null, apiKeyInfo: unknown = null, - onFailure: ((payload: StreamFailurePayload) => void | Promise) | null = null, + onFailure: ((payload: StreamFailurePayload) => boolean | void | Promise) | null = null, copilotCompatibleReasoning = false, suppressThinkClose = false, customToolNames: ReadonlySet = new Set(), @@ -2817,7 +2813,7 @@ export function createPassthroughStreamWithLogger( body: unknown = null, onComplete: ((payload: StreamCompletePayload) => void) | null = null, apiKeyInfo: unknown = null, - onFailure: ((payload: StreamFailurePayload) => void | Promise) | null = null, + onFailure: ((payload: StreamFailurePayload) => boolean | void | Promise) | null = null, clientResponseFormat: string | null = null, requestToolIdentityMap: Map | null = null ) { diff --git a/open-sse/utils/thinkingBudget.ts b/open-sse/utils/thinkingBudget.ts new file mode 100644 index 0000000000..b97078f782 --- /dev/null +++ b/open-sse/utils/thinkingBudget.ts @@ -0,0 +1,72 @@ +/** + * Thinking-budget helpers extracted from base.ts. + * + * Pure utilities for reading / clamping the thinking budget fields that + * different providers nest inside the request body. + */ + +export function hasActiveClaudeThinking(body: Record): boolean { + const thinking = body.thinking as Record | undefined; + return thinking?.type === "enabled" || thinking?.type === "adaptive"; +} + +/** + * Collect every `thinkingConfig` object in a transformed request body that holds + * a thinking budget, wherever the provider's envelope nests it: + * - body.generationConfig.thinkingConfig (native Gemini / openai→gemini) + * - body.request.generationConfig.thinkingConfig (Antigravity Cloud Code envelope) + * Returns only objects that actually carry a `thinkingBudget`/`thinking_budget` + * field — a request without thinking config is never mutated. + */ +export function collectThinkingConfigs(body: unknown): Array> { + if (!body || typeof body !== "object") return []; + const root = body as Record; + const configs: Array> = []; + const envelopes: unknown[] = [ + root.generationConfig, + (root.request as Record | undefined)?.generationConfig, + ]; + for (const env of envelopes) { + if (!env || typeof env !== "object") continue; + const tc = (env as Record).thinkingConfig; + if (tc && typeof tc === "object") { + const tcr = tc as Record; + if ("thinkingBudget" in tcr || "thinking_budget" in tcr) configs.push(tcr); + } + } + return configs; +} + +/** + * Read the first thinking budget found in the body (any supported nest / naming). + * Returns null when the body carries no readable numeric budget. + */ +export function readNestedThinkingBudget(body: unknown): number | null { + for (const tc of collectThinkingConfigs(body)) { + const raw = tc.thinkingBudget ?? tc.thinking_budget; + const n = Number(raw); + if (Number.isFinite(n)) return n; + } + return null; +} + +/** + * Clamp every thinking budget in the body down to `max` (only lowers; never + * raises a budget already below max). Mutates in place. Returns true when at + * least one budget was actually lowered (i.e. a retry would send a different + * body) — false means the 400 was not caused by an over-max budget we hold, so + * retrying would resend an identical body and loop. + */ +export function clampNestedThinkingBudget(body: unknown, max: number): boolean { + let changed = false; + for (const tc of collectThinkingConfigs(body)) { + for (const key of ["thinkingBudget", "thinking_budget"] as const) { + const n = Number(tc[key]); + if (Number.isFinite(n) && n > max) { + tc[key] = max; + changed = true; + } + } + } + return changed; +} diff --git a/open-sse/utils/usageTracking.ts b/open-sse/utils/usageTracking.ts index 93d41c83cc..398d1d5906 100644 --- a/open-sse/utils/usageTracking.ts +++ b/open-sse/utils/usageTracking.ts @@ -6,6 +6,7 @@ import { appendRequestLog } from "@/lib/usageDb"; import { getLoggedInputTokens, getLoggedOutputTokens, + getNoCacheTokens, getPromptCacheCreationTokens, getPromptCacheReadTokens, } from "@/lib/usage/tokenAccounting"; @@ -290,6 +291,7 @@ export function normalizeUsage(usage) { assignNumber("cache_read_input_tokens", usage?.cache_read_input_tokens); assignNumber("cache_creation_input_tokens", usage?.cache_creation_input_tokens); assignNumber("cached_tokens", usage?.cached_tokens); + assignNumber("no_cache_tokens", usage?.no_cache_tokens); assignNumber("reasoning_tokens", usage?.reasoning_tokens); // xAI's exact provider-reported cost (port of decolua/9router#2453, capability A — // @ryanngit). Ticks → USD conversion happens in costCalculator.ts, not here. @@ -416,6 +418,9 @@ export function extractUsage(chunk) { chunk.usage.input_tokens_details?.cached_tokens ?? chunk.usage.prompt_cache_hit_tokens ?? chunk.usage.cached_tokens, + cache_read_input_tokens: chunk.usage.cache_read_input_tokens, + cache_creation_input_tokens: chunk.usage.cache_creation_input_tokens, + no_cache_tokens: chunk.usage.no_cache_tokens, reasoning_tokens: chunk.usage.completion_tokens_details?.reasoning_tokens ?? chunk.usage.output_tokens_details?.reasoning_tokens ?? @@ -609,6 +614,11 @@ export function logUsage( const cacheCreation = getPromptCacheCreationTokens(usage); if (cacheCreation) msg += ` | cache_create=${cacheCreation}`; + // Non-cached (fresh) input tokens — informational only, already included in + // prompt_tokens (Command Code reports inputTokenDetails.noCacheTokens). + const noCache = getNoCacheTokens(usage); + if (noCache) msg += ` | no_cache=${noCache}`; + const reasoning = usage.reasoning_tokens; if (reasoning) msg += ` | reasoning=${reasoning}`; diff --git a/package-lock.json b/package-lock.json index 7c321b3421..eb6d5975f2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -80,7 +80,7 @@ "sqlite-vec": "^0.1.9", "tailwind-merge": "^3.6.0", "tsx": "^4.23.0", - "undici": "^8.3.0", + "undici": "^8.10.0", "update-notifier": "^7.3.1", "uuid": "^14.0.0", "ws": "^8.18.0", @@ -104,7 +104,7 @@ "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@types/better-sqlite3": "^7.6.13", - "@types/bun": "latest", + "@types/bun": "*", "@types/node": "^26.1.0", "@types/react": "^19.2.15", "@types/react-dom": "^19.2.3", @@ -133,6 +133,7 @@ "lint-staged": "^17.0.8", "lockfile-lint": "^5.0.0", "node-loader": "^2.1.0", + "opencode-ai": "1.18.8", "playwright-ctrf-json-reporter": "^0.0.29", "prettier": "^3.8.3", "promptfoo": "^0.121.18", @@ -28739,6 +28740,205 @@ } } }, + "node_modules/opencode-ai": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-ai/-/opencode-ai-1.18.8.tgz", + "integrity": "sha512-eZvYK0rIc/NUDQ+s3LsO9gyUU3MswsbNOLZz06iPwVhbg/2jF6bkTaroBgiIdFWKwUn5sj+kSMc4TBYxFkMrNQ==", + "cpu": [ + "arm64", + "x64" + ], + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32" + ], + "bin": { + "opencode": "bin/opencode.exe" + }, + "optionalDependencies": { + "opencode-darwin-arm64": "1.18.8", + "opencode-darwin-x64": "1.18.8", + "opencode-darwin-x64-baseline": "1.18.8", + "opencode-linux-arm64": "1.18.8", + "opencode-linux-arm64-musl": "1.18.8", + "opencode-linux-x64": "1.18.8", + "opencode-linux-x64-baseline": "1.18.8", + "opencode-linux-x64-baseline-musl": "1.18.8", + "opencode-linux-x64-musl": "1.18.8", + "opencode-windows-arm64": "1.18.8", + "opencode-windows-x64": "1.18.8", + "opencode-windows-x64-baseline": "1.18.8" + } + }, + "node_modules/opencode-darwin-arm64": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-darwin-arm64/-/opencode-darwin-arm64-1.18.8.tgz", + "integrity": "sha512-ZZCIEgTvHxOHk52Aeqhq59t/R0aqs29bPIgu45XE4rkgjmn/XCkTWalCPtyzJHipdcEbq/g0lqsE1OlJV0oNbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/opencode-darwin-x64": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-darwin-x64/-/opencode-darwin-x64-1.18.8.tgz", + "integrity": "sha512-2EXRMJbRKnFPWI9oDU9tb7jDGmKiPmfjCLtwJMe3EF57h5wfcdEH9sP25bR3Og5NbE2M+PtMcJm0jMeHn2XoLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/opencode-darwin-x64-baseline": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-darwin-x64-baseline/-/opencode-darwin-x64-baseline-1.18.8.tgz", + "integrity": "sha512-eLXa2tK9LRuZ5e20QG2k4dmWAA5xnLgJ1afRTSD0/ybE6CAeK02i8vFCnFFDaxuBo+gnq+yqO8AkqvN1m64V/Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/opencode-linux-arm64": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-linux-arm64/-/opencode-linux-arm64-1.18.8.tgz", + "integrity": "sha512-7kj3c9JEdryHgK+o8zE/N9KzTOdbiDn6KpY8dl+hM9n5Cnmxezx4IAlgJeC9QxpIx8Omop6CYuZ+17KfrKdKLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/opencode-linux-arm64-musl": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-linux-arm64-musl/-/opencode-linux-arm64-musl-1.18.8.tgz", + "integrity": "sha512-tww5TF/LIOv/GoTNyzGYgqDRhbJrhoMu8R+p5yD/SpnXPg3rcfYREw2wRy9yikyPU9sAQksuIIteTsyGerPjlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/opencode-linux-x64": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-linux-x64/-/opencode-linux-x64-1.18.8.tgz", + "integrity": "sha512-Sm4fbQ9BdLI6hgN6FYYX8Nql+Sqe/2EKHJu3iWg0UYs93AXN4ROi0rvOmRbMk+ycYgOchb0hL6Ti2opxLx17sg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/opencode-linux-x64-baseline": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-linux-x64-baseline/-/opencode-linux-x64-baseline-1.18.8.tgz", + "integrity": "sha512-egeEF4tk1rK9flIQjjeSVB9cR/X3zUti0pNAHW6ROJkNkj72z2C2FmjK1hZbfjtteCueMXPLptS23JROHGWL1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/opencode-linux-x64-baseline-musl": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-linux-x64-baseline-musl/-/opencode-linux-x64-baseline-musl-1.18.8.tgz", + "integrity": "sha512-S+438BXs48gLeXX/ya4TSNytDy9mliU3sOAf6j9rfFjzGiF/S08LedemSAnHkr0riBtamik1aRPSmTjhQ0dOBg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/opencode-linux-x64-musl": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-linux-x64-musl/-/opencode-linux-x64-musl-1.18.8.tgz", + "integrity": "sha512-c+E4Zsp0DYVcuqcDtgxw/4YcFLrVYWdGBR8x4CzpW48ga3RshaH+BlmUiy+GY0yr1x6UR+e2V3w4uzvzm/L9UQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/opencode-windows-arm64": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-windows-arm64/-/opencode-windows-arm64-1.18.8.tgz", + "integrity": "sha512-7NjdtEIiX28kmsKD9jHbFG4bbwBB5T4dAe2UwdnOqCBb2cl+ETV5eO6kbdC/xWxrgOghgZM1Wtw791T5pQPyag==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/opencode-windows-x64": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-windows-x64/-/opencode-windows-x64-1.18.8.tgz", + "integrity": "sha512-G+NEgEMvu/dEYshH5IaqHVTmsHVuGdORBvVmgphFiknT7q/NXPuoZCMtMIdfNlEFbu54BlzRDdJCR3Mqe98gUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/opencode-windows-x64-baseline": { + "version": "1.18.8", + "resolved": "https://registry.npmjs.org/opencode-windows-x64-baseline/-/opencode-windows-x64-baseline-1.18.8.tgz", + "integrity": "sha512-IGbjFyWoSN9rdGUJX7TWkQ1Yl673Q3dDna54b5NtqeRcZ839p+Z47zzM5m883HKAxrdKCC6Z22HYuDcXLV0laA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -34958,9 +35158,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-8.9.0.tgz", - "integrity": "sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", + "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", "license": "MIT", "engines": { "node": ">=22.19.0" diff --git a/package.json b/package.json index 33328fa4fc..638f959e1c 100644 --- a/package.json +++ b/package.json @@ -190,6 +190,7 @@ "check:bundle-size": "node scripts/check/check-bundle-size.mjs", "check:circular-deps": "node scripts/check/check-circular-deps.mjs", "check:mutation-ratchet": "node scripts/check/check-mutation-ratchet.mjs", + "check:rtl-ratchet": "node scripts/check/check-rtl-ratchet.mjs", "check:licenses": "node scripts/check/check-licenses.mjs", "check:pr-evidence": "node scripts/check/check-pr-evidence.mjs", "check:vuln-ratchet": "node scripts/check/check-vuln-ratchet.mjs", @@ -206,9 +207,11 @@ "typecheck:core": "tsc --pretty false -p tsconfig.typecheck-core.json", "typecheck:noimplicit:core": "tsc --pretty false -p tsconfig.typecheck-noimplicit-core.json", "check:dashboard-typecheck": "node scripts/check/check-dashboard-typecheck.mjs", + "check:open-sse-typecheck": "node scripts/check/check-open-sse-typecheck.mjs", "backfill-aggregation": "node --import tsx src/scripts/backfillAggregation.ts", "env:sync": "node scripts/dev/sync-env.mjs", "test:integration": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"", + "test:integration:ci": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 --test-shard=$TEST_SHARD tests/integration/*.test.ts \"tests/integration/combo-matrix/*.test.ts\"", "test:combo:matrix": "cross-env DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-matrix/*.test.ts\"", "test:combo:live": "cross-env RUN_COMBO_LIVE=1 DISABLE_SQLITE_AUTO_BACKUP=true node --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=1 \"tests/integration/combo-live/*.live.test.ts\"", "test:combo:live:vps": "node scripts/test/combo-live-vps.mjs", @@ -238,6 +241,7 @@ "prepare": "husky", "system-info": "node scripts/dev/system-info.mjs", "build:cli-api": "node --import tsx/esm scripts/cli/generate-api-commands.mjs", + "postbuild": "node scripts/build/colocate-standalone.mjs", "release:contributors": "node scripts/release/gen-contributors.mjs", "release:uncovered": "node scripts/release/list-uncovered-commits.mjs", "test:coverage:runner": "node --max-old-space-size=8192 --import tsx/esm --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 tests/unit/*.test.ts \"tests/unit/{api,auth,authz,build,cli,cli-helper,combo,compression,correctness,cors,db,db-adapters,docs,gamification,guardrails,lib,mcp,memory,runtime,security,services,settings,shared,ui,usage}/**/*.test.ts\" \"tests/unit/**/*.test.mjs\" && cross-env DISABLE_SQLITE_AUTO_BACKUP=true NODE_OPTIONS=--max-old-space-size=8192 c8 --merge-async --output-dir coverage --exclude=tests/** --exclude=**/*.test.* --reporter=text-summary --reporter=html --reporter=json-summary --reporter=lcov --check-coverage --statements 60 --lines 60 --functions 60 --branches 60 node --max-old-space-size=8192 --import tsx --import ./open-sse/utils/setupPolyfill.ts --import ./tests/_setup/isolateDataDir.ts --test --test-force-exit --test-concurrency=8 \"tests/unit/dashboard/**/*.test.ts\" && npm run test:unit:serial", @@ -310,7 +314,7 @@ "sqlite-vec": "^0.1.9", "tailwind-merge": "^3.6.0", "tsx": "^4.23.0", - "undici": "^8.3.0", + "undici": "^8.10.0", "update-notifier": "^7.3.1", "uuid": "^14.0.0", "ws": "^8.18.0", @@ -369,6 +373,7 @@ "lint-staged": "^17.0.8", "lockfile-lint": "^5.0.0", "node-loader": "^2.1.0", + "opencode-ai": "1.18.8", "playwright-ctrf-json-reporter": "^0.0.29", "prettier": "^3.8.3", "promptfoo": "^0.121.18", @@ -400,6 +405,15 @@ "sharp" ] }, + "allowScripts": { + "better-sqlite3": true, + "esbuild": true, + "@swc/core": true, + "@parcel/watcher": true, + "keytar": true, + "protobufjs": true, + "unrs-resolver": true + }, "overrides": { "dompurify": "^3.4.12", "fast-xml-parser": "^5.10.1", diff --git a/public/providers/soniox.svg b/public/providers/soniox.svg new file mode 100644 index 0000000000..343c3d5f33 --- /dev/null +++ b/public/providers/soniox.svg @@ -0,0 +1 @@ +Soniox diff --git a/scripts/build/assembleStandalone.mjs b/scripts/build/assembleStandalone.mjs index 7bda5fa527..3b9842e45a 100644 --- a/scripts/build/assembleStandalone.mjs +++ b/scripts/build/assembleStandalone.mjs @@ -48,6 +48,10 @@ import fs from "node:fs/promises"; import fsSync from "node:fs"; import path from "node:path"; +import { + colocateLlmlinguaOptionals, + SEED_PACKAGES, +} from "./colocateOptionals.mjs"; /** * Check whether a path exists (async). @@ -736,6 +740,19 @@ export function assembleStandalone({ // 6. Optionally copy native assets + extra modules (synchronous) if (copyNatives) { copyNativeAssetsAndExtraModules(projectRoot, resolvedOutDir); + + // #9166: dynamically imported LLMLingua packages are not reliably traced + // into the standalone bundle. Copy their complete dependency closure from + // the installed root tree without overwriting packages already traced by + // Next.js. Include transformers here so its ONNX runtime closure is also + // guaranteed in Docker/standalone builds. + colocateLlmlinguaOptionals({ + rootDir: projectRoot, + targetNodeModulesDir: path.join(resolvedOutDir, "node_modules"), + seeds: [...SEED_PACKAGES, "@huggingface/transformers"], + log: (message) => + console.log(`[assembleStandalone] ${message.trim()}`), + }); } // 7. Optionally dereference Turbopack hashed-module symlinks so the bundle is diff --git a/scripts/build/colocate-standalone.mjs b/scripts/build/colocate-standalone.mjs new file mode 100644 index 0000000000..b1bf44f8c0 --- /dev/null +++ b/scripts/build/colocate-standalone.mjs @@ -0,0 +1,100 @@ +#!/usr/bin/env node +/** + * OmniRoute — Co-locate the LLMLingua-2 runtime into the raw Next standalone build. + * + * WHY: `npm run build` produces `.build/next/standalone/` and THIS machine's PM2 + * deployment runs `server.js` from that directory directly (not the assembled + * `dist/` bundle). The standalone trace: + * - does NOT bundle `open-sse/services/compression/engines/llmlingua/onnxWorker.js` + * (dynamically spawned via worker_threads — untraceable by webpack), and + * - does NOT include the optional SLM deps (`@atjsh/llmlingua-2`, + * `@tensorflow/tfjs`, `js-tiktoken`) — they are optionalDependencies and are + * only installed at the ROOT `node_modules`. + * + * Result: after every plain `npm run build`, the LLMLingua engine silently + * fail-opens (text returned unchanged, no error) because the worker's runtime + * anchors (`process.cwd()` = the standalone dir) find neither the worker file + * nor the deps. This script re-applies both, mirroring what prepublish.ts + + * colocateOptionals.mjs do for the `dist/` bundle. + * + * Idempotent + fail-soft: skips quietly when the optional deps are absent at the + * root (the common slim-install case) and never throws into the build. + * + * Run manually after a build, or automatically via the `postbuild` npm hook. + */ +import { cpSync, existsSync, mkdirSync } from "node:fs"; +import { dirname, join } from "node:path"; +import { execFileSync } from "node:child_process"; +import { fileURLToPath } from "node:url"; +import { computeDependencyClosure } from "./colocateOptionals.mjs"; + +const ROOT = dirname(dirname(dirname(fileURLToPath(import.meta.url)))); +const STANDALONE = join(ROOT, ".build", "next", "standalone"); + +const WORKER_REL = join( + "open-sse", + "services", + "compression", + "engines", + "llmlingua", + "onnxWorker.js" +); +const GATE_PKG = join("node_modules", "@atjsh", "llmlingua-2", "package.json"); + +const hasOptionals = existsSync( + join(ROOT, "node_modules", "@atjsh", "llmlingua-2", "package.json") +); + +if (!existsSync(STANDALONE)) { + console.log("[colocate-standalone] .build/next/standalone not found — nothing to do."); + process.exit(0); +} +if (!hasOptionals) { + console.log( + "[colocate-standalone] optional SLM deps absent at root node_modules — LLMLingua stays fail-open (slim install)." + ); + process.exit(0); +} + +// 1) Bundle the worker the resolver expects: /open-sse/.../onnxWorker.js +const workerDest = join(STANDALONE, WORKER_REL); +if (!existsSync(workerDest)) { + mkdirSync(dirname(workerDest), { recursive: true }); + try { + execFileSync( + join(ROOT, "node_modules", ".bin", "esbuild"), + [ + join(ROOT, "open-sse", "services", "compression", "engines", "llmlingua", "onnxWorker.ts"), + "--bundle", + "--platform=node", + "--packages=external", + "--format=esm", + `--outfile=${workerDest}`, + ], + { stdio: "inherit" } + ); + console.log("[colocate-standalone] ✅ LLMLingua worker bundled into standalone tree"); + } catch (err) { + console.warn("[colocate-standalone] ⚠️ worker bundle error:", err.message); + } +} else { + console.log("[colocate-standalone] worker already present (skipping bundle)"); +} + +// 2) Co-locate the optional-dep closure (NO-CLOBBER, same semantics as colocateOptionals.mjs) +const srcNm = join(ROOT, "node_modules"); +const dstNm = join(STANDALONE, "node_modules"); +const closure = computeDependencyClosure(srcNm); +let copied = 0; +for (const pkg of closure) { + const src = join(srcNm, pkg); + const dst = join(dstNm, pkg); + if (!existsSync(src)) continue; + if (existsSync(dst)) continue; // no-clobber: keep traced instances (e.g. pinned @huggingface/transformers) + mkdirSync(dirname(dst), { recursive: true }); + cpSync(src, dst, { recursive: true }); + copied++; +} +console.log( + `[colocate-standalone] ✅ optional-dep closure: ${closure.length} packages (copied ${copied})` +); diff --git a/scripts/build/colocateOptionals.mjs b/scripts/build/colocateOptionals.mjs index 5317d2fe8a..91548954b0 100644 --- a/scripts/build/colocateOptionals.mjs +++ b/scripts/build/colocateOptionals.mjs @@ -97,47 +97,81 @@ export function computeDependencyClosure(nodeModulesDir, seeds = SEED_PACKAGES) } /** - * Co-locate the SLM optional closure from `/node_modules` into - * `/dist/node_modules`. No-op when the standalone `dist` bundle or the optional seeds are - * absent, and idempotent once co-located. Never throws. + * Co-locate the SLM optional dependency closure from `/node_modules` + * into a standalone bundle's `node_modules`. * - * @param {{ rootDir: string, log?: (message: string) => void }} opts + * The default destination remains `/dist/node_modules` for the npm + * postinstall path. Standalone builders, including Docker, may provide + * `targetNodeModulesDir`. + * + * Packages already present in the destination are never overwritten. This + * preserves the standalone bundle's pinned dependency instances while filling + * dynamically imported packages that Next.js did not trace. + * + * @param {{ + * rootDir: string, + * targetNodeModulesDir?: string, + * seeds?: string[], + * log?: (message: string) => void + * }} opts * @returns {{ skipped: true, reason: string } * | { skipped: false, copied: number, closure: number }} */ -export function colocateLlmlinguaOptionals({ rootDir, log = () => {} }) { +export function colocateLlmlinguaOptionals({ + rootDir, + targetNodeModulesDir, + seeds = SEED_PACKAGES, + log = () => {}, +}) { const rootNm = join(rootDir, "node_modules"); - const distNm = join(rootDir, "dist", "node_modules"); + const targetNm = targetNodeModulesDir ?? join(rootDir, "dist", "node_modules"); - if (!existsSync(distNm)) { - return { skipped: true, reason: "no standalone dist/node_modules" }; + if (!existsSync(targetNm)) { + return { + skipped: true, + reason: targetNodeModulesDir + ? "no target node_modules" + : "no standalone dist/node_modules", + }; } - // Gate: only run when the optional stack was actually installed (`npm install --include=optional`). - if (!SEED_PACKAGES.every((seed) => existsSync(join(rootNm, seed)))) { + + // Only run when every requested closure root was installed. + if (!seeds.every((seed) => existsSync(join(rootNm, seed)))) { return { skipped: true, reason: "SLM optionals not installed at root" }; } - // Idempotent: the entry package is already co-located → nothing to do. - if (existsSync(join(distNm, "@atjsh", "llmlingua-2"))) { + + const closure = computeDependencyClosure(rootNm, seeds); + + // Check the complete closure rather than only the entry package. A partially + // populated bundle must still receive any missing transitive dependencies. + if ( + closure.length > 0 && + closure.every((name) => existsSync(join(targetNm, name))) + ) { return { skipped: true, reason: "already co-located" }; } - const closure = computeDependencyClosure(rootNm); let copied = 0; for (const name of closure) { - const dest = join(distNm, name); - if (existsSync(dest)) continue; // no-clobber: keep dist's pinned copy (transformers 3.5.2, …) + const dest = join(targetNm, name); + if (existsSync(dest)) continue; + try { mkdirSync(dirname(dest), { recursive: true }); cpSync(join(rootNm, name), dest, { recursive: true }); copied++; } catch (err) { - log(` ⚠️ LLMLingua optional co-location failed for ${name}: ${err.message}`); + log( + ` ⚠️ LLMLingua optional co-location failed for ${name}: ${err.message}` + ); } } if (copied > 0) { - log(` ✅ Co-located ${copied} LLMLingua SLM optional package(s) into dist/node_modules.\n`); + log( + ` ✅ Co-located ${copied} LLMLingua SLM optional package(s) into standalone node_modules.\n` + ); } return { skipped: false, copied, closure: closure.length }; diff --git a/scripts/build/pack-artifact-policy.ts b/scripts/build/pack-artifact-policy.ts index 54f47487a7..49fcd94e95 100644 --- a/scripts/build/pack-artifact-policy.ts +++ b/scripts/build/pack-artifact-policy.ts @@ -126,6 +126,9 @@ export const PACK_ARTIFACT_ROOT_ALLOWED_EXACT_PATHS: string[] = [ // #7802: imported by scripts/build/postinstall.mjs to repair tls-client-node's // native binary (chatgpt-web/claude-web/grok-web/lmarena/perplexity-web transport). "scripts/build/fixTlsClientNodeBinary.mjs", + // #8859: imported by scripts/build/postinstall.mjs to repair playwright-core's + // browser resolution on Termux/Android (no glibc, no bundled browsers). + "scripts/build/fixPlaywrightAndroid.mjs", // #5227: imported at runtime by bin/cli/commands/serve.mjs (heap auto-calibration). "scripts/build/runtime-env.mjs", "scripts/build/sync-env.mjs", diff --git a/scripts/build/postinstall.mjs b/scripts/build/postinstall.mjs index c0450705cf..9570691b46 100644 --- a/scripts/build/postinstall.mjs +++ b/scripts/build/postinstall.mjs @@ -24,7 +24,15 @@ * Fixes: https://github.com/diegosouzapw/OmniRoute/issues/7802 */ -import { copyFileSync, cpSync, existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs"; +import { + copyFileSync, + cpSync, + existsSync, + mkdirSync, + readFileSync, + readdirSync, + writeFileSync, +} from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; @@ -78,7 +86,8 @@ function patchNodeGypCommonGypi() { const variablesMatch = content.match(/('variables'\s*:\s*\{)/); if (variablesMatch) { const insertPos = content.indexOf(variablesMatch[0]) + variablesMatch[0].length; - content = content.slice(0, insertPos) + "\n 'android_ndk_path%': ''," + content.slice(insertPos); + content = + content.slice(0, insertPos) + "\n 'android_ndk_path%': ''," + content.slice(insertPos); writeFileSync(commonGypi, content, "utf8"); console.log(` ✅ Patched common.gypi for Android at ${commonGypi}`); } @@ -398,6 +407,37 @@ async function ensureLlmlinguaOptionals() { } } +/** + * Preflight check for development installs (when standalone dist/ bundle is not present). + * Warns or errors if critical native dependencies like better-sqlite3 were skipped by npm >= 11 + * allowScripts restrictions. + */ +async function verifyDevNativeModules() { + if (hasStandaloneAppBundle(ROOT)) { + return; + } + + const criticalModules = [ + { name: "better-sqlite3", fatal: true }, + { name: "esbuild", fatal: true }, + ]; + + for (const { name, fatal } of criticalModules) { + if (!existsSync(join(ROOT, "node_modules", name))) { + const level = fatal ? "🔴 CRITICAL" : "⚠️ WARNING"; + console.error(`\n ${level}: '${name}' is missing from node_modules/`); + console.error(` This usually happens with npm ≥ 11, which blocks install`); + console.error(` scripts for optional dependencies by default.`); + console.error(`\n Fix options:`); + console.error(` 1. npm approve-scripts ${name} && npm install`); + console.error(` 2. npm pack ${name} && tar -xzf ${name}-*.tgz -C node_modules`); + console.error(` && mv node_modules/package node_modules/${name}`); + console.error(` 3. Downgrade to npm 10: npm install -g npm@10\n`); + } + } +} + +await verifyDevNativeModules(); await fixBetterSqliteBinary(); await fixWreqJsBinary(); await fixTlsClientNodeBinary({ rootDir: ROOT }); diff --git a/scripts/build/prepublish.ts b/scripts/build/prepublish.ts index c899544d83..50cdaf8cbf 100644 --- a/scripts/build/prepublish.ts +++ b/scripts/build/prepublish.ts @@ -22,11 +22,15 @@ import { readdirSync, statSync, chmodSync, + openSync, + readSync, + closeSync, } from "node:fs"; import { join, dirname } from "node:path"; import { fileURLToPath } from "node:url"; import { assembleStandalone } from "./assembleStandalone.mjs"; +import { resolveBundledNpmEntry } from "./resolveNpmEntry.ts"; import { APP_STAGING_ALLOWED_EXACT_PATHS, APP_STAGING_ALLOWED_PATH_PREFIXES, @@ -64,16 +68,35 @@ function resolveLocalBinEntry(packageName: string, binName: string): string | nu } } -function resolveBundledNpmEntry(name: "npm-cli.js" | "npx-cli.js"): string | null { - const candidate = join(dirname(process.execPath), "node_modules", "npm", "bin", name); - return existsSync(candidate) ? candidate : null; -} - /** * Runs a build tool without ever touching a `.cmd` shim. `packageName` is where the * tool lives in the local dependency tree; when it is not installed there the call * falls back to the Node-resolved `npx` entry point, and only then to the shim. */ +/** + * esbuild ≥0.25 ships its `bin/esbuild` as the NATIVE platform executable on + * Linux/macOS (ELF / Mach-O) instead of a JS shim — running it through + * `process.execPath` makes Node parse machine code as JavaScript and crash with + * "SyntaxError: Invalid or unexpected token". Sniff the magic bytes and exec + * native entries directly; JS entries keep going through this Node binary. + */ +function isNativeExecutable(entryPath: string): boolean { + try { + const fd = openSync(entryPath, "r"); + const head = Buffer.alloc(4); + readSync(fd, head, 0, 4, 0); + closeSync(fd); + return ( + (head[0] === 0x7f && head[1] === 0x45 && head[2] === 0x4c && head[3] === 0x46) || // ELF + head.readUInt32BE(0) === 0xfeedfacf || // Mach-O 64 + head.readUInt32BE(0) === 0xcffaedfe || // Mach-O 64 (LE on disk) + (head[0] === 0x4d && head[1] === 0x5a) // PE (Windows MZ) + ); + } catch { + return false; + } +} + function runBuildTool( packageName: string, binName: string, @@ -82,6 +105,10 @@ function runBuildTool( ): void { const localEntry = resolveLocalBinEntry(packageName, binName); if (localEntry) { + if (isNativeExecutable(localEntry)) { + execFileSync(localEntry, [...args], options); + return; + } execFileSync(process.execPath, [localEntry, ...args], options); return; } @@ -409,15 +436,23 @@ if (existsSync(opencodePluginSrc) && existsSync(join(opencodePluginSrc, "package // types). Without this install a fresh CI publish fails at this step. if (!existsSync(join(opencodePluginSrc, "node_modules"))) { const npmEntry = resolveBundledNpmEntry("npm-cli.js"); - if (!npmEntry) { + if (npmEntry) { + execFileSync(process.execPath, [npmEntry, "install", "--no-audit", "--no-fund"], { + cwd: opencodePluginSrc, + stdio: "inherit", + }); + } else if (process.platform !== "win32") { + // No bundled npm entry found (non-standard Node layout). Plain `npm` is + // safe here — the .cmd-shim hazard #8858 guards against is Windows-only. + execFileSync("npm", ["install", "--no-audit", "--no-fund"], { + cwd: opencodePluginSrc, + stdio: "inherit", + }); + } else { throw new Error( "npm-cli.js not found next to the running Node binary; cannot install the plugin dependencies without falling back to a .cmd shim." ); } - execFileSync(process.execPath, [npmEntry, "install", "--no-audit", "--no-fund"], { - cwd: opencodePluginSrc, - stdio: "inherit", - }); } runBuildTool("tsup", "tsup", [], { cwd: opencodePluginSrc, diff --git a/scripts/build/resolveNpmEntry.ts b/scripts/build/resolveNpmEntry.ts new file mode 100644 index 0000000000..b19bcb1fb2 --- /dev/null +++ b/scripts/build/resolveNpmEntry.ts @@ -0,0 +1,40 @@ +import { existsSync } from "fs"; +import { dirname, join } from "path"; + +/** Injectable seams for {@link resolveBundledNpmEntry} (all default to the real ones). */ +export interface ResolveNpmEntryDeps { + execPath?: string; + /** `process.env.npm_execpath` — set by npm itself when running under `npm run`. */ + npmExecPath?: string; + exists?: (p: string) => boolean; +} + +/** + * Locate `npm-cli.js` / `npx-cli.js` so build steps can run npm/npx through + * `process.execPath` directly and never touch a `.cmd` shim (#8858), covering + * BOTH install layouts: + * - Windows: `\node_modules\npm\bin\` (npm beside the binary) + * - POSIX: `/../lib/node_modules/npm/bin/` (node under `/bin`, + * the shape of GitHub hosted runners, nvm and system installs) + * When the script itself runs under `npm run`, npm exports `npm_execpath` pointing at + * its own npm-cli.js — the most reliable source, tried first (npx-cli.js is its sibling). + */ +export function resolveBundledNpmEntry( + name: "npm-cli.js" | "npx-cli.js", + deps: ResolveNpmEntryDeps = {} +): string | null { + const execPath = deps.execPath ?? process.execPath; + const exists = deps.exists ?? existsSync; + const npmExecPath = deps.npmExecPath ?? process.env.npm_execpath; + + const binDir = dirname(execPath); + const candidates: string[] = []; + if (npmExecPath) candidates.push(join(dirname(npmExecPath), name)); + candidates.push(join(binDir, "node_modules", "npm", "bin", name)); + candidates.push(join(binDir, "..", "lib", "node_modules", "npm", "bin", name)); + + for (const candidate of candidates) { + if (exists(candidate)) return candidate; + } + return null; +} diff --git a/scripts/check/check-db-rules.mjs b/scripts/check/check-db-rules.mjs index cc348d69f5..2c65c2f6dd 100644 --- a/scripts/check/check-db-rules.mjs +++ b/scripts/check/check-db-rules.mjs @@ -63,6 +63,7 @@ export const INTENTIONALLY_INTERNAL = new Set([ "optimizationSettings", // db-internal: imported by db/core.ts for SQLite PRAGMA application helpers that require the live adapter "pluginMetrics", // DEAD? (production): write path não foi conectado ainda (documentado no cabeçalho do módulo); testado por tests/unit/plugins-metrics.test.ts "prompts", // DEAD? (production): zero callers de produção encontrados; domínio domain/prompts.ts é independente; testado por tests/integration/proxy-pipeline.test.ts + "probeUtils", // db-internal: importado so por db/core.ts (retryProbeIfTransient no caminho da corruption-probe, #9541); testado por tests/unit/probe-9541-repro.test.ts "providerNodeSelect", // db-internal: importado só por db/providers.ts (selectProviderNodeForConnection — lógica pura de seleção de provider node split do providers.ts, #4421) "providerStats", // intentionally-internal: src/app/api/provider-stats/route.ts "proxyLatency", // intentionally-internal: imported directly by src/lib/db/proxies.ts (anti-barrel, #6798) diff --git a/scripts/check/check-open-sse-typecheck.mjs b/scripts/check/check-open-sse-typecheck.mjs new file mode 100644 index 0000000000..d18c588538 --- /dev/null +++ b/scripts/check/check-open-sse-typecheck.mjs @@ -0,0 +1,174 @@ +#!/usr/bin/env node +// scripts/check/check-open-sse-typecheck.mjs +// open-sse workspace typecheck gate (#8781). +// +// The open-sse workspace declares path aliases (e.g. `@/*` → `../src/*`) in its own +// tsconfig.json, but those aliases are not resolvable by Node's bare module resolution — +// they only work because Next.js/Turbopack bundles the entire tree. Additionally, +// package.json historically declared `main`/`exports` entries that do not exist on disk. +// +// This gate runs `tsc -p open-sse/tsconfig.json` and diffs the result against a frozen +// per-file/per-TS-code count baseline (config/quality/open-sse-typecheck-baseline.json), +// following this repo's stale-enforcement allowlist convention. A live count that EXCEEDS +// the baselined count for a given (file, TS code) pair is a regression and fails the gate; +// a live count that is lower is an improvement and does not fail (use --update to ratchet +// the baseline down). +// +// Run: +// node scripts/check/check-open-sse-typecheck.mjs +// node scripts/check/check-open-sse-typecheck.mjs --update # re-freeze baseline + +import { execFileSync } from "node:child_process"; +import fs from "node:fs"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; + +const ROOT = process.cwd(); +const TSCONFIG = path.join(ROOT, "open-sse", "tsconfig.json"); +const BASELINE_PATH = path.join(ROOT, "config/quality/open-sse-typecheck-baseline.json"); +const UPDATE = process.argv.includes("--update"); + +// Matches tsc --pretty false output lines, e.g.: +// src/app/api/v1/chat/route.ts(12,7): error TS2304: Cannot find name 'bar'. +// open-sse/handlers/chatCore.ts(45,3): error TS7053: Element implicitly has an 'any'... +const TSC_ERROR_LINE = /^(.+?)\((\d+),(\d+)\): error (TS\d+):/; + +/** + * Parses raw `tsc --pretty false` stdout into a nested count map: + * { "": { "": } } + * + * Pure/exported for unit testing against synthetic tsc output — no child + * process involved here. + */ +export function parseTscOutput(raw) { + const counts = {}; + const lines = String(raw).split("\n"); + for (const line of lines) { + const match = TSC_ERROR_LINE.exec(line); + if (!match) continue; + const [, file, , , code] = match; + if (!counts[file]) counts[file] = {}; + counts[file][code] = (counts[file][code] || 0) + 1; + } + return counts; +} + +/** + * Compares live (file, TS code) error counts against a frozen baseline. + * Returns `{ regressions, improvements }`: + * - regressions: entries where live count > baselined count (or the pair is + * entirely new/unbaselined) — these fail the gate. + * - improvements: entries where live count < baselined count — informational, + * do not fail (use --update to ratchet the baseline down). + * + * Exported for unit testing. + */ +export function diffAgainstBaseline(live, baseline) { + const regressions = []; + const improvements = []; + + for (const [file, codes] of Object.entries(live)) { + for (const [code, liveCount] of Object.entries(codes)) { + const baselineCount = (baseline[file] && baseline[file][code]) || 0; + if (liveCount > baselineCount) { + regressions.push({ file, code, liveCount, baselineCount }); + } else if (liveCount < baselineCount) { + improvements.push({ file, code, liveCount, baselineCount }); + } + } + } + + for (const [file, codes] of Object.entries(baseline)) { + for (const [code, baselineCount] of Object.entries(codes)) { + const liveCount = (live[file] && live[file][code]) || 0; + if (liveCount === 0 && baselineCount > 0) { + improvements.push({ file, code, liveCount: 0, baselineCount }); + } + } + } + + return { regressions, improvements }; +} + +function runTsc() { + try { + const stdout = execFileSync( + process.platform === "win32" ? "npx.cmd" : "npx", + ["tsc", "--pretty", "false", "--noEmit", "-p", TSCONFIG], + { encoding: "utf8", maxBuffer: 64 * 1024 * 1024, cwd: ROOT } + ); + return stdout; + } catch (err) { + // tsc exits non-zero when there are type errors — stdout still has the report. + if (err.stdout) return String(err.stdout); + throw err; + } +} + +function loadBaseline() { + if (!fs.existsSync(BASELINE_PATH)) return {}; + return JSON.parse(fs.readFileSync(BASELINE_PATH, "utf8")); +} + +function writeBaseline(counts) { + fs.writeFileSync(BASELINE_PATH, JSON.stringify(counts, null, 2) + "\n"); +} + +function main() { + if (!fs.existsSync(TSCONFIG)) { + process.stderr.write(`[open-sse-typecheck] FAIL — tsconfig not found at ${TSCONFIG}\n`); + process.exit(2); + } + + console.log("[open-sse-typecheck] Running tsc scoped to open-sse/ workspace…"); + const stdout = runTsc(); + const live = parseTscOutput(stdout); + const baseline = loadBaseline(); + const { regressions, improvements } = diffAgainstBaseline(live, baseline); + + const liveErrorCount = Object.values(live).reduce( + (sum, codes) => sum + Object.values(codes).reduce((s, c) => s + c, 0), + 0 + ); + console.log(`openSseTypecheckErrors=${liveErrorCount}`); + + if (UPDATE) { + writeBaseline(live); + console.log(`[open-sse-typecheck] baseline rewritten (${liveErrorCount} errors frozen).`); + process.exit(0); + } + + if (improvements.length > 0) { + console.log( + `[open-sse-typecheck] ${improvements.length} baselined error(s) no longer present ` + + `— run 'node scripts/check/check-open-sse-typecheck.mjs --update' to ratchet the baseline down:\n` + + improvements + .map((i) => ` - ${i.file} ${i.code} (baseline ${i.baselineCount} -> live ${i.liveCount})`) + .join("\n") + ); + } + + if (regressions.length > 0) { + process.stderr.write( + `[open-sse-typecheck] FAIL — ${regressions.length} new/regressed TypeScript error(s) ` + + `under open-sse/ workspace not covered by the frozen baseline:\n` + + regressions + .map((r) => ` ✗ ${r.file} ${r.code} (baseline ${r.baselineCount}, live ${r.liveCount})`) + .join("\n") + + `\n\nIf this is a genuine new open-sse type error (e.g. an undeclared @/ alias),\n` + + `fix it in the source, not in the baseline.\n` + + `If it's pre-existing type looseness you're intentionally not fixing in this PR,\n` + + `do NOT widen the baseline for new regressions — that defeats the gate.\n` + ); + process.exit(1); + } + + console.log( + `[open-sse-typecheck] OK — ${liveErrorCount} pre-existing error(s), all within frozen baseline.` + ); + process.exit(0); +} + +if (import.meta.url === pathToFileURL(process.argv[1] || "").href) { + main(); +} diff --git a/scripts/check/check-rtl-ratchet.mjs b/scripts/check/check-rtl-ratchet.mjs new file mode 100644 index 0000000000..0a3f21ab54 --- /dev/null +++ b/scripts/check/check-rtl-ratchet.mjs @@ -0,0 +1,133 @@ +#!/usr/bin/env node +// scripts/check/check-rtl-ratchet.mjs +// RTL layout ratchet. Counts physical directional Tailwind classes in TSX. +// +// tests/unit/ui/rtl-logical-classes.test.tsx pins four high-impact components +// and says so: "#3541 (partial, core layout)". This measures the rest, so the +// remaining backlog cannot grow while it is worked through. +// +// Physical classes (ml/mr/pl/pr/left/right/text-left/border-l/rounded-l ...) do +// not mirror under dir=rtl. Tailwind v4 logical utilities (ms/me/ps/pe/start/ +// end/text-start/border-s/rounded-s) do. +// +// Output: rtlPhysicalClasses=N +// +// Advisory by default (exit 0). With --ratchet, reads +// metrics.rtlPhysicalClasses.value from config/quality/quality-baseline.json and +// exits 1 only when the measured count is HIGHER (direction: down). +// +// node scripts/check/check-rtl-ratchet.mjs +// node scripts/check/check-rtl-ratchet.mjs --list # show the worst files +// node scripts/check/check-rtl-ratchet.mjs --ratchet # blocking + +import fs from "node:fs"; +import path from "node:path"; +import { pathToFileURL } from "node:url"; + +const ROOT = process.cwd(); +const QUIET = process.argv.includes("--quiet"); +const LIST = process.argv.includes("--list"); +const RATCHET = process.argv.includes("--ratchet"); +const BASELINE_PATH = path.join(ROOT, "config/quality/quality-baseline.json"); +const SCAN_DIRS = ["src", "electron"]; +const SKIP = new Set(["node_modules", ".next", "dist", "build", "out", "coverage", ".git"]); + +// Physical utilities that govern placement and do not mirror under dir=rtl. +const PHYSICAL = + /(? 0) { + perFile.push({ file: path.relative(ROOT, file), count: n }); + total += n; + } + } + } + perFile.sort((a, b) => b.count - a.count); + return { total, perFile }; +} + +function main() { + const { total, perFile } = measure(); + console.log(`rtlPhysicalClasses=${total}`); + + if (LIST) { + for (const { file, count } of perFile.slice(0, 25)) { + console.log(` ${String(count).padStart(4)} ${file}`); + } + console.log(` ${perFile.length} file(s) affected`); + } + + if (!RATCHET) return 0; + + let baseline; + try { + const json = JSON.parse(fs.readFileSync(BASELINE_PATH, "utf-8")); + baseline = json?.metrics?.rtlPhysicalClasses?.value; + } catch (err) { + // A measurement failure must not block, only a measured regression. + if (!QUIET) console.log(`rtlPhysicalClasses=SKIP reason=baseline-unreadable (${err.message})`); + return 0; + } + if (typeof baseline !== "number") { + if (!QUIET) console.log("rtlPhysicalClasses=SKIP reason=baseline-absent"); + return 0; + } + if (total > baseline) { + console.error( + `RTL ratchet: ${total} physical directional classes, baseline ${baseline}. ` + + `Use logical utilities (ms/me/ps/pe/start/end/text-start) so the layout ` + + `mirrors under dir=rtl, or re-baseline with justification.`, + ); + return 1; + } + if (!QUIET) console.log(`rtlPhysicalClasses OK (${total} <= ${baseline})`); + return 0; +} + +// Only run when invoked directly, so countViolations can be unit tested. +if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) { + process.exit(main()); +} diff --git a/scripts/check/check-test-discovery.mjs b/scripts/check/check-test-discovery.mjs index e695ff252c..09ce751efe 100644 --- a/scripts/check/check-test-discovery.mjs +++ b/scripts/check/check-test-discovery.mjs @@ -107,7 +107,13 @@ export const COLLECTORS = [ glob: "open-sse/services/__tests__/antigravity-quota-family.test.ts", sources: ["vitest.mcp.config.ts"], }, + // #8890 landed this suite here without wiring a runner, so it had never run once. + { + glob: "open-sse/services/__tests__/fail-fast-concurrency-gate.test.ts", + sources: ["vitest.mcp.config.ts"], + }, { glob: "tests/unit/autoCombo/**/*.test.ts", sources: ["vitest.mcp.config.ts"] }, + { glob: "src/lib/memory/__tests__/generic-backend.test.ts", sources: ["vitest.mcp.config.ts"] }, { glob: "tests/unit/encryption.spec.ts", sources: ["vitest.mcp.config.ts"] }, { glob: "src/shared/components/**/*.test.tsx", sources: ["vitest.mcp.config.ts"] }, { glob: "src/shared/hooks/__tests__/**/*.test.tsx", sources: ["vitest.mcp.config.ts"] }, diff --git a/scripts/ci/resolve-docker-publish-version.sh b/scripts/ci/resolve-docker-publish-version.sh new file mode 100644 index 0000000000..a9844e76a7 --- /dev/null +++ b/scripts/ci/resolve-docker-publish-version.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +# Resolve the Docker tag/channel for a docker-publish workflow event. +# +# Usage: +# resolve-docker-publish-version.sh EVENT_NAME REF_TYPE REF_NAME [INPUT_VERSION] [DEFAULT_BRANCH] +# +# Outputs exactly one safe tag string: +# - workflow_dispatch: requested version without a leading v +# - push tag: tag without a leading v +# - push main: main +# - push to the current default release/v* branch: next +# - release: release tag without a leading v +set -euo pipefail + +EVENT_NAME="${1:?event name required}" +REF_TYPE="${2:-}" +REF_NAME="${3:-}" +INPUT_VERSION="${4:-}" +DEFAULT_BRANCH="${5:-}" + +case "$EVENT_NAME" in + workflow_dispatch) + VERSION="${INPUT_VERSION#v}" + ;; + push) + if [ "$REF_TYPE" = "tag" ]; then + VERSION="${REF_NAME#v}" + else + case "$REF_NAME" in + main) + VERSION="main" + ;; + release/v*) + if [ -z "$DEFAULT_BRANCH" ] || [ "$REF_NAME" != "$DEFAULT_BRANCH" ]; then + echo "Refusing to publish next from non-default release branch: $REF_NAME" >&2 + exit 1 + fi + VERSION="next" + ;; + *) + echo "Unsupported Docker publish branch: $REF_NAME" >&2 + exit 1 + ;; + esac + fi + ;; + release) + VERSION="${REF_NAME#v}" + ;; + *) + VERSION="${REF_NAME#v}" + ;; +esac + +if ! printf '%s' "$VERSION" | grep -qE '^[A-Za-z0-9._-]+$'; then + echo "Refusing to use unsafe VERSION value: $VERSION" >&2 + exit 1 +fi + +printf '%s\n' "$VERSION" diff --git a/scripts/ci/should-promote-latest.sh b/scripts/ci/should-promote-latest.sh index 12704b7962..e118086c88 100755 --- a/scripts/ci/should-promote-latest.sh +++ b/scripts/ci/should-promote-latest.sh @@ -22,11 +22,13 @@ set -euo pipefail VERSION="${1:?version required}" -# A pre-release VERSION must never grab :latest (callers already short-circuit -# this, but stay safe as a standalone unit). -case "$VERSION" in - *-*) echo "false"; exit 0 ;; -esac +# Only a stable x.y.z release may ever grab :latest. Floating channels such as +# `main` and `next`, plus every pre-release identifier, fail closed here even if +# a caller forgets to short-circuit them first. +if ! printf '%s' "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$'; then + echo "false" + exit 0 +fi # Build the stable candidate set: incoming tags (v-stripped, pre-releases # dropped) plus VERSION itself, then pick the numerically highest. diff --git a/scripts/dev/standalone-server-ws.mjs b/scripts/dev/standalone-server-ws.mjs index 439a9c5171..ee5f0a1bec 100644 --- a/scripts/dev/standalone-server-ws.mjs +++ b/scripts/dev/standalone-server-ws.mjs @@ -3,7 +3,7 @@ import net from "node:net"; import { randomUUID } from "node:crypto"; import { createResponsesWsProxy } from "./responses-ws-proxy.mjs"; import { ensurePeerStampToken, wrapRequestListenerWithPeerStamp } from "./peer-stamp.mjs"; -import { maybeHandleWebdav } from "./webdav-handler.mjs"; +import { maybeHandleWebdav, WEBDAV_PREFIX } from "./webdav-handler.mjs"; import methodGuard from "./http-method-guard.cjs"; import headResponseGuard from "./head-response-guard.cjs"; import { resolveTlsOptions, createServerListener } from "./tls-options.mjs"; @@ -122,14 +122,20 @@ function wrapUpgradeListener(server, listener) { * Returns true if the request was handled; the wrapped listener is never called. */ function wrapRequestListenerWithWebdav(listener) { - return async function webdavAwareRequestHandler(req, res) { - try { - const handled = await maybeHandleWebdav(req, res); - if (handled) return; - } catch { - // Never block a request on WebDAV errors — fall through to Next + return function webdavAwareRequestHandler(req, res) { + if (!(req.url || "").startsWith(WEBDAV_PREFIX)) { + return listener.call(this, req, res); } - return listener.call(this, req, res); + const self = this; + (async () => { + try { + const handled = await maybeHandleWebdav(req, res); + if (handled) return; + } catch { + // Never block a request on WebDAV errors — fall through to Next + } + return listener.call(self, req, res); + })(); }; } diff --git a/scripts/devin-bridge/build b/scripts/devin-bridge/build new file mode 100755 index 0000000000..abb309d453 --- /dev/null +++ b/scripts/devin-bridge/build @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +bridge_prepare_sandbox +docker compose -f "$BRIDGE_COMPOSE" --profile offline build diff --git a/scripts/devin-bridge/clean b/scripts/devin-bridge/clean new file mode 100755 index 0000000000..1fc195aadb --- /dev/null +++ b/scripts/devin-bridge/clean @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +if [[ "${1:-}" == "--all" ]]; then + docker compose -f "$BRIDGE_COMPOSE" --profile offline --profile live-devin down \ + --remove-orphans --volumes + printf 'Containers, networks, and bridge-owned named volumes were removed.\n' +else + docker compose -f "$BRIDGE_COMPOSE" --profile offline --profile live-devin down \ + --remove-orphans + printf 'Containers and networks stopped. Named auth/config volumes were preserved; use --all to remove them.\n' +fi diff --git a/scripts/devin-bridge/common b/scripts/devin-bridge/common new file mode 100755 index 0000000000..b39519dad5 --- /dev/null +++ b/scripts/devin-bridge/common @@ -0,0 +1,131 @@ +#!/usr/bin/env bash +set -euo pipefail +BRIDGE_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +BRIDGE_COMPOSE="$BRIDGE_ROOT/docker/devin-bridge/compose.yml" +BRIDGE_SANDBOX="$BRIDGE_ROOT/.sandbox" +BRIDGE_GUARD_AUDIT_ROOT="$BRIDGE_SANDBOX/guard-audit" +BRIDGE_CLAUDE_AUDIT="$BRIDGE_GUARD_AUDIT_ROOT/claude/egress.jsonl" +BRIDGE_DEVIN_AUDIT="$BRIDGE_GUARD_AUDIT_ROOT/devin/egress.jsonl" +BRIDGE_RUNTIME_POLICY="$BRIDGE_ROOT/scripts/devin-bridge/runtime-policy.mjs" +bridge_prepare_sandbox() { + mkdir -p "$BRIDGE_SANDBOX/home" "$BRIDGE_SANDBOX/test-data" \ + "$BRIDGE_SANDBOX/e2e-workspace" "$BRIDGE_SANDBOX/live-workspace" \ + "$BRIDGE_SANDBOX/evidence" "$BRIDGE_GUARD_AUDIT_ROOT/claude" \ + "$BRIDGE_GUARD_AUDIT_ROOT/devin" + chmod 0777 "$BRIDGE_SANDBOX/e2e-workspace" "$BRIDGE_SANDBOX/live-workspace" \ + "$BRIDGE_SANDBOX/evidence" + chmod 01777 "$BRIDGE_GUARD_AUDIT_ROOT/claude" "$BRIDGE_GUARD_AUDIT_ROOT/devin" +} +bridge_reset_guard_audit() { + local audit_path="$1" + local audit_dir + local temp_path + bridge_prepare_sandbox + audit_dir="$(dirname "$audit_path")" + temp_path="$(mktemp "$audit_dir/.egress.jsonl.XXXXXX")" + chmod 0666 "$temp_path" + mv -f "$temp_path" "$audit_path" +} +bridge_reset_claude_egress_audit() { + bridge_reset_guard_audit "$BRIDGE_CLAUDE_AUDIT" +} +bridge_reset_devin_egress_audit() { + bridge_reset_guard_audit "$BRIDGE_DEVIN_AUDIT" +} +bridge_reset_e2e_fixture() { + bridge_prepare_sandbox + cp -R "$BRIDGE_ROOT/tests/fixtures/devin-bridge/e2e-workspace/." \ + "$BRIDGE_SANDBOX/e2e-workspace/" + rm -f "$BRIDGE_SANDBOX/e2e-workspace/.e2e-hook.log" \ + "$BRIDGE_SANDBOX/evidence/claude-stream.jsonl" \ + "$BRIDGE_SANDBOX/evidence/mock-acp.jsonl" + bridge_reset_claude_egress_audit +} +bridge_reset_live_fixture() { + bridge_prepare_sandbox + cp -R "$BRIDGE_ROOT/tests/fixtures/devin-bridge/e2e-workspace/." \ + "$BRIDGE_SANDBOX/live-workspace/" + rm -f "$BRIDGE_SANDBOX/live-workspace/.e2e-hook.log" \ + "$BRIDGE_SANDBOX/evidence/live-analysis.jsonl" \ + "$BRIDGE_SANDBOX/evidence/live-fix.jsonl" \ + "$BRIDGE_SANDBOX/evidence/live-command.jsonl" \ + "$BRIDGE_SANDBOX/evidence/live-models.json" \ + "$BRIDGE_SANDBOX/evidence/egress.jsonl" + bridge_reset_claude_egress_audit + bridge_reset_devin_egress_audit +} +bridge_test_env() { + bridge_prepare_sandbox + env HOME="$BRIDGE_SANDBOX/home" DATA_DIR="$BRIDGE_SANDBOX/test-data" SQLITE_FILE="$BRIDGE_SANDBOX/test-data/storage.sqlite" DEVIN_AGENTIC_HOME="$BRIDGE_SANDBOX/home" "$@" +} + +bridge_run_devin() { + docker compose -f "$BRIDGE_COMPOSE" --profile live-devin run --rm --no-deps \ + omniroute-live sh -ceu ' + trusted_proxy=http://network-guard:8080 + test "${DEVIN_BRIDGE_PROXY_URL:-}" = "$trusted_proxy" + export HTTP_PROXY="$trusted_proxy" HTTPS_PROXY="$trusted_proxy" + unset ALL_PROXY NO_PROXY http_proxy https_proxy all_proxy no_proxy + exec devin "$@" + ' bridge-devin "$@" +} + +bridge_assert_devin_auth_status() { + local exit_status="$1" + local output="$2" + printf '%s' "$output" | node --input-type=module -e ' + import { pathToFileURL } from "node:url"; + import fs from "node:fs"; + const policy = await import(pathToFileURL(process.argv[1])); + const result = policy.validateDevinAuthStatus(process.argv[2], fs.readFileSync(0, "utf8")); + if (!result.ok) throw new Error(result.error); + ' "$BRIDGE_RUNTIME_POLICY" "$exit_status" +} + +bridge_check_devin_auth() { + local output + local exit_status + set +e + output="$(bridge_run_devin auth status 2>&1)" + exit_status=$? + set -e + bridge_assert_devin_auth_status "$exit_status" "$output" + printf 'PASS: Devin authentication confirmed\n' +} + +bridge_assert_zero_claude_egress() { + local audit_path="$1" + bridge_validate_guard_audit claude-zero "$audit_path" +} + +bridge_assert_claude_guard_denials() { + local audit_path="$1" + bridge_validate_guard_audit claude-denials "$audit_path" +} + +bridge_assert_devin_guard_audit() { + local audit_path="$1" + bridge_validate_guard_audit devin-allowed "$audit_path" +} + +bridge_validate_guard_audit() { + local kind="$1" + local audit_path="$2" + node --input-type=module -e ' + import { pathToFileURL } from "node:url"; + const policy = await import(pathToFileURL(process.argv[1])); + policy.validateAuditFile(process.argv[2], process.argv[3], process.argv[4]); + ' "$BRIDGE_RUNTIME_POLICY" "$kind" "$audit_path" "$(id -u)" +} + +bridge_export_guard_audit() { + local audit_path="$1" + local evidence_name="$2" + cp "$audit_path" "$BRIDGE_SANDBOX/evidence/$evidence_name" + chmod 0644 "$BRIDGE_SANDBOX/evidence/$evidence_name" +} + +bridge_cleanup_compose() { + docker compose -f "$BRIDGE_COMPOSE" --profile offline --profile live-devin \ + down --remove-orphans >/dev/null 2>&1 || true +} diff --git a/scripts/devin-bridge/launch b/scripts/devin-bridge/launch new file mode 100755 index 0000000000..de0515def8 --- /dev/null +++ b/scripts/devin-bridge/launch @@ -0,0 +1,28 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +trap bridge_cleanup_compose EXIT +bridge_cleanup_compose +bridge_prepare_sandbox +"$(dirname "$0")/verify-anthropic-isolation" +bridge_reset_claude_egress_audit +bridge_reset_devin_egress_audit +docker compose -f "$BRIDGE_COMPOSE" --profile live-devin up -d --wait network-guard claude-egress-guard +bridge_check_devin_auth +bridge_run_devin models list --format json >"$BRIDGE_SANDBOX/evidence/live-models.json" +devin_model="$(node --import tsx/esm "$BRIDGE_ROOT/scripts/devin-bridge/select-live-model.mjs" \ + <"$BRIDGE_SANDBOX/evidence/live-models.json")" +export DEVIN_BRIDGE_MODEL="devin-cli-agentic/$devin_model" +export DEVIN_BRIDGE_SONNET_MODEL="${DEVIN_BRIDGE_SONNET_MODEL:-$DEVIN_BRIDGE_MODEL}" +export DEVIN_BRIDGE_OPUS_MODEL="${DEVIN_BRIDGE_OPUS_MODEL:-$DEVIN_BRIDGE_MODEL}" +export DEVIN_BRIDGE_HAIKU_MODEL="${DEVIN_BRIDGE_HAIKU_MODEL:-$DEVIN_BRIDGE_MODEL}" +export DEVIN_BRIDGE_SUBAGENT_MODEL="${DEVIN_BRIDGE_SUBAGENT_MODEL:-$DEVIN_BRIDGE_MODEL}" +docker compose -f "$BRIDGE_COMPOSE" --profile live-devin up -d --wait omniroute-live +docker compose -f "$BRIDGE_COMPOSE" --profile live-devin run --rm --no-deps \ + claude-live claude +bridge_cleanup_compose +bridge_assert_devin_guard_audit "$BRIDGE_DEVIN_AUDIT" +bridge_assert_zero_claude_egress "$BRIDGE_CLAUDE_AUDIT" +bridge_export_guard_audit "$BRIDGE_DEVIN_AUDIT" egress.jsonl +bridge_export_guard_audit "$BRIDGE_CLAUDE_AUDIT" claude-egress.jsonl +trap - EXIT diff --git a/scripts/devin-bridge/login-devin b/scripts/devin-bridge/login-devin new file mode 100755 index 0000000000..0489080784 --- /dev/null +++ b/scripts/devin-bridge/login-devin @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +[[ "${ENABLE_LIVE_DEVIN_TESTS:-}" == 1 ]] || { echo 'Set ENABLE_LIVE_DEVIN_TESTS=1' >&2; exit 1; } +trap bridge_cleanup_compose EXIT +bridge_cleanup_compose +bridge_prepare_sandbox +bridge_reset_devin_egress_audit +docker compose -f "$BRIDGE_COMPOSE" --profile live-devin up -d --wait network-guard +bridge_run_devin auth login --force-manual-token-flow +bridge_cleanup_compose +trap - EXIT +exec env ENABLE_LIVE_DEVIN_TESTS=1 "$(dirname "$0")/test-live-devin" diff --git a/scripts/devin-bridge/runtime-policy.mjs b/scripts/devin-bridge/runtime-policy.mjs new file mode 100644 index 0000000000..73a287d32b --- /dev/null +++ b/scripts/devin-bridge/runtime-policy.mjs @@ -0,0 +1,111 @@ +import fs from "node:fs"; + +const ALLOWED_DEVIN_SUFFIXES = [".devin.ai", ".cognition.ai"]; +const ALLOWED_DEVIN_EXACT = ["server.codeium.com", "unleash.codeium.com"]; + +function normalizedHostname(value) { + return String(value || "") + .trim() + .toLowerCase() + .replace(/\.$/, ""); +} + +export function isAllowedDevinAuditHostname(hostname) { + const value = normalizedHostname(hostname); + return ( + ALLOWED_DEVIN_EXACT.includes(value) || + ALLOWED_DEVIN_SUFFIXES.some((suffix) => value === suffix.slice(1) || value.endsWith(suffix)) + ); +} + +export function validateDevinAuthStatus(exitStatus, output) { + if (Number(exitStatus) !== 0) return { ok: false, error: "auth status command failed" }; + const lines = String(output) + .split(/\r?\n/) + .map((line) => line.trim()); + if (!lines.some((line) => /^Logged in \(via Devin\)\.?$/.test(line))) { + return { ok: false, error: "auth status did not confirm login" }; + } + if (lines.some((line) => /failed to fetch from server/i.test(line))) { + return { ok: false, error: "auth status could not confirm server access" }; + } + return { ok: true }; +} + +export function parseAuditEntries(text) { + const lines = String(text) + .split(/\r?\n/) + .filter((line) => line.trim().length > 0); + return lines.map((line) => JSON.parse(line)); +} + +export function validateZeroClaudeEgress(text) { + if (String(text).length !== 0) { + return { ok: false, error: "Claude attempted external egress during the real run" }; + } + return { ok: true }; +} + +export function validateClaudeGuardDenials(text) { + const entries = parseAuditEntries(text); + if (!entries.length) return { ok: false, error: "Claude egress audit has no records" }; + if (entries.some((entry) => entry.decision !== "deny")) { + return { ok: false, error: "Claude egress audit contains a non-deny decision" }; + } + for (const hostname of ["api.anthropic.com", "claude.ai"]) { + if (!entries.some((entry) => entry.hostname === hostname && entry.decision === "deny")) { + return { ok: false, error: `Claude egress audit is missing deny for ${hostname}` }; + } + } + return { ok: true }; +} + +export function validateDevinGuardAudit(text) { + const entries = parseAuditEntries(text); + if (!entries.length) return { ok: false, error: "Devin egress audit has no records" }; + let sawAllowedDevinRequest = false; + for (const entry of entries) { + if (entry.decision === "deny") { + if (/anthropic|claude\.ai/i.test(normalizedHostname(entry.hostname))) { + return { ok: false, error: `forbidden Devin egress attempt: ${String(entry.hostname)}` }; + } + continue; + } + if (entry.decision !== "allow" || !isAllowedDevinAuditHostname(entry.hostname)) { + return { ok: false, error: `unexpected Devin egress record: ${String(entry.hostname)}` }; + } + sawAllowedDevinRequest = true; + } + return sawAllowedDevinRequest + ? { ok: true } + : { ok: false, error: "Devin egress audit has no approved request" }; +} + +export function validateAuditFileStat(stat, expectedUid) { + if (!stat || !stat.isFile() || stat.isSymbolicLink()) return "audit path is not a regular file"; + if (stat.nlink !== 1) return "audit file link count is not one"; + if (stat.uid !== Number(expectedUid)) return "audit file owner mismatch"; + if ((stat.mode & 0o777) !== 0o666) return "audit file mode mismatch"; + return null; +} + +export function readValidatedAuditFile(path, expectedUid) { + const stat = fs.lstatSync(path); + const statError = validateAuditFileStat(stat, expectedUid); + if (statError) throw new Error(statError); + return fs.readFileSync(path, "utf8"); +} + +export function validateAuditFile(kind, path, expectedUid) { + const text = readValidatedAuditFile(path, expectedUid); + const result = + kind === "claude-zero" + ? validateZeroClaudeEgress(text) + : kind === "claude-denials" + ? validateClaudeGuardDenials(text) + : kind === "devin-allowed" + ? validateDevinGuardAudit(text) + : { ok: false, error: `unknown audit validation kind: ${kind}` }; + if (!result.ok) throw new Error(result.error); + return text; +} diff --git a/scripts/devin-bridge/select-live-model.mjs b/scripts/devin-bridge/select-live-model.mjs new file mode 100644 index 0000000000..ebe38819d0 --- /dev/null +++ b/scripts/devin-bridge/select-live-model.mjs @@ -0,0 +1,101 @@ +#!/usr/bin/env node +import fs from "node:fs"; +import { pathToFileURL } from "node:url"; +import { DEVIN_MODEL_CATALOG } from "../../open-sse/config/providers/registry/devin/catalog.ts"; + +const candidateFields = new Set([ + "model_id", + "modelId", + "model_uid", + "modelUid", + "family_uid", + "familyUid", +]); + +function normalizeModelId(value) { + return value + .trim() + .toLowerCase() + .replace(/[^a-z0-9]+/g, "-") + .replace(/^-+|-+$/g, ""); +} + +function collect(value, candidates) { + if (Array.isArray(value)) { + value.forEach((item) => collect(item, candidates)); + return; + } + if (!value || typeof value !== "object") return; + for (const [key, nested] of Object.entries(value)) { + if ( + typeof nested === "string" && + candidateFields.has(key) && + /^[a-z0-9][a-z0-9._/-]*$/i.test(nested) + ) { + candidates.push(nested); + } + collect(nested, candidates); + } +} + +export function selectLiveModel( + document, + environment = process.env, + catalog = DEVIN_MODEL_CATALOG +) { + const candidates = []; + collect(document, candidates); + const unique = [...new Set(candidates)]; + const normalizedCatalog = new Map(); + for (const entry of catalog) { + const normalized = normalizeModelId(entry.id); + const existing = normalizedCatalog.get(normalized) || []; + existing.push(entry.id); + normalizedCatalog.set(normalized, existing); + } + for (const [normalized, ids] of normalizedCatalog) { + if (ids.length > 1) { + throw new Error( + `Ambiguous OmniRoute catalog normalization for ${normalized}: ${ids.join(", ")}` + ); + } + } + const catalogIds = new Set(catalog.map((entry) => entry.id)); + const available = [ + ...new Set( + unique + .map((candidate) => normalizeModelId(candidate)) + .filter((candidate) => normalizedCatalog.has(candidate)) + ), + ]; + + for (const [name, configured] of [ + ["DEVIN_BRIDGE_SONNET_MODEL", environment.DEVIN_BRIDGE_SONNET_MODEL], + ["DEVIN_BRIDGE_OPUS_MODEL", environment.DEVIN_BRIDGE_OPUS_MODEL], + ["DEVIN_BRIDGE_HAIKU_MODEL", environment.DEVIN_BRIDGE_HAIKU_MODEL], + ["DEVIN_BRIDGE_SUBAGENT_MODEL", environment.DEVIN_BRIDGE_SUBAGENT_MODEL], + ]) { + if (!configured) continue; + const prefix = "devin-cli-agentic/"; + const modelId = configured.startsWith(prefix) ? configured.slice(prefix.length) : ""; + if (!modelId || !catalogIds.has(modelId) || !available.includes(modelId)) { + throw new Error(`${name} is not a model returned by Devin and present in OmniRoute`); + } + } + + const selected = + available.find((candidate) => candidate === "swe-1-7-lightning") || + available.find((candidate) => candidate === "swe-1-7") || + available.find((candidate) => /swe|claude|gpt|gemini/i.test(candidate)) || + available[0]; + + if (!selected) { + throw new Error("Devin returned no model identifier present in OmniRoute's Devin catalog"); + } + return selected; +} + +if (process.argv[1] && pathToFileURL(process.argv[1]).href === import.meta.url) { + const document = JSON.parse(fs.readFileSync(0, "utf8")); + process.stdout.write(selectLiveModel(document)); +} diff --git a/scripts/devin-bridge/test-contract b/scripts/devin-bridge/test-contract new file mode 100755 index 0000000000..91e49448d5 --- /dev/null +++ b/scripts/devin-bridge/test-contract @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +bridge_prepare_sandbox +rm -f "$BRIDGE_SANDBOX/evidence/mock-acp.jsonl" +"$(dirname "$0")/verify-anthropic-isolation" --static +docker compose -f "$BRIDGE_COMPOSE" --profile offline down --remove-orphans +docker compose -f "$BRIDGE_COMPOSE" --profile offline up --abort-on-container-exit \ + --exit-code-from contract contract +node -e ' + const fs = require("node:fs"); + const rows = fs.readFileSync(process.argv[1], "utf8").trim().split("\n").map(JSON.parse); + const repairRows = rows.filter((row) => row.scenario === "narrative-repair"); + if ( + rows.length !== 7 || + rows.some((row) => row.provider !== "devin-cli-agentic") || + repairRows.length !== 2 || + repairRows[0].stage !== "initial" || + repairRows[1].stage !== "repair" + ) { + throw new Error("wire contract observed a missing or non-Devin provider"); + } +' "$BRIDGE_SANDBOX/evidence/mock-acp.jsonl" +printf 'PASS: bridge wire contract suite completed without provider fallback\n' diff --git a/scripts/devin-bridge/test-e2e-mock b/scripts/devin-bridge/test-e2e-mock new file mode 100755 index 0000000000..43db057fca --- /dev/null +++ b/scripts/devin-bridge/test-e2e-mock @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +trap bridge_cleanup_compose EXIT +bridge_cleanup_compose +bridge_reset_e2e_fixture +"$(dirname "$0")/verify-anthropic-isolation" --static +docker compose -f "$BRIDGE_COMPOSE" --profile offline up --abort-on-container-exit \ + --exit-code-from claude claude +grep -q '"action":"final"' "$BRIDGE_SANDBOX/evidence/mock-acp.jsonl" +grep -q 'BRIDGE_E2E_COMPLETE' "$BRIDGE_SANDBOX/evidence/claude-stream.jsonl" +bridge_cleanup_compose +bridge_assert_zero_claude_egress "$BRIDGE_CLAUDE_AUDIT" +bridge_export_guard_audit "$BRIDGE_CLAUDE_AUDIT" claude-egress.jsonl +trap - EXIT +printf 'PASS: real Claude Code completed the offline agentic fixture\n' diff --git a/scripts/devin-bridge/test-live-devin b/scripts/devin-bridge/test-live-devin new file mode 100755 index 0000000000..e0458eb1a0 --- /dev/null +++ b/scripts/devin-bridge/test-live-devin @@ -0,0 +1,37 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +[[ "${ENABLE_LIVE_DEVIN_TESTS:-}" == 1 ]] || { echo 'Set ENABLE_LIVE_DEVIN_TESTS=1' >&2; exit 1; } +trap bridge_cleanup_compose EXIT +bridge_cleanup_compose +bridge_reset_live_fixture +"$(dirname "$0")/verify-anthropic-isolation" --static +docker compose -f "$BRIDGE_COMPOSE" --profile live-devin up -d --wait network-guard +bridge_check_devin_auth +models_file="$BRIDGE_SANDBOX/evidence/live-models.json" +if [[ -n "${DEVIN_BRIDGE_DISCOVERED_MODEL:-}" ]]; then + devin_model="$DEVIN_BRIDGE_DISCOVERED_MODEL" +else + for attempt in 1 2 3; do + if bridge_run_devin models list --format json >"$models_file"; then + break + fi + [[ "$attempt" == 3 ]] && exit 1 + sleep 1 + done + devin_model="$(node --import tsx/esm "$BRIDGE_ROOT/scripts/devin-bridge/select-live-model.mjs" \ + <"$models_file")" +fi +export DEVIN_BRIDGE_MODEL="devin-cli-agentic/$devin_model" +export DEVIN_BRIDGE_SONNET_MODEL="$DEVIN_BRIDGE_MODEL" +export DEVIN_BRIDGE_OPUS_MODEL="$DEVIN_BRIDGE_MODEL" +export DEVIN_BRIDGE_HAIKU_MODEL="$DEVIN_BRIDGE_MODEL" +export DEVIN_BRIDGE_SUBAGENT_MODEL="$DEVIN_BRIDGE_MODEL" +docker compose -f "$BRIDGE_COMPOSE" --profile live-devin up --abort-on-container-exit --exit-code-from claude-live claude-live +bridge_cleanup_compose +bridge_assert_devin_guard_audit "$BRIDGE_DEVIN_AUDIT" +bridge_assert_zero_claude_egress "$BRIDGE_CLAUDE_AUDIT" +bridge_export_guard_audit "$BRIDGE_DEVIN_AUDIT" egress.jsonl +bridge_export_guard_audit "$BRIDGE_CLAUDE_AUDIT" claude-egress.jsonl +trap - EXIT +printf 'PASS: live model %s was discovered and validated by three scenarios\n' "$devin_model" diff --git a/scripts/devin-bridge/test-unit b/scripts/devin-bridge/test-unit new file mode 100755 index 0000000000..c6f3a4518c --- /dev/null +++ b/scripts/devin-bridge/test-unit @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +cd "$BRIDGE_ROOT" +bridge_test_env node --import tsx/esm --test \ + tests/unit/executor-devin-cli-agentic-core.test.ts \ + tests/unit/executor-devin-cli-agentic-acp.test.ts \ + tests/unit/devin-bridge-network-guard.test.ts \ + tests/unit/devin-bridge-live-runtime.test.ts diff --git a/scripts/devin-bridge/validate-claude-evidence.mjs b/scripts/devin-bridge/validate-claude-evidence.mjs new file mode 100644 index 0000000000..6a7c5fcf15 --- /dev/null +++ b/scripts/devin-bridge/validate-claude-evidence.mjs @@ -0,0 +1,125 @@ +#!/usr/bin/env node +import fs from "node:fs"; +import { pathToFileURL } from "node:url"; + +function contentBlocks(message) { + return Array.isArray(message?.message?.content) ? message.message.content : []; +} + +export function validateClaudeEvidenceText(text, options) { + const marker = String(options?.marker || "").trim(); + const requiredTools = Array.isArray(options?.requiredTools) ? options.requiredTools : []; + if (!marker) throw new Error("A final marker is required"); + + const toolUses = new Map(); + const successfulResults = new Set(); + const slashCommands = new Set(); + const skills = new Set(); + let finalResult = null; + + for (const [index, rawLine] of String(text).split(/\r?\n/).entries()) { + const line = rawLine.trim(); + if (!line) continue; + let event; + try { + event = JSON.parse(line); + } catch { + throw new Error(`Invalid Claude evidence JSON at line ${index + 1}`); + } + + if (event?.type === "system" && event?.subtype === "init") { + for (const command of Array.isArray(event.slash_commands) ? event.slash_commands : []) { + slashCommands.add(String(command)); + } + for (const skill of Array.isArray(event.skills) ? event.skills : []) { + skills.add(String(skill)); + } + } + + for (const block of contentBlocks(event)) { + if (block?.type === "tool_use" && typeof block.id === "string") { + toolUses.set(block.id, { name: String(block.name || ""), input: block.input || {} }); + } + if ( + block?.type === "tool_result" && + typeof block.tool_use_id === "string" && + block.is_error !== true + ) { + successfulResults.add(block.tool_use_id); + } + } + + if (event?.type === "result") finalResult = event; + } + + if (!finalResult || finalResult.subtype !== "success" || finalResult.is_error === true) { + throw new Error("Claude evidence has no successful terminal result"); + } + const resultText = String(finalResult.result || ""); + const incompleteResult = [ + /(?:^|\n)\s*(?:\*\*)?blocker(?:\*\*)?\s*:/im, + /\btask (?:is|remains) (?:not complete|incomplete)\b/i, + /(?:^|\n)\s*(?:[-*]\s*)?(?:\*\*)?next steps? needed(?:\*\*)?\s*:/im, + ].some((pattern) => pattern.test(resultText)); + if (incompleteResult) { + throw new Error("Claude terminal result explicitly reports incomplete work"); + } + if (options?.requiredSlashCommand && !slashCommands.has(options.requiredSlashCommand)) { + throw new Error(`Claude did not load required slash command: ${options.requiredSlashCommand}`); + } + if (options?.requiredSkill && !skills.has(options.requiredSkill)) { + throw new Error(`Claude did not load required skill: ${options.requiredSkill}`); + } + const markerIsStandalone = resultText.split(/\r?\n/).some((line) => line.trim() === marker); + + for (const requiredTool of requiredTools) { + if (![...toolUses.values()].some((tool) => tool.name === requiredTool)) { + throw new Error(`Claude did not request required client-owned tool: ${requiredTool}`); + } + } + + const npmTestSucceeded = [...toolUses.entries()].some( + ([id, tool]) => + tool.name === "Bash" && + /\bnpm\s+test\b/.test(String(tool.input?.command || "")) && + successfulResults.has(id) + ); + if (options?.requireSuccessfulNpmTest) { + if (!npmTestSucceeded) throw new Error("Claude evidence has no successful npm test tool turn"); + } + const markerIsCorroborated = + options?.requireSuccessfulNpmTest && npmTestSucceeded && resultText.includes(marker); + const explicitCompletionIsCorroborated = + options?.acceptExplicitCompletion === true && + npmTestSucceeded && + /\btask is complete\b/i.test(resultText); + if (!markerIsStandalone && !markerIsCorroborated && !explicitCompletionIsCorroborated) { + throw new Error(`Claude result has no standalone marker: ${marker}`); + } +} + +if (process.argv[1] && pathToFileURL(process.argv[1]).href === import.meta.url) { + const [ + evidencePath, + marker, + requiredTools = "", + requireNpmTest = "false", + requiredSlashCommand = "", + requiredSkill = "", + acceptExplicitCompletion = "false", + ] = process.argv.slice(2); + if (!evidencePath) + throw new Error("Usage: validate-claude-evidence.mjs FILE MARKER [TOOLS] [NPM_TEST]"); + validateClaudeEvidenceText(fs.readFileSync(evidencePath, "utf8"), { + marker, + requiredTools: requiredTools + .split(",") + .map((value) => value.trim()) + .filter(Boolean), + requireSuccessfulNpmTest: requireNpmTest === "true", + requiredSlashCommand: requiredSlashCommand || undefined, + requiredSkill: requiredSkill || undefined, + acceptExplicitCompletion: acceptExplicitCompletion === "true", + }); + process.stdout.write(`PASS: validated Claude evidence for ${marker}\n`); +} diff --git a/scripts/devin-bridge/verify-anthropic-isolation b/scripts/devin-bridge/verify-anthropic-isolation new file mode 100755 index 0000000000..f7169661ea --- /dev/null +++ b/scripts/devin-bridge/verify-anthropic-isolation @@ -0,0 +1,259 @@ +#!/usr/bin/env bash +set -euo pipefail +source "$(dirname "$0")/common" +fail() { printf 'FAIL: %s\n' "$1" >&2; exit 1; } +bridge_prepare_sandbox +compose_config=(docker compose -f "$BRIDGE_COMPOSE" --env-file /dev/null --profile offline --profile live-devin config) +config="$("${compose_config[@]}")" +config_json="$("${compose_config[@]}" --format json)" +for forbidden in "$HOME/.claude" "$HOME/.claude.json" "$HOME/.ssh" "/var/run/docker.sock"; do + [[ "$config" != *"$forbidden"* ]] || fail "forbidden host mount appears in compose: $forbidden" +done +grep -q 'user: 10001:10001' <<<"$config" || fail "runtime is not non-root" +grep -q 'read_only: true' <<<"$config" || fail "runtime root filesystem is not read-only" +grep -q 'internal: true' <<<"$config" || fail "internal network is missing" +grep -q 'CLAUDE_CONFIG_DIR: /home/bridge/.claude-devin-isolated' <<<"$config" || fail "isolated Claude config is missing" +node -e ' + const fs = require("node:fs"); + const config = JSON.parse(fs.readFileSync(0, "utf8")); + const liveNetworks = Object.keys(config.services["omniroute-live"].networks || {}).sort(); + if (JSON.stringify(liveNetworks) !== JSON.stringify(["bridge-internal", "devin-guard-internal"])) { + throw new Error(`live runtime network escape: ${liveNetworks.join(",")}`); + } + const guardNetworks = Object.keys(config.services["network-guard"].networks || {}).sort(); + if (JSON.stringify(guardNetworks) !== JSON.stringify(["devin-guard-internal", "guard-egress"])) { + throw new Error(`network guard topology mismatch: ${guardNetworks.join(",")}`); + } + const claudeGuard = config.services["claude-egress-guard"]; + if (JSON.stringify(Object.keys(claudeGuard.networks || {})) !== JSON.stringify(["bridge-internal"])) { + throw new Error("Claude egress guard must remain on the internal network only"); + } + if (config.services["network-guard"].environment.GUARD_POLICY !== "devin") { + throw new Error("Devin network guard policy mismatch"); + } + if (claudeGuard.environment.GUARD_POLICY !== "deny-all") { + throw new Error("Claude egress guard is not deny-all"); + } + for (const guardName of ["network-guard", "claude-egress-guard"]) { + const guard = config.services[guardName]; + const env = config.services[guardName].environment; + if (env.GUARD_ALLOW_SUFFIXES || env.GUARD_ALLOW_HOSTS) { + throw new Error(`${guardName} exposes mutable host allowlists`); + } + if (!guard.healthcheck?.test) throw new Error(`${guardName} has no healthcheck`); + const auditMount = (guard.volumes || []).find((mount) => mount.target === "/guard-audit"); + if (!auditMount || auditMount.type !== "bind" || !auditMount.source.includes("/.sandbox/guard-audit/")) { + throw new Error(`${guardName} does not use its guard-only audit bind`); + } + } + const runtimeNames = ["omniroute", "claude", "contract", "omniroute-live", "claude-live"]; + for (const serviceName of [...runtimeNames, "network-guard", "claude-egress-guard"]) { + const service = config.services[serviceName]; + if (String(service.user) !== "10001:10001" || !service.read_only) { + throw new Error(`${serviceName} is not non-root and read-only`); + } + } + for (const serviceName of runtimeNames) { + const service = config.services[serviceName]; + if ((service.volumes || []).some((mount) => mount.target === "/guard-audit")) { + throw new Error(`${serviceName} can mutate guard audit evidence`); + } + const namedVolumes = (service.volumes || []).filter((mount) => mount.type === "volume"); + const hasClaudeConfig = namedVolumes.some( + (mount) => mount.target === "/home/bridge/.claude-devin-isolated", + ); + const hasDevinAuth = namedVolumes.some( + (mount) => mount.target === "/home/bridge/.local/share/devin", + ); + const expectsClaudeConfig = serviceName === "claude" || serviceName === "claude-live"; + const expectsDevinAuth = serviceName === "omniroute-live"; + if (hasClaudeConfig !== expectsClaudeConfig) { + throw new Error(`${serviceName} Claude config volume ownership mismatch`); + } + if (hasDevinAuth !== expectsDevinAuth) { + throw new Error(`${serviceName} Devin auth volume ownership mismatch`); + } + for (const key of [ + "ANTHROPIC_MODEL", + "ANTHROPIC_DEFAULT_SONNET_MODEL", + "ANTHROPIC_DEFAULT_OPUS_MODEL", + "ANTHROPIC_DEFAULT_HAIKU_MODEL", + "CLAUDE_CODE_SUBAGENT_MODEL", + ]) { + if (!String(service.environment[key] || "").startsWith("devin-cli-agentic/")) { + throw new Error(`${serviceName} has a non-Devin model alias in ${key}`); + } + } + } + if (config.services["omniroute-live"].depends_on["network-guard"].condition !== "service_healthy") { + throw new Error("omniroute-live does not wait for a healthy Devin guard"); + } + for (const serviceName of ["claude", "claude-live"]) { + if (config.services[serviceName].depends_on["claude-egress-guard"].condition !== "service_healthy") { + throw new Error(`${serviceName} does not wait for a healthy Claude guard`); + } + } + const liveEnv = config.services["omniroute-live"].environment; + if (liveEnv.DEVIN_BRIDGE_PROXY_URL !== "http://network-guard:8080") { + throw new Error("trusted Devin bridge proxy is missing"); + } + for (const key of ["HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "NO_PROXY"]) { + if (liveEnv[key]) throw new Error(`omniroute-live must not inherit ${key}`); + } + for (const serviceName of runtimeNames.filter((name) => name !== "omniroute-live")) { + if (config.services[serviceName].environment.DEVIN_BRIDGE_PROXY_URL) { + throw new Error(`${serviceName} received the Devin bridge proxy setting`); + } + } + for (const serviceName of ["claude", "claude-live"]) { + const env = config.services[serviceName].environment; + if ( + env.NODE_USE_ENV_PROXY !== "1" || + env.HTTP_PROXY !== "http://claude-egress-guard:8080" || + env.HTTPS_PROXY !== "http://claude-egress-guard:8080" || + env.NO_PROXY !== "omniroute" + ) { + throw new Error(`${serviceName} does not use the deny-all Claude guard`); + } + if (env.HTTP_PROXY === "http://network-guard:8080") { + throw new Error(`${serviceName} received the Devin-capable guard`); + } + } +' <<<"$config_json" || fail "structured compose isolation checks failed" +node --input-type=module -e ' + import { pathToFileURL } from "node:url"; + const policy = await import(pathToFileURL(process.argv[1])); + const allowed = [ + "devin.ai", + "api.devin.ai", + "cognition.ai", + "api.cognition.ai", + "server.codeium.com", + "unleash.codeium.com", + ]; + const denied = [ + "evildevin.ai", + "codeium.com", + "api.codeium.com", + "o123.ingest.sentry.io", + "api.anthropic.com", + "claude.ai", + ]; + for (const hostname of allowed) { + if (!policy.isAllowedGuardHostname(hostname, "devin")) throw new Error(`denied ${hostname}`); + } + for (const hostname of denied) { + if (policy.isAllowedGuardHostname(hostname, "devin")) throw new Error(`allowed ${hostname}`); + } + if (policy.isAllowedGuardHostname("api.devin.ai", "deny-all")) { + throw new Error("deny-all guard allowed Devin traffic"); + } +' "$BRIDGE_ROOT/docker/devin-bridge/network-guard/policy.mjs" || fail "network guard policy checks failed" +bridge_test_env node --import tsx/esm --input-type=module -e ' + import { pathToFileURL } from "node:url"; + const { buildDevinChildEnv } = await import(pathToFileURL(process.argv[1])); + const home = process.env.DEVIN_AGENTIC_HOME; + const trusted = buildDevinChildEnv({}, { + DEVIN_AGENTIC_HOME: home, + DEVIN_BRIDGE_PROXY_URL: "http://network-guard:8080", + HTTP_PROXY: "http://user:password@host-proxy.example:3128", + HTTPS_PROXY: "http://user:password@host-proxy.example:3128", + ALL_PROXY: "socks5://host-proxy.example:1080", + }); + if ( + trusted.HTTP_PROXY !== "http://network-guard:8080" || + trusted.HTTPS_PROXY !== "http://network-guard:8080" || + trusted.ALL_PROXY + ) { + throw new Error("trusted child proxy derivation failed"); + } + const untrusted = buildDevinChildEnv({}, { + DEVIN_AGENTIC_HOME: home, + DEVIN_BRIDGE_PROXY_URL: "http://user:password@network-guard:8080", + HTTP_PROXY: "http://host-proxy.example:3128", + }); + if (untrusted.HTTP_PROXY || untrusted.HTTPS_PROXY) { + throw new Error("untrusted child proxy was inherited"); + } +' "$BRIDGE_ROOT/open-sse/executors/devin-cli-agentic.ts" || \ + fail "Devin child proxy boundary checks failed" +bridge_assert_devin_auth_status 0 $'Logged in (via Devin)\n' || fail "clean auth fixture was rejected" +if bridge_assert_devin_auth_status 0 $'Logged in (via Devin)\nFailed to fetch from server\n' 2>/dev/null; then + fail "server-fetch auth failure was accepted" +fi +if bridge_assert_devin_auth_status 0 $'Logged out\n' 2>/dev/null; then + fail "logged-out auth fixture was accepted" +fi +if bridge_assert_devin_auth_status 0 $'Not Logged in (via Devin)\n' 2>/dev/null; then + fail "misleading auth fixture was accepted" +fi +selected_model="$(printf '%s' '{"models":[{"family_uid":"swe-1.7"},{"modelUid":"swe-1.7-lightning"}]}' | \ + node --import tsx/esm "$BRIDGE_ROOT/scripts/devin-bridge/select-live-model.mjs")" +[[ "$selected_model" == swe-1-7-lightning ]] || fail "live model normalization or preference failed" +if printf '%s' '{"models":[{"family_uid":"unknown.9"}]}' | \ + node --import tsx/esm "$BRIDGE_ROOT/scripts/devin-bridge/select-live-model.mjs" >/dev/null 2>&1; then + fail "unknown normalized live model was accepted" +fi +grep -q 'bridge_run_devin auth login --force-manual-token-flow' \ + "$BRIDGE_ROOT/scripts/devin-bridge/login-devin" || fail "manual token login flow is missing" +if grep -Eqi 'read[[:space:]].*token|printf[[:space:]].*token|echo[[:space:]].*token' \ + "$BRIDGE_ROOT/scripts/devin-bridge/login-devin"; then + fail "login script could expose a token" +fi +grep -q 'bridge_check_devin_auth' "$BRIDGE_ROOT/scripts/devin-bridge/test-live-devin" || \ + fail "live test bypasses strict auth status" +grep -q 'bridge_check_devin_auth' "$BRIDGE_ROOT/scripts/devin-bridge/launch" || \ + fail "normal launch bypasses strict auth status" +grep -q 'up -d --wait network-guard claude-egress-guard' "$BRIDGE_ROOT/scripts/devin-bridge/launch" || \ + fail "normal launch does not start the audited Claude egress guard" +grep -qx '\.sandbox' "$BRIDGE_ROOT/.dockerignore" || fail ".sandbox is not excluded from builds" +if [[ "${1:-}" == --static ]]; then printf 'PASS: static bridge isolation checks passed\n'; exit 0; fi +trap bridge_cleanup_compose EXIT +bridge_cleanup_compose +bridge_reset_claude_egress_audit +docker compose -f "$BRIDGE_COMPOSE" --profile offline up -d --wait claude-egress-guard +docker compose -f "$BRIDGE_COMPOSE" --profile offline run --rm --no-deps claude bash -ceu ' + test "$(id -u)" = 10001 + test "$HOME" = /home/bridge + test "$CLAUDE_CONFIG_DIR" = /home/bridge/.claude-devin-isolated + test "$ANTHROPIC_BASE_URL" = http://omniroute:20128 + test "$ANTHROPIC_AUTH_TOKEN" = sk-local-devin-gateway + test -z "${ANTHROPIC_API_KEY:-}${CLAUDE_CODE_OAUTH_TOKEN:-}${AWS_ACCESS_KEY_ID:-}${AWS_SECRET_ACCESS_KEY:-}${GOOGLE_APPLICATION_CREDENTIALS:-}${AZURE_OPENAI_API_KEY:-}" + test ! -e /var/run/docker.sock + if touch /bridge-must-remain-read-only 2>/dev/null; then + echo "container root filesystem is writable" >&2; exit 1 + fi + for host in api.anthropic.com claude.ai; do + if node -e "require(\"net\").connect(443,process.argv[1]).on(\"connect\",()=>process.exit(0)).on(\"error\",()=>process.exit(1)).setTimeout(1500,()=>process.exit(1))" "$host"; then + echo "unexpected network access to $host" >&2; exit 1 + fi + done +' +docker compose -f "$BRIDGE_COMPOSE" --profile offline run --rm --no-deps claude \ + node --input-type=module -e ' + async function expectProxyDenial(request) { + try { + const response = await request; + if (response.status !== 403) { + throw new Error(`unexpected proxy response: ${response.status}`); + } + } catch (error) { + if (error instanceof Error && error.message.startsWith("unexpected proxy response:")) { + throw error; + } + } + } + await expectProxyDenial(fetch("https://api.anthropic.com", { + signal: AbortSignal.timeout(3000), + })); + await expectProxyDenial(fetch("https://claude.ai", { + signal: AbortSignal.timeout(3000), + })); +' +bridge_cleanup_compose +bridge_assert_claude_guard_denials "$BRIDGE_CLAUDE_AUDIT" || \ + fail "Claude proxy denial audit proof failed" +bridge_export_guard_audit "$BRIDGE_CLAUDE_AUDIT" claude-egress-verifier.jsonl +trap - EXIT +bridge_reset_claude_egress_audit +printf 'PASS: runtime bridge isolation checks passed\n' diff --git a/scripts/query_providers.js b/scripts/query_providers.js index cfad330655..993bf33487 100644 --- a/scripts/query_providers.js +++ b/scripts/query_providers.js @@ -1,12 +1,16 @@ -const Database = require('better-sqlite3'); -const path = require('path'); -const dbPath = path.resolve(process.env.USERPROFILE, '.omniroute', 'storage.sqlite'); +const Database = require("better-sqlite3"); +const path = require("path"); +const dbPath = path.resolve(process.env.USERPROFILE, ".omniroute", "storage.sqlite"); try { const db = new Database(dbPath, { readonly: true }); - const rows = db.prepare(`SELECT id, provider, name, auth_type, is_active, api_key IS NOT NULL as has_api_key, access_token IS NOT NULL as has_access_token, refresh_token IS NOT NULL as has_refresh, last_error, test_status, provider_specific_data, updated_at FROM provider_connections WHERE provider LIKE '%anthropic%' OR provider='anthropic' OR provider LIKE '%claude%' OR provider='claude'`).all(); + const rows = db + .prepare( + `SELECT id, provider, name, auth_type, is_active, api_key IS NOT NULL as has_api_key, access_token IS NOT NULL as has_access_token, refresh_token IS NOT NULL as has_refresh, last_error, test_status, provider_specific_data, updated_at FROM provider_connections WHERE provider LIKE '%anthropic%' OR provider='anthropic' OR provider LIKE '%claude%' OR provider='claude'` + ) + .all(); console.log(JSON.stringify(rows, null, 2)); db.close(); } catch (err) { - console.error('ERROR', err && err.message); + console.error("ERROR", err && err.message); process.exit(2); } diff --git a/scripts/raycast/extract-credentials.mjs b/scripts/raycast/extract-credentials.mjs new file mode 100644 index 0000000000..44d3866239 --- /dev/null +++ b/scripts/raycast/extract-credentials.mjs @@ -0,0 +1,100 @@ +#!/usr/bin/env node +/** + * @file extract-credentials.mjs + * @description Print Raycast Pro credentials from local macOS install (redacted preview). + * + * Usage: node scripts/raycast/extract-credentials.mjs + * + * @changes + * - [2026-07-27] [Composer] - CLI credential extractor for local Raycast + */ + +import { execFileSync } from "node:child_process"; +import { createHash } from "node:crypto"; +import { copyFileSync, existsSync, mkdtempSync, readFileSync, rmdirSync, unlinkSync } from "node:fs"; +import { homedir, tmpdir } from "node:os"; +import { join } from "node:path"; + +const RAYCAST_SALT = "yvkwWXzxPPBAqY2tmaKrB*DvYjjMaeEf"; +const RAYCAST_SUPPORT = join(homedir(), "Library", "Application Support", "com.raycast.macos"); +const RAYCAST_DB = join(RAYCAST_SUPPORT, "raycast-enc.sqlite"); + +function redact(s, keep = 8) { + if (!s || s.length <= keep * 2) return "***"; + return `${s.slice(0, keep)}…${s.slice(-4)}`; +} + +function readKeychain(account) { + return JSON.parse( + execFileSync("security", ["find-generic-password", "-s", "Raycast", "-a", account, "-w"], { + encoding: "utf-8", + }).trim() + ); +} + +function dbPassphrase() { + const keyHex = execFileSync( + "security", + ["find-generic-password", "-s", "Raycast", "-a", "database_key", "-w"], + { encoding: "utf-8" } + ).trim(); + return createHash("sha256") + .update(keyHex + RAYCAST_SALT) + .digest("hex"); +} + +function queryDb(sql) { + const tmpDir = mkdtempSync(join(tmpdir(), "raycast-extract-")); + const tmpDb = join(tmpDir, "db.sqlite"); + copyFileSync(RAYCAST_DB, tmpDb); + for (const ext of ["-wal", "-shm"]) { + const src = RAYCAST_DB + ext; + if (existsSync(src)) copyFileSync(src, tmpDb + ext); + } + const passphrase = dbPassphrase(); + const input = `PRAGMA key = '${passphrase}';\n.mode json\n${sql}`; + const out = execFileSync("sqlcipher", [tmpDb], { input, encoding: "utf-8" }); + for (const ext of ["", "-wal", "-shm"]) { + try { + unlinkSync(tmpDb + ext); + } catch {} + } + try { + rmdirSync(tmpDir); + } catch {} + const jsonStr = out.startsWith("ok\n") ? out.slice(3) : out; + return JSON.parse(jsonStr.trim() || "[]"); +} + +if (process.platform !== "darwin") { + console.error("macOS only"); + process.exit(1); +} + +const store = readKeychain("raycast-store_credentials"); +const token = store?.oauth?.access_token; +if (!token) { + console.error("No Raycast bearer token in Keychain — open Raycast and sign in"); + process.exit(1); +} + +const users = queryDb("SELECT analyticsId, email, username, hasProFeatures, hasBetterAI FROM user LIMIT 1;"); +const user = users[0] || {}; +const deviceId = + user.analyticsId || + JSON.parse(readFileSync(join(RAYCAST_SUPPORT, "posthog.distinctId"), "utf-8"))["posthog.distinctId"]; + +console.log(JSON.stringify({ + accessTokenPreview: redact(token), + accessToken: token, + deviceId, + aid: deviceId, + email: user.email || store?.user?.email, + username: user.username || store?.user?.username, + hasProFeatures: !!user.hasProFeatures, + hasBetterAI: !!user.hasBetterAI, + sources: { + bearer: "Keychain Raycast / raycast-store_credentials", + deviceId: "raycast-enc.sqlite user.analyticsId", + }, +}, null, 2)); diff --git a/scripts/raycast/usage-benchmark.mjs b/scripts/raycast/usage-benchmark.mjs new file mode 100644 index 0000000000..85c30232d6 --- /dev/null +++ b/scripts/raycast/usage-benchmark.mjs @@ -0,0 +1,165 @@ +#!/usr/bin/env node +/** + * @file usage-benchmark.mjs + * @description Battle-test Raycast Pro usage via OmniRoute local endpoint. + * + * Env (required): + * OMNIROUTE_URL default http://127.0.0.1:20128/v1 + * OMNIROUTE_API_KEY OmniRoute API key (if REQUIRE_API_KEY) + * + * Env (optional — direct Raycast probe without OmniRoute): + * RAYCAST_BEARER_TOKEN + * RAYCAST_DEVICE_ID + * RAYCAST_AID + * RAYCAST_SIG_SECRET + * + * Usage: + * node scripts/raycast/usage-benchmark.mjs --models 5 --rounds 3 + * node scripts/raycast/usage-benchmark.mjs --model openai-gpt-5-mini --rounds 10 + * + * @changes + * - [2026-07-27] [Composer] - Initial Raycast Pro usage benchmark script + */ + +import { createHmac, createHash } from "node:crypto"; + +const args = process.argv.slice(2); +function arg(name, fallback) { + const i = args.indexOf(`--${name}`); + return i >= 0 && args[i + 1] ? args[i + 1] : fallback; +} + +const rounds = Number(arg("rounds", "3")); +const model = arg("model", ""); +const modelCount = Number(arg("models", "5")); +const omnirouteUrl = (process.env.OMNIROUTE_URL || "http://127.0.0.1:20128/v1").replace(/\/$/, ""); +const apiKey = process.env.OMNIROUTE_API_KEY || ""; + +const RAYCAST_CHAT_URL = "https://backend.raycast.com/api/v1/ai/chat_completions"; +const RAYCAST_MODELS_URL = "https://backend.raycast.com/api/v1/ai/models"; +const SIG_SECRET = + process.env.RAYCAST_SIG_SECRET || + "6bc455473576ce2cd6f70426caff867aabbe3f7291c1a79681af5e8ce0ca1408"; + +function rot13rot5(input) { + return input.replace(/[A-Za-z0-9]/g, (char) => { + const code = char.charCodeAt(0); + if (code >= 65 && code <= 90) return String.fromCharCode(((code - 65 + 13) % 26) + 65); + if (code >= 97 && code <= 122) return String.fromCharCode(((code - 97 + 13) % 26) + 97); + return String.fromCharCode(((code - 48 + 5) % 10) + 48); + }); +} + +function signatureV2(timestamp, deviceId, payload, secret) { + const bodyHash = createHash("sha256").update(payload).digest("hex"); + const message = [timestamp, deviceId, bodyHash].map(rot13rot5).join("."); + return createHmac("sha256", secret).update(message).digest("hex"); +} + +function raycastJwt(aid, secret) { + const iat = Date.now() / 1000; + const header = Buffer.from(JSON.stringify({ typ: "JWT", alg: "HS256" })).toString("base64url"); + const payload = Buffer.from(JSON.stringify({ aid, exp: iat + 60, iat })).toString("base64url"); + const signature = createHmac("sha256", secret) + .update(`${header}.${payload}`) + .digest("base64url"); + return `${header}.${payload}.${signature}`; +} + +function raycastHeaders(payload) { + const bearerToken = process.env.RAYCAST_BEARER_TOKEN; + const deviceId = process.env.RAYCAST_DEVICE_ID; + const aid = process.env.RAYCAST_AID; + if (!bearerToken || !deviceId || !aid) { + throw new Error("Set RAYCAST_BEARER_TOKEN, RAYCAST_DEVICE_ID, RAYCAST_AID for direct probe"); + } + const timestamp = Math.floor(Date.now() / 1000).toString(); + return { + Accept: "application/json", + Authorization: `Bearer ${bearerToken}`, + "X-Raycast-Timestamp": timestamp, + "X-Raycast-DeviceId": deviceId, + "Content-Type": "application/json", + "X-Raycast-Signature-v2": signatureV2(timestamp, deviceId, payload, SIG_SECRET), + "X-Raycast-Signature": raycastJwt(aid, SIG_SECRET), + "X-Raycast-Experimental": "chatBranching, mcpHTTPServer", + "User-Agent": "Raycast/1.104.20 (macOS Version 26.5.1 (Build 25F80))", + }; +} + +async function fetchRaycastModels() { + const payload = "{}"; + const res = await fetch(RAYCAST_MODELS_URL, { method: "GET", headers: raycastHeaders(payload) }); + const text = await res.text(); + if (!res.ok) throw new Error(`models [${res.status}]: ${text.slice(0, 200)}`); + const data = JSON.parse(text); + return (data.models || []).map((m) => m.id); +} + +async function chatOmniroute(modelId, prompt) { + const headers = { "Content-Type": "application/json" }; + if (apiKey) headers.Authorization = `Bearer ${apiKey}`; + const started = Date.now(); + const res = await fetch(`${omnirouteUrl}/chat/completions`, { + method: "POST", + headers, + body: JSON.stringify({ + model: `raycast/${modelId}`, + messages: [{ role: "user", content: prompt }], + stream: false, + max_tokens: 32, + }), + }); + const ms = Date.now() - started; + const body = await res.text(); + return { ok: res.ok, status: res.status, ms, body: body.slice(0, 300) }; +} + +async function main() { + console.log(`OmniRoute: ${omnirouteUrl}`); + console.log(`Rounds per model: ${rounds}`); + + let models = []; + if (model) { + models = [model]; + } else if (process.env.RAYCAST_BEARER_TOKEN) { + models = (await fetchRaycastModels()).slice(0, modelCount); + console.log(`Direct Raycast model probe — testing ${models.length} models via OmniRoute`); + } else { + models = ["openai-gpt-5-mini"]; + console.log("No RAYCAST_* env — using default model openai-gpt-5-mini via OmniRoute combo id"); + } + + const results = []; + for (const modelId of models) { + let ok = 0; + let fail = 0; + const latencies = []; + for (let i = 0; i < rounds; i++) { + const prompt = `Raycast benchmark round ${i + 1} — reply with exactly: pong`; + try { + const r = await chatOmniroute(modelId, prompt); + latencies.push(r.ms); + if (r.ok) ok++; + else { + fail++; + console.error(` FAIL ${modelId} #${i + 1} [${r.status}]: ${r.body}`); + } + } catch (err) { + fail++; + console.error(` ERR ${modelId} #${i + 1}:`, err.message); + } + } + const avg = latencies.length ? Math.round(latencies.reduce((a, b) => a + b, 0) / latencies.length) : 0; + results.push({ modelId, ok, fail, avgMs: avg }); + console.log(`${modelId}: ${ok}/${rounds} ok, avg ${avg}ms`); + } + + console.log("\nSummary:"); + console.table(results); +} + +main().catch((err) => { + console.error(err); + process.exit(1); +}); diff --git a/skills/omni-version-manager/SKILL.md b/skills/omni-version-manager/SKILL.md index 85f21839c4..711a8f3e8e 100644 --- a/skills/omni-version-manager/SKILL.md +++ b/skills/omni-version-manager/SKILL.md @@ -116,6 +116,19 @@ curl -X POST https://localhost:20128/api/services/9router/auto-start \ -d '{}' ``` +### POST /api/services/9router/auto-restart-adopted + +Toggle 9Router auto-restart-when-adopted + +When enabled, an externally-adopted (not OmniRoute-spawned) 9Router process is restarted under OmniRoute's own supervisor on the next health-check cycle instead of being left as adopted-only. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/9router/auto-restart-adopted \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + ### POST /api/services/cliproxy/install Install CLIProxyAPI from npm @@ -205,6 +218,19 @@ curl -X POST https://localhost:20128/api/services/cliproxy/auto-start \ -d '{}' ``` +### POST /api/services/cliproxy/auto-restart-adopted + +Toggle CLIProxyAPI auto-restart-when-adopted + +When enabled, an externally-adopted (not OmniRoute-spawned) CLIProxyAPI process is restarted under OmniRoute's own supervisor on the next health-check cycle instead of being left as adopted-only. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/cliproxy/auto-restart-adopted \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + ### POST /api/services/mux/install Install Mux from npm @@ -294,6 +320,19 @@ curl -X POST https://localhost:20128/api/services/mux/auto-start \ -d '{}' ``` +### POST /api/services/mux/auto-restart-adopted + +Toggle Mux auto-restart-when-adopted + +When enabled, an externally-adopted (not OmniRoute-spawned) Mux process is restarted under OmniRoute's own supervisor on the next health-check cycle instead of being left as adopted-only. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/mux/auto-restart-adopted \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + ### POST /api/services/bifrost/install Install Bifrost @@ -383,6 +422,193 @@ curl -X POST https://localhost:20128/api/services/bifrost/auto-start \ -d '{}' ``` +### POST /api/services/bifrost/auto-restart-adopted + +Toggle Bifrost auto-restart-when-adopted + +When enabled, an externally-adopted (not OmniRoute-spawned) Bifrost process is restarted under OmniRoute's own supervisor on the next health-check cycle instead of being left as adopted-only. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/bifrost/auto-restart-adopted \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### POST /api/services/dario/install + +Install Dario from npm + +Installs the `@askalf/dario` npm package (Claude-account-pool proxy) under DATA_DIR/services/dario/. Uses execFile (no shell interpolation — hard rule #13). **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/install \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### POST /api/services/dario/start + +Start Dario + +Spawns the Dario process. Idempotent if already running. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/start \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### POST /api/services/dario/stop + +Stop Dario + +Gracefully stops Dario. Idempotent — returns a stopped status even if no supervisor is currently tracking the process. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/stop \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### POST /api/services/dario/restart + +Restart Dario + +Equivalent to stop() then start() under the operation lock. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/restart \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### POST /api/services/dario/update + +Update Dario to a newer npm version + +Stops the service (if running), installs the newer npm version, then restarts it if it was running before the update. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/update \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### GET /api/services/dario/status + +Get Dario status + +Returns combined live supervisor state and DB metadata, including the auto-start / auto-restart-adopted flags and whether an update is available. **LOCAL_ONLY** — loopback only. + +```bash +curl https://localhost:20128/api/services/dario/status \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" +``` + +### POST /api/services/dario/auto-start + +Toggle Dario auto-start + +When enabled, Dario starts automatically on the next OmniRoute boot. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/auto-start \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### POST /api/services/dario/auto-restart-adopted + +Toggle Dario auto-restart-when-adopted + +When enabled, an externally-adopted (not OmniRoute-spawned) Dario process is restarted under OmniRoute's own supervisor on the next health-check cycle instead of being left as adopted-only. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/auto-restart-adopted \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### POST /api/services/dario/admin/login-start + +Start a Dario account-pool login (device-code style) + +Forwards to the running Dario instance's `POST /admin/login/start` using the stored admin token. The operator opens the returned `authorize_url`, approves in their own Claude account, then posts the displayed code to `/admin/login-complete`. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/admin/login-start \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### POST /api/services/dario/admin/login-complete + +Complete a Dario account-pool login + +Forwards to the running Dario instance's `POST /admin/login/complete`. On success the account becomes routable immediately (Dario hot-reloads its pool). **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/admin/login-complete \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + +### GET /api/services/dario/admin/accounts + +List Dario account-pool accounts + +Forwards to the running Dario instance's `GET /admin/accounts`. **LOCAL_ONLY** — loopback only. + +```bash +curl https://localhost:20128/api/services/dario/admin/accounts \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" +``` + +### DELETE /api/services/dario/admin/accounts + +Remove a Dario account-pool account + +Forwards to the running Dario instance's `DELETE /admin/accounts/`. The alias is taken from a `?alias=` query param or a `{ alias }` JSON body. **LOCAL_ONLY** — loopback only. + +```bash +curl -X DELETE https://localhost:20128/api/services/dario/admin/accounts \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" +``` + +### GET /api/services/dario/admin/import-from-omniroute + +List OmniRoute claude connections eligible for Dario import + +Returns eligible OmniRoute `claude` OAuth provider connections (metadata only — id/name/email/org tier, never tokens) so the UI can offer a picker when more than one exists. **LOCAL_ONLY** — loopback only. + +```bash +curl https://localhost:20128/api/services/dario/admin/import-from-omniroute \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" +``` + +### POST /api/services/dario/admin/import-from-omniroute + +Import an OmniRoute claude connection's OAuth tokens into Dario + +Writes the source connection's access/refresh token pair directly into Dario's own account-file store (`~/.dario/accounts/.json`), reusing the shared Claude Code OAuth client_id, then restarts the Dario supervisor so it picks up the new account. **LOCAL_ONLY** — loopback only. + +```bash +curl -X POST https://localhost:20128/api/services/dario/admin/import-from-omniroute \ + -H "Authorization: Bearer $OMNIROUTE_TOKEN" + -H "Content-Type: application/json" \ + -d '{}' +``` + ### GET /api/services/{name}/logs Stream service logs via SSE diff --git a/src/app/(dashboard)/dashboard/cli-code/components/CodexToolCard.tsx b/src/app/(dashboard)/dashboard/cli-code/components/CodexToolCard.tsx index ca775c8954..39141ea249 100644 --- a/src/app/(dashboard)/dashboard/cli-code/components/CodexToolCard.tsx +++ b/src/app/(dashboard)/dashboard/cli-code/components/CodexToolCard.tsx @@ -32,7 +32,7 @@ export default function CodexToolCard({ const [selectedModel, setSelectedModel] = useState("gpt-5.6-sol"); const [modelMappings, setModelMappings] = useState>({}); const [reasoningEffort, setReasoningEffort] = useState("xhigh"); - const [wireApi, setWireApi] = useState("chat"); + const [wireApi, setWireApi] = useState("responses"); const [modalOpen, setModalOpen] = useState(false); const [modalTarget, setModalTarget] = useState(null); // null = default model, string = mapping key const [modelAliases, setModelAliases] = useState({}); @@ -78,6 +78,10 @@ export default function CodexToolCard({ // Parse config content useEffect(() => { + if (codexStatus && !codexStatus.config) { + setWireApi("responses"); + } + if (codexStatus?.config) { const modelMatch = codexStatus.config.match(/^model\s*=\s*"([^"]+)"/im); if (modelMatch) setSelectedModel(modelMatch[1]); @@ -86,7 +90,7 @@ export default function CodexToolCard({ if (effortMatch) setReasoningEffort(effortMatch[1]); const wireMatch = codexStatus.config.match(/^wire_api\s*=\s*"([^"]+)"/im); - if (wireMatch) setWireApi(wireMatch[1]); + setWireApi(wireMatch?.[1] || "responses"); const newMappings: Record = {}; const migrationsBlock = codexStatus.config.split("[notice.model_migrations]")[1]; diff --git a/src/app/(dashboard)/dashboard/combos/page.tsx b/src/app/(dashboard)/dashboard/combos/page.tsx index 9433fb4ab8..f03c79687e 100644 --- a/src/app/(dashboard)/dashboard/combos/page.tsx +++ b/src/app/(dashboard)/dashboard/combos/page.tsx @@ -54,6 +54,7 @@ import { normalizeIntelligentRoutingFilter, normalizeIntelligentRoutingConfig, } from "@/lib/combos/intelligentRouting"; +import { getComboStepTarget } from "@/lib/combos/steps"; import { resolveServerErrorMessage } from "@/lib/api/serverErrorMessage"; import { useTranslations } from "next-intl"; @@ -570,6 +571,13 @@ function normalizeModelEntry(entry) { weight: entry.weight || 0, }; } + if (entry?.kind === "provider-wildcard") { + return { + ...entry, + model: getComboStepTarget(entry), + weight: entry.weight || 0, + }; + } return { ...entry, model: entry.model, @@ -580,6 +588,7 @@ function normalizeModelEntry(entry) { function getModelString(entry) { if (typeof entry === "string") return entry; if (entry?.kind === "combo-ref") return entry.comboName; + if (entry?.kind === "provider-wildcard") return getComboStepTarget(entry); return entry.model; } @@ -635,6 +644,37 @@ function formatComboEntryDisplay( return `Combo → ${normalizedEntry.comboName}`; } + if (normalizedEntry.kind === "provider-wildcard") { + const providerIdentifier = normalizedEntry.providerId; + const builderProvider = findBuilderProviderByIdentifier(builderProviders, providerIdentifier); + const providerNode = findProviderNodeByIdentifier(providerNodes, providerIdentifier); + const providerLabel = + builderProvider?.displayName || providerNode?.name || providerIdentifier || "provider"; + const patternLabel = normalizedEntry.modelPattern || "*"; + const wildcardLabel = `${providerLabel}/${patternLabel}`; + + if (!includeConnection) { + return wildcardLabel; + } + + const connectionId = normalizedEntry.connectionId || null; + const rawConnectionLabel = + (connectionId && + builderProvider?.connections?.find((connection) => connection.id === connectionId) + ?.label) || + normalizedEntry.label || + null; + const connectionLabel = rawConnectionLabel + ? pickDisplayValue([rawConnectionLabel], showFullEmails, rawConnectionLabel) + : null; + + if (connectionId) { + return `${wildcardLabel} · ${connectionLabel || `acct ${connectionId.slice(0, 8)}`}`; + } + + return `${wildcardLabel} · dynamic account`; + } + const parsed = parseQualifiedModel(normalizedEntry.model); if (!parsed) return normalizedEntry.model; @@ -3420,15 +3460,25 @@ function ComboFormModal({ isOpen, combo, onClose, onSave, activeProviders, combo
{entry.kind === "combo-ref" ? getI18nOrFallback(t, "builderComboRefStep", "Nested combo reference") - : entry.connectionId - ? getI18nOrFallback(t, "builderPinnedAccount", "Pinned account") - : entry.providerId - ? getI18nOrFallback( - t, - "builderDynamicAccountShort", - "Dynamic account" - ) - : getI18nOrFallback(t, "builderLegacyEntry", "Legacy model entry")} + : entry.kind === "provider-wildcard" + ? getI18nOrFallback( + t, + "builderProviderWildcard", + "All matching provider models" + ) + : entry.connectionId + ? getI18nOrFallback(t, "builderPinnedAccount", "Pinned account") + : entry.providerId + ? getI18nOrFallback( + t, + "builderDynamicAccountShort", + "Dynamic account" + ) + : getI18nOrFallback( + t, + "builderLegacyEntry", + "Legacy model entry" + )}
@@ -4542,19 +4592,25 @@ function ComboFormModal({ isOpen, combo, onClose, onSave, activeProviders, combo "builderComboRefStep", "Nested combo reference" ) - : entry.connectionId - ? getI18nOrFallback(t, "builderPinnedAccount", "Pinned account") - : entry.providerId - ? getI18nOrFallback( - t, - "builderDynamicAccountShort", - "Dynamic account" - ) - : getI18nOrFallback( - t, - "builderLegacyEntry", - "Legacy model entry" - )} + : entry.kind === "provider-wildcard" + ? getI18nOrFallback( + t, + "builderProviderWildcard", + "All matching provider models" + ) + : entry.connectionId + ? getI18nOrFallback(t, "builderPinnedAccount", "Pinned account") + : entry.providerId + ? getI18nOrFallback( + t, + "builderDynamicAccountShort", + "Dynamic account" + ) + : getI18nOrFallback( + t, + "builderLegacyEntry", + "Legacy model entry" + )} {strategy === "weighted" && entry.weight > 0 ? ` · ${entry.weight}%` : ""} diff --git a/src/app/(dashboard)/dashboard/providers/[id]/ProviderDetailPageClient.tsx b/src/app/(dashboard)/dashboard/providers/[id]/ProviderDetailPageClient.tsx index 0ac9bc3f76..42dcef1987 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/ProviderDetailPageClient.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/ProviderDetailPageClient.tsx @@ -14,6 +14,7 @@ import { isAnthropicCompatibleProvider, isClaudeCodeCompatibleProvider, supportsApiKeyOnFreeProvider, + supportsDualAuthProvider, } from "@/shared/constants/providers"; import { getModelsByProviderId } from "@/shared/constants/models"; import { @@ -27,7 +28,8 @@ import { normalizeModelCatalogSource } from "@/shared/utils/modelCatalogSearch"; import { useCopyToClipboard } from "@/shared/hooks/useCopyToClipboard"; import useEmailPrivacyStore from "@/store/emailPrivacyStore"; import { useNotificationStore } from "@/store/notificationStore"; -import { resolveDashboardProviderInfo } from "../providerPageUtils"; +import { resolveDashboardProviderInfo, resolveProviderHeaderLink } from "../providerPageUtils"; +import { findDefaultReferral } from "@/lib/radar/referrals"; import { type ConnectionRowConnection } from "./components/ConnectionRow"; import { useProviderConnections } from "./hooks/useProviderConnections"; import { useProviderSettings } from "./hooks/useProviderSettings"; @@ -116,6 +118,8 @@ export default function ProviderDetailPageClient() { proxyConfig, connProxyMap, cpaProviderEnabled, + upstreamProxyMode, + upstreamProxyFallbackBackend, refreshingId, setPage, setHealthFilter, @@ -133,6 +137,7 @@ export default function ProviderDetailPageClient() { handleToggleClaudeExtraUsage, handleToggleCodexLimit, handleToggleCliproxyapiMode, + handleSetUpstreamProxyMode, handleToggleProxyEnabled, handleTogglePerKeyProxyEnabled, handleRetestConnection, @@ -210,6 +215,39 @@ export default function ProviderDetailPageClient() { openAiCompatibleName: t("openaiCompatibleName"), }, }); + + // D28 — Radar default referral link ("Pegue seus créditos grátis"). Fetched + // from the LOCAL /api/radar/referrals route only (never talks to the + // private feed server directly) — same client-fetch pattern the Radar + // dashboard page already uses for its own data. This keeps the providers + // page decoupled from @/lib/radar (DB-touching, Node-only): a 404 (flag + // off) or 401/network failure just leaves `referralUrl` null, and + // `resolveProviderHeaderLink` below then falls back to the static catalog + // website — byte-identical to before this feature existed. + const [referralUrl, setReferralUrl] = useState(null); + useEffect(() => { + let cancelled = false; + (async () => { + try { + const res = await fetch("/api/radar/referrals"); + if (!res.ok) return; + const data = await res.json(); + if (cancelled) return; + const fixed = Array.isArray(data?.fixed) ? data.fixed : []; + const match = findDefaultReferral(fixed, providerId); + setReferralUrl(match?.url ?? null); + } catch { + // Best-effort only — never blocks rendering of the provider page. + } + })(); + return () => { + cancelled = true; + }; + }, [providerId]); + const { website: providerHeaderWebsite, isReferralLink } = resolveProviderHeaderLink( + providerInfo?.website, + referralUrl + ); const providerSupportsOAuth = providerInfo?.toggleAuthType === "oauth" || providerInfo?.toggleAuthType === "free"; const subscriptionRisk = providerInfo?.subscriptionRisk === true; @@ -223,6 +261,7 @@ export default function ProviderDetailPageClient() { } = useConnectionGate({ providerId, subscriptionRisk }); const providerSupportsPat = supportsApiKeyOnFreeProvider(providerId); + const supportsDualAuth = supportsDualAuthProvider(providerId); const isOAuth = providerSupportsOAuth && !providerSupportsPat; const providerAlias = getProviderAlias(providerId); const isFreeNoAuth = @@ -460,12 +499,13 @@ export default function ProviderDetailPageClient() {
setShowTutorialModal(true)} t={t} + isReferralLink={isReferralLink} /> {providerId === "zed" && ( @@ -510,6 +550,7 @@ export default function ProviderDetailPageClient() { isCompatible={isCompatible} isCommandCode={isCommandCode} isOAuth={isOAuth} + supportsDualAuth={supportsDualAuth} providerSupportsPat={providerSupportsPat} connections={connections} batchTesting={batchTesting} @@ -556,6 +597,7 @@ export default function ProviderDetailPageClient() { isCompatible={isCompatible} isCommandCode={isCommandCode} providerId={providerId} + supportsDualAuth={supportsDualAuth} providerSupportsPat={providerSupportsPat} commandCodeAuthState={commandCodeAuthState} gateConnectionFlow={gateConnectionFlow} @@ -609,6 +651,9 @@ export default function ProviderDetailPageClient() { canAutoSync={!usesCuratedModelsOnly && compatibleSupportsModelImport} handleToggleConnectionAutoSync={handleToggleConnectionAutoSync} handleToggleCliproxyapiMode={handleToggleCliproxyapiMode} + handleSetUpstreamProxyMode={handleSetUpstreamProxyMode} + upstreamProxyMode={upstreamProxyMode} + upstreamProxyFallbackBackend={upstreamProxyFallbackBackend} handleToggleCodexLimit={handleToggleCodexLimit} handleToggleProxyEnabled={handleToggleProxyEnabled} handleTogglePerKeyProxyEnabled={handleTogglePerKeyProxyEnabled} diff --git a/src/app/(dashboard)/dashboard/providers/[id]/components/CompatibleModelsSection.tsx b/src/app/(dashboard)/dashboard/providers/[id]/components/CompatibleModelsSection.tsx index f82e7f9f70..2a7e8d7bbe 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/components/CompatibleModelsSection.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/components/CompatibleModelsSection.tsx @@ -67,7 +67,7 @@ export interface CompatibleModelsSectionProps { bulkTogglePending?: boolean; togglingModelId?: string | null; onTestModel?: (modelId: string, fullModel: string) => Promise; - modelTestStatus?: Record; + modelTestStatus?: Record; testingModelId?: string | null; onTestAll?: (targets: Array<{ modelId: string; fullModel: string }>) => Promise; testingAll?: boolean; diff --git a/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionRow.tsx b/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionRow.tsx index ebca623e80..9b6fa7dfe4 100644 --- a/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionRow.tsx +++ b/src/app/(dashboard)/dashboard/providers/[id]/components/ConnectionRow.tsx @@ -71,6 +71,13 @@ export interface ConnectionRowProps { isCcCompatible?: boolean; cliproxyapiEnabled?: boolean; onToggleCliproxyapiMode?: (enabled?: boolean) => void; + /** Provider-level upstream proxy routing mode (native/CLIProxyAPI/Dario/fallback). */ + upstreamProxyMode?: "native" | "cliproxyapi" | "dario" | "fallback"; + upstreamProxyFallbackBackend?: "cliproxyapi" | "dario"; + onSetUpstreamProxyMode?: ( + mode: "native" | "cliproxyapi" | "dario" | "fallback", + fallbackBackend?: "cliproxyapi" | "dario" + ) => void; onRetest: () => void; isRetesting?: boolean; onEdit: () => void; @@ -341,6 +348,9 @@ export default function ConnectionRow({ codexGlobalServiceMode, isCcCompatible, cliproxyapiEnabled, + upstreamProxyMode, + upstreamProxyFallbackBackend, + onSetUpstreamProxyMode, isFirst, isLast, isSelected, @@ -511,7 +521,11 @@ export default function ConnectionRow({ ? isClaudeExtraUsageBlockEnabled("claude", connection.providerSpecificData) : false; const codexPlanLabel = getCodexPlanLabel(!!isCodex, connection.providerSpecificData); - const cliproxyapiDeepMode = !!cliproxyapiEnabled; + // #dario: this control is now a full mode selector (native/CLIProxyAPI/ + // Dario/fallback), not a binary toggle — cliproxyapiEnabled/ + // onToggleCliproxyapiMode are kept on the props interface for any other + // consumer but are no longer read here. + const effectiveUpstreamProxyMode = upstreamProxyMode ?? "native"; const autoSyncEnabled = !!(connection.providerSpecificData as Record | undefined) ?.autoSync; @@ -673,21 +687,47 @@ export default function ConnectionRow({ )} - {isCcCompatible && ( + {/* #dario: upstream proxy routing selector. Gated on isClaude (the + real, built-in "claude" provider — the primary intended use + case for CLIProxyAPI/Dario failover) OR isCcCompatible (a + custom Claude-Code-protocol-compatible node). Previously this + only checked isCcCompatible, which never covered the built-in + Claude provider at all — the control was unreachable for the + one connection type it was actually built for. */} + {(isClaude || isCcCompatible) && ( <> | - - - help - {t("learnMore") || "Learn more"} - -
- - - )} - - { - setShowFreeOnly(freeOnly); - setActiveCategory(freeOnly ? null : category); - }} - onDisplayModeChange={setProviderDisplayMode} - onNewProvider={() => router.push("/dashboard/providers/new")} - onImportFromFile={() => setShowImportFromFileModal(true)} - searchQuery={searchQuery} - setModelSearchQuery={setModelSearchQuery} - setSearchQuery={setSearchQuery} - showFreeOnly={showFreeOnly} - summaryStats={summaryStats} - t={t} - tc={tc} - testingMode={testingMode} - /> - - {/* Expiration Banner */} - {expirations?.summary && - (expirations.summary.expired > 0 || expirations.summary.expiringSoon > 0) && ( -
0 - ? "bg-red-500/10 border-red-500/20" - : "bg-amber-500/10 border-amber-500/20" - }`} - > - 0 ? "text-red-500" : "text-amber-500" - }`} - > - {expirations.summary.expired > 0 ? "error" : "warning"} - -
-

0 ? "text-red-500" : "text-amber-500"}`} - > - {expirations.summary.expired > 0 - ? t("expirationBannerExpired", { count: expirations.summary.expired }) - : t("expirationBannerExpiringSoon", { - count: expirations.summary.expiringSoon, - })} -

-

- {expirations.summary.expired > 0 - ? t("expirationBannerExpiredDesc") - : t("expirationBannerExpiringSoonDesc")} +

+ {showFirstProviderHint && ( + +
+
+ dns +
+

+ {t("addFirstProvider") || "Add your first provider"} +

+

+ {t("addFirstProviderDesc") || + "Connect an AI provider to start routing requests through OmniRoute. You can use free providers, API keys, or OAuth accounts."}

+
+ + + help + {t("learnMore") || "Learn more"} + +
-
+ )} - {isCompactProviderDisplay ? ( - compactProviderEntries.length > 0 ? ( -
- {compactProviderEntries.map((entry) => ( - - handleToggleProvider(entry.providerId, entry.toggleAuthType, active) - } - /> - ))} -
+ { + setShowFreeOnly(freeOnly); + setActiveCategory(freeOnly ? null : category); + }} + onDisplayModeChange={setProviderDisplayMode} + onNewProvider={() => router.push("/dashboard/providers/new")} + onImportFromFile={() => setShowImportFromFileModal(true)} + searchQuery={searchQuery} + setModelSearchQuery={setModelSearchQuery} + setSearchQuery={setSearchQuery} + showFreeOnly={showFreeOnly} + summaryStats={summaryStats} + t={t} + tc={tc} + testingMode={testingMode} + /> + + {/* Expiration Banner */} + {expirations?.summary && + (expirations.summary.expired > 0 || expirations.summary.expiringSoon > 0) && ( +
0 + ? "bg-red-500/10 border-red-500/20" + : "bg-amber-500/10 border-amber-500/20" + }`} + > + 0 ? "text-red-500" : "text-amber-500" + }`} + > + {expirations.summary.expired > 0 ? "error" : "warning"} + +
+

0 ? "text-red-500" : "text-amber-500"}`} + > + {expirations.summary.expired > 0 + ? t("expirationBannerExpired", { count: expirations.summary.expired }) + : t("expirationBannerExpiringSoon", { + count: expirations.summary.expiringSoon, + })} +

+

+ {expirations.summary.expired > 0 + ? t("expirationBannerExpiredDesc") + : t("expirationBannerExpiringSoonDesc")} +

+
+
+ )} + + {isCompactProviderDisplay ? ( + compactProviderEntries.length > 0 ? ( +
+ {compactProviderEntries.map((entry) => ( + + handleToggleProvider(entry.providerId, entry.toggleAuthType, active) + } + /> + ))} +
+ ) : ( +
+ search_off + {providerText(t, "noProvidersMatch", "No providers match your search.")} +
+ ) ) : ( -
- search_off - {providerText(t, "noProvidersMatch", "No providers match your search.")} -
- ) - ) : ( - <> - {/* API Key Compatible Providers — dynamic (OpenAI/Anthropic compatible) */} - {showSection("compatible") && ( -
-
-

- {t("compatibleProviders")}{" "} - - -

-
- {(compatibleProviders.length > 0 || - anthropicCompatibleProviders.length > 0 || - ccCompatibleProviders.length > 0) && ( - - )} - {ccCompatibleProviderEnabled && ( - - )} - - -
-
-

{t("compatibleProvidersDesc")}

- {compatibleProviders.length === 0 && - anthropicCompatibleProviders.length === 0 && - ccCompatibleProviders.length === 0 ? ( -
- extension - {t("noCompatibleYet")} -
- ) : ( -
- {compatibleProviderEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } - /> - ) - )} -
- )} -
- )} - - {/* OAuth Providers (including providers that expose free tiers via OAuth) */} - {showSection("oauth") && ( -
-
-

- {t("oauthProviders")}{" "} - - !IDE_PROVIDER_IDS.has(e.providerId)) - )} - /> -

-
- {oauthEnvRepairStatus?.available && oauthEnvRepairStatus.missingCount > 0 && ( - - )} - -
-
-

{t("oauthProvidersDesc")}

-
- {oauthProviderEntries - .filter((e) => !IDE_PROVIDER_IDS.has(e.providerId)) - .map(({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } + className="size-2.5 rounded-full bg-orange-500" + title={t("compatibleLabel")} /> - ))} -
-
- )} - - {/* IDE Providers (Cursor, Zed, Trae) — editors with built-in AI subscription */} - {showSection("ide") && ( -
-
-

- {t("ideProviders") || "IDE Providers"}{" "} - - -

- -
-

- {t("ideProvidersDesc") || - "Editors with built-in AI subscription. Use the provider page to import credentials directly from the IDE's keychain."} -

- {ideProviderEntries.length === 0 ? ( -
- {t("noIdeProviders") || "No IDE providers match the current filters."} -
- ) : ( -
- {ideProviderEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } - /> - ) - )} -
- )} -
- )} - - {/* Web / Cookie Providers */} - {showSection("web") && webCookieProviderEntries.length > 0 && ( -
-
-

- {t("webCookieProviders")}{" "} - - -

- -
-

{t("webCookieProvidersDesc")}

-
- {webCookieProviderEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( - handleToggleProvider(providerId, toggleAuthType, active)} - /> - ))} -
-
- )} - - {/* Free Tier Providers */} - {showSection("free") && freeSectionEntries.length > 0 && ( -
-
-
-

- {t("freeTierProviders")} - - +

-

{t("freeAggregated")}

+
+ {(compatibleProviders.length > 0 || + anthropicCompatibleProviders.length > 0 || + ccCompatibleProviders.length > 0) && ( + + )} + {ccCompatibleProviderEnabled && ( + + )} + + +
- -
-
- {freeSectionEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } - /> - ) - )} -
-
- )} - - {/* API Key Providers — fixed list */} - {showSection("apikey") && ( -
-
-

- {t("apiKeyProviders")}{" "} - - -

- -
-

{t("apiKeyProvidersDesc")}

- {llmProviderEntries.length > 0 && ( -
-

- {t("llmProviders")} -

+

{t("compatibleProvidersDesc")}

+ {compatibleProviders.length === 0 && + anthropicCompatibleProviders.length === 0 && + ccCompatibleProviders.length === 0 ? ( +
+ extension + {t("noCompatibleYet")} +
+ ) : (
- {llmProviderEntries.map( + {compatibleProviderEntries.map( ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( -
- )} -
- )} - - {/* No Auth Providers */} - {showSection("noauth") && - !showFreeOnly && - (noAuthEntriesAll.length > 0 || blockedNoAuthEntries.length > 0) && ( - notify.error(msg)} - testingMode={testingMode} - onBatchTest={handleBatchTest} - onToggleProvider={handleToggleProvider} - /> + )} +
)} - {/* Upstream Proxy Providers */} - {showSection("proxy") && upstreamProxyEntries.length > 0 && ( -
-
-

- {t("upstreamProxyProviders")}{" "} - - -

- + )} + +
+
+

{t("oauthProvidersDesc")}

+
+ {oauthProviderEntries + .filter((e) => !IDE_PROVIDER_IDS.has(e.providerId)) + .map(({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ))} +
+
+ )} + + {/* IDE Providers (Cursor, Zed, Trae) — editors with built-in AI subscription */} + {showSection("ide") && ( +
+
+

+ {t("ideProviders") || "IDE Providers"}{" "} + + +

+ -
-

{t("upstreamProxyProvidersDesc")}

-
- {upstreamProxyEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( - handleToggleProvider(providerId, toggleAuthType, active)} - /> - ))} -
-
- )} - - {/* Web Fetch Providers */} - {showSection("webfetch") && webFetchEntries.length > 0 && ( -
-
-

- {t("webFetchProvidersHeading")}{" "} - - -

-
-

{t("webFetchProvidersDesc")}

-
- {webFetchEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } - /> - ) + + play_arrow + + {testingMode === "ide" ? t("testing") : t("testAll")} + +
+

+ {t("ideProvidersDesc") || + "Editors with built-in AI subscription. Use the provider page to import credentials directly from the IDE's keychain."} +

+ {ideProviderEntries.length === 0 ? ( +
+ {t("noIdeProviders") || "No IDE providers match the current filters."} +
+ ) : ( +
+ {ideProviderEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
)}
-
- )} + )} - {/* Aggregators Gateways */} - {showSection("apikey") && aggregatorProviderEntries.length > 0 && ( -
-
-

- {t("aggregatorsGateways")}{" "} - - -

-
-

{t("aggregatorsGatewaysDesc")}

-
- {aggregatorProviderEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } + {/* Web / Cookie Providers */} + {showSection("web") && webCookieProviderEntries.length > 0 && ( +
+
+

+ {t("webCookieProviders")}{" "} + - ) - )} -

-
- )} - - {/* Enterprise & Cloud */} - {showSection("apikey") && enterpriseProviderEntries.length > 0 && ( -
-
-

- {t("enterpriseCloud")}{" "} - - -

-
-

{t("enterpriseCloudDesc")}

-
- {enterpriseProviderEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } - /> - ) - )} -
-
- )} - - {/* Cloud Agent Providers */} - {showSection("cloud") && cloudAgentProviderEntries.length > 0 && ( -
-
-

- {t("cloudAgentProviders")}{" "} - - -

- + + play_arrow + + {testingMode === "web-cookie" ? t("testing") : t("testAll")} + +
+

{t("webCookieProvidersDesc")}

+
+ {webCookieProviderEntries.map( + ({ providerId, provider, stats, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
-

{t("cloudAgentProvidersDesc")}

-
- {cloudAgentProviderEntries.map( - ({ providerId, provider, stats, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } - /> - ) - )} -
-
- )} + )} - {/* Local / Self-Hosted Providers */} - {showSection("local") && localProviderEntries.length > 0 && ( -
-
-

- {t("localProviders")}{" "} - - -

- + + play_arrow + + {testingMode === "free" ? t("testing") : t("testAll")} + +
+
+ {freeSectionEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
-

{t("localProvidersDesc")}

-
- {localProviderEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( - handleToggleProvider(providerId, toggleAuthType, active)} - /> - ))} -
-
- )} + )} - {/* Search Providers */} - {showSection("search") && searchProviderEntries.length > 0 && ( -
-
-

- {t("searchProvidersHeading")}{" "} - - -

- -
-

{t("searchProvidersDesc")}

-
- {searchProviderEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( - handleToggleProvider(providerId, toggleAuthType, active)} - /> - ))} -
-
- )} - - {/* Embeddings & Rerank */} - {showSection("apikey") && embeddingRerankProviderEntries.length > 0 && ( -
-
-

- {t("embeddingRerankProviders")}{" "} - - -

-
-

{t("embeddingRerankProvidersDesc")}

-
- {embeddingRerankProviderEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } - /> - ) + + play_arrow + + {testingMode === "apikey" ? t("testing") : t("testAll")} + +
+

{t("apiKeyProvidersDesc")}

+ {llmProviderEntries.length > 0 && ( +
+

+ {t("llmProviders")} +

+
+ {llmProviderEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
+
)}
- - )} + )} - {/* Image Providers */} - {showSection("apikey") && imageProviderEntries.length > 0 && ( -
-
-

- {t("imageProviders")}{" "} - - -

-
-

{t("imageProvidersDesc")}

-
- {imageProviderEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( - - handleToggleProvider(providerId, toggleAuthType, active) - } + {/* No Auth Providers */} + {showSection("noauth") && + !showFreeOnly && + (noAuthEntriesAll.length > 0 || blockedNoAuthEntries.length > 0) && ( + notify.error(msg)} + testingMode={testingMode} + onBatchTest={handleBatchTest} + onToggleProvider={handleToggleProvider} + /> + )} + + {/* Upstream Proxy Providers */} + {showSection("proxy") && upstreamProxyEntries.length > 0 && ( +
+
+

+ {t("upstreamProxyProviders")}{" "} + - ) - )} -

-
- )} - - {/* Audio Only Providers */} - {showSection("audio") && audioProviderEntries.length > 0 && ( -
-
-

- {t("audioProvidersHeading")}{" "} - - -

- -
-

{t("audioProvidersDesc")}

-
- {audioProviderEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( - handleToggleProvider(providerId, toggleAuthType, active)} - /> - ))} -
-
- )} - - {/* Video Generation */} - {showSection("apikey") && videoProviderEntries.length > 0 && ( -
-
-

- {t("videoProviders")}{" "} - - -

-
-

{t("videoProvidersDesc")}

-
- {videoProviderEntries.map( - ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + play_arrow + + {testingMode === "upstream-proxy" ? t("testing") : t("testAll")} + +
+

{t("upstreamProxyProvidersDesc")}

+
+ {upstreamProxyEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( handleToggleProvider(providerId, toggleAuthType, active) } /> - ) - )} + ))} +
-
- )} - - )} + )} + + {/* Web Fetch Providers */} + {showSection("webfetch") && webFetchEntries.length > 0 && ( +
+
+

+ {t("webFetchProvidersHeading")}{" "} + + +

+
+

{t("webFetchProvidersDesc")}

+
+ {webFetchEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
+
+ )} + + {/* Aggregators Gateways */} + {showSection("apikey") && aggregatorProviderEntries.length > 0 && ( +
+
+

+ {t("aggregatorsGateways")}{" "} + + +

+
+

{t("aggregatorsGatewaysDesc")}

+
+ {aggregatorProviderEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
+
+ )} + + {/* Enterprise & Cloud */} + {showSection("apikey") && enterpriseProviderEntries.length > 0 && ( +
+
+

+ {t("enterpriseCloud")}{" "} + + +

+
+

{t("enterpriseCloudDesc")}

+
+ {enterpriseProviderEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
+
+ )} + + {/* Cloud Agent Providers */} + {showSection("cloud") && cloudAgentProviderEntries.length > 0 && ( +
+
+

+ {t("cloudAgentProviders")}{" "} + + +

+ +
+

{t("cloudAgentProvidersDesc")}

+
+ {cloudAgentProviderEntries.map( + ({ providerId, provider, stats, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
+
+ )} + + {/* Local / Self-Hosted Providers */} + {showSection("local") && localProviderEntries.length > 0 && ( +
+
+

+ {t("localProviders")}{" "} + + +

+ +
+

{t("localProvidersDesc")}

+
+ {localProviderEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ))} +
+
+ )} + + {/* Search Providers */} + {showSection("search") && searchProviderEntries.length > 0 && ( +
+
+

+ {t("searchProvidersHeading")}{" "} + + +

+ +
+

{t("searchProvidersDesc")}

+
+ {searchProviderEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ))} +
+
+ )} + + {/* Embeddings & Rerank */} + {showSection("apikey") && embeddingRerankProviderEntries.length > 0 && ( +
+
+

+ {t("embeddingRerankProviders")}{" "} + + +

+
+

{t("embeddingRerankProvidersDesc")}

+
+ {embeddingRerankProviderEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
+
+ )} + + {/* Image Providers */} + {showSection("apikey") && imageProviderEntries.length > 0 && ( +
+
+

+ {t("imageProviders")}{" "} + + +

+
+

{t("imageProvidersDesc")}

+
+ {imageProviderEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
+
+ )} + + {/* Audio Only Providers */} + {showSection("audio") && audioProviderEntries.length > 0 && ( +
+
+

+ {t("audioProvidersHeading")}{" "} + + +

+ +
+

{t("audioProvidersDesc")}

+
+ {audioProviderEntries.map(({ providerId, provider, stats, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ))} +
+
+ )} + + {/* Video Generation */} + {showSection("apikey") && videoProviderEntries.length > 0 && ( +
+
+

+ {t("videoProviders")}{" "} + + +

+
+

{t("videoProvidersDesc")}

+
+ {videoProviderEntries.map( + ({ providerId, provider, stats, displayAuthType, toggleAuthType }) => ( + + handleToggleProvider(providerId, toggleAuthType, active) + } + /> + ) + )} +
+
+ )} + + )} - setShowAddCompatibleModal(false)} - onCreated={(node) => { - setProviderNodes((prev) => upsertProviderNodeById(prev, node)); - setShowAddCompatibleModal(false); - router.push(`/dashboard/providers/${node.id}`); - }} - /> - setShowAddAnthropicCompatibleModal(false)} - onCreated={(node) => { - setProviderNodes((prev) => upsertProviderNodeById(prev, node)); - setShowAddAnthropicCompatibleModal(false); - router.push(`/dashboard/providers/${node.id}`); - }} - /> - {ccCompatibleProviderEnabled && ( setShowAddCcCompatibleModal(false)} + isOpen={showAddCompatibleModal} + mode="openai" + onClose={() => setShowAddCompatibleModal(false)} onCreated={(node) => { setProviderNodes((prev) => upsertProviderNodeById(prev, node)); - setShowAddCcCompatibleModal(false); + setShowAddCompatibleModal(false); router.push(`/dashboard/providers/${node.id}`); }} /> - )} - setShowImportFromFileModal(false)} - onImported={async () => setConnections((await loadProviderPageData()).connections)} - /> - {/* Test Results Modal */} - {testResults && ( -
setTestResults(null)} - > -
+ setShowAddAnthropicCompatibleModal(false)} + onCreated={(node) => { + setProviderNodes((prev) => upsertProviderNodeById(prev, node)); + setShowAddAnthropicCompatibleModal(false); + router.push(`/dashboard/providers/${node.id}`); + }} + /> + {ccCompatibleProviderEnabled && ( + setShowAddCcCompatibleModal(false)} + onCreated={(node) => { + setProviderNodes((prev) => upsertProviderNodeById(prev, node)); + setShowAddCcCompatibleModal(false); + router.push(`/dashboard/providers/${node.id}`); + }} + /> + )} + setShowImportFromFileModal(false)} + onImported={async () => setConnections((await loadProviderPageData()).connections)} + /> + {/* Test Results Modal */} + {testResults && (
e.stopPropagation()} + className="fixed inset-0 z-50 flex items-start justify-center pt-[10vh]" + onClick={() => setTestResults(null)} > -
-

{t("testResults")}

- -
-
- +
+
e.stopPropagation()} + > +
+

{t("testResults")}

+ +
+
+ +
-
- )} -
+ )} +
); } diff --git a/src/app/(dashboard)/dashboard/providers/providerPageUtils.ts b/src/app/(dashboard)/dashboard/providers/providerPageUtils.ts index b48c434e60..1405ce875c 100644 --- a/src/app/(dashboard)/dashboard/providers/providerPageUtils.ts +++ b/src/app/(dashboard)/dashboard/providers/providerPageUtils.ts @@ -10,6 +10,7 @@ import { import { isClaudeCodeCompatibleProvider, supportsApiKeyOnFreeProvider, + supportsDualAuthProvider, } from "@/shared/constants/providers"; import { getModelsByProviderId } from "@/shared/constants/models"; import { providerHasServiceKind } from "@/lib/providers/serviceKindIndex"; @@ -240,6 +241,7 @@ export function connectionMatchesProviderCard( if (cardAuthType === "free") return true; if ( supportsApiKeyOnFreeProvider(providerId) || + supportsDualAuthProvider(providerId) || OAUTH_CARD_API_KEY_CONNECTION_PROVIDER_IDS.has(providerId) ) { return conn.authType === "oauth" || conn.authType === "apikey" || conn.authType === "api_key"; @@ -511,6 +513,43 @@ export function buildCompactProviderEntries( return visibleEntries; } +/** + * Result of `resolveProviderHeaderLink` — decides whether the provider name + * link on the detail page header (`ProviderPageHeader`) points at the + * static catalog `website` or at a Radar referral link. + */ +export interface ProviderHeaderLink { + /** Effective URL for the header link, or `undefined` for no link at all. */ + website: string | undefined; + /** True when `website` came from a Radar default referral, not the static catalog. */ + isReferralLink: boolean; +} + +/** + * Pure decision function for the provider-name link (D28 — referral links). + * Deliberately DB-free and Radar-module-free: it takes the already-resolved + * referral URL (or `undefined`/`null` when none applies) as a plain string + * so this file — and the providers dashboard that depends on it — never has + * to import `@/lib/radar` (which pulls in `better-sqlite3`, Node-only) to + * render. The caller (`ProviderDetailPageClient`) is the one place allowed + * to fetch the referral, via the local `/api/radar/referrals` route — same + * pattern the Radar dashboard page already uses for its own data. + * + * With `RADAR_ENABLED` off, or no cache, or no default referral for the + * provider, `referralUrl` is `null`/`undefined` and this returns the exact + * same `website` the catalog already provided — byte-identical to today's + * behavior. + */ +export function resolveProviderHeaderLink( + staticWebsite: string | null | undefined, + referralUrl: string | null | undefined +): ProviderHeaderLink { + if (referralUrl) { + return { website: referralUrl, isReferralLink: true }; + } + return { website: staticWebsite ?? undefined, isReferralLink: false }; +} + export function resolveDashboardProviderInfo( providerId: string, options?: { @@ -627,6 +666,8 @@ export async function loadProviderPageData( ? settingsData.blockedProviders : null, settings: settingsData ?? null, - openRouterProviderStats: Array.isArray(openRouterStatsData?.data) ? openRouterStatsData.data : [], + openRouterProviderStats: Array.isArray(openRouterStatsData?.data) + ? openRouterStatsData.data + : [], }; } diff --git a/src/app/(dashboard)/dashboard/providers/services/components/AutoRestartAdoptedToggle.tsx b/src/app/(dashboard)/dashboard/providers/services/components/AutoRestartAdoptedToggle.tsx new file mode 100644 index 0000000000..c2699dd7fb --- /dev/null +++ b/src/app/(dashboard)/dashboard/providers/services/components/AutoRestartAdoptedToggle.tsx @@ -0,0 +1,62 @@ +"use client"; + +/** + * Toggle for "auto-restart an adopted process." When a supervisor's + * probeBeforeSpawn finds a healthy instance already on its port, it adopts + * that process rather than spawning a new one — but an adopted process has + * no piped stdout/stderr (nothing was ever spawned to pipe from), so the + * Logs panel stays empty for its whole lifetime. Enabling this immediately + * kills an adopted process and spawns a fresh one this supervisor actually + * owns, trading one restart for working log capture. Off by default — + * killing a process the operator didn't ask to be killed should be opt-in. + * + * English literals used inline rather than i18n keys — mirrors the same + * choice in DarioAccountPanel.tsx (avoids a translation-drift gate for a + * single new control; see that file's header comment for the precedent). + */ + +import { useState } from "react"; +import { Card, Toggle } from "@/shared/components"; +import { useServiceStatus } from "../hooks/useServiceStatus"; + +interface AutoRestartAdoptedToggleProps { + name: string; +} + +export function AutoRestartAdoptedToggle({ name }: AutoRestartAdoptedToggleProps) { + const { data, mutate } = useServiceStatus(name); + const [pending, setPending] = useState(false); + + async function handleToggle(enabled: boolean) { + setPending(true); + try { + await fetch(`/api/services/${name}/auto-restart-adopted`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ enabled }), + }); + mutate(); + } finally { + setPending(false); + } + } + + return ( + +
+
+

Auto-restart adopted process

+

+ If this service is found already running (adopted instead of started fresh), kill and + restart it automatically so logs can be captured. Off by default. +

+
+ +
+
+ ); +} diff --git a/src/app/(dashboard)/dashboard/providers/services/components/DarioAccountPanel.tsx b/src/app/(dashboard)/dashboard/providers/services/components/DarioAccountPanel.tsx new file mode 100644 index 0000000000..ee6cd7bd88 --- /dev/null +++ b/src/app/(dashboard)/dashboard/providers/services/components/DarioAccountPanel.tsx @@ -0,0 +1,407 @@ +"use client"; + +/** + * Dario account panel — drives the headless Claude OAuth login flow against the + * server-side admin-proxy routes (/api/services/dario/admin/*). The real + * DARIO_ADMIN_TOKEN never reaches this component; the OmniRoute routes attach it. + * + * Flow: "Start Login" → render the returned Claude authorize_url as an external + * link + expiry countdown + a code input → "Complete Login" posts the pasted + * code → on success the account is routable immediately (Dario hot-reloads) and + * the account list refreshes. Each row has a "Remove" button. + * + * Also offers "Import from OmniRoute": lists any existing OmniRoute `claude` + * provider connection (OAuth-based) and imports its access+refresh token pair + * directly into Dario's account store, skipping the browser OAuth round trip + * entirely — valid because both tools authenticate against the same public + * Claude Code OAuth client. See + * /api/services/dario/admin/import-from-omniroute/route.ts for why this is + * safe (no re-implemented OAuth, just a decrypt()'d token handoff). + * + * Structurally mirrors the shared services components (Card/Button, text-xs + * muted copy). English literals are used inline rather than i18n keys to avoid + * a translation-drift gate for this one panel — matches how other service- + * specific panels keep their bespoke copy local. + */ + +import { useCallback, useEffect, useState } from "react"; +import { Card, Button } from "@/shared/components"; +import Tooltip from "@/shared/components/Tooltip"; + +interface DarioAccount { + alias: string; + scopes?: string[]; + expiresIn?: string; + expiresInMs?: number; + expiresAt?: number | string; + status?: string; + requestCount?: number; +} + +interface PendingLogin { + alias: string; + authorizeUrl: string; + expiresAt: string; +} + +interface OmniConnection { + id: string; + name: string; + email: string | null; + organizationType: string | null; + organizationRateLimitTier: string | null; +} + +function formatExpiry(acc: DarioAccount): string { + if (typeof acc.expiresInMs === "number") { + const mins = Math.max(0, Math.round(acc.expiresInMs / 60000)); + if (mins >= 60) return `expires in ~${Math.round(mins / 60)}h`; + return `expires in ~${mins}m`; + } + if (acc.expiresAt) { + const d = new Date(acc.expiresAt); + if (!Number.isNaN(d.getTime())) return `expires ${d.toLocaleString()}`; + } + return ""; +} + +export function DarioAccountPanel() { + const [accounts, setAccounts] = useState([]); + const [loading, setLoading] = useState(false); + const [error, setError] = useState(null); + + const [pending, setPending] = useState(null); + const [aliasInput, setAliasInput] = useState(""); + const [codeInput, setCodeInput] = useState(""); + const [busy, setBusy] = useState(null); + const [notice, setNotice] = useState(null); + + const [omniConnections, setOmniConnections] = useState([]); + const [omniLoading, setOmniLoading] = useState(false); + const [importBusyId, setImportBusyId] = useState(null); + + const refreshAccounts = useCallback(async () => { + setLoading(true); + setError(null); + try { + const res = await fetch("/api/services/dario/admin/accounts"); + const json = (await res.json().catch(() => null)) as { + accounts?: DarioAccount[]; + error?: string; + } | null; + if (!res.ok) { + throw new Error(json?.error || `HTTP ${res.status}`); + } + setAccounts(Array.isArray(json?.accounts) ? json!.accounts : []); + } catch (err) { + setError(err instanceof Error ? err.message : String(err)); + } finally { + setLoading(false); + } + }, []); + + const refreshOmniConnections = useCallback(async () => { + setOmniLoading(true); + try { + const res = await fetch("/api/services/dario/admin/import-from-omniroute"); + const json = (await res.json().catch(() => null)) as { + connections?: OmniConnection[]; + error?: string; + } | null; + if (res.ok) { + setOmniConnections(Array.isArray(json?.connections) ? json!.connections : []); + } + } catch { + /* non-fatal — import section just stays empty */ + } finally { + setOmniLoading(false); + } + }, []); + + useEffect(() => { + void refreshAccounts(); + void refreshOmniConnections(); + }, [refreshAccounts, refreshOmniConnections]); + + async function importFromOmniroute(connectionId: string) { + setImportBusyId(connectionId); + setError(null); + setNotice(null); + try { + const res = await fetch("/api/services/dario/admin/import-from-omniroute", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ connectionId }), + }); + const json = (await res.json().catch(() => null)) as { + alias?: string; + imported?: boolean; + error?: string; + } | null; + if (!res.ok || !json?.imported) { + throw new Error(json?.error || `HTTP ${res.status}`); + } + setNotice(`Imported as account "${json.alias}" — Dario restarted to pick it up.`); + await refreshAccounts(); + } catch (err) { + setError(err instanceof Error ? err.message : String(err)); + } finally { + setImportBusyId(null); + } + } + + async function startLogin() { + setBusy("start"); + setError(null); + setNotice(null); + try { + const res = await fetch("/api/services/dario/admin/login-start", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(aliasInput.trim() ? { alias: aliasInput.trim() } : {}), + }); + const json = (await res.json().catch(() => null)) as { + alias?: string; + authorize_url?: string; + expires_at?: string; + error?: string; + } | null; + if (!res.ok || !json?.authorize_url || !json?.alias) { + throw new Error(json?.error || `HTTP ${res.status}`); + } + setPending({ + alias: json.alias, + authorizeUrl: json.authorize_url, + expiresAt: json.expires_at || "", + }); + setCodeInput(""); + } catch (err) { + setError(err instanceof Error ? err.message : String(err)); + } finally { + setBusy(null); + } + } + + async function completeLogin() { + if (!pending) return; + setBusy("complete"); + setError(null); + setNotice(null); + try { + const res = await fetch("/api/services/dario/admin/login-complete", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ alias: pending.alias, code: codeInput.trim() }), + }); + const json = (await res.json().catch(() => null)) as { + alias?: string; + status?: string; + error?: string; + } | null; + if (!res.ok) { + throw new Error(json?.error || `HTTP ${res.status}`); + } + setNotice(`Account "${json?.alias ?? pending.alias}" added.`); + setPending(null); + setCodeInput(""); + setAliasInput(""); + await refreshAccounts(); + } catch (err) { + setError(err instanceof Error ? err.message : String(err)); + } finally { + setBusy(null); + } + } + + async function removeAccount(alias: string) { + setError(null); + setNotice(null); + try { + const res = await fetch( + `/api/services/dario/admin/accounts?alias=${encodeURIComponent(alias)}`, + { + method: "DELETE", + } + ); + const json = (await res.json().catch(() => null)) as { + alias?: string; + removed?: boolean; + error?: string; + } | null; + if (!res.ok) { + throw new Error(json?.error || `HTTP ${res.status}`); + } + await refreshAccounts(); + } catch (err) { + setError(err instanceof Error ? err.message : String(err)); + } + } + + return ( + +
+
+

Claude accounts

+

+ Authenticate Dario with your Claude Pro/Max subscription. Traffic bills to your + subscription pool. At least one account is required before Dario can route requests + (until then /health reports degraded). +

+
+ + {/* Account list */} +
+ {loading && accounts.length === 0 ? ( +
+ ) : accounts.length === 0 ? ( +

No accounts configured yet.

+ ) : ( + accounts.map((acc) => ( +
+
+

{acc.alias}

+

+ {[ + formatExpiry(acc), + acc.status, + Array.isArray(acc.scopes) && acc.scopes.length + ? `${acc.scopes.length} scope(s)` + : "", + ] + .filter(Boolean) + .join(" · ")} +

+
+ +
+ )) + )} +
+ + {/* Import from OmniRoute */} +
+

Import from OmniRoute

+

+ Reuse an existing OmniRoute Claude connection's OAuth tokens instead of logging in + again — skips the browser approval step entirely. +

+ {omniLoading && omniConnections.length === 0 ? ( +
+ ) : omniConnections.length === 0 ? ( +
+

+ No eligible OmniRoute Claude connections found. +

+ + + +
+ ) : ( + omniConnections.map((c) => ( +
+
+

{c.name}

+

+ {[c.organizationType, c.organizationRateLimitTier].filter(Boolean).join(" · ")} +

+
+ +
+ )) + )} +
+ + {/* Login flow */} + {!pending ? ( +
+ setAliasInput(e.target.value)} + className="flex-1 min-w-[140px] bg-transparent text-xs border border-border rounded px-2 py-1.5 outline-none placeholder:text-text-muted" + /> + + +
+ ) : ( +
+

+ 1. Open this URL in your browser and approve access for account{" "} + {pending.alias}: +

+ + {pending.authorizeUrl} + + {pending.expiresAt && ( +

+ Pending login expires {new Date(pending.expiresAt).toLocaleTimeString()} +

+ )} +

2. Paste the code Anthropic displays:

+
+ setCodeInput(e.target.value)} + className="flex-1 min-w-[180px] bg-transparent text-xs border border-border rounded px-2 py-1.5 outline-none placeholder:text-text-muted font-mono" + /> + + +
+
+ )} + + {notice &&

{notice}

} + {error &&

{error}

} +
+ + ); +} diff --git a/src/app/(dashboard)/dashboard/providers/services/components/ServiceStatusCard.tsx b/src/app/(dashboard)/dashboard/providers/services/components/ServiceStatusCard.tsx index fbe85ccd81..c82a8f06d1 100644 --- a/src/app/(dashboard)/dashboard/providers/services/components/ServiceStatusCard.tsx +++ b/src/app/(dashboard)/dashboard/providers/services/components/ServiceStatusCard.tsx @@ -83,6 +83,19 @@ export function ServiceStatusCard({ name }: ServiceStatusCardProps) { )}
+ {/* Adopted-process note — English literal, not an i18n key; see + AutoRestartAdoptedToggle.tsx's header comment for why. */} + {data.adopted && ( +

+ info + + This process was adopted from an already-running instance, not started by this + supervisor — live log tailing isn't available until you restart it (Stop, then + Start), or turn on Auto-restart adopted process below. + +

+ )} + {data.lastError &&

{data.lastError}

} ); diff --git a/src/app/(dashboard)/dashboard/providers/services/hooks/useServiceStatus.ts b/src/app/(dashboard)/dashboard/providers/services/hooks/useServiceStatus.ts index cb392cc987..f83c6f0bed 100644 --- a/src/app/(dashboard)/dashboard/providers/services/hooks/useServiceStatus.ts +++ b/src/app/(dashboard)/dashboard/providers/services/hooks/useServiceStatus.ts @@ -16,6 +16,15 @@ export interface ServiceStatus { autoStart: boolean; apiKeyMasked?: string | null; providerExpose?: boolean; + /** + * True when the running process was adopted from an already-listening + * instance rather than spawned by this supervisor — it has no piped + * stdout/stderr, so the Logs panel stays empty until it's replaced by a + * real spawn (Stop then Start, or automatically via autoRestartAdopted). + */ + adopted: boolean; + /** When true, an adopted process is immediately killed and re-spawned. */ + autoRestartAdopted: boolean; } interface UseServiceStatusResult { diff --git a/src/app/(dashboard)/dashboard/providers/services/page.tsx b/src/app/(dashboard)/dashboard/providers/services/page.tsx index 3d58603477..f2a97128b4 100644 --- a/src/app/(dashboard)/dashboard/providers/services/page.tsx +++ b/src/app/(dashboard)/dashboard/providers/services/page.tsx @@ -7,14 +7,16 @@ import { CliproxyServiceTab } from "./tabs/CliproxyServiceTab"; import { NinerouterServiceTab } from "./tabs/NinerouterServiceTab"; import { MuxServiceTab } from "./tabs/MuxServiceTab"; import { BifrostServiceTab } from "./tabs/BifrostServiceTab"; +import { DarioServiceTab } from "./tabs/DarioServiceTab"; -type Tab = "cliproxy" | "9router" | "mux" | "bifrost"; +type Tab = "cliproxy" | "9router" | "mux" | "bifrost" | "dario"; const TABS: { id: Tab; label: string; icon: string }[] = [ { id: "cliproxy", label: "CLIProxyAPI", icon: "swap_horiz" }, { id: "9router", label: "9Router", icon: "route" }, { id: "mux", label: "Mux", icon: "hub" }, { id: "bifrost", label: "Bifrost", icon: "bolt" }, + { id: "dario", label: "Dario", icon: "shield_person" }, ]; export default function ServicesPage() { @@ -61,6 +63,7 @@ export default function ServicesPage() { {active === "9router" && } {active === "mux" && } {active === "bifrost" && } + {active === "dario" && }
); diff --git a/src/app/(dashboard)/dashboard/providers/services/tabs/BifrostServiceTab.tsx b/src/app/(dashboard)/dashboard/providers/services/tabs/BifrostServiceTab.tsx index 0d832a9f26..ff26e06a81 100644 --- a/src/app/(dashboard)/dashboard/providers/services/tabs/BifrostServiceTab.tsx +++ b/src/app/(dashboard)/dashboard/providers/services/tabs/BifrostServiceTab.tsx @@ -4,6 +4,7 @@ import { ServiceStatusCard } from "../components/ServiceStatusCard"; import { ServiceLifecycleButtons } from "../components/ServiceLifecycleButtons"; import { ServiceLogsPanel } from "../components/ServiceLogsPanel"; import { AutoStartToggle } from "../components/AutoStartToggle"; +import { AutoRestartAdoptedToggle } from "../components/AutoRestartAdoptedToggle"; const NAME = "bifrost"; @@ -13,6 +14,7 @@ export function BifrostServiceTab() { +
); diff --git a/src/app/(dashboard)/dashboard/providers/services/tabs/CliproxyServiceTab.tsx b/src/app/(dashboard)/dashboard/providers/services/tabs/CliproxyServiceTab.tsx index 4df6720418..0d26cb6e6d 100644 --- a/src/app/(dashboard)/dashboard/providers/services/tabs/CliproxyServiceTab.tsx +++ b/src/app/(dashboard)/dashboard/providers/services/tabs/CliproxyServiceTab.tsx @@ -5,6 +5,7 @@ import { ServiceLifecycleButtons } from "../components/ServiceLifecycleButtons"; import { ServiceLogsPanel } from "../components/ServiceLogsPanel"; import { CliproxyModelMappingEditor } from "../components/CliproxyModelMappingEditor"; import { AutoStartToggle } from "../components/AutoStartToggle"; +import { AutoRestartAdoptedToggle } from "../components/AutoRestartAdoptedToggle"; import { CliproxyConnectionPanel } from "../components/CliproxyConnectionPanel"; import { CliproxyProviderExposureCard } from "../components/CliproxyProviderExposureCard"; @@ -16,6 +17,7 @@ export function CliproxyServiceTab() { + diff --git a/src/app/(dashboard)/dashboard/providers/services/tabs/DarioServiceTab.tsx b/src/app/(dashboard)/dashboard/providers/services/tabs/DarioServiceTab.tsx new file mode 100644 index 0000000000..c2e91be215 --- /dev/null +++ b/src/app/(dashboard)/dashboard/providers/services/tabs/DarioServiceTab.tsx @@ -0,0 +1,23 @@ +"use client"; + +import { ServiceStatusCard } from "../components/ServiceStatusCard"; +import { ServiceLifecycleButtons } from "../components/ServiceLifecycleButtons"; +import { ServiceLogsPanel } from "../components/ServiceLogsPanel"; +import { AutoStartToggle } from "../components/AutoStartToggle"; +import { AutoRestartAdoptedToggle } from "../components/AutoRestartAdoptedToggle"; +import { DarioAccountPanel } from "../components/DarioAccountPanel"; + +const NAME = "dario"; + +export function DarioServiceTab() { + return ( +
+ + + + + + +
+ ); +} diff --git a/src/app/(dashboard)/dashboard/providers/services/tabs/MuxServiceTab.tsx b/src/app/(dashboard)/dashboard/providers/services/tabs/MuxServiceTab.tsx index 087bc9b3ff..8aa2cdc56d 100644 --- a/src/app/(dashboard)/dashboard/providers/services/tabs/MuxServiceTab.tsx +++ b/src/app/(dashboard)/dashboard/providers/services/tabs/MuxServiceTab.tsx @@ -4,6 +4,7 @@ import { ServiceStatusCard } from "../components/ServiceStatusCard"; import { ServiceLifecycleButtons } from "../components/ServiceLifecycleButtons"; import { ServiceLogsPanel } from "../components/ServiceLogsPanel"; import { AutoStartToggle } from "../components/AutoStartToggle"; +import { AutoRestartAdoptedToggle } from "../components/AutoRestartAdoptedToggle"; const NAME = "mux"; @@ -13,6 +14,7 @@ export function MuxServiceTab() { + ); diff --git a/src/app/(dashboard)/dashboard/providers/services/tabs/NinerouterServiceTab.tsx b/src/app/(dashboard)/dashboard/providers/services/tabs/NinerouterServiceTab.tsx index 3d5395fc3f..9fb1a2e785 100644 --- a/src/app/(dashboard)/dashboard/providers/services/tabs/NinerouterServiceTab.tsx +++ b/src/app/(dashboard)/dashboard/providers/services/tabs/NinerouterServiceTab.tsx @@ -7,6 +7,7 @@ import { NinerouterInstallWizard } from "../components/NinerouterInstallWizard"; import { NinerouterProviderExposureCard } from "../components/NinerouterProviderExposureCard"; import { NinerouterModelList } from "../components/NinerouterModelList"; import { AutoStartToggle } from "../components/AutoStartToggle"; +import { AutoRestartAdoptedToggle } from "../components/AutoRestartAdoptedToggle"; import { ApiKeyField } from "../components/ApiKeyField"; import { NinerouterEmbedFrame } from "../components/NinerouterEmbedFrame"; import { useServiceStatus } from "../hooks/useServiceStatus"; @@ -30,6 +31,7 @@ export function NinerouterServiceTab() { + diff --git a/src/app/(dashboard)/dashboard/radar/page.tsx b/src/app/(dashboard)/dashboard/radar/page.tsx new file mode 100644 index 0000000000..c30ed0b31b --- /dev/null +++ b/src/app/(dashboard)/dashboard/radar/page.tsx @@ -0,0 +1,629 @@ +"use client"; + +import { useState, useEffect, useCallback, useRef } from "react"; +import { useTranslations } from "next-intl"; +import { notFound } from "next/navigation"; +import Link from "next/link"; +import { Card } from "@/shared/components"; +import { shouldAutoSyncOnOpen } from "@/lib/radar/autoSync"; + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +interface RadarMeta { + version: string; + tier: string; + fetchedAt: string; +} + +interface RadarMergedEntry { + provider: string; + modelId: string; + displayName: string; + monthlyTokens: number; + creditTokens: number; + freeType: string; + poolKey: string | null; + tos: string; + trainsOnPrompts?: boolean; + enabled?: boolean; + origin: "baseline" | "radar" | "local"; + disabledBy?: "radar"; + // Extended feed fields (present when origin=radar) + contextWindow?: number | null; + capabilities?: { tools: boolean; vision: boolean; thinking: boolean }; + budget?: { kind: string; tokensPerMonth?: number; poolId?: string }; + limits?: { rpm: number | null; rpd: number | null; tpm: number | null; tpd: number | null }; + setup?: { keyUrl: string | null; steps: string[] } | null; +} + +type PageState = "flag_off" | "optin_pending" | "empty" | "populated"; + +/** D28 — referral links / free credits. Client-side mirror of RadarReferral. */ +interface RadarReferralItem { + provider: string; + url: string; + kind: "fixo" | "campanha"; + validUntil: string | null; + requiredAction: string | null; + isDefault: boolean; +} + +interface RadarReferralsState { + fixed: RadarReferralItem[]; + campaigns: RadarReferralItem[]; + tier: string | null; +} + +type RadarTabId = "catalog" | "referrals"; + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** Determine the page state from the fetch result. */ +export function resolveRadarPageState( + flagOn: boolean, + optedIn: boolean, + hasEntries: boolean, +): PageState { + if (!flagOn) return "flag_off"; + if (!optedIn) return "optin_pending"; + if (!hasEntries) return "empty"; + return "populated"; +} + +/** Relative time string (e.g., "3h ago", "2d ago"). */ +function relativeTime(isoDate: string): string { + const now = Date.now(); + const then = new Date(isoDate).getTime(); + const diffMs = now - then; + if (diffMs < 0) return "just now"; + const mins = Math.floor(diffMs / 60_000); + if (mins < 1) return "just now"; + if (mins < 60) return `${mins}m ago`; + const hours = Math.floor(mins / 60); + if (hours < 24) return `${hours}h ago`; + const days = Math.floor(hours / 24); + return `${days}d ago`; +} + +/** Format token count as human-readable. */ +function formatTokens(n: number): string { + if (n === 0) return "rate-only"; + if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`; + if (n >= 1_000) return `${(n / 1_000).toFixed(0)}K`; + return String(n); +} + +/** Budget display string. */ +function budgetLabel(entry: RadarMergedEntry): string { + if (entry.budget?.kind === "shared_pool") { + return `shared (${formatTokens(entry.budget.tokensPerMonth ?? entry.monthlyTokens)}/mo)`; + } + if (entry.budget?.kind === "rate_only" || entry.monthlyTokens === 0) return "rate-only"; + return `${formatTokens(entry.monthlyTokens)}/mo`; +} + +// --------------------------------------------------------------------------- +// Page Component +// --------------------------------------------------------------------------- + +export default function RadarPage() { + const t = useTranslations("radarPage"); + const [entries, setEntries] = useState([]); + const [meta, setMeta] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(""); + const [optIn, setOptIn] = useState(null); + const [activating, setActivating] = useState(false); + const [syncing, setSyncing] = useState(false); + const [activeTab, setActiveTab] = useState("catalog"); + const [referrals, setReferrals] = useState({ + fixed: [], + campaigns: [], + tier: null, + }); + // F4/T7 — "get a supporter key" outbound links, relayed by + // GET /api/radar/settings (server-resolved, see src/lib/radar/links.ts). + // Never hardcoded here: this component must never embed an external URL + // literal (see tests/unit/radar-referrals-page-tab.test.ts). + const [contributorClaimUrl, setContributorClaimUrl] = useState(null); + const [supporterPlansUrl, setSupporterPlansUrl] = useState(null); + + // Fetch catalog + const fetchCatalog = useCallback(async () => { + setLoading(true); + setError(""); + try { + const res = await fetch("/api/radar/catalog"); + if (res.status === 404) { + // Flag off — treat as not found + setOptIn(false); + setEntries([]); + setMeta(null); + setLoading(false); + return; + } + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const data = await res.json(); + setEntries(data.entries || []); + setMeta(data.meta || null); + } catch (err) { + setError(err instanceof Error ? err.message : t("errorLoading")); + } finally { + setLoading(false); + } + }, [t]); + + // D28 — fetch the referral links section ("Pegue seus créditos grátis"). + // Best-effort: flag off => 404, no cache => empty shape; either way this + // never blocks rendering of the rest of the page. + const fetchReferrals = useCallback(async () => { + try { + const res = await fetch("/api/radar/referrals"); + if (!res.ok) return; + const data = await res.json(); + setReferrals({ + fixed: Array.isArray(data.fixed) ? data.fixed : [], + campaigns: Array.isArray(data.campaigns) ? data.campaigns : [], + tier: data.tier ?? null, + }); + } catch { + // Best-effort only. + } + }, []); + + // Fetch settings to determine opt-in state (GET /api/radar/settings — FIX 3: + // previously there was no settings GET, so an already-opted-in operator saw + // the activation screen on every reload). + const fetchSettings = useCallback(async () => { + try { + const settingsRes = await fetch("/api/radar/settings"); + if (settingsRes.status === 404) { + // Flag off + setOptIn(false); + return; + } + if (!settingsRes.ok) throw new Error(`HTTP ${settingsRes.status}`); + const settingsData = await settingsRes.json(); + setOptIn(settingsData.optIn === true); + // F4/T7 — best-effort: keep whatever we already had if the field is + // absent (older cached response shape), never fall back to a literal. + if (typeof settingsData.contributorClaimUrl === "string") { + setContributorClaimUrl(settingsData.contributorClaimUrl); + } + if (typeof settingsData.supporterPlansUrl === "string") { + setSupporterPlansUrl(settingsData.supporterPlansUrl); + } + + if (settingsData.optIn === true) { + // Already opted in — load the catalog now so the populated/empty + // state renders immediately instead of waiting for a manual sync. + await fetchCatalog(); + // D28 — load the referral links in parallel; best-effort, never + // blocks the catalog state above. + void fetchReferrals(); + } + } catch { + setOptIn(null); + } finally { + setLoading(false); + } + }, [fetchCatalog, fetchReferrals]); + + useEffect(() => { + fetchSettings(); + }, [fetchSettings]); + + // Sync (defined before handleActivate which depends on it) + const handleSync = useCallback(async () => { + setSyncing(true); + setError(""); + try { + const res = await fetch("/api/radar/sync", { method: "POST" }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const data = await res.json(); + if (data.status === "updated" || data.status === "stale") { + await fetchCatalog(); + void fetchReferrals(); + } else if (data.status === "error" || data.status === "too_large") { + // "too_large" reuses the generic sync-failed copy — the feed exceeded the + // client-side size cap (10MB), which is operationally the same as any + // other sync failure from the operator's point of view. + setError(data.reason || t("syncFailed")); + } else if (data.status === "disabled") { + setError(t("flagDisabled")); + } else if (data.status === "opt_out") { + setOptIn(false); + } + } catch (err) { + setError(err instanceof Error ? err.message : t("syncFailed")); + } finally { + setSyncing(false); + } + }, [t, fetchCatalog, fetchReferrals]); + + // Auto-sync on open: when the operator is already opted in and the cached + // feed is stale (or absent), refresh it automatically once per mount so the + // page always shows current data without requiring the manual Sync button + // (spec: dados atualizados a cada abrir da página). The ref guards against + // re-firing when `meta` updates after the sync itself. + const autoSyncFiredRef = useRef(false); + useEffect(() => { + if (loading || syncing || optIn !== true || autoSyncFiredRef.current) return; + if (!shouldAutoSyncOnOpen(meta?.fetchedAt ?? null, Date.now())) return; + autoSyncFiredRef.current = true; + void handleSync(); + }, [loading, syncing, optIn, meta, handleSync]); + + // Activate opt-in + const handleActivate = useCallback(async () => { + setActivating(true); + try { + const res = await fetch("/api/radar/settings", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ optIn: true }), + }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + setOptIn(true); + // After activation, trigger a sync + await handleSync(); + } catch (err) { + setError(err instanceof Error ? err.message : t("activationFailed")); + } finally { + setActivating(false); + } + }, [t, handleSync]); + + // Determine effective state + const flagOn = optIn !== false || entries.length > 0 || meta !== null; + const pageState = resolveRadarPageState( + optIn !== false, // if we got a 404, optIn=false => flag off + optIn === true, + entries.length > 0 && meta !== null, + ); + + // Flag off — render not-found + if (pageState === "flag_off" && !loading) { + notFound(); + } + + return ( +
+ {/* Header */} +
+
+

{t("title")}

+

{t("subtitle")}

+
+ {pageState === "populated" && ( + + )} +
+ + {/* Feed freshness header */} + {meta && ( +
+ + {t("feedVersion")}: {meta.version} + + + {t("feedTier")}:{" "} + + {meta.tier === "live" ? t("tierLive") : t("tierCommunity")} + + + + {t("feedFetched")}: {relativeTime(meta.fetchedAt)} + +
+ )} + + {error && ( +
{error}
+ )} + + {loading ? ( +
+
{t("loading")}
+
+ ) : ( + <> + {/* Opt-in pending */} + {pageState === "optin_pending" && ( + +
+
📡
+

{t("activateTitle")}

+

{t("activateDescription")}

+
+
+ + {t("privacyNoUpload")} +
+
+ + {t("privacyOnlySigned")} +
+
+ + {t("privacyLocalOnly")} +
+
+ + + {/* F4/T7 — "get a supporter key" outbound links. Both open in a + new tab; neither one carries a price/value (D14 — the + only place pricing lives is the destination page). */} + {contributorClaimUrl && supporterPlansUrl && ( +
+

{t("claimSectionTitle")}

+ +

{t("contributorHint")}

+

{t("supporterHint")}

+
+ )} +
+
+ )} + + {/* D28 — tab bar. Only shown once opted in (empty/populated) — the + activation gate above is a single full-screen step, not a tab. */} + {(pageState === "empty" || pageState === "populated") && ( +
+ + +
+ )} + + {/* Free credits tab (D28 — referral links) */} + {(pageState === "empty" || pageState === "populated") && activeTab === "referrals" && ( +
+

{t("freeCreditsSubtitle")}

+ + {referrals.fixed.length === 0 ? ( + +

{t("fixedLinksEmpty")}

+
+ ) : ( +
+ {referrals.fixed.map((referral) => ( + +
+ {referral.provider} + {referral.requiredAction && ( +

+ {t("requiredActionLabel")} {referral.requiredAction} +

+ )} + + {t("claimButton")} + open_in_new + +
+
+ ))} +
+ )} + +
+

{t("campaignsTitle")}

+ {referrals.campaigns.length === 0 ? ( + +

+ {referrals.tier === "community" + ? t("campaignsUpsellCommunity") + : t("campaignsEmpty")} +

+
+ ) : ( +
+ {referrals.campaigns.map((referral, idx) => ( + +
+ {referral.provider} + {referral.requiredAction && ( +

+ {t("requiredActionLabel")} {referral.requiredAction} +

+ )} + {referral.validUntil && ( +

+ {t("campaignsValidUntil", { + date: new Date(referral.validUntil).toLocaleDateString(), + })} +

+ )} + + {t("claimButton")} + open_in_new + +
+
+ ))} +
+ )} +
+
+ )} + + {/* Empty cache — opted in but no data yet */} + {pageState === "empty" && activeTab === "catalog" && ( + +
+

{t("emptyState")}

+ +
+
+ )} + + {/* Populated catalog table */} + {pageState === "populated" && activeTab === "catalog" && ( + +
+
InterfaceEndpoint / commandUse it for
🧰 MCP (stdio)omniroute --mcpPlug into Claude Desktop, Cursor, any MCP client
🌊 MCP (HTTP)/api/mcp/streamRemote MCP — 104 tools, 31 scopes, full audit trail
🌊 MCP (HTTP)/api/mcp/streamRemote MCP — 105 tools, 31 scopes, full audit trail
📡 MCP (SSE)/api/mcp/sseStreaming MCP transport
🤝 A2A/.well-known/agent.jsonAgent-to-agent, JSON-RPC 2.0 + SSE, 6 skills
🌐 REST API/v1/*OpenAI-compatible — chat, embeddings, images, audio, OCR
+ + + + + + + + + + + + {entries.map((entry) => ( + + + + + + + + + ))} + +
{t("colProvider")}{t("colModel")}{t("colQuota")}{t("colContext")}{t("colCapabilities")}{t("colTos")}
+
+ {entry.provider} + {entry.origin === "radar" && ( + + {t("newBadge")} + + )} + {entry.setup?.keyUrl && ( + + ⚙ + + )} +
+ {entry.enabled === false && entry.disabledBy === "radar" && ( +

{t("disabledByFeed")}

+ )} +
+ {entry.displayName} + {budgetLabel(entry)} + {entry.contextWindow + ? `${(entry.contextWindow / 1000).toFixed(0)}K` + : "—"} + +
+ {entry.capabilities?.tools && ( + + {t("capTools")} + + )} + {entry.capabilities?.vision && ( + + {t("capVision")} + + )} + {entry.capabilities?.thinking && ( + + {t("capThinking")} + + )} +
+
+ + {entry.tos} + +
+ + + )} + + )} + + ); +} diff --git a/src/app/(dashboard)/dashboard/radar/setup/page.tsx b/src/app/(dashboard)/dashboard/radar/setup/page.tsx new file mode 100644 index 0000000000..1bbbe6e65b --- /dev/null +++ b/src/app/(dashboard)/dashboard/radar/setup/page.tsx @@ -0,0 +1,284 @@ +"use client"; + +import { useState, useEffect, useCallback, useMemo } from "react"; +import { useTranslations } from "next-intl"; +import { useSearchParams } from "next/navigation"; +import Link from "next/link"; +import { Card } from "@/shared/components"; + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +/** + * Localized text: either a plain string or an {en, pt?} object. + * The renderer resolves the best locale with EN fallback (D25 compat). + */ +type LocalizedText = string | { en: string; pt?: string }; + +interface SetupInfo { + keyUrl: string | null; + steps: LocalizedText[]; +} + +interface ProviderSetupData { + provider: string; + setup: SetupInfo | null; + configured: boolean; +} + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** Resolve a LocalizedText to a display string. */ +function resolveText(text: LocalizedText, locale: string): string { + if (typeof text === "string") return text; + if (locale === "pt" && text.pt) return text.pt; + return text.en; +} + +// --------------------------------------------------------------------------- +// Component +// --------------------------------------------------------------------------- + +export default function RadarSetupPage() { + const t = useTranslations("radarSetupPage"); + const searchParams = useSearchParams(); + const provider = searchParams.get("provider"); + const locale = "en"; // Could be derived from next-intl locale later + + const [setupData, setSetupData] = useState(null); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(""); + const [testing, setTesting] = useState(false); + const [testResult, setTestResult] = useState<{ ok: boolean; message: string } | null>(null); + + // Fetch catalog to find the provider's setup data + useEffect(() => { + if (!provider) { + setLoading(false); + return; + } + + async function load() { + try { + const res = await fetch("/api/radar/catalog"); + if (res.status === 404) { + setError(t("flagDisabled")); + setLoading(false); + return; + } + if (!res.ok) throw new Error(`HTTP ${res.status}`); + const data = await res.json(); + + // Find ALL entries for this provider and extract setup from the first one that has it + const providerEntries = data.entries.filter( + (e: { provider: string }) => e.provider === provider, + ); + + if (providerEntries.length === 0) { + setError(t("providerNotFound", { provider })); + setLoading(false); + return; + } + + // Find setup info from feed entries (they carry the setup field) + const entryWithSetup = providerEntries.find( + (e: { setup?: SetupInfo | null }) => e.setup && (e.setup.steps.length > 0 || e.setup.keyUrl), + ); + + // Check if provider is configured (has connections) + // We infer this from whether the provider exists in the catalog at all + // The actual connection check would need a separate API — for now we show + // the guide regardless + setSetupData({ + provider, + setup: entryWithSetup?.setup ?? null, + configured: false, // Will be enriched when connection-status API is available + }); + } catch (err) { + setError(err instanceof Error ? err.message : t("loadFailed")); + } finally { + setLoading(false); + } + } + + load(); + }, [provider, t]); + + // Test connection — uses the EXISTING connection-test endpoint + const handleTestConnection = useCallback(async () => { + if (!provider) return; + setTesting(true); + setTestResult(null); + try { + // The existing test endpoint is POST /api/providers/[id]/test + // We need the connection ID — for now we use the provider ID as a proxy. + // In a full implementation, the setup page would list connections for + // this provider and test each one. Here we test the first connection. + const res = await fetch(`/api/providers/${encodeURIComponent(provider)}/test`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({}), + }); + if (res.ok) { + setTestResult({ ok: true, message: t("testSuccess") }); + } else { + const data = await res.json().catch(() => null); + setTestResult({ + ok: false, + message: data?.error?.message || t("testFailed"), + }); + } + } catch { + setTestResult({ ok: false, message: t("testFailed") }); + } finally { + setTesting(false); + } + }, [provider, t]); + + if (!provider) { + return ( +
+

{t("title")}

+ +
{t("noProvider")}
+
+
+ ); + } + + return ( +
+ {/* Header */} +
+ + ← {t("backToCatalog")} + +
+
+

{t("setupTitle", { provider })}

+

{t("setupSubtitle")}

+
+ + {error && ( +
{error}
+ )} + + {loading ? ( +
+
{t("loading")}
+
+ ) : setupData ? ( + <> + {/* Configured indicator */} + {setupData.configured && ( + +
+ + {t("providerConfigured")} +
+
+ )} + + {/* Key URL */} + {setupData.setup?.keyUrl && ( + +
+

{t("getApiKey")}

+ + {setupData.setup.keyUrl} + +
+
+ )} + + {/* Steps */} + {setupData.setup && setupData.setup.steps.length > 0 && ( + +
+

{t("setupSteps")}

+
    + {setupData.setup.steps.map((step, idx) => ( +
  1. + + {idx + 1} + + + {resolveText(step, locale)} + +
  2. + ))} +
+
+
+ )} + + {/* No guide available */} + {(!setupData.setup || setupData.setup.steps.length === 0) && !setupData.setup?.keyUrl && ( + +
+

{t("noGuide")}

+ + {t("visitDocs")} + +
+
+ )} + + {/* Test connection */} + +
+

{t("testConnection")}

+

{t("testDescription")}

+
+ + {testResult && ( + + {testResult.message} + + )} +
+
+
+ + {/* Add connection link */} + +
+

{t("addConnection")}

+

{t("addConnectionDescription")}

+ + {t("addConnectionLink")} + +
+
+ + ) : null} +
+ ); +} diff --git a/src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx b/src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx index e5ce799907..b87aa200d8 100644 --- a/src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/ProxyRegistryManager.tsx @@ -1014,6 +1014,9 @@ export default function ProxyRegistryManager({ setForm((prev) => ({ ...prev, username: e.target.value }))} /> @@ -1024,6 +1027,9 @@ export default function ProxyRegistryManager({ type="password" className="w-full px-3 py-2 rounded bg-bg-subtle border border-border" value={form.password} + autoComplete="new-password" + data-1p-ignore="true" + data-lpignore="true" placeholder={editingId ? t("passwordPlaceholderEdit") : ""} onChange={(e) => setForm((prev) => ({ ...prev, password: e.target.value }))} /> diff --git a/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx b/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx index 946020b049..6ce533c45c 100644 --- a/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx +++ b/src/app/(dashboard)/dashboard/settings/components/proxy/FreePoolTab.tsx @@ -84,9 +84,10 @@ export default function FreePoolTab() { fetch("/api/settings/free-proxies/stats"), ]); if (proxiesRes.ok) { - const data = await proxiesRes.json(); - setProxies(data.items || []); - setTotal(data.total ?? 0); + const body = await proxiesRes.json(); + const payload = body?.data ?? body; + setProxies(payload.proxies ?? payload.items ?? []); + setTotal(payload.total ?? 0); } if (statsRes.ok) { const data = await statsRes.json(); diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx index 8a5fdb1a62..0a5c178a84 100644 --- a/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/AgentBridgePageClient.tsx @@ -94,9 +94,7 @@ export default function AgentBridgePageClient({ const res = await fetch("/api/tools/agent-bridge/server", { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify( - sudoPassword ? { action, sudoPassword } : { action } - ), + body: JSON.stringify(sudoPassword ? { action, sudoPassword } : { action }), }); const payload = (await res.json().catch(() => ({}))) as { error?: { message?: string }; @@ -138,37 +136,43 @@ export default function AgentBridgePageClient({ // ── Upstream CA ─────────────────────────────────────────────────────────── - const handleUpstreamCaSave = useCallback(async (path: string) => { - setActionError(null); - try { - const res = await fetch("/api/tools/agent-bridge/upstream-ca", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ path }), - }); - if (!res.ok) throw new Error(`HTTP ${res.status}`); - await refresh(); - } catch (err) { - setActionError(err instanceof Error ? err.message : t("unknownError")); - } - }, [refresh, t]); + const handleUpstreamCaSave = useCallback( + async (path: string) => { + setActionError(null); + try { + const res = await fetch("/api/tools/agent-bridge/upstream-ca", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ path }), + }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + await refresh(); + } catch (err) { + setActionError(err instanceof Error ? err.message : t("unknownError")); + } + }, + [refresh, t] + ); // ── Bypass list ─────────────────────────────────────────────────────────── - const handleBypassSave = useCallback(async (patterns: string[]) => { - setActionError(null); - try { - const res = await fetch("/api/tools/agent-bridge/bypass", { - method: "PUT", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ patterns }), - }); - if (!res.ok) throw new Error(`HTTP ${res.status}`); - await refresh(); - } catch (err) { - setActionError(err instanceof Error ? err.message : t("unknownError")); - } - }, [refresh, t]); + const handleBypassSave = useCallback( + async (patterns: string[]) => { + setActionError(null); + try { + const res = await fetch("/api/tools/agent-bridge/bypass", { + method: "PUT", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ patterns }), + }); + if (!res.ok) throw new Error(`HTTP ${res.status}`); + await refresh(); + } catch (err) { + setActionError(err instanceof Error ? err.message : t("unknownError")); + } + }, + [refresh, t] + ); // ── DNS toggle ──────────────────────────────────────────────────────────── @@ -180,9 +184,7 @@ export default function AgentBridgePageClient({ const res = await fetch(`/api/tools/agent-bridge/agents/${agentId}/dns`, { method: "POST", headers: { "Content-Type": "application/json" }, - body: JSON.stringify( - password ? { enabled, sudoPassword: password } : { enabled } - ), + body: JSON.stringify(password ? { enabled, sudoPassword: password } : { enabled }), }); if (!res.ok) { const payload = (await res.json().catch(() => ({}))) as { diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx index 4e54226fc7..fb5eab24c5 100644 --- a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentCard.tsx @@ -21,7 +21,6 @@ function hasAcceptedRisk(agentId: string): boolean { } } - interface AgentCardProps { target: MitmTargetView; agentState: AgentStateEntry | undefined; diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx index fa4365b385..15fdafee40 100644 --- a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/AgentList.tsx @@ -4,7 +4,11 @@ import { useState } from "react"; import { useTranslations } from "next-intl"; import { AgentCard } from "./AgentCard"; import type { MitmTargetView } from "@/mitm/types"; -import type { AgentStateEntry, AgentMappingsMap, AgentBridgeServerState } from "../AgentBridgePageClient"; +import type { + AgentStateEntry, + AgentMappingsMap, + AgentBridgeServerState, +} from "../AgentBridgePageClient"; import type { MappingRow } from "./ModelMappingTable"; interface AgentListProps { diff --git a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelMappingTable.tsx b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelMappingTable.tsx index ac67e9a7b2..d9d9759522 100644 --- a/src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelMappingTable.tsx +++ b/src/app/(dashboard)/dashboard/tools/agent-bridge/components/ModelMappingTable.tsx @@ -55,7 +55,8 @@ export function ModelMappingTable({ agentId, mappings, onSave }: ModelMappingTab {rows.length === 0 ? (

- {t("noMappingsDesc") || "No model mappings configured yet. Add mappings to route agent requests through OmniRoute."} + {t("noMappingsDesc") || + "No model mappings configured yet. Add mappings to route agent requests through OmniRoute."}

diff --git a/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/TelegramConfigForm.tsx b/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/TelegramConfigForm.tsx index 763dd90efe..17560d8d74 100644 --- a/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/TelegramConfigForm.tsx +++ b/src/app/(dashboard)/dashboard/webhooks/components/steps/integrations/TelegramConfigForm.tsx @@ -12,12 +12,7 @@ interface TelegramConfigFormProps { isEditing?: boolean; } -export function TelegramConfigForm({ - value, - onChange, - t, - isEditing, -}: TelegramConfigFormProps) { +export function TelegramConfigForm({ value, onChange, t, isEditing }: TelegramConfigFormProps) { return (
diff --git a/src/app/a2a/route.ts b/src/app/a2a/route.ts index 0423770f22..7a5d4ec37b 100644 --- a/src/app/a2a/route.ts +++ b/src/app/a2a/route.ts @@ -10,6 +10,7 @@ * Auth: Bearer token via Authorization header */ +import { timingSafeEqual } from "node:crypto"; import { NextRequest, NextResponse } from "next/server"; import { getTaskManager } from "@/lib/a2a/taskManager"; import { logRoutingDecision } from "@/lib/a2a/routingLogger"; @@ -64,6 +65,20 @@ function toMessageArray(raw: unknown): A2AMessage[] | null { // ============ Auth ============ +/** + * Constant-time comparison of the presented bearer token against the configured + * key. A plain `===` short-circuits on the first differing byte, leaking the + * length of the shared prefix through response timing; `timingSafeEqual` does + * not. It requires equal-length buffers, so mismatched lengths are rejected up + * front (the length itself is not secret). + */ +function tokensMatch(provided: string, expected: string): boolean { + const a = Buffer.from(provided); + const b = Buffer.from(expected); + if (a.length !== b.length) return false; + return timingSafeEqual(a, b); +} + function authenticate(req: NextRequest): boolean { // If no API key is configured, allow all requests const configuredKey = process.env.OMNIROUTE_API_KEY; @@ -71,7 +86,7 @@ function authenticate(req: NextRequest): boolean { const authHeader = req.headers.get("authorization") || ""; const token = authHeader.replace(/^Bearer\s+/i, ""); - return token === configuredKey; + return tokensMatch(token, configuredKey); } // ============ JSON-RPC Helpers ============ @@ -106,7 +121,6 @@ async function rejectIfA2ADisabled(id: string | number | null) { // ============ Route Handler ============ export async function POST(req: NextRequest) { - console.log("==> HIT A2A ROUTER:", req.url); // Auth check if (!authenticate(req)) { return jsonRpcError(null, -32600, "Unauthorized: missing or invalid API key"); diff --git a/src/app/api/cli-tools/codex-settings/route.ts b/src/app/api/cli-tools/codex-settings/route.ts index 2f382a62bc..0212880f7d 100644 --- a/src/app/api/cli-tools/codex-settings/route.ts +++ b/src/app/api/cli-tools/codex-settings/route.ts @@ -266,14 +266,15 @@ export async function POST(request: Request) { delete parsed._root.model_reasoning_effort; } - const normalizedBaseUrl = normalizeCodexBaseUrl(baseUrl, wireApi || "chat"); + const effectiveWireApi = wireApi ?? "responses"; + const normalizedBaseUrl = normalizeCodexBaseUrl(baseUrl, effectiveWireApi); // Always create a custom provider to reliably pass wire_api and use OMNIROUTE_API_KEY parsed._root.model_provider = "omniroute"; parsed._sections["model_providers.omniroute"] = { name: "OmniRoute", base_url: normalizedBaseUrl, - wire_api: wireApi || "chat", + wire_api: effectiveWireApi, env_key: "OPENAI_API_KEY", }; delete parsed._root.openai_base_url; diff --git a/src/app/api/db-backups/export/route.ts b/src/app/api/db-backups/export/route.ts index 7b400da3eb..8fa1422c26 100644 --- a/src/app/api/db-backups/export/route.ts +++ b/src/app/api/db-backups/export/route.ts @@ -34,21 +34,39 @@ export async function GET(request: Request) { const db = getDbInstance(); await db.backup(tmpPath); - const fileBuffer = fs.readFileSync(tmpPath); + const { size: fileSize } = fs.statSync(tmpPath); + const readStream = fs.createReadStream(tmpPath); - // Cleanup temp file - try { - fs.unlinkSync(tmpPath); - } catch { - /* best effort */ - } + // Cleanup temp file on completion, error, or client abort + const cleanup = () => { + readStream.destroy(); + fs.unlink(tmpPath, () => {}); + }; + request.signal.addEventListener("abort", cleanup, { once: true }); - return new Response(fileBuffer, { + const webStream = new ReadableStream({ + start(controller) { + readStream.on("data", (chunk) => controller.enqueue(chunk)); + readStream.on("end", () => { + controller.close(); + cleanup(); + }); + readStream.on("error", (err) => { + controller.error(err); + cleanup(); + }); + }, + cancel() { + cleanup(); + }, + }); + + return new Response(webStream, { status: 200, headers: { "Content-Type": "application/octet-stream", "Content-Disposition": `attachment; filename="${exportFilename}"`, - "Content-Length": String(fileBuffer.length), + "Content-Length": String(fileSize), "Cache-Control": "no-cache, no-store", }, }); diff --git a/src/app/api/memory/[id]/route.ts b/src/app/api/memory/[id]/route.ts index d86af28a86..f85d037ec7 100644 --- a/src/app/api/memory/[id]/route.ts +++ b/src/app/api/memory/[id]/route.ts @@ -1,6 +1,6 @@ import { NextResponse } from "next/server"; import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; -import { deleteMemory, getMemory, updateMemory } from "@/lib/memory/store"; +import { memoryManager } from "@/lib/memory/manager"; import { validateBody, isValidationFailure } from "@/shared/validation/helpers"; import { MemoryUpdatePutSchema } from "@/shared/schemas/memory"; import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error.ts"; @@ -11,7 +11,7 @@ export async function DELETE(request: Request, props: { params: Promise<{ id: st try { const { id } = await props.params; - const success = await deleteMemory(id); + const success = await memoryManager.delete(id); if (!success) { return NextResponse.json({ error: "Memory not found" }, { status: 404 }); } @@ -28,7 +28,7 @@ export async function GET(request: Request, props: { params: Promise<{ id: strin try { const { id } = await props.params; - const memory = await getMemory(id); + const memory = await memoryManager.get(id); if (!memory) { return NextResponse.json({ error: "Not found" }, { status: 404 }); } @@ -49,7 +49,7 @@ export async function PUT(request: Request, props: { params: Promise<{ id: strin } catch { return NextResponse.json( { error: { message: "Invalid JSON body", details: [] } }, - { status: 400 }, + { status: 400 } ); } @@ -60,12 +60,12 @@ export async function PUT(request: Request, props: { params: Promise<{ id: strin try { const { id } = await props.params; - const existing = await getMemory(id); + const existing = await memoryManager.get(id); if (!existing) { return NextResponse.json({ error: { message: "Memory not found" } }, { status: 404 }); } - await updateMemory(id, validation.data); + await memoryManager.update(id, validation.data); return NextResponse.json({ success: true }); } catch (err: unknown) { const message = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); diff --git a/src/app/api/memory/route.ts b/src/app/api/memory/route.ts index e344b104fb..7c3d2b7ac4 100644 --- a/src/app/api/memory/route.ts +++ b/src/app/api/memory/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from "next/server"; import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; import { listMemories, createMemory, getMemoryTokensUsed } from "@/lib/memory/store"; +import { memoryManager } from "@/lib/memory"; import { memoryCache } from "@/lib/memory/cache"; import { MemoryType } from "@/lib/memory/types"; import { parsePaginationParams, buildPaginatedResponse } from "@/shared/types/pagination"; @@ -38,14 +39,15 @@ export async function GET(request: Request) { const type = (searchParams.get("type") as any) || undefined; const sessionId = searchParams.get("sessionId") || undefined; - const result = await listMemories({ + const result = await memoryManager.list({ apiKeyId, type, sessionId, query, limit: paginationParams.limit, - offset, - page: offset === undefined ? paginationParams.page : undefined, + offset: + offset ?? + (offset === undefined ? undefined : (paginationParams.page - 1) * paginationParams.limit), }); // Total tokens across all memories (computed in SQL inside the domain module @@ -98,7 +100,15 @@ export async function POST(request: Request) { if (isValidationFailure(validation)) { return NextResponse.json(validation.error, { status: 400 }); } - const memoryId = await createMemory(validation.data); + const memoryId = await memoryManager.create({ + apiKeyId: validation.data.apiKeyId, + sessionId: validation.data.sessionId, + type: validation.data.type, + key: validation.data.key, + content: validation.data.content, + metadata: validation.data.metadata, + expiresAt: validation.data.expiresAt, + }); return NextResponse.json({ success: true, id: memoryId }); } catch (err: unknown) { const message = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); diff --git a/src/app/api/models/test-all/route.ts b/src/app/api/models/test-all/route.ts index 30b4236a9f..5492b40a27 100644 --- a/src/app/api/models/test-all/route.ts +++ b/src/app/api/models/test-all/route.ts @@ -47,6 +47,7 @@ export interface BatchTestResultEntry { statusCode?: number; rateLimited?: boolean; isTransient?: boolean; + isQuota?: boolean; hidden?: boolean; isTimeout?: boolean; } @@ -63,6 +64,7 @@ function toBatchEntry( if (result.statusCode !== undefined) entry.statusCode = result.statusCode; if (result.rateLimited === true) entry.rateLimited = true; if (result.isTransient === true) entry.isTransient = true; + if (result.isQuota === true) entry.isQuota = true; if (result.isTimeout === true) entry.isTimeout = true; return entry; } @@ -176,10 +178,13 @@ export async function POST(request: Request) { consecutiveRateLimits = 0; } + // #9511: quota entries (403 with "insufficient balance" etc.) are NOT + // bot-blocks — they should not count toward the bot-block stop threshold. const botBlocked = - entry.statusCode === 403 || - (typeof entry.error === "string" && - /cloudflare|bot management|recaptcha|cf-chl|just a moment/i.test(entry.error)); + !entry.isQuota && + (entry.statusCode === 403 || + (typeof entry.error === "string" && + /cloudflare|bot management|recaptcha|cf-chl|just a moment/i.test(entry.error))); if (botBlocked) { consecutiveBotBlocks += 1; } else if (entry.status === "ok") { @@ -191,7 +196,8 @@ export async function POST(request: Request) { entry.status === "error" && !entry.rateLimited && !entry.isTimeout && - !entry.isTransient + !entry.isTransient && + !entry.isQuota ) { try { await setModelIsHidden(providerId, modelId, true); diff --git a/src/app/api/oauth/[provider]/[action]/route.ts b/src/app/api/oauth/[provider]/[action]/route.ts index cd24358f14..df82b63071 100755 --- a/src/app/api/oauth/[provider]/[action]/route.ts +++ b/src/app/api/oauth/[provider]/[action]/route.ts @@ -574,12 +574,7 @@ export async function POST( // Poll for token (through proxy if configured) let result; - if (NO_PKCE_DEVICE_CODE_PROVIDERS.has(provider)) { - // Non-PKCE device providers do not receive a code verifier. - result = await runWithProxyContextOrDirect(proxy, () => - (pollForToken as any)(provider, deviceCode) - ); - } else if (provider === "ghe-copilot") { + if (provider === "ghe-copilot") { // GHE Copilot needs gheUrl threaded through poll → postExchange const gheUrl = extraData && typeof extraData === "object" ? (extraData as any).gheUrl : undefined; @@ -589,6 +584,11 @@ export async function POST( result = await runWithProxyContextOrDirect(proxy, () => (pollForToken as any)(provider, deviceCode, null, gheUrl ? { gheUrl } : undefined) ); + } else if (NO_PKCE_DEVICE_CODE_PROVIDERS.has(provider)) { + // Non-PKCE device providers do not receive a code verifier. + result = await runWithProxyContextOrDirect(proxy, () => + (pollForToken as any)(provider, deviceCode) + ); } else if (provider === "kiro" || provider === "amazon-q") { // Kiro needs extraData (clientId, clientSecret) from device code response result = await runWithProxyContextOrDirect(proxy, () => diff --git a/src/app/api/oauth/kiro/import/route.ts b/src/app/api/oauth/kiro/import/route.ts index 54b63d2f3e..d4b89183ab 100755 --- a/src/app/api/oauth/kiro/import/route.ts +++ b/src/app/api/oauth/kiro/import/route.ts @@ -217,11 +217,15 @@ export async function POST(request: Request) { testStatus: "active", isActive: true, }; - const connection: any = await upsertImportedKiroConnection(targetProvider, record, { - profileArn: resolvedProfileArn, - clientId: providerSpecificData.clientId, - email, - }); + // Only include clientId in the identity for IDC imports where it is genuinely + // unique per account (#2059). For Builder ID / social imports the OIDC clientId + // comes from a machine-wide cached OIDC registration (shared across all accounts + // on the same machine), so using it for identity matching would cause different + // accounts to overwrite each other (#9435). Without clientId, the identity + // matching falls through to the email field, which correctly distinguishes imports. + const identity: Record = { profileArn: resolvedProfileArn, email }; + if (isIdc) identity.clientId = providerSpecificData.clientId; + const connection: any = await upsertImportedKiroConnection(targetProvider, record, identity); // Auto sync to Cloud if enabled await syncToCloudIfEnabled(); diff --git a/src/app/api/oauth/raycast/auto-import/route.ts b/src/app/api/oauth/raycast/auto-import/route.ts new file mode 100644 index 0000000000..17e4cf48c5 --- /dev/null +++ b/src/app/api/oauth/raycast/auto-import/route.ts @@ -0,0 +1,124 @@ +/** + * @file route.ts + * @description Auto-import Raycast Pro credentials from local macOS Keychain + DB. + * + * @changes + * - [2026-07-27] [Composer] - One-click local Raycast credential extraction + */ + +import { NextResponse } from "next/server"; +import { createProviderConnection } from "@/models"; +import { replaceSyncedAvailableModelsForConnection } from "@/lib/db/models"; +import { RaycastService } from "@/lib/oauth/services/raycast"; +import { + extractLocalRaycastCredentials, + isRaycastLocalExtractAvailable, +} from "@/lib/oauth/services/raycastLocal"; +import { isAuthRequired, isAuthenticated } from "@/shared/utils/apiAuth"; +import { resolveProxyForProvider } from "@/models"; +import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts"; + +async function requireOAuthImportAuth(request: Request) { + if (!(await isAuthRequired(request))) return null; + if (await isAuthenticated(request)) return null; + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); +} + +export async function GET(request: Request) { + const authResponse = await requireOAuthImportAuth(request); + if (authResponse) return authResponse; + + return NextResponse.json({ + available: isRaycastLocalExtractAvailable(), + platform: process.platform, + requires: ["macOS", "Raycast.app installed", "sqlcipher CLI (brew install sqlcipher)"], + sources: { + bearerToken: "Keychain → Raycast / raycast-store_credentials → oauth.access_token", + deviceId: + "Raycast encrypted DB user.analyticsId (same as posthog.distinctId on disk)", + }, + }); +} + +export async function POST(request: Request) { + const authResponse = await requireOAuthImportAuth(request); + if (authResponse) return authResponse; + + if (!isRaycastLocalExtractAvailable()) { + return NextResponse.json( + { + error: + "Raycast auto-import unavailable — need macOS, Raycast installed, and sqlcipher (`brew install sqlcipher`)", + }, + { status: 400 } + ); + } + + try { + const local = extractLocalRaycastCredentials(); + const raycastService = new RaycastService(); + const resolved = raycastService.validateCredentials({ + accessToken: local.accessToken, + deviceId: local.deviceId, + aid: local.aid, + }); + + const proxy = await resolveProxyForProvider("raycast"); + const models = await runWithProxyContext(proxy, () => + raycastService.probeModels({ + accessToken: local.accessToken, + deviceId: local.deviceId, + aid: resolved.aid, + }) + ); + + const connection: any = await createProviderConnection({ + provider: "raycast", + authType: "oauth", + accessToken: local.accessToken, + refreshToken: null, + email: local.email || null, + expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), + providerSpecificData: { + deviceId: local.deviceId, + aid: resolved.aid, + authMethod: "auto_imported", + username: local.username, + hasProFeatures: local.hasProFeatures, + hasBetterAI: local.hasBetterAI, + extractSource: local.source, + modelCount: models.length, + premiumModelCount: models.filter((m) => m.requires_better_ai).length, + }, + testStatus: "active", + }); + + await replaceSyncedAvailableModelsForConnection( + "raycast", + connection.id, + models.map((model) => ({ + id: model.id, + name: model.name || model.id, + })) + ); + + return NextResponse.json({ + success: true, + source: local.source, + connection: { + id: connection.id, + provider: connection.provider, + email: connection.email, + }, + models: { + total: models.length, + premium: models.filter((m) => m.requires_better_ai).length, + sample: models.slice(0, 12).map((m) => m.id), + }, + }); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : String(error); + console.error("Raycast auto-import error:", message); + return NextResponse.json({ error: message }, { status: 400 }); + } +} diff --git a/src/app/api/oauth/raycast/import/route.ts b/src/app/api/oauth/raycast/import/route.ts new file mode 100644 index 0000000000..0ff02764fa --- /dev/null +++ b/src/app/api/oauth/raycast/import/route.ts @@ -0,0 +1,143 @@ +/** + * @file route.ts + * @description Import Raycast Pro credentials captured from macOS app traffic. + * + * @changes + * - [2026-07-27] [Composer] - Initial Raycast token import route (local dev) + */ + +import { NextResponse } from "next/server"; +import { createProviderConnection } from "@/models"; +import { RaycastService } from "@/lib/oauth/services/raycast"; +import { raycastImportSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; +import { isAuthRequired, isAuthenticated } from "@/shared/utils/apiAuth"; +import { resolveProxyForProvider } from "@/models"; +import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts"; + +async function requireOAuthImportAuth(request: Request) { + if (!(await isAuthRequired(request))) return null; + if (await isAuthenticated(request)) return null; + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); +} + +export async function POST(request: Request) { + const authResponse = await requireOAuthImportAuth(request); + if (authResponse) return authResponse; + + let rawBody; + try { + rawBody = await request.json(); + } catch { + return NextResponse.json( + { + error: { + message: "Invalid request", + details: [{ field: "body", message: "Invalid JSON body" }], + }, + }, + { status: 400 } + ); + } + + try { + const validation = validateBody(raycastImportSchema, rawBody); + if (isValidationFailure(validation)) { + return NextResponse.json({ error: validation.error }, { status: 400 }); + } + + const { accessToken, deviceId, aid, signatureJwt, sigSecret } = validation.data; + const raycastService = new RaycastService(); + const resolved = raycastService.validateCredentials({ + accessToken, + deviceId, + aid, + signatureJwt, + sigSecret, + }); + + const proxy = await resolveProxyForProvider("raycast"); + const models = await runWithProxyContext(proxy, () => + raycastService.probeModels({ + accessToken: accessToken.trim(), + deviceId: deviceId.trim(), + aid: resolved.aid, + sigSecret: sigSecret?.trim(), + }) + ); + + const connection: any = await createProviderConnection({ + provider: "raycast", + authType: "oauth", + accessToken: accessToken.trim(), + refreshToken: null, + expiresAt: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(), + providerSpecificData: { + deviceId: deviceId.trim(), + aid: resolved.aid, + sigSecret: sigSecret?.trim() || "", + authMethod: "imported", + modelCount: models.length, + premiumModelCount: models.filter((m) => m.requires_better_ai).length, + }, + testStatus: "active", + }); + + return NextResponse.json({ + success: true, + connection: { + id: connection.id, + provider: connection.provider, + }, + models: { + total: models.length, + premium: models.filter((m) => m.requires_better_ai).length, + sample: models.slice(0, 8).map((m) => m.id), + }, + }); + } catch (error: unknown) { + const message = error instanceof Error ? error.message : String(error); + console.error("Raycast import token error:", message); + return NextResponse.json({ error: message }, { status: 400 }); + } +} + +export async function GET(request: Request) { + const authResponse = await requireOAuthImportAuth(request); + if (authResponse) return authResponse; + + const raycastService = new RaycastService(); + + return NextResponse.json({ + provider: "raycast", + method: "import_token", + localDevOnly: true, + instructions: raycastService.getCaptureInstructions(), + requiredFields: [ + { + name: "accessToken", + label: "Bearer Token", + description: "From Authorization: Bearer header on backend.raycast.com requests", + type: "textarea", + }, + { + name: "deviceId", + label: "Device ID", + description: "From X-Raycast-DeviceId header", + type: "text", + }, + { + name: "signatureJwt", + label: "Signature JWT", + description: "From X-Raycast-Signature header (AID decoded automatically)", + type: "textarea", + }, + { + name: "sigSecret", + label: "Signature Secret", + description: "Optional override — defaults to community-extracted SIG_SECRET", + type: "text", + }, + ], + }); +} diff --git a/src/app/api/plugins/marketplace/install/route.ts b/src/app/api/plugins/marketplace/install/route.ts new file mode 100644 index 0000000000..f2c1b24e5b --- /dev/null +++ b/src/app/api/plugins/marketplace/install/route.ts @@ -0,0 +1,36 @@ +import { NextRequest, NextResponse } from "next/server"; +import { CORS_HEADERS, handleCorsOptions } from "@/shared/utils/cors"; +import { buildErrorBody } from "@omniroute/open-sse/utils/error"; +import { installMarketplacePlugin } from "@/lib/plugins/marketplace"; +import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; + +export async function OPTIONS() { + return handleCorsOptions(); +} + +/** + * POST /api/plugins/marketplace/install — Install a plugin from marketplace by name + */ +export async function POST(request: NextRequest) { + const authError = await requireManagementAuth(request); + if (authError) return authError; + try { + const body = await request.json(); + const { name } = body as { name?: string }; + if (!name || typeof name !== "string") { + return NextResponse.json(buildErrorBody(400, "Missing or invalid 'name' field"), { + status: 400, + headers: CORS_HEADERS, + }); + } + const result = await installMarketplacePlugin(name); + return NextResponse.json(result, { status: 201, headers: CORS_HEADERS }); + } catch (err: unknown) { + const msg = err instanceof Error ? err.message : "Failed to install marketplace plugin"; + console.error("[plugins/marketplace] Install error:", msg); + return NextResponse.json(buildErrorBody(400, msg), { + status: 400, + headers: CORS_HEADERS, + }); + } +} diff --git a/src/app/api/providers/[id]/login/route.ts b/src/app/api/providers/[id]/login/route.ts index a095cd7f68..349bf3b6ab 100644 --- a/src/app/api/providers/[id]/login/route.ts +++ b/src/app/api/providers/[id]/login/route.ts @@ -1,7 +1,7 @@ /** * POST /api/providers/[id]/login * - * Web-cookie provider login endpoint. Launches a Playwright browser, + * Web-cookie provider login endpoint. Launches a browser, * navigates to the provider's login page, polls for session tokens, * and persists extracted credentials to the provider connection. */ @@ -11,6 +11,15 @@ import { getCachedProviderConnectionById, updateProviderConnection } from "@/lib import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error.ts"; +const ADOBE_FIREFLY_SLUGS = new Set(["adobe-firefly", "firefly"]); + +/** Resolve the provider slug (e.g. "claude-web", "adobe-firefly") from the connection row. */ +function resolveProviderSlug(connection: Record | null): string { + const raw = connection?.provider; + if (typeof raw === "string" && raw.trim()) return raw.trim(); + return ""; +} + // ─── POST: Start login flow ──────────────────────────────────────────────── export async function POST( @@ -28,22 +37,75 @@ export async function POST( const body = await req.json().catch(() => ({})); const timeout = typeof body.timeout === "number" ? body.timeout : undefined; + const providerSlug = resolveProviderSlug(provider as Record); try { - // Dynamic import — InAppLoginService depends on Playwright (heavy) - const { inAppLoginService } = await import( - "@omniroute/open-sse/services/inAppLoginService.ts" - ); + // Adobe Firefly is special: the IMS JWT is only ever in the Authorization + // header of firefly-3p.ff.adobe.io XHRs (never cookies/localStorage), so + // the generic cookie-extraction service cannot capture it. Use a dedicated + // Playwright service that intercepts that request instead. + if (ADOBE_FIREFLY_SLUGS.has(providerSlug)) { + const { startAdobeFireflyBrowserLogin } = + await import("@omniroute/open-sse/services/adobeFireflyBrowserLogin.ts"); + const fireflyResult = await startAdobeFireflyBrowserLogin(timeout); - const result = await inAppLoginService.startLogin(id, { timeout }); + if (fireflyResult.success && fireflyResult.credentials) { + const credentials = fireflyResult.credentials; + try { + // Store the JWT in apiKey (where resolveAdobeAccessToken looks first) + // and the cookie + access_token in providerSpecificData (camelCase — + // updateProviderConnection ignores snake_case keys). + const providerSpecificData: Record = {}; + if (credentials.accessToken) { + providerSpecificData.access_token = credentials.accessToken; + } + if (credentials.cookie) { + providerSpecificData.cookie = credentials.cookie; + } + + await updateProviderConnection(id, { + apiKey: credentials.accessToken || "", + providerSpecificData, + }); + + return NextResponse.json({ + success: true, + accessToken: credentials.accessToken || "", + cookie: credentials.cookie || "", + account: fireflyResult.account || "", + credentials: providerSpecificData, + persisted: true, + }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : err); + return NextResponse.json( + { success: false, error: `Extracted but failed to persist: ${msg}` }, + { status: 500 } + ); + } + } + + return NextResponse.json( + { success: false, error: fireflyResult.error || "Adobe Firefly sign-in failed" }, + { status: 400 } + ); + } + + // Generic web-cookie path: pass the provider SLUG (not the DB id) so + // TOKEN_EXTRACTION_CONFIGS can find the extraction config. + // Bug: the previous code passed `id` (connection UUID), so the lookup always + // missed and returned "No extraction config" without launching a browser. + const { inAppLoginService } = await import("@omniroute/open-sse/services/inAppLoginService.ts"); + + const result = await inAppLoginService.startLogin(providerSlug || id, { timeout }); // Persist credentials if extraction succeeded if (result.success && result.credentials) { try { const credentialsStr = JSON.stringify(result.credentials); await updateProviderConnection(id, { - api_key: credentialsStr, - provider_specific_data: result.credentials, + apiKey: credentialsStr, + providerSpecificData: result.credentials, }); return NextResponse.json({ diff --git a/src/app/api/providers/[id]/models/route.ts b/src/app/api/providers/[id]/models/route.ts index c7d74a1f9d..10af48e71b 100755 --- a/src/app/api/providers/[id]/models/route.ts +++ b/src/app/api/providers/[id]/models/route.ts @@ -30,6 +30,7 @@ import { import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; import { getStaticQoderModels } from "@omniroute/open-sse/services/qoderCli.ts"; import { deriveConfigFromRegistryModelsUrl } from "./discoveryConfig"; +import { resolveZedModels } from "@omniroute/open-sse/shared/zedAuth.ts"; import { fetchGitHubCopilotModels, fetchGheCopilotModels, @@ -93,6 +94,8 @@ import { } from "@/lib/providerModels/geminiModelsParser"; import { getSyncedAvailableModels, getCustomModels } from "@/lib/db/models"; import { fetchCursorAgentModels } from "@/lib/providerModels/cursorAgent"; +import { fetchRaycastModels } from "@omniroute/open-sse/services/raycast.ts"; +import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts"; import { type JsonRecord, asRecord, @@ -1345,6 +1348,58 @@ export async function GET( }); } + if (provider === "raycast") { + const cachedResponse = maybeReturnCachedDiscovery(); + if (cachedResponse) return cachedResponse; + + const autoFetchDisabledResponse = maybeReturnAutoFetchDisabled(); + if (autoFetchDisabledResponse) return autoFetchDisabledResponse; + + const psd = asRecord(connection.providerSpecificData); + const deviceId = toNonEmptyString(psd.deviceId); + const aid = toNonEmptyString(psd.aid) || deviceId; + if (!accessToken || !deviceId) { + const fallback = buildDiscoveryFallbackResponse({ + localWarning: "Raycast credentials incomplete — using local catalog", + }); + if (fallback) return fallback; + return NextResponse.json({ error: "Raycast credentials incomplete" }, { status: 400 }); + } + + try { + const raycastModels = await runWithProxyContext(proxy, () => + fetchRaycastModels({ + accessToken, + providerSpecificData: { + deviceId, + aid: aid || deviceId, + sigSecret: toNonEmptyString(psd.sigSecret) || undefined, + }, + }) + ); + const models = raycastModels.map((model) => ({ + id: model.id, + name: model.name || model.id, + owned_by: model.provider || provider, + ...(model.requires_better_ai ? { premium: true } : {}), + ...(model.availability ? { availability: model.availability } : {}), + })); + return buildApiDiscoveryResponse(models); + } catch (err) { + const message = err instanceof Error ? err.message : String(err); + console.log("[models] raycast fetch failed:", message); + const fallback = buildDiscoveryFallbackResponse({ + cacheWarning: `Raycast API unavailable (${message}) — using cached catalog`, + localWarning: `Raycast API unavailable (${message}) — using local catalog`, + }); + if (fallback) return fallback; + return NextResponse.json( + { error: `Failed to fetch Raycast models: ${message}` }, + { status: 502 } + ); + } + } + if (provider === "cursor") { const cachedResponse = maybeReturnCachedDiscovery(); if (cachedResponse) return cachedResponse; @@ -1951,6 +2006,62 @@ export async function GET( return buildApiDiscoveryResponse(models); } + // Zed Hosted needs a two-step auth the generic discovery path cannot express: + // `cloud.zed.dev/models` rejects the account access token and requires an LLM + // token minted by POST /client/llm_tokens (authorized with Zed's own + // ` ` scheme). The registry `modelsUrl` otherwise falls + // through to deriveConfigFromRegistryModelsUrl(), which hardcodes + // `Bearer ` and always 401s with "Invalid Authorization header". + // ProviderModelsConfigEntry.buildHeaders is synchronous, so the token + // exchange cannot be expressed there — hence a dedicated branch that reuses + // the executor's own resolveZedModels(). + if (provider === "zed-hosted") { + const zedToken = accessToken || apiKey; + if (!zedToken) { + const fallback = buildDiscoveryFallbackResponse(); + if (fallback) return fallback; + return NextResponse.json({ error: "Zed connection has no access token" }, { status: 400 }); + } + let providerSpecificData: Record = {}; + const rawPsd = (connection as { providerSpecificData?: unknown }).providerSpecificData; + if (typeof rawPsd === "string") { + try { + providerSpecificData = JSON.parse(rawPsd) as Record; + } catch { + providerSpecificData = {}; + } + } else if (rawPsd && typeof rawPsd === "object") { + providerSpecificData = rawPsd as Record; + } + + try { + const catalog = await resolveZedModels({ + accessToken: zedToken, + providerSpecificData, + } as Parameters[0]); + const zedModels = (catalog?.models ?? []).map((model) => ({ + id: model.id, + name: model.name, + context_length: model.contextLength, + max_output_tokens: model.maxOutputTokens, + supports_tools: model.supportsTools, + supports_images: model.supportsImages, + })); + return buildApiDiscoveryResponse(zedModels); + } catch (error) { + console.log("Error fetching models from provider", { + provider, + errorText: error instanceof Error ? error.message : String(error), + }); + const fallback = buildDiscoveryFallbackResponse(); + if (fallback) return fallback; + return NextResponse.json( + { error: `Failed to fetch models: ${sanitizeErrorMessage(error)}` }, + { status: 502 } + ); + } + } + const config = provider in PROVIDER_MODELS_CONFIG ? PROVIDER_MODELS_CONFIG[provider as keyof typeof PROVIDER_MODELS_CONFIG] diff --git a/src/app/api/providers/[id]/refresh/route.ts b/src/app/api/providers/[id]/refresh/route.ts index e171d9f093..830e90aa81 100644 --- a/src/app/api/providers/[id]/refresh/route.ts +++ b/src/app/api/providers/[id]/refresh/route.ts @@ -1,7 +1,12 @@ import { NextResponse } from "next/server"; import { getCachedProviderConnectionById } from "@/lib/localDb"; import { updateProviderConnection } from "@/lib/db/providers"; -import { getAccessToken, updateProviderCredentials } from "@/sse/services/tokenRefresh"; +import { + getAccessToken, + updateProviderCredentials, + refreshCopilotToken, + resolveCopilotTokenBaseUrl, +} from "@/sse/services/tokenRefresh"; import { rotationGroupFor } from "@omniroute/open-sse/services/refreshSerializer.ts"; type RefreshResult = { @@ -77,6 +82,68 @@ export async function POST(_request: Request, { params }: { params: Promise<{ id providerSpecificData: connection.providerSpecificData, }; + // github.com Copilot and GHE Copilot (device-code flow) never receive a + // refresh_token — only a GitHub access token plus a short-lived Copilot + // sub-token (providerSpecificData.copilotToken). The generic access-token + // helper below requires credentials.refreshToken and returns null + // immediately without one, which always surfaced as "Token refresh failed + // — provider returned no new token" for these connections. Refresh the + // Copilot sub-token directly instead, mirroring the health-check sweep's + // dedicated path. + // + // NB: keep the generic helper's name out of the comments above its real + // call site. tests/unit/codex-manual-refresh-rotating-guard.test.ts finds + // that call with a plain substring search and asserts the openai-auth0 + // rotation guard precedes it, so an earlier textual mention would become + // the match instead of the actual invocation. + if ( + (provider === "github" || provider === "ghe-copilot") && + !connection.refreshToken && + connection.accessToken + ) { + const copilotResult = await refreshCopilotToken( + connection.accessToken, + credentials, + resolveCopilotTokenBaseUrl(provider, credentials) + ); + if (!copilotResult?.token) { + return NextResponse.json( + { error: "Token refresh failed — provider returned no new token" }, + { status: 502 } + ); + } + + const refreshedProviderSpecificData = { + ...(connection.providerSpecificData || {}), + copilotToken: copilotResult.token, + copilotTokenExpiresAt: copilotResult.expiresAt, + }; + await updateProviderConnection(id, { + providerSpecificData: refreshedProviderSpecificData, + testStatus: "active", + lastError: null, + lastErrorAt: null, + lastErrorType: null, + lastErrorSource: null, + errorCode: null, + }); + + const expiresAtMs = + typeof copilotResult.expiresAt === "number" && copilotResult.expiresAt < 1e12 + ? copilotResult.expiresAt * 1000 + : typeof copilotResult.expiresAt === "string" + ? new Date(copilotResult.expiresAt).getTime() + : (copilotResult.expiresAt as number | undefined); + + return NextResponse.json({ + success: true, + connectionId: id, + provider, + expiresAt: expiresAtMs ? new Date(expiresAtMs).toISOString() : null, + refreshedAt: new Date().toISOString(), + }); + } + // Use the existing getAccessToken helper which knows how to refresh // tokens for each provider type (Claude, GitHub, Gemini, etc.). // Pass onPersist so the DB write happens atomically INSIDE the per-connection diff --git a/src/app/api/providers/[id]/test/oauthTestConfig.ts b/src/app/api/providers/[id]/test/oauthTestConfig.ts index b6fdb29a4a..ac1aaa1680 100644 --- a/src/app/api/providers/[id]/test/oauthTestConfig.ts +++ b/src/app/api/providers/[id]/test/oauthTestConfig.ts @@ -111,6 +111,14 @@ export const OAUTH_TEST_CONFIG = { // Validate using token presence/expiry as a lightweight auth check. checkExpiry: true, }, + raycast: { + // #8895 — Raycast Pro is an `import_token` provider: the token is imported + // from the local Raycast install, `refreshToken` is always null and the + // stored `expiresIn` defaults to 30 days. There is nothing to refresh, so + // the test is the expiry check on the imported token; without an entry here + // Test Connection persists testStatus="error" on a healthy account (#8408). + checkExpiry: true, + }, cline: CLINE_OAUTH_TEST_CONFIG, // ClinePass reuses the same WorkOS OAuth flow and token lifecycle as Cline. clinepass: CLINE_OAUTH_TEST_CONFIG, diff --git a/src/app/api/providers/[id]/test/route.ts b/src/app/api/providers/[id]/test/route.ts index 5e403829c3..f377b80290 100644 --- a/src/app/api/providers/[id]/test/route.ts +++ b/src/app/api/providers/[id]/test/route.ts @@ -11,6 +11,7 @@ import { getConsistentMachineId } from "@/shared/utils/machineId"; import { syncToCloud } from "@/lib/cloudSync"; import { validateProviderApiKey } from "@/lib/providers/validation"; import { getCliRuntimeStatus } from "@/shared/services/cliRuntime"; +import { buildQoderCliNotFoundHint } from "@omniroute/open-sse/services/qoderCliResolve.ts"; // Use the shared open-sse token refresh with built-in dedup/race-condition cache import { getAccessToken } from "@omniroute/open-sse/services/tokenRefresh.ts"; import { rotationGroupFor } from "@omniroute/open-sse/services/refreshSerializer.ts"; @@ -206,7 +207,9 @@ async function getProviderRuntimeStatus(connection: any) { const runtimeMessage = runtime.installed ? `Local CLI runtime is installed but not runnable (${runtime.reason || "healthcheck_failed"})` - : "Local CLI runtime is not installed"; + : provider === "qoder" + ? buildQoderCliNotFoundHint(runtime.reason || "not_found") + : "Local CLI runtime is not installed"; return { ...runtime, diff --git a/src/app/api/radar/catalog/route.ts b/src/app/api/radar/catalog/route.ts new file mode 100644 index 0000000000..4e080e955b --- /dev/null +++ b/src/app/api/radar/catalog/route.ts @@ -0,0 +1,56 @@ +/** + * GET /api/radar/catalog — return the merged Radar catalog from local cache. + * + * NEVER proxies the private feed server. The browser talks only to this + * local endpoint; sync happens server-side via POST /api/radar/sync. + * + * Flag off => 404 (the surface doesn't exist when disabled), checked BEFORE + * auth so flag-off inertia stays byte-identical (no auth required to learn + * the surface doesn't exist). Unauthenticated access once the flag is on + * => 401 (management route — dashboard session or a management-scoped key). + */ + +import { NextResponse } from "next/server"; +import { CORS_HEADERS, handleCorsOptions } from "@/shared/utils/cors"; +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; +import { isAuthenticated } from "@/shared/utils/apiAuth"; +import { getRadarCatalog } from "@/lib/radar"; +import { buildErrorBody } from "@omniroute/open-sse/utils/error"; + +export const dynamic = "force-dynamic"; +export const revalidate = 0; + +export async function OPTIONS() { + return handleCorsOptions(); +} + +export async function GET(request: Request) { + // Flag gate — surface doesn't exist when disabled. MUST run before auth. + if (!isFeatureFlagEnabled("RADAR_ENABLED")) { + return NextResponse.json( + buildErrorBody(404, "Not found"), + { status: 404, headers: CORS_HEADERS }, + ); + } + + if (!(await isAuthenticated(request))) { + return NextResponse.json( + buildErrorBody(401, "Unauthorized"), + { status: 401, headers: CORS_HEADERS }, + ); + } + + try { + const result = getRadarCatalog(); + return NextResponse.json( + { entries: result.entries, meta: result.meta }, + { headers: { ...CORS_HEADERS, "Cache-Control": "no-store" } }, + ); + } catch (err: unknown) { + const { sanitizeErrorMessage } = await import("@omniroute/open-sse/utils/error"); + return NextResponse.json( + buildErrorBody(500, sanitizeErrorMessage(err) || "Failed to load Radar catalog"), + { status: 500, headers: CORS_HEADERS }, + ); + } +} diff --git a/src/app/api/radar/referrals/route.ts b/src/app/api/radar/referrals/route.ts new file mode 100644 index 0000000000..7022b0172c --- /dev/null +++ b/src/app/api/radar/referrals/route.ts @@ -0,0 +1,67 @@ +/** + * GET /api/radar/referrals — return the referral links section ("Pegue seus + * créditos grátis", D28) of the locally cached Radar feed. + * + * NEVER proxies the private feed server. Like GET /api/radar/catalog, the + * browser talks only to this local endpoint; sync happens server-side via + * POST /api/radar/sync, and this route only reads the cache that sync + * already wrote. + * + * `fixed` referrals are present in every tier (community included, gated + * server-side); `campaigns` only comes populated on the `live` (supporter) + * tier — the community artifact publishes `campaigns: []` — so this route + * never needs to decide tier gating itself, it just relays what the cached + * feed already contains. `tier` is informative (from the cache row), used + * by the UI to show a soft upsell note when campaigns is empty. + * + * Flag off => 404 (the surface doesn't exist when disabled), checked BEFORE + * auth. Unauthenticated access once the flag is on => 401 (management route + * — dashboard session or a management-scoped key). + */ + +import { NextResponse } from "next/server"; +import { CORS_HEADERS, handleCorsOptions } from "@/shared/utils/cors"; +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; +import { isAuthenticated } from "@/shared/utils/apiAuth"; +import { getRadarReferrals } from "@/lib/radar"; +import { getRadarCache } from "@/lib/db/radar"; +import { buildErrorBody } from "@omniroute/open-sse/utils/error"; + +export const dynamic = "force-dynamic"; +export const revalidate = 0; + +export async function OPTIONS() { + return handleCorsOptions(); +} + +export async function GET(request: Request) { + // Flag gate — surface doesn't exist when disabled. MUST run before auth. + if (!isFeatureFlagEnabled("RADAR_ENABLED")) { + return NextResponse.json( + buildErrorBody(404, "Not found"), + { status: 404, headers: CORS_HEADERS }, + ); + } + + if (!(await isAuthenticated(request))) { + return NextResponse.json( + buildErrorBody(401, "Unauthorized"), + { status: 401, headers: CORS_HEADERS }, + ); + } + + try { + const { fixed, campaigns } = getRadarReferrals(); + const cache = getRadarCache(); + return NextResponse.json( + { fixed, campaigns, tier: cache?.tier ?? null }, + { headers: { ...CORS_HEADERS, "Cache-Control": "no-store" } }, + ); + } catch (err: unknown) { + const { sanitizeErrorMessage } = await import("@omniroute/open-sse/utils/error"); + return NextResponse.json( + buildErrorBody(500, sanitizeErrorMessage(err) || "Failed to load Radar referrals"), + { status: 500, headers: CORS_HEADERS }, + ); + } +} diff --git a/src/app/api/radar/settings/route.ts b/src/app/api/radar/settings/route.ts new file mode 100644 index 0000000000..2b92e08bdb --- /dev/null +++ b/src/app/api/radar/settings/route.ts @@ -0,0 +1,178 @@ +/** + * GET /api/radar/settings — read the current Radar opt-in + supporter-key + * snapshot. Powers the dashboard page's "am I already opted in?" check so + * a reload doesn't re-show the activation screen (see FIX 3). + * + * Also relays the two F4/T7 "get a supporter key" outbound links + * (`contributorClaimUrl`, `supporterPlansUrl` — see `@/lib/radar/links`) so + * the client component never reads `process.env` itself. Smallest surface + * per spec: no dedicated route, reuses this one. Both are plain public + * URLs (no secret, no pricing) — safe to expose alongside the settings + * snapshot, gated by the same flag/auth checks below. + * + * POST /api/radar/settings — set Radar opt-in and/or supporter key. + * + * Zod-validated body: { optIn?: boolean, supporterKey?: string|null } + * Key shape: "omr_" + 40 hex chars. + * + * NEVER echoes the raw key back on either verb — GET returns a masked form + * ("omr_****" + last 4 hex chars) and a `hasSupporterKey` boolean; POST + * returns the same masked form. + * + * Flag off => 404, checked BEFORE auth (byte-identical flag-off inertia). + * Unauthenticated access once the flag is on => 401. + */ + +import { NextResponse } from "next/server"; +import { z } from "zod"; +import { CORS_HEADERS, handleCorsOptions } from "@/shared/utils/cors"; +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; +import { isAuthenticated } from "@/shared/utils/apiAuth"; +import { setRadarOptIn, setRadarKey, getRadarSettings } from "@/lib/db/radar"; +import { getContributorClaimUrl, getSupporterPlansUrl } from "@/lib/radar/links"; +import { buildErrorBody } from "@omniroute/open-sse/utils/error"; + +export const dynamic = "force-dynamic"; +export const revalidate = 0; + +const SUPPORTER_KEY_REGEX = /^omr_[0-9a-f]{40}$/; + +const SettingsBodySchema = z.object({ + optIn: z.boolean().optional(), + supporterKey: z + .string() + .regex(SUPPORTER_KEY_REGEX, 'Key must match "omr_" + 40 hex chars') + .nullable() + .optional(), +}); + +/** + * Mask a supporter key for response: "omr_****abcd" + * Shows only the last 4 hex chars. + */ +function maskKey(key: string | null): string | null { + if (!key) return null; + const last4 = key.slice(-4); + return `omr_****${last4}`; +} + +export async function OPTIONS() { + return handleCorsOptions(); +} + +export async function GET(request: Request) { + // Flag gate — MUST run before auth (byte-identical flag-off inertia). + if (!isFeatureFlagEnabled("RADAR_ENABLED")) { + return NextResponse.json( + buildErrorBody(404, "Not found"), + { status: 404, headers: CORS_HEADERS }, + ); + } + + if (!(await isAuthenticated(request))) { + return NextResponse.json( + buildErrorBody(401, "Unauthorized"), + { status: 401, headers: CORS_HEADERS }, + ); + } + + try { + const settings = getRadarSettings(); + return NextResponse.json( + { + optIn: settings.optIn, + hasSupporterKey: settings.supporterKey !== null, + supporterKeyMasked: maskKey(settings.supporterKey), + contributorClaimUrl: getContributorClaimUrl(), + supporterPlansUrl: getSupporterPlansUrl(), + }, + { headers: { ...CORS_HEADERS, "Cache-Control": "no-store" } }, + ); + } catch (err: unknown) { + const { sanitizeErrorMessage } = await import("@omniroute/open-sse/utils/error"); + return NextResponse.json( + buildErrorBody(500, sanitizeErrorMessage(err) || "Failed to load Radar settings"), + { status: 500, headers: CORS_HEADERS }, + ); + } +} + +export async function POST(request: Request) { + // Flag gate — MUST run before auth (byte-identical flag-off inertia). + if (!isFeatureFlagEnabled("RADAR_ENABLED")) { + return NextResponse.json( + buildErrorBody(404, "Not found"), + { status: 404, headers: CORS_HEADERS }, + ); + } + + if (!(await isAuthenticated(request))) { + return NextResponse.json( + buildErrorBody(401, "Unauthorized"), + { status: 401, headers: CORS_HEADERS }, + ); + } + + let body: unknown; + try { + body = await request.json(); + } catch { + return NextResponse.json( + buildErrorBody(400, "Invalid JSON body"), + { status: 400, headers: CORS_HEADERS }, + ); + } + + const parsed = SettingsBodySchema.safeParse(body); + if (!parsed.success) { + return NextResponse.json( + buildErrorBody(400, "Invalid request body", parsed.error.flatten().fieldErrors), + { status: 400, headers: CORS_HEADERS }, + ); + } + + const { optIn, supporterKey } = parsed.data; + + // At least one field must be provided + if (optIn === undefined && supporterKey === undefined) { + return NextResponse.json( + buildErrorBody(400, "At least one of optIn or supporterKey is required"), + { status: 400, headers: CORS_HEADERS }, + ); + } + + try { + if (optIn !== undefined) { + setRadarOptIn(optIn); + if (optIn) { + // Opting in is the moment the daily background sync becomes wanted — + // arm the scheduler lazily so a flag-off/opt-out install never even + // creates the timer (Radar inertia contract). Never fatal. + try { + const { ensureRadarSyncScheduler } = await import("@/lib/radar/scheduler"); + ensureRadarSyncScheduler(); + } catch { + // Scheduler is best-effort; manual sync keeps working without it. + } + } + } + if (supporterKey !== undefined) { + setRadarKey(supporterKey); + } + + return NextResponse.json( + { + ok: true, + optIn: optIn ?? undefined, + supporterKey: supporterKey !== undefined ? maskKey(supporterKey) : undefined, + }, + { headers: CORS_HEADERS }, + ); + } catch (err: unknown) { + const { sanitizeErrorMessage } = await import("@omniroute/open-sse/utils/error"); + return NextResponse.json( + buildErrorBody(500, sanitizeErrorMessage(err) || "Failed to update Radar settings"), + { status: 500, headers: CORS_HEADERS }, + ); + } +} diff --git a/src/app/api/radar/sync/route.ts b/src/app/api/radar/sync/route.ts new file mode 100644 index 0000000000..99ce99c296 --- /dev/null +++ b/src/app/api/radar/sync/route.ts @@ -0,0 +1,72 @@ +/** + * POST /api/radar/sync — trigger a Radar feed sync server-side. + * + * Calls syncRadar() which handles all gating (flag, opt-in, Ed25519 + * verification, schema validation, version floor). Returns the status + * object. Never proxies the feed URL to the client. + * + * Flag off => 404, checked BEFORE auth (byte-identical flag-off inertia). + * Unauthenticated access once the flag is on => 401. + */ + +import { NextResponse } from "next/server"; +import { z } from "zod"; +import { CORS_HEADERS, handleCorsOptions } from "@/shared/utils/cors"; +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; +import { isAuthenticated } from "@/shared/utils/apiAuth"; +import { syncRadar } from "@/lib/radar/sync"; +import { buildErrorBody } from "@omniroute/open-sse/utils/error"; + +export const dynamic = "force-dynamic"; +export const revalidate = 0; + +// Empty body — sync has no user-configurable parameters +const SyncBodySchema = z.object({}).strict().optional(); + +export async function OPTIONS() { + return handleCorsOptions(); +} + +export async function POST(request: Request) { + // Flag gate — MUST run before auth (byte-identical flag-off inertia). + if (!isFeatureFlagEnabled("RADAR_ENABLED")) { + return NextResponse.json( + buildErrorBody(404, "Not found"), + { status: 404, headers: CORS_HEADERS }, + ); + } + + if (!(await isAuthenticated(request))) { + return NextResponse.json( + buildErrorBody(401, "Unauthorized"), + { status: 401, headers: CORS_HEADERS }, + ); + } + + // Validate body (must be empty or absent) + let body: unknown; + try { + body = await request.json(); + } catch { + body = undefined; + } + + const parsed = SyncBodySchema.safeParse(body); + if (!parsed.success) { + return NextResponse.json( + buildErrorBody(400, "Invalid request body"), + { status: 400, headers: CORS_HEADERS }, + ); + } + + try { + const result = await syncRadar(); + return NextResponse.json(result, { headers: CORS_HEADERS }); + } catch (err: unknown) { + const { sanitizeErrorMessage } = await import("@omniroute/open-sse/utils/error"); + return NextResponse.json( + buildErrorBody(500, sanitizeErrorMessage(err) || "Radar sync failed"), + { status: 500, headers: CORS_HEADERS }, + ); + } +} diff --git a/src/app/api/services/9router/_lib.ts b/src/app/api/services/9router/_lib.ts index b34d5f5615..514a1fce59 100644 --- a/src/app/api/services/9router/_lib.ts +++ b/src/app/api/services/9router/_lib.ts @@ -39,6 +39,10 @@ export async function getOrInitSupervisor(): Promise { healthIntervalMs: 2_000, stopTimeoutMs: 15_000, logsBufferBytes: 5_242_880, + // #6205: mirrors bootstrap.ts's own supervisor construction — adopt a + // healthy prior instance instead of crashing on-demand creation (e.g. a + // direct API hit before bootstrap runs) into a raw EADDRINUSE. + probeBeforeSpawn: true, }); registerSupervisor(sup); diff --git a/src/app/api/services/9router/auto-restart-adopted/route.ts b/src/app/api/services/9router/auto-restart-adopted/route.ts new file mode 100644 index 0000000000..65b82ff9d4 --- /dev/null +++ b/src/app/api/services/9router/auto-restart-adopted/route.ts @@ -0,0 +1,28 @@ +import { z } from "zod"; +import { updateServiceField } from "@/lib/db/versionManager"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const BodySchema = z.object({ enabled: z.boolean() }); + +export async function POST(request: Request): Promise { + let body: unknown; + try { + body = await request.json(); + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const parsed = BodySchema.safeParse(body); + if (!parsed.success) { + return createErrorResponse({ status: 400, message: parsed.error.message }); + } + + try { + await updateServiceField("9router", "autoRestartAdopted", parsed.data.enabled); + return new Response(null, { status: 204 }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/9router/status/route.ts b/src/app/api/services/9router/status/route.ts index e7541d087f..a8f7d10ba0 100644 --- a/src/app/api/services/9router/status/route.ts +++ b/src/app/api/services/9router/status/route.ts @@ -37,6 +37,8 @@ export async function GET(request: Request = new Request("http://localhost/")): apiKeyMasked: apiKey ? maskApiKey(apiKey) : null, autoStart: row?.autoStart ?? false, providerExpose: row?.providerExpose ?? false, + adopted: liveStatus?.adopted ?? false, + autoRestartAdopted: row?.autoRestartAdopted ?? false, }; if (reveal === "key") { diff --git a/src/app/api/services/[name]/logs/route.ts b/src/app/api/services/[name]/logs/route.ts index 697302c63f..8e4199d1e5 100644 --- a/src/app/api/services/[name]/logs/route.ts +++ b/src/app/api/services/[name]/logs/route.ts @@ -45,6 +45,10 @@ async function getOrInitNamedSupervisor(name: string) { const { getOrInitSupervisor } = await import("../../bifrost/_lib"); return getOrInitSupervisor(); } + if (name === "dario") { + const { getOrInitSupervisor } = await import("../../dario/_lib"); + return getOrInitSupervisor(); + } return null; } diff --git a/src/app/api/services/bifrost/_lib.ts b/src/app/api/services/bifrost/_lib.ts index 93d3b8ad8d..69a434154a 100644 --- a/src/app/api/services/bifrost/_lib.ts +++ b/src/app/api/services/bifrost/_lib.ts @@ -22,6 +22,10 @@ export async function getOrInitSupervisor(): Promise { healthIntervalMs: 5_000, stopTimeoutMs: 15_000, logsBufferBytes: 5_242_880, + // #6205: mirrors bootstrap.ts's own supervisor construction — adopt a + // healthy prior instance instead of crashing on-demand creation (e.g. a + // direct API hit before bootstrap runs) into a raw EADDRINUSE. + probeBeforeSpawn: true, }); registerSupervisor(sup); diff --git a/src/app/api/services/bifrost/auto-restart-adopted/route.ts b/src/app/api/services/bifrost/auto-restart-adopted/route.ts new file mode 100644 index 0000000000..8ac28e7763 --- /dev/null +++ b/src/app/api/services/bifrost/auto-restart-adopted/route.ts @@ -0,0 +1,28 @@ +import { z } from "zod"; +import { updateServiceField } from "@/lib/db/versionManager"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const BodySchema = z.object({ enabled: z.boolean() }); + +export async function POST(request: Request): Promise { + let body: unknown; + try { + body = await request.json(); + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const parsed = BodySchema.safeParse(body); + if (!parsed.success) { + return createErrorResponse({ status: 400, message: parsed.error.message }); + } + + try { + await updateServiceField("bifrost", "autoRestartAdopted", parsed.data.enabled); + return new Response(null, { status: 204 }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/bifrost/status/route.ts b/src/app/api/services/bifrost/status/route.ts index bc6a1631d7..672592d6ae 100644 --- a/src/app/api/services/bifrost/status/route.ts +++ b/src/app/api/services/bifrost/status/route.ts @@ -31,6 +31,8 @@ export async function GET(): Promise { latestVersion, updateAvailable: !!installedVersion && !!latestVersion && installedVersion !== latestVersion, autoStart: row?.autoStart ?? false, + adopted: liveStatus?.adopted ?? false, + autoRestartAdopted: row?.autoRestartAdopted ?? false, }); } catch (err) { const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); diff --git a/src/app/api/services/cliproxy/_lib.ts b/src/app/api/services/cliproxy/_lib.ts index 4686ce5eb3..bc9b9b52b8 100644 --- a/src/app/api/services/cliproxy/_lib.ts +++ b/src/app/api/services/cliproxy/_lib.ts @@ -22,6 +22,10 @@ export async function getOrInitSupervisor(): Promise { healthIntervalMs: 5_000, stopTimeoutMs: 15_000, logsBufferBytes: 5_242_880, + // #6205: mirrors bootstrap.ts's own supervisor construction — adopt a + // healthy prior instance instead of crashing on-demand creation (e.g. a + // direct API hit before bootstrap runs) into a raw EADDRINUSE. + probeBeforeSpawn: true, }); registerSupervisor(sup); diff --git a/src/app/api/services/cliproxy/auto-restart-adopted/route.ts b/src/app/api/services/cliproxy/auto-restart-adopted/route.ts new file mode 100644 index 0000000000..9ebbbe39de --- /dev/null +++ b/src/app/api/services/cliproxy/auto-restart-adopted/route.ts @@ -0,0 +1,28 @@ +import { z } from "zod"; +import { updateServiceField } from "@/lib/db/versionManager"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const BodySchema = z.object({ enabled: z.boolean() }); + +export async function POST(request: Request): Promise { + let body: unknown; + try { + body = await request.json(); + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const parsed = BodySchema.safeParse(body); + if (!parsed.success) { + return createErrorResponse({ status: 400, message: parsed.error.message }); + } + + try { + await updateServiceField("cliproxy", "autoRestartAdopted", parsed.data.enabled); + return new Response(null, { status: 204 }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/cliproxy/status/route.ts b/src/app/api/services/cliproxy/status/route.ts index 5b9230f536..72ead86a9a 100644 --- a/src/app/api/services/cliproxy/status/route.ts +++ b/src/app/api/services/cliproxy/status/route.ts @@ -32,6 +32,8 @@ export async function GET(): Promise { updateAvailable: !!installedVersion && !!latestVersion && installedVersion !== latestVersion, autoStart: row?.autoStart ?? false, providerExpose: row?.providerExpose ?? false, + adopted: liveStatus?.adopted ?? false, + autoRestartAdopted: row?.autoRestartAdopted ?? false, }); } catch (err) { const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); diff --git a/src/app/api/services/dario/_lib.ts b/src/app/api/services/dario/_lib.ts new file mode 100644 index 0000000000..69460b3a99 --- /dev/null +++ b/src/app/api/services/dario/_lib.ts @@ -0,0 +1,44 @@ +/** + * Shared helpers for /api/services/dario/* route handlers. + * Creates a supervisor on demand if bootstrap hasn't registered one yet. + * + * Dario needs its DARIO_ADMIN_TOKEN (reuses getOrCreateApiKey, same mechanism + * 9router/mux use) so the spawned proxy mounts its /admin/* control plane — + * hence getOrInitSupervisor() is async (it resolves the key before building + * the spawn factory). + */ + +import { getSupervisor, registerSupervisor } from "@/lib/services/registry"; +import { ServiceSupervisor } from "@/lib/services/ServiceSupervisor"; +import { resolveSpawnArgs, DARIO_DEFAULT_PORT } from "@/lib/services/installers/dario"; +import { getOrCreateApiKey } from "@/lib/services/apiKey"; + +const TOOL = "dario"; +const PORT = parseInt(process.env.DARIO_PORT ?? String(DARIO_DEFAULT_PORT), 10); + +export async function getOrInitSupervisor(): Promise { + const existing = getSupervisor(TOOL); + if (existing) return existing; + + const apiKey = await getOrCreateApiKey(TOOL).catch(() => "placeholder"); + + const sup = new ServiceSupervisor({ + tool: TOOL, + port: PORT, + spawnArgs: () => resolveSpawnArgs(apiKey, PORT), + healthUrl: () => `http://127.0.0.1:${PORT}/health`, + healthIntervalMs: 5_000, + stopTimeoutMs: 15_000, + logsBufferBytes: 5_242_880, + // #6205: embedded services bind a fixed port — probe before spawning so + // an orphaned prior instance yields adopt/clear-error instead of a raw + // EADDRINUSE crash. Mirrors bootstrap.ts's own supervisor construction; + // without this, on-demand creation here (e.g. from the admin import + // route's forced restart) can't tell "already healthy" apart from + // "actually crashed" and misreports both as a crash. + probeBeforeSpawn: true, + }); + + registerSupervisor(sup); + return sup; +} diff --git a/src/app/api/services/dario/admin/_lib.ts b/src/app/api/services/dario/admin/_lib.ts new file mode 100644 index 0000000000..8fa5e59679 --- /dev/null +++ b/src/app/api/services/dario/admin/_lib.ts @@ -0,0 +1,96 @@ +/** + * Shared helpers for /api/services/dario/admin/* route handlers. + * + * These routes are a thin, SERVER-SIDE proxy in front of the running Dario + * instance's headless `/admin/*` control plane. The real DARIO_ADMIN_TOKEN + * (stored encrypted in version_manager.api_key, generated by getOrCreateApiKey) + * must NEVER reach the browser — the webUI calls these OmniRoute routes, which + * attach the bearer token here and forward to Dario on loopback. + * + * Auth gating mirrors the CLIProxyAPI OAuth import route + * (src/app/api/oauth/cliproxy-import/route.ts): when auth is required and the + * caller isn't authenticated, 401. The routes live under /api/services/ which + * routeGuard.ts already classifies LOCAL_ONLY. + */ + +import { NextResponse } from "next/server"; +import { getServiceRow } from "@/lib/db/versionManager"; +import { decrypt } from "@/lib/db/encryption"; +import { isAuthRequired, isAuthenticated } from "@/shared/utils/apiAuth"; +import { DARIO_DEFAULT_PORT } from "@/lib/services/installers/dario"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +export function darioBaseUrl(): string { + const host = process.env.DARIO_HOST || "127.0.0.1"; + const port = parseInt(process.env.DARIO_PORT || String(DARIO_DEFAULT_PORT), 10); + return `http://${host}:${port}`; +} + +/** 401 response when auth is required and the caller isn't authenticated; else null. */ +export async function requireAdminAuth(request: Request): Promise { + if (!(await isAuthRequired(request))) return null; + if (await isAuthenticated(request)) return null; + return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); +} + +/** Read the stored (decrypted) DARIO_ADMIN_TOKEN, or null if unavailable. */ +export async function getDarioAdminToken(): Promise { + const row = await getServiceRow("dario"); + if (!row?.apiKey) return null; + const decrypted = decrypt(row.apiKey); + return decrypted || null; +} + +type ForwardOptions = { + method: "GET" | "POST" | "DELETE"; + path: string; // e.g. "/admin/login/start" + body?: unknown; // JSON body for POST +}; + +/** + * Forward a call to the running Dario instance's /admin/* endpoint with the + * stored admin bearer token attached. Returns a NextResponse mirroring Dario's + * status + JSON body, or a friendly error when Dario is unreachable / the token + * is missing. + */ +export async function forwardToDarioAdmin(opts: ForwardOptions): Promise { + const token = await getDarioAdminToken(); + if (!token) { + return NextResponse.json( + { error: "Dario admin token unavailable — is Dario installed and started?" }, + { status: 409 } + ); + } + + const url = `${darioBaseUrl()}${opts.path}`; + try { + const res = await fetch(url, { + method: opts.method, + headers: { + Authorization: `Bearer ${token}`, + ...(opts.body !== undefined ? { "Content-Type": "application/json" } : {}), + }, + ...(opts.body !== undefined ? { body: JSON.stringify(opts.body) } : {}), + signal: AbortSignal.timeout(15_000), + }); + + // Pass through Dario's JSON body + status verbatim (never the token). + const text = await res.text(); + let payload: unknown; + try { + payload = text ? JSON.parse(text) : {}; + } catch { + payload = { error: text }; + } + return NextResponse.json(payload, { status: res.status }); + } catch (err) { + return NextResponse.json( + { + error: `Could not reach Dario admin API at ${url}: ${sanitizeErrorMessage( + err instanceof Error ? err.message : String(err) + )}`, + }, + { status: 502 } + ); + } +} diff --git a/src/app/api/services/dario/admin/accounts/route.ts b/src/app/api/services/dario/admin/accounts/route.ts new file mode 100644 index 0000000000..4b6865a5ce --- /dev/null +++ b/src/app/api/services/dario/admin/accounts/route.ts @@ -0,0 +1,49 @@ +/** + * /api/services/dario/admin/accounts + * + * GET → forwards to Dario's GET /admin/accounts (list: alias, scopes, + * expiry, live pool stats). Returns { accounts, count }. + * DELETE → forwards to Dario's DELETE /admin/accounts/. The alias is + * taken from a `?alias=` query param or a { alias } JSON body. + * Returns { alias, removed }. + * + * Server-side only: the real DARIO_ADMIN_TOKEN is attached in forwardToDarioAdmin + * and never reaches the browser. + */ + +import { forwardToDarioAdmin, requireAdminAuth } from "../_lib"; +import { createErrorResponse } from "@/lib/api/errorResponse"; + +export async function GET(request: Request): Promise { + const authResponse = await requireAdminAuth(request); + if (authResponse) return authResponse; + return forwardToDarioAdmin({ method: "GET", path: "/admin/accounts" }); +} + +export async function DELETE(request: Request): Promise { + const authResponse = await requireAdminAuth(request); + if (authResponse) return authResponse; + + const url = new URL(request.url); + let alias = url.searchParams.get("alias")?.trim() || ""; + + if (!alias && request.body !== null) { + try { + const parsed = await request.json(); + if (parsed && typeof parsed === "object" && typeof (parsed as { alias?: unknown }).alias === "string") { + alias = (parsed as { alias: string }).alias.trim(); + } + } catch { + /* fall through to the missing-alias error below */ + } + } + + if (!alias) { + return createErrorResponse({ status: 400, message: "alias required (?alias= or JSON body)" }); + } + + return forwardToDarioAdmin({ + method: "DELETE", + path: `/admin/accounts/${encodeURIComponent(alias)}`, + }); +} diff --git a/src/app/api/services/dario/admin/import-from-omniroute/route.ts b/src/app/api/services/dario/admin/import-from-omniroute/route.ts new file mode 100644 index 0000000000..2340b7532b --- /dev/null +++ b/src/app/api/services/dario/admin/import-from-omniroute/route.ts @@ -0,0 +1,181 @@ +/** + * GET/POST /api/services/dario/admin/import-from-omniroute + * + * Imports an existing OmniRoute `claude` provider connection's OAuth tokens + * directly into Dario's account store, skipping the interactive browser OAuth + * flow entirely. This works because OmniRoute's native `claude` provider and + * Dario both authenticate against the identical public Claude Code OAuth + * client (client_id 9d1c250a-e61b-44d9-88ed-5944d1962f5e, + * platform.claude.com/v1/oauth/token) — a refresh token minted for that + * client_id is valid for either tool interchangeably. + * + * GET returns eligible source connections (metadata only — id/name/email/org + * tier, never tokens) so the UI can offer a picker when more than one Claude + * connection exists. + * + * POST writes `${DATA_DIR}/services/dario/home/.dario/accounts/.json` + * directly, in Dario's own account-file shape (see @askalf/dario's + * src/accounts.ts: `{alias, accessToken, refreshToken, expiresAt, scopes, + * deviceId, accountUuid}`, a plain unencrypted JSON file dario itself + * round-trips via JSON.stringify/parse) — far lower-risk than reimplementing + * PKCE/token-exchange ourselves, since OmniRoute's own decrypt() already + * hands us a live, valid access+refresh token pair for this exact client_id. + * + * Dario has no live filesystem watch on ~/.dario/accounts (confirmed against + * its source — the running proxy only re-reads that directory on its own + * boot, or via an admin login-start+complete round trip). So after writing + * the file we stop+start the OmniRoute-managed supervisor to force a clean + * pickup, rather than relying on any undocumented hot-reload behavior. + */ + +import { NextResponse } from "next/server"; +import fs from "node:fs"; +import path from "node:path"; +import crypto from "node:crypto"; +import { requireAdminAuth } from "../_lib"; +import { getOrInitSupervisor } from "../../_lib"; +import { getProviderConnections, getProviderConnectionById } from "@/lib/db/providers"; +import { getDarioHomeDir } from "@/lib/services/installers/dario"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const ALIAS_PATTERN = /^[A-Za-z0-9][A-Za-z0-9_\-.]{0,63}$/; + +function safeAliasFromSource(email: string | null | undefined, connectionId: string): string { + const base = (email || connectionId || "omniroute").toLowerCase(); + const cleaned = base.replace(/[^a-z0-9_.-]/g, "-").replace(/^[^a-z0-9]+/, ""); + const alias = cleaned || "omniroute"; + return `omniroute-${alias}`.slice(0, 64); +} + +export async function GET(request: Request): Promise { + const authResponse = await requireAdminAuth(request); + if (authResponse) return authResponse; + + try { + const connections = await getProviderConnections({ provider: "claude" }); + const eligible = connections + .filter( + (c: Record) => + c.authType === "oauth" && c.accessToken && c.refreshToken && c.isActive !== false + ) + .map((c: Record) => { + const psd = (c.providerSpecificData as Record) || {}; + return { + id: c.id, + name: c.name || c.email || c.id, + email: c.email || null, + organizationType: psd.organizationType || null, + organizationRateLimitTier: psd.organizationRateLimitTier || null, + }; + }); + return NextResponse.json({ connections: eligible }); + } catch (err) { + return createErrorResponse({ + status: 500, + message: sanitizeErrorMessage(err instanceof Error ? err.message : String(err)), + }); + } +} + +export async function POST(request: Request): Promise { + const authResponse = await requireAdminAuth(request); + if (authResponse) return authResponse; + + let body: unknown; + try { + body = await request.json(); + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const b = (body || {}) as Record; + const connectionId = typeof b.connectionId === "string" ? b.connectionId : null; + if (!connectionId) { + return createErrorResponse({ status: 400, message: "connectionId is required" }); + } + + const conn = (await getProviderConnectionById(connectionId)) as Record | null; + if (!conn) { + return createErrorResponse({ status: 404, message: "Connection not found" }); + } + if (conn.provider !== "claude" || conn.authType !== "oauth") { + return createErrorResponse({ + status: 400, + message: "Only OAuth 'claude' provider connections can be imported into Dario", + }); + } + if (!conn.accessToken || !conn.refreshToken) { + return createErrorResponse({ + status: 400, + message: "Connection is missing an access or refresh token", + }); + } + + let alias = + typeof b.alias === "string" && b.alias.trim() + ? b.alias.trim() + : safeAliasFromSource(conn.email as string | null, connectionId); + if (!ALIAS_PATTERN.test(alias)) { + alias = safeAliasFromSource(conn.email as string | null, connectionId); + } + + const expiresAtMs = (() => { + const raw = conn.expiresAt as string | number | undefined; + const t = raw ? new Date(raw).getTime() : NaN; + return Number.isFinite(t) ? t : Date.now() + 3600_000; + })(); + + const scope = conn.scope as string | undefined; + const scopes = + typeof scope === "string" && scope.trim() ? scope.trim().split(/\s+/).filter(Boolean) : []; + + const psd = (conn.providerSpecificData as Record) || {}; + + const creds = { + alias, + accessToken: conn.accessToken, + refreshToken: conn.refreshToken, + expiresAt: expiresAtMs, + scopes, + deviceId: typeof psd.deviceId === "string" && psd.deviceId ? psd.deviceId : crypto.randomUUID(), + accountUuid: + typeof psd.accountUUID === "string" && psd.accountUUID + ? psd.accountUUID + : typeof psd.accountUuid === "string" && psd.accountUuid + ? psd.accountUuid + : crypto.randomUUID(), + }; + + try { + const darioHome = getDarioHomeDir(); + const accountsDir = path.join(darioHome, ".dario", "accounts"); + fs.mkdirSync(accountsDir, { recursive: true, mode: 0o700 }); + const filePath = path.join(accountsDir, `${alias}.json`); + fs.writeFileSync(filePath, JSON.stringify(creds, null, 2), { encoding: "utf8", mode: 0o600 }); + + // Force Dario to re-read its accounts directory with a clean stop+start + // rather than relying on any undocumented hot-reload of a directly- + // written file — its one documented hot-reload path is specifically the + // admin login-start/complete round trip, not a filesystem watch. + const sup = await getOrInitSupervisor(); + try { + await sup.stop(); + } catch { + /* may already be stopped */ + } + await sup.start(); + + return NextResponse.json({ + alias, + imported: true, + sourceConnectionId: connectionId, + sourceEmail: (conn.email as string | null) || null, + }); + } catch (err) { + return createErrorResponse({ + status: 500, + message: sanitizeErrorMessage(err instanceof Error ? err.message : String(err)), + }); + } +} diff --git a/src/app/api/services/dario/admin/login-complete/route.ts b/src/app/api/services/dario/admin/login-complete/route.ts new file mode 100644 index 0000000000..ab61862db4 --- /dev/null +++ b/src/app/api/services/dario/admin/login-complete/route.ts @@ -0,0 +1,40 @@ +/** + * POST /api/services/dario/admin/login-complete + * + * Forwards to the running Dario instance's POST /admin/login/complete. + * Body: { alias: string, code: string }. On Dario's 200 the account is + * routable immediately (Dario hot-reloads its pool). Returns Dario's + * { alias, status: "added", expires_at }. + */ + +import { z } from "zod"; +import { forwardToDarioAdmin, requireAdminAuth } from "../_lib"; +import { createErrorResponse } from "@/lib/api/errorResponse"; + +const BodySchema = z.object({ + alias: z.string().min(1).max(200), + code: z.string().min(1).max(4000), +}); + +export async function POST(request: Request): Promise { + const authResponse = await requireAdminAuth(request); + if (authResponse) return authResponse; + + let body: unknown; + try { + body = await request.json(); + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const parsed = BodySchema.safeParse(body); + if (!parsed.success) { + return createErrorResponse({ status: 400, message: parsed.error.message }); + } + + return forwardToDarioAdmin({ + method: "POST", + path: "/admin/login/complete", + body: { alias: parsed.data.alias, code: parsed.data.code }, + }); +} diff --git a/src/app/api/services/dario/admin/login-start/route.ts b/src/app/api/services/dario/admin/login-start/route.ts new file mode 100644 index 0000000000..3920a3393c --- /dev/null +++ b/src/app/api/services/dario/admin/login-start/route.ts @@ -0,0 +1,30 @@ +/** + * POST /api/services/dario/admin/login-start + * + * Forwards to the running Dario instance's POST /admin/login/start using the + * stored admin token. Body: { alias?: string }. Returns Dario's + * { alias, authorize_url, expires_at, instructions } to the browser — the + * operator opens authorize_url, approves in their own Claude account, then + * posts the displayed code to /login-complete. + */ + +import { forwardToDarioAdmin, requireAdminAuth } from "../_lib"; +import { createErrorResponse } from "@/lib/api/errorResponse"; + +export async function POST(request: Request): Promise { + const authResponse = await requireAdminAuth(request); + if (authResponse) return authResponse; + + let body: { alias?: string } = {}; + try { + if (request.body !== null) { + const parsed = await request.json(); + if (parsed && typeof parsed === "object") body = parsed as { alias?: string }; + } + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const forwardBody = typeof body.alias === "string" && body.alias.trim() ? { alias: body.alias.trim() } : {}; + return forwardToDarioAdmin({ method: "POST", path: "/admin/login/start", body: forwardBody }); +} diff --git a/src/app/api/services/dario/auto-restart-adopted/route.ts b/src/app/api/services/dario/auto-restart-adopted/route.ts new file mode 100644 index 0000000000..b1d90b54b1 --- /dev/null +++ b/src/app/api/services/dario/auto-restart-adopted/route.ts @@ -0,0 +1,28 @@ +import { z } from "zod"; +import { updateServiceField } from "@/lib/db/versionManager"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const BodySchema = z.object({ enabled: z.boolean() }); + +export async function POST(request: Request): Promise { + let body: unknown; + try { + body = await request.json(); + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const parsed = BodySchema.safeParse(body); + if (!parsed.success) { + return createErrorResponse({ status: 400, message: parsed.error.message }); + } + + try { + await updateServiceField("dario", "autoRestartAdopted", parsed.data.enabled); + return new Response(null, { status: 204 }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/dario/auto-start/route.ts b/src/app/api/services/dario/auto-start/route.ts new file mode 100644 index 0000000000..7a4b575e13 --- /dev/null +++ b/src/app/api/services/dario/auto-start/route.ts @@ -0,0 +1,28 @@ +import { z } from "zod"; +import { updateServiceField } from "@/lib/db/versionManager"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const BodySchema = z.object({ enabled: z.boolean() }); + +export async function POST(request: Request): Promise { + let body: unknown; + try { + body = await request.json(); + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const parsed = BodySchema.safeParse(body); + if (!parsed.success) { + return createErrorResponse({ status: 400, message: parsed.error.message }); + } + + try { + await updateServiceField("dario", "autoStart", parsed.data.enabled); + return new Response(null, { status: 204 }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/dario/install/route.ts b/src/app/api/services/dario/install/route.ts new file mode 100644 index 0000000000..ba37fb2385 --- /dev/null +++ b/src/app/api/services/dario/install/route.ts @@ -0,0 +1,6 @@ +import { install } from "@/lib/services/installers/dario"; +import { handleServiceInstall } from "@/app/api/services/_shared/installRoute"; + +export async function POST(request: Request): Promise { + return handleServiceInstall(request, install); +} diff --git a/src/app/api/services/dario/restart/route.ts b/src/app/api/services/dario/restart/route.ts new file mode 100644 index 0000000000..b67a65d799 --- /dev/null +++ b/src/app/api/services/dario/restart/route.ts @@ -0,0 +1,22 @@ +import { getServiceRow } from "@/lib/db/versionManager"; +import { getOrInitSupervisor } from "../_lib"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const TOOL = "dario"; + +export async function POST(): Promise { + try { + const row = await getServiceRow(TOOL); + if (!row || row.status === "not_installed") { + return createErrorResponse({ status: 409, message: "Dario não está instalado." }); + } + + const sup = await getOrInitSupervisor(); + const status = await sup.restart(); + return Response.json(status); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 503, message: msg }); + } +} diff --git a/src/app/api/services/dario/start/route.ts b/src/app/api/services/dario/start/route.ts new file mode 100644 index 0000000000..76f5cfd0c8 --- /dev/null +++ b/src/app/api/services/dario/start/route.ts @@ -0,0 +1,22 @@ +import { getServiceRow } from "@/lib/db/versionManager"; +import { getOrInitSupervisor } from "../_lib"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const TOOL = "dario"; + +export async function POST(): Promise { + try { + const row = await getServiceRow(TOOL); + if (!row || row.status === "not_installed") { + return createErrorResponse({ status: 409, message: "Dario não está instalado." }); + } + + const sup = await getOrInitSupervisor(); + const status = await sup.start(); + return Response.json(status); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 503, message: msg }); + } +} diff --git a/src/app/api/services/dario/status/route.ts b/src/app/api/services/dario/status/route.ts new file mode 100644 index 0000000000..188312618c --- /dev/null +++ b/src/app/api/services/dario/status/route.ts @@ -0,0 +1,41 @@ +import { getSupervisor } from "@/lib/services/registry"; +import { getServiceRow } from "@/lib/db/versionManager"; +import { + getInstalledVersion, + getLatestVersion, + DARIO_DEFAULT_PORT, +} from "@/lib/services/installers/dario"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const TOOL = "dario"; + +export async function GET(): Promise { + try { + const sup = getSupervisor(TOOL); + const row = await getServiceRow(TOOL); + + const liveStatus = sup?.getStatus() ?? null; + const installedVersion = await getInstalledVersion(); + const latestVersion = await getLatestVersion(); + + return Response.json({ + tool: TOOL, + state: liveStatus?.state ?? row?.status ?? "unknown", + pid: liveStatus?.pid ?? null, + port: liveStatus?.port ?? row?.port ?? DARIO_DEFAULT_PORT, + health: liveStatus?.health ?? "unknown", + startedAt: liveStatus?.startedAt ?? null, + lastError: liveStatus?.lastError ?? row?.errorMessage ?? null, + installedVersion: installedVersion ?? row?.installedVersion ?? null, + latestVersion, + updateAvailable: !!installedVersion && !!latestVersion && installedVersion !== latestVersion, + autoStart: row?.autoStart ?? false, + adopted: liveStatus?.adopted ?? false, + autoRestartAdopted: row?.autoRestartAdopted ?? false, + }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/dario/stop/route.ts b/src/app/api/services/dario/stop/route.ts new file mode 100644 index 0000000000..0e1343434b --- /dev/null +++ b/src/app/api/services/dario/stop/route.ts @@ -0,0 +1,19 @@ +import { getSupervisor } from "@/lib/services/registry"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const TOOL = "dario"; + +export async function POST(): Promise { + try { + const sup = getSupervisor(TOOL); + if (!sup) { + return Response.json({ tool: TOOL, state: "stopped" }); + } + const status = await sup.stop(); + return Response.json(status); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/dario/update/route.ts b/src/app/api/services/dario/update/route.ts new file mode 100644 index 0000000000..524cbf7b40 --- /dev/null +++ b/src/app/api/services/dario/update/route.ts @@ -0,0 +1,45 @@ +import { getSupervisor } from "@/lib/services/registry"; +import { getOrInitSupervisor } from "../_lib"; +import { + getInstalledVersion, + getLatestVersion, + update as downloadUpdate, +} from "@/lib/services/installers/dario"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +export async function POST(): Promise { + try { + const [installed, latest] = await Promise.all([getInstalledVersion(), getLatestVersion()]); + + if (installed && latest && installed === latest) { + return Response.json({ updated: false, installedVersion: installed, latestVersion: latest }); + } + + const sup = getSupervisor("dario"); + const wasRunning = sup?.getStatus().state === "running"; + + if (wasRunning && sup) { + await sup.stop(); + } + + const result = await downloadUpdate(); + + if (wasRunning) { + const freshSup = await getOrInitSupervisor(); + await freshSup.start().catch((err: unknown) => { + const msg = err instanceof Error ? err.message : String(err); + console.warn("[Services] Could not restart dario after update:", msg); + }); + } + + return Response.json({ + updated: true, + oldVersion: installed ?? null, + newVersion: result.installedVersion, + }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/mux/_lib.ts b/src/app/api/services/mux/_lib.ts index 49b1ef672d..b3180703e4 100644 --- a/src/app/api/services/mux/_lib.ts +++ b/src/app/api/services/mux/_lib.ts @@ -25,6 +25,10 @@ export async function getOrInitSupervisor(): Promise { healthIntervalMs: 5_000, stopTimeoutMs: 15_000, logsBufferBytes: 5_242_880, + // #6205: mirrors bootstrap.ts's own supervisor construction — adopt a + // healthy prior instance instead of crashing on-demand creation (e.g. a + // direct API hit before bootstrap runs) into a raw EADDRINUSE. + probeBeforeSpawn: true, }); registerSupervisor(sup); diff --git a/src/app/api/services/mux/auto-restart-adopted/route.ts b/src/app/api/services/mux/auto-restart-adopted/route.ts new file mode 100644 index 0000000000..8c78e3f570 --- /dev/null +++ b/src/app/api/services/mux/auto-restart-adopted/route.ts @@ -0,0 +1,28 @@ +import { z } from "zod"; +import { updateServiceField } from "@/lib/db/versionManager"; +import { createErrorResponse } from "@/lib/api/errorResponse"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; + +const BodySchema = z.object({ enabled: z.boolean() }); + +export async function POST(request: Request): Promise { + let body: unknown; + try { + body = await request.json(); + } catch { + return createErrorResponse({ status: 400, message: "Invalid JSON body" }); + } + + const parsed = BodySchema.safeParse(body); + if (!parsed.success) { + return createErrorResponse({ status: 400, message: parsed.error.message }); + } + + try { + await updateServiceField("mux", "autoRestartAdopted", parsed.data.enabled); + return new Response(null, { status: 204 }); + } catch (err) { + const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); + return createErrorResponse({ status: 500, message: msg }); + } +} diff --git a/src/app/api/services/mux/status/route.ts b/src/app/api/services/mux/status/route.ts index 512ca97b43..14f5b9b661 100644 --- a/src/app/api/services/mux/status/route.ts +++ b/src/app/api/services/mux/status/route.ts @@ -31,6 +31,8 @@ export async function GET(): Promise { latestVersion, updateAvailable: !!installedVersion && !!latestVersion && installedVersion !== latestVersion, autoStart: row?.autoStart ?? false, + adopted: liveStatus?.adopted ?? false, + autoRestartAdopted: row?.autoRestartAdopted ?? false, }); } catch (err) { const msg = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); diff --git a/src/app/api/settings/require-login/route.ts b/src/app/api/settings/require-login/route.ts index 88fb170cce..8b1f9e8e63 100644 --- a/src/app/api/settings/require-login/route.ts +++ b/src/app/api/settings/require-login/route.ts @@ -1,4 +1,6 @@ import { NextResponse } from "next/server"; +import { cookies } from "next/headers"; +import { jwtVerify } from "jose"; import { getSettings, updateSettings } from "@/lib/localDb"; import { hasManagementPasswordConfigured, @@ -9,6 +11,24 @@ import { getNodeRuntimeSupport } from "@/shared/utils/nodeRuntimeSupport.ts"; import { updateRequireLoginSchema } from "@/shared/validation/schemas"; import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; +function getJwtSecret(): Uint8Array | null { + const secret = process.env.JWT_SECRET?.trim(); + return secret ? new TextEncoder().encode(secret) : null; +} + +async function checkSessionAuthenticated(): Promise { + try { + const cookieStore = await cookies(); + const token = cookieStore.get("auth_token")?.value; + const secret = getJwtSecret(); + if (!token || !secret) return false; + await jwtVerify(token, secret); + return true; + } catch { + return false; + } +} + // Node.js compatibility check — reflect the supported secure runtime floors used by CLI/CI. function getNodeCompatibility() { const { nodeVersion, nodeCompatible } = getNodeRuntimeSupport(); @@ -28,10 +48,12 @@ export async function GET() { try { const settings = await getSettings(); const requireLogin = settings.requireLogin !== false; + const authenticated = await checkSessionAuthenticated(); const hasPassword = hasManagementPasswordConfigured(settings); const setupComplete = !!settings.setupComplete; const oidcEnabled = !!settings.oidcEnabled; return NextResponse.json({ + authenticated, requireLogin, hasPassword, setupComplete, @@ -42,6 +64,7 @@ export async function GET() { console.error("[API] Error fetching require-login settings:", error); return NextResponse.json( { + authenticated: false, requireLogin: true, hasPassword: true, setupComplete: true, diff --git a/src/app/api/settings/route.ts b/src/app/api/settings/route.ts index a5e6627641..24313d6f98 100644 --- a/src/app/api/settings/route.ts +++ b/src/app/api/settings/route.ts @@ -5,6 +5,7 @@ import { getRuntimePorts } from "@/lib/runtime/ports"; import { updateSettingsSchema } from "@/shared/validation/settingsSchemas"; import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; import { getConsistentMachineId } from "@/shared/utils/machineId"; +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; import { resolveModelLockoutSettings } from "@/lib/resilience/modelLockoutSettings"; import { validateProxyUrl, @@ -220,6 +221,12 @@ export async function GET(request: Request) { cloudConfigured: Boolean(cloudUrl), cloudUrl, machineId, + // Sidebar.tsx has no server-side feature-flag access (client component); + // this piggy-backs the RADAR_ENABLED gate onto the settings payload the + // sidebar already fetches on mount, so the "radar" item can hide itself + // without a dedicated round trip. See sidebarVisibility.ts's + // `isSidebarItemVisibleForFlags()`. + radarEnabled: isFeatureFlagEnabled("RADAR_ENABLED"), ...(cliproxyapiModelMapping !== null ? { cliproxyapi_model_mapping: cliproxyapiModelMapping } : {}), diff --git a/src/app/api/skills/[id]/route.ts b/src/app/api/skills/[id]/route.ts index 8a9aa82e7c..7bad90e118 100644 --- a/src/app/api/skills/[id]/route.ts +++ b/src/app/api/skills/[id]/route.ts @@ -4,6 +4,7 @@ import { skillRegistry } from "@/lib/skills/registry"; import { z } from "zod"; import { validateBody, isValidationFailure } from "@/shared/validation/helpers"; import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; const updateSkillSchema = z.object({ enabled: z.boolean().optional(), @@ -22,7 +23,7 @@ export async function DELETE(_request: Request, props: { params: Promise<{ id: s } return NextResponse.json({ success: true }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } @@ -71,7 +72,7 @@ export async function PUT(request: Request, props: { params: Promise<{ id: strin mode: validation.data.mode, }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } diff --git a/src/app/api/skills/executions/route.ts b/src/app/api/skills/executions/route.ts index 93d7708a3c..d2ef943e62 100644 --- a/src/app/api/skills/executions/route.ts +++ b/src/app/api/skills/executions/route.ts @@ -4,6 +4,7 @@ import { parsePaginationParams, buildPaginatedResponse } from "@/shared/types/pa import { z } from "zod"; import { validateBody, isValidationFailure } from "@/shared/validation/helpers"; import { isAuthenticated } from "@/shared/utils/apiAuth"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; export async function GET(request: Request) { if (!(await isAuthenticated(request))) { @@ -21,7 +22,7 @@ export async function GET(request: Request) { ); return NextResponse.json(buildPaginatedResponse(executions, total, params)); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } @@ -51,7 +52,7 @@ export async function POST(request: Request) { }); return NextResponse.json({ execution }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); if (error.includes("disabled")) { return NextResponse.json({ error }, { status: 503 }); } diff --git a/src/app/api/skills/install/route.ts b/src/app/api/skills/install/route.ts index 256f262040..540ee02e56 100644 --- a/src/app/api/skills/install/route.ts +++ b/src/app/api/skills/install/route.ts @@ -3,6 +3,7 @@ import { z } from "zod"; import { skillRegistry } from "@/lib/skills/registry"; import { validateBody, isValidationFailure } from "@/shared/validation/helpers"; import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; const installManifestSchema = z.object({ name: z.string().min(1).max(100), @@ -44,7 +45,7 @@ export async function POST(request: Request) { return NextResponse.json({ success: true, id: skill.id }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } diff --git a/src/app/api/skills/marketplace/install/route.ts b/src/app/api/skills/marketplace/install/route.ts index f05ec58044..1690e2b686 100644 --- a/src/app/api/skills/marketplace/install/route.ts +++ b/src/app/api/skills/marketplace/install/route.ts @@ -5,6 +5,7 @@ import { skillRegistry } from "@/lib/skills/registry"; import { getSkillsProviderSetting } from "@/lib/skills/providerSettings"; import { isAuthenticated } from "@/shared/utils/apiAuth"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; const marketplaceInstallSchema = z.object({ name: z.string().min(1).max(64), @@ -53,7 +54,7 @@ export async function POST(request: Request) { return NextResponse.json({ success: true, id: skill.id }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } diff --git a/src/app/api/skills/marketplace/route.ts b/src/app/api/skills/marketplace/route.ts index e0ae1fa146..7a9d197493 100644 --- a/src/app/api/skills/marketplace/route.ts +++ b/src/app/api/skills/marketplace/route.ts @@ -2,6 +2,7 @@ import { NextResponse } from "next/server"; import { getSettings } from "@/lib/db/settings"; import { isAuthenticated } from "@/shared/utils/apiAuth"; import { getSkillsProviderSetting } from "@/lib/skills/providerSettings"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; const POPULAR_BY_PROVIDER = { skillsmp: ["web-search", "file-reader", "sql-assistant", "devops-helper", "docs-assistant"], @@ -55,7 +56,7 @@ export async function GET(request: Request) { const data = await res.json(); return NextResponse.json({ skills: data.data?.skills || data.skills || [] }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } diff --git a/src/app/api/skills/route.ts b/src/app/api/skills/route.ts index 2a0c6a26d5..ce5bc98f09 100644 --- a/src/app/api/skills/route.ts +++ b/src/app/api/skills/route.ts @@ -4,6 +4,7 @@ import { parsePaginationParams, buildPaginatedResponse } from "@/shared/types/pa import { getSkillsProviderSetting } from "@/lib/skills/providerSettings"; import { requireManagementAuth } from "@/lib/api/requireManagementAuth"; import { matchesSearch } from "@/shared/utils/turkishText"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; const POPULAR_BY_PROVIDER = { skillsmp: ["web-search", "file-reader", "sql-assistant", "devops-helper", "docs-assistant"], @@ -56,7 +57,7 @@ export async function GET(request?: Request) { popularDefaults: POPULAR_BY_PROVIDER[provider], }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } diff --git a/src/app/api/skills/skillssh/install/route.ts b/src/app/api/skills/skillssh/install/route.ts index cb3288e2a5..84707c0e73 100644 --- a/src/app/api/skills/skillssh/install/route.ts +++ b/src/app/api/skills/skillssh/install/route.ts @@ -5,6 +5,7 @@ import { skillRegistry } from "@/lib/skills/registry"; import { isAuthenticated } from "@/shared/utils/apiAuth"; import { fetchSkillMd } from "@/lib/skills/skillssh"; import { getSkillsProviderSetting } from "@/lib/skills/providerSettings"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; const skillsshInstallSchema = z.object({ name: z.string().min(1).max(64), @@ -55,7 +56,7 @@ export async function POST(request: Request) { return NextResponse.json({ success: true, id: skill.id }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } diff --git a/src/app/api/skills/skillssh/route.ts b/src/app/api/skills/skillssh/route.ts index ab587fddef..5ceffbfe69 100644 --- a/src/app/api/skills/skillssh/route.ts +++ b/src/app/api/skills/skillssh/route.ts @@ -1,6 +1,7 @@ import { NextResponse } from "next/server"; import { isAuthenticated } from "@/shared/utils/apiAuth"; import { searchSkillsSh } from "@/lib/skills/skillssh"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; export async function GET(request: Request) { if (!(await isAuthenticated(request))) { @@ -22,7 +23,7 @@ export async function GET(request: Request) { })), }); } catch (err: unknown) { - const error = err instanceof Error ? err.message : String(err); + const error = sanitizeErrorMessage(err instanceof Error ? err.message : String(err)); return NextResponse.json({ error }, { status: 500 }); } } diff --git a/src/app/api/tools/agent-bridge/agents/[id]/mappings/route.ts b/src/app/api/tools/agent-bridge/agents/[id]/mappings/route.ts index 4e03b0a1c6..6e312c9b16 100644 --- a/src/app/api/tools/agent-bridge/agents/[id]/mappings/route.ts +++ b/src/app/api/tools/agent-bridge/agents/[id]/mappings/route.ts @@ -4,7 +4,11 @@ * LOCAL_ONLY: registered in routeGuard.ts */ import { AgentBridgeMappingPutSchema } from "@/shared/schemas/agentBridge"; -import { getMappingsForAgent, setMappings, syncAgentBridgeMappingsToMitmAlias } from "@/lib/db/agentBridgeMappings"; +import { + getMappingsForAgent, + setMappings, + syncAgentBridgeMappingsToMitmAlias, +} from "@/lib/db/agentBridgeMappings"; import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; import { createErrorResponse } from "@/lib/api/errorResponse"; diff --git a/src/app/api/upstream-proxy/[providerId]/route.ts b/src/app/api/upstream-proxy/[providerId]/route.ts index 658b488665..6fe78faca6 100644 --- a/src/app/api/upstream-proxy/[providerId]/route.ts +++ b/src/app/api/upstream-proxy/[providerId]/route.ts @@ -4,13 +4,34 @@ import { upsertUpstreamProxyConfig, deleteUpstreamProxyConfig, } from "@/lib/db/upstreamProxy"; +import { isClaudeCodeCompatibleProvider } from "@/shared/constants/providers"; import { z } from "zod"; import { validateBody, isValidationFailure } from "@/shared/validation/helpers"; +/** + * The upstream `dario` project can itself proxy other subscription-based + * providers (OpenAI, Grok) — but OmniRoute's integration only wires up + * Claude Pro/Max OAuth account management (login-start/login-complete/ + * accounts) and DarioExecutor only implements Claude Code's exact wire + * shape, added specifically so Claude Code traffic stays undetectable as + * Anthropic's wire format drifts. Routing a non-Claude provider's requests + * through it here would hit account/shape handling that was never built for + * that provider and break. Mirrors the scope CLIProxyAPI's own + * "claude-native" deep mode already uses. Revisit if account management for + * another provider gets added to this integration. + */ +function isDarioEligibleProvider(providerId: string): boolean { + return providerId === "claude" || isClaudeCodeCompatibleProvider(providerId); +} + const upstreamProxySchema = z.object({ - mode: z.enum(["native", "cliproxyapi", "fallback"]).default("native"), + // "dario" (#dario) is a new direct-passthrough mode alongside "cliproxyapi". + mode: z.enum(["native", "cliproxyapi", "dario", "fallback"]).default("native"), enabled: z.boolean().optional().default(true), + // Retry-leg backend for mode="fallback"; defaults to "cliproxyapi" so any + // existing fallback config is unchanged when the field is omitted. + fallbackBackend: z.enum(["cliproxyapi", "dario"]).optional(), }); export async function GET( @@ -23,7 +44,7 @@ export async function GET( } const config = await getUpstreamProxyConfig(providerId); if (!config) { - return NextResponse.json({ enabled: false, mode: "native" }); + return NextResponse.json({ enabled: false, mode: "native", fallbackBackend: "cliproxyapi" }); } return NextResponse.json(config); } @@ -43,12 +64,26 @@ export async function PUT( return NextResponse.json(validation.error, { status: 400 }); } - const { mode, enabled } = validation.data; + const { mode, enabled, fallbackBackend } = validation.data; + + const wantsDario = mode === "dario" || (mode === "fallback" && fallbackBackend === "dario"); + if (wantsDario && !isDarioEligibleProvider(providerId)) { + return NextResponse.json( + { + error: + `Dario only proxies Claude-Code-shaped traffic (it authenticates via a Claude ` + + `Pro/Max subscription, not a per-provider credential) — "${providerId}" can't be ` + + `routed through it.`, + }, + { status: 400 } + ); + } const config = await upsertUpstreamProxyConfig({ providerId, mode, enabled, + ...(fallbackBackend !== undefined ? { fallbackBackend } : {}), }); return NextResponse.json(config); diff --git a/src/app/api/usage/analytics/route.ts b/src/app/api/usage/analytics/route.ts index 04a05bab30..d90480964e 100644 --- a/src/app/api/usage/analytics/route.ts +++ b/src/app/api/usage/analytics/route.ts @@ -216,7 +216,12 @@ function resolveModelPricing( } } - // Last resort fallback for historical usage (e.g. "gpt-4" missing, matches "gpt-4.1" or first available) + // Short-circuit :free models to $0 (they have no pricing entry → should not fall back to arbitrary rates) + if (!pricing && model.endsWith(":free")) { + return null; + } + + // Last resort fallback for historical usage (e.g. "gpt-4" missing, matches "gpt-4.1") if (!pricing && providerPricing && typeof providerPricing === "object") { for (const [key, val] of Object.entries(providerPricing as Record)) { const lm = model.toLowerCase(); @@ -225,10 +230,6 @@ function resolveModelPricing( break; } } - if (!pricing) { - const keys = Object.keys(providerPricing as Record); - if (keys.length > 0) pricing = (providerPricing as Record)[keys[0]]; - } } return pricing as Record | null; diff --git a/src/app/api/v1/batches/parseListLimit.ts b/src/app/api/v1/batches/parseListLimit.ts new file mode 100644 index 0000000000..101d6352ab --- /dev/null +++ b/src/app/api/v1/batches/parseListLimit.ts @@ -0,0 +1,30 @@ +// Validates the `limit` query param for `GET /v1/batches`. The list endpoint previously +// passed `Number.parseInt(limit)` straight to the SQLite `LIMIT ?` bind with no validation, +// so `?limit=abc` threw an unhandled "datatype mismatch" (→ 500), `?limit=-1|0` produced an +// incoherent `has_more:true` empty page, and a large `?limit` read the whole table. +// +// This mirrors the OpenAI Batches list contract (integer, 1–100, default 20) and the repo's +// own query-param bounds (see `max_results` in src/shared/validation/schemas/apiV1.ts: +// `z.coerce.number().int().min(1).max(100)`). Kept dependency-free so it is unit-testable +// in isolation; swap in the Zod schema if the maintainer prefers. + +export const DEFAULT_BATCH_LIST_LIMIT = 20; +export const MAX_BATCH_LIST_LIMIT = 100; + +export type ParsedListLimit = + | { ok: true; limit: number } + | { ok: false; message: string }; + +export function parseBatchListLimit(raw: string | null): ParsedListLimit { + if (raw === null || raw === "") { + return { ok: true, limit: DEFAULT_BATCH_LIST_LIMIT }; + } + const n = Number(raw); + if (!Number.isInteger(n) || n < 1 || n > MAX_BATCH_LIST_LIMIT) { + return { + ok: false, + message: `'limit' must be an integer between 1 and ${MAX_BATCH_LIST_LIMIT}`, + }; + } + return { ok: true, limit: n }; +} diff --git a/src/app/api/v1/batches/route.ts b/src/app/api/v1/batches/route.ts index cc4a2bcd14..9b2be67f6c 100644 --- a/src/app/api/v1/batches/route.ts +++ b/src/app/api/v1/batches/route.ts @@ -4,6 +4,7 @@ import { v1BatchCreateSchema } from "@/shared/validation/schemas"; import { NextResponse } from "next/server"; import { getApiKeyRequestScope } from "@/app/api/v1/_helpers/apiKeyScope"; import { formatBatchResponse } from "./formatBatchResponse"; +import { parseBatchListLimit } from "./parseListLimit"; export async function OPTIONS() { return handleCorsOptions(); @@ -69,7 +70,14 @@ export async function GET(request: Request) { const apiKeyId = scope.apiKeyId; const url = new URL(request.url); - const limit = Number.parseInt(url.searchParams.get("limit") || "20"); + const parsedLimit = parseBatchListLimit(url.searchParams.get("limit")); + if (!parsedLimit.ok) { + return NextResponse.json( + { error: { message: parsedLimit.message, type: "invalid_request_error" } }, + { status: 400, headers: CORS_HEADERS } + ); + } + const limit = parsedLimit.limit; const after = url.searchParams.get("after") || undefined; const batches = listBatches(apiKeyId || undefined, limit + 1, after); diff --git a/src/app/api/v1/chat/completions/route.ts b/src/app/api/v1/chat/completions/route.ts index 77eed06416..4c8f16331a 100644 --- a/src/app/api/v1/chat/completions/route.ts +++ b/src/app/api/v1/chat/completions/route.ts @@ -24,6 +24,7 @@ import { readCompressionRequestHeader, withCompressionHeaderEcho, } from "@/shared/utils/compressionHeaderEcho"; +import { resolveModelAliasOnBody } from "@/lib/modelAliasResolver"; let initPromise = null; @@ -135,14 +136,23 @@ export async function POST(request) { if (!shapeCheck.success) { const issue = shapeCheck.error.issues[0]; const field = issue?.path?.length ? issue.path.join(".") : "body"; - return finishAdmission(errorResponse(400, `${field}: ${issue?.message ?? "Invalid request"}`)); + return finishAdmission( + errorResponse(400, `${field}: ${issue?.message ?? "Invalid request"}`) + ); } } const structuralAdmission = admitChatStructure(parsedBody, admission.lease); if (structuralAdmission.admit === false) { admission.lease?.release(); - return structuralAdmission.response; + return finishAdmission(structuralAdmission.response); + } + + // Resolve model alias before forwarding to handleChat + if (parsedBody && typeof parsedBody === "object") { + await resolveModelAliasOnBody(parsedBody).catch(() => { + /* swallow — fall through with original model */ + }); } admission.lease = structuralAdmission.lease; diff --git a/src/app/api/v1/images/upscale/route.ts b/src/app/api/v1/images/upscale/route.ts new file mode 100644 index 0000000000..e3ea105b93 --- /dev/null +++ b/src/app/api/v1/images/upscale/route.ts @@ -0,0 +1,274 @@ +import { handleImageUpscale } from "@omniroute/open-sse/handlers/imageUpscale.ts"; +import { + getUpscaleProvider, + getAllUpscaleModels, + parseUpscaleModel, +} from "@omniroute/open-sse/config/upscaleRegistry.ts"; +import { extractUpscaleSourceImage } from "@omniroute/open-sse/handlers/imageUpscale/shared.ts"; +import { withInjectionGuard } from "@/middleware/promptInjectionGuard"; +import { + getProviderCredentialsWithQuotaPreflight, + clearRecoveredProviderState, +} from "@/sse/services/auth"; +import { errorResponse, unavailableResponse } from "@omniroute/open-sse/utils/error.ts"; +import { HTTP_STATUS } from "@omniroute/open-sse/config/constants.ts"; +import * as log from "@/sse/utils/logger"; +import { toJsonErrorPayload } from "@/shared/utils/upstreamError"; +import { enforceApiKeyPolicy } from "@/shared/utils/apiKeyPolicy"; +import { v1ImageUpscaleSchema } from "@/shared/validation/schemas"; +import { isValidationFailure, validateBody } from "@/shared/validation/helpers"; +import { resolveProxyForConnection } from "@/lib/db/settings"; +import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch.ts"; +import { attachOmniRouteMetaHeaders } from "@/domain/omnirouteResponseMeta"; +import { calculateModalCost } from "@/lib/usage/costCalculator"; +import { generateRequestId } from "@/shared/utils/requestId"; + +export const dynamic = "force-dynamic"; + +/** + * `/v1/images/upscale` — image→image super-resolution. + * + * A dedicated endpoint rather than a `/v1/images/generations` model: upscaling has no + * text-to-image path, always needs a source image, and its meaningful controls (scale + * factor, creativity level) do not exist on the generation contract. + * + * Providers are declared in `open-sse/config/upscaleRegistry.ts`: + * - `adobe-firefly/topaz-standard` · `adobe-firefly/topaz-bloom` (Topaz via Firefly 3P) + * - `stability-ai/fast` · `stability-ai/conservative` · `stability-ai/creative` + * - `topaz/topaz-enhance` (Topaz Labs native API) + * + * Accepts JSON (data-URL / http(s) image) or multipart/form-data (`image` file part), + * since OpenAI-style clients send the latter for image inputs. + */ + +export async function OPTIONS() { + return new Response(null, { + headers: { + "Access-Control-Allow-Methods": "GET, POST, OPTIONS", + "Access-Control-Allow-Headers": "*", + }, + }); +} + +/** GET /v1/images/upscale — list the upscale models this instance can serve. */ +export async function GET() { + const data = getAllUpscaleModels().map((model) => { + const providerConfig = getUpscaleProvider(model.provider); + const entry = providerConfig?.models.find((candidate) => model.id.endsWith(`/${candidate.id}`)); + return { + id: model.id, + object: "model", + owned_by: model.provider, + name: model.name, + type: "image", + subtype: "upscale", + input_modalities: ["image"], + output_modalities: ["image"], + factors: entry?.factors ?? [], + supports_creativity: Boolean(entry?.supportsCreativity), + supports_prompt: Boolean(entry?.supportsPrompt), + prompt_required: Boolean(entry?.promptRequired), + ...(entry?.description ? { description: entry.description } : {}), + }; + }); + + return new Response(JSON.stringify({ object: "list", data }), { + status: 200, + headers: { "Content-Type": "application/json" }, + }); +} + +/** + * Read the request body as a plain object from either JSON or multipart/form-data. + * Multipart file parts become data URLs so every downstream handler sees one shape. + */ +async function readUpscaleBody(request: Request): Promise | null> { + const contentType = request.headers.get("content-type") || ""; + + if (contentType.includes("multipart/form-data")) { + try { + const formData = await request.formData(); + const body: Record = {}; + for (const [key, value] of formData.entries()) { + if (typeof value === "string") { + body[key] = value; + continue; + } + const file = value as File; + const bytes = Buffer.from(await file.arrayBuffer()); + if (!bytes.length) continue; + const mime = file.type && file.type.startsWith("image/") ? file.type : "image/png"; + body[key] = `data:${mime};base64,${bytes.toString("base64")}`; + } + return body; + } catch (err) { + log.warn("IMAGE", `Invalid multipart upscale body: ${err instanceof Error ? err.message : err}`); + return null; + } + } + + try { + const parsed = await request.json(); + return parsed && typeof parsed === "object" && !Array.isArray(parsed) + ? (parsed as Record) + : null; + } catch { + return null; + } +} + +async function postHandler(request: Request) { + const rawBody = await readUpscaleBody(request); + if (!rawBody) { + return errorResponse( + HTTP_STATUS.BAD_REQUEST, + "Invalid request body. Send JSON or multipart/form-data with an image." + ); + } + + const validation = validateBody(v1ImageUpscaleSchema, rawBody); + if (isValidationFailure(validation)) { + return errorResponse(HTTP_STATUS.BAD_REQUEST, validation.error.message); + } + const body = validation.data as Record; + const startTime = Date.now(); + + const policy = await enforceApiKeyPolicy(request, String(body.model ?? "")); + if (policy.rejection) return policy.rejection; + + const allowedConnections = + policy.apiKeyInfo?.allowedConnections && policy.apiKeyInfo.allowedConnections.length > 0 + ? policy.apiKeyInfo.allowedConnections + : null; + + const { provider, model } = parseUpscaleModel(String(body.model ?? "")); + if (!provider || !model) { + return errorResponse( + HTTP_STATUS.BAD_REQUEST, + `Invalid upscale model: ${body.model}. Use format: provider/model ` + + `(e.g. adobe-firefly/topaz-bloom).` + ); + } + + const providerConfig = getUpscaleProvider(provider); + if (!providerConfig) { + return errorResponse(HTTP_STATUS.BAD_REQUEST, `Unknown upscale provider: ${provider}`); + } + + const entry = providerConfig.models.find((candidate) => candidate.id === model); + if (!entry) { + return errorResponse( + HTTP_STATUS.BAD_REQUEST, + `Unsupported upscale model for ${provider}: ${model}. ` + + `Available: ${providerConfig.models.map((m) => m.id).join(", ")}.` + ); + } + + if (!extractUpscaleSourceImage(body)) { + return errorResponse( + HTTP_STATUS.BAD_REQUEST, + `A source image is required for upscaling. Send "image" or "image_url" ` + + `(data URL, http(s) URL, or a multipart file part).` + ); + } + + if (entry.promptRequired && !(typeof body.prompt === "string" && body.prompt.trim())) { + return errorResponse( + HTTP_STATUS.BAD_REQUEST, + `Upscale model ${provider}/${model} requires a prompt describing the image.` + ); + } + + const credentialsResult = await getProviderCredentialsWithQuotaPreflight( + provider, + null, + allowedConnections, + `${provider}/${model}` + ); + if (!credentialsResult) { + return errorResponse( + HTTP_STATUS.BAD_REQUEST, + `No credentials for upscale provider: ${provider}` + ); + } + + // getProviderCredentialsWithQuotaPreflight returns either a credential record or an + // all-rate-limited marker; read both through one loose view (the union has no common + // discriminant) and narrow explicitly afterwards. + const creds = credentialsResult as { + allRateLimited?: boolean; + retryAfter?: string; + retryAfterHuman?: string; + apiKey?: string | null; + accessToken?: string | null; + connectionId?: string | null; + providerSpecificData?: Record | null; + }; + + if (creds.allRateLimited) { + return unavailableResponse( + HTTP_STATUS.RATE_LIMITED, + `[${provider}] All accounts rate limited`, + creds.retryAfter, + creds.retryAfterHuman + ); + } + + const upscaleCredentials = { + ...(typeof creds.apiKey === "string" && creds.apiKey ? { apiKey: creds.apiKey } : {}), + ...(typeof creds.accessToken === "string" && creds.accessToken + ? { accessToken: creds.accessToken } + : {}), + // Adobe Firefly keeps a pasted firefly.adobe.com Cookie here. + ...(creds.providerSpecificData ? { providerSpecificData: creds.providerSpecificData } : {}), + }; + + let proxyInfo: { proxy?: unknown } | null = null; + if (creds.connectionId) { + try { + proxyInfo = (await resolveProxyForConnection(creds.connectionId)) as { proxy?: unknown } | null; + } catch { + log.debug("PROXY", `Failed to resolve proxy for upscale provider: ${provider}`); + } + } + + const runUpscale = () => handleImageUpscale({ body, credentials: upscaleCredentials, log }); + + const result = await (creds.connectionId + ? runWithProxyContext((proxyInfo?.proxy as never) || null, runUpscale).catch( + (err: { statusCode?: number; message?: string }) => ({ + success: false, + status: err.statusCode || 500, + error: err.message, + }) + ) + : runUpscale()); + + if (result.success) { + await clearRecoveredProviderState(credentialsResult); + const costUsd = await calculateModalCost("image", provider, `${provider}/${model}`, { n: 1 }); + const headers = new Headers({ "Content-Type": "application/json" }); + attachOmniRouteMetaHeaders(headers, { + provider, + model: `${provider}/${model}`, + costUsd, + latencyMs: Date.now() - startTime, + requestId: generateRequestId(), + }); + return new Response(JSON.stringify((result as { data: unknown }).data), { + status: 200, + headers, + }); + } + + const errorPayload = toJsonErrorPayload( + (result as { error?: unknown }).error, + "Image upscale provider error" + ); + return new Response(JSON.stringify(errorPayload), { + status: (result as { status?: number }).status ?? HTTP_STATUS.BAD_GATEWAY, + headers: { "Content-Type": "application/json" }, + }); +} + +export const POST = withInjectionGuard(postHandler); diff --git a/src/app/api/v1/models/catalog.ts b/src/app/api/v1/models/catalog.ts index a5cda7fc3c..e75517112d 100644 --- a/src/app/api/v1/models/catalog.ts +++ b/src/app/api/v1/models/catalog.ts @@ -37,7 +37,8 @@ import { createBuiltinAutoCombo, isPaidTierAutoId, } from "@omniroute/open-sse/services/autoCombo/builtinCatalog"; -import { getAllSyncedAvailableModels, type SyncedAvailableModel } from "@/lib/db/models"; +import type { SyncedAvailableModel } from "@/lib/db/models"; +import { getAllActiveSyncedModels } from "@/lib/db/models/activeSyncedCatalog"; import { getModelCatalogCacheVersion } from "@/lib/db/readCache"; import { getCompatibleFallbackModels } from "@/lib/providers/managedAvailableModels"; import { providerUsesCuratedModelsOnly } from "@/lib/providers/modelListingCapability"; @@ -135,8 +136,8 @@ export async function getUnifiedModelsResponse( // #6408 fast path: reject unauthorized callers first (auth state is per-request // and MUST NOT be cached), then coalesce identical concurrent requests + short- // TTL memoize the serialized JSON body. + let settingsForAuth: Record = {}; try { - let settingsForAuth: Record = {}; try { settingsForAuth = await getSettings(); } catch {} @@ -160,7 +161,11 @@ export async function getUnifiedModelsResponse( return await resolveCachedCatalogResponse( request, { corsHeaders, diagnosticHeaders }, - buildCatalogPayload + buildCatalogPayload, + { + hideAutoCombos: settingsForAuth?.hideAutoCombos === true, + hideNoThinkVariants: settingsForAuth?.hideNoThinkVariants === true, + } ); } catch (err) { // Hard rule #12: never put a raw err.message/err.stack in a response body. @@ -235,6 +240,10 @@ async function buildUnifiedModelsResponseCore( // exempt. Combos + auto/* + synced/custom/alias-backed rows also stay unfiltered — // extending v1 scope to those requires per-entry pricing lookup not available today. const hidePaid = settings.hidePaidModels === true; + // #9418: Opt-in filter — skip the entire auto/* synthesis loop when the operator + // does not want built-in virtual combos advertised in the catalog. User-defined + // combos are unaffected; routing still works for ids sent explicitly. + const hideAuto = settings.hideAutoCombos === true; const shouldHidePaid = (providerKey: string, modelId: string, pricing?: unknown): boolean => { if (!hidePaid) return false; const provider = aliasToProviderId[providerKey] || providerKey; @@ -489,14 +498,13 @@ async function buildUnifiedModelsResponseCore( const buildComboCatalogMetadata = ( combo: Parameters[0], - allCombos: Parameters[1] + targets: ComboCatalogTarget[] ) => { const explicitContextLength = isPositiveFiniteNumber(combo.context_length) ? combo.context_length : undefined; const baseMetadata = explicitContextLength ? { context_length: explicitContextLength } : {}; - const targets = resolveNestedComboTargets(combo, allCombos) as ComboCatalogTarget[]; if (targets.length === 0) return baseMetadata; const targetMetadata = targets.map((target) => getComboTargetCatalogMetadata(target)); @@ -569,6 +577,7 @@ async function buildUnifiedModelsResponseCore( connections, prefixMode, aliasToProviderId, + hideNoThinkVariants: settings.hideNoThinkVariants === true, }); return finalizeCatalogResponse(request, quotaFinal, () => undefined, { ...corsHeaders, @@ -586,47 +595,51 @@ async function buildUnifiedModelsResponseCore( // #4164 entry is emitted instead, so the id is never dropped. // #4235 Phase B: also advertise the curated `auto/[:]` combos. // #6453: also advertise the `auto/` combos (auto/glm, auto/minimax, ...). - for (const autoId of [ - ...Object.keys(AUTO_TEMPLATE_VARIANTS), - ...AUTO_SUFFIX_VARIANTS, - ...AUTO_FAMILY_IDS, - ]) { - if (blockedProviders.has("auto") || listedIds.has(autoId)) continue; // #5192 - // #6328 (follow-up to #6495 / #6512): REMOVE — not just hide — paid-tier - // auto/* ids (auto/pro-* + auto/*:pro) from the advertised catalog when the - // operator opts into hidePaidModels. The candidate-pool filter in - // virtualFactory (#6512) still gates request-time routing for the rest. - if (hidePaid && isPaidTierAutoId(autoId)) continue; - listedIds.add(autoId); - const baseAutoEntry = { - id: autoId, - object: "model", - created: timestamp, - owned_by: "combo", - permission: [], - root: autoId, - parent: null, - }; - try { - const suffix = autoId.replace(/^auto\/?/, ""); - const virtualCombo = await createBuiltinAutoCombo(autoId, suffix); - const contextLength = virtualCombo.advertisedContextLength || 128000; - const maxOutputTokens = virtualCombo.advertisedMaxOutputTokens || 8192; - models.push({ - ...baseAutoEntry, - context_length: contextLength, - max_input_tokens: contextLength, - max_output_tokens: maxOutputTokens, - capabilities: { - tool_calling: true, - reasoning: true, - thinking: true, - temperature: true, - }, - }); - } catch (err) { - console.log(`[catalog] Could not materialize built-in auto model ${autoId}:`, err); - models.push(baseAutoEntry); + // #9418: skip the entire loop when hideAutoCombos is on — the ids are still + // routable when sent explicitly, just not advertised in the catalog. + if (!hideAuto) { + for (const autoId of [ + ...Object.keys(AUTO_TEMPLATE_VARIANTS), + ...AUTO_SUFFIX_VARIANTS, + ...AUTO_FAMILY_IDS, + ]) { + if (blockedProviders.has("auto") || listedIds.has(autoId)) continue; // #5192 + // #6328 (follow-up to #6495 / #6512): REMOVE — not just hide — paid-tier + // auto/* ids (auto/pro-* + auto/*:pro) from the advertised catalog when the + // operator opts into hidePaidModels. The candidate-pool filter in + // virtualFactory (#6512) still gates request-time routing for the rest. + if (hidePaid && isPaidTierAutoId(autoId)) continue; + listedIds.add(autoId); + const baseAutoEntry = { + id: autoId, + object: "model", + created: timestamp, + owned_by: "combo", + permission: [], + root: autoId, + parent: null, + }; + try { + const suffix = autoId.replace(/^auto\/?/, ""); + const virtualCombo = await createBuiltinAutoCombo(autoId, suffix); + const contextLength = virtualCombo.advertisedContextLength || 128000; + const maxOutputTokens = virtualCombo.advertisedMaxOutputTokens || 8192; + models.push({ + ...baseAutoEntry, + context_length: contextLength, + max_input_tokens: contextLength, + max_output_tokens: maxOutputTokens, + capabilities: { + tool_calling: true, + reasoning: true, + thinking: true, + temperature: true, + }, + }); + } catch (err) { + console.log(`[catalog] Could not materialize built-in auto model ${autoId}:`, err); + models.push(baseAutoEntry); + } } } @@ -641,16 +654,13 @@ async function buildUnifiedModelsResponseCore( combo as Parameters[0], combos as Parameters[1] ) as ComboCatalogTarget[]; - if ( - comboTargets.some((target) => { - const resolved = getComboTargetModelId(target); - return resolved ? getModelIsHidden(resolved.providerId, resolved.modelId) : false; - }) - ) { - continue; - } + const visibleTargets = comboTargets.filter((target) => { + const resolved = getComboTargetModelId(target); + return resolved ? !getModelIsHidden(resolved.providerId, resolved.modelId) : true; + }); + if (visibleTargets.length === 0) continue; - const comboMetadata = buildComboCatalogMetadata(combo, combos); + const comboMetadata = buildComboCatalogMetadata(combo, visibleTargets); listedIds.add(combo.name); models.push({ @@ -667,7 +677,7 @@ async function buildUnifiedModelsResponseCore( let syncedModelsByProvider: Record = {}; try { - syncedModelsByProvider = await getAllSyncedAvailableModels(); + syncedModelsByProvider = await getAllActiveSyncedModels(); } catch (e) { // DB unavailable — log and fall through; static models remain as defaults. console.log("[catalog] Could not fetch synced available models:", e); @@ -972,6 +982,9 @@ async function buildUnifiedModelsResponseCore( const modelType = getOpenRouterModelType(inputModalities, outputModalities); const isFree = isOpenRouterFreeModel(openRouterModel); if (hidePaid && !isFree) continue; + // #9293: respect per-model hidden flags (e.g. operator hid google/chirp-3 + // from the OpenRouter provider, so it should not appear in the live catalog). + if (getModelIsHidden("openrouter", openRouterModel.id)) continue; const supportedParameters = Array.isArray(openRouterModel.supported_parameters) ? openRouterModel.supported_parameters : []; @@ -1054,12 +1067,20 @@ async function buildUnifiedModelsResponseCore( return existingRoot === rawModelId; }); + // Helper: strip the provider prefix from a specialty model ID to get the + // provider-relative path (e.g. "openrouter/google/chirp-3" -> "google/chirp-3"). + // This is the correct key used by getModelIsHidden() — using .split("/").pop() + // here would discard all but the last segment and miss stored flags for + // providers whose model IDs carry a sub-path (e.g. OpenRouter scoped models). + const getSpecialtyModelRelativeId = (modelId: string, provider: string): string => + modelId.startsWith(`${provider}/`) + ? modelId.slice(provider.length + 1) + : modelId; + // Add embedding models (filtered by active providers) for (const embModel of getAllEmbeddingModels()) { if (!isProviderActive(embModel.provider)) continue; - const rawModelId = embModel.id.startsWith(`${embModel.provider}/`) - ? embModel.id.slice(embModel.provider.length + 1) - : embModel.id; + const rawModelId = getSpecialtyModelRelativeId(embModel.id, embModel.provider); if (!providerSupportsModel(embModel.provider, rawModelId)) continue; if (getModelIsHidden(embModel.provider, rawModelId)) continue; if (hasEquivalentSpecialtyModel(embModel.provider, rawModelId, "embedding", embModel.id)) { @@ -1079,7 +1100,7 @@ async function buildUnifiedModelsResponseCore( // Add image models (filtered by active providers) for (const imgModel of getAllImageModels()) { if (!isProviderActive(imgModel.provider)) continue; - const rawModelId = imgModel.id.split("/").pop() || imgModel.id; + const rawModelId = getSpecialtyModelRelativeId(imgModel.id, imgModel.provider); if (!providerSupportsModel(imgModel.provider, rawModelId)) continue; if (getModelIsHidden(imgModel.provider, rawModelId)) continue; models.push({ @@ -1098,7 +1119,7 @@ async function buildUnifiedModelsResponseCore( // Add rerank models (filtered by active providers) for (const rerankModel of getAllRerankModels()) { if (!isProviderActive(rerankModel.provider)) continue; - const rawModelId = rerankModel.id.split("/").pop() || rerankModel.id; + const rawModelId = getSpecialtyModelRelativeId(rerankModel.id, rerankModel.provider); if (!providerSupportsModel(rerankModel.provider, rawModelId)) continue; if (getModelIsHidden(rerankModel.provider, rawModelId)) continue; if (hasEquivalentSpecialtyModel(rerankModel.provider, rawModelId, "rerank", rerankModel.id)) { @@ -1117,7 +1138,7 @@ async function buildUnifiedModelsResponseCore( // Add audio models (filtered by active providers) for (const audioModel of getAllAudioModels()) { if (!isProviderActive(audioModel.provider)) continue; - const rawModelId = audioModel.id.split("/").pop() || audioModel.id; + const rawModelId = getSpecialtyModelRelativeId(audioModel.id, audioModel.provider); if (!providerSupportsModel(audioModel.provider, rawModelId)) continue; if (getModelIsHidden(audioModel.provider, rawModelId)) continue; models.push({ @@ -1133,7 +1154,7 @@ async function buildUnifiedModelsResponseCore( // Add moderation models (filtered by active providers) for (const modModel of getAllModerationModels()) { if (!isProviderActive(modModel.provider)) continue; - const rawModelId = modModel.id.split("/").pop() || modModel.id; + const rawModelId = getSpecialtyModelRelativeId(modModel.id, modModel.provider); if (!providerSupportsModel(modModel.provider, rawModelId)) continue; if (getModelIsHidden(modModel.provider, rawModelId)) continue; models.push({ @@ -1148,7 +1169,7 @@ async function buildUnifiedModelsResponseCore( // Add video models (filtered by active providers) for (const videoModel of getAllVideoModels()) { if (!isProviderActive(videoModel.provider)) continue; - const rawModelId = videoModel.id.split("/").pop() || videoModel.id; + const rawModelId = getSpecialtyModelRelativeId(videoModel.id, videoModel.provider); if (!providerSupportsModel(videoModel.provider, rawModelId)) continue; if (getModelIsHidden(videoModel.provider, rawModelId)) continue; models.push({ @@ -1163,7 +1184,7 @@ async function buildUnifiedModelsResponseCore( // Add music models (filtered by active providers) for (const musicModel of getAllMusicModels()) { if (!isProviderActive(musicModel.provider)) continue; - const rawModelId = musicModel.id.split("/").pop() || musicModel.id; + const rawModelId = getSpecialtyModelRelativeId(musicModel.id, musicModel.provider); if (!providerSupportsModel(musicModel.provider, rawModelId)) continue; if (getModelIsHidden(musicModel.provider, rawModelId)) continue; models.push({ @@ -1230,9 +1251,30 @@ async function buildUnifiedModelsResponseCore( continue; } - // Skip if already added as built-in + // Skip if already added as built-in. When the custom entry has an explicit + // supportsVision flag, merge vision fields into the existing synced entry + // instead of skipping (#9195). const aliasId = `${alias}/${modelId}`; - if (models.some((m) => m.id === aliasId)) continue; + const existingIndex = models.findIndex((m) => m.id === aliasId); + if (existingIndex !== -1) { + if (typeof model.supportsVision === "boolean") { + const mergeVisionFields = getCustomVisionCapabilityFields(model, aliasId, modelId); + if (mergeVisionFields) { + const existing = models[existingIndex] as Record; + existing.capabilities = { + ...((existing.capabilities as Record) || {}), + ...mergeVisionFields.capabilities, + }; + if (mergeVisionFields.input_modalities) { + existing.input_modalities = mergeVisionFields.input_modalities; + } + if (mergeVisionFields.output_modalities) { + existing.output_modalities = mergeVisionFields.output_modalities; + } + } + } + continue; + } // Determine type from supportedEndpoints const endpoints = Array.isArray(model.supportedEndpoints) @@ -1252,7 +1294,9 @@ async function buildUnifiedModelsResponseCore( continue; } const visionFields = - modelType === "chat" ? getCustomVisionCapabilityFields(model, aliasId, modelId) : null; + !modelType || modelType === "chat" + ? getCustomVisionCapabilityFields(model, aliasId, modelId) + : null; if (includeAlias) { models.push({ @@ -1283,7 +1327,7 @@ async function buildUnifiedModelsResponseCore( const providerPrefixedId = `${canonicalProviderId}/${modelId}`; if (models.some((m) => m.id === providerPrefixedId)) continue; const providerVisionFields = - modelType === "chat" + !modelType || modelType === "chat" ? getCustomVisionCapabilityFields(model, providerPrefixedId, modelId) : null; models.push({ @@ -1332,7 +1376,16 @@ async function buildUnifiedModelsResponseCore( continue; } - const alias = providerIdToAlias[canonicalProviderId] || providerKey; + // #8958: honor the compatible-provider node prefix (as the synced/custom + // loops do) so an alias-backed entry publishes `prefix/model` instead of the + // raw provider-node UUID. Without the providerIdToPrefix lookup, `alias` fell + // through to `providerKey` (the UUID) and the dedupe below — which only checks + // `alias/model` and `providerKey/model`, both UUID-prefixed — never matched the + // correct `prefix/model` row already emitted, leaking a duplicate UUID entry + // even under MODELS_CATALOG_PREFIX_MODE=alias. + const nodePrefix = + providerIdToPrefix[providerKey] || providerIdToPrefix[canonicalProviderId]; + const alias = nodePrefix || providerIdToAlias[canonicalProviderId] || providerKey; if ( !activeAliases.has(alias) && !activeAliases.has(canonicalProviderId) && @@ -1374,6 +1427,7 @@ async function buildUnifiedModelsResponseCore( if ( includeCanonical && canonicalProviderId !== alias && + !nodePrefix && !isNoAuthProviderKey(canonicalProviderId) && prefixRoutesToProvider(canonicalProviderId, canonicalProviderId) ) { @@ -1489,6 +1543,7 @@ async function buildUnifiedModelsResponseCore( connections, prefixMode, aliasToProviderId, + hideNoThinkVariants: settings.hideNoThinkVariants === true, }); const getDefaultContextFallback = (model: any): number | undefined => { diff --git a/src/app/api/v1/models/catalogCache.ts b/src/app/api/v1/models/catalogCache.ts index 1cff2fa64f..8dd98a2a8e 100644 --- a/src/app/api/v1/models/catalogCache.ts +++ b/src/app/api/v1/models/catalogCache.ts @@ -80,13 +80,18 @@ const catalogInFlight = new Map(); let _catalogBuilderRuns = 0; -function buildCatalogCacheKey(request: Request): string { +function buildCatalogCacheKey( + request: Request, + catalogSettings?: { hideAutoCombos?: boolean; hideNoThinkVariants?: boolean } +): string { const url = new URL(request.url); const prefix = url.searchParams.get("prefix") || ""; const apiKey = extractApiKey(request) || ""; const isCodex = isCodexModelCatalogClient(request) ? "1" : "0"; const configuredOnly = url.searchParams.get("configuredOnly") === "true" ? "1" : "0"; - return `${prefix}|${isCodex}|${apiKey}|${configuredOnly}`; + const hideAuto = catalogSettings?.hideAutoCombos ? "1" : "0"; + const hideNoThink = catalogSettings?.hideNoThinkVariants ? "1" : "0"; + return `${prefix}|${isCodex}|${apiKey}|${configuredOnly}|${hideAuto}|${hideNoThink}`; } // Tracks the model-catalog cache version (src/lib/db/readCache.ts) as of the last @@ -223,12 +228,13 @@ function runBuilder( export async function resolveCachedCatalogResponse( request: Request, headerSources: { corsHeaders: Record; diagnosticHeaders: Record }, - buildPayload: (request: Request) => Promise + buildPayload: (request: Request) => Promise, + catalogSettings?: { hideAutoCombos?: boolean; hideNoThinkVariants?: boolean } ): Promise { const { corsHeaders, diagnosticHeaders } = headerSources; dropCatalogCacheIfStateChanged(); - const cacheKey = buildCatalogCacheKey(request); + const cacheKey = buildCatalogCacheKey(request, catalogSettings); const now = Date.now(); const cached = catalogCache.get(cacheKey); diff --git a/src/app/api/v1/models/catalogHelpers.ts b/src/app/api/v1/models/catalogHelpers.ts index 71acac3628..20ca9ffe55 100644 --- a/src/app/api/v1/models/catalogHelpers.ts +++ b/src/app/api/v1/models/catalogHelpers.ts @@ -27,6 +27,7 @@ export interface CustomModelEntry { export type ComboCatalogTarget = { modelStr?: string; provider?: string | null; + providerId?: string | null; }; export type ComboTargetCatalogMetadata = { diff --git a/src/app/api/v1/models/catalogProviderMaps.ts b/src/app/api/v1/models/catalogProviderMaps.ts index 6de91e6458..b70427d43e 100644 --- a/src/app/api/v1/models/catalogProviderMaps.ts +++ b/src/app/api/v1/models/catalogProviderMaps.ts @@ -1,6 +1,6 @@ import { PROVIDER_MODELS, PROVIDER_ID_TO_ALIAS } from "@/shared/constants/models"; import { AI_PROVIDERS } from "@/shared/constants/providers"; -import { parseModel } from "@omniroute/open-sse/services/model"; +import { parseModel, resolveCanonicalProviderModel } from "@omniroute/open-sse/services/model"; // Alias <-> providerId resolution maps for the unified model catalog. Extracted // verbatim from ./catalog.ts. `FALLBACK_ALIAS_TO_PROVIDER` is also consumed directly by @@ -77,6 +77,7 @@ export type AliasMaps = ReturnType; export type ProviderPrefixedTarget = { modelStr?: string; provider?: string | null; + providerId?: string | null; }; /** @@ -142,20 +143,30 @@ export function getComboTargetModelId( maps: AliasMaps, target: ProviderPrefixedTarget ): { providerId: string; modelId: string } | null { - const rawProvider = typeof target.provider === "string" ? target.provider.trim() : ""; + const rawProvider = + typeof target.providerId === "string" + ? target.providerId.trim() + : typeof target.provider === "string" + ? target.provider.trim() + : ""; const modelStr = typeof target.modelStr === "string" ? target.modelStr.trim() : ""; if (!rawProvider || rawProvider === "unknown" || !modelStr) return null; const providerId = resolveCanonicalProviderId(maps.aliasToProviderId, rawProvider); if (!providerId || providerId === "unknown") return null; + let modelId = modelStr; for (const prefix of getProviderPrefixes(maps, providerId, rawProvider)) { const prefixWithSlash = `${prefix}/`; if (modelStr.startsWith(prefixWithSlash)) { - const modelId = modelStr.slice(prefixWithSlash.length).trim(); - return modelId ? { providerId, modelId } : null; + modelId = modelStr.slice(prefixWithSlash.length).trim(); + break; } } - return { providerId, modelId: modelStr }; + if (!modelId) return null; + const canonical = resolveCanonicalProviderModel(providerId, modelId); + return canonical.provider && canonical.model + ? { providerId: canonical.provider, modelId: canonical.model } + : null; } diff --git a/src/app/api/v1/models/catalogResponse.ts b/src/app/api/v1/models/catalogResponse.ts index 35b92c5097..0cfbf6c37a 100644 --- a/src/app/api/v1/models/catalogResponse.ts +++ b/src/app/api/v1/models/catalogResponse.ts @@ -47,6 +47,7 @@ export function applyCatalogPostFilters( connections: any; prefixMode: string; aliasToProviderId: Record; + hideNoThinkVariants?: boolean; } ): Array> { let finalModels = models; @@ -71,10 +72,14 @@ export function applyCatalogPostFilters( // Advertise no-thinking gateway variants (Fase 8.1). Derived from the already // key-filtered list, so a variant only appears when its real model is permitted. - finalModels = appendNoThinkingVariants( - finalModels, - ctx.prefixMode === "canonical" ? ctx.aliasToProviderId : undefined - ); + // #9418: skip when hideNoThinkVariants is on — the ids are still routable when + // sent explicitly, just not advertised in the catalog. + if (!ctx.hideNoThinkVariants) { + finalModels = appendNoThinkingVariants( + finalModels, + ctx.prefixMode === "canonical" ? ctx.aliasToProviderId : undefined + ); + } // Advertise `claude/` discovery-mirror aliases so Claude Code's gateway // model discovery (which only lists `claude`/`anthropic`-prefixed ids) can see @@ -117,8 +122,7 @@ export function applyCatalogPostFilters( ctx.connections.filter((c) => c.provider === provider), modelId ), - gatewayHasConnection: (provider) => - ctx.connections.some((c) => c.provider === provider), + gatewayHasConnection: (provider) => ctx.connections.some((c) => c.provider === provider), canonicalOwnerHasConnection: (owner) => hasEligibleConnectionForModel( ctx.connections.filter((c) => c.provider === owner), diff --git a/src/app/api/v1/search/route.ts b/src/app/api/v1/search/route.ts index 95a43e93f5..7d22c00bae 100644 --- a/src/app/api/v1/search/route.ts +++ b/src/app/api/v1/search/route.ts @@ -300,6 +300,8 @@ async function postHandler(request: Request, context: unknown) { alternateProvider: alternateProviderId, alternateCredentials, log, + connectionId: credentials?.connectionId || undefined, + apiKeyId: policy.apiKeyInfo?.id || undefined, }); if (!result.success) { diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index 7019216ed6..057e6cad86 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -36,7 +36,7 @@ export default function LoginPage() { const data = await res.json(); if (data.nodeVersion) setNodeVersion(data.nodeVersion); if (data.nodeCompatible === false) setNodeCompatible(false); - if (data.requireLogin === false) { + if (data.authenticated === true || data.requireLogin === false) { router.push("/dashboard"); router.refresh(); return; diff --git a/src/domain/persistence/comboRepositories.ts b/src/domain/persistence/comboRepositories.ts new file mode 100644 index 0000000000..00750a318c --- /dev/null +++ b/src/domain/persistence/comboRepositories.ts @@ -0,0 +1,61 @@ +export type ComboRecord = Record; + +export interface ComboUpdateResult { + combo: ComboRecord; + previousName: string; + currentName: string; + modelsFieldProvided: boolean; +} + +export interface ComboReorderResult { + combos: ComboRecord[]; + rowsReordered: number; +} + +export interface ComboRepository { + list(limit?: number, offset?: number): Promise; + count(): Promise; + findById(id: string): Promise; + findByName(name: string): Promise; + findByNameInsensitive(name: string): Promise; + create(data: ComboRecord): Promise; + update(id: string, data: ComboRecord): Promise; + reorder(comboIds: string[]): Promise; + deleteById(id: string): Promise; +} + +export interface ModelComboMapping { + id: string; + pattern: string; + comboId: string; + comboName?: string; + priority: number; + enabled: boolean; + description: string; + createdAt: string; + updatedAt: string; +} + +export interface CreateModelComboMappingInput { + pattern: string; + comboId: string; + priority?: number; + enabled?: boolean; + description?: string; +} + +export type UpdateModelComboMappingInput = Partial; + +export interface ModelComboMappingPage { + items: ModelComboMapping[]; + total: number; +} + +export interface ModelComboMappingRepository { + list(options?: { limit?: number; offset?: number }): Promise; + findById(id: string): Promise; + create(data: CreateModelComboMappingInput): Promise; + update(id: string, data: UpdateModelComboMappingInput): Promise; + deleteById(id: string): Promise; + resolveForModel(model: string): Promise; +} diff --git a/src/domain/quotaCache.ts b/src/domain/quotaCache.ts index 6371cde370..89a925236d 100644 --- a/src/domain/quotaCache.ts +++ b/src/domain/quotaCache.ts @@ -10,6 +10,9 @@ * - Active accounts (quota > 0%): refetch every 5 minutes * - Exhausted accounts: refetch every 5 minutes (or immediately after resetAt passes) * + * @changes + * - [2026-07-24] [Composer] - Scope Antigravity per-model exhaustion to exact model + family weekly windows + * * @module domain/quotaCache */ @@ -236,6 +239,43 @@ export function __clearForTests() { getState().cache.clear(); } +function resolveAntigravityQuotaWindowsForModel( + quotaNames: string[], + requestedModel: string +): string[] { + const requestedFamily = getAntigravityQuotaFamily(requestedModel); + const cleanRequestedModel = requestedModel.replace(/^(antigravity|agy)\//, ""); + const bareModel = cleanRequestedModel.includes("/") + ? cleanRequestedModel.slice(cleanRequestedModel.lastIndexOf("/") + 1) + : cleanRequestedModel; + + if (requestedFamily === "other") { + return quotaNames.filter((windowName) => { + const bare = windowName.replace(/^(antigravity|agy)\//, ""); + return bare === bareModel || bare === cleanRequestedModel; + }); + } + + const familyAggregates = + requestedFamily === "gemini" + ? ["gemini_weekly"] + : requestedFamily === "claude" + ? ["claude_gpt_weekly"] + : []; + + const exactWindows = quotaNames.filter((windowName) => { + const bare = windowName.replace(/^(antigravity|agy)\//, ""); + return bare === bareModel; + }); + const aggregateWindows = familyAggregates.filter((key) => quotaNames.includes(key)); + const scoped = [...exactWindows, ...aggregateWindows]; + if (scoped.length > 0) return scoped; + + return quotaNames.filter( + (windowName) => getAntigravityQuotaFamily(windowName) === requestedFamily + ); +} + function isAntigravityQuotaExhausted( connectionId: string, entry: QuotaCacheEntry, @@ -244,18 +284,13 @@ function isAntigravityQuotaExhausted( if (!requestedModel) return entry.exhausted; const quotaNames = Object.keys(entry.quotas || {}); if (quotaNames.length === 0) return entry.exhausted; - const requestedFamily = getAntigravityQuotaFamily(requestedModel); - const cleanRequestedModel = requestedModel.replace(/^(antigravity|agy)\//, ""); - const matchingWindows = quotaNames.filter((windowName) => { - if (requestedFamily === "other") { - return windowName.replace(/^(antigravity|agy)\//, "") === cleanRequestedModel; - } - return getAntigravityQuotaFamily(windowName) === requestedFamily; - }); + const matchingWindows = resolveAntigravityQuotaWindowsForModel(quotaNames, requestedModel); return ( matchingWindows.length > 0 && matchingWindows.every( - (windowName) => getQuotaWindowStatus(connectionId, windowName, 100)?.reachedThreshold + (windowName) => + getQuotaWindowStatus(connectionId, windowName, DEFAULT_QUOTA_THRESHOLD_PERCENT) + ?.reachedThreshold ) ); } @@ -273,7 +308,9 @@ function isCodexQuotaExhausted( return ( scopedWindowNames.length > 0 && scopedWindowNames.every( - (windowName) => getQuotaWindowStatus(connectionId, windowName, 100)?.reachedThreshold + (windowName) => + getQuotaWindowStatus(connectionId, windowName, DEFAULT_QUOTA_THRESHOLD_PERCENT) + ?.reachedThreshold ) ); } @@ -512,7 +549,11 @@ export function getQuotaWindowStatus( usedPercentage, resetAt, // If reset time has already passed, avoid stale cached percentages blocking selection. - reachedThreshold: windowExpired ? false : usedPercentage >= thresholdPercent, + reachedThreshold: windowExpired + ? false + : remainingPercentage <= 0 + ? true + : usedPercentage >= thresholdPercent, }; } diff --git a/src/i18n/messages/ar.json b/src/i18n/messages/ar.json index a1c621e4be..3b5e057b25 100644 --- a/src/i18n/messages/ar.json +++ b/src/i18n/messages/ar.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "مرئي دائمًا", "groupSeparatorLabel": "فاصل", "discovery": "اكتشاف", - "discoverySubtitle": "فحص المزودين للوصول المجاني" + "discoverySubtitle": "فحص المزودين للوصول المجاني", + "radar": "كتالوج الرادار", + "radarSubtitle": "كتالوج نموذج مجاني معزز بالمجتمع" }, "webhooks": { "title": "خطافات الويب", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "رابط شريك", "dismissAriaLabel": "تجاهل" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "كتالوج الرادار", + "subtitle": "كتالوج نموذج مجاني معزز بذكاء المجتمع", + "loading": "جارٍ تحميل الكتالوج...", + "errorLoading": "فشل في تحميل كتالوج الرادار", + "emptyState": "لا توجد بيانات كتالوج بعد. قم بالمزامنة لتنزيل آخر تغذية.", + "syncNow": "مزامنة الآن", + "syncing": "جارٍ المزامنة...", + "syncCta": "مزامنة الآن", + "syncFailed": "فشل المزامنة", + "flagDisabled": "الرادار معطل", + "activationFailed": "فشل التفعيل", + "feedVersion": "إصدار التغذية", + "feedTier": "المستوى", + "feedFetched": "آخر جلب", + "tierLive": "مباشر (في الوقت الحقيقي)", + "tierCommunity": "مجتمع (تأخير 30 يومًا)", + "activateTitle": "تفعيل الرادار", + "activateDescription": "يعزز الرادار كتالوج النموذج المجاني بذكاء مستمد من المجتمع - تحديث توافر النماذج، الحصص، وأدلة الإعداد.", + "privacyNoUpload": "لا يوجد شيء تم تحميله - تظل بياناتك محلية", + "privacyOnlySigned": "يتم تنزيل بيانات التعريف الموقعة تشفيرياً فقط", + "privacyLocalOnly": "تتم جميع المعالجة على مثيل OmniRoute الخاص بك", + "activateButton": "تفعيل", + "activating": "جارٍ التفعيل...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "المزود", + "colModel": "النموذج", + "colQuota": "الحصة", + "colContext": "السياق", + "colCapabilities": "القدرات", + "colTos": "مخاطر شروط الخدمة", + "newBadge": "جديد", + "setupGuide": "دليل الإعداد", + "disabledByFeed": "معطل بواسطة تغذية الرادار", + "capTools": "الأدوات", + "capVision": "الرؤية", + "capThinking": "التفكير", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "إعداد المزود", + "setupTitle": "الإعداد: {provider}", + "setupSubtitle": "اتبع الخطوات أدناه لتكوين هذا المزود", + "loading": "جارٍ التحميل...", + "loadFailed": "فشل في تحميل بيانات الإعداد", + "flagDisabled": "الرادار معطل", + "providerNotFound": "المزود \"{provider}\" غير موجود في الكتالوج", + "noProvider": "لم يتم تحديد مزود. عد إلى الكتالوج واختر مزودًا.", + "backToCatalog": "العودة إلى الكتالوج", + "providerConfigured": "تم تكوين المزود وهو جاهز", + "getApiKey": "احصل على مفتاح API الخاص بك", + "setupSteps": "خطوات الإعداد", + "noGuide": "لا يوجد دليل إعداد متاح لهذا المزود.", + "visitDocs": "زيارة وثائق المزود", + "testConnection": "اختبار الاتصال", + "testDescription": "تحقق من أن اتصالك يعمل بشكل صحيح.", + "testButton": "اختبار الاتصال", + "testing": "جارٍ الاختبار...", + "testSuccess": "الاتصال ناجح!", + "testFailed": "فشل اختبار الاتصال", + "addConnection": "إضافة اتصال", + "addConnectionDescription": "لا تملك اتصالاً بعد؟ أضف واحدًا في لوحة معلومات المزودين.", + "addConnectionLink": "انتقل إلى المزودين →" + } } diff --git a/src/i18n/messages/az.json b/src/i18n/messages/az.json index a996aaf2a5..88df76e148 100644 --- a/src/i18n/messages/az.json +++ b/src/i18n/messages/az.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Həmişə görünən", "groupSeparatorLabel": "Ayırıcı", "discovery": "Kəşf", - "discoverySubtitle": "Pulsuz giriş üçün provayderləri skan edin" + "discoverySubtitle": "Pulsuz giriş üçün provayderləri skan edin", + "radar": "Radar Kataloqu", + "radarSubtitle": "İcma ilə zənginləşdirilmiş pulsuz model kataloqu" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Tərəfdaş linki", "dismissAriaLabel": "Bağla" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Kataloqu", + "subtitle": "İcma intellekti ilə zənginləşdirilmiş pulsuz model kataloqu", + "loading": "Kataloq yüklənir...", + "errorLoading": "Radar kataloqunu yükləmək mümkün olmadı", + "emptyState": "Hələ kataloq məlumatı yoxdur. Ən son axını yükləmək üçün sinxronizasiya edin.", + "syncNow": "İndi sinxronizasiya et", + "syncing": "Sinxronizasiya edilir...", + "syncCta": "İndi sinxronizasiya et", + "syncFailed": "Sinxronizasiya uğursuz oldu", + "flagDisabled": "Radar deaktivdir", + "activationFailed": "Aktivləşdirmə uğursuz oldu", + "feedVersion": "Axın versiyası", + "feedTier": "Səviyyə", + "feedFetched": "Son alınan", + "tierLive": "Canlı (real vaxt)", + "tierCommunity": "İcma (30 günlük gecikmə)", + "activateTitle": "Radarı aktivləşdir", + "activateDescription": "Radar pulsuz model kataloqunu icma mənbəli intellektlə zənginləşdirir — yenilənmiş model mövcudluğu, kvotalar və quraşdırma bələdçiləri.", + "privacyNoUpload": "Heç nə yüklənməyib — məlumatlarınız yerli qalır", + "privacyOnlySigned": "Yalnız kriptografik imzalanmış metadata yüklənir", + "privacyLocalOnly": "Bütün emal sizin OmniRoute instansiyanızda baş verir", + "activateButton": "Aktivləşdir", + "activating": "Aktivləşdirilir...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Təchizatçı", + "colModel": "Model", + "colQuota": "Kvota", + "colContext": "Kontekst", + "colCapabilities": "İmkanlar", + "colTos": "ToS Riski", + "newBadge": "yeni", + "setupGuide": "Quraşdırma bələdçisi", + "disabledByFeed": "Radar axını tərəfindən deaktiv edilmişdir", + "capTools": "Alətlər", + "capVision": "Görmə", + "capThinking": "Düşünmə", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Təchizatçı Quraşdırması", + "setupTitle": "Quraşdırma: {provider}", + "setupSubtitle": "Bu təchizatçını konfiqurasiya etmək üçün aşağıdakı addımları izləyin", + "loading": "Yüklənir...", + "loadFailed": "Quraşdırma məlumatını yükləmək mümkün olmadı", + "flagDisabled": "Radar deaktivdir", + "providerNotFound": "Kataloqda \"{provider}\" təchizatçısı tapılmadı", + "noProvider": "Heç bir təchizatçı göstərilməyib. Kataloqa qayıdın və bir təchizatçı seçin.", + "backToCatalog": "Kataloqa geri", + "providerConfigured": "Təchizatçı konfiqurasiya edilib və hazırdır", + "getApiKey": "API açarınızı alın", + "setupSteps": "Quraşdırma addımları", + "noGuide": "Bu təchizatçı üçün quraşdırma bələdçisi mövcud deyil.", + "visitDocs": "Təchizatçı sənədlərinə baxın", + "testConnection": "Bağlantını test et", + "testDescription": "Bağlantınızın düzgün işlədiyini təsdiqləyin.", + "testButton": "Bağlantını test et", + "testing": "Test edilir...", + "testSuccess": "Bağlantı uğurlu!", + "testFailed": "Bağlantı testi uğursuz oldu", + "addConnection": "Bağlantı əlavə et", + "addConnectionDescription": "Hələ bağlantınız yoxdur? Təchizatçılar panelində birini əlavə edin.", + "addConnectionLink": "Təchizatçılara keç →" + } } diff --git a/src/i18n/messages/bg.json b/src/i18n/messages/bg.json index b8f2157595..39f618f59a 100644 --- a/src/i18n/messages/bg.json +++ b/src/i18n/messages/bg.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Винаги видим", "groupSeparatorLabel": "Разделител", "discovery": "Откриване", - "discoverySubtitle": "Сканиране на доставчици за безплатен достъп" + "discoverySubtitle": "Сканиране на доставчици за безплатен достъп", + "radar": "Каталог на радара", + "radarSubtitle": "Безплатен модел каталог, обогатен от общността" }, "webhooks": { "title": "Уеб кукички", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Партньорска връзка", "dismissAriaLabel": "Затваряне" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Каталог на радара", + "subtitle": "Безплатен модел каталог, обогатен с информация от общността", + "loading": "Зареждане на каталога...", + "errorLoading": "Неуспешно зареждане на каталога на радара", + "emptyState": "Все още няма данни в каталога. Синхронизирайте, за да изтеглите последния фийд.", + "syncNow": "Синхронизирайте сега", + "syncing": "Синхронизиране...", + "syncCta": "Синхронизирайте сега", + "syncFailed": "Синхронизацията не успя", + "flagDisabled": "Радарът е деактивиран", + "activationFailed": "Активирането не успя", + "feedVersion": "Версия на фийда", + "feedTier": "Ниво", + "feedFetched": "Последно извлечено", + "tierLive": "На живо (в реално време)", + "tierCommunity": "Общност (30-дневно закъснение)", + "activateTitle": "Активирайте радара", + "activateDescription": "Радарът обогатява безплатния модел каталог с информация от общността — актуализирана наличност на модели, квоти и ръководства за настройка.", + "privacyNoUpload": "Нищо не е качено — вашите данни остават локални", + "privacyOnlySigned": "Изтеглят се само криптографски подписани метаданни", + "privacyLocalOnly": "Всички обработки се извършват на вашия OmniRoute инстанс", + "activateButton": "Активирайте", + "activating": "Активиране...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Доставчик", + "colModel": "Модел", + "colQuota": "Квота", + "colContext": "Контекст", + "colCapabilities": "Възможности", + "colTos": "Риск от ToS", + "newBadge": "нов", + "setupGuide": "Ръководство за настройка", + "disabledByFeed": "Деактивирано от фийда на радара", + "capTools": "Инструменти", + "capVision": "Визия", + "capThinking": "Мислене", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Настройка на доставчика", + "setupTitle": "Настройка: {provider}", + "setupSubtitle": "Следвайте стъпките по-долу, за да конфигурирате този доставчик", + "loading": "Зареждане...", + "loadFailed": "Неуспешно зареждане на данни за настройка", + "flagDisabled": "Радарът е деактивиран", + "providerNotFound": "Доставчикът \"{provider}\" не е намерен в каталога", + "noProvider": "Не е указан доставчик. Върнете се в каталога и изберете доставчик.", + "backToCatalog": "Назад към каталога", + "providerConfigured": "Доставчикът е конфигуриран и готов", + "getApiKey": "Вземете вашия API ключ", + "setupSteps": "Стъпки за настройка", + "noGuide": "Няма налично ръководство за настройка за този доставчик.", + "visitDocs": "Посетете документацията на доставчика", + "testConnection": "Тест на връзката", + "testDescription": "Проверете дали вашата връзка работи правилно.", + "testButton": "Тест на връзката", + "testing": "Тестуване...", + "testSuccess": "Връзката е успешна!", + "testFailed": "Тестът на връзката не успя", + "addConnection": "Добавете връзка", + "addConnectionDescription": "Все още нямате връзка? Добавете една в таблото на доставчиците.", + "addConnectionLink": "Отидете на доставчиците →" + } } diff --git a/src/i18n/messages/bn.json b/src/i18n/messages/bn.json index f8875ad987..530aeb48bd 100644 --- a/src/i18n/messages/bn.json +++ b/src/i18n/messages/bn.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "সর্বদা দৃশ্যমান", "groupSeparatorLabel": "বিভাজক", "discovery": "ডিসকভারি", - "discoverySubtitle": "ফ্রি অ্যাক্সেসের জন্য প্রোভাইডার স্ক্যান করুন" + "discoverySubtitle": "ফ্রি অ্যাক্সেসের জন্য প্রোভাইডার স্ক্যান করুন", + "radar": "রাডার ক্যাটালগ", + "radarSubtitle": "কমিউনিটি-সমৃদ্ধ ফ্রি মডেল ক্যাটালগ" }, "webhooks": { "title": "ওয়েবহুক", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "পার্টনার লিঙ্ক", "dismissAriaLabel": "খারিজ করুন" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "রাডার ক্যাটালগ", + "subtitle": "কমিউনিটি বুদ্ধিমত্তা সমৃদ্ধ ফ্রি মডেল ক্যাটালগ", + "loading": "ক্যাটালগ লোড হচ্ছে...", + "errorLoading": "রাডার ক্যাটালগ লোড করতে ব্যর্থ", + "emptyState": "এখনও কোনও ক্যাটালগ ডেটা নেই। সর্বশেষ ফিড ডাউনলোড করতে সিঙ্ক করুন।", + "syncNow": "এখন সিঙ্ক করুন", + "syncing": "সিঙ্ক হচ্ছে...", + "syncCta": "এখন সিঙ্ক করুন", + "syncFailed": "সিঙ্ক ব্যর্থ", + "flagDisabled": "রাডার নিষ্ক্রিয়", + "activationFailed": "সক্রিয়করণ ব্যর্থ", + "feedVersion": "ফিড সংস্করণ", + "feedTier": "স্তর", + "feedFetched": "সর্বশেষ প্রাপ্ত", + "tierLive": "লাইভ (রিয়েল-টাইম)", + "tierCommunity": "কমিউনিটি (30-দিনের বিলম্ব)", + "activateTitle": "রাডার সক্রিয় করুন", + "activateDescription": "রাডার ফ্রি মডেল ক্যাটালগকে কমিউনিটি-সূত্রিত বুদ্ধিমত্তা দ্বারা সমৃদ্ধ করে — আপডেটেড মডেল উপলব্ধতা, কোটা, এবং সেটআপ গাইড।", + "privacyNoUpload": "কিছু আপলোড করা হয়নি — আপনার ডেটা স্থানীয় থাকে", + "privacyOnlySigned": "শুধুমাত্র ক্রিপ্টোগ্রাফিকভাবে স্বাক্ষরিত মেটাডেটা ডাউনলোড করা হয়", + "privacyLocalOnly": "সমস্ত প্রক্রিয়াকরণ আপনার OmniRoute ইনস্ট্যান্সে ঘটে", + "activateButton": "সক্রিয় করুন", + "activating": "সক্রিয় হচ্ছে...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "প্রদানকারী", + "colModel": "মডেল", + "colQuota": "কোটা", + "colContext": "প্রসঙ্গ", + "colCapabilities": "সক্ষমতা", + "colTos": "ToS ঝুঁকি", + "newBadge": "নতুন", + "setupGuide": "সেটআপ গাইড", + "disabledByFeed": "রাডার ফিড দ্বারা নিষ্ক্রিয়", + "capTools": "টুলস", + "capVision": "ভিশন", + "capThinking": "চিন্তা", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "প্রদানকারী সেটআপ", + "setupTitle": "সেটআপ: {provider}", + "setupSubtitle": "এই প্রদানকারী কনফিগার করতে নিচের পদক্ষেপগুলি অনুসরণ করুন", + "loading": "লোড হচ্ছে...", + "loadFailed": "সেটআপ ডেটা লোড করতে ব্যর্থ", + "flagDisabled": "রাডার নিষ্ক্রিয়", + "providerNotFound": "ক্যাটালগে প্রদানকারী \"{provider}\" পাওয়া যায়নি", + "noProvider": "কোনও প্রদানকারী নির্দিষ্ট করা হয়নি। ক্যাটালগে ফিরে যান এবং একটি প্রদানকারী নির্বাচন করুন।", + "backToCatalog": "ক্যাটালগে ফিরে যান", + "providerConfigured": "প্রদানকারী কনফিগার করা হয়েছে এবং প্রস্তুত", + "getApiKey": "আপনার API কী পান", + "setupSteps": "সেটআপ পদক্ষেপ", + "noGuide": "এই প্রদানকারীর জন্য কোনও সেটআপ গাইড উপলব্ধ নেই।", + "visitDocs": "প্রদানকারী ডকস পরিদর্শন করুন", + "testConnection": "সংযোগ পরীক্ষা করুন", + "testDescription": "আপনার সংযোগ সঠিকভাবে কাজ করছে কিনা তা যাচাই করুন।", + "testButton": "সংযোগ পরীক্ষা করুন", + "testing": "পরীক্ষা হচ্ছে...", + "testSuccess": "সংযোগ সফল!", + "testFailed": "সংযোগ পরীক্ষায় ব্যর্থ", + "addConnection": "সংযোগ যোগ করুন", + "addConnectionDescription": "এখনও একটি সংযোগ নেই? প্রদানকারীদের ড্যাশবোর্ডে একটি যোগ করুন।", + "addConnectionLink": "প্রদানকারীদের কাছে যান →" + } } diff --git a/src/i18n/messages/cs.json b/src/i18n/messages/cs.json index 0ffa503758..2d3a48084d 100644 --- a/src/i18n/messages/cs.json +++ b/src/i18n/messages/cs.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Vždy viditelné", "groupSeparatorLabel": "Oddělovač", "discovery": "Objevování", - "discoverySubtitle": "Skenovat poskytovatele pro bezplatný přístup" + "discoverySubtitle": "Skenovat poskytovatele pro bezplatný přístup", + "radar": "Radar katalog", + "radarSubtitle": "Bezplatný modelový katalog obohacený komunitou" }, "webhooks": { "title": "Webhooky", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Partnerský odkaz", "dismissAriaLabel": "Zavřít" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar katalog", + "subtitle": "Bezplatný modelový katalog obohacený komunitními informacemi", + "loading": "Načítání katalogu...", + "errorLoading": "Nepodařilo se načíst Radar katalog", + "emptyState": "Zatím nejsou k dispozici žádná data katalogu. Synchronizujte pro stažení nejnovějšího zdroje.", + "syncNow": "Synchronizovat nyní", + "syncing": "Synchronizuji...", + "syncCta": "Synchronizovat nyní", + "syncFailed": "Synchronizace selhala", + "flagDisabled": "Radar je deaktivován", + "activationFailed": "Aktivace selhala", + "feedVersion": "Verze zdroje", + "feedTier": "Úroveň", + "feedFetched": "Naposledy načteno", + "tierLive": "Živě (v reálném čase)", + "tierCommunity": "Komunita (30denní zpoždění)", + "activateTitle": "Aktivovat Radar", + "activateDescription": "Radar obohacuje bezplatný modelový katalog o informace z komunity — aktualizovaná dostupnost modelů, kvóty a průvodce nastavením.", + "privacyNoUpload": "Nic není nahráno — vaše data zůstávají lokální", + "privacyOnlySigned": "Stahována jsou pouze kryptograficky podepsaná metadata", + "privacyLocalOnly": "Veškeré zpracování probíhá na vaší instanci OmniRoute", + "activateButton": "Aktivovat", + "activating": "Aktivace...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Poskytovatel", + "colModel": "Model", + "colQuota": "Kvóta", + "colContext": "Kontext", + "colCapabilities": "Schopnosti", + "colTos": "Riziko ToS", + "newBadge": "nové", + "setupGuide": "Průvodce nastavením", + "disabledByFeed": "Zakázáno zdrojem Radar", + "capTools": "Nástroje", + "capVision": "Vize", + "capThinking": "Přemýšlení", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Nastavení poskytovatele", + "setupTitle": "Nastavení: {provider}", + "setupSubtitle": "Postupujte podle níže uvedených kroků pro konfiguraci tohoto poskytovatele", + "loading": "Načítání...", + "loadFailed": "Nepodařilo se načíst data nastavení", + "flagDisabled": "Radar je deaktivován", + "providerNotFound": "Poskytovatel \"{provider}\" nebyl nalezen v katalogu", + "noProvider": "Nebyl specifikován žádný poskytovatel. Vraťte se do katalogu a vyberte poskytovatele.", + "backToCatalog": "Zpět do katalogu", + "providerConfigured": "Poskytovatel je nakonfigurován a připraven", + "getApiKey": "Získejte svůj API klíč", + "setupSteps": "Krok nastavení", + "noGuide": "Pro tohoto poskytovatele není k dispozici žádný průvodce nastavením.", + "visitDocs": "Navštivte dokumentaci poskytovatele", + "testConnection": "Otestovat připojení", + "testDescription": "Ověřte, že vaše připojení funguje správně.", + "testButton": "Otestovat připojení", + "testing": "Testuji...", + "testSuccess": "Připojení úspěšné!", + "testFailed": "Test připojení selhal", + "addConnection": "Přidat připojení", + "addConnectionDescription": "Ještě nemáte připojení? Přidejte jedno v řídicím panelu poskytovatelů.", + "addConnectionLink": "Přejít na poskytovatele →" + } } diff --git a/src/i18n/messages/da.json b/src/i18n/messages/da.json index ba191bfdbd..1916bd4fbf 100644 --- a/src/i18n/messages/da.json +++ b/src/i18n/messages/da.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Altid synlig", "groupSeparatorLabel": "Separator", "discovery": "Opdagelse", - "discoverySubtitle": "Scan udbydere for gratis adgang" + "discoverySubtitle": "Scan udbydere for gratis adgang", + "radar": "Radar Katalog", + "radarSubtitle": "Samfundsberiget gratis modelkatalog" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Partnerlink", "dismissAriaLabel": "Afvis" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Katalog", + "subtitle": "Gratis modelkatalog beriget med samfundsintelligens", + "loading": "Indlæser katalog...", + "errorLoading": "Mislykkedes at indlæse Radar katalog", + "emptyState": "Ingen katalogdata endnu. Synkroniser for at downloade den nyeste feed.", + "syncNow": "Synkroniser nu", + "syncing": "Synkroniserer...", + "syncCta": "Synkroniser nu", + "syncFailed": "Synkronisering mislykkedes", + "flagDisabled": "Radar er deaktiveret", + "activationFailed": "Aktivering mislykkedes", + "feedVersion": "Feed version", + "feedTier": "Niveau", + "feedFetched": "Sidst hentet", + "tierLive": "Live (real-time)", + "tierCommunity": "Samfund (30-dages forsinkelse)", + "activateTitle": "Aktiver Radar", + "activateDescription": "Radar beriger det gratis modelkatalog med samfundsbaseret intelligens — opdateret modeltilgængelighed, kvoter og opsætningsvejledninger.", + "privacyNoUpload": "Intet er uploadet — dine data forbliver lokale", + "privacyOnlySigned": "Kun kryptografisk signerede metadata downloades", + "privacyLocalOnly": "Al behandling sker på din OmniRoute instans", + "activateButton": "Aktiver", + "activating": "Aktiverer...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Udbyder", + "colModel": "Model", + "colQuota": "Kvote", + "colContext": "Kontekst", + "colCapabilities": "Funktioner", + "colTos": "ToS Risiko", + "newBadge": "ny", + "setupGuide": "Opsætningsvejledning", + "disabledByFeed": "Deaktiveret af Radar feed", + "capTools": "Værktøjer", + "capVision": "Vision", + "capThinking": "Tænkning", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Udbyder Opsætning", + "setupTitle": "Opsætning: {provider}", + "setupSubtitle": "Følg trinene nedenfor for at konfigurere denne udbyder", + "loading": "Indlæser...", + "loadFailed": "Mislykkedes at indlæse opsætningsdata", + "flagDisabled": "Radar er deaktiveret", + "providerNotFound": "Udbyder \"{provider}\" ikke fundet i katalog", + "noProvider": "Ingen udbyder angivet. Gå tilbage til kataloget og vælg en udbyder.", + "backToCatalog": "Tilbage til katalog", + "providerConfigured": "Udbyder er konfigureret og klar", + "getApiKey": "Få din API-nøgle", + "setupSteps": "Opsætningstrin", + "noGuide": "Ingen opsætningsvejledning tilgængelig for denne udbyder.", + "visitDocs": "Besøg udbyderdokumentation", + "testConnection": "Test forbindelse", + "testDescription": "Bekræft, at din forbindelse fungerer korrekt.", + "testButton": "Test forbindelse", + "testing": "Tester...", + "testSuccess": "Forbindelse succesfuld!", + "testFailed": "Forbindelsestest mislykkedes", + "addConnection": "Tilføj forbindelse", + "addConnectionDescription": "Har du ikke en forbindelse endnu? Tilføj en i udbyderdashboardet.", + "addConnectionLink": "Gå til udbydere →" + } } diff --git a/src/i18n/messages/de.json b/src/i18n/messages/de.json index 9214b42a41..8a50bbfa89 100644 --- a/src/i18n/messages/de.json +++ b/src/i18n/messages/de.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Immer sichtbar", "groupSeparatorLabel": "Trennlinie", "discovery": "Discovery", - "discoverySubtitle": "Anbieter auf kostenlosen Zugang scannen" + "discoverySubtitle": "Anbieter auf kostenlosen Zugang scannen", + "radar": "Radar-Katalog", + "radarSubtitle": "Kostenloser Modellkatalog, angereichert mit Community-Intelligenz" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Partnerlink", "dismissAriaLabel": "Schließen" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar-Katalog", + "subtitle": "Kostenloser Modellkatalog, angereichert mit Community-Intelligenz", + "loading": "Katalog wird geladen...", + "errorLoading": "Fehler beim Laden des Radar-Katalogs", + "emptyState": "Noch keine Katalogdaten. Synchronisieren, um den neuesten Feed herunterzuladen.", + "syncNow": "Jetzt synchronisieren", + "syncing": "Synchronisiere...", + "syncCta": "Jetzt synchronisieren", + "syncFailed": "Synchronisierung fehlgeschlagen", + "flagDisabled": "Radar ist deaktiviert", + "activationFailed": "Aktivierung fehlgeschlagen", + "feedVersion": "Feed-Version", + "feedTier": "Stufe", + "feedFetched": "Zuletzt abgerufen", + "tierLive": "Live (Echtzeit)", + "tierCommunity": "Community (30 Tage Verzögerung)", + "activateTitle": "Radar aktivieren", + "activateDescription": "Radar bereichert den kostenlosen Modellkatalog mit community-basierten Informationen – aktualisierte Modellverfügbarkeit, Quoten und Einrichtungsanleitungen.", + "privacyNoUpload": "Nichts ist hochgeladen – Ihre Daten bleiben lokal", + "privacyOnlySigned": "Nur kryptografisch signierte Metadaten werden heruntergeladen", + "privacyLocalOnly": "Alle Verarbeitungen erfolgen auf Ihrer OmniRoute-Instanz", + "activateButton": "Aktivieren", + "activating": "Aktivierung...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Anbieter", + "colModel": "Modell", + "colQuota": "Quote", + "colContext": "Kontext", + "colCapabilities": "Fähigkeiten", + "colTos": "ToS-Risiko", + "newBadge": "neu", + "setupGuide": "Einrichtungsanleitung", + "disabledByFeed": "Durch den Radar-Feed deaktiviert", + "capTools": "Werkzeuge", + "capVision": "Vision", + "capThinking": "Denken", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Anbieter-Einrichtung", + "setupTitle": "Einrichtung: {provider}", + "setupSubtitle": "Befolgen Sie die folgenden Schritte, um diesen Anbieter zu konfigurieren", + "loading": "Wird geladen...", + "loadFailed": "Fehler beim Laden der Einrichtungsdaten", + "flagDisabled": "Radar ist deaktiviert", + "providerNotFound": "Anbieter \"{provider}\" nicht im Katalog gefunden", + "noProvider": "Kein Anbieter angegeben. Kehren Sie zum Katalog zurück und wählen Sie einen Anbieter aus.", + "backToCatalog": "Zurück zum Katalog", + "providerConfigured": "Anbieter ist konfiguriert und bereit", + "getApiKey": "Holen Sie sich Ihren API-Schlüssel", + "setupSteps": "Einrichtungsschritte", + "noGuide": "Keine Einrichtungsanleitung für diesen Anbieter verfügbar.", + "visitDocs": "Anbieter-Dokumentation besuchen", + "testConnection": "Verbindung testen", + "testDescription": "Überprüfen Sie, ob Ihre Verbindung korrekt funktioniert.", + "testButton": "Verbindung testen", + "testing": "Testen...", + "testSuccess": "Verbindung erfolgreich!", + "testFailed": "Verbindungstest fehlgeschlagen", + "addConnection": "Verbindung hinzufügen", + "addConnectionDescription": "Haben Sie noch keine Verbindung? Fügen Sie eine im Anbieter-Dashboard hinzu.", + "addConnectionLink": "Zu den Anbietern →" + } } diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index ae7e5099f5..9c0a9da682 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -1094,6 +1094,8 @@ "costsFreeTiersSubtitle": "Monthly free-token allowances", "freeProviderRankings": "Free Provider Rankings", "freeProviderRankingsSubtitle": "Best free providers ranked by model ELO scores", + "radar": "Radar Catalog", + "radarSubtitle": "Community-enriched free model catalog", "costsQuotaShare": "Quota Sharing", "costsPricing": "Pricing", "logsProxy": "Proxy Logs", @@ -5069,6 +5071,8 @@ "noNewModelsAddedExisting": "No new models were added (all already exist).", "importDoneCount": "✓ Done! {count, plural, one {# model imported.} other {# models imported.}}", "unexpectedErrorOccurred": "An unexpected error occurred", + "getApiKey": "Get API key", + "getApiKeyDescription": "Register or sign up for an API key", "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", "messagesPath": "messages", "responsesPath": "responses", @@ -5485,6 +5489,13 @@ "newApiUserIdLabel": "New-API User ID", "newApiUserIdPlaceholder": "e.g. 12345", "newApiUserIdHint": "AgentRouter New-Api-User header value, used together with the console API key to fetch quota balance.", + "newApiAggregatorToggleLabel": "Aggregator Gateway", + "newApiAggregatorToggleHint": "Enable balance detection for New-API / One-API / Sub2API aggregator nodes. The dashboard will show the balance badge and quota-preflight routing will skip exhausted accounts.", + "newApiAggregatorConsoleApiKeyHint": "System Access Token for the aggregator's /api/user/self endpoint. Not the routing API key.", + "newApiAggregatorUserIdHint": "New-Api-User header value used to fetch the aggregator user's quota balance.", + "newApiAggregatorQuotaPerUnitLabel": "Quota Per Unit", + "newApiAggregatorQuotaPerUnitHint": "New-API credit units per $1 (default: 500000). Override if your aggregator uses a different rate.", + "featureFlagNewApiAggregatorBalanceDescription": "Enable balance detection for New-API / One-API / Sub2API aggregator compatible nodes", "cpaModeDisabledTitle": "CLIProxyAPI compatibility mode is disabled", "cpaModeEnabledTitle": "CLIProxyAPI compatibility mode is enabled", "customUserAgentHint": "Custom User Agent Hint", @@ -5600,6 +5611,7 @@ "tagGroupPlaceholder": "Tag Group Placeholder", "testModel": "Test Model", "testingModel": "Testing Model", + "modelTestQuotaTooltip": "Quota exhausted — resets tomorrow or needs a top-up", "toggleOffShort": "Off", "toggleOnShort": "On", "tokenExpiredBadge": "Token Expired Badge", @@ -11527,7 +11539,10 @@ "noSavedProxiesError": "No saved proxies found. Add proxies in Settings → Proxy first.", "updateProviderFailed": "Failed to update provider", "providerEnabled": "{provider} enabled", - "providerDisabled": "{provider} disabled" + "providerDisabled": "{provider} disabled", + "providerAdded": "{provider} added", + "add": "Add", + "manualApiKey": "Use a manual API key" }, "gamification": { "leaderboardScopes": { @@ -12223,5 +12238,82 @@ "partnerLinkNote": "Partner link", "dismissAriaLabel": "Dismiss" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Catalog", + "subtitle": "Free model catalog enriched with community intelligence", + "loading": "Loading catalog...", + "errorLoading": "Failed to load Radar catalog", + "emptyState": "No catalog data yet. Sync to download the latest feed.", + "syncNow": "Sync now", + "syncing": "Syncing...", + "syncCta": "Sync now", + "syncFailed": "Sync failed", + "flagDisabled": "Radar is disabled", + "activationFailed": "Activation failed", + "feedVersion": "Feed version", + "feedTier": "Tier", + "feedFetched": "Last fetched", + "tierLive": "Live (real-time)", + "tierCommunity": "Community (30-day delay)", + "activateTitle": "Activate Radar", + "activateDescription": "Radar enriches the free model catalog with community-sourced intelligence — updated model availability, quotas, and setup guides.", + "privacyNoUpload": "Nothing is uploaded — your data stays local", + "privacyOnlySigned": "Only cryptographically signed metadata is downloaded", + "privacyLocalOnly": "All processing happens on your OmniRoute instance", + "activateButton": "Activate", + "activating": "Activating...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Provider", + "colModel": "Model", + "colQuota": "Quota", + "colContext": "Context", + "colCapabilities": "Capabilities", + "colTos": "ToS Risk", + "newBadge": "new", + "setupGuide": "Setup guide", + "disabledByFeed": "Disabled by Radar feed", + "capTools": "Tools", + "capVision": "Vision", + "capThinking": "Thinking", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Provider Setup", + "setupTitle": "Setup: {provider}", + "setupSubtitle": "Follow the steps below to configure this provider", + "loading": "Loading...", + "loadFailed": "Failed to load setup data", + "flagDisabled": "Radar is disabled", + "providerNotFound": "Provider \"{provider}\" not found in catalog", + "noProvider": "No provider specified. Return to the catalog and select a provider.", + "backToCatalog": "Back to catalog", + "providerConfigured": "Provider is configured and ready", + "getApiKey": "Get your API key", + "setupSteps": "Setup steps", + "noGuide": "No setup guide available for this provider.", + "visitDocs": "Visit provider docs", + "testConnection": "Test connection", + "testDescription": "Verify that your connection is working correctly.", + "testButton": "Test connection", + "testing": "Testing...", + "testSuccess": "Connection successful!", + "testFailed": "Connection test failed", + "addConnection": "Add connection", + "addConnectionDescription": "Don't have a connection yet? Add one in the providers dashboard.", + "addConnectionLink": "Go to providers →" + } } diff --git a/src/i18n/messages/es.json b/src/i18n/messages/es.json index 3f3ad8854c..1d3e1829d3 100644 --- a/src/i18n/messages/es.json +++ b/src/i18n/messages/es.json @@ -4,19 +4,19 @@ "cancel": "Cancelar", "delete": "Eliminar", "loading": "Cargando...", - "selectOption": "Select an option", + "selectOption": "Seleccionar una opción", "error": "Se produjo un error", "success": "Éxito", "confirm": "¿Estás seguro?", "refresh": "Actualizar", "close": "Cerrar", - "previousPage": "Previous page", - "nextPage": "Next page", - "capsLockOn": "Caps Lock is on", - "dismissNotification": "Dismiss notification", - "toggleColumns": "Toggle columns", - "confirmTitle": "Confirm", - "confirmAction": "Confirm", + "previousPage": "Página anterior", + "nextPage": "Página siguiente", + "capsLockOn": "Bloqueo de mayúsculas activado", + "dismissNotification": "Descartar notificación", + "toggleColumns": "Alternar columnas", + "confirmTitle": "Confirmar", + "confirmAction": "Confirmar", "add": "Añadir", "edit": "Editar", "search": "Buscar", @@ -31,9 +31,9 @@ "active": "Activo", "inactive": "Inactivo", "noData": "No hay datos disponibles", - "nothingHere": "Nothing here yet", + "nothingHere": "Aún no hay nada aquí", "configure": "Configurar", - "manualConfig": "Manual config", + "manualConfig": "Configuración manual", "manage": "Administrar", "name": "Nombre", "actions": "Acciones", @@ -42,19 +42,19 @@ "model": "Modelo", "models": "modelos", "provider": "Proveedor", - "unknownProvider": "Unknown provider", + "unknownProvider": "Proveedor desconocido", "account": "Cuenta", "time": "Hora", "details": "Detalles", "created": "Creado", - "lastUsed": "Last Refreshed", + "lastUsed": "Última actualización", "loadMore": "Cargar más", "noResults": "No se encontraron resultados", "reloadPage": "Recargar página", "connected": "Conectado", - "disconnected": "desconectado", + "disconnected": "Desconectado", "notConfigured": "No configurado", - "testConnection": "Conexión de prueba", + "testConnection": "Probar conexión", "enable": "Habilitar", "disable": "Desactivar", "columns": "Columnas", @@ -70,9 +70,9 @@ "note": "Nota", "free": "Gratis", "skipToContent": "Saltar al contenido", - "maintenanceServerIssues": "Server is experiencing issues. Some features may be unavailable.", - "maintenanceServerUnreachable": "Server is unreachable. Reconnecting...", - "accept": "accept", + "maintenanceServerIssues": "El servidor está experimentando problemas. Algunas funciones pueden no estar disponibles.", + "maintenanceServerUnreachable": "No se puede contactar con el servidor. Reconectando...", + "accept": "Aceptar", "accountId": "accountId", "alias": "alias", "apiKeyId": "apiKeyId", @@ -90,24 +90,24 @@ "offset": "offset", "open": "open", "origin": "origin", - "promptTokens": "promptTokens", - "completionTokens": "completionTokens", - "totalTokens": "totalTokens", - "rawModel": "rawModel", + "promptTokens": "Tokens de prompt", + "completionTokens": "Tokens de respuesta", + "totalTokens": "Tokens totales", + "rawModel": "Modelo original", "scope": "scope", "skill": "skill", - "sortBy": "sortBy", - "sortOrder": "sortOrder", + "sortBy": "Ordenar por", + "sortOrder": "Orden", "tab": "tab", "text": "text", "textarea": "textarea", "tool": "tool", "toolId": "toolId", "web": "web", - "whereUsed": "whereUsed", - "whitelist": "whitelist", - "blacklist": "blacklist", - "resolve": "resolve", + "whereUsed": "Dónde se usa", + "whitelist": "Lista de permitidos", + "blacklist": "Lista de bloqueados", + "resolve": "Resolver", "force": "force", "base64url": "base64url", "hex": "hex", @@ -117,12 +117,12 @@ "idempotency-key": "idempotency-key", "error_description": "error_description", "code": "code", - "compatible": "compatible", + "compatible": "Compatible", "chat-completions": "chat-completions", "oauth": "oauth", "auth_token": "auth_token", "crypto": "crypto", - "hours": "hours", + "hours": "Horas", "selfsigned": "selfsigned", "proxy_id": "proxy_id", "proxyId": "proxyId", @@ -136,571 +136,571 @@ "better-sqlite3": "better-sqlite3", "undici": "undici", "builder-id": "builder-id", - "musicDesc": "musicDesc", - "musicGeneration": "musicGeneration", + "musicDesc": "Descripción de música", + "musicGeneration": "Generación de música", "idc": "idc", "cloud-status-changed": "cloud-status-changed", "where_used": "where_used", - "windowMs": "windowMs", + "windowMs": "Ventana (ms)", "social-github": "GitHub", "social-google": "google", "TOOL_ALLOWLIST": "Lista de herramientas permitidas", "TOOL_DENYLIST": "Lista de denegaciones de herramientas", "Failed to save pricing": "No se pudo guardar el precio", "Failed to reset pricing": "No se pudo restablecer el precio", - "apikey": "Clave API", + "apikey": "Clave de API", "http": "HTTP", - "goToDashboard": "Go to Dashboard", - "checkSystemStatus": "Check System Status", - "selectModel": "Select Model", - "addModel": "Add model", - "effortNone": "None", - "effortLow": "Low", - "effortMedium": "Medium", - "effortHigh": "High", - "effortExtraHigh": "Extra high", - "effortMax": "Max", + "goToDashboard": "Ir al Panel de control", + "checkSystemStatus": "Comprobar estado del sistema", + "selectModel": "Seleccionar modelo", + "addModel": "Añadir modelo", + "effortNone": "Ninguno", + "effortLow": "Bajo", + "effortMedium": "Medio", + "effortHigh": "Alto", + "effortExtraHigh": "Muy alto", + "effortMax": "Máximo", "effortUltra": "Ultra", - "reasoningEffort": "Reasoning effort", - "wireApi": "Wire API", - "modelAliases": "Model aliases", + "reasoningEffort": "Esfuerzo de razonamiento", + "wireApi": "API Wire", + "modelAliases": "Alias de modelo", "combos": "Combos", - "noModelsFound": "No models found", - "clear": "Clear", - "done": "Done", + "noModelsFound": "No se encontraron modelos", + "clear": "Limpiar", + "done": "Hecho", "selectAll": "Seleccionar todo", "unselectAll": "Deseleccionar todo", "visibleModels": "visibles", "selectAllConfirm": "¿Añadir {count} modelos a esta combinación?", - "errorOccurred": "Error Occurred", - "comboDeleted": "Combo Deleted", - "hide": "Hide", - "creating": "Creating", - "comboCreated": "Combo Created", - "swapFormats": "Swap Formats", - "daysAgo": "Days Ago", - "retries": "Retries", - "errorDuringRestore": "Error During Restore", - "eventsAppearHint": "Events Appear Hint", - "noLockouts": "No Lockouts", - "webSearchDesc": "Web Search Desc", - "audioProvidersHeading": "Audio Providers Heading", + "errorOccurred": "Se produjo un error", + "comboDeleted": "Combo eliminado", + "hide": "Ocultar", + "creating": "Creando", + "comboCreated": "Combo creado", + "swapFormats": "Intercambiar formatos", + "daysAgo": "Días atrás", + "retries": "Reintentos", + "errorDuringRestore": "Error durante la restauración", + "eventsAppearHint": "Sugerencia de aparición de eventos", + "noLockouts": "Sin bloqueos", + "webSearchDesc": "Descripción de búsqueda web", + "audioProvidersHeading": "Cabecera de proveedores de audio", "cloudAgentProviders": "Proveedores de agentes en la nube", - "minutesAgo": "Minutes Ago", - "a": "A", - "liveAutoRefreshing": "Live Auto Refreshing", - "webSearch": "Web Search", - "anthropicPrefixPlaceholder": "Anthropic Prefix Placeholder", - "addModelToCombo": "Add Model To Combo", - "failedToLoad": "Failed To Load", - "categoryMedia": "Category Media", - "enableCloud": "Enable Cloud", - "expirationBannerExpiringSoon": "Expiration Banner Expiring Soon", - "retry": "Retry", + "minutesAgo": "Hace minutos", + "a": "Un", + "liveAutoRefreshing": "Actualización automática en directo", + "webSearch": "Búsqueda web", + "anthropicPrefixPlaceholder": "Marcador de posición de prefijo de Anthropic", + "addModelToCombo": "Añadir modelo al combo", + "failedToLoad": "Error al cargar", + "categoryMedia": "Categoría Multimedia", + "enableCloud": "Activar la nube", + "expirationBannerExpiringSoon": "Banner de caducidad: caduca pronto", + "retry": "Reintentar", "embeddings": "Embeddings", - "errorCount": "Error Count", - "backupReasonManual": "Backup Reason Manual", - "safeSearchModerate": "Safe Search Moderate", - "activeLimiters": "Active Limiters", - "a2aCardTitle": "A2A Card Title", - "cloudWorkerUnreachable": "Cloud Worker Unreachable", - "testFailed": "Test Failed", - "compatibleBaseUrlHint": "Compatible Base Url Hint", - "usageTracking": "Usage Tracking", - "disableCloudTitle": "Disable Cloud Title", - "noConnections": "No Connections", - "providerHealth": "Provider Health", - "confirmDbImport": "Confirm Db Import", - "notAvailableSymbol": "Not Available Symbol", - "backupsAvailable": "Backups Available", - "providerAuto": "Provider Auto", - "newProviderNamePlaceholder": "New Provider Name Placeholder", - "a2aQuickStartStep2": "A2A Quick Start Step2", - "ok": "Ok", - "available": "Available", - "noBackupYet": "No Backup Yet", - "more": "More", - "noCompatibleYet": "No Compatible Yet", - "multiProvider": "Multi Provider", - "repairEnvHint": "Repair Env Hint", - "disablingCloud": "Disabling Cloud", - "testBench": "Test Bench", - "valid": "Valid", - "cloudBenefitShare": "Cloud Benefit Share", - "mcpCardTitle": "Mcp Card Title", - "disableConfirm": "Disable Confirm", - "filters": "Filters", - "expirationBannerExpiredDesc": "Expiration Banner Expired Desc", - "saveComboDefaults": "Save Combo Defaults", - "cloudConnectedVerified": "Cloud Connected Verified", - "uptime": "Uptime", - "compatibleProdPlaceholder": "Compatible Prod Placeholder", - "fallbackChainsTitle": "Fallback Chains Title", - "oauthLabel": "Oauth Label", - "a2aCardDescription": "A2A Card Description", - "okShort": "Ok Short", - "maintenance": "Maintenance", - "formatConverter": "Format Converter", - "zedImportNetworkError": "Zed Import Network Error", - "apiKeyLabel": "Api Key Label", - "noModelsForProvider": "No Models For Provider", - "mcpCardDescription": "Mcp Card Description", - "apiTypeLabel": "Api Type Label", - "configuredProvidersLabel": "Configured Providers Label", - "maxRetriesLabel": "Max Retries Label", - "title": "Title", - "output": "Output", - "prefixHint": "Prefix Hint", - "skipWizard": "Skip Wizard", - "failedCount": "Failed Count", - "confirmDbImportDesc": "Confirm Db Import Desc", - "entries": "Entries", - "until": "Until", - "disableCombo": "Disable Combo", - "liveMonitorDescriptionPrefix": "Live Monitor Description Prefix", - "runningCount": "Running Count", - "noActiveConnectionsInGroup": "No Active Connections In Group", - "savedSuccessfully": "Saved Successfully", - "systemStorage": "System Storage", - "videoDesc": "Video Desc", - "maxResults": "Max Results", - "timeRangeMonth": "Time Range Month", - "testSummary": "Test Summary", - "failedSetPassword": "Failed Set Password", + "errorCount": "Número de errores", + "backupReasonManual": "Motivo de la copia de seguridad: manual", + "safeSearchModerate": "Búsqueda segura moderada", + "activeLimiters": "Limitadores activos", + "a2aCardTitle": "Título de tarjeta A2A", + "cloudWorkerUnreachable": "Worker en la nube inaccesible", + "testFailed": "Prueba fallida", + "compatibleBaseUrlHint": "Sugerencia de URL base compatible", + "usageTracking": "Seguimiento de uso", + "disableCloudTitle": "Desactivar título de la nube", + "noConnections": "Sin conexiones", + "providerHealth": "Estado del proveedor", + "confirmDbImport": "Confirmar importación de base de datos", + "notAvailableSymbol": "Símbolo de no disponible", + "backupsAvailable": "Copias de seguridad disponibles", + "providerAuto": "Proveedor automático", + "newProviderNamePlaceholder": "Marcador de posición de nombre de nuevo proveedor", + "a2aQuickStartStep2": "Paso 2 de inicio rápido de A2A", + "ok": "Aceptar", + "available": "Disponible", + "noBackupYet": "Sin copias de seguridad todavía", + "more": "Más", + "noCompatibleYet": "Ninguno compatible todavía", + "multiProvider": "Multiproveedor", + "repairEnvHint": "Sugerencia de reparación de entorno", + "disablingCloud": "Desactivando la nube", + "testBench": "Banco de pruebas", + "valid": "Válido", + "cloudBenefitShare": "Compartir ventajas de la nube", + "mcpCardTitle": "Título de tarjeta MCP", + "disableConfirm": "Confirmar desactivación", + "filters": "Filtros", + "expirationBannerExpiredDesc": "Descripción de banner de caducidad: caducado", + "saveComboDefaults": "Guardar valores predeterminados del combo", + "cloudConnectedVerified": "Conexión a la nube verificada", + "uptime": "Tiempo de actividad", + "compatibleProdPlaceholder": "Marcador de posición de producción compatible", + "fallbackChainsTitle": "Título de cadenas de fallback", + "oauthLabel": "Etiqueta de OAuth", + "a2aCardDescription": "Descripción de tarjeta A2A", + "okShort": "OK", + "maintenance": "Mantenimiento", + "formatConverter": "Conversor de formatos", + "zedImportNetworkError": "Error de red en la importación de Zed", + "apiKeyLabel": "Etiqueta de clave de API", + "noModelsForProvider": "No hay modelos para el proveedor", + "mcpCardDescription": "Descripción de tarjeta MCP", + "apiTypeLabel": "Etiqueta de tipo de API", + "configuredProvidersLabel": "Etiqueta de proveedores configurados", + "maxRetriesLabel": "Etiqueta de reintentos máximos", + "title": "Título", + "output": "Salida", + "prefixHint": "Sugerencia de prefijo", + "skipWizard": "Omitir asistente", + "failedCount": "Número de fallos", + "confirmDbImportDesc": "Descripción de confirmación de importación de base de datos", + "entries": "Entradas", + "until": "Hasta", + "disableCombo": "Desactivar combo", + "liveMonitorDescriptionPrefix": "Prefijo de descripción del monitor en directo", + "runningCount": "Número de ejecuciones", + "noActiveConnectionsInGroup": "No hay conexiones activas en el grupo", + "savedSuccessfully": "Guardado correctamente", + "systemStorage": "Almacenamiento del sistema", + "videoDesc": "Descripción de vídeo", + "maxResults": "Resultados máximos", + "timeRangeMonth": "Intervalo de tiempo: mes", + "testSummary": "Resumen de la prueba", + "failedSetPassword": "Error al establecer la contraseña", "audio": "Audio", - "restore": "Restore", - "disableWarning": "Disable Warning", - "moderationsDesc": "Moderations Desc", - "providerHealthStatusAria": "Provider Health Status Aria", - "modelNamePlaceholder": "Model Name Placeholder", - "mcpQuickStartStep2": "Mcp Quick Start Step2", - "quickStart": "Quick Start", - "fullExportFailedWithError": "Full Export Failed With Error", - "loadingBackups": "Loading Backups", - "anthropicBaseUrlPlaceholder": "Anthropic Base Url Placeholder", - "description": "Description", - "noProviderFound": "No Provider Found", - "auto": "Auto", - "protocolsDescription": "Protocols Description", - "cloudSessionNote": "Cloud Session Note", - "advancedSettings": "Advanced Settings", - "defaultStrategy": "Default Strategy", - "purgeExpiredLogs": "Purge Expired Logs", - "justNow": "Just Now", - "providerTestFailed": "Provider Test Failed", - "openaiBaseUrlPlaceholder": "Openai Base Url Placeholder", - "image": "Image", - "failedCreateChain": "Failed Create Chain", - "importDatabase": "Import Database", - "allDataLocal": "All Data Local", - "sectionTitle": "Section Title", - "failedToggle": "Failed Toggle", - "editCombo": "Edit Combo", - "testResults": "Test Results", - "searchQuery": "Search Query", - "addCcCompatible": "Add Cc Compatible", - "duplicate": "Duplicate", - "createCombo": "Create Combo", - "searchTypeWeb": "Search Type Web", - "addChain": "Add Chain", - "prefixLabel": "Prefix Label", - "listModelsDesc": "List Models Desc", - "databaseSize": "Database Size", - "chainCreated": "Chain Created", - "providerTestTimeout": "Provider Test Timeout", - "routingStrategy": "Routing Strategy", - "translateAction": "Translate Action", - "exportFailed": "Export Failed", - "connectedVerificationPending": "Connected Verification Pending", - "a2aQuickStartTitle": "A2A Quick Start Title", - "couldNotTest": "Could Not Test", - "testAllCompatible": "Test All Compatible", - "anthropicCompatibleName": "Anthropic Compatible Name", - "disabling": "Disabling", - "failedEnable": "Failed Enable", - "categoryUtility": "Category Utility", - "customUrlOptional": "Custom Url Optional", - "localProviders": "Local Providers", - "comboNamePlaceholder": "Combo Name Placeholder", - "memoryRss": "Memory Rss", - "disableProvider": "Disable Provider", - "welcomeDesc": "Welcome Desc", - "nameLabel": "Name Label", - "allOperational": "All Operational", - "backupNow": "Backup Now", - "providerMaxRetriesAria": "Provider Max Retries Aria", - "textToSpeechDesc": "Text To Speech Desc", - "machineId": "Machine Id", - "globalProxy": "Global Proxy", - "hitsMisses": "Hits Misses", - "testDesc": "Test Desc", - "chatDesc": "Chat Desc", - "importSuccess": "Import Success", + "restore": "Restaurar", + "disableWarning": "Advertencia de desactivación", + "moderationsDesc": "Descripción de moderaciones", + "providerHealthStatusAria": "Estado de salud del proveedor (ARIA)", + "modelNamePlaceholder": "Marcador de posición de nombre de modelo", + "mcpQuickStartStep2": "Paso 2 de inicio rápido de MCP", + "quickStart": "Inicio rápido", + "fullExportFailedWithError": "La exportación completa ha fallado con un error", + "loadingBackups": "Cargando copias de seguridad", + "anthropicBaseUrlPlaceholder": "Marcador de posición de URL base de Anthropic", + "description": "Descripción", + "noProviderFound": "No se ha encontrado ningún proveedor", + "auto": "Automático", + "protocolsDescription": "Descripción de protocolos", + "cloudSessionNote": "Nota de sesión en la nube", + "advancedSettings": "Ajustes avanzados", + "defaultStrategy": "Estrategia predeterminada", + "purgeExpiredLogs": "Purgar logs caducados", + "justNow": "Justo ahora", + "providerTestFailed": "La prueba del proveedor ha fallado", + "openaiBaseUrlPlaceholder": "Marcador de posición de URL base de OpenAI", + "image": "Imagen", + "failedCreateChain": "Error al crear la cadena", + "importDatabase": "Importar base de datos", + "allDataLocal": "Todos los datos son locales", + "sectionTitle": "Título de sección", + "failedToggle": "Error al cambiar el estado", + "editCombo": "Editar combo", + "testResults": "Resultados de las pruebas", + "searchQuery": "Consulta de búsqueda", + "addCcCompatible": "Añadir compatible con CC", + "duplicate": "Duplicar", + "createCombo": "Crear combo", + "searchTypeWeb": "Tipo de búsqueda web", + "addChain": "Añadir cadena", + "prefixLabel": "Etiqueta de prefijo", + "listModelsDesc": "Descripción de listar modelos", + "databaseSize": "Tamaño de la base de datos", + "chainCreated": "Cadena creada", + "providerTestTimeout": "Tiempo de espera agotado en la prueba del proveedor", + "routingStrategy": "Estrategia de enrutamiento", + "translateAction": "Acción de traducir", + "exportFailed": "La exportación ha fallado", + "connectedVerificationPending": "Verificación de conexión pendiente", + "a2aQuickStartTitle": "Título de inicio rápido de A2A", + "couldNotTest": "No se ha podido probar", + "testAllCompatible": "Probar todos los compatibles", + "anthropicCompatibleName": "Nombre compatible con Anthropic", + "disabling": "Desactivando", + "failedEnable": "Error al activar", + "categoryUtility": "Categoría Utilidades", + "customUrlOptional": "URL personalizada (opcional)", + "localProviders": "Proveedores locales", + "comboNamePlaceholder": "Marcador de posición de nombre de combo", + "memoryRss": "Memoria RSS", + "disableProvider": "Desactivar proveedor", + "welcomeDesc": "Descripción de bienvenida", + "nameLabel": "Etiqueta de nombre", + "allOperational": "Todo operativo", + "backupNow": "Hacer copia de seguridad ahora", + "providerMaxRetriesAria": "Reintentos máximos del proveedor (ARIA)", + "textToSpeechDesc": "Descripción de texto a voz", + "machineId": "ID de máquina", + "globalProxy": "Proxy global", + "hitsMisses": "Aciertos/Fallos", + "testDesc": "Descripción de prueba", + "chatDesc": "Descripción de chat", + "importSuccess": "Importación correcta", "chat": "Chat", - "a2aQuickStartStep1": "A2A Quick Start Step1", - "importFailed": "Import Failed", - "inputPlaceholder": "Input Placeholder", - "providerModelsTitle": "Provider Models Title", - "lastBackup": "Last Backup", - "yourEndpoint": "Your Endpoint", - "autoDisableThresholdDesc": "Auto Disable Threshold Desc", - "rerankDesc": "Rerank Desc", - "modelsPathPlaceholder": "Models Path Placeholder", - "noCombosYet": "No Combos Yet", - "connectedVerificationPendingWithError": "Connected Verification Pending With Error", - "comboDefaultsGuideHint1": "Combo Defaults Guide Hint1", - "enableCloudTitle": "Enable Cloud Title", - "configuredProvidersHint": "Configured Providers Hint", - "paused": "Paused", - "llmProviders": "Llm Providers", - "enableCombo": "Enable Combo", - "removeProviderOverrideAria": "Remove Provider Override Aria", - "nodeVersion": "Node Version", - "openai": "Openai", - "exportFailedWithError": "Export Failed With Error", - "proxyConfigured": "Proxy Configured", - "concurrencyPerModel": "Concurrency Per Model", - "protocolTasksLabel": "Protocol Tasks Label", - "oauthProviders": "Oauth Providers", - "lockedCount": "Locked Count", - "deleteChainConfirm": "Delete Chain Confirm", - "recentTranslations": "Recent Translations", - "zedImportButton": "Zed Import Button", - "responsesDesc": "Responses Desc", - "testedCount": "Tested Count", - "providersCommaSeparatedPlaceholder": "Providers Comma Separated Placeholder", - "signatureDefaults": "Signature Defaults", - "errorCreating": "Error Creating", - "timeRangeYear": "Time Range Year", - "compatibleLabel": "Compatible Label", - "cloudDisabledSuccess": "Cloud Disabled Success", - "deleteConfirm": "Delete Confirm", - "check": "Check", - "safeSearch": "Safe Search", - "protocolLastActivity": "Protocol Last Activity", - "openMcpDashboard": "Open Mcp Dashboard", - "testBenchTab": "Test Bench Tab", - "chatPathLabel": "Chat Path Label", - "retryDelay": "Retry Delay", - "errorUpdating": "Error Updating", - "ideCliIntegrations": "Ide Cli Integrations", - "imageGeneration": "Image Generation", - "apiKeyRequired": "Api Key Required", - "resetAllTitle": "Reset All Title", - "connectionError": "Connection Error", - "modelName": "Model Name", - "apiKeyForCheck": "Api Key For Check", - "cloudRequestTimeout": "Cloud Request Timeout", - "showConfiguredOnly": "Show Configured Only", - "showFreeOnly": "Sólo gratis", + "a2aQuickStartStep1": "Paso 1 de inicio rápido de A2A", + "importFailed": "La importación ha fallado", + "inputPlaceholder": "Marcador de posición de entrada", + "providerModelsTitle": "Título de modelos del proveedor", + "lastBackup": "Última copia de seguridad", + "yourEndpoint": "Tu endpoint", + "autoDisableThresholdDesc": "Descripción del umbral de desactivación automática", + "rerankDesc": "Descripción de rerank", + "modelsPathPlaceholder": "Marcador de posición de ruta de modelos", + "noCombosYet": "No hay combos todavía", + "connectedVerificationPendingWithError": "Verificación de conexión pendiente con error", + "comboDefaultsGuideHint1": "Sugerencia de guía de valores predeterminados de combo 1", + "enableCloudTitle": "Activar título de la nube", + "configuredProvidersHint": "Sugerencia de proveedores configurados", + "paused": "En pausa", + "llmProviders": "Proveedores de LLM", + "enableCombo": "Activar combo", + "removeProviderOverrideAria": "Eliminar anulación de proveedor (ARIA)", + "nodeVersion": "Versión de Node", + "openai": "OpenAI", + "exportFailedWithError": "La exportación ha fallado con un error", + "proxyConfigured": "Proxy configurado", + "concurrencyPerModel": "Concurrencia por modelo", + "protocolTasksLabel": "Etiqueta de tareas de protocolo", + "oauthProviders": "Proveedores de OAuth", + "lockedCount": "Número de elementos bloqueados", + "deleteChainConfirm": "Confirmar eliminación de cadena", + "recentTranslations": "Traducciones recientes", + "zedImportButton": "Botón de importación de Zed", + "responsesDesc": "Descripción de respuestas", + "testedCount": "Probados", + "providersCommaSeparatedPlaceholder": "Proveedores separados por comas", + "signatureDefaults": "Valores por defecto de firma", + "errorCreating": "Error al crear", + "timeRangeYear": "Año", + "compatibleLabel": "Compatible", + "cloudDisabledSuccess": "Nube desactivada con éxito", + "deleteConfirm": "Confirmar eliminación", + "check": "Comprobar", + "safeSearch": "Búsqueda segura", + "protocolLastActivity": "Última actividad del protocolo", + "openMcpDashboard": "Abrir panel de MCP", + "testBenchTab": "Banco de pruebas", + "chatPathLabel": "Ruta de chat", + "retryDelay": "Retardo de reintento", + "errorUpdating": "Error al actualizar", + "ideCliIntegrations": "Integraciones de IDE y CLI", + "imageGeneration": "Generación de imágenes", + "apiKeyRequired": "Clave de API requerida", + "resetAllTitle": "Restablecer todo", + "connectionError": "Error de conexión", + "modelName": "Nombre del modelo", + "apiKeyForCheck": "Clave de API para comprobación", + "cloudRequestTimeout": "Tiempo de espera de solicitud en la nube", + "showConfiguredOnly": "Mostrar solo configurados", + "showFreeOnly": "Solo gratis", "addFirstProvider": "Añade tu primer proveedor", - "addFirstProviderDesc": "Conecte un proveedor de IA para comenzar a enrutar solicitudes a través de OmniRoute. Puede utilizar proveedores gratuitos, claves API o cuentas OAuth.", + "addFirstProviderDesc": "Conecta un proveedor de IA para empezar a enrutar solicitudes a través de OmniRoute. Puedes usar proveedores gratuitos, claves de API o cuentas OAuth.", "learnMore": "Más información", - "includeDomains": "Include Domains", - "promptCache": "Prompt Cache", - "cloudConnected": "Cloud Connected", - "deleteChain": "Delete Chain", - "chatPathPlaceholder": "Chat Path Placeholder", - "databasePath": "Database Path", - "usingLocalServer": "Using Local Server", - "globalComboConfig": "Global Combo Config", - "backupFailed": "Backup Failed", - "tabProtocols": "Tab Protocols", - "continue": "Continue", - "categorySearch": "Category Search", - "rateLimitStatus": "Rate Limit Status", - "repairEnvSuccess": "Repair Env Success", - "nameRequired": "Name Required", - "country": "Country", - "trackMetricsDesc": "Track Metrics Desc", - "durationSecondsShort": "Duration Seconds Short", - "formatConverterDescription": "Format Converter Description", - "cloudBenefitAccess": "Cloud Benefit Access", - "maxRetries": "Max Retries", - "queueTimeout": "Queue Timeout", - "queueDepth": "Queue Depth", - "addProvider": "Add Provider", - "realtime": "Realtime", - "totalTranslations": "Total Translations", - "protocolActiveStreamsLabel": "Protocol Active Streams Label", - "repairEnv": "Repair Env", - "modelsCount": "Models Count", - "viewBackups": "View Backups", - "responsesApi": "Responses Api", - "copyComboName": "Copy Combo Name", - "failures": "Failures", - "failedUpdate": "Failed Update", - "imageDesc": "Image Desc", - "failedCreate": "Failed Create", - "remainingOfLimit": "Remaining Of Limit", - "protocolsTitle": "Protocols Title", - "expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc", - "source": "Source", - "failed": "Failed", - "apiKeyMgmt": "Api Key Mgmt", - "mcpQuickStartStep1": "Mcp Quick Start Step1", - "runTest": "Run Test", - "loadingFallbackChains": "Loading Fallback Chains", - "healthy": "Healthy", - "version": "Version", - "saveBlockWeighted": "Save Block Weighted", - "zedImportNone": "Zed Import None", - "noBackupsYet": "No Backups Yet", - "noGlobalProxy": "No Global Proxy", - "noModels": "No Models", - "stickyLimit": "Sticky Limit", - "passedCount": "Passed Count", - "zedImportFailed": "Zed Import Failed", - "saving": "Saving", - "testAll": "Test All", - "globalProxyDesc": "Global Proxy Desc", - "latencyP99": "Latency P99", - "connectingToCloud": "Connecting To Cloud", - "responses": "Responses", - "errorDeleting": "Error Deleting", - "openaiPrefixPlaceholder": "Openai Prefix Placeholder", - "enterPassword": "Enter Password", - "openA2aDashboard": "Open A2A Dashboard", - "enableProvider": "Enable Provider", - "modeTest": "Mode Test", - "failedDeleteChain": "Failed Delete Chain", - "providerDesc": "Provider Desc", - "templateLoadHint": "Template Load Hint", - "lastFailure": "Last Failure", - "moveDown": "Move Down", - "providerLabel": "Provider Label", - "clearCacheFailed": "Clear Cache Failed", - "imagesGenerations": "Images Generations", - "repairEnvWorking": "Repair Env Working", - "millisecondsShort": "Milliseconds Short", - "globalLabel": "Global Label", - "failuresPlural": "Failures Plural", - "completionsLegacyDesc": "Completions Legacy Desc", - "searchProviders": "Search Providers", - "chatPathHint": "Chat Path Hint", - "defaultStrategyDesc": "Default Strategy Desc", - "latencyP95": "Latency P95", - "textToSpeech": "Text To Speech", - "searchType": "Search Type", - "messages": "Messages", - "aggregatorsGateways": "Aggregators Gateways", - "comboStrategyAria": "Combo Strategy Aria", - "input": "Input", - "testingConnection": "Testing Connection", - "excludeDomains": "Exclude Domains", - "webCookieProviders": "Web Cookie Providers", - "allTestsPassed": "All Tests Passed", - "openaiCompatibleName": "Openai Compatible Name", - "warningCostOptimizedPartialPricing": "Warning Cost Optimized Partial Pricing", - "comboDefaultsGuideTitle": "Combo Defaults Guide Title", - "hoursAgo": "Hours Ago", - "notAvailable": "Not Available", - "skipAndContinue": "Skip And Continue", - "moderations": "Moderations", - "proxyConfig": "Proxy Config", - "upstreamProxyProviders": "Upstream Proxy Providers", - "exportAll": "Export All", - "queuedCount": "Queued Count", - "resetAll": "Reset All", - "noTranslations": "No Translations", - "avgLatency": "Avg Latency", - "throttleStatus": "Throttle Status", - "backupRetentionDesc": "Backup Retention Desc", - "noCBData": "No Cb Data", - "chainDeleted": "Chain Deleted", - "timeLeft": "Time Left", - "expirationBannerExpired": "Expiration Banner Expired", - "language": "Language", - "invalidFileType": "Invalid File Type", - "monitoredProviders": "Monitored Providers", - "errors": "Errors", + "includeDomains": "Incluir dominios", + "promptCache": "Caché de prompts", + "cloudConnected": "Nube conectada", + "deleteChain": "Eliminar cadena", + "chatPathPlaceholder": "Ruta de chat", + "databasePath": "Ruta de la base de datos", + "usingLocalServer": "Usando servidor local", + "globalComboConfig": "Configuración global del combo", + "backupFailed": "Error en la copia de seguridad", + "tabProtocols": "Protocolos", + "continue": "Continuar", + "categorySearch": "Búsqueda por categoría", + "rateLimitStatus": "Estado de rate limit", + "repairEnvSuccess": "Entorno reparado con éxito", + "nameRequired": "Nombre obligatorio", + "country": "País", + "trackMetricsDesc": "Descripción del seguimiento de métricas", + "durationSecondsShort": "Duración (s)", + "formatConverterDescription": "Descripción del convertidor de formato", + "cloudBenefitAccess": "Acceso a ventajas en la nube", + "maxRetries": "Máximo de reintentos", + "queueTimeout": "Tiempo de espera en cola", + "queueDepth": "Profundidad de la cola", + "addProvider": "Añadir proveedor", + "realtime": "Tiempo real", + "totalTranslations": "Total de traducciones", + "protocolActiveStreamsLabel": "Flujos activos del protocolo", + "repairEnv": "Reparar entorno", + "modelsCount": "Cantidad de modelos", + "viewBackups": "Ver copias de seguridad", + "responsesApi": "API de respuestas", + "copyComboName": "Copiar nombre del combo", + "failures": "Fallos", + "failedUpdate": "Error al actualizar", + "imageDesc": "Descripción de imagen", + "failedCreate": "Error al crear", + "remainingOfLimit": "Restante del límite", + "protocolsTitle": "Protocolos", + "expirationBannerExpiringSoonDesc": "Aviso de caducidad próxima", + "source": "Origen", + "failed": "Fallido", + "apiKeyMgmt": "Gestión de claves de API", + "mcpQuickStartStep1": "Paso 1 del inicio rápido de MCP", + "runTest": "Ejecutar prueba", + "loadingFallbackChains": "Cargando cadenas de fallback", + "healthy": "Correcto", + "version": "Versión", + "saveBlockWeighted": "Guardar bloque ponderado", + "zedImportNone": "Sin importación de Zed", + "noBackupsYet": "Aún no hay copias de seguridad", + "noGlobalProxy": "Sin proxy global", + "noModels": "Sin modelos", + "stickyLimit": "Límite persistente", + "passedCount": "Aprobados", + "zedImportFailed": "Error al importar Zed", + "saving": "Guardando", + "testAll": "Probar todo", + "globalProxyDesc": "Descripción del proxy global", + "latencyP99": "Latencia P99", + "connectingToCloud": "Conectando a la nube", + "responses": "Respuestas", + "errorDeleting": "Error al eliminar", + "openaiPrefixPlaceholder": "Prefijo de OpenAI", + "enterPassword": "Introduce la contraseña", + "openA2aDashboard": "Abrir panel de A2A", + "enableProvider": "Habilitar proveedor", + "modeTest": "Modo de prueba", + "failedDeleteChain": "Error al eliminar la cadena", + "providerDesc": "Descripción del proveedor", + "templateLoadHint": "Sugerencia de carga de plantilla", + "lastFailure": "Último fallo", + "moveDown": "Bajar", + "providerLabel": "Proveedor", + "clearCacheFailed": "Error al borrar la caché", + "imagesGenerations": "Generaciones de imágenes", + "repairEnvWorking": "Reparando entorno...", + "millisecondsShort": "ms", + "globalLabel": "Etiqueta global", + "failuresPlural": "Fallos", + "completionsLegacyDesc": "Descripción de completions heredadas", + "searchProviders": "Buscar proveedores", + "chatPathHint": "Indicación sobre la ruta de chat", + "defaultStrategyDesc": "Descripción de la estrategia por defecto", + "latencyP95": "Latencia P95", + "textToSpeech": "Texto a voz", + "searchType": "Tipo de búsqueda", + "messages": "Mensajes", + "aggregatorsGateways": "Agregadores y pasarelas", + "comboStrategyAria": "Estrategia de combo", + "input": "Entrada", + "testingConnection": "Probando conexión", + "excludeDomains": "Excluir dominios", + "webCookieProviders": "Proveedores de cookies web", + "allTestsPassed": "Todas las pruebas superadas", + "openaiCompatibleName": "Nombre compatible con OpenAI", + "warningCostOptimizedPartialPricing": "Advertencia: precios parciales optimizados por coste", + "comboDefaultsGuideTitle": "Guía de valores por defecto del combo", + "hoursAgo": "Hace unas horas", + "notAvailable": "No disponible", + "skipAndContinue": "Omitir y continuar", + "moderations": "Moderaciones", + "proxyConfig": "Configuración de proxy", + "upstreamProxyProviders": "Proveedores de proxy superior", + "exportAll": "Exportar todo", + "queuedCount": "En cola", + "resetAll": "Restablecer todo", + "noTranslations": "Sin traducciones", + "avgLatency": "Latencia media", + "throttleStatus": "Estado de limitación de caudal", + "backupRetentionDesc": "Descripción de retención de copias de seguridad", + "noCBData": "Sin datos de CB", + "chainDeleted": "Cadena eliminada", + "timeLeft": "Tiempo restante", + "expirationBannerExpired": "Aviso de caducado", + "language": "Idioma", + "invalidFileType": "Tipo de archivo no válido", + "monitoredProviders": "Proveedores supervisados", + "errors": "Errores", "heap": "Heap", - "chatCompletions": "Chat Completions", - "exampleTemplatesHint": "Example Templates Hint", - "retryDelayLabel": "Retry Delay Label", - "audioTranscription": "Audio Transcription", - "fallbackChainsDesc": "Fallback Chains Desc", - "exampleTemplates": "Example Templates", - "connectionsCount": "Connections Count", - "modelsPathLabel": "Models Path Label", - "activeProvidersHint": "Active Providers Hint", - "activeLockouts": "Active Lockouts", - "invalid": "Invalid", - "skipPassword": "Skip Password", - "moveUp": "Move Up", - "timeRange": "Time Range", - "stickyLimitDesc": "Sticky Limit Desc", - "cloudBenefitEdge": "Cloud Benefit Edge", - "custom": "Custom", - "verifying": "Verifying", - "baseUrlLabel": "Base Url Label", - "setPassword": "Set Password", - "safeSearchStrict": "Safe Search Strict", - "noChangesSinceBackup": "No Changes Since Backup", - "modelsPathHint": "Models Path Hint", - "audioTranscriptions": "Audio Transcriptions", - "testCombo": "Test Combo", - "mcpQuickStartTitle": "Mcp Quick Start Title", - "comboUpdated": "Combo Updated", - "weighted": "Weighted", - "providers": "Providers", - "ccCompatibleLabel": "Cc Compatible Label", - "noFallbackChainsDesc": "No Fallback Chains Desc", - "yesImport": "Yes Import", - "lockoutsAutoRefreshHint": "Lockouts Auto Refresh Hint", - "tabApis": "Tab Apis", - "sectionDescription": "Section Description", - "filter": "Filter", - "purgeLogsFailed": "Purge Logs Failed", - "latency": "Latency", - "testAllOAuth": "Test All O Auth", - "mcpQuickStartStep3": "Mcp Quick Start Step3", - "repairEnvFailed": "Repair Env Failed", - "zedImportHint": "Zed Import Hint", - "modelsAcrossEndpoints": "Models Across Endpoints", - "autoDisableBannedAccounts": "Auto Disable Banned Accounts", - "securityDesc": "Security Desc", - "listModels": "List Models", - "backupRestore": "Backup Restore", - "target": "Target", - "zedImportSuccess": "Zed Import Success", - "lastHeaderUpdate": "Last Header Update", - "categoryCore": "Category Core", - "noFallbackChains": "No Fallback Chains", - "noSearchProviders": "No Search Providers", - "autoBalance": "Auto Balance", - "noModelsYet": "No Models Yet", - "signatureFamily": "Signature Family", - "externalApiCalls": "External Api Calls", - "providerOverridesDesc": "Provider Overrides Desc", - "signatureTool": "Signature Tool", - "connectionFailed": "Connection Failed", - "activeLimitersPlural": "Active Limiters Plural", - "doneDesc": "Done Desc", - "down": "Down", - "noDataYet": "No Data Yet", - "activeProviders": "Active Providers", - "nameInvalid": "Name Invalid", - "skip": "Skip", - "createChain": "Create Chain", - "audioSpeech": "Audio Speech", - "cacheCleared": "Cache Cleared", - "searchTypeNews": "Search Type News", - "durationMillisecondsShort": "Duration Milliseconds Short", - "addOpenAICompatible": "Add Open Ai Compatible", - "chatTesterTab": "Chat Tester Tab", - "queued": "Queued", - "domainPlaceholder": "Domain Placeholder", - "durationMinutesShort": "Duration Minutes Short", - "verifyingConnection": "Verifying Connection", - "imageProviders": "Image Providers", - "protocolToolsLabel": "Protocol Tools Label", - "queryPlaceholder": "Query Placeholder", - "videoGeneration": "Video Generation", - "timeRangeWeek": "Time Range Week", - "limitExhausted": "Limit Exhausted", - "failedDisable": "Failed Disable", - "inMemoryNote": "In Memory Note", - "compatibleHint": "Compatible Hint", - "errorShort": "Error Short", - "advancedHint": "Advanced Hint", - "restoreFailed": "Restore Failed", - "searchProvidersHeading": "Search Providers Heading", - "comboName": "Combo Name", - "autoDisableDescription": "Auto Disable Description", - "embeddingsDesc": "Embeddings Desc", - "operational": "Operational", - "testAllApiKey": "Test All Api Key", - "backupCreated": "Backup Created", - "errorDuringImport": "Error During Import", - "comboDefaultsGuideHint2": "Combo Defaults Guide Hint2", - "connecting": "Connecting", - "fillModelAndProviders": "Fill Model And Providers", - "syncing": "Syncing", - "resetConfirm": "Reset Confirm", - "trackMetrics": "Track Metrics", - "successful": "Successful", - "recovering": "Recovering", - "autoDisableThreshold": "Auto Disable Threshold", + "chatCompletions": "Completions de chat", + "exampleTemplatesHint": "Indicación sobre plantillas de ejemplo", + "retryDelayLabel": "Retardo de reintento", + "audioTranscription": "Transcripción de audio", + "fallbackChainsDesc": "Descripción de cadenas de fallback", + "exampleTemplates": "Plantillas de ejemplo", + "connectionsCount": "Número de conexiones", + "modelsPathLabel": "Ruta de modelos", + "activeProvidersHint": "Indicación sobre proveedores activos", + "activeLockouts": "Bloqueos activos", + "invalid": "No válido", + "skipPassword": "Omitir contraseña", + "moveUp": "Subir", + "timeRange": "Rango de tiempo", + "stickyLimitDesc": "Descripción del límite persistente", + "cloudBenefitEdge": "Ventaja en la nube: Edge", + "custom": "Personalizado", + "verifying": "Verificando", + "baseUrlLabel": "URL base", + "setPassword": "Establecer contraseña", + "safeSearchStrict": "Búsqueda segura estricta", + "noChangesSinceBackup": "Sin cambios desde la copia de seguridad", + "modelsPathHint": "Indicación de la ruta de modelos", + "audioTranscriptions": "Transcripciones de audio", + "testCombo": "Probar combo", + "mcpQuickStartTitle": "Inicio rápido de MCP", + "comboUpdated": "Combo actualizado", + "weighted": "Ponderado", + "providers": "Proveedores", + "ccCompatibleLabel": "Compatible con CC", + "noFallbackChainsDesc": "Descripción de cadenas sin fallback", + "yesImport": "Sí, importar", + "lockoutsAutoRefreshHint": "Sugerencia de actualización automática de bloqueos", + "tabApis": "Pestaña de APIs", + "sectionDescription": "Descripción de la sección", + "filter": "Filtro", + "purgeLogsFailed": "Error al purgar los logs", + "latency": "Latencia", + "testAllOAuth": "Probar todo OAuth", + "mcpQuickStartStep3": "Paso 3 de inicio rápido de MCP", + "repairEnvFailed": "Error al reparar el entorno", + "zedImportHint": "Sugerencia de importación de Zed", + "modelsAcrossEndpoints": "Modelos en todos los endpoints", + "autoDisableBannedAccounts": "Desactivar automáticamente cuentas baneadas", + "securityDesc": "Descripción de seguridad", + "listModels": "Listar modelos", + "backupRestore": "Copia de seguridad y restauración", + "target": "Destino", + "zedImportSuccess": "Importación de Zed realizada con éxito", + "lastHeaderUpdate": "Última actualización de cabecera", + "categoryCore": "Categoría principal", + "noFallbackChains": "Sin cadenas de fallback", + "noSearchProviders": "Sin proveedores de búsqueda", + "autoBalance": "Equilibrio automático", + "noModelsYet": "Aún no hay modelos", + "signatureFamily": "Familia de firma", + "externalApiCalls": "Llamadas a API externas", + "providerOverridesDesc": "Descripción de las anulaciones de proveedor", + "signatureTool": "Herramienta de firma", + "connectionFailed": "Error de conexión", + "activeLimitersPlural": "Limitadores activos", + "doneDesc": "Descripción de finalizado", + "down": "Inactivo", + "noDataYet": "Aún no hay datos", + "activeProviders": "Proveedores activos", + "nameInvalid": "Nombre no válido", + "skip": "Omitir", + "createChain": "Crear cadena", + "audioSpeech": "Audio a voz", + "cacheCleared": "Caché borrada", + "searchTypeNews": "Tipo de búsqueda: noticias", + "durationMillisecondsShort": "Duración (ms)", + "addOpenAICompatible": "Añadir compatible con OpenAI", + "chatTesterTab": "Pestaña de probador de chat", + "queued": "En cola", + "domainPlaceholder": "Marcador de posición de dominio", + "durationMinutesShort": "Duración (min)", + "verifyingConnection": "Verificando conexión", + "imageProviders": "Proveedores de imágenes", + "protocolToolsLabel": "Etiqueta de herramientas de protocolo", + "queryPlaceholder": "Marcador de posición de consulta", + "videoGeneration": "Generación de vídeo", + "timeRangeWeek": "Rango de tiempo: semana", + "limitExhausted": "Límite agotado", + "failedDisable": "Error al desactivar", + "inMemoryNote": "Nota en memoria", + "compatibleHint": "Sugerencia de compatibilidad", + "errorShort": "Error", + "advancedHint": "Sugerencia avanzada", + "restoreFailed": "Error al restaurar", + "searchProvidersHeading": "Encabezado de proveedores de búsqueda", + "comboName": "Nombre del combo", + "autoDisableDescription": "Descripción de desactivación automática", + "embeddingsDesc": "Descripción de embeddings", + "operational": "Operativo", + "testAllApiKey": "Probar todas las claves de API", + "backupCreated": "Copia de seguridad creada", + "errorDuringImport": "Error durante la importación", + "comboDefaultsGuideHint2": "Sugerencia de guía de valores predeterminados del combo 2", + "connecting": "Conectando", + "fillModelAndProviders": "Rellenar modelo y proveedores", + "syncing": "Sincronizando", + "resetConfirm": "Confirmar restablecimiento", + "trackMetrics": "Seguimiento de métricas", + "successful": "Correcto", + "recovering": "Recuperando", + "autoDisableThreshold": "Umbral de desactivación automática", "anthropic": "Anthropic", - "syncingData": "Syncing Data", - "cloudBenefitPorts": "Cloud Benefit Ports", - "compatibleProviders": "Compatible Providers", + "syncingData": "Sincronizando datos", + "cloudBenefitPorts": "Puertos de beneficio en la nube", + "compatibleProviders": "Proveedores compatibles", "freeTierProviders": "Proveedores de nivel gratuito", "freeTierLabel": "Nivel gratuito disponible", - "freeTierProvidersDesc": "Proveedores con niveles gratuitos: algunos requieren un registro de clave API, otros no necesitan ninguna credencial.", - "clearCache": "Clear Cache", - "reqs": "Reqs", - "addAnthropicCompatible": "Add Anthropic Compatible", - "apiKeyProviders": "Api Key Providers", - "tabsAria": "Tabs Aria", - "resetting": "Resetting", - "millisecondsAbbr": "Milliseconds Abbr", - "backupReasonPreRestore": "Backup Reason Pre Restore", - "disableCloud": "Disable Cloud", - "newProviderNameAria": "New Provider Name Aria", - "passwordsMismatch": "Passwords Mismatch", - "a2aQuickStartStep3": "A2A Quick Start Step3", - "liveMonitorDescriptionSuffix": "Live Monitor Description Suffix", - "failedAddProvider": "Failed Add Provider", - "addAtLeastOneProvider": "Add At Least One Provider", - "reasonSeparator": "Reason Separator", - "zedImporting": "Zed Importing", - "confirmPasswordPlaceholder": "Confirm Password Placeholder", - "whatYouGet": "What You Get", - "signatureSession": "Signature Session", - "errorCountNoCode": "Error Count No Code", - "testing": "Testing", - "providersCommaSeparated": "Providers Comma Separated", - "exportDatabase": "Export Database", - "hitRate": "Hit Rate", - "completionsLegacy": "Completions Legacy", - "removeModel": "Remove Model", - "timeRangeDay": "Time Range Day", - "cloudRequestFailed": "Cloud Request Failed", - "updatedAt": "Updated At", - "monitoredProvidersHint": "Monitored Providers Hint", - "connectionSuccessful": "Connection Successful", - "latencyP50": "Latency P50", - "logsDeleted": "Logs Deleted", - "chatTester": "Chat Tester", - "safeSearchOff": "Safe Search Off", - "nameHint": "Name Hint", - "debugToggle": "Debug Toggle", + "freeTierProvidersDesc": "Proveedores con niveles gratuitos: algunos requieren el registro de una clave de API, otros no necesitan ninguna credencial.", + "clearCache": "Borrar caché", + "reqs": "Solicitudes", + "addAnthropicCompatible": "Añadir compatible con Anthropic", + "apiKeyProviders": "Proveedores de clave de API", + "tabsAria": "Pestañas Aria", + "resetting": "Restableciendo", + "millisecondsAbbr": "ms", + "backupReasonPreRestore": "Motivo de la copia de seguridad antes de la restauración", + "disableCloud": "Desactivar nube", + "newProviderNameAria": "Nombre del nuevo proveedor Aria", + "passwordsMismatch": "Las contraseñas no coinciden", + "a2aQuickStartStep3": "Paso 3 de inicio rápido de A2A", + "liveMonitorDescriptionSuffix": "Sufijo de descripción del monitor en vivo", + "failedAddProvider": "Error al añadir proveedor", + "addAtLeastOneProvider": "Añade al menos un proveedor", + "reasonSeparator": "Separador de motivos", + "zedImporting": "Importando Zed", + "confirmPasswordPlaceholder": "Confirmar marcador de posición de contraseña", + "whatYouGet": "Lo que obtienes", + "signatureSession": "Sesión de firma", + "errorCountNoCode": "Recuento de errores sin código", + "testing": "Probando", + "providersCommaSeparated": "Proveedores separados por comas", + "exportDatabase": "Exportar base de datos", + "hitRate": "Tasa de aciertos", + "completionsLegacy": "Completions heredadas", + "removeModel": "Eliminar modelo", + "timeRangeDay": "Rango de tiempo: día", + "cloudRequestFailed": "Error en la solicitud a la nube", + "updatedAt": "Actualizado el", + "monitoredProvidersHint": "Sugerencia de proveedores supervisados", + "connectionSuccessful": "Conexión establecida", + "latencyP50": "Latencia P50", + "logsDeleted": "Logs eliminados", + "chatTester": "Probador de chat", + "safeSearchOff": "Búsqueda segura desactivada", + "nameHint": "Sugerencia de nombre", + "debugToggle": "Interruptor de depuración", "embedding": "Embedding", - "issuesLabel": "Issues Label", - "optionAny": "Option Any", - "maxNestingDepth": "Max Nesting Depth", + "issuesLabel": "Etiqueta de problemas", + "optionAny": "Opción: cualquiera", + "maxNestingDepth": "Profundidad máxima de anidamiento", "rerank": "Rerank", - "checking": "Checking", - "getStarted": "Get Started", - "restoreSuccess": "Restore Success", - "issuesDetected": "Issues Detected", - "signatureCache": "Signature Cache", - "modelLockouts": "Model Lockouts", - "usingCloudProxy": "Using Cloud Proxy", - "loadingHealth": "Loading Health", - "providerOverrides": "Provider Overrides", - "audioTranscriptionDesc": "Audio Transcription Desc", - "learnedFromHeaders": "Learned From Headers", - "totalRequests": "Total Requests", - "cloudUnstableNote": "Cloud Unstable Note", + "checking": "Comprobando", + "getStarted": "Empezar", + "restoreSuccess": "Restauración realizada con éxito", + "issuesDetected": "Problemas detectados", + "signatureCache": "Caché de firma", + "modelLockouts": "Bloqueos de modelo", + "usingCloudProxy": "Usando proxy en la nube", + "loadingHealth": "Cargando estado", + "providerOverrides": "Anulaciones de proveedor", + "audioTranscriptionDesc": "Descripción de transcripción de audio", + "learnedFromHeaders": "Aprendido de las cabeceras", + "totalRequests": "Total de solicitudes", + "cloudUnstableNote": "Nota de inestabilidad en la nube", "gamificationAdmin": "Administrador de gamificación", - "monitorAnomaliesAndHealth": "Supervisar anomalías y el estado del sistema.", + "monitorAnomaliesAndHealth": "Supervisar anomalías y el estado del sistema", "flaggedAnomalies": "Anomalías marcadas", "noAnomaliesDetected": "No se detectaron anomalías", - "apiKey": "Clave API", + "apiKey": "Clave de API", "xpLastHour": "XP (1h)", "zScore": "Puntuación Z", "tokensCommunityServers": "Servidores comunitarios", "tokensServerNamePlaceholder": "Nombre del servidor", - "tokensApiKeyPlaceholder": "clave API", + "tokensApiKeyPlaceholder": "Clave de API", "tokensTokenBalance": "Saldo de tokens", - "tokensSendTokens": "Enviar fichas", - "tokensRecipientApiKeyId": "ID de clave API del destinatario", - "tokensRecipientApiKeyIdPlaceholder": "Ingrese el ID de la clave API del destinatario", - "tokensReasonOptional": "Razón (opcional)", - "tokensReasonPlaceholder": "por ej. bonificación, recompensa", + "tokensSendTokens": "Enviar tokens", + "tokensRecipientApiKeyId": "ID de clave de API del destinatario", + "tokensRecipientApiKeyIdPlaceholder": "Introduce el ID de la clave de API del destinatario", + "tokensReasonOptional": "Motivo (opcional)", + "tokensReasonPlaceholder": "p. ej., bonificación, recompensa", "tokensTransactionHistory": "Historial de transacciones", "tokensNoTransactionsYet": "Aún no hay transacciones", "tokensInviteCodes": "Códigos de invitación", @@ -708,235 +708,235 @@ "tokensRedeemCode": "Canjear código", "tokensRedeemCodePlaceholder": "Introduce el código de invitación", "tokensYourActiveInvites": "Tus invitaciones activas", - "tokensTransferSuccess": "Transfer successful ({idempotencyKey})", - "tokensTransferFailed": "Transfer failed", - "tokensCreateInviteFailed": "Failed to create invite", - "tokensRevokeInviteFailed": "Failed to revoke invite", - "tokensRedeemSuccess": "Invite redeemed. Server: {server}", - "tokensRedeemFailed": "Failed to redeem invite", - "tokensConnectServerFailed": "Failed to connect server", - "tokensDisconnectServerFailed": "Failed to disconnect server", - "tokensAmount": "Amount", - "tokensSending": "Sending...", - "tokensFrom": "From", - "tokensTo": "To", - "tokensReason": "Reason", - "tokensDate": "Date", - "tokensSent": "Sent", - "tokensReceived": "Received", - "tokensCreatingInvite": "Creating...", - "tokensCreateInvite": "Create Invite", - "tokensInviteCreated": "Invite code created", - "tokensRedeeming": "Redeeming...", - "tokensRedeem": "Redeem", - "tokensInviteUses": "{used}/{max} uses", - "tokensRevoked": "REVOKED", - "tokensRevoke": "Revoke", - "tokensConnecting": "Connecting...", - "tokensConnectServer": "Connect Server", - "tokensNoServersConnected": "No servers connected. Connect to a community server to share leaderboards.", + "tokensTransferSuccess": "Transferencia realizada con éxito ({idempotencyKey})", + "tokensTransferFailed": "Error en la transferencia", + "tokensCreateInviteFailed": "Error al crear la invitación", + "tokensRevokeInviteFailed": "Error al revocar la invitación", + "tokensRedeemSuccess": "Invitación canjeada. Servidor: {server}", + "tokensRedeemFailed": "Error al canjear la invitación", + "tokensConnectServerFailed": "Error al conectar el servidor", + "tokensDisconnectServerFailed": "Error al desconectar el servidor", + "tokensAmount": "Cantidad", + "tokensSending": "Enviando...", + "tokensFrom": "De", + "tokensTo": "Para", + "tokensReason": "Motivo", + "tokensDate": "Fecha", + "tokensSent": "Enviado", + "tokensReceived": "Recibido", + "tokensCreatingInvite": "Creando...", + "tokensCreateInvite": "Crear invitación", + "tokensInviteCreated": "Código de invitación creado", + "tokensRedeeming": "Canjeando...", + "tokensRedeem": "Canjear", + "tokensInviteUses": "Usos: {used}/{max}", + "tokensRevoked": "REVOCADO", + "tokensRevoke": "Revocar", + "tokensConnecting": "Conectando...", + "tokensConnectServer": "Conectar servidor", + "tokensNoServersConnected": "No hay servidores conectados. Conéctate a un servidor de la comunidad para compartir tablas de clasificación.", "tokensServerStatus": { - "connected": "Connected", - "disconnected": "Disconnected", - "pending": "Pending", - "syncing": "Syncing", + "connected": "Conectado", + "disconnected": "Desconectado", + "pending": "Pendiente", + "syncing": "Sincronizando", "error": "Error" }, - "tokensLastSync": "Last sync: {date}", - "tokensDisconnect": "Disconnect", - "tierCoverageTitle": "Cobertura de nivel", + "tokensLastSync": "Última sincronización: {date}", + "tokensDisconnect": "Desconectar", + "tierCoverageTitle": "Cobertura de niveles", "tierCoverageSubtitle": "Proveedores configurados por nivel alternativo", - "batchDetailCopyId": "Copiar identificación", + "batchDetailCopyId": "Copiar ID", "batchDetailClose": "Cerrar", - "batchDetailEndpoint": "Punto final", - "batchDetailModel": "modelo", - "batchDetailWindow": "ventana", + "batchDetailEndpoint": "Endpoint", + "batchDetailModel": "Modelo", + "batchDetailWindow": "Ventana", "batchDetailCreated": "Creado", "providerTopologyEmpty": "Aún no hay proveedores conectados", "badgeToastUnlocked": "¡Insignia desbloqueada!", - "batchListSearchPlaceholder": "Busque por ID, punto final, modelo…", + "batchListSearchPlaceholder": "Buscar por ID, endpoint, modelo...", "batchListDeleteAllCompletedTitle": "Eliminar todos los lotes completados", "batchListBatchesTable": "Lotes", "changelogViewerLoading": "Cargando registro de cambios desde GitHub...", "profileLoading": "Cargando perfil...", - "profileHowToEarn": "como ganar", + "profileHowToEarn": "Cómo ganar", "bootstrapBannerDismiss": "Descartar", "batchListDeleteBatchTitle": "Eliminar lote y sus archivos", "leaderboardYourRank": "Tu rango", "leaderboardLoading": "Cargando tabla de clasificación...", - "batchFileDetailCopyId": "Copiar identificación", + "batchFileDetailCopyId": "Copiar ID", "batchFileDetailClose": "Cerrar", "batchFileDetailFailedToLoad": "No se pudo cargar el contenido del archivo", - "batchFileDetailLoadError": "Error loading file contents", + "batchFileDetailLoadError": "Error al cargar el contenido del archivo", "batchFilesListSearchPlaceholder": "Buscar por ID o nombre de archivo...", "batchFilesListFilesTable": "Archivos", - "batchFilesCount": "{count, plural, one {# file} other {# files}}", - "batchFilesAllPurposes": "All purposes", - "batchFilesFilename": "Filename", - "batchFilesPurpose": "Purpose", - "batchFilesExpires": "Expires", - "batchFilesNoneFound": "No files found", - "batchFilesNeverExpires": "Never", - "batchFileInUseByActiveBatch": "File in use by an active batch", + "batchFilesCount": "{count, plural, one {# archivo} other {# archivos}}", + "batchFilesAllPurposes": "Todos los propósitos", + "batchFilesFilename": "Nombre de archivo", + "batchFilesPurpose": "Propósito", + "batchFilesExpires": "Caduca", + "batchFilesNoneFound": "No se han encontrado archivos", + "batchFilesNeverExpires": "Nunca", + "batchFileInUseByActiveBatch": "Archivo en uso por un lote activo", "batchFilePurpose": { - "batch": "Batch input", - "batch-output": "Batch output", + "batch": "Entrada de lote", + "batch-output": "Salida de lote", "fine-tune": "Fine-tuning", "assistants": "Assistants" }, - "batchPageLoadingMore": "Cargando más…", + "batchPageLoadingMore": "Cargando más...", "recommended": "Recomendado", - "understand": "I understand", - "batchConceptTitle": "Batch processing", - "batchConceptSubtitle": "Process thousands of requests asynchronously at ~50% of the cost (24h window). Ideal for evaluations, classification, and embeddings.", - "batchConceptHowItWorks": "How it works", - "batchConceptBenefit50pct": "50% discount on input + output tokens", - "batchConceptAsync24h": "Async with a 24h completion window", - "batchConceptUseCases": "Best for bulk classification, evaluations, and embeddings", - "filesConceptTitle": "Batch files", - "filesConceptSubtitle": "JSONL files used by batches: input requests, results, and errors.", - "filesConceptInput": "Input — your JSONL with one request per line", - "filesConceptOutput": "Output — results from completed requests", - "filesConceptError": "Errors — requests that failed", - "filesConceptRetention": "Retention: 30 days by default (29 days on Anthropic)", - "wizardTitle": "New batch", - "wizardClose": "Close", - "wizardNext": "Next", - "wizardBack": "Back", - "wizardCancel": "Cancel", - "wizardCreate": "Create batch", - "wizardCreating": "Creating…", - "wizardStep1Destination": "Destination", - "wizardStep2Input": "Input", - "wizardStep3Validate": "Validate", - "wizardStep4Cost": "Cost & create", - "wizardProviderLabel": "Provider", + "understand": "Entendido", + "batchConceptTitle": "Procesamiento por lotes", + "batchConceptSubtitle": "Procesa miles de solicitudes de forma asíncrona a ~50 % del coste (ventana de 24 h). Ideal para evaluaciones, clasificación y embeddings.", + "batchConceptHowItWorks": "Cómo funciona", + "batchConceptBenefit50pct": "50 % de descuento en tokens de entrada y salida", + "batchConceptAsync24h": "Asíncrono con una ventana de finalización de 24 h", + "batchConceptUseCases": "Ideal para clasificación masiva, evaluaciones y embeddings", + "filesConceptTitle": "Archivos de lote", + "filesConceptSubtitle": "Archivos JSONL utilizados por los lotes: solicitudes de entrada, resultados y errores.", + "filesConceptInput": "Entrada: tu JSONL con una solicitud por línea", + "filesConceptOutput": "Salida: resultados de las solicitudes completadas", + "filesConceptError": "Errores: solicitudes que han fallado", + "filesConceptRetention": "Retención: 30 días por defecto (29 días en Anthropic)", + "wizardTitle": "Nuevo lote", + "wizardClose": "Cerrar", + "wizardNext": "Siguiente", + "wizardBack": "Atrás", + "wizardCancel": "Cancelar", + "wizardCreate": "Crear lote", + "wizardCreating": "Creando...", + "wizardStep1Destination": "Destino", + "wizardStep2Input": "Entrada", + "wizardStep3Validate": "Validar", + "wizardStep4Cost": "Coste y creación", + "wizardProviderLabel": "Proveedor", "wizardEndpointLabel": "Endpoint", - "wizardModelLabel": "Model", + "wizardModelLabel": "Modelo", "wizardInputKindJsonl": "JSONL", - "wizardInputKindCsv": "CSV (we'll convert)", - "wizardDropOrPick": "Drop a file or click to pick", - "wizardCsvMappingTitle": "Map CSV columns → request fields", - "wizardCsvMappingAddField": "Add field", - "wizardCsvNoColumns": "No columns detected in CSV header.", - "wizardCsvIgnoreColumn": "— ignore —", - "wizardCsvCustomIdMapped": "custom_id mapped", - "wizardCsvContentMapped": "Content field mapped (messages, input, or prompt)", - "wizardCsvApplyMapping": "Apply mapping", - "wizardCsvRowsParsed": "{count} rows parsed", - "wizardCsvRowsSkipped": "{count} rows skipped", - "wizardCsvRowError": "Row {row}: {reason}", - "wizardValidationOk": "All lines valid", - "wizardValidating": "Validating…", - "wizardValidationParseFailed": "Validation failed — could not parse content.", - "wizardValidationSummary": "{lines} lines · {ids} unique custom_ids", - "wizardValidationErrorCount": "{count, plural, one {# error} other {# errors}} found", - "wizardValidationDuplicateIds": "Duplicate custom_ids detected:", - "wizardValidationFirstErrors": "Errors (first {count}):", - "wizardValidationLine": "Line {line}", - "wizardValidationErrors": "Validation errors", - "wizardValidationPreview": "Preview (first 5 requests)", - "wizardValidationSamplingNote": "File is large — validated by sampling (first 1000 + last 100 lines). Full validation runs server-side.", - "wizardCostSync": "Sync cost", - "wizardCostBatch": "Batch cost (-50%)", - "wizardCostSavings": "Savings", - "wizardCostEstimatedNotice": "Estimated cost — real billing may vary.", - "wizardErrorUpload": "Failed to upload file. Try again.", - "wizardErrorCreate": "Failed to create batch. Try again.", - "wizardEmptyProviders": "Connect a provider with batch support (OpenAI, Anthropic, or Gemini) to create a batch.", - "uploadModalTitle": "Upload batch file", - "uploadModalDropOrPick": "Drop a .jsonl file or click to pick", - "uploadModalUpload": "Upload", - "uploadModalCancel": "Cancel", - "uploadModalError": "Upload failed. Try again.", - "uploadModalSuccess": "Uploaded", - "uploadModalSizeLimit": "Max 512 MB", - "batchListNewButton": "New batch", - "batchListAutoRefresh": "Auto-refresh 30s", - "batchListCostColumn": "Cost", - "batchActionCancel": "Cancel", - "batchActionDownloadOutput": "Download output", - "batchActionDownloadErrors": "Download errors", - "batchActionRetry": "Retry failed", - "batchActionRetryConfirm": "Retry {n} failed request(s)? Final cost depends on actual tokens consumed.", - "expirationBadgeCritical": "Critical", - "expirationBadgeWarning": "Soon", - "expirationBadgeNormal": "Pending", - "expirationBadgeExpired": "Expired", - "filesListUploadButton": "Upload", - "filesListUsedByColumn": "Used by", - "filesListUsedByNone": "None", - "filesListUsedByRoleInput": "input", - "filesListUsedByRoleOutput": "output", + "wizardInputKindCsv": "CSV (lo convertiremos)", + "wizardDropOrPick": "Suelta un archivo o haz clic para seleccionarlo", + "wizardCsvMappingTitle": "Asociar columnas CSV → campos de solicitud", + "wizardCsvMappingAddField": "Añadir campo", + "wizardCsvNoColumns": "No se han detectado columnas en la cabecera del CSV.", + "wizardCsvIgnoreColumn": "— ignorar —", + "wizardCsvCustomIdMapped": "custom_id asociado", + "wizardCsvContentMapped": "Campo de contenido asociado (messages, input o prompt)", + "wizardCsvApplyMapping": "Aplicar asociación", + "wizardCsvRowsParsed": "{count} filas analizadas", + "wizardCsvRowsSkipped": "{count} filas omitidas", + "wizardCsvRowError": "Fila {row}: {reason}", + "wizardValidationOk": "Todas las líneas son válidas", + "wizardValidating": "Validando...", + "wizardValidationParseFailed": "Error de validación: no se pudo analizar el contenido.", + "wizardValidationSummary": "{lines} líneas · {ids} custom_ids únicos", + "wizardValidationErrorCount": "{count, plural, one {# error encontrado} other {# errores encontrados}}", + "wizardValidationDuplicateIds": "Se han detectado custom_ids duplicados:", + "wizardValidationFirstErrors": "Errores (primeros {count}):", + "wizardValidationLine": "Línea {line}", + "wizardValidationErrors": "Errores de validación", + "wizardValidationPreview": "Vista previa (primeras 5 solicitudes)", + "wizardValidationSamplingNote": "El archivo es grande; se ha validado mediante muestreo (primeras 1000 + últimas 100 líneas). La validación completa se ejecuta en el servidor.", + "wizardCostSync": "Coste de sincronización", + "wizardCostBatch": "Coste por lote (-50 %)", + "wizardCostSavings": "Ahorro", + "wizardCostEstimatedNotice": "Coste estimado; la facturación real puede variar.", + "wizardErrorUpload": "No se ha podido subir el archivo. Inténtalo de nuevo.", + "wizardErrorCreate": "No se ha podido crear el lote. Inténtalo de nuevo.", + "wizardEmptyProviders": "Conecta un proveedor compatible con lotes (OpenAI, Anthropic o Gemini) para crear un lote.", + "uploadModalTitle": "Subir archivo de lote", + "uploadModalDropOrPick": "Suelta un archivo .jsonl o haz clic para seleccionarlo", + "uploadModalUpload": "Subir", + "uploadModalCancel": "Cancelar", + "uploadModalError": "Error al subir. Inténtalo de nuevo.", + "uploadModalSuccess": "Subido", + "uploadModalSizeLimit": "Máx. 512 MB", + "batchListNewButton": "Nuevo lote", + "batchListAutoRefresh": "Actualización automática 30 s", + "batchListCostColumn": "Coste", + "batchActionCancel": "Cancelar", + "batchActionDownloadOutput": "Descargar salida", + "batchActionDownloadErrors": "Descargar errores", + "batchActionRetry": "Reintentar fallidos", + "batchActionRetryConfirm": "¿Reintentar {n} solicitud(es) fallida(s)? El coste final depende de los tokens consumidos.", + "expirationBadgeCritical": "Crítico", + "expirationBadgeWarning": "Pronto", + "expirationBadgeNormal": "Pendiente", + "expirationBadgeExpired": "Caducado", + "filesListUploadButton": "Subir", + "filesListUsedByColumn": "Utilizado por", + "filesListUsedByNone": "Ninguno", + "filesListUsedByRoleInput": "entrada", + "filesListUsedByRoleOutput": "salida", "filesListUsedByRoleError": "error", - "filesListSizeColumn": "Size", - "batchListProgressPartial": "(partial)", - "batchListProviderColumn": "Provider", + "filesListSizeColumn": "Tamaño", + "batchListProgressPartial": "(parcial)", + "batchListProviderColumn": "Proveedor", "batchListProviderUnknown": "—", - "batchListProviderOther": "Other", - "batchListTitle": "Batches", - "batchListCount": "{count} batches", - "batchListRemovingCompleted": "Removing…", - "batchListRemoveCompleted": "Remove completed", - "batchListTableStatus": "Status", + "batchListProviderOther": "Otro", + "batchListTitle": "Lotes", + "batchListCount": "{count} lotes", + "batchListRemovingCompleted": "Eliminando...", + "batchListRemoveCompleted": "Eliminar completados", + "batchListTableStatus": "Estado", "batchListTableId": "ID", "batchListTableEndpoint": "Endpoint", - "batchListTableModel": "Model", - "batchListTableProgress": "Progress", - "batchListTableCreated": "Created", - "batchListTableExpires": "Expires", - "batchListLoading": "Loading…", - "batchListEmpty": "No batches found", - "batchListValidating": "Validating…", - "batchStatusAll": "All statuses", - "batchStatusInProgress": "In progress", - "batchStatusValidating": "Validating", - "batchStatusFinalizing": "Finalizing", - "batchStatusCompleted": "Completed", - "batchStatusFailed": "Failed", - "batchStatusCancelled": "Cancelled", - "batchStatusCancelling": "Cancelling", - "batchStatusExpired": "Expired", - "batchStatusCompletedWithFailures": "completed with failures", - "batchStatusInProgressWithFailures": "in progress (with failures)", - "batchStatusFinalizingWithFailures": "finalizing (with failures)", - "batchStatusCancelledWithFailures": "cancelled with failures", - "batchStatusExpiredWithFailures": "expired (partial)", - "wizardCostEstimating": "Estimating cost…", - "wizardCostRequests": "Requests", - "wizardCostInputTok": "input tok", - "wizardCostOutputTok": "output tok", - "wizardCostWindow": "Window", - "wizardDestinationSelectProvider": "Select a provider…", - "wizardDestinationSelectModel": "Select a model…", - "wizardDestinationConnectProvider": "Connect a provider", - "batchListBatchCreated": "Batch {id} created — refreshing list…", - "batchListBatchCreatedDismiss": "Dismiss", - "batchListRefreshing": "Refreshing…", - "batchListRefresh": "Refresh", - "uploadFileModalRemove": "Remove", - "uploadFileModalUploading": "Uploading…", - "wizardInputReading": "Reading file…", - "wizardInputReady": "Ready", - "wizardInputLargeFileLabel": "Large file — sampling validation", - "wizardInputCsvJsonlReady": "JSONL generated — ready to validate.", - "wizardInputLargeFileWarning": "Large file detected — validation runs by sampling (first 5 MB + last 100 KB). Full validation happens server-side.", - "wizardCostWindow24h": "24h completion window", - "wizardValidationFieldsOk": "required fields valid", - "filesListDelete": "Delete", - "filesListDownload": "Download", - "batchDetailActionCancel": "Cancel batch", - "batchDetailActionRetry": "Retry failed requests", - "batchDetailCancelling": "Cancelling…", - "batchDetailRetrying": "Preparing retry…", - "batchDetailCancelConfirm": "Cancel this batch? In-progress requests will stop.", - "batchActionCancelError": "Failed to cancel batch. Try again.", - "batchActionRetryError": "Failed to retry failed requests. Try again.", - "batchConceptRetentionNote": "Results and error files are retained for 30 days (Anthropic: 29 days)" + "batchListTableModel": "Modelo", + "batchListTableProgress": "Progreso", + "batchListTableCreated": "Creado", + "batchListTableExpires": "Caduca", + "batchListLoading": "Cargando...", + "batchListEmpty": "No se han encontrado lotes", + "batchListValidating": "Validando...", + "batchStatusAll": "Todos los estados", + "batchStatusInProgress": "En curso", + "batchStatusValidating": "Validando", + "batchStatusFinalizing": "Finalizando", + "batchStatusCompleted": "Completado", + "batchStatusFailed": "Fallido", + "batchStatusCancelled": "Cancelado", + "batchStatusCancelling": "Cancelando", + "batchStatusExpired": "Caducado", + "batchStatusCompletedWithFailures": "completado con errores", + "batchStatusInProgressWithFailures": "en curso (con errores)", + "batchStatusFinalizingWithFailures": "finalizando (con errores)", + "batchStatusCancelledWithFailures": "cancelado con errores", + "batchStatusExpiredWithFailures": "caducado (parcial)", + "wizardCostEstimating": "Estimando coste...", + "wizardCostRequests": "Solicitudes", + "wizardCostInputTok": "tok de entrada", + "wizardCostOutputTok": "tok de salida", + "wizardCostWindow": "Ventana", + "wizardDestinationSelectProvider": "Selecciona un proveedor...", + "wizardDestinationSelectModel": "Selecciona un modelo…", + "wizardDestinationConnectProvider": "Conecta un proveedor", + "batchListBatchCreated": "Lote {id} creado — actualizando lista…", + "batchListBatchCreatedDismiss": "Descartar", + "batchListRefreshing": "Actualizando…", + "batchListRefresh": "Actualizar", + "uploadFileModalRemove": "Eliminar", + "uploadFileModalUploading": "Subiendo…", + "wizardInputReading": "Leyendo archivo…", + "wizardInputReady": "Listo", + "wizardInputLargeFileLabel": "Archivo grande — validación por muestreo", + "wizardInputCsvJsonlReady": "JSONL generado — listo para validar.", + "wizardInputLargeFileWarning": "Se ha detectado un archivo grande: la validación se ejecuta por muestreo (primeros 5 MB + últimos 100 KB). La validación completa se realiza en el servidor.", + "wizardCostWindow24h": "Ventana de finalización de 24 h", + "wizardValidationFieldsOk": "campos requeridos válidos", + "filesListDelete": "Eliminar", + "filesListDownload": "Descargar", + "batchDetailActionCancel": "Cancelar lote", + "batchDetailActionRetry": "Reintentar solicitudes fallidas", + "batchDetailCancelling": "Cancelando…", + "batchDetailRetrying": "Preparando reintento…", + "batchDetailCancelConfirm": "¿Cancelar este lote? Las solicitudes en curso se detendrán.", + "batchActionCancelError": "Error al cancelar el lote. Inténtalo de nuevo.", + "batchActionRetryError": "Error al reintentar las solicitudes fallidas. Inténtalo de nuevo.", + "batchConceptRetentionNote": "Los archivos de resultados y errores se conservan durante 30 días (Anthropic: 29 días)" }, - "disabled": "Disabled", - "featureFlagOmnirouteEmergencyFallbackDescription": "Route budget-exhausted requests to the emergency free fallback provider/model.", - "featureFlagArenaEloSyncEnabledDescription": "Enable periodic Arena AI leaderboard ELO sync for model intelligence rankings.", + "disabled": "Desactivado", + "featureFlagOmnirouteEmergencyFallbackDescription": "Enruta las solicitudes que hayan agotado el presupuesto al proveedor/modelo fallback gratuito de emergencia.", + "featureFlagArenaEloSyncEnabledDescription": "Activa la sincronización periódica del ELO de la clasificación de Arena AI para los rankings de inteligencia de modelos.", "featureFlagExposeCcDiscoveryAliasesDescription": "__MISSING__:Advertise claude/<provider>/<model> mirror ids on /v1/models so Claude Code gateway model discovery lists non-Claude models. Warning: doubles catalog entries for all clients when enabled globally.", "sidebar": { "home": "Inicio", @@ -945,52 +945,52 @@ "combos": "Combos", "usage": "Uso", "analytics": "Analítica", - "costs": "Costos", - "health": "Salud", + "costs": "Costes", + "health": "Estado de salud", "proxy": "Proxy", - "limits": "Límites y cuotas", + "limits": "Límites de cuota", "cliTools": "Herramientas CLI", "media": "Multimedia", - "settings": "Configuración", + "settings": "Ajustes", "translator": "Traductor", "playground": "Playground", - "searchTools": "Search Tools", + "searchTools": "Herramientas de búsqueda", "agents": "Agentes", - "cloudAgents": "Agentes de la nube", - "memory": "Memory", - "skills": "Skills", + "cloudAgents": "Agentes en la nube", + "memory": "Memoria", + "skills": "Habilidades", "omniSkills": "OmniSkills", - "agentSkills": "Habilidades del agente", - "chaosConfig": "Chaos Mode", + "agentSkills": "AgentSkills", + "chaosConfig": "Modo Caos", "docs": "Documentación", - "issues": "Problemas", + "issues": "Incidencias", "endpoints": "Endpoints", - "endpointsSubtitle": "Las URL de su conexión de IA", - "apiManager": "Gestor de API", - "apiManagerSubtitle": "Administrar claves API y acceso", - "embeddedServices": "Servicios Integrados", - "embeddedServicesSubtitle": "Gestionar servicios proxy locales", - "logs": "Registros", - "webhooks": "Ganchos web", + "endpointsSubtitle": "Tus URL de conexión de IA", + "apiManager": "Claves de API", + "apiManagerSubtitle": "Gestiona claves de API y accesos", + "embeddedServices": "Servicios integrados", + "embeddedServicesSubtitle": "Gestiona servicios proxy locales", + "logs": "Logs", + "webhooks": "Webhooks", "webhooksSubtitle": "Recibe notificaciones de eventos", - "combosSubtitle": "Proveedores de grupo para conmutación por error", - "batchSubtitle": "Procesar múltiples solicitudes", - "contextCavemanSubtitle": "Compresión inmediata", + "combosSubtitle": "Agrupa proveedores para conmutación por error", + "batchSubtitle": "Procesa múltiples solicitudes", + "contextCavemanSubtitle": "Compresión de prompts", "contextRtkSubtitle": "Filtrado de salida", "auditLog": "Registro de auditoría", "shutdown": "Apagar", "restart": "Reiniciar", - "shutdownConfirm": "¿Cerrar OmniRoute?", + "shutdownConfirm": "¿Apagar OmniRoute?", "restartConfirm": "¿Reiniciar OmniRoute?", "version": "v{version}", "debug": "Depurar", "system": "Sistema", "help": "Ayuda", - "primarySection": "Main", + "primarySection": "Principal", "cliSection": "CLI", - "debugSection": "Debug", - "systemSection": "System", - "helpSection": "Help", + "debugSection": "Depuración", + "systemSection": "Sistema", + "helpSection": "Ayuda", "serverDisconnected": "Servidor desconectado", "serverDisconnectedMsg": "El servidor proxy se ha detenido o se está reiniciando.", "expandSidebar": "Expandir barra lateral", @@ -1005,266 +1005,268 @@ "themeGreen": "Verde", "themeViolet": "Violeta", "themeOrange": "Naranja", - "themeCyan": "cian", + "themeCyan": "Cian", "cliToolsShort": "Herramientas", - "cache": "Cache", - "cacheShort": "Cache", - "batch": "Batch Jobs", - "themeSystem": "Theme System", - "whitelabelingDesc": "Whitelabeling Desc", - "switchThemes": "Switch Themes", - "themeAccentDesc": "Theme Accent Desc", - "uploadFavicon": "Upload Favicon", - "themeDark": "Theme Dark", - "customLogoDesc": "Custom Logo Desc", - "sidebarVisibilityToggle": "Sidebar Visibility Toggle", - "themeAccent": "Theme Accent", - "resetFavicon": "Reset Favicon", - "whitelabeling": "Whitelabeling", - "darkMode": "Dark Mode", - "uploadLogo": "Upload Logo", - "themeLight": "Theme Light", - "appName": "App Name", - "appNameDesc": "App Name Desc", - "resetLogo": "Reset Logo", - "customFavicon": "Custom Favicon", - "hideHealthLogs": "Hide Health Logs", - "customLogo": "Custom Logo", - "appearance": "Appearance", - "themeSelectionAria": "Theme Selection Aria", - "themeCreate": "Theme Create", - "customFaviconDesc": "Custom Favicon Desc", - "logoPreview": "Logo Preview", - "themeCustom": "Theme Custom", - "hideHealthLogsDesc": "Hide Health Logs Desc", - "faviconPreview": "Favicon Preview", - "changelog": "Changelog", - "contextSection": "Context & Cache", + "cache": "Caché", + "cacheShort": "Caché", + "batch": "Tareas por lotes", + "themeSystem": "Sistema de temas", + "whitelabelingDesc": "Ajustes de marca blanca", + "switchThemes": "Cambiar de tema", + "themeAccentDesc": "Color de acento del tema", + "uploadFavicon": "Subir favicon", + "themeDark": "Tema oscuro", + "customLogoDesc": "Descripción del logotipo personalizado", + "sidebarVisibilityToggle": "Alternar visibilidad de la barra lateral", + "themeAccent": "Acento del tema", + "resetFavicon": "Restablecer favicon", + "whitelabeling": "Marca blanca", + "darkMode": "Modo oscuro", + "uploadLogo": "Subir logotipo", + "themeLight": "Tema claro", + "appName": "Nombre de la aplicación", + "appNameDesc": "Descripción del nombre de la aplicación", + "resetLogo": "Restablecer logotipo", + "customFavicon": "Favicon personalizado", + "hideHealthLogs": "Ocultar logs de salud", + "customLogo": "Logotipo personalizado", + "appearance": "Apariencia", + "themeSelectionAria": "Selección de tema", + "themeCreate": "Crear tema", + "customFaviconDesc": "Descripción del favicon personalizado", + "logoPreview": "Vista previa del logotipo", + "themeCustom": "Tema personalizado", + "hideHealthLogsDesc": "Ocultar logs de salud en la interfaz", + "faviconPreview": "Vista previa del favicon", + "changelog": "Registro de cambios", + "contextSection": "Contexto y caché", "contextCaveman": "Caveman", "contextRtk": "RTK", - "contextCombos": "Engine Combos", + "contextCombos": "Combos de motores", "contextLite": "Lite", - "contextAggressive": "Aggressive", + "contextAggressive": "Agresivo", "contextUltra": "Ultra", "contextOmniglyph": "OmniGlyph", - "contextSettings": "Compression Settings", + "contextSettings": "Ajustes de compresión", "contextHeadroom": "Headroom", - "contextSessionDedup": "Session Dedup", + "contextSessionDedup": "Deduplicación de sesión", "contextCcr": "CCR", "contextLlmlingua": "LLMLingua", "combosLive": "Combo Studio", - "combosLiveSubtitle": "Live routing cascade", + "combosLiveSubtitle": "Cascada de enrutamiento en tiempo real", "compressionStudio": "Compression Studio", - "compressionExclusions": "Exclusions", - "contextSettingsSubtitle": "Global defaults", - "contextHeadroomSubtitle": "Tabular compaction", - "contextSessionDedupSubtitle": "Cross-turn deduplication", - "contextCcrSubtitle": "Retrieve markers", - "contextLlmlinguaSubtitle": "Semantic pruning", - "contextLiteSubtitle": "Fast whitespace cleanup", - "contextAggressiveSubtitle": "Summary and aging", - "contextUltraSubtitle": "Heuristic pruning", - "contextOmniglyphSubtitle": "Context as images", - "compressionStudioSubtitle": "Live engine cascade", - "compressionExclusionsSubtitle": "Per-model/endpoint bypass", - "chaosConfigSubtitle": "Multi-model parallel execution", - "routingSection": "Routing", - "protocolsSection": "Protocols", - "agentsAiSection": "Agents & AI", - "cacheContextSection": "Cache & Context", - "analyticsSection": "Analytics", - "costsSection": "Costs", - "monitoringSection": "Monitoring", - "auditSecuritySection": "Audit & Security", - "devtoolsSection": "Dev Tools", - "configurationSection": "Configuration", - "aiFeaturesSection": "AI Features", - "mcp": "MCP", - "a2a": "A2A", + "compressionExclusions": "Exclusiones", + "contextSettingsSubtitle": "Valores predeterminados globales", + "contextHeadroomSubtitle": "Compactación tabular", + "contextSessionDedupSubtitle": "Deduplicación entre turnos", + "contextCcrSubtitle": "Marcadores de recuperación", + "contextLlmlinguaSubtitle": "Poda semántica", + "contextLiteSubtitle": "Limpieza rápida de espacios en blanco", + "contextAggressiveSubtitle": "Resumen y envejecimiento", + "contextUltraSubtitle": "Poda heurística", + "contextOmniglyphSubtitle": "Contexto como imágenes", + "compressionStudioSubtitle": "Cascada de motores en tiempo real", + "compressionExclusionsSubtitle": "Omisión por modelo/endpoint", + "chaosConfigSubtitle": "Ejecución paralela multimodelo", + "routingSection": "Enrutamiento", + "protocolsSection": "Protocolos", + "agentsAiSection": "Agentes e IA", + "cacheContextSection": "Caché y contexto", + "analyticsSection": "Analítica", + "costsSection": "Costes", + "monitoringSection": "Supervisión", + "auditSecuritySection": "Auditoría y seguridad", + "devtoolsSection": "Herramientas de desarrollo", + "configurationSection": "Configuración", + "aiFeaturesSection": "Funciones de IA", + "mcp": "Servidor MCP", + "a2a": "Servidor A2A", "plugins": "Plugins", - "apiEndpoints": "API Endpoints", - "batchFiles": "Files", - "analyticsEvals": "Evals", - "analyticsSearch": "Search", - "analyticsUtilization": "Utilization", - "analyticsComboHealth": "Combo Health", - "analyticsCompression": "Compression", - "costsBudget": "Budget", - "costsFreeTiers": "Free-Tier Budget", - "costsFreeTiersSubtitle": "Monthly free-token allowances", - "freeProviderRankings": "Free Provider Rankings", - "freeProviderRankingsSubtitle": "Best free providers ranked by model ELO scores", - "costsQuotaShare": "Quota Sharing", - "costsPricing": "Pricing", - "logsProxy": "Proxy Logs", - "logsConsole": "Console", - "logsActivity": "Activity", - "auditMcp": "MCP Audit", + "apiEndpoints": "Endpoints de API", + "batchFiles": "Archivos", + "analyticsEvals": "Evaluaciones", + "analyticsSearch": "Búsqueda", + "analyticsUtilization": "Uso", + "analyticsComboHealth": "Estado de combos", + "analyticsCompression": "Compresión", + "costsBudget": "Presupuesto", + "costsFreeTiers": "Presupuesto de nivel gratuito", + "costsFreeTiersSubtitle": "Asignaciones mensuales de tokens gratuitos", + "freeProviderRankings": "Ranking de proveedores gratuitos", + "freeProviderRankingsSubtitle": "Mejores proveedores gratuitos clasificados por puntuación ELO de modelo", + "costsQuotaShare": "Compartición de cuotas", + "costsPricing": "Precios", + "logsProxy": "Logs del proxy", + "logsConsole": "Consola", + "logsActivity": "Actividad", + "auditMcp": "Auditoría MCP", "auditA2a": "Auditoría A2A", "settingsGeneral": "General", - "settingsAppearance": "Appearance", - "settingsAi": "AI Settings", - "settingsSecurity": "Security", - "settingsAccessTokens": "Access Tokens", + "settingsAppearance": "Apariencia", + "settingsAi": "Ajustes de IA", + "settingsSecurity": "Seguridad", + "settingsAccessTokens": "Tokens de acceso", "settingsFeatureFlags": "Banderas de características", - "settingsCache": "Cache", + "settingsCache": "Caché", "settingsAuthz": "Authz", - "settingsRouting": "Routing", - "settingsResilience": "Resilience", - "modelLockout": "Model Lockout", - "settingsAdvanced": "Advanced", + "settingsRouting": "Enrutamiento", + "settingsResilience": "Resiliencia", + "modelLockout": "Bloqueo de modelos", + "settingsAdvanced": "Avanzado", "omniProxySection": "OmniProxy", - "quotaTracker": "Provider Quota", - "providerQuota": "Provider Quota", + "quotaTracker": "Cuota del proveedor", + "providerQuota": "Cuota del proveedor", "runtime": "Runtime", - "consoleLogs": "Console Logs", + "consoleLogs": "Logs de consola", "logsTimeline": "Timeline", "logsTimelineSubtitle": "__MISSING__:Visual request timeline", - "globalRouting": "Global Routing", + "globalRouting": "Enrutamiento global", "mitmProxy": "MITM Proxy", "oneProxy": "1Proxy", - "agenticFeaturesSection": "Agentic Features", - "otherFeaturesSection": "Other Features", - "compressionContextGroup": "Compression Context", - "gamificationGroup": "Gamification", - "toolsGroup": "Tools", - "integrationsGroup": "Integrations", + "agenticFeaturesSection": "Funciones agenticas", + "otherFeaturesSection": "Otras funciones", + "compressionContextGroup": "Contexto de compresión", + "gamificationGroup": "Gamificación", + "toolsGroup": "Herramientas", + "integrationsGroup": "Integraciones", "proxyGroup": "Proxy", - "costsParametersGroup": "Costs Parameters", - "auditGroup": "Audit", - "batchGroup": "Batch", - "homeSubtitle": "Dashboard overview", - "providersSubtitle": "Manage AI providers", - "quotaTrackerSubtitle": "Track usage limits", - "providerQuotaSubtitle": "Track provider usage limits", - "runtimeSubtitle": "Realtime resilience & sessions", - "contextCombosSubtitle": "Combine compression engines", - "cliToolsSubtitle": "Configure CLI runtimes", - "agentsSubtitle": "Manage local agents", - "cloudAgentsSubtitle": "Manage cloud-based agents", - "apiEndpointsSubtitle": "Expose custom endpoints", - "proxySubtitle": "HTTP proxy settings", - "mitmProxySubtitle": "MITM interception", - "oneProxySubtitle": "Public proxy gateway", - "leaderboard": "Leaderboard", - "profile": "Profile", + "costsParametersGroup": "Parámetros de costes", + "auditGroup": "Auditoría", + "batchGroup": "Procesamiento por lotes", + "homeSubtitle": "Vista general del panel", + "providersSubtitle": "Gestionar proveedores de IA", + "quotaTrackerSubtitle": "Seguimiento de límites de uso", + "providerQuotaSubtitle": "Seguimiento de límites de uso del proveedor", + "runtimeSubtitle": "Resiliencia y sesiones en tiempo real", + "contextCombosSubtitle": "Combinar motores de compresión", + "cliToolsSubtitle": "Configurar runtimes de CLI", + "agentsSubtitle": "Gestionar agentes locales", + "cloudAgentsSubtitle": "Gestionar agentes en la nube", + "apiEndpointsSubtitle": "Exponer endpoints personalizados", + "proxySubtitle": "Ajustes de proxy HTTP", + "mitmProxySubtitle": "Intercepción MITM", + "oneProxySubtitle": "Gateway de proxy público", + "leaderboard": "Clasificación", + "profile": "Perfil", "tokens": "Tokens", - "leaderboardSubtitle": "Rankings and achievements", - "profileSubtitle": "Account and preferences", - "tokensSubtitle": "Token usage and budgets", - "usageSubtitle": "Traffic and usage stats", - "analyticsComboHealthSubtitle": "Combo target reliability", - "analyticsUtilizationSubtitle": "Provider utilization", - "costsSubtitle": "Spend breakdown", - "cacheSubtitle": "Cache hit rates", - "analyticsCompressionSubtitle": "Token savings stats", - "analyticsSearchSubtitle": "Search tool analytics", - "analyticsEvalsSubtitle": "Eval suite results", - "providerStats": "Provider Stats", - "providerStatsSubtitle": "Latency and performance metrics", - "logsSubtitle": "Application logs", - "logsProxySubtitle": "Proxy traffic logs", - "consoleLogsSubtitle": "Console output", - "logsActivitySubtitle": "User activity log", - "healthSubtitle": "System health check", - "costsPricingSubtitle": "Per-model pricing rules", - "costsBudgetSubtitle": "Budget limits", - "costsQuotaShareSubtitle": "Share provider quotas across keys", - "auditLogSubtitle": "Authorization audit", - "auditMcpSubtitle": "MCP server audit", - "auditA2aSubtitle": "A2A protocol audit", - "translatorSubtitle": "Format conversion", - "playgroundSubtitle": "Test prompts live", - "searchToolsSubtitle": "Search tool registry", - "memorySubtitle": "Persistent agent memory", - "omniSkillsSubtitle": "Sandbox skill registry", - "agentSkillsSubtitle": "A2A skill registry", - "mcpSubtitle": "MCP server controls", - "a2aSubtitle": "A2A protocol server", - "pluginsSubtitle": "Plugin marketplace & installs", - "mediaSubtitle": "Cached media files", - "batchFilesSubtitle": "Batch input/output files", - "settingsSubtitle": "All settings", - "settingsGeneralSubtitle": "App basics", - "settingsAppearanceSubtitle": "Theme and layout", - "settingsAiSubtitle": "AI behavior defaults", - "globalRoutingSubtitle": "Global routing rules", - "settingsResilienceSubtitle": "Retries and breakers", - "settingsAdvancedSubtitle": "Power user options", - "settingsSecuritySubtitle": "Auth and encryption", - "settingsAccessTokensSubtitle": "Scoped CLI tokens for remote mode", + "leaderboardSubtitle": "Rankings y logros", + "profileSubtitle": "Cuenta y preferencias", + "tokensSubtitle": "Uso de tokens y presupuestos", + "usageSubtitle": "Estadísticas de tráfico y uso", + "analyticsComboHealthSubtitle": "Fiabilidad de objetivos combinados", + "analyticsUtilizationSubtitle": "Utilización del proveedor", + "costsSubtitle": "Desglose de gastos", + "cacheSubtitle": "Tasas de acierto de caché", + "analyticsCompressionSubtitle": "Estadísticas de ahorro de tokens", + "analyticsSearchSubtitle": "Analíticas de herramientas de búsqueda", + "analyticsEvalsSubtitle": "Resultados de la suite de evaluación", + "providerStats": "Estadísticas del proveedor", + "providerStatsSubtitle": "Métricas de latencia y rendimiento", + "logsSubtitle": "Logs de la aplicación", + "logsProxySubtitle": "Logs de tráfico del proxy", + "consoleLogsSubtitle": "Salida de consola", + "logsActivitySubtitle": "Log de actividad del usuario", + "healthSubtitle": "Comprobación de estado del sistema", + "costsPricingSubtitle": "Reglas de precios por modelo", + "costsBudgetSubtitle": "Límites de presupuesto", + "costsQuotaShareSubtitle": "Compartir cuotas de proveedor entre claves", + "auditLogSubtitle": "Auditoría de autorización", + "auditMcpSubtitle": "Auditoría de servidor MCP", + "auditA2aSubtitle": "Auditoría de protocolo A2A", + "translatorSubtitle": "Conversión de formato", + "playgroundSubtitle": "Probar prompts en vivo", + "searchToolsSubtitle": "Registro de herramientas de búsqueda", + "memorySubtitle": "Memoria persistente del agente", + "omniSkillsSubtitle": "Registro de habilidades de sandbox", + "agentSkillsSubtitle": "Registro de habilidades A2A", + "mcpSubtitle": "Controles de servidor MCP", + "a2aSubtitle": "Servidor de protocolo A2A", + "pluginsSubtitle": "Marketplace e instalación de plugins", + "mediaSubtitle": "Archivos multimedia en caché", + "batchFilesSubtitle": "Archivos de entrada/salida por lotes", + "settingsSubtitle": "Todos los ajustes", + "settingsGeneralSubtitle": "Base de datos y copias de seguridad", + "settingsAppearanceSubtitle": "Tema y diseño", + "settingsAiSubtitle": "Valores predeterminados de comportamiento de IA", + "globalRoutingSubtitle": "Reglas de enrutamiento global", + "settingsResilienceSubtitle": "Reintentos y disyuntores", + "settingsAdvancedSubtitle": "Opciones para usuarios avanzados", + "settingsSecuritySubtitle": "Autenticación y cifrado", + "settingsAccessTokensSubtitle": "Tokens CLI con ámbito para modo remoto", "settingsFeatureFlagsSubtitle": "Alternar capacidades del sistema", - "settingsCacheSubtitle": "Model catalog and response caching", - "settingsSidebar": "Sidebar", - "settingsSidebarSubtitle": "Customize sidebar layout", + "settingsCacheSubtitle": "Catálogo de modelos y caché de respuestas", + "settingsSidebar": "Barra lateral", + "settingsSidebarSubtitle": "Personalizar diseño de la barra lateral", "settingsAuthzSubtitle": "Inventario de rutas y política de omisión", - "docsSubtitle": "Documentation", - "issuesSubtitle": "Report a bug", - "changelogSubtitle": "Release notes", - "costsQuotaPlans": "Plans & Quotas", - "costsQuotaPlansSubtitle": "Configure plans by provider", - "activity": "Activity", - "activitySubtitle": "Friendly feed of recent events", + "docsSubtitle": "Documentación", + "issuesSubtitle": "Informar de un error", + "changelogSubtitle": "Notas de la versión", + "costsQuotaPlans": "Planes y cuotas", + "costsQuotaPlansSubtitle": "Configurar planes por proveedor", + "activity": "Actividad", + "activitySubtitle": "Feed de eventos recientes", "logsGroup": "Logs", - "systemGroup": "System", - "costsOverview": "Overview", - "costsOverviewSubtitle": "Consolidated cost analysis", + "systemGroup": "Sistema", + "costsOverview": "Vista general", + "costsOverviewSubtitle": "Análisis consolidado de costes", "agentBridge": "Agent Bridge", - "agentBridgeSubtitle": "Intercept IDE agent traffic", - "trafficInspector": "Traffic Inspector", - "trafficInspectorSubtitle": "Monitor LLM calls + debug any HTTPS traffic", - "cliCode": "CLI Code", - "cliCodeSubtitle": "Code tools pointing to OmniRoute", - "cliAgents": "CLI Agents", - "cliAgentsSubtitle": "Autonomous CLI agents", - "acpAgents": "ACP Agents", - "acpAgentsSubtitle": "CLIs spawned by OmniRoute", - "skipToContent": "Skip to content", - "mainNavigation": "Main navigation", - "unpinSection": "Unpin section", - "pinSectionOpen": "Pin section open", - "reloadPage": "Reload Page", - "dragReorderSection": "Drag to reorder section", - "dragReorderItem": "Drag to reorder", - "cannotHide": "This item cannot be hidden", - "alwaysVisible": "Always visible", - "groupSeparatorLabel": "Separator", - "discovery": "Discovery", - "discoverySubtitle": "Scan providers for free access" + "agentBridgeSubtitle": "Interceptar tráfico de agentes IDE", + "trafficInspector": "Inspector de tráfico", + "trafficInspectorSubtitle": "Monitorizar llamadas LLM y depurar tráfico HTTPS", + "cliCode": "Código CLI", + "cliCodeSubtitle": "Herramientas de código que apuntan a OmniRoute", + "cliAgents": "Agentes CLI", + "cliAgentsSubtitle": "Agentes CLI autónomos", + "acpAgents": "Agentes ACP", + "acpAgentsSubtitle": "CLIs generadas por OmniRoute", + "skipToContent": "Saltar al contenido", + "mainNavigation": "Navegación principal", + "unpinSection": "Desanclar sección", + "pinSectionOpen": "Anclar sección abierta", + "reloadPage": "Recargar página", + "dragReorderSection": "Arrastrar para reordenar sección", + "dragReorderItem": "Arrastrar para reordenar", + "cannotHide": "Este elemento no se puede ocultar", + "alwaysVisible": "Siempre visible", + "groupSeparatorLabel": "Separador", + "discovery": "Descubrimiento", + "discoverySubtitle": "Escanear proveedores para acceso gratuito", + "radar": "Catálogo de Radar", + "radarSubtitle": "Catálogo de modelos gratuito enriquecido por la comunidad" }, "webhooks": { - "title": "Ganchos web", - "description": "Configure devoluciones de llamadas HTTP para eventos del sistema.", + "title": "Webhooks", + "description": "Configure callbacks HTTP para eventos del sistema.", "configuredWebhooks": "Webhooks configurados", - "configuredWebhooksDesc": "Administre puntos finales de entrega, eventos suscritos, estados y envíos de prueba.", + "configuredWebhooksDesc": "Administre endpoints de entrega, eventos suscritos, estados y envíos de prueba.", "addWebhook": "Agregar webhook", "editWebhook": "Editar webhook", "name": "Nombre", "namePlaceholder": "Monitoreo de producción", "unnamedWebhook": "Webhook sin nombre", - "url": "URL de punto final", + "url": "URL del endpoint", "events": "Eventos", "allEvents": "Todos los eventos", - "secret": "secreto", - "secretPlaceholder": "Déjelo en blanco para generar automáticamente un secreto.", - "secretEditPlaceholder": "Déjelo en blanco para mantener el secreto actual.", + "secret": "Secreto", + "secretPlaceholder": "Déjelo en blanco para generar automáticamente un secreto", + "secretEditPlaceholder": "Déjelo en blanco para mantener el secreto actual", "status": "Estado", "active": "Activo", "inactive": "Inactivo", "errored": "Error", - "total": "totales", + "total": "Totales", "lastTriggered": "Última activación", "actions": "Acciones", "enabled": "Habilitado", "enabledDesc": "Los webhooks deshabilitados permanecen guardados pero no reciben entregas.", "refresh": "Actualizar", "loading": "Cargando webhooks...", - "never": "nunca", - "failureCount": "{count, plural, =0 {no failures} one {# failure} other {# failures}}", + "never": "Nunca", + "failureCount": "{count, plural, =0 {sin fallos} one {# fallo} other {# fallos}}", "testWebhook": "Enviar prueba", "testSuccess": "El webhook de prueba se envió correctamente.", "testFailed": "El webhook de prueba falló.", - "saveSuccess": "Webhook guardado exitosamente.", + "saveSuccess": "Webhook guardado correctamente.", "saveFailed": "No se pudo guardar el webhook.", "loadFailed": "No se pudieron cargar los webhooks.", "delete": "Eliminar", @@ -1290,87 +1292,87 @@ "howItWorks": { "step1": "Elige un proveedor de integración (p. ej., Slack, Discord, webhook personalizado) y configura los detalles de conexión.", "step2": "Configura los eventos del sistema a los que suscribirse (p. ej., errores de completado, fallbacks de modelo o límites de uso).", - "step3": "Verifica la configuración enviando una carga útil de prueba para asegurarte de que el punto de conexión la recibe.", - "step4": "Protege tu extremo validando el encabezado X-Webhook-Signature HMAC-SHA256 utilizando el secreto del webhook.", - "title": "Cómo funcionan los Webhooks", - "customOnly": "Solo aplicable para integraciones con extremos personalizados.", + "step3": "Verifica la configuración enviando una carga útil de prueba para asegurarte de que el endpoint la recibe.", + "step4": "Protege tu endpoint validando el encabezado X-Webhook-Signature HMAC-SHA256 utilizando el secreto del webhook.", + "title": "Cómo funcionan los webhooks", + "customOnly": "Solo aplicable para integraciones con endpoints personalizados.", "hmacRecipeTitle": "Fórmula de verificación HMAC", "hmacRecipe": "Para verificar cargas de webhook en Node.js, calcula el HMAC-SHA256 del cuerpo sin procesar usando tu clave secreta y compáralo con X-Webhook-Signature usando timingSafeEqual.", "timeoutNote": "Los envíos de webhooks tienen un tiempo de espera de 10 segundos.", "retryNote": "Los envíos fallidos se reintentan hasta 5 veces con reintento exponencial.", - "docsLink": "Leer la guía completa para desarrolladores de Webhooks", + "docsLink": "Leer la guía completa para desarrolladores de webhooks", "hmacRecipePython": "Verificación HMAC en Python: hmac.new(secret, body, hashlib.sha256).hexdigest()", "hmacRecipeBash": "Verificación HMAC en Bash: echo -n \"$body\" | openssl dgst -sha256 -hmac \"$secret\"" }, "deliveries": { - "title": "Delivery Logs", - "loadFailed": "Failed to load webhook delivery logs.", - "empty": "No deliveries recorded yet. Trigger an event or send a test payload.", - "status": "Status", - "event": "Event", - "latency": "Latency", - "at": "Sent At" + "title": "Registros de entregas", + "loadFailed": "No se pudieron cargar los registros de entregas de webhooks.", + "empty": "Aún no se han registrado entregas. Activa un evento o envía una carga útil de prueba.", + "status": "Estado", + "event": "Evento", + "latency": "Latencia", + "at": "Enviado a las" }, "kinds": { - "comingSoon": "Coming Soon", + "comingSoon": "Próximamente", "slack": "Slack", - "slackDesc": "Post system events directly into a Slack channel", + "slackDesc": "Publicar eventos del sistema directamente en un canal de Slack", "telegram": "Telegram", - "telegramDesc": "Send event messages using a Telegram bot", + "telegramDesc": "Enviar mensajes de eventos mediante un bot de Telegram", "discord": "Discord", - "discordDesc": "Deliver real-time updates directly to a Discord server", - "custom": "Custom Webhook", - "customDesc": "Deliver system event payloads to any HTTPS endpoint", - "email": "Email Notification", - "emailDesc": "Receive summary updates via email", + "discordDesc": "Enviar actualizaciones en tiempo real directamente a un servidor de Discord", + "custom": "Webhook personalizado", + "customDesc": "Enviar cargas de eventos del sistema a cualquier endpoint HTTPS", + "email": "Notificación por correo", + "emailDesc": "Recibir actualizaciones resumidas por correo electrónico", "pagerduty": "PagerDuty", - "pagerdutyDesc": "Trigger alerts on PagerDuty for critical system issues", + "pagerdutyDesc": "Activar alertas en PagerDuty para incidencias críticas del sistema", "teams": "Microsoft Teams", - "teamsDesc": "Forward system notifications to Microsoft Teams channels" + "teamsDesc": "Reenviar notificaciones del sistema a canales de Microsoft Teams" }, - "testPayloadSent": "Prueba enviada", + "testPayloadSent": "Carga útil de prueba enviada", "testResponse": "Respuesta de prueba", "validateUrl": { - "checking": "Checking URL...", - "ok": "URL is valid", - "blockedPrivate": "URL is a blocked private address", - "invalidUrl": "Invalid URL format" + "checking": "Comprobando URL...", + "ok": "La URL es válida", + "blockedPrivate": "La URL es una dirección privada bloqueada", + "invalidUrl": "Formato de URL no válido" }, "custom": { - "endpointUrl": "Endpoint URL", + "endpointUrl": "URL del endpoint", "endpointUrlPlaceholder": "https://api.yourdomain.com/webhook", - "secretKey": "Secret Key", - "secretKeyPlaceholder": "Enter secret key or leave blank to auto-generate", - "secretKeyHint": "Used to sign the payload header for authentication." + "secretKey": "Clave secreta", + "secretKeyPlaceholder": "Introduce una clave secreta o déjalo en blanco para autogenerarla", + "secretKeyHint": "Se utiliza para firmar el encabezado de la carga útil para la autenticación." }, "discord": { - "webhookUrl": "Discord Webhook URL", + "webhookUrl": "URL de webhook de Discord", "webhookUrlPlaceholder": "https://discord.com/api/webhooks/...", - "webhookUrlHint": "The webhook URL copied from your Discord channel integration settings.", - "tutorial": "How to create a Discord webhook:" + "webhookUrlHint": "La URL de webhook copiada de los ajustes de integración de tu canal de Discord.", + "tutorial": "Cómo crear un webhook de Discord:" }, "slack": { - "webhookUrl": "Slack Webhook URL", + "webhookUrl": "URL de webhook de Slack", "webhookUrlPlaceholder": "https://hooks.slack.com/services/...", - "webhookUrlHint": "The webhook URL copied from your Slack Incoming Webhooks integration.", - "tutorial": "How to create a Slack webhook:" + "webhookUrlHint": "La URL de webhook copiada de tu integración de webhooks entrantes de Slack.", + "tutorial": "Cómo crear un webhook de Slack:" }, "telegram": { - "botToken": "Telegram Bot Token", + "botToken": "Token del bot de Telegram", "botTokenPlaceholder": "123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ", - "botTokenHint": "The HTTP API token received from @BotFather when creating your bot.", - "chatId": "Telegram Chat ID / Channel", - "chatIdPlaceholder": "-100123456789 or @channelname", - "chatIdHint": "The unique numerical identifier or public username of the chat/channel.", - "tutorial": "How to configure Telegram webhook:" + "botTokenHint": "El token de la API HTTP recibido de @BotFather al crear tu bot.", + "chatId": "ID de chat / Canal de Telegram", + "chatIdPlaceholder": "-100123456789 o @channelname", + "chatIdHint": "El identificador numérico único o el nombre de usuario público del chat o canal.", + "tutorial": "Cómo configurar el webhook de Telegram:" } }, "compliance": { "auditTitle": "Auditoría", - "auditDescription": "Revise los eventos de cumplimiento y las llamadas a herramientas MCP desde una vista operativa.", + "auditDescription": "Revisa los eventos de cumplimiento y las llamadas a herramientas MCP desde una vista operativa.", "complianceTab": "Cumplimiento", "mcpTab": "Auditoría MCP", - "title": "Auditoría de Cumplimiento", + "title": "Auditoría de cumplimiento", "description": "Eventos de política, acceso, proveedor y seguridad registrados por el registro de auditoría de cumplimiento.", "eventType": "Tipo de evento", "eventTypePlaceholder": "Filtrar por acción o tipo de evento", @@ -1381,12 +1383,12 @@ "critical": "Crítico", "sourceIp": "IP de origen", "userOrKey": "Usuario / Clave", - "action": "acción", + "action": "Acción", "result": "Resultado", "details": "Detalles", "timestamp": "Marca de tiempo", - "from": "De", - "to": "a", + "from": "Desde", + "to": "Hasta", "refresh": "Actualizar", "export": "Exportar", "clearFilters": "Limpiar filtros", @@ -1395,7 +1397,7 @@ "policyViolation": "Violación de política", "accessDenied": "Acceso denegado", "injectionBlocked": "Inyección bloqueada", - "noEvents": "No se registraron eventos de cumplimiento.", + "noEvents": "No se han registrado eventos de cumplimiento.", "failedFetch": "No se pudo recuperar el registro de auditoría de cumplimiento.", "viewDetails": "Ver detalles", "closeDetails": "Cerrar detalles", @@ -1404,36 +1406,36 @@ "previous": "Anterior", "next": "Siguiente", "mcpAudit": "Auditoría MCP", - "mcpAuditDesc": "Entradas de auditoría de llamadas de herramientas registradas por el servidor MCP.", + "mcpAuditDesc": "Entradas de auditoría de llamadas a herramientas registradas por el servidor MCP.", "failedFetchMcpAudit": "No se pudo recuperar el registro de auditoría de MCP.", "tool": "Herramienta", "toolPlaceholder": "Filtrar por nombre de herramienta", "duration": "Duración", - "apiKey": "Clave API", + "apiKey": "Clave de API", "output": "Salida", "allResults": "Todos los resultados", "success": "Éxito", - "failure": "fracaso", - "noMcpEvents": "No se registraron eventos de auditoría de MCP.", + "failure": "Fallo", + "noMcpEvents": "No se han registrado eventos de auditoría de MCP.", "a2aAudit": "Auditoría A2A", - "a2aAuditDesc": "Pista de auditoría de ejecución de tareas registrada por el servidor A2A.", + "a2aAuditDesc": "Registro de auditoría de ejecución de tareas registrado por el servidor A2A.", "a2aShowingTasks": "Mostrando {count} de {total} tareas", "a2aSkill": "Habilidad", "a2aSkillPlaceholder": "Filtrar por nombre de habilidad", "a2aState": "Estado", "a2aAllStates": "Todos los estados", "a2aStateSubmitted": "Enviado", - "a2aStateWorking": "trabajando", + "a2aStateWorking": "En proceso", "a2aStateCompleted": "Completado", "a2aStateFailed": "Fallido", "a2aStateCancelled": "Cancelado", "a2aTaskId": "ID de tarea", "a2aEvents": "Eventos", "a2aArtifacts": "Artefactos", - "a2aNoTasks": "No se registraron tareas A2A.", + "a2aNoTasks": "No se han registrado tareas A2A.", "a2aLoadingTasks": "Cargando tareas A2A...", "actor": "Actor", - "actorPlaceholder": "Filter by actor", + "actorPlaceholder": "Filtrar por actor", "eventTypes": { "apiKey.activate": "Clave de API activada", "apiKey.ban": "Clave de API bloqueada", @@ -1457,18 +1459,18 @@ "provider.credentials.bulk_imported": "Credenciales de proveedor importadas de forma masiva", "provider.credentials.created": "Credenciales de proveedor creadas", "provider.credentials.imported": "Credenciales de proveedor importadas", - "provider.credentials.revoked": "Credenciales del proveedor revocadas", - "provider.credentials.updated": "Credenciales del proveedor actualizadas", - "provider.validation.ssrf_blocked": "SSRF del proveedor bloqueado", + "provider.credentials.revoked": "Credenciales de proveedor revocadas", + "provider.credentials.updated": "Credenciales de proveedor actualizadas", + "provider.validation.ssrf_blocked": "SSRF de proveedor bloqueado", "quota.plan.updated": "Plan de cuota actualizado", "quota.pool.created": "Grupo de cuotas creado", "quota.pool.deleted": "Grupo de cuotas eliminado", "quota.pool.updated": "Grupo de cuotas actualizado", "quota.store.driver_changed": "Controlador de almacenamiento de cuotas cambiado", "server.start": "Inicio del servidor", - "service.reveal_api_key": "Clave API del servicio revelada", - "settings.update": "Configuración actualizada", - "settings.update_failed": "Error al actualizar la configuración", + "service.reveal_api_key": "Clave de API del servicio revelada", + "settings.update": "Ajustes actualizados", + "settings.update_failed": "Error al actualizar los ajustes", "sync.token.created": "Token de sincronización creado", "sync.token.revoked": "Token de sincronización revocado" } @@ -1478,186 +1480,186 @@ "description": "Elige un tema preestablecido o crea el tuyo propio con un solo color", "presetColors": "Colores populares", "customTheme": "Tema personalizado", - "customThemeDesc": "Haga clic en crear tema y elija un color", + "customThemeDesc": "Haz clic en crear tema y elige un color", "createTheme": "Crear tema", "activePreset": "Tema activo" }, "header": { "logout": "Cerrar sesión", - "quickNavigation": "Quick nav", - "quickNavigationTitle": "Quick navigation (⌘K / Ctrl+K)", - "openQuickNavigation": "Open quick navigation", - "switchToLightMode": "Switch to light mode", - "switchToDarkMode": "Switch to dark mode", + "quickNavigation": "Navegación rápida", + "quickNavigationTitle": "Navegación rápida (⌘K / Ctrl+K)", + "openQuickNavigation": "Abrir navegación rápida", + "switchToLightMode": "Cambiar a modo claro", + "switchToDarkMode": "Cambiar a modo oscuro", "language": "Idioma", "providers": "Proveedores", - "providerDescription": "Gestiona tus conexiones de proveedores de IA", + "providerDescription": "Gestiona tus conexiones con proveedores de IA", "combos": "Combos", "comboDescription": "Combinaciones de modelos con fallback", - "usage": "Uso y análisis", - "usageDescription": "Supervise el uso de su API, el consumo de tokens y los registros de solicitudes", + "usage": "Uso y analíticas", + "usageDescription": "Supervisa el uso de la API, el consumo de tokens y los logs de solicitudes", "analytics": "Analíticas", - "analyticsDescription": "Gráficos, tendencias y conocimientos de evaluación", + "analyticsDescription": "Gráficos, tendencias e información de evaluación", "cliTools": "Herramientas CLI", - "cliToolsDescription": "Configurar herramientas CLI", + "cliToolsDescription": "Configura herramientas de CLI", "home": "Inicio", - "homeDescription": "Bienvenido a OmniRoute", + "homeDescription": "Te damos la bienvenida a OmniRoute", "endpoint": "Endpoints", - "endpointDescription": "Gestionar endpoints proxy, MCP, A2A y endpoints de API", - "mcp": "MCP", - "mcpDescription": "Model Context Protocol server management and tools", - "a2a": "A2A", - "a2aDescription": "Agent-to-Agent protocol tasks and observability", - "settings": "Configuración", + "endpointDescription": "Gestiona endpoints proxy, MCP, A2A y endpoints de API", + "mcp": "Servidor MCP", + "mcpDescription": "Gestión del servidor y herramientas del protocolo Model Context Protocol", + "a2a": "Servidor A2A", + "a2aDescription": "Tareas y observabilidad del protocolo Agent-to-Agent", + "settings": "Ajustes", "settingsDescription": "Gestiona tus preferencias", "openaiCompatible": "Compatible con OpenAI", "anthropicCompatible": "Compatible con Anthropic", - "media": "Medios de comunicación", - "mediaDescription": "Genera imágenes, vídeos y música.", + "media": "Multimedia", + "mediaDescription": "Genera imágenes, vídeos y música", "themes": "Temas", - "themesDescription": "Elija un tema de color para todo el panel del tablero", - "costsDescription": "Track spending, analyze trends, and manage your AI budget across all providers", - "cacheDescription": "Monitor provider prompt cache efficiency and local semantic response reuse.", - "limitsDescription": "Configure rate limits and quotas per API key and provider", - "runtimeDescription": "Live runtime observability — circuit breakers, cooldowns, model lockouts, sessions and quota alerts", - "apiManagerDescription": "Manage API keys and access control for your OmniRoute instance", - "batchDescription": "Process large volumes of requests asynchronously with batched API calls", - "contextCavemanDescription": "Rule-based message compression, language packs, analytics and output mode controls.", - "contextRtkDescription": "Command-aware compression for tool output, terminal logs and build results.", - "contextCombosDescription": "Define how engines are combined for different routing scenarios.", - "changelogDescription": "Stay up to date with the latest platform features and announcements.", - "agentsDescription": "Manage and configure AI agent tools: Codex, Devin, Jules, and custom agents", - "cloudAgentsDescription": "Orchestrate cloud-based AI agents with live task tracking and plan approval", - "memoryDescription": "Persistent conversational memory with semantic search and FTS5 full-text indexing", - "skillsDescription": "Install and manage sandbox skills for automated prompt and tool execution", - "agentSkillsDescription": "Agent-ready skills catalog with one-click URL copy for AI client integration", - "translatorDescription": "Translate and test prompts across API formats: OpenAI ↔ Claude ↔ Gemini", - "playgroundDescription": "Test prompts interactively with live provider responses and format inspection", - "searchToolsDescription": "Search analytics, provider breakdown, cache hit rates, and cost tracking", - "logsDescription": "Real-time request logs, error traces, and streaming event inspector", - "auditDescription": "Compliance audit trail of API key usage, MCP tool calls, and policy events", - "webhooksDescription": "Configure webhook endpoints to receive real-time event notifications", - "healthDescription": "System health overview: providers, circuit breakers, rate limits, and database", - "proxyDescription": "Configure upstream proxy settings for outbound provider connections", - "apiEndpointsDescription": "Manage custom API endpoint configurations and routing overrides", - "batchFilesDescription": "Browse and manage batch job output files and results", - "analyticsEvalsDescription": "Model evaluation results and performance benchmarks", - "analyticsSearchDescription": "Search query analytics, cache hit rates, and cost tracking", - "analyticsUtilizationDescription": "Provider utilization metrics and capacity planning", - "analyticsComboHealthDescription": "Real-time health and performance of combo routing configurations", - "analyticsCompressionDescription": "Context compression analytics and token savings", - "costsBudgetDescription": "Budget limits and spending alerts per API key and provider", - "costsPricingDescription": "Custom pricing configuration for token cost calculations", - "logsProxyDescription": "Upstream proxy request logs and traffic inspection", - "logsConsoleDescription": "Application console output and debug logs", - "logsActivityDescription": "Audit trail of user actions and system events", - "auditMcpDescription": "MCP tool invocation audit trail and compliance records", + "themesDescription": "Elige un tema de color para todo el panel de control", + "costsDescription": "Controla el gasto, analiza tendencias y gestiona tu presupuesto de IA en todos los proveedores", + "cacheDescription": "Supervisa la eficiencia de la caché de prompts del proveedor y la reutilización local de respuestas semánticas.", + "limitsDescription": "Configura rate limits y cuotas por clave de API y proveedor", + "runtimeDescription": "Observabilidad del runtime en tiempo real: circuit breakers, cooldowns, bloqueos de modelos, sesiones y alertas de cuota", + "apiManagerDescription": "Gestiona claves de API y el control de acceso para tu instancia de OmniRoute", + "batchDescription": "Procesa grandes volúmenes de solicitudes de forma asíncrona mediante llamadas a la API por lotes", + "contextCavemanDescription": "Compresión de mensajes basada en reglas, paquetes de idioma, analíticas y controles del modo de salida.", + "contextRtkDescription": "Compresión adaptada a comandos para salidas de herramientas, logs de terminal y resultados de compilación.", + "contextCombosDescription": "Define cómo se combinan los motores para diferentes escenarios de enrutamiento.", + "changelogDescription": "Mantente al día de las últimas funciones y anuncios de la plataforma.", + "agentsDescription": "Gestiona y configura herramientas de agentes de IA: Codex, Devin, Jules y agentes personalizados", + "cloudAgentsDescription": "Orquesta agentes de IA en la nube con seguimiento de tareas en directo y aprobación de planes", + "memoryDescription": "Memoria conversacional persistente con búsqueda semántica e indexación de texto completo FTS5", + "skillsDescription": "Instala y gestiona habilidades en sandbox para la ejecución automatizada de prompts y herramientas", + "agentSkillsDescription": "Catálogo de habilidades listas para agentes con copia de URL en un clic para integración con clientes de IA", + "translatorDescription": "Traduce y prueba prompts entre formatos de API: OpenAI ↔ Claude ↔ Gemini", + "playgroundDescription": "Prueba prompts de forma interactiva con respuestas del proveedor en directo e inspección de formatos", + "searchToolsDescription": "Analítica de búsquedas, desglose de proveedores, tasa de aciertos de caché y seguimiento de costes", + "logsDescription": "Logs de solicitudes en tiempo real, trazas de errores e inspector de eventos de streaming", + "auditDescription": "Registro de auditoría de cumplimiento del uso de claves de API, llamadas a herramientas MCP y eventos de directivas", + "webhooksDescription": "Configura endpoints de webhook para recibir notificaciones de eventos en tiempo real", + "healthDescription": "Estado de salud del sistema: proveedores, circuit breakers, rate limits y base de datos", + "proxyDescription": "Configura los ajustes de proxy upstream para conexiones salientes de proveedores", + "apiEndpointsDescription": "Gestiona configuraciones personalizadas de endpoints de API y ajustes de enrutamiento", + "batchFilesDescription": "Examina y gestiona archivos de salida y resultados de trabajos por lotes", + "analyticsEvalsDescription": "Resultados de evaluación de modelos y benchmarks de rendimiento", + "analyticsSearchDescription": "Analítica de consultas de búsqueda, tasa de aciertos de caché y seguimiento de costes", + "analyticsUtilizationDescription": "Métricas de uso de proveedores y planificación de capacidad", + "analyticsComboHealthDescription": "Estado y rendimiento en tiempo real de las configuraciones de enrutamiento de combos", + "analyticsCompressionDescription": "Analíticas de compresión de contexto y ahorro de tokens", + "costsBudgetDescription": "Límites de presupuesto y alertas de gasto por clave de API y proveedor", + "costsPricingDescription": "Configuración de precios personalizados para el cálculo de costes de tokens", + "logsProxyDescription": "Logs de solicitudes del proxy upstream e inspección de tráfico", + "logsConsoleDescription": "Salida por consola de la aplicación y logs de depuración", + "logsActivityDescription": "Registro de auditoría de acciones de usuarios y eventos del sistema", + "auditMcpDescription": "Registro de auditoría e historial de cumplimiento de invocaciones de herramientas MCP", "auditA2a": "Auditoría A2A", "auditA2aDescription": "Registro de auditoría de ejecución de tareas A2A, transiciones de estado y registros de invocación de habilidades", - "settingsGeneralDescription": "Storage, database, and general instance configuration", - "settingsAppearanceDescription": "Theme, branding, and visual customization", - "settingsAiDescription": "AI behaviors, thinking budgets, vision, and memory settings", - "settingsCacheDescription": "TTL for model catalog cache entries", - "settingsSecurityDescription": "Authentication, authorization, and access control settings", - "featureFlags": "Banderas de características", - "featureFlagsDescription": "Capacidades del sistema de control y características experimentales.", - "featureFlagsActive": "{count} activo", - "featureFlagsInactive": "{count} inactivo", - "featureFlagsOverrides": "{count} Ajustes específicos de base de datos", - "featureFlagsSearch": "Buscar banderas...", - "featureFlagsCategoryAll": "Todos", + "settingsGeneralDescription": "Almacenamiento, base de datos y configuración general de la instancia", + "settingsAppearanceDescription": "Tema, imagen de marca y personalización visual", + "settingsAiDescription": "Comportamientos de IA, presupuestos de razonamiento, visión y ajustes de memoria", + "settingsCacheDescription": "TTL para las entradas de caché del catálogo de modelos", + "settingsSecurityDescription": "Ajustes de autenticación, autorización y control de acceso", + "featureFlags": "Feature flags", + "featureFlagsDescription": "Controla las capacidades del sistema y las funciones experimentales", + "featureFlagsActive": "{count} activas", + "featureFlagsInactive": "{count} inactivas", + "featureFlagsOverrides": "{count} modificaciones en BD", + "featureFlagsSearch": "Buscar flags...", + "featureFlagsCategoryAll": "Todas", "featureFlagsCategorySecurity": "Seguridad", "featureFlagsCategoryNetwork": "Red", "featureFlagsCategoryPolicies": "Políticas", - "featureFlagsCategoryRuntime": "Tiempo de ejecución", + "featureFlagsCategoryRuntime": "Runtime", "featureFlagsCategoryCli": "CLI", "featureFlagsCategoryHealth": "Salud", - "featureFlagsSourceDb": "DB", + "featureFlagsSourceDb": "BD", "featureFlagsSourceEnv": "ENV", "featureFlagsSourceDefault": "DEF", - "featureFlagsReset": "Reiniciar", - "featureFlagsResetAll": "Restablecer todas las Ajustes específicos", - "featureFlagsResetAllConfirm": "¿Está seguro de que desea restablecer todas las Ajustes específicos de indicadores de funciones? Esto revertirá todos los indicadores a sus valores ENV o predeterminados.", - "featureFlagsRestartRequired": "Es necesario reiniciar para aplicar", - "featureFlagsNoResults": "Ninguna bandera coincide con tu búsqueda", - "featureFlagsSaved": "Bandera actualizada", - "featureFlagsError": "No se pudo actualizar la bandera", - "settingsRoutingDescription": "Routing rules, model aliases, combo defaults, and degradation settings", - "settingsResilienceDescription": "Circuit breaker, retry, and fallback configuration", - "settingsAdvancedDescription": "Advanced payload rules, request limits, and proxy API settings", - "mitmProxyDescription": "Configure MITM proxy settings for traffic inspection and debugging", - "oneProxyDescription": "Configure 1Proxy settings for advanced proxy chaining", - "omniSkillsDescription": "Install and manage sandbox skills for automated prompt and tool execution" + "featureFlagsReset": "Restablecer", + "featureFlagsResetAll": "Restablecer todas las modificaciones", + "featureFlagsResetAllConfirm": "¿Seguro que quieres restablecer todas las modificaciones de feature flags? Esto revertirá todos los flags a sus valores de ENV o predeterminados.", + "featureFlagsRestartRequired": "Se requiere reiniciar para aplicar", + "featureFlagsNoResults": "Ningún flag coincide con tu búsqueda", + "featureFlagsSaved": "Flag actualizado", + "featureFlagsError": "No se pudo actualizar el flag", + "settingsRoutingDescription": "Reglas de enrutamiento, alias de modelos, valores predeterminados de combos y ajustes de degradación", + "settingsResilienceDescription": "Configuración de circuit breaker, reintentos y fallback", + "settingsAdvancedDescription": "Reglas avanzadas de payload, límites de solicitudes y ajustes de API de proxy", + "mitmProxyDescription": "Configura los ajustes de proxy MITM para la inspección y depuración del tráfico", + "oneProxyDescription": "Configura los ajustes de 1Proxy para el encadenamiento avanzado de proxies", + "omniSkillsDescription": "Instala y gestiona habilidades en sandbox para la ejecución automatizada de prompts y herramientas" }, "cloudSyncStatus": { - "synced": "Synced", - "syncing": "Syncing...", - "off": "Sync off", - "error": "Sync error", - "disabled": "Disabled", - "connected": "connected", - "disconnected": "disconnected", - "lastSync": "Remote settings sync {status} — Last sync: {time}", - "statusLabel": "Remote settings sync status: {status}" + "synced": "Sincronizado", + "syncing": "Sincronizando...", + "off": "Sincronización desactivada", + "error": "Error de sincronización", + "disabled": "Desactivado", + "connected": "conectado", + "disconnected": "desconectado", + "lastSync": "Sincronización de ajustes remotos {status} — Última sincronización: {time}", + "statusLabel": "Estado de sincronización de ajustes remotos: {status}" }, "breadcrumbs": { - "ariaLabel": "Breadcrumb", - "dashboard": "Dashboard", - "providers": "Providers", + "ariaLabel": "Migas de pan", + "dashboard": "Panel de control", + "providers": "Proveedores", "combos": "Combos", - "settings": "Settings", + "settings": "Ajustes", "general": "General", - "appearance": "Appearance", - "ai": "AI Settings", - "routing": "Routing", - "resilience": "Resilience", - "advanced": "Advanced", - "accessTokens": "Access Tokens", - "featureFlags": "Feature Flags", + "appearance": "Apariencia", + "ai": "Ajustes de IA", + "routing": "Enrutamiento", + "resilience": "Resiliencia", + "advanced": "Avanzado", + "accessTokens": "Tokens de acceso", + "featureFlags": "Feature flags", "logs": "Logs", - "auditLog": "Audit Log", - "console": "Console", + "auditLog": "Registro de auditoría", + "console": "Consola", "logger": "Logger", - "translator": "Translator", + "translator": "Traductor", "playground": "Playground", - "add": "Add", - "edit": "Edit", - "apiKeys": "API Keys", - "models": "Models", - "cliCode": "CLI Code", - "cliAgents": "CLI Agents", - "acpAgents": "ACP Agents", + "add": "Añadir", + "edit": "Editar", + "apiKeys": "Claves de API", + "models": "Modelos", + "cliCode": "Código CLI", + "cliAgents": "Agentes CLI", + "acpAgents": "Agentes ACP", "endpoint": "Endpoint", - "apiManager": "API Manager", - "context": "Context", - "compression": "Compression", - "services": "Services", - "analytics": "Analytics", - "costs": "Costs", - "health": "Health", + "apiManager": "Gestor de API", + "context": "Contexto", + "compression": "Compresión", + "services": "Servicios", + "analytics": "Analíticas", + "costs": "Costes", + "health": "Salud", "runtime": "Runtime", "webhooks": "Webhooks", - "home": "Home", - "activity": "Activity", + "home": "Inicio", + "activity": "Actividad", "agentSkills": "AgentSkills", - "comboHealth": "Combo Health", - "evals": "Evals", - "search": "Search", - "utilization": "Utilization", - "apiEndpoints": "API Endpoints", - "audit": "Audit", + "comboHealth": "Estado de combos", + "evals": "Evaluaciones", + "search": "Búsqueda", + "utilization": "Uso", + "apiEndpoints": "Endpoints de API", + "audit": "Auditoría", "a2a": "A2A", "mcp": "MCP", - "batch": "Batch", - "files": "Files", - "media": "Media", - "cache": "Cache", - "changelog": "Changelog", + "batch": "Lotes", + "files": "Archivos", + "media": "Multimedia", + "cache": "Caché", + "changelog": "Registro de cambios", "chaos": "Chaos", - "cloudAgents": "Cloud Agents", - "live": "Live", + "cloudAgents": "Agentes en la nube", + "live": "En directo", "studio": "Studio", - "aggressive": "Aggressive", + "aggressive": "Agresivo", "caveman": "Caveman", "ccr": "CCR", "headroom": "Headroom", @@ -1665,44 +1667,44 @@ "llmlingua": "LLMLingua", "omniglyph": "OmniGlyph", "rtk": "RTK", - "sessionDedup": "Session Dedup", + "sessionDedup": "Deduplicación de sesión", "ultra": "Ultra", - "budget": "Budget", - "pricing": "Pricing", - "quotaShare": "Quota Share", - "discovery": "Discovery", - "freeProviderRankings": "Free Provider Rankings", - "freeTiers": "Free Tiers", - "gamification": "Gamification", - "leaderboard": "Leaderboard", - "limits": "Limits", - "profile": "Profile", + "budget": "Presupuesto", + "pricing": "Precios", + "quotaShare": "Cuota compartida", + "discovery": "Descubrimiento", + "freeProviderRankings": "Ranking de proveedores gratuitos", + "freeTiers": "Planes gratuitos", + "gamification": "Gamificación", + "leaderboard": "Clasificación", + "limits": "Límites", + "profile": "Perfil", "plugins": "Plugins", - "providerStats": "Provider Stats", - "new": "New", - "quota": "Quota", + "providerStats": "Estadísticas de proveedor", + "new": "Nuevo", + "quota": "Cuota", "relay": "Relay", - "searchTools": "Search Tools", - "security": "Security", - "sidebar": "Sidebar", + "searchTools": "Herramientas de búsqueda", + "security": "Seguridad", + "sidebar": "Barra lateral", "tokens": "Tokens", - "tools": "Tools", + "tools": "Herramientas", "agentBridge": "Agent Bridge", - "trafficInspector": "Traffic Inspector", - "usage": "Usage" + "trafficInspector": "Inspector de tráfico", + "usage": "Uso" }, "home": { "quickStart": "Inicio rápido", - "quickStartDesc": "Empieza en 4 pasos. Conecta proveedores, enruta modelos y monitorea todo.", + "quickStartDesc": "Empieza en 4 pasos. Conecta proveedores, enruta modelos y supervisa todo.", "fullDocs": "Documentación completa", - "step1Title": "1. Crear clave API", - "step1Desc": "Ve a Endpoint -> Claves registradas. Genera una clave por entorno.", + "step1Title": "1. Crear clave de API", + "step1Desc": "Ve a API Keys. Genera una clave por entorno.", "step2Title": "2. Conectar proveedores", - "step2Desc": "Agrega cuentas en Proveedores. Soporta OAuth, API Key y planes gratuitos.", + "step2Desc": "Agrega cuentas en Proveedores. Soporta OAuth, clave de API y planes gratuitos.", "step3Title": "3. Configura tu cliente", - "step3Desc": "Configura la URL base como {url} en tu IDE o cliente API.", + "step3Desc": "Configura la URL base como {url} en tu IDE o cliente de API.", "step4Title": "4. Supervisar y optimizar", - "step4Desc": "Supervisa tokens, costos y errores en Registros y Analíticas.", + "step4Desc": "Haz seguimiento de tokens, costes y errores en Registros de solicitudes y Analíticas.", "providersOverview": "Descripción general de proveedores", "configuredOf": "{configured} configurado de {total} proveedores disponibles", "noModelsAvailable": "No hay modelos disponibles para este proveedor.", @@ -1710,373 +1712,373 @@ "addProvider": "Agregar un proveedor", "configureFirst": "Configure una conexión primero en {providers}", "configureProvider": "Configurar proveedor", - "modelAvailable": "Modelo {count} disponible", + "modelAvailable": "{count} modelo disponible", "modelsAvailable": "{count} modelos disponibles", "connectionsActive": "{count} conexión activa", "connectionsActivePlural": "{count} conexiones activas", "copyModelName": "Copiar nombre del modelo", "documentation": "Documentación", "healthMonitor": "Monitor de salud", - "reportIssue": "Informar problema", + "reportIssue": "Informar de un problema", "activeError": "{active} activo · {errors} error", "oauthLabel": "OAuth", - "apiKeyLabel": "Clave API", - "requestsShort": "{count} reqs", + "apiKeyLabel": "Clave de API", + "requestsShort": "{count} solicitudes", "providerModelsTitle": "{provider} - Modelos", "copiedModel": "Copiado: {model}", "aliasLabel": "alias", "updateNow": "Actualizar ahora", "updating": "Actualizando...", - "updateAvailableDesc": "Hay una nueva versión disponible. Haga clic para actualizar.", + "updateAvailableDesc": "Hay una nueva versión disponible. Haz clic para actualizar.", "updateStarted": "Actualización iniciada...", "reloadingPageAutomatically": "Recargando página automáticamente...", "providerTopology": "Topología del proveedor" }, "analytics": { - "title": "Analítica", + "title": "Analíticas", "usageAnalyticsTitle": "Análisis de uso", "diversityScoreTitle": "Diversidad de proveedores", - "diversityScoreDesc": "Muestra la concentración de proveedores para la ventana de tráfico reciente.", + "diversityScoreDesc": "Instantánea de la concentración de proveedores para la ventana de tráfico reciente.", "diversityShannonEntropy": "Entropía de Shannon", - "diversityWindow": "Ventana: {count} solic. · Últimos {mins} mins", + "diversityWindow": "Ventana: {count} solicitudes · Últimos {mins} min", "diversityHealthy": "Distribución saludable", - "diversityRiskHigh": "High Vendor Lock-in Risk", - "diversityRiskModerate": "Moderate Distribution", - "diversityScoreLabel": "score", - "diversityHigherExplanation": "Higher values mean traffic is spread across multiple providers.", - "diversityNoData": "No recent usage data available.", - "chartRequests": "Requests", - "chartInput": "Input", - "chartOutput": "Output", + "diversityRiskHigh": "Alto riesgo de dependencia de proveedor", + "diversityRiskModerate": "Distribución moderada", + "diversityScoreLabel": "puntuación", + "diversityHigherExplanation": "Los valores más altos significan que el tráfico se distribuye entre múltiples proveedores.", + "diversityNoData": "No hay datos de uso recientes disponibles.", + "chartRequests": "Solicitudes", + "chartInput": "Entrada", + "chartOutput": "Salida", "chartTotal": "Total", - "chartCost": "Cost", - "chartShare": "Share", - "chartServiceTier": "Service Tier", - "chartServiceTierSplit": "Fast / Standard cost split", - "chartCostPct": "{pct}% of cost", - "chartUsageDetail": "Usage Detail", - "chartCacheRead": "Cache read", - "chartCostByProvider": "Cost by Provider", - "chartNoCostData": "No cost data", - "chartModelUsageOverTime": "Model Usage Over Time", - "chartNoData": "No data", - "chartWeekly": "Weekly", - "activitySummary": "{active} active days · {tokens} tokens · {days} days", + "chartCost": "Coste", + "chartShare": "Cuota", + "chartServiceTier": "Nivel de servicio", + "chartServiceTierSplit": "División de costes Fast / Standard", + "chartCostPct": "{pct}% del coste", + "chartUsageDetail": "Detalle de uso", + "chartCacheRead": "Lectura de caché", + "chartCostByProvider": "Coste por proveedor", + "chartNoCostData": "Sin datos de costes", + "chartModelUsageOverTime": "Uso del modelo a lo largo del tiempo", + "chartNoData": "Sin datos", + "chartWeekly": "Semanal", + "activitySummary": "{active} días activos · {tokens} tokens · {days} días", "activityCellTitle": "{date}: {tokens} tokens", - "activityLess": "Less", - "activityMore": "More", - "chartApiKeyBreakdown": "API Key Breakdown", - "chartApiKey": "API Key", - "mostActiveDay": "Most Active Day", + "activityLess": "Menos", + "activityMore": "Más", + "chartApiKeyBreakdown": "Desglose por clave de API", + "chartApiKey": "Clave de API", + "mostActiveDay": "Día más activo", "datedTokenCount": "{date} · {tokens} tokens", - "noDataLast7Days": "No data in the last 7 days", - "requestTokenSummary": "{requests} requests · {tokens} tokens", - "chartByAccount": "By Account", - "chartByApiKey": "By API Key", - "unknownApiKey": "Unknown API key", - "chartModelBreakdown": "Model Breakdown", - "chartModel": "Model", - "chartProvider": "Provider", - "chartProviderBreakdown": "Provider Breakdown", - "chartDate": "Date", - "chartRequestsByProviderDate": "Requests by Provider & Date", - "filterAllKeys": "All Keys", - "filterSearchKeys": "Search keys…", - "filterNoKeysMatch": "No keys match", - "filterOneKey": "1 key", - "filterMultipleKeys": "{count} keys", - "rangeToday": "Today", - "rangeYesterday": "Yesterday", - "rangeLast3Days": "Last 3 days", - "rangeThisWeek": "This week", - "rangeLast14Days": "Last 14 days", - "rangeThisMonth": "This month", - "rangeQuickSelect": "Quick Select", - "rangeStart": "Start", - "rangeEnd": "End", - "rangeCancel": "Cancel", - "rangeApply": "Apply", - "rangeErrorInvalid": "Start must be before end", + "noDataLast7Days": "Sin datos en los últimos 7 días", + "requestTokenSummary": "{requests} solicitudes · {tokens} tokens", + "chartByAccount": "Por cuenta", + "chartByApiKey": "Por clave de API", + "unknownApiKey": "Clave de API desconocida", + "chartModelBreakdown": "Desglose por modelo", + "chartModel": "Modelo", + "chartProvider": "Proveedor", + "chartProviderBreakdown": "Desglose por proveedor", + "chartDate": "Fecha", + "chartRequestsByProviderDate": "Solicitudes por proveedor y fecha", + "filterAllKeys": "Todas las claves", + "filterSearchKeys": "Buscar claves...", + "filterNoKeysMatch": "No hay coincidencias", + "filterOneKey": "1 clave", + "filterMultipleKeys": "{count} claves", + "rangeToday": "Hoy", + "rangeYesterday": "Ayer", + "rangeLast3Days": "Últimos 3 días", + "rangeThisWeek": "Esta semana", + "rangeLast14Days": "Últimos 14 días", + "rangeThisMonth": "Este mes", + "rangeQuickSelect": "Selección rápida", + "rangeStart": "Inicio", + "rangeEnd": "Fin", + "rangeCancel": "Cancelar", + "rangeApply": "Aplicar", + "rangeErrorInvalid": "La fecha de inicio debe ser anterior a la de fin", "period1D": "1D", "period7D": "7D", "period30D": "30D", "period90D": "90D", "periodYTD": "YTD", - "periodAll": "All", + "periodAll": "Todo", "totalTokens": "Total de tokens", - "inputTokens": "Input Tokens", - "outputTokens": "Output Tokens", - "estCost": "Est. Cost", - "infraTitle": "Infrastructure", - "infraAccounts": "Accounts", - "infraProviders": "Providers", - "infraApiKeys": "API Keys", - "infraModels": "Models", - "perfTitle": "Performance", - "perfAvgTokens": "Avg Tokens/Req", - "perfCostReq": "Cost/Req", - "perfIoRatio": "I/O Ratio", - "perfFastReq": "Fast Requests", - "highlightsTitle": "Highlights", - "highlightsTopModel": "Top Model", - "highlightsTopProvider": "Top Provider", - "highlightsBusiestDay": "Busiest Day", - "highlightsDiversity": "Diversity", - "highlightsFallbackRate": "Fallback Rate", - "customRange": "Rango personalizado", - "overviewDescription": "Supervise sus patrones de uso de API, consumo de tokens, costos y tendencias de actividad en todos los proveedores y modelos.", - "evalsDescription": "Ejecute conjuntos de evaluación para probar y validar sus puntos finales de LLM. Compare la calidad del modelo, detecte regresiones y compare la latencia.", + "inputTokens": "Tokens de entrada", + "outputTokens": "Tokens de salida", + "estCost": "Coste est.", + "infraTitle": "Infraestructura", + "infraAccounts": "Cuentas", + "infraProviders": "Proveedores", + "infraApiKeys": "Claves de API", + "infraModels": "Modelos", + "perfTitle": "Rendimiento", + "perfAvgTokens": "Promedio tokens/solicitud", + "perfCostReq": "Coste/solicitud", + "perfIoRatio": "Ratio E/S", + "perfFastReq": "Solicitudes rápidas", + "highlightsTitle": "Destacados", + "highlightsTopModel": "Modelo principal", + "highlightsTopProvider": "Proveedor principal", + "highlightsBusiestDay": "Día con más actividad", + "highlightsDiversity": "Diversidad", + "highlightsFallbackRate": "Tasa de fallback", + "customRange": "Personalizado", + "overviewDescription": "Supervise sus patrones de uso de API, consumo de tokens, costes y tendencias de actividad en todos los proveedores y modelos.", + "evalsDescription": "Ejecute conjuntos de evaluación para probar y validar sus endpoints de LLM. Compare la calidad del modelo, detecte regresiones y compare la latencia.", "overview": "Descripción general", - "evals": "evaluaciones", - "search": "Search", + "evals": "Evaluaciones", + "search": "Buscar", "utilization": "Utilización", - "routeTrace": "Route Trace", - "sectionsAria": "Analytics sections", + "routeTrace": "Seguimiento de ruta", + "sectionsAria": "Secciones de analíticas", "utilizationDescription": "Tendencias de uso de cuota del proveedor y seguimiento de límites de tasa", "modelStatus": "Estado del modelo", "modelStatusCooldown": "Enfriamiento", "modelStatusUnavailable": "No disponible", - "modelStatusError": "error", + "modelStatusError": "Error", "comboHealth": "Salud del combo", "comboHealthDescription": "Cuota a nivel de combo, distribución de uso y métricas de rendimiento", - "compressionAnalyticsTitle": "Compression Analytics", - "compressionAnalyticsDescription": "Compression analytics — token savings, mode breakdown, and provider stats.", + "compressionAnalyticsTitle": "Analíticas de compresión", + "compressionAnalyticsDescription": "Analíticas de compresión: ahorro de tokens, desglose de modos y estadísticas de proveedores.", "autoRoutingTotalAutoRequests": "Total de solicitudes automáticas", "autoRoutingAvgSelectionScore": "Puntuación de selección promedio", "autoRoutingExplorationRate": "Tasa de exploración", "autoRoutingLkgpHitRate": "Tasa de aciertos de LKGP", "autoRoutingRequestsByVariant": "Solicitudes por variante", "autoRoutingTopRoutedProviders": "Principales proveedores enrutados", - "comboHealthWorstQuotaLeft": "Queda la peor cuota", - "comboHealthUsageSkew": "sesgo de uso", + "comboHealthWorstQuotaLeft": "Peor cuota restante", + "comboHealthUsageSkew": "Sesgo de uso", "comboHealthSuccessRate": "Tasa de éxito", "comboHealthQuotaHealth": "Salud de la cuota", "comboHealthRequests": "Solicitudes", - "comboHealthTokens": "Fichas", + "comboHealthTokens": "Tokens", "comboHealthAvgLatency": "Latencia promedio", "comboHealthTotalRequests": "Solicitudes totales", "comboHealthExecutionTargets": "Objetivos de ejecución", "comboHealthSuccess": "Éxito", "comboHealthLatency": "Latencia", "comboHealthQuota": "Cuota", - "comboHealthTitle": "salud combinada", - "comboHealthUnableToLoad": "No se puede cargar la salud combinada", - "comboHealthGettingStarted": "Empezando", - "comboHealthForecastTitle": "Cost & quota forecast", - "comboHealthForecastDescription": "Linear projection from historical combo traffic and quota snapshots.", - "comboHealthQuotaRisk": "{level} quota risk", - "comboHealthConfidence": "{level} confidence", - "comboHealthProjectedCost": "Projected cost", - "comboHealthCostHistory": "history {total} · {daily}/day", - "comboHealthProjectedRequests": "Projected requests", - "comboHealthRequestsInRange": "{count} in selected range", - "comboHealthWorstProjectedQuota": "Worst projected quota", - "comboHealthNoDepletionEstimate": "No depletion estimate", - "comboHealthDaysToExhaust": "{days}d to exhaust", - "comboHealthTraffic": "traffic", - "comboHealthProjectedQuota": "Projected quota", - "comboHealthPricingCoverage": "Pricing coverage", - "comboHealthAutopilotTitle": "Combo Health Autopilot", - "comboHealthAutopilotDescription": "Prioritized recommendations from combo health, forecasts, quotas, and provider health.", - "comboHealthIssues": "Issues", - "comboHealthActionable": "{count} actionable", - "comboHealthDown": "Down", - "comboHealthDegraded": "Degraded", - "comboHealthHealthy": "Healthy", - "comboHealthNoActiveIssues": "No active combo health issues detected for the selected range.", - "comboHealthScoringInspector": "Intelligent scoring inspector", - "comboHealthReadOnlyRecompute": "Read-only recompute", - "comboHealthScoringDescription": "Factor-level explanation for target ranking using current health, forecast, and routing heuristics.", - "comboHealthTask": "Task: {task}", - "comboHealthSelectedRank": "Selected rank #1", + "comboHealthTitle": "Salud del combo", + "comboHealthUnableToLoad": "No se puede cargar la salud del combo", + "comboHealthGettingStarted": "Primeros pasos", + "comboHealthForecastTitle": "Previsión de costes y cuotas", + "comboHealthForecastDescription": "Proyección lineal basada en el tráfico histórico de los combos y las instantáneas de cuotas.", + "comboHealthQuotaRisk": "Riesgo de cuota: {level}", + "comboHealthConfidence": "Confianza: {level}", + "comboHealthProjectedCost": "Coste proyectado", + "comboHealthCostHistory": "historial {total} · {daily}/día", + "comboHealthProjectedRequests": "Solicitudes proyectadas", + "comboHealthRequestsInRange": "{count} en el intervalo seleccionado", + "comboHealthWorstProjectedQuota": "Peor cuota proyectada", + "comboHealthNoDepletionEstimate": "Sin estimación de agotamiento", + "comboHealthDaysToExhaust": "{days}d para agotar", + "comboHealthTraffic": "tráfico", + "comboHealthProjectedQuota": "Cuota proyectada", + "comboHealthPricingCoverage": "Cobertura de precios", + "comboHealthAutopilotTitle": "Piloto automático de salud del combo", + "comboHealthAutopilotDescription": "Recomendaciones priorizadas basadas en la salud de los combos, las previsiones, las cuotas y la salud de los proveedores.", + "comboHealthIssues": "Problemas", + "comboHealthActionable": "{count} accionables", + "comboHealthDown": "Caído", + "comboHealthDegraded": "Degradado", + "comboHealthHealthy": "Saludable", + "comboHealthNoActiveIssues": "No se han detectado problemas activos de salud en el combo para el intervalo seleccionado.", + "comboHealthScoringInspector": "Inspector de puntuación inteligente", + "comboHealthReadOnlyRecompute": "Recálculo de solo lectura", + "comboHealthScoringDescription": "Explicación por factores para la clasificación de objetivos utilizando la salud actual, las previsiones y las heurísticas de enrutamiento.", + "comboHealthTask": "Tarea: {task}", + "comboHealthSelectedRank": "Rango seleccionado #1", "comboHealthFactor": { - "quota": "Quota", - "health": "Health", - "costInv": "Cost", - "latencyInv": "Latency", - "taskFit": "Task fit", - "stability": "Stability", - "tierPriority": "Tier", - "tierAffinity": "Tier fit", - "specificityMatch": "Specificity", - "contextAffinity": "Context", - "resetWindowAffinity": "Reset window" + "quota": "Cuota", + "health": "Salud", + "costInv": "Coste", + "latencyInv": "Latencia", + "taskFit": "Adecuación a la tarea", + "stability": "Estabilidad", + "tierPriority": "Nivel", + "tierAffinity": "Adecuación de nivel", + "specificityMatch": "Especificidad", + "contextAffinity": "Contexto", + "resetWindowAffinity": "Ventana de restablecimiento" }, - "comboHealthQuotaValue": "Quota {value}", - "comboHealthLatencyValue": "Latency {value}ms", - "comboHealthIssueCount": "Issues {count}", - "comboHealthNoInspectableTargets": "No inspectable targets for this combo.", + "comboHealthQuotaValue": "Cuota {value}", + "comboHealthLatencyValue": "Latencia {value}ms", + "comboHealthIssueCount": "Problemas {count}", + "comboHealthNoInspectableTargets": "No hay objetivos inspeccionables para este combo.", "comboHealthAutopilotState": { - "down": "Down", - "degraded": "Needs attention", - "healthy": "Healthy" + "down": "Caído", + "degraded": "Requiere atención", + "healthy": "Saludable" }, - "comboHealthModelProviderCount": "{models} models across {providers} providers", - "comboHealthGiniCoefficient": "Gini coefficient", - "comboHealthRequestCount": "{count} requests", - "comboHealthQuotaHealthDescription": "Lowest remaining quota across providers with short trend signals.", - "comboHealthRemainingQuota": "Remaining quota {value}", + "comboHealthModelProviderCount": "{models} modelos en {providers} proveedores", + "comboHealthGiniCoefficient": "Coeficiente de Gini", + "comboHealthRequestCount": "{count} solicitudes", + "comboHealthQuotaHealthDescription": "Cuota restante más baja entre los proveedores con señales de tendencia a corto plazo.", + "comboHealthRemainingQuota": "Cuota restante {value}", "comboHealthTrend": { - "improving": "Improving", - "declining": "Declining", - "stable": "Stable" + "improving": "Mejorando", + "declining": "En descenso", + "stable": "Estable" }, - "comboHealthUsageSkewDescription": "Model request share and token share within this combo.", - "comboHealthShareSummary": "Request share {requests} · Token share {tokens}", - "comboHealthPerformance": "Performance", - "comboHealthPerformanceDescription": "Reliability and throughput for routed combo traffic.", - "comboHealthExecutionTargetsDescription": "Step-level runtime metrics and quota visibility for structured combo targets.", - "comboHealthRequestShort": "{count} req", - "comboHealthQuotaScope": "Quota scope: {scope}", - "comboHealthTrendValue": "Trend: {trend}", - "comboHealthFetchFailed": "Failed to fetch combo health data", - "unknownError": "Unknown error", - "comboHealthIntro": "Monitor quota pressure, skewed model usage, and delivery performance by combo.", - "comboHealthForecastHorizon": "{value} forecast", - "comboHealthNoData": "No combo health data available", - "comboHealthNoDataDescription": "Combo quota snapshots and routed requests will appear here after traffic starts flowing.", - "comboHealthStepCreate": "Create combos in Combos with multiple providers", - "comboHealthStepSend": "Send requests to combo endpoints to generate traffic data", - "comboHealthStepAutomatic": "Health metrics will appear automatically as requests are routed", - "comboHealthTracking": "Tracking {count} combos for {range}", + "comboHealthUsageSkewDescription": "Cuota de solicitudes y cuota de tokens por modelo en este combo.", + "comboHealthShareSummary": "Cuota de solicitudes {requests} · Cuota de tokens {tokens}", + "comboHealthPerformance": "Rendimiento", + "comboHealthPerformanceDescription": "Fiabilidad y rendimiento para el tráfico de combos enrutado.", + "comboHealthExecutionTargetsDescription": "Métricas de tiempo de ejecución a nivel de paso y visibilidad de cuotas para objetivos de combos estructurados.", + "comboHealthRequestShort": "{count} sol.", + "comboHealthQuotaScope": "Ámbito de cuota: {scope}", + "comboHealthTrendValue": "Tendencia: {trend}", + "comboHealthFetchFailed": "Error al obtener los datos de salud del combo", + "unknownError": "Error desconocido", + "comboHealthIntro": "Supervisa la presión de cuotas, el uso sesgado de modelos y el rendimiento de entrega por combo.", + "comboHealthForecastHorizon": "Previsión para {value}", + "comboHealthNoData": "No hay datos de salud del combo disponibles", + "comboHealthNoDataDescription": "Las instantáneas de cuotas de los combos y las solicitudes enrutadas aparecerán aquí una vez que comience a fluir el tráfico.", + "comboHealthStepCreate": "Crea combos en Combos con varios proveedores", + "comboHealthStepSend": "Envía solicitudes a los endpoint de los combos para generar datos de tráfico", + "comboHealthStepAutomatic": "Las métricas de salud aparecerán automáticamente a medida que se enruten las solicitudes", + "comboHealthTracking": "Realizando seguimiento de {count} combos para {range}", "compressionAnalyticsTotalRequests": "Solicitudes totales", - "compressionAnalyticsTokensSaved": "Fichas guardadas", + "compressionAnalyticsTokensSaved": "Tokens guardados", "compressionAnalyticsAvgSavings": "Ahorro promedio", "compressionAnalyticsAvgDuration": "Duración promedio", "compressionAnalyticsReceipts": "Recibos", - "compressionAnalyticsFallbacks": "Reservas", - "compressionAnalyticsPromptTokens": "fichas de aviso", - "compressionAnalyticsCompletionTokens": "Fichas de finalización", - "compressionAnalyticsTotalTokens": "fichas totales", - "compressionAnalyticsCacheTokens": "Fichas de caché", + "compressionAnalyticsFallbacks": "Fallbacks", + "compressionAnalyticsPromptTokens": "Tokens de prompt", + "compressionAnalyticsCompletionTokens": "Tokens de completado", + "compressionAnalyticsTotalTokens": "Tokens totales", + "compressionAnalyticsCacheTokens": "Tokens de caché", "compressionAnalyticsNoDataYet": "Aún no hay datos de compresión", - "compressionAnalyticsLoading": "Loading compression analytics…", - "compressionAnalyticsNoDataDescription": "Compression requests will appear here after the first request through /v1/chat/completions with compression enabled.", - "rangeLast24h": "Last 24h", - "rangeLast7d": "Last 7d", - "rangeLast30d": "Last 30d", - "rangeAllTime": "All time", - "compressionAnalyticsModeStats": "{count} requests · {tokens} tokens saved", - "compressionAnalyticsSkipped": " · {count} skipped (no-op)", - "compressionAnalyticsRealTokens": "{count} real tokens", - "compressionAnalyticsValidationRestores": "validation restores", - "compressionAnalyticsRealUsageReceipts": "Real Usage Receipts", - "compressionAnalyticsSources": "Sources", - "compressionAnalyticsModeBreakdown": "Mode Breakdown", - "compressionAnalyticsProviderBreakdown": "Provider Breakdown", - "compressionAnalyticsLast24HoursActivity": "Last 24 Hours (Activity)", - "compressionAnalyticsChartPoint": "{hour}: {count} requests, {tokens} tokens saved", - "compressionAnalyticsMaxRequests": "Max requests/hour: {count}", - "compressionAnalyticsMaxTokens": "Max tokens/hour: {count}", - "compressionAnalyticsStartTracking": "Use POST /v1/chat/completions with compression configuration to start tracking compression analytics.", - "compressionAnalyticsInfo": "Compression analytics: Token savings tracked per mode (off, lite, standard, aggressive, ultra, RTK, stacked), engine, compression combo, and provider. Hover over charts for details. Use the time selector to view different time periods.", + "compressionAnalyticsLoading": "Cargando análisis de compresión…", + "compressionAnalyticsNoDataDescription": "Las solicitudes de compresión aparecerán aquí después de la primera solicitud a través de /v1/chat/completions con la compresión habilitada.", + "rangeLast24h": "Últimas 24h", + "rangeLast7d": "Últimos 7 días", + "rangeLast30d": "Últimos 30 días", + "rangeAllTime": "Todo el tiempo", + "compressionAnalyticsModeStats": "{count} solicitudes · {tokens} tokens guardados", + "compressionAnalyticsSkipped": " · {count} omitidas (sin operación)", + "compressionAnalyticsRealTokens": "{count} tokens reales", + "compressionAnalyticsValidationRestores": "restauraciones de validación", + "compressionAnalyticsRealUsageReceipts": "Recibos de uso real", + "compressionAnalyticsSources": "Fuentes", + "compressionAnalyticsModeBreakdown": "Desglose por modo", + "compressionAnalyticsProviderBreakdown": "Desglose por proveedor", + "compressionAnalyticsLast24HoursActivity": "Últimas 24 horas (Actividad)", + "compressionAnalyticsChartPoint": "{hour}: {count} solicitudes, {tokens} tokens guardados", + "compressionAnalyticsMaxRequests": "Máx. solicitudes/hora: {count}", + "compressionAnalyticsMaxTokens": "Máx. tokens/hora: {count}", + "compressionAnalyticsStartTracking": "Usa POST /v1/chat/completions con la configuración de compresión para empezar a registrar los análisis de compresión.", + "compressionAnalyticsInfo": "Análisis de compresión: Ahorro de tokens registrado por modo (off, lite, standard, aggressive, ultra, RTK, stacked), motor, combo de compresión y proveedor. Pasa el cursor sobre los gráficos para ver los detalles. Usa el selector de tiempo para ver diferentes periodos.", "searchAnalyticsTotalSearches": "Búsquedas totales", "searchAnalyticsCacheHitRate": "Tasa de aciertos de caché", - "searchAnalyticsTotalCost": "Costo Total", + "searchAnalyticsTotalCost": "Coste total", "searchAnalyticsAvgResponse": "Respuesta promedio", "searchAnalyticsNoSearchesYet": "Aún no hay búsquedas", "providerUtilizationTitle": "Utilización del proveedor", "providerUtilizationFailedToLoad": "No se pudieron cargar los datos de utilización", "providerUtilizationNoData": "No hay datos de utilización disponibles", - "providerUtilizationGettingStarted": "Empezando", - "providerUtilizationLatestSnapshot": "Instantánea de la última cuota", + "providerUtilizationGettingStarted": "Primeros pasos", + "providerUtilizationLatestSnapshot": "Última instantánea de cuota", "providerUtilizationRemainingCapacity": "Capacidad restante", "utilizationRange": { - "1h": "Last hour", - "24h": "Last 24 hours", - "7d": "Last 7 days", - "30d": "Last 30 days" + "1h": "Última hora", + "24h": "Últimas 24 horas", + "7d": "Últimos 7 días", + "30d": "Últimos 30 días" }, - "providerUtilizationGlobalView": "Global View", - "providerUtilizationAccountSplit": "Account Split", - "providerUtilizationLoading": "Loading utilization data…", - "retrying": "Retrying…", - "retry": "Retry", - "providerUtilizationNoDataDescription": "Provider quota snapshots will appear here after utilization data is collected.", - "providerUtilizationStepConnect": "Connect providers through OAuth or API keys in Providers", - "providerUtilizationStepEnable": "Enable quota tracking by using the provider in a combo or direct request", - "providerUtilizationStepAutomatic": "Data will appear automatically as quota snapshots are collected", - "statusExhausted": "Exhausted", - "statusLow": "Low", - "statusHealthy": "Healthy", - "remainingQuota": "Remaining quota", - "routeTraceTitle": "Route Trace View", - "routeTraceDescription": "Inspect the persisted request trace: selected target, routing factors, fallback evidence, current scoring replay, latency, tokens and target health.", - "routeTraceRequestLog": "Request log", - "routeWeight": "Weight {weight}%", - "routeNoRelatedEvidence": "No related target evidence persisted yet.", - "unknown": "unknown", - "selected": "Selected", - "routeNoStepId": "no step id", - "routeNoStep": "no step", - "routeMatchesTopTarget": "Matches current top target", - "routeDiffersFromTop": "Differs from current top", - "routeTargetMissingNow": "Target missing now", - "routeNotComboRouted": "Not combo routed", - "routeWhyTarget": "Why this target?", - "routeWhyTargetSubtitle": "Exact runtime metadata plus read-only scoring replay", - "routeExactRuntimeLog": "Exact runtime log", - "routeCallLogsExact": "call_logs exact", - "routeReadOnlyRecompute": "Read-only recompute", - "routeRuntimeRankNow": "Runtime rank now", - "routeRuntimeScoreNow": "Runtime score now", - "routeWouldSelectNow": "Would select now", - "routeNoRecomputeCandidates": "No combo candidate ranking can be recomputed for this request.", - "runtime": "Runtime", - "routeTopNow": "Top now", - "routeFetchLogsFailed": "Failed to fetch request logs", - "routeExplainFailed": "Failed to explain route", - "direct": "direct", - "routeUnableToLoad": "Unable to load route explanation", - "routeNoRequestLogs": "No request logs available", - "routeNoRequestLogsDescription": "Send traffic through OmniRoute first. Route explanations are generated from persisted structured call logs.", - "routeDecisionSummary": "Decision summary", - "routeConfidence": "{confidence} confidence", - "routeScore": "Route score", - "latency": "Latency", - "routeRecentSuccess": "Recent success", - "routeAvgTargetLatency": "Avg target latency", - "routeSelectedTarget": "Selected target", - "provider": "Provider", - "model": "Model", - "account": "Account", - "connection": "Connection", + "providerUtilizationGlobalView": "Vista global", + "providerUtilizationAccountSplit": "División de cuentas", + "providerUtilizationLoading": "Cargando datos de utilización…", + "retrying": "Reintentando…", + "retry": "Reintentar", + "providerUtilizationNoDataDescription": "Las instantáneas de cuotas de los proveedores aparecerán aquí una vez que se recopilen los datos de utilización.", + "providerUtilizationStepConnect": "Conecta proveedores mediante OAuth o claves de API en Proveedores", + "providerUtilizationStepEnable": "Habilita el seguimiento de cuotas utilizando el proveedor en un combo o mediante una solicitud directa", + "providerUtilizationStepAutomatic": "Los datos aparecerán automáticamente a medida que se recopilen las instantáneas de cuotas", + "statusExhausted": "Agotado", + "statusLow": "Bajo", + "statusHealthy": "Saludable", + "remainingQuota": "Cuota restante", + "routeTraceTitle": "Vista de seguimiento de ruta", + "routeTraceDescription": "Inspecciona el seguimiento de la solicitud persistente: objetivo seleccionado, factores de enrutamiento, evidencia de fallback, reproducción de la puntuación actual, latencia, tokens y salud del objetivo.", + "routeTraceRequestLog": "Registro de solicitudes", + "routeWeight": "Peso {weight}%", + "routeNoRelatedEvidence": "Aún no hay evidencia persistente del objetivo relacionado.", + "unknown": "desconocido", + "selected": "Seleccionado", + "routeNoStepId": "sin ID de paso", + "routeNoStep": "sin paso", + "routeMatchesTopTarget": "Coincide con el objetivo principal actual", + "routeDiffersFromTop": "Difiere del objetivo principal actual", + "routeTargetMissingNow": "Objetivo no disponible actualmente", + "routeNotComboRouted": "No enrutado por combo", + "routeWhyTarget": "¿Por qué este objetivo?", + "routeWhyTargetSubtitle": "Metadatos exactos de tiempo de ejecución y reproducción de puntuación de solo lectura", + "routeExactRuntimeLog": "Registro de tiempo de ejecución exacto", + "routeCallLogsExact": "call_logs exacto", + "routeReadOnlyRecompute": "Recálculo de solo lectura", + "routeRuntimeRankNow": "Rango en tiempo de ejecución actual", + "routeRuntimeScoreNow": "Puntuación en tiempo de ejecución actual", + "routeWouldSelectNow": "Se seleccionaría ahora", + "routeNoRecomputeCandidates": "No se puede recalcular la clasificación de candidatos del combo para esta solicitud.", + "runtime": "Tiempo de ejecución", + "routeTopNow": "Principal actual", + "routeFetchLogsFailed": "Error al obtener los registros de solicitudes", + "routeExplainFailed": "Error al explicar la ruta", + "direct": "directo", + "routeUnableToLoad": "No se puede cargar la explicación de la ruta", + "routeNoRequestLogs": "No hay registros de solicitudes disponibles", + "routeNoRequestLogsDescription": "Envía tráfico a través de OmniRoute primero. Las explicaciones de las rutas se generan a partir de registros de llamadas estructurados y persistentes.", + "routeDecisionSummary": "Resumen de decisiones", + "routeConfidence": "Confianza: {confidence}", + "routeScore": "Puntuación de ruta", + "latency": "Latencia", + "routeRecentSuccess": "Éxito reciente", + "routeAvgTargetLatency": "Latencia promedio del objetivo", + "routeSelectedTarget": "Objetivo seleccionado", + "provider": "Proveedor", + "model": "Modelo", + "account": "Cuenta", + "connection": "Conexión", "combo": "Combo", - "routeStep": "Step", + "routeStep": "Paso", "tokens": "Tokens", "notAvailable": "n/a", - "routeTokenCounts": "{input} in · {output} out", - "routeEvidence": "Evidence", - "routeFactors": "Routing factors", - "routeFactorsSubtitle": "Weighted signals used for this explanation", - "routeFallbackTimeline": "Fallback and target timeline", - "routeFallbackTimelineSubtitle": "Inferred from persisted call logs around this request", - "routeRecommendations": "Recommendations", - "routeLimitations": "Limitations", - "routeNoKnownLimitations": "No known limitations for this explanation." + "routeTokenCounts": "{input} entrada · {output} salida", + "routeEvidence": "Evidencia", + "routeFactors": "Factores de enrutamiento", + "routeFactorsSubtitle": "Señales ponderadas utilizadas para esta explicación", + "routeFallbackTimeline": "Línea temporal de fallback y destino", + "routeFallbackTimelineSubtitle": "Deducido de los logs de llamadas guardados para esta solicitud", + "routeRecommendations": "Recomendaciones", + "routeLimitations": "Limitaciones", + "routeNoKnownLimitations": "No hay limitaciones conocidas para esta explicación." }, "apiManager": { - "title": "Claves API", - "createKey": "Crear clave API", - "key": "clave", + "title": "Claves de API", + "createKey": "Crear clave de API", + "key": "Clave", "revokeKey": "Revocar clave", - "revokeConfirm": "¿Está seguro de que desea revocar esta clave API?", - "noKeys": "Aún no hay claves API", - "noKeysDesc": "Cree su primera clave API para autenticar solicitudes en su punto final", - "keyLabel": "Etiqueta clave", + "revokeConfirm": "¿Seguro que quieres revocar esta clave de API?", + "noKeys": "Aún no hay claves de API", + "noKeysDesc": "Crea tu primera clave de API para autenticar solicitudes a tu endpoint", + "keyLabel": "Etiqueta de la clave", "permissions": "Permisos", - "expiresAt": "Vence", - "never": "nunca", + "expiresAt": "Caduca", + "never": "Nunca", "revoke": "Revocar", "showKey": "Mostrar clave", "hideKey": "Ocultar clave", - "copyKey": "Copiar clave API", + "copyKey": "Copiar clave de API", "allModels": "Todos los modelos", "selectedModels": "Modelos seleccionados", - "readOnly": "Sólo lectura", - "fullAccess": "Acceso completo", - "keyManagement": "Gestión de claves API", - "keyManagementDesc": "Cree y administre claves API para autenticar solicitudes en su punto final", + "readOnly": "Solo lectura", + "fullAccess": "Acceso total", + "keyManagement": "Gestión de claves de API", + "keyManagementDesc": "Crea y gestiona claves de API para autenticar solicitudes a tu endpoint", "totalKeys": "Claves totales", "restricted": "Restringido", "totalRequests": "Solicitudes totales", @@ -2084,160 +2086,160 @@ "registeredKeys": "Claves registradas", "keysRegistered": "{count} claves registradas", "keyRegistered": "{count} clave registrada", - "keysSecurityNote": "Cada clave aísla el seguimiento de uso y se puede revocar de forma independiente. Las claves se enmascaran después de su creación por motivos de seguridad.", + "keysSecurityNote": "Cada clave aísla el seguimiento de uso y se puede revocar de forma independiente. Las claves se enmascaran tras su creación por seguridad.", "createFirstKey": "Crea tu primera clave", "name": "Nombre", "usage": "Uso", - "created": "Creado", + "created": "Creada", "actions": "Acciones", - "reqs": "requisitos", - "neverUsed": "Nunca usado", - "deleteConfirm": "¿Eliminar esta clave API?", + "reqs": "solic.", + "neverUsed": "Nunca usada", + "deleteConfirm": "¿Eliminar esta clave de API?", "usageTips": "Consejos de uso", - "tipAuth": "Utilice claves API en el encabezado de Autorización como Portador YOUR_KEY", - "tipSecure": "Las claves solo se muestran una vez durante la creación: guárdelas de forma segura", - "tipSeparate": "Cree claves separadas para diferentes clientes o entornos", - "tipRestrict": "Restrinja las claves a modelos específicos para una mejor seguridad y control de costos", - "keyName": "Nombre clave", - "keyNamePlaceholder": "por ejemplo, clave de producción, clave de desarrollo", - "keyNameDesc": "Elija un nombre descriptivo para identificar el propósito de esta clave", - "managementAccessDesc": "Permite que esta clave API administre la configuración de OmniRoute.", + "tipAuth": "Usa claves de API en la cabecera Authorization como Bearer TU_CLAVE", + "tipSecure": "Las claves solo se muestran una vez al crearlas; guárdalas en un lugar seguro", + "tipSeparate": "Crea claves independientes para diferentes clientes o entornos", + "tipRestrict": "Restringe las claves a modelos específicos para mejorar la seguridad y el control de costes", + "keyName": "Nombre de la clave", + "keyNamePlaceholder": "p. ej. Clave de producción", + "keyNameDesc": "Elige un nombre descriptivo para identificar el propósito de esta clave", + "managementAccessDesc": "Permite que esta clave de API gestione la configuración de OmniRoute.", "selfServiceVisibility": "Visibilidad de autoservicio", - "selfServiceVisibilityDesc": "Controla lo que esta clave puede ver sobre su propio uso y la cuota upstream compartida.", + "selfServiceVisibilityDesc": "Controla lo que esta clave puede ver sobre su propio uso y la cuota compartida del proveedor upstream.", "ownUsageVisibility": "Coste propio y uso de tokens", - "ownUsageVisibilityDesc": "Permite que esta clave llame a su endpoint de estado para ver su uso en USD, porcentaje de presupuesto y totales de tokens.", + "ownUsageVisibilityDesc": "Permite que esta clave llame a su endpoint de estado para consultar su propio uso en USD, porcentaje de presupuesto y total de tokens.", "sharedAccountQuotaVisibility": "Cuota de cuenta compartida", - "sharedAccountQuotaVisibilityDesc": "Permite que esta clave vea la cuota de cuenta upstream compartida cuando hay una conexión explícita configurada.", - "localUsageCommand": "Allow local usage command", - "localUsageCommandDesc": "Allows this API key to use @@om-usage to retrieve cached usage and quota information without calling an upstream provider.", - "localUsageCommandBadge": "Usage cmd", - "keyCreated": "Clave API creada", - "keyCreatedSuccess": "¡Clave creada exitosamente!", - "keyCreatedNote": "Copie y almacene esta clave ahora; no se volverá a mostrar.", - "done": "hecho", + "sharedAccountQuotaVisibilityDesc": "Permite que esta clave vea la cuota compartida de la cuenta upstream cuando hay una conexión explícita configurada.", + "localUsageCommand": "Permitir comando de uso local", + "localUsageCommandDesc": "Permite que esta clave de API use @@om-usage para obtener información de uso y cuota en caché sin llamar a un proveedor upstream.", + "localUsageCommandBadge": "Cmd de uso", + "keyCreated": "Clave de API creada", + "keyCreatedSuccess": "¡Clave creada con éxito!", + "keyCreatedNote": "Copia y guarda esta clave ahora; no se volverá a mostrar.", + "done": "Hecho", "savePermissions": "Guardar permisos", - "endpointRestrictions": "Allowed Endpoints", - "allEndpointsAllowed": "This key can access all API endpoints.", - "endpointsRestricted": "Restricted to {count} endpoint{count, plural, one {} other {s}}.", - "autoResolve": "Auto-Resolve", - "autoResolveDesc": "Auto-resolve ambiguous model names to native provider for this API key.", - "streamDefaultMode": "Stream Default Compatibility", - "streamDefaultModeDesc": "Controls omitted `stream` flags for this key. JSON mode returns non-streaming responses unless the client explicitly requests SSE.", - "streamDefaultLegacy": "Legacy", - "streamDefaultJson": "JSON Compatible", - "streamDefaultBadge": "JSON stream default", - "keyActive": "Key Active", - "keyActiveDesc": "Enable or disable this API key. Disabled keys are immediately rejected with 403.", - "accessSchedule": "Access Schedule", - "accessScheduleDesc": "Restrict access to specific hours and days of the week.", - "scheduleFrom": "From", - "scheduleUntil": "Until", - "scheduleDays": "Days", - "scheduleTimezone": "Timezone", - "scheduleTimezoneHint": "Use IANA timezone names, e.g. America/New_York, Europe/Berlin", - "scheduleActive": "Schedule", - "disabled": "Disabled", - "daySun": "Sun", - "dayMon": "Mon", - "dayTue": "Tue", - "dayWed": "Wed", - "dayThu": "Thu", - "dayFri": "Fri", - "daySat": "Sat", + "endpointRestrictions": "Endpoints permitidos", + "allEndpointsAllowed": "Esta clave puede acceder a todos los endpoints de la API.", + "endpointsRestricted": "Restringido a {count} endpoint{count, plural, one {} other {s}}.", + "autoResolve": "Resolución automática", + "autoResolveDesc": "Resuelve automáticamente nombres de modelos ambiguos al proveedor nativo para esta clave de API.", + "streamDefaultMode": "Compatibilidad de streaming por defecto", + "streamDefaultModeDesc": "Controla los flags `stream` omitidos para esta clave. El modo JSON devuelve respuestas sin streaming salvo que el cliente solicite SSE explícitamente.", + "streamDefaultLegacy": "Heredado", + "streamDefaultJson": "Compatible con JSON", + "streamDefaultBadge": "Streaming JSON por defecto", + "keyActive": "Clave activa", + "keyActiveDesc": "Activa o desactiva esta clave de API. Las claves desactivadas se rechazarán inmediatamente con un código 403.", + "accessSchedule": "Horario de acceso", + "accessScheduleDesc": "Restringe el acceso a horas y días específicos de la semana.", + "scheduleFrom": "Desde", + "scheduleUntil": "Hasta", + "scheduleDays": "Días", + "scheduleTimezone": "Zona horaria", + "scheduleTimezoneHint": "Usa nombres de zonas horarias IANA, p. ej. America/New_York, Europe/Berlin", + "scheduleActive": "Horario", + "disabled": "Desactivado", + "daySun": "Dom", + "dayMon": "Lun", + "dayTue": "Mar", + "dayWed": "Mié", + "dayThu": "Jue", + "dayFri": "Vie", + "daySat": "Sáb", "allowAll": "Permitir todo", "restrict": "Restringir", "allowAllInfo": "Esta clave puede acceder a todos los modelos disponibles.", "restrictInfo": "Esta clave puede acceder a {selected} de {total} modelos.", - "selected": "{count} seleccionado", + "selected": "{count} seleccionados", "all": "Todos", - "clear": "Borrar", + "clear": "Limpiar", "searchModels": "Buscar modelos por nombre o proveedor...", "noModelsFound": "No se encontraron modelos", "keyNameRequired": "El nombre de la clave es obligatorio", "keyNameTooLong": "El nombre de la clave debe tener {max} caracteres o menos", - "keyNameInvalid": "El nombre de la clave solo puede contener letras, números, espacios, guiones y guiones bajos.", + "keyNameInvalid": "El nombre de la clave solo puede contener letras, números, espacios, guiones y guiones bajos", "invalidKeyName": "Nombre de clave no válido", - "failedCreateKey": "No se pudo crear la clave", - "failedCreateKeyRetry": "No se pudo crear la clave. Por favor inténtalo de nuevo.", - "invalidKeyId": "ID de clave no válida", - "failedDeleteKey": "No se pudo eliminar la clave", - "failedDeleteKeyRetry": "No se pudo eliminar la clave. Por favor inténtalo de nuevo.", - "invalidModelsSelection": "Selección de modelos no válidos", + "failedCreateKey": "Error al crear la clave", + "failedCreateKeyRetry": "Error al crear la clave. Por favor, inténtalo de nuevo.", + "invalidKeyId": "ID de clave no válido", + "failedDeleteKey": "Error al eliminar la clave", + "failedDeleteKeyRetry": "Error al eliminar la clave. Por favor, inténtalo de nuevo.", + "invalidModelsSelection": "Selección de modelos no válida", "cannotSelectMoreThanModels": "No se pueden seleccionar más de {max} modelos", - "failedUpdatePermissions": "No se pudieron actualizar los permisos", - "failedUpdatePermissionsRetry": "No se pudieron actualizar los permisos. Por favor inténtalo de nuevo.", + "failedUpdatePermissions": "Error al actualizar los permisos", + "failedUpdatePermissionsRetry": "Error al actualizar los permisos. Por favor, inténtalo de nuevo.", "unknownProvider": "desconocido", "copyMaskedKey": "Copiar clave enmascarada", - "keyOnlyAvailableAtCreation": "Full key available only at creation time — copy it when you first create the key", - "modelsCount": "{count, plural, one {# model} other {# models}}", - "devicesCount": "{count, plural, one {# device} other {# devices}}", - "devicesTooltip": "{count, plural, one {# distinct IP/User-Agent device seen with this key (last 30 min)} other {# distinct IP/User-Agent devices seen with this key (last 30 min)}}", - "lastUsedOn": "Último: {date}", - "viewCostsFor": "View costs for {name}", + "keyOnlyAvailableAtCreation": "La clave completa solo se muestra en el momento de la creación; cópiala la primera vez que la crees", + "modelsCount": "{count, plural, one {# modelo} other {# modelos}}", + "devicesCount": "{count, plural, one {# dispositivo} other {# dispositivos}}", + "devicesTooltip": "{count, plural, one {# dispositivo IP/User-Agent distinto detectado con esta clave (últimos 30 min)} other {# dispositivos IP/User-Agent distintos detectados con esta clave (últimos 30 min)}}", + "lastUsedOn": "Último uso: {date}", + "viewCostsFor": "Ver costes de {name}", "editPermissions": "Editar permisos", "deleteKey": "Eliminar clave", "regenerateKey": "Regenerar clave", - "regenerateConfirm": "¿Está seguro de que desea regenerar esta clave API? La clave anterior quedará invalidada inmediatamente.", - "failedRegenerateKey": "No se pudo regenerar la clave API", - "failedRegenerateKeyRetry": "No se pudo regenerar la clave API. Por favor inténtalo de nuevo.", + "regenerateConfirm": "¿Seguro que quieres regenerar esta clave de API? La clave antigua quedará invalidada de inmediato.", + "failedRegenerateKey": "Error al regenerar la clave de API", + "failedRegenerateKeyRetry": "Error al regenerar la clave de API. Por favor, inténtalo de nuevo.", "model": "{count} modelo", "models": "{count} modelos", "permissionsTitle": "Permisos: {name}", "allowAllDesc": "Esta clave puede acceder a todos los modelos disponibles.", - "restrictLoading": "Loading model catalog…", - "restrictCatalogUnavailable": "Model catalog unavailable; this key has {selectedCount} selected model restrictions.", + "restrictLoading": "Cargando catálogo de modelos…", + "restrictCatalogUnavailable": "Catálogo de modelos no disponible; esta clave tiene restricciones para {selectedCount} modelos seleccionados.", "restrictDesc": "Esta clave puede acceder a {selectedCount} de {totalModels} modelos.", - "selectedCount": "{count} seleccionado", - "maxActiveSessions": "Sesiones activas máximas", - "maxActiveSessionsDescription": "0 = unlimited. Return 429 when this key exceeds concurrent sticky sessions.", - "throttleDelay": "Throttle Delay", - "throttleDelayDescription": "Add a fixed delay before requests for this key are routed. 0 = no slowdown.", - "expandClaudeCodeFamilies": "Expand Claude Code families", - "removeClaudeCodeDefault": "Remove Claude Code default", - "allowedCombos": "Allowed Combos", - "allCombosAllowed": "This key can use any combo.", - "restrictedComboCount": "Restricted to {count, plural, one {# combo} other {# combos}}.", - "apiManagerCustomRateLimits": "Límites de tarifas personalizadas", - "apiManagerCustomRateLimitsDesc": "Anule los límites predeterminados globales. Déjelo vacío para usar los valores predeterminados.", + "selectedCount": "{count} seleccionados", + "maxActiveSessions": "Máximo de sesiones activas", + "maxActiveSessionsDescription": "0 = ilimitado. Devuelve 429 cuando esta clave supere el límite de sesiones sticky concurrentes.", + "throttleDelay": "Retardo de regulación", + "throttleDelayDescription": "Añade un retardo fijo antes de enrutar las solicitudes de esta clave. 0 = sin ralentización.", + "expandClaudeCodeFamilies": "Expandir familias de Claude Code", + "removeClaudeCodeDefault": "Eliminar predeterminado de Claude Code", + "allowedCombos": "Combos permitidos", + "allCombosAllowed": "Esta clave puede usar cualquier combo.", + "restrictedComboCount": "Restringido a {count, plural, one {# combo} other {# combos}}.", + "apiManagerCustomRateLimits": "Rate limits personalizados", + "apiManagerCustomRateLimitsDesc": "Anula los límites globales predeterminados. Déjalo vacío para usar los valores por defecto.", "apiManagerRateLimitRequestsPlaceholder": "Solicitudes", - "apiManagerRateLimitReqPer": "solicitar /", + "apiManagerRateLimitReqPer": "solic /", "apiManagerRateLimitSecondsPlaceholder": "Segundos", "apiManagerRemoveLimitTitle": "Eliminar límite", - "apiManagerTimezonePlaceholder": "América/Sao_Paulo", - "noLogPayloadPrivacy": "Privacidad de carga útil sin registros", - "bannedStatus": "Estado prohibido", - "managementApiAccess": "Acceso a la API de administración", - "expirationDate": "Fecha de vencimiento", + "apiManagerTimezonePlaceholder": "America/Sao_Paulo", + "noLogPayloadPrivacy": "Privacidad de payload sin logs", + "bannedStatus": "Estado de bloqueo", + "managementApiAccess": "Acceso a la API de gestión", + "expirationDate": "Fecha de caducidad", "managementAccess": "Acceso de gestión", "allowedConnections": "Conexiones permitidas", "searchPlaceholder": "Buscar por nombre o token...", - "activeOnly": "Solo activos", + "activeOnly": "Solo activas", "filterStatus": "ESTADO", "filterType": "TIPO", "filterAll": "Todos", - "filterStatusActive": "Active", - "filterStatusDisabled": "Disabled", - "filterStatusBanned": "Banned", - "filterStatusExpired": "Expired", - "filterTypeStandard": "Standard", - "filterTypeManage": "Manage", - "filterTypeRestricted": "Restricted", - "shownOf": "{shown} of {total} shown", - "emptyFilterTitle": "No keys match your filters", - "emptyFilterClear": "Clear filters", - "disableNonPublicModels": "Disable Non-Public Models", - "disableNonPublicModelsDesc": "Reject requests for models that are not discovered or not marked as public in the provider catalog", - "normalKeysSection": "Normal keys", - "quotaKeysSection": "Quota keys", - "bypassProviderQuota": "Bypass provider quota cutoffs", - "bypassProviderQuotaDescription": "Allows this key to ignore upstream provider/account cutoff policy during routing. API key USD quotas still apply.", - "quotaPill": "QUOTA", - "quotaModeOnly": "qtSd-only" + "filterStatusActive": "Activo", + "filterStatusDisabled": "Desactivado", + "filterStatusBanned": "Bloqueado", + "filterStatusExpired": "Caducado", + "filterTypeStandard": "Estándar", + "filterTypeManage": "Gestionar", + "filterTypeRestricted": "Restringido", + "shownOf": "{shown} de {total} mostrados", + "emptyFilterTitle": "No hay claves que coincidan con tus filtros", + "emptyFilterClear": "Borrar filtros", + "disableNonPublicModels": "Desactivar modelos no públicos", + "disableNonPublicModelsDesc": "Rechazar solicitudes de modelos que no se han descubierto o no están marcados como públicos en el catálogo del proveedor", + "normalKeysSection": "Claves normales", + "quotaKeysSection": "Claves de cuota", + "bypassProviderQuota": "Omitir límites de cuota del proveedor", + "bypassProviderQuotaDescription": "Permite que esta clave ignore la política de límites del proveedor/cuenta durante el enrutamiento. Las cuotas en USD de la clave de API siguen aplicándose.", + "quotaPill": "CUOTA", + "quotaModeOnly": "solo-qtSd" }, "auditLog": { "title": "Registro de auditoría", - "searchPlaceholder": "Acciones de búsqueda...", - "action": "acción", + "searchPlaceholder": "Buscar acciones...", + "action": "Acción", "actor": "Actor", "target": "Objetivo", "ipAddress": "Dirección IP", @@ -2252,330 +2254,330 @@ "tableAria": "Entradas del registro de auditoría", "failedFetchAuditLog": "No se pudo recuperar el registro de auditoría", "notAvailable": "—", - "description": "Acciones administrativas y eventos de seguridad.", - "showing": "Mostrando entradas {count} (desplazamiento {offset})", + "description": "Acciones administrativas y eventos de seguridad", + "showing": "Mostrando {count} entradas (desplazamiento {offset})", "previous": "Anterior" }, "media": { - "title": "Zona multimedia", - "subtitle": "Genera imágenes, videos y música", - "model": "Model", + "title": "Playground multimedia", + "subtitle": "Genera imágenes, vídeos y música", + "model": "Modelo", "prompt": "Prompt", "generate": "Generar", - "generating": "Generating...", - "loadingModels": "Loading available models...", - "noModels": "No models available. Configure providers with media capabilities first.", - "error": "Generation Failed", - "result": "Result", - "imageDescription": "Generate images from text prompts using OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI and more.", - "videoDescription": "Create videos with AnimateDiff, Stable Video Diffusion via ComfyUI or SD WebUI.", - "musicDescription": "Compose music using Stable Audio Open or MusicGen via ComfyUI.", + "generating": "Generando...", + "loadingModels": "Cargando modelos disponibles...", + "noModels": "No hay modelos disponibles. Configura primero los proveedores con capacidades multimedia.", + "error": "Error en la generación", + "result": "Resultado", + "imageDescription": "Genera imágenes a partir de prompts de texto usando OpenAI, xAI, Together, Hyperbolic, SD WebUI, ComfyUI y más.", + "videoDescription": "Crea vídeos con AnimateDiff, Stable Video Diffusion mediante ComfyUI o SD WebUI.", + "musicDescription": "Compón música usando Stable Audio Open o MusicGen mediante ComfyUI.", "kinds": { "embedding": "Incrustación (Embedding)", "image": "Imagen", - "imageToText": "Imagen a Texto", - "tts": "Texto a Voz (TTS)", - "stt": "Voz a Texto (STT)", - "webSearch": "Web Search", - "webFetch": "Web Fetch", + "imageToText": "Imagen a texto", + "tts": "Texto a voz (TTS)", + "stt": "Voz a texto (STT)", + "webSearch": "Búsqueda web", + "webFetch": "Obtención web", "video": "Vídeo", "music": "Música", "ocr": "OCR" }, - "noProviders": "No providers configured for this kind yet.", - "addConnection": "Add Connection", - "backToProviders": "Back to Providers", - "connections": "{count} Connections", - "noConnections": "No connections yet — add one from the provider page.", - "loading": "Loading...", - "suggestedModels": "Suggested models from provider", - "imageGeneration": "Image Generation", - "imageToText": "Image to Text", - "imageToTextComingSoon": "The inline Image-to-Text playground will be available when /api/v1/images/understanding is implemented.", - "disabled": "Disabled", - "videoGeneration": "Video Generation", - "musicGeneration": "Music Generation", - "textToSpeech": "Text to Speech", - "transcription": "Transcription", - "imagePromptPlaceholder": "A serene landscape with mountains at sunset...", - "videoPromptPlaceholder": "A timelapse of a flower blooming...", - "musicPromptPlaceholder": "Upbeat electronic music with synth pads...", - "speechTextPlaceholder": "Hello! Welcome to OmniRoute, your intelligent AI gateway...", - "transcriptionPlaceholder": "Upload an audio file to transcribe...", - "noImagesReturned": "No images returned. The provider might have accepted the request but returned empty data.", - "generatedImageAlt": "Generated image {index}", - "save": "Save", - "enterTextToSynthesize": "Please enter text to synthesize.", - "selectAudioToTranscribe": "Please select an audio file to transcribe.", - "noSpeechDetected": "No speech detected in the audio file. If you uploaded music or a silent file, try an audio file with spoken words. Provider: \"{provider}\".", - "emptyTranscription": "Transcription returned empty text. The audio may contain no recognizable speech, or the \"{provider}\" API key may be invalid. Check Dashboard → Logs → Proxy for details.", - "topazRequiresImage": "Topaz requires an input image.", - "enterPrompt": "Please enter a prompt.", - "enhanceThisImage": "Enhance this image", - "failedToReadFile": "Failed to read file", - "generationFailed": "Generation failed", - "requestFailed": "Request failed ({status})", - "provider": "Provider", - "credentialsRequired": "Requires API key in Providers", - "voice": "Voice", - "format": "Format", - "audioVideoFile": "Audio / Video File", - "fileTooLarge": "File too large ({size}). Maximum allowed: {max}.", - "audioVideoFileHint": "Supports audio and video files up to 4 GB", - "sourceImage": "Source Image", - "sourceImageHint": "Optional for image-to-image, editing and upscale workflows.", - "maskImage": "Mask Image", - "maskImageHint": "Optional. Used by inpaint-style models that support masks.", - "text": "Text", - "promptOptional": "Prompt (optional)", - "enhancementInstructionsPlaceholder": "Optional enhancement instructions...", - "synthesizing": "Synthesizing...", - "transcribing": "Transcribing...", - "synthesizeSpeech": "Synthesize Speech", - "transcribeAudio": "Transcribe Audio", - "generateModality": "Generate {modality}", - "apiKeyRequired": "API Key Required", - "configureApiKeys": "Configure API keys in Providers", - "downloadFormat": "Download {format}", - "noTextReturned": "No text returned", - "wordTimestamps": "Word-level timestamps ({count} words)", - "providerCount": "{count} providers" + "noProviders": "Aún no hay proveedores configurados para este tipo.", + "addConnection": "Añadir conexión", + "backToProviders": "Volver a proveedores", + "connections": "{count} conexiones", + "noConnections": "Aún no hay conexiones; añade una desde la página del proveedor.", + "loading": "Cargando...", + "suggestedModels": "Modelos sugeridos por el proveedor", + "imageGeneration": "Generación de imágenes", + "imageToText": "Imagen a texto", + "imageToTextComingSoon": "El playground integrado de imagen a texto estará disponible cuando se implemente /api/v1/images/understanding.", + "disabled": "Desactivado", + "videoGeneration": "Generación de vídeo", + "musicGeneration": "Generación de música", + "textToSpeech": "Texto a voz", + "transcription": "Transcripción", + "imagePromptPlaceholder": "Un paisaje sereno con montañas al atardecer...", + "videoPromptPlaceholder": "Un timelapse de una flor floreciendo...", + "musicPromptPlaceholder": "Música electrónica animada con pads de sintetizador...", + "speechTextPlaceholder": "¡Hola! Bienvenido a OmniRoute, tu puerta de enlace de IA inteligente...", + "transcriptionPlaceholder": "Sube un archivo de audio para transcribir...", + "noImagesReturned": "No se devolvió ninguna imagen. Es posible que el proveedor haya aceptado la solicitud pero haya devuelto datos vacíos.", + "generatedImageAlt": "Imagen generada {index}", + "save": "Guardar", + "enterTextToSynthesize": "Por favor, introduce texto para sintetizar.", + "selectAudioToTranscribe": "Por favor, selecciona un archivo de audio para transcribir.", + "noSpeechDetected": "No se detectó voz en el archivo de audio. Si subiste música o un archivo silencioso, prueba con un archivo de audio con palabras habladas. Proveedor: \"{provider}\".", + "emptyTranscription": "La transcripción devolvió un texto vacío. Es posible que el audio no contenga voz reconocible o que la clave de API de \"{provider}\" no sea válida. Consulta el Panel → Logs → Proxy para más detalles.", + "topazRequiresImage": "Topaz requiere una imagen de entrada.", + "enterPrompt": "Por favor, introduce un prompt.", + "enhanceThisImage": "Mejorar esta imagen", + "failedToReadFile": "Error al leer el archivo", + "generationFailed": "Error en la generación", + "requestFailed": "Error en la solicitud ({status})", + "provider": "Proveedor", + "credentialsRequired": "Requiere clave de API de en Proveedores", + "voice": "Voz", + "format": "Formato", + "audioVideoFile": "Archivo de audio / vídeo", + "fileTooLarge": "Archivo demasiado grande ({size}). Máximo permitido: {max}.", + "audioVideoFileHint": "Admite archivos de audio y vídeo de hasta 4 GB", + "sourceImage": "Imagen de origen", + "sourceImageHint": "Opcional para flujos de trabajo de imagen a imagen, edición y mejora de resolución.", + "maskImage": "Imagen de máscara", + "maskImageHint": "Opcional. Utilizado por modelos de estilo inpaint que admiten máscaras.", + "text": "Texto", + "promptOptional": "Prompt (opcional)", + "enhancementInstructionsPlaceholder": "Instrucciones de mejora opcionales...", + "synthesizing": "Sintetizando...", + "transcribing": "Transcribiendo...", + "synthesizeSpeech": "Sintetizar voz", + "transcribeAudio": "Transcribir audio", + "generateModality": "Generar {modality}", + "apiKeyRequired": "Clave de API requerida", + "configureApiKeys": "Configura las claves de API en Proveedores", + "downloadFormat": "Descargar {format}", + "noTextReturned": "No se devolvió texto", + "wordTimestamps": "Marcas de tiempo a nivel de palabra ({count} palabras)", + "providerCount": "{count} proveedores" }, "search": { - "searchQuery": "Search Query", - "searchResults": "Search Results", - "cachedResult": "Cached", - "searchCost": "Cost", - "searchTools": "Search Tools", - "searchToolsDesc": "Advanced search testing with provider comparison", - "compareProviders": "Compare Providers", - "rerankResults": "Rerank Results", - "searchHistory": "Search History", - "urlOverlap": "URL Overlap", - "noSearchProviders": "No search providers configured. Add providers in Settings.", - "noRerankModels": "No rerank model available", - "webSearch": "Web Search", - "provider": "Provider", - "searchType": "Search Type", - "maxResults": "Max Results", - "filters": "Filters", - "country": "Country", - "language": "Language", - "timeRange": "Time Range", - "includeDomains": "Include Domains", - "excludeDomains": "Exclude Domains", - "safeSearch": "Safe Search", - "safeSearchOff": "Off", - "safeSearchModerate": "Moderate", - "safeSearchStrict": "Strict", - "queryPlaceholder": "Enter search query...", - "providerAuto": "auto (cheapest)", + "searchQuery": "Consulta de búsqueda", + "searchResults": "Resultados de búsqueda", + "cachedResult": "En caché", + "searchCost": "Coste", + "searchTools": "Herramientas de búsqueda", + "searchToolsDesc": "Pruebas de búsqueda avanzada con comparación de proveedores", + "compareProviders": "Comparar proveedores", + "rerankResults": "Reordenar resultados", + "searchHistory": "Historial de búsqueda", + "urlOverlap": "Solapamiento de URL", + "noSearchProviders": "No hay proveedores de búsqueda configurados. Añade proveedores en Ajustes.", + "noRerankModels": "No hay modelos de reordenación disponibles", + "webSearch": "Búsqueda web", + "provider": "Proveedor", + "searchType": "Tipo de búsqueda", + "maxResults": "Resultados máximos", + "filters": "Filtros", + "country": "País", + "language": "Idioma", + "timeRange": "Intervalo de tiempo", + "includeDomains": "Incluir dominios", + "excludeDomains": "Excluir dominios", + "safeSearch": "Búsqueda segura", + "safeSearchOff": "Desactivada", + "safeSearchModerate": "Moderada", + "safeSearchStrict": "Estricta", + "queryPlaceholder": "Introduce la consulta de búsqueda...", + "providerAuto": "auto (más barato)", "searchTypeWeb": "web", - "searchTypeNews": "news", - "optionAny": "any", - "timeRangeDay": "Past day", - "timeRangeWeek": "Past week", - "timeRangeMonth": "Past month", - "timeRangeYear": "Past year", - "domainPlaceholder": "example.com", - "requestTimedOut": "Request timed out ({seconds}s)", - "networkError": "Network error", - "formatted": "Formatted", + "searchTypeNews": "noticias", + "optionAny": "cualquiera", + "timeRangeDay": "Último día", + "timeRangeWeek": "Última semana", + "timeRangeMonth": "Último mes", + "timeRangeYear": "Último año", + "domainPlaceholder": "ejemplo.com", + "requestTimedOut": "La solicitud ha superado el tiempo de espera ({seconds}s)", + "networkError": "Error de red", + "formatted": "Formateado", "rawJson": "JSON", - "cacheMiss": "cache miss", - "cacheHit": "cache hit", - "latency": "Latency", - "cost": "Cost", - "results": "Results", - "rerank": "Rerank", - "rerankModel": "Rerank Model", - "positionDelta": "Position Change", - "emptyState": "Send a search query to see results", + "cacheMiss": "fallo de caché", + "cacheHit": "acierto de caché", + "latency": "Latencia", + "cost": "Coste", + "results": "Resultados", + "rerank": "Reordenar", + "rerankModel": "Modelo de reordenación", + "positionDelta": "Cambio de posición", + "emptyState": "Envía una consulta de búsqueda para ver los resultados", "copy": "Copiar", "resetToDefault": "Restablecer los valores predeterminados", - "tabSearch": "Search", - "tabScrape": "Scrape", - "tabCompare": "Compare", - "modalitiesGuide": "Modalities guide", - "searchConceptTitle": "Search", - "searchConceptDesc": "Search = fetches a list of web results (title, URL, snippet, relevance score)", - "scrapeConceptTitle": "Scrape", - "scrapeConceptDesc": "Scrape = extracts the full content of a URL (markdown, text or HTML)", - "compareConceptTitle": "Compare", - "compareConceptDesc": "Compare = runs the same query across N providers side-by-side to compare latency, cost and result overlap", - "rerankConceptTitle": "Rerank", - "rerankConceptDesc": "Rerank = reorders results via LLM to improve relevance based on the query", - "autoConceptTitle": "Auto (cheapest)", - "autoConceptDesc": "Auto (cheapest) = automatically picks the cheapest available provider with configured credentials", - "providerCatalogTitle": "Provider Catalog", - "kindSearch": "Search", - "kindFetch": "Fetch/Scrape", - "statusConfigured": "Configured", - "statusMissing": "No credential", - "statusRateLimited": "Rate limited", - "configureProvider": "Configure in Providers", - "loadingProviders": "Loading providers…", - "failedToLoadProviders": "Failed to load providers", - "costPerQuery": "Cost/query", - "freeQuota": "Free quota/mo", - "scrapeUrl": "URL to scrape", + "tabSearch": "Buscar", + "tabScrape": "Extraer", + "tabCompare": "Comparar", + "modalitiesGuide": "Guía de modalidades", + "searchConceptTitle": "Búsqueda", + "searchConceptDesc": "Búsqueda = obtiene una lista de resultados web (título, URL, fragmento, puntuación de relevancia)", + "scrapeConceptTitle": "Extracción", + "scrapeConceptDesc": "Extracción = extrae el contenido completo de una URL (markdown, texto o HTML)", + "compareConceptTitle": "Comparar", + "compareConceptDesc": "Comparar = ejecuta la misma consulta en N proveedores lado a lado para comparar latencia, coste y solapamiento de resultados", + "rerankConceptTitle": "Reordenar", + "rerankConceptDesc": "Reordenar = reordena los resultados mediante LLM para mejorar la relevancia según la consulta", + "autoConceptTitle": "Auto (más barato)", + "autoConceptDesc": "Auto (más barato) = elige automáticamente el proveedor disponible más barato con las credenciales configuradas", + "providerCatalogTitle": "Catálogo de proveedores", + "kindSearch": "Buscar", + "kindFetch": "Obtener/Extraer", + "statusConfigured": "Configurado", + "statusMissing": "Sin credenciales", + "statusRateLimited": "Rate limit alcanzado", + "configureProvider": "Configurar en Proveedores", + "loadingProviders": "Cargando proveedores…", + "failedToLoadProviders": "No se pudieron cargar los proveedores", + "costPerQuery": "Coste/consulta", + "freeQuota": "Cuota gratuita/mes", + "scrapeUrl": "URL a extraer", "scrapeUrlPlaceholder": "https://example.com", - "scrapeUrlRequired": "URL is required", - "scrapeUrlInvalid": "Invalid URL — it must start with http:// or https://", - "scrapeExtract": "Extract", - "scrapeExtracting": "Extracting…", - "scrapeFullPage": "Full page", - "scrapeFormat": "Format", + "scrapeUrlRequired": "La URL es obligatoria", + "scrapeUrlInvalid": "URL no válida. Debe empezar por http:// o https://", + "scrapeExtract": "Extraer", + "scrapeExtracting": "Extrayendo…", + "scrapeFullPage": "Página completa", + "scrapeFormat": "Formato", "formatMarkdown": "Markdown", "formatHtml": "HTML", - "formatText": "Text", - "scrapePreview": "Preview", - "scrapeRaw": "Raw", - "scrapeContentTruncated": "(truncated, view raw)", - "scrapeMetadata": "Metadata", - "scrapeProvider": "Provider", - "scrapeSize": "Size", - "scrapeEmptyState": "Enter a URL to extract its content", - "scrapeProvidersAvailable": "Available providers: Firecrawl, Jina Reader, Tavily, TinyFish.", - "compareRun": "Compare", - "compareRunning": "Comparing…", - "autoProvider": "Auto (cheapest)", - "configuredStatus": "Configured", - "rateLimitedStatus": "Rate limited", - "noCredential": "No credential", - "searchTypeLabel": "Type", - "rerankModelLabel": "Rerank model", - "noneOption": "None", - "size": "Size", - "configurationPane": "Configuration pane", - "configuration": "Configuration", - "status": "Status", - "compareProviderHint": "Select up to 4 providers on the Compare tab to compare them side by side.", - "history": "History", - "historyHint": "History is available on the Search tab.", - "noActiveProvider": "No active search provider", - "configureMoreProviders": "Configure more providers", - "links": "Links", - "contentTruncated": "Content truncated to 256 KB (original size: {size})", - "viewFullRaw": "View full raw content", - "rawScrapedContent": "Raw scraped content", - "rawContent": "Raw content — {size}", - "closeRawModal": "Close raw content modal", + "formatText": "Texto", + "scrapePreview": "Vista previa", + "scrapeRaw": "Sin procesar", + "scrapeContentTruncated": "(truncado, ver contenido sin procesar)", + "scrapeMetadata": "Metadatos", + "scrapeProvider": "Proveedor", + "scrapeSize": "Tamaño", + "scrapeEmptyState": "Introduce una URL para extraer su contenido", + "scrapeProvidersAvailable": "Proveedores disponibles: Firecrawl, Jina Reader, Tavily, TinyFish.", + "compareRun": "Comparar", + "compareRunning": "Comparando…", + "autoProvider": "Automático (más económico)", + "configuredStatus": "Configurado", + "rateLimitedStatus": "Rate limit alcanzado", + "noCredential": "Sin credenciales", + "searchTypeLabel": "Tipo", + "rerankModelLabel": "Modelo de rerank", + "noneOption": "Ninguno", + "size": "Tamaño", + "configurationPane": "Panel de configuración", + "configuration": "Configuración", + "status": "Estado", + "compareProviderHint": "Selecciona hasta 4 proveedores en la pestaña Comparar para verlos lado a lado.", + "history": "Historial", + "historyHint": "El historial está disponible en la pestaña Buscar.", + "noActiveProvider": "Ningún proveedor de búsqueda activo", + "configureMoreProviders": "Configurar más proveedores", + "links": "Enlaces", + "contentTruncated": "Contenido truncado a 256 KB (tamaño original: {size})", + "viewFullRaw": "Ver contenido completo sin procesar", + "rawScrapedContent": "Contenido extraído sin procesar", + "rawContent": "Contenido sin procesar — {size}", + "closeRawModal": "Cerrar modal de contenido sin procesar", "httpError": "Error {status}", - "failed": "Failed", - "requestFailed": "Request failed", + "failed": "Error", + "requestFailed": "La solicitud ha fallado", "embedding": "Embedding", - "embeddingSample": "Hello, world!", - "image": "Image", - "imageSample": "A serene landscape with mountains at sunset", - "music": "Music", - "musicSample": "Upbeat jazz piano with light percussion", - "noAudioUrl": "No audio URL in response: {response}", - "documentUrl": "Document URL", - "fileTooLarge25Mb": "File too large — max 25 MB", - "selectAudioFirst": "Please select an audio file first.", - "speechToText": "Speech to Text", - "chooseFile": "Choose file…", - "audioFormats25Mb": "mp3, wav, m4a, ogg, flac — max 25 MB", - "textToSpeech": "Text to Speech", - "ttsSample": "Hello, this is a text-to-speech test.", - "video": "Video", - "videoSample": "A time-lapse of clouds over a mountain range", - "webFetch": "Web Fetch", - "webSearchSample": "What is OmniRoute AI gateway?", - "noActiveProviderDescription": "No active search provider. Configure one in Providers.", - "configureProviders": "Configure providers", - "compareQuery": "Query to compare", - "compareQueryPlaceholder": "artificial intelligence trends 2026", - "selectedProviders": "Providers ({count} selected):", - "selectAll": "Select all", - "clear": "Clear", - "maxCompareProviders": "A maximum of {count} providers can be compared at once.", - "compareResults": "Results — “{query}”", - "resultCount": "{count} results", - "noResults": "No results", - "sharedResultTitle": "In common with another provider", - "sharedResult": "In common", - "overlapSummary": "{first} vs {second}: {overlap} in common", - "compareEmptyTitle": "Select providers and enter a query to compare", - "compareEmptyDescription": "Results will be shown side by side with latency, cost, and URL overlap" + "embeddingSample": "¡Hola, mundo!", + "image": "Imagen", + "imageSample": "Un paisaje sereno con montañas al atardecer", + "music": "Música", + "musicSample": "Jazz alegre con percusión ligera", + "noAudioUrl": "No hay URL de audio en la respuesta: {response}", + "documentUrl": "URL del documento", + "fileTooLarge25Mb": "Archivo demasiado grande — máx. 25 MB", + "selectAudioFirst": "Selecciona primero un archivo de audio.", + "speechToText": "Voz a texto", + "chooseFile": "Elegir archivo…", + "audioFormats25Mb": "mp3, wav, m4a, ogg, flac — máx. 25 MB", + "textToSpeech": "Texto a voz", + "ttsSample": "Hola, esto es una prueba de texto a voz.", + "video": "Vídeo", + "videoSample": "Un timelapse de nubes sobre una cordillera", + "webFetch": "Obtención web", + "webSearchSample": "¿Qué es la pasarela OmniRoute AI?", + "noActiveProviderDescription": "Ningún proveedor de búsqueda activo. Configura uno en Proveedores.", + "configureProviders": "Configurar proveedores", + "compareQuery": "Consulta a comparar", + "compareQueryPlaceholder": "tendencias de inteligencia artificial 2026", + "selectedProviders": "Proveedores ({count} seleccionados):", + "selectAll": "Seleccionar todo", + "clear": "Limpiar", + "maxCompareProviders": "Se pueden comparar un máximo de {count} proveedores a la vez.", + "compareResults": "Resultados — “{query}”", + "resultCount": "{count} resultados", + "noResults": "Sin resultados", + "sharedResultTitle": "En común con otro proveedor", + "sharedResult": "En común", + "overlapSummary": "{first} frente a {second}: {overlap} en común", + "compareEmptyTitle": "Selecciona proveedores e introduce una consulta para comparar", + "compareEmptyDescription": "Los resultados se mostrarán lado a lado con la latencia, el coste y la coincidencia de URLs" }, "cliTools": { "title": "Herramientas CLI", - "classifierCompatTitle": "Auto-permission classifier compatibility", - "classifierCompatDescription": "Short-circuit Claude Code’s --permission-mode auto security classifier with a synthetic allow response so fallback routes do not fail closed. Off by default.", - "classifierCompatCycle": "Cycle: off → auto → always", - "classifierCompatLoadFailed": "Failed to load setting", + "classifierCompatTitle": "Compatibilidad del clasificador de permisos automáticos", + "classifierCompatDescription": "Interrumpe el clasificador de seguridad de Claude Code --permission-mode auto con una respuesta de permiso sintética para que las rutas de fallback no fallen de forma estricta. Desactivado por defecto.", + "classifierCompatCycle": "Ciclo: desactivado → automático → siempre", + "classifierCompatLoadFailed": "No se pudo cargar el ajuste", "classifierCompatMode": { - "off": "Off", - "auto": "Auto", - "always": "Always" + "off": "Desactivado", + "auto": "Automático", + "always": "Siempre" }, - "failedSave": "Failed to save", - "profileSyncTitle": "CLI profile auto-sync", - "profileSyncDescription": "After provider models are synchronized, automatically regenerate CLI tool profiles from the live catalog. Off by default — only profile files are written; the active/default configuration is never changed.", - "profileSyncLoadFailed": "Failed to load settings", - "codexProfiles": "Codex profiles", - "codexProfilesDescription": "Regenerate ~/.codex/*.config.toml after model discovery.", - "claudeProfiles": "Claude Code profiles", - "claudeProfilesDescription": "Regenerate each ~/.claude/profiles/…/settings.json after model discovery.", + "failedSave": "No se pudo guardar", + "profileSyncTitle": "Sincronización automática de perfiles CLI", + "profileSyncDescription": "Una vez sincronizados los modelos de los proveedores, regenera automáticamente los perfiles de las herramientas CLI a partir del catálogo en vivo. Desactivado por defecto: solo se escriben archivos de perfil; la configuración activa/predeterminada nunca se modifica.", + "profileSyncLoadFailed": "No se pudieron cargar los ajustes", + "codexProfiles": "Perfiles de Codex", + "codexProfilesDescription": "Regenerar ~/.codex/*.config.toml tras el descubrimiento de modelos.", + "claudeProfiles": "Perfiles de Claude Code", + "claudeProfilesDescription": "Regenerar cada ~/.claude/profiles/…/settings.json tras el descubrimiento de modelos.", "noActiveProviders": "No hay proveedores activos", - "noActiveProvidersDesc": "Primero agregue y conecte proveedores para configurar las herramientas CLI.", - "mapModels": "Modelos de mapas", - "testConnection": "Conexión de prueba", - "connectionStatus": "Estado de conexión", - "configureEndpoint": "Configurar punto final", + "noActiveProvidersDesc": "Agrega y conecta proveedores primero para configurar las herramientas CLI.", + "mapModels": "Mapear modelos", + "testConnection": "Probar conexión", + "connectionStatus": "Estado de la conexión", + "configureEndpoint": "Configurar endpoint", "instructions": "Instrucciones", "modelMapping": "Mapeo de modelos", "reasoningEffort": "Esfuerzo de razonamiento para {model}", - "effortNone": "None", - "effortLow": "Low", - "effortMedium": "Medium", - "effortHigh": "High", - "effortExtraHigh": "Extra high", - "effortMax": "Max", + "effortNone": "Ninguno", + "effortLow": "Bajo", + "effortMedium": "Medio", + "effortHigh": "Alto", + "effortExtraHigh": "Muy alto", + "effortMax": "Máximo", "effortUltra": "Ultra", "wireApi": "Wire API", - "modelAliases": "Model aliases", - "addModel": "Add model", - "routeModelPlaceholder": "Route {model} to...", - "baseUrl": "URL básica", - "apiKey": "Clave API", + "modelAliases": "Alias de modelos", + "addModel": "Añadir modelo", + "routeModelPlaceholder": "Enrutar {model} a...", + "baseUrl": "URL base", + "apiKey": "Clave de API", "configured": "Configurado", "notConfigured": "No configurado", "notInstalled": "No instalado", - "custom": "personalizado", + "custom": "Personalizado", "unknown": "Desconocido", "lastSavedAt": "Último guardado: {date}", - "never": "nunca", - "justNow": "justo ahora", - "minutesAgoShort": "Hace {count}m", - "hoursAgoShort": "Hace {count}h", - "daysAgoShort": "Hace {count}d", - "monthsAgoShort": "hace {count} mes", - "yearsAgoShort": "Hace {count}y", - "runtimeCheckFailed": "Error en la comprobación del tiempo de ejecución", - "yourApiKeyPlaceholder": "tu-clave-api", - "modelPlaceholder": "proveedor/id-modelo", - "configurationSaved": "Configuración guardada exitosamente.", + "never": "Nunca", + "justNow": "hace un momento", + "minutesAgoShort": "Hace {count} min", + "hoursAgoShort": "Hace {count} h", + "daysAgoShort": "Hace {count} d", + "monthsAgoShort": "Hace {count} mes", + "yearsAgoShort": "Hace {count} a", + "runtimeCheckFailed": "Error en la comprobación del entorno de ejecución", + "yourApiKeyPlaceholder": "tu-clave-de-api", + "modelPlaceholder": "proveedor/id-de-modelo", + "configurationSaved": "Configuración guardada correctamente.", "failedToSave": "No se pudo guardar la configuración.", - "noApiKeysCreateOne": "Sin claves API: cree una en la página Claves", - "defaultOmnirouteKey": "sk_omniroute (predeterminado)", + "noApiKeysCreateOne": "Sin claves de API. Crea una en la página de claves", + "defaultOmnirouteKey": "sk_omniroute (predeterminada)", "selectModel": "Seleccionar modelo", - "selectModelForAlias": "Seleccione modelo para {alias}", - "selectModelForTool": "Seleccione modelo para {tool}", + "selectModelForAlias": "Seleccionar modelo para {alias}", + "selectModelForTool": "Seleccionar modelo para {tool}", "select": "Seleccionar", - "clear": "Borrar", + "clear": "Limpiar", "comingSoon": "Próximamente", - "checkingRuntime": "Comprobando el estado del tiempo de ejecución...", - "guideOnlyIntegration": "Integración solo con guía (no se requiere tiempo de ejecución local)", - "cliRuntimeDetected": "Tiempo de ejecución de CLI detectado y listo", + "checkingRuntime": "Comprobando el estado del entorno de ejecución...", + "guideOnlyIntegration": "Integración exclusiva mediante guía (no se requiere entorno de ejecución local)", + "cliRuntimeDetected": "Entorno de ejecución CLI detectado y listo", "cliFoundNotRunnable": "CLI encontrada pero no ejecutable{reason}", - "cliRuntimeNotDetected": "Tiempo de ejecución CLI no detectado", - "binary": "binario", + "cliRuntimeNotDetected": "Entorno de ejecución CLI no detectado", + "binary": "Binario", "configPath": "Ruta de configuración", - "configPathShort": "configuración", - "failedCheckRuntimeStatus": "No se pudo verificar el estado del tiempo de ejecución.", + "configPathShort": "Configuración", + "failedCheckRuntimeStatus": "No se pudo comprobar el estado del entorno de ejecución.", "copy": "Copiar", "copied": "Copiado", "copyConfig": "Copiar configuración", @@ -2588,8 +2590,8 @@ "inactive": "Inactivo", "startMitm": "Iniciar MITM", "stopMitm": "Detener MITM", - "mitmStarted": "¡MITM comenzó con éxito!", - "mitmStopped": "¡MITM se detuvo con éxito!", + "mitmStarted": "¡MITM iniciado correctamente!", + "mitmStopped": "¡MITM detenido correctamente!", "failedStart": "No se pudo iniciar MITM", "failedStop": "No se pudo detener MITM", "saveMappings": "Guardar asignaciones", @@ -2598,72 +2600,72 @@ "reasoningEffortDefault": "Predeterminado", "reasoningEffortHint": "El valor predeterminado conserva el esfuerzo de razonamiento enviado por el agente", "reasoningEffortTier": { - "none": "None", - "low": "Low", - "medium": "Medium", - "high": "High", - "xhigh": "XHigh" + "none": "Ninguno", + "low": "Bajo", + "medium": "Medio", + "high": "Alto", + "xhigh": "Muy alto" }, "howItWorks": "Cómo funciona:", - "antigravityHowWorksDesc": "Antigravity envía solicitudes al punto final de Google. MITM los intercepta y los redirige a OmniRoute.", - "antigravityStep1": "1. Inicie MITM para enrutar solicitudes a través de OmniRoute.", - "antigravityStep2Prefix": "2. Agregar", - "antigravityStep2Suffix": "a su archivo de hosts como 127.0.0.1.", - "antigravityStep3": "3. Abra Antigravity y las solicitudes se enviarán por proxy.", - "mitmHowWorksDesc": "{toolName} sends requests to its provider endpoint. MITM intercepts and redirects them to OmniRoute.", - "mitmStep1": "1. Start MITM to route requests through OmniRoute.", - "mitmStep2Prefix": "2. Add", - "mitmStep2Suffix": "to your hosts file as 127.0.0.1.", - "mitmStep3": "3. Open {toolName} and requests will be proxied.", - "sudoPasswordRequiredTitle": "Se requiere contraseña de Sudo", - "sudoPasswordHint": "Se requiere una contraseña de administrador para modificar el archivo de hosts y la configuración del proxy del sistema.", - "enterSudoPassword": "Ingrese la contraseña de sudo", - "sudoPasswordRequiredError": "Se requiere contraseña de Sudo.", + "antigravityHowWorksDesc": "Antigravity envía solicitudes al endpoint de Google. MITM las intercepta y las redirige a OmniRoute.", + "antigravityStep1": "1. Inicia MITM para enrutar las solicitudes a través de OmniRoute.", + "antigravityStep2Prefix": "2. Añade", + "antigravityStep2Suffix": "a tu archivo hosts como 127.0.0.1.", + "antigravityStep3": "3. Abre Antigravity y las solicitudes se enviarán a través del proxy.", + "mitmHowWorksDesc": "{toolName} envía solicitudes al endpoint de su proveedor. MITM las intercepta y las redirige a OmniRoute.", + "mitmStep1": "1. Inicia MITM para enrutar las solicitudes a través de OmniRoute.", + "mitmStep2Prefix": "2. Añade", + "mitmStep2Suffix": "a tu archivo hosts como 127.0.0.1.", + "mitmStep3": "3. Abre {toolName} y las solicitudes se enviarán a través del proxy.", + "sudoPasswordRequiredTitle": "Se requiere contraseña de sudo", + "sudoPasswordHint": "Se requiere la contraseña de administrador para modificar el archivo hosts y los ajustes del proxy del sistema.", + "enterSudoPassword": "Introduce la contraseña de sudo", + "sudoPasswordRequiredError": "Se requiere la contraseña de sudo.", "cancel": "Cancelar", "confirm": "Confirmar", - "settingsApplied": "¡La configuración se aplicó correctamente!", - "failedApplySettings": "No se pudo aplicar la configuración", - "settingsReset": "¡La configuración se restableció correctamente!", - "failedResetSettings": "No se pudo restablecer la configuración", + "settingsApplied": "¡Ajustes aplicados correctamente!", + "failedApplySettings": "No se pudieron aplicar los ajustes", + "settingsReset": "¡Ajustes restablecidos correctamente!", + "failedResetSettings": "No se pudieron restablecer los ajustes", "backupRestored": "¡Copia de seguridad restaurada!", "failedRestore": "No se pudo restaurar", "checkingCli": "Comprobando {tool} CLI...", - "cliNotRunnable": "{tool} CLI instalada pero no ejecutable", - "cliNotInstalled": "{tool} CLI no instalado", + "cliNotRunnable": "{tool} CLI está instalada pero no se puede ejecutar", + "cliNotInstalled": "{tool} CLI no está instalada", "cliNotDetected": "{tool} CLI no detectada", "cliDetectedReady": "{tool} CLI detectada y lista", - "cliFoundFailedHealthcheck": "{tool} Se encontró CLI pero falló la verificación de estado del tiempo de ejecución{reason}.", - "installCliPrompt": "Instale {tool} CLI para utilizar esta función.", - "installCodexPrompt": "Instale Codex CLI para utilizar la función de aplicación automática.", + "cliFoundFailedHealthcheck": "Se encontró {tool} CLI, pero falló el healthcheck en tiempo de ejecución{reason}.", + "installCliPrompt": "Instala {tool} CLI para usar esta función.", + "installCodexPrompt": "Instala Codex CLI para usar la función de aplicación automática.", "hide": "Ocultar", "howToInstall": "Cómo instalar", "installationGuide": "Guía de instalación", - "platforms": "Mac OS/Linux/Windows:", - "afterInstallationRun": "Después de la instalación, ejecute", + "platforms": "macOS / Linux / Windows:", + "afterInstallationRun": "Tras la instalación, ejecuta", "toVerify": "para verificar.", "current": "Actual", "baseUrlPlaceholder": "https://.../v1", - "resetToDefault": "Restablecer los valores predeterminados", + "resetToDefault": "Restablecer valores predeterminados", "providerModelPlaceholder": "proveedor/id-modelo", "apply": "Aplicar", - "reset": "Reiniciar", + "reset": "Restablecer", "manualConfig": "Configuración manual", "backups": "Copias de seguridad", - "configBackups": "Configurar copias de seguridad", - "noBackupsYet": "Aún no hay copias de seguridad. Las copias de seguridad se crean automáticamente antes de cada aplicación o reinicio.", + "configBackups": "Copias de seguridad de la configuración", + "noBackupsYet": "Aún no hay copias de seguridad. Se crean automáticamente antes de cada aplicación o restablecimiento.", "restore": "Restaurar", - "backupRestoredReloading": "¡Copia de seguridad restaurada! Estado de recarga...", + "backupRestoredReloading": "¡Copia de seguridad restaurada! Recargando estado...", "failedRestoreBackup": "No se pudo restaurar la copia de seguridad", "applied": "¡Aplicado!", - "failed": "Fallido", - "resetDone": "¡Reiniciar!", + "failed": "Error", + "resetDone": "¡Restablecido!", "omnirouteConfiguredOpenAiCompatible": "OmniRoute está configurado como proveedor compatible con OpenAI", "provider": "Proveedor", - "model": "modelo", + "model": "Modelo", "providers": "Proveedores", - "auth": "autenticación", - "noApiKeysAvailable": "No hay claves API disponibles", - "usingDefaultOmniroute": "Usando por defecto: sk_omniroute", + "auth": "Autenticación", + "noApiKeysAvailable": "No hay claves de API disponibles", + "usingDefaultOmniroute": "Usando el valor por defecto: sk_omniroute", "updateConfig": "Actualizar configuración", "applyConfig": "Aplicar configuración", "noBackupsAvailable": "No hay copias de seguridad disponibles.", @@ -2673,102 +2675,102 @@ "failedActivateProfile": "No se pudo activar el perfil", "profiles": "Perfiles", "savedProfiles": "Perfiles guardados", - "noProfilesYet": "Aún no se han guardado perfiles. Guarde la configuración actual como perfil a continuación.", + "noProfilesYet": "Aún no se han guardado perfiles. Guarda la configuración actual como perfil a continuación.", "activate": "Activar", "deleteProfile": "Eliminar perfil", - "profileNamePlaceholder": "Nombre del perfil (por ejemplo, cuenta personal)", + "profileNamePlaceholder": "Nombre del perfil (ej. Cuenta personal)", "saveCurrent": "Guardar actual", - "codexAuthNotePrefix": "Usos del códice", + "codexAuthNotePrefix": "Codex usa", "codexAuthNoteMiddle": "con", - "codexAuthNoteSuffix": "Haga clic en \"Aplicar\" para configurar automáticamente.", - "claudeManualConfiguration": "Claude CLI - Configuración manual", - "codexManualConfiguration": "CLI del Codex: configuración manual", - "droidManualConfiguration": "Droid de fábrica - Configuración manual", - "openClawManualConfiguration": "Garra abierta - Configuración manual", - "clineManualConfiguration": "Configuración manual de línea", - "kiloManualConfiguration": "Configuración manual del código Kilo", - "whenToUseLabel": "cuando usar", - "openToolDocs": "Abrir documentos de herramientas", + "codexAuthNoteSuffix": "Haz clic en \"Aplicar\" para configurar automáticamente.", + "claudeManualConfiguration": "Claude CLI: configuración manual", + "codexManualConfiguration": "Codex CLI: configuración manual", + "droidManualConfiguration": "Factory Droid: configuración manual", + "openClawManualConfiguration": "Open Claw: configuración manual", + "clineManualConfiguration": "Configuración manual de Cline", + "kiloManualConfiguration": "Configuración manual de Kilo Code", + "whenToUseLabel": "Cuándo usar", + "openToolDocs": "Abrir documentación de la herramienta", "toolUseCases": { - "claude": "Úselo cuando desee flujos de trabajo de planificación sólidos y refactorizaciones largas de varios archivos con Claude Code.", - "codex": "Úselo cuando su equipo esté estandarizado en los flujos CLI de OpenAI Codex y la autenticación basada en perfiles.", - "droid": "Úselo cuando necesite un agente terminal liviano enfocado en codificación rápida y bucles de ejecución de comandos.", - "openclaw": "Úselo cuando desee un agente de codificación estilo Open Claw pero enrutado a través de políticas de OmniRoute.", - "cline": "Úselo cuando configure agentes de codificación dentro de editores y desee una configuración guiada con modelos OmniRoute.", - "kilo": "Úselo cuando su flujo de trabajo dependa de los comandos de Kilo Code y de ediciones iterativas rápidas.", - "cursor": "Úselo cuando codifique en Cursor y necesite modelos personalizados compatibles con OpenAI a través de OmniRoute.", - "continue": "Úselo cuando ejecute Continuar en IDE y necesite una configuración de proveedor portátil basada en JSON.", - "opencode": "Úselo cuando prefiera ejecuciones de agentes nativos de terminal y automatización con scripts a través de OpenCode.", - "kiro": "Utilícelo al integrar Kiro y controlar el enrutamiento de modelos de forma centralizada desde OmniRoute.", - "windsurf": "Use when you want an AI-first IDE with Codeium/Windsurf models routed through OmniRoute.", - "antigravity": "Úselo cuando el tráfico de Antigravity/Kiro debe interceptarse a través de MITM y enrutarse a OmniRoute.", - "copilot": "Úselo cuando desee una experiencia de usuario estilo chat Copilot mientras aplica las claves de OmniRoute y las reglas de enrutamiento.", - "amp": "Use when you want Amp CLI routed through OmniRoute with stable shorthand aliases and OpenAI-compatible setup.", - "hermes": "Úselo cuando necesite un asistente de IA nativo de terminal liviano para tareas rápidas.", - "hermes-agent": "Utilizar cuando necesites el agente Hermes (de Nousresearch) con modelos predeterminados, de delegación, visión y auxiliares enrutados mediante OmniRoute.", - "custom": "Úselo para implementaciones de herramientas personalizadas o configuraciones genéricas compatibles con OpenAI." + "claude": "Úsalo cuando quieras flujos de trabajo de planificación sólidos y refactorizaciones largas de varios archivos con Claude Code.", + "codex": "Úsalo cuando tu equipo esté estandarizado en los flujos de OpenAI Codex CLI y la autenticación basada en perfiles.", + "droid": "Úsalo cuando necesites un agente de terminal ligero enfocado en codificación rápida y bucles de ejecución de comandos.", + "openclaw": "Úsalo cuando quieras un agente de codificación al estilo Open Claw pero enrutado a través de las políticas de OmniRoute.", + "cline": "Úsalo cuando configures agentes de codificación dentro de editores y quieras una configuración guiada con modelos de OmniRoute.", + "kilo": "Úsalo cuando tu flujo de trabajo dependa de comandos de Kilo Code y de ediciones iterativas rápidas.", + "cursor": "Úsalo cuando codifiques en Cursor y necesites modelos personalizados compatibles con OpenAI a través de OmniRoute.", + "continue": "Úsalo cuando ejecutes Continue en IDEs y necesites una configuración de proveedor portátil basada en JSON.", + "opencode": "Úsalo cuando prefieras ejecuciones de agentes nativos de terminal y automatización mediante scripts a través de OpenCode.", + "kiro": "Úsalo al integrar Kiro y controlar el enrutamiento de modelos de forma centralizada desde OmniRoute.", + "windsurf": "Úsalo cuando quieras un IDE centrado en IA con modelos de Codeium/Windsurf enrutados a través de OmniRoute.", + "antigravity": "Úsalo cuando el tráfico de Antigravity/Kiro deba interceptarse a través de MITM y enrutarse a OmniRoute.", + "copilot": "Úsalo cuando quieras una experiencia de chat al estilo Copilot aplicando las claves y reglas de enrutamiento de OmniRoute.", + "amp": "Úsalo cuando quieras flujos de trabajo de atajos con Amp pero necesites aplicar los alias y reglas de enrutamiento de OmniRoute.", + "hermes": "Úsalo cuando necesites un asistente de IA ligero e integrado en la terminal para tareas rápidas.", + "hermes-agent": "Úsalo cuando necesites Hermes Agent (de Nousresearch) con modelos predeterminados, de delegación, visión y auxiliares enrutados a través de OmniRoute.", + "custom": "Úsalo para implementaciones de herramientas personalizadas o configuraciones genéricas compatibles con OpenAI." }, "toolDescriptions": { - "antigravity": "IDE antigravedad de Google con MITM", - "claude": "CLI del Código Antrópico Claude", - "codex": "CLI del Códice OpenAI", - "grok-build": "xAI Grok Build TUI coding agent with custom provider support", - "droid": "Asistente de IA de droide de fábrica", + "antigravity": "IDE Google Antigravity con MITM", + "claude": "CLI de Anthropic Claude Code", + "codex": "CLI de OpenAI Codex", + "grok-build": "Agente de codificación TUI xAI Grok Build con soporte de proveedor personalizado", + "droid": "Asistente de IA Factory Droid", "openclaw": "Asistente de IA Open Claw", - "cline": "CLI del asistente de codificación AI de Cline", - "kilo": "CLI del Asistente de Inteligencia Artificial de Kilo Code", - "qwen": "Alibaba Qwen Code CLI", - "cursor": "Editor de código AI del cursor", - "continue": "Continuar Asistente de IA", - "opencode": "OpenCode AI coding agent (Terminal)", - "kiro": "Amazon Kiro — AI-powered IDE", - "windsurf": "Windsurf AI Code Editor", - "copilot": "GitHub Copilot AI Assistant", - "amp": "Sourcegraph Amp coding assistant CLI", - "hermes": "Asistente de terminal de IA de Hermes", - "hermes-agent": "Hermes Agent (de Nousresearch) - IA de terminal avanzada con soporte multimodelo (delegación, visión, compresión, etc.)", - "custom": "Generador de configuración CLI o SDK genérico compatible con OpenAI", - "aider": "Aider AI pair-programming CLI with an OpenAI-compatible base URL", - "forge": "ForgeCode coding agent CLI with a custom provider", - "cursor-cli": "Cursor Agent CLI in headless agent mode", - "roo": "Roo Code AI assistant for VS Code", - "jcode": "jcode terminal coding agent", - "deepseek-tui": "DeepSeek TUI coding agent written in Rust", - "codewhale": "CodeWhale coding agent, the successor to DeepSeek TUI", - "smelt": "Smelt coding agent CLI", - "pi": "Lightweight Pi terminal coding agent", - "crush": "Crush terminal coding agent by Charm", - "goose": "Goose autonomous agent CLI", - "interpreter": "Open Interpreter autonomous coding agent CLI", - "omp": "Oh My Pi terminal coding agent", - "letta": "Letta CLI agent with persistent memory and tool use", - "warp": "Warp AI terminal with custom provider support", - "agent-deck": "Agent Deck multi-agent orchestrator" + "cline": "CLI del asistente de codificación con IA de Cline", + "kilo": "CLI del asistente de IA Kilo Code", + "qwen": "CLI de Alibaba Qwen Code", + "cursor": "Editor de código con IA Cursor", + "continue": "Asistente de IA Continue", + "opencode": "Agente de codificación con IA OpenCode (Terminal)", + "kiro": "Amazon Kiro: IDE basado en IA", + "windsurf": "Editor de código con IA Windsurf", + "copilot": "Asistente de IA GitHub Copilot", + "amp": "CLI del asistente de codificación Sourcegraph Amp", + "hermes": "Asistente de terminal de IA Hermes", + "hermes-agent": "Hermes Agent (de Nousresearch): IA de terminal avanzada con soporte multimodelo (delegación, visión, compresión, etc.)", + "custom": "Generador de configuración de CLI o SDK genérico compatible con OpenAI", + "aider": "CLI de programación en pareja con IA Aider con una URL base compatible con OpenAI", + "forge": "CLI del agente de codificación ForgeCode con un proveedor personalizado", + "cursor-cli": "CLI de Cursor Agent en modo agente headless", + "roo": "Asistente de IA Roo Code para VS Code", + "jcode": "Agente de codificación en terminal jcode", + "deepseek-tui": "Agente de codificación TUI de DeepSeek escrito en Rust", + "codewhale": "Agente de codificación CodeWhale, el sucesor de DeepSeek TUI", + "smelt": "CLI del agente de codificación Smelt", + "pi": "Agente ligero de codificación en terminal Pi", + "crush": "Agente de codificación en terminal Crush de Charm", + "goose": "CLI del agente autónomo Goose", + "interpreter": "CLI del agente de codificación autónomo Open Interpreter", + "omp": "Agente de codificación en terminal Oh My Pi", + "letta": "Agente de CLI Letta con memoria persistente y uso de herramientas", + "warp": "Terminal de IA Warp con soporte para proveedores personalizados", + "agent-deck": "Orquestador multiagente Agent Deck" }, "guides": { "cursor": { "notes": { - "0": "Requiere una cuenta de Cursor Pro para utilizar esta función.", - "1": "El cursor enruta las solicitudes a través de su propio servidor, por lo que no se admite el punto final local. Habilite Cloud Endpoint en Configuración." + "0": "Requiere una cuenta de Cursor Pro para usar esta función.", + "1": "Cursor enruta las solicitudes a través de su propio servidor, por lo que no se admite un endpoint local. Habilita Cloud Endpoint en Ajustes." }, "steps": { "1": { - "title": "Abrir configuración", - "desc": "Vaya a Configuración -> Modelos" + "title": "Abrir Ajustes", + "desc": "Ve a Ajustes -> Modelos" }, "2": { - "title": "Habilitar la API OpenAI", - "desc": "Habilite la opción \"Clave API OpenAI\"" + "title": "Habilitar la API de OpenAI", + "desc": "Activa la opción \"OpenAI API key\"" }, "3": { - "title": "URL básica" + "title": "URL base" }, "4": { - "title": "Clave API" + "title": "Clave de API" }, "5": { - "title": "Agregar modelo personalizado", - "desc": "Haga clic en \"Ver todos los modelos\" -> \"Agregar modelo personalizado\"" + "title": "Añadir modelo personalizado", + "desc": "Haz clic en \"View All Model\" -> \"Add Custom Model\"" }, "6": { "title": "Seleccionar modelo" @@ -2779,173 +2781,173 @@ "steps": { "1": { "title": "Abrir configuración", - "desc": "Abrir el archivo de configuración Continuar" + "desc": "Abre el archivo de configuración de Continue" }, "2": { - "title": "Clave API" + "title": "Clave de API" }, "3": { "title": "Seleccionar modelo" }, "4": { - "title": "Agregar configuración de modelo", - "desc": "Agregue la siguiente configuración a su matriz de modelos:" + "title": "Añadir configuración del modelo", + "desc": "Añade la siguiente configuración a tu array de modelos:" } }, "notes": { - "0": "Continue usa un archivo de configuración JSON." + "0": "Continue utiliza un archivo de configuración JSON." } }, "opencode": { "steps": { "1": { - "title": "Install OpenCode", - "desc": "Install via npm: npm install -g opencode-ai" + "title": "Instalar OpenCode", + "desc": "Instala mediante npm: npm install -g opencode-ai" }, "2": { - "title": "API Key" + "title": "Clave de API" }, "3": { - "title": "Set Base URL", + "title": "Establecer URL base", "desc": "opencode config set baseUrl {baseUrl}" }, "4": { - "title": "Select Model" + "title": "Seleccionar modelo" }, "5": { - "title": "Use Thinking Variant", - "desc": "For thinking models, run with --variant high/low/max (example command below)." + "title": "Usar variante de razonamiento", + "desc": "Para modelos de razonamiento, ejecuta con --variant high/low/max (comando de ejemplo a continuación)." } }, "notes": { - "0": "OpenCode requiere configuración de clave API.", - "1": "Establece la URL base a tu endpoint de OmniRoute." + "0": "OpenCode requiere la configuración de la clave de API.", + "1": "Establece la URL base en tu endpoint de OmniRoute." } }, "kiro": { "steps": { "1": { - "title": "Open Kiro Settings", - "desc": "Go to Settings → AI Provider" + "title": "Abrir ajustes de Kiro", + "desc": "Ve a Ajustes → Proveedor de IA" }, "2": { - "title": "Base URL", - "desc": "Paste your OmniRoute endpoint URL" + "title": "URL base", + "desc": "Pega la URL de tu endpoint de OmniRoute" }, "3": { - "title": "API Key" + "title": "Clave de API" }, "4": { - "title": "Select Model" + "title": "Seleccionar modelo" } }, "notes": { - "0": "Kiro requiere cuenta de Amazon." + "0": "Kiro requiere una cuenta de Amazon." } }, "windsurf": { "steps": { "1": { - "title": "Open AI Settings", - "desc": "Click the AI Settings icon in Windsurf or go to Settings" + "title": "Abrir ajustes de IA", + "desc": "Haz clic en el icono de ajustes de IA en Windsurf o ve a Ajustes" }, "2": { - "title": "Add Custom Provider", - "desc": "Select \"Add custom provider\" (OpenAI-compatible)" + "title": "Añadir proveedor personalizado", + "desc": "Selecciona \"Add custom provider\" (compatible con OpenAI)" }, "3": { - "title": "Base URL", + "title": "URL base", "desc": "http://127.0.0.1:20128/v1" }, "4": { - "title": "API Key", - "desc": "Select your OmniRoute API key" + "title": "Clave de API", + "desc": "Selecciona tu clave de API de OmniRoute" }, "5": { - "title": "Select Model", - "desc": "Choose a model from the dropdown" + "title": "Seleccionar modelo", + "desc": "Elige un modelo del menú desplegable" } } } }, - "autoConfiguredTab": "Auto Configured Tab", - "toolCategoriesDesc": "Tool Categories Desc", - "allToolsTab": "All Tools Tab", - "guidedClientsTab": "Guided Clients Tab", - "mitmClientsTab": "Mitm Clients Tab", + "autoConfiguredTab": "Configuración automática", + "toolCategoriesDesc": "Configura asistentes de programación IA para enrutar a través de OmniRoute", + "allToolsTab": "Todas las herramientas", + "guidedClientsTab": "Clientes guiados", + "mitmClientsTab": "Clientes MITM", "customCliTab": "CLI personalizada", - "toolCategories": "Tool Categories", + "toolCategories": "Categorías de herramientas", "visibleToolsCount": "{count} herramientas disponibles", - "customCliBuilderTitle": "Constructor CLI compatible con OpenAI", - "customCliBuilderDescription": "Genere variables de entorno y fragmentos JSON para cualquier CLI o SDK que acepte una URL base, una clave API y un ID de modelo compatibles con OpenAI.", + "customCliBuilderTitle": "Constructor de CLI compatible con OpenAI", + "customCliBuilderDescription": "Genere variables de entorno y fragmentos JSON para cualquier CLI o SDK que acepte una URL base, una clave de API y un ID de modelo compatibles con OpenAI.", "customCliNoModels": "Conecte al menos un proveedor para completar los selectores de modelos.", - "customCliNameLabel": "Nombre CLI", - "customCliNamePlaceholder": "por ej. CLI de mi equipo", + "customCliNameLabel": "Nombre de la CLI", + "customCliNamePlaceholder": "p. ej., CLI de mi equipo", "customCliDefaultModelLabel": "Modelo predeterminado", - "customCliDefaultModelHelp": "Utilice cualquier ID de modelo o combo de OmniRoute. La mayoría de las CLI compatibles con OpenAI solo necesitan la URL base /v1 más una cadena de modelo.", - "customCliKeyHelper": "Para instalaciones locales, OmniRoute puede utilizar sk_omniroute. En modo nube, elija una de sus claves API de administración.", + "customCliDefaultModelHelp": "Utilice cualquier ID de modelo o combinación de OmniRoute. La mayoría de las CLI compatibles con OpenAI solo necesitan la URL base /v1 más una cadena de modelo.", + "customCliKeyHelper": "Para instalaciones locales, OmniRoute puede utilizar sk_omniroute. En modo nube, elija una de sus claves de API de gestión.", "customCliAliasMappingsLabel": "Mapeos de alias", - "customCliAliasMappingsHelp": "Alias de ayuda opcionales para scripts contenedores o archivos de configuración que desean nombres abreviados estables.", - "customCliAddAlias": "Agregar alias", - "customCliNoMappings": "Aún no hay asignaciones de alias. Agregue uno si los scripts de su contenedor o equipo usan nombres cortos estables.", - "customCliAliasPlaceholder": "por ej. revisión", - "customCliTargetModelLabel": "modelo objetivo", - "customCliEndpointHintLabel": "Cómo cablear el punto final", - "customCliEndpointHint": "Dirija cualquier cliente compatible con OpenAI a la URL base de OmniRoute /v1. El punto final de finalización del chat sin procesar es {endpoint}. Utilice el bloque JSON cuando la herramienta quiera un objeto proveedor, o el script env cuando lea variables OPENAI_*.", + "customCliAliasMappingsHelp": "Alias de ayuda opcionales para scripts contenedores o archivos de configuración que requieran nombres abreviados estables.", + "customCliAddAlias": "Añadir alias", + "customCliNoMappings": "Aún no hay mapeos de alias. Añada uno si sus scripts de contenedor o de equipo utilizan nombres cortos estables.", + "customCliAliasPlaceholder": "p. ej., revisión", + "customCliTargetModelLabel": "Modelo objetivo", + "customCliEndpointHintLabel": "Cómo configurar el endpoint", + "customCliEndpointHint": "Dirija cualquier cliente compatible con OpenAI a la URL base de OmniRoute /v1. El endpoint de chat completions sin procesar es {endpoint}. Utilice el bloque JSON cuando la herramienta requiera un objeto proveedor, o el script de entorno cuando lea variables OPENAI_*.", "customCliEnvBlockTitle": "Fragmento de entorno/shell", "customCliJsonBlockTitle": "Bloque JSON del proveedor", - "networkError": "Network error", - "other": "Other", - "preview": "Preview", - "refreshAll": "Refresh all", - "hermesRoleDefault": "Default (main)", - "hermesRoleDefaultDesc": "Primary conversation model", - "hermesRoleDelegation": "Delegation (subagents)", - "hermesRoleDelegationDesc": "Orchestrator and sub-agent model", - "hermesRoleVision": "Vision", - "hermesRoleVisionDesc": "Image and screenshot understanding", - "hermesRoleCompression": "Compression", - "hermesRoleCompressionDesc": "Prompt compression and summarization", - "hermesRoleWebExtract": "Web Extract", - "hermesRoleWebExtractDesc": "Web page content extraction", - "hermesRoleSkillsHub": "Skills Hub", - "hermesRoleSkillsHubDesc": "Skills and tool-use reasoning", - "hermesRoleApproval": "Approval", - "hermesRoleApprovalDesc": "Safety and approval decisions", - "hermesSelectBeforePreview": "Select models for roles, or ensure the roles are loaded, before previewing.", - "hermesPreviewFailed": "Failed to generate preview", - "hermesSavedTo": "Saved to {path}", - "hermesFirstSetupTitle": "First set up via OmniRoute on {date}", - "hermesSinceSetup": "{time} since setup", + "networkError": "Error de red", + "other": "Otro", + "preview": "Vista previa", + "refreshAll": "Actualizar todo", + "hermesRoleDefault": "Predeterminado (principal)", + "hermesRoleDefaultDesc": "Modelo de conversación principal", + "hermesRoleDelegation": "Delegación (subagentes)", + "hermesRoleDelegationDesc": "Modelo de orquestador y subagente", + "hermesRoleVision": "Visión", + "hermesRoleVisionDesc": "Comprensión de imágenes y capturas de pantalla", + "hermesRoleCompression": "Compresión", + "hermesRoleCompressionDesc": "Compresión y resumen de prompts", + "hermesRoleWebExtract": "Extracción web", + "hermesRoleWebExtractDesc": "Extracción de contenido de páginas web", + "hermesRoleSkillsHub": "Centro de skills", + "hermesRoleSkillsHubDesc": "Razonamiento de habilidades y uso de herramientas", + "hermesRoleApproval": "Aprobación", + "hermesRoleApprovalDesc": "Decisiones de seguridad y aprobación", + "hermesSelectBeforePreview": "Seleccione modelos para los roles, o asegúrese de que los roles estén cargados, antes de previsualizar.", + "hermesPreviewFailed": "Error al generar la vista previa", + "hermesSavedTo": "Guardado en {path}", + "hermesFirstSetupTitle": "Configuración inicial mediante OmniRoute el {date}", + "hermesSinceSetup": "{time} desde la configuración", "hermesConfiguredRoles": "{configured}/{total} roles", - "hermesQuickApply": "Quickly apply the same model to all roles:", - "hermesApplyModelToAll": "Apply {model} to every role", - "hermesViaOmniRoute": "{provider} (via OmniRoute)", - "hermesNotOmniRoute": "{provider} (not OmniRoute)", - "hermesRemovePendingRole": "Remove this role from pending changes", - "hermesApply": "Apply to Hermes Agent", - "hermesRolesWillUpdate": "{count, plural, one {# role will be updated} other {# roles will be updated}}", - "hermesPreviewPath": "Preview — will write to ~/.hermes/config.yaml", - "hermesSaveDescription": "Saves the selected model for each role into", + "hermesQuickApply": "Aplicar rápidamente el mismo modelo a todos los roles:", + "hermesApplyModelToAll": "Aplicar {model} a cada rol", + "hermesViaOmniRoute": "{provider} (vía OmniRoute)", + "hermesNotOmniRoute": "{provider} (no es OmniRoute)", + "hermesRemovePendingRole": "Eliminar este rol de los cambios pendientes", + "hermesApply": "Aplicar al agente Hermes", + "hermesRolesWillUpdate": "{count, plural, one {# rol será actualizado} other {# roles serán actualizados}}", + "hermesPreviewPath": "Vista previa — se escribirá en ~/.hermes/config.yaml", + "hermesSaveDescription": "Guarda el modelo seleccionado para cada rol en", "copilotConfigGenerator": "Generador de configuración de GitHub Copilot", - "copilotGeneratorDescriptionPrefix": "Generates the", - "copilotGeneratorDescriptionSuffix": "block for VS Code GitHub Copilot using the Azure vendor pattern. Select the models you want, then copy the JSON into your config file.", - "copilotCompatibilityWarning": "This configuration uses the Azure vendor workaround for custom model lists. Tested with VS Code ≥ 1.109 and GitHub Copilot Chat ≥ v0.37. Future extension updates may change this behavior.", - "copilotApiKey": "Clave API", - "copilotSelectModels": "Select models ({selected}/{total})", - "selectAll": "Select all", - "loadingModels": "Loading models...", - "advancedOptions": "Advanced options", - "vision": "Vision", - "copilotCopyConfigForModels": "Copy config ({count, plural, one {# model} other {# models}})", + "copilotGeneratorDescriptionPrefix": "Genera el", + "copilotGeneratorDescriptionSuffix": "bloque para VS Code GitHub Copilot usando el patrón de proveedor Azure. Seleccione los modelos que desee y luego copie el JSON en su archivo de configuración.", + "copilotCompatibilityWarning": "Esta configuración utiliza la solución alternativa de proveedor Azure para listas de modelos personalizados. Probado con VS Code ≥ 1.109 y GitHub Copilot Chat ≥ v0.37. Futuras actualizaciones de la extensión podrían cambiar este comportamiento.", + "copilotApiKey": "Clave de API", + "copilotSelectModels": "Seleccionar modelos ({selected}/{total})", + "selectAll": "Seleccionar todo", + "loadingModels": "Cargando modelos...", + "advancedOptions": "Opciones avanzadas", + "vision": "Visión", + "copilotCopyConfigForModels": "Copiar configuración ({count, plural, one {# modelo} other {# modelos}})", "copilotFilterModelsPlaceholder": "Filtrar modelos...", - "copilotMaxInputTokens": "Fichas de entrada máximas", - "copilotMaxOutputTokens": "Fichas de salida máxima", - "copilotToolCalling": "Llamada de herramientas", + "copilotMaxInputTokens": "Tokens de entrada máximos", + "copilotMaxOutputTokens": "Tokens de salida máximos", + "copilotToolCalling": "Llamada a herramientas", "copilotPasteInto": "Pegar en:", - "copilotReloadInstruction": "Then reload VS Code and set the API key in the input prompt.", - "wireApiChatCompletions": "Finalizaciones de chat (/chat/completions)", - "wireApiResponses": "API de respuestas (/respuestas)", + "copilotReloadInstruction": "Luego, recarga VS Code y establece la clave de API en el prompt de entrada.", + "wireApiChatCompletions": "Chat Completions (/chat/completions)", + "wireApiResponses": "API de respuestas (/responses)", "ccDiscoveryInfoButton": "__MISSING__:How to enable discovery in Claude Code", "ccDiscoveryInfoTooltip": "__MISSING__:Advertise non-Claude models under claude/<provider>/<model> mirror ids so Claude Code's gateway model discovery can list them. Doubles catalog entries for all clients when enabled globally.", "ccDiscoveryInfoLink": "__MISSING__:Open Feature Flags", @@ -2956,1007 +2958,1007 @@ "ccOnboardingWindowNote": "__MISSING__:Claude Code assumes a 200K context window for any model id it does not recognize. For a model with a different real window, add CLAUDE_CODE_AUTO_COMPACT_WINDOW just under it so auto-compaction does not fire too early." }, "combos": { - "title": "combos", - "description": "Cree combinaciones de modelos con enrutamiento ponderado y soporte alternativo", + "title": "Combos", + "description": "Cree combinaciones de modelos con enrutamiento ponderado y soporte de fallback", "autoCatalogTitle": "Catálogo de enrutamiento automático", "autoCatalogTemplateCount": "{count} plantillas", - "autoCatalogDescription": "Las combinaciones automáticas/* integradas se resuelven dinámicamente desde proveedores conectados. Utilice cualquiera de estos ID como campo modelo; no es necesaria ninguna configuración.", - "autoCatalogExpand": "Ampliar el catálogo de enrutamiento automático", + "autoCatalogDescription": "Las combinaciones auto/* integradas se resuelven dinámicamente desde los proveedores conectados. Utilice cualquiera de estos ID como campo de modelo; no se requiere configuración.", + "autoCatalogExpand": "Expandir catálogo de enrutamiento automático", "autoCatalogCollapse": "Contraer catálogo de enrutamiento automático", - "createCombo": "Crear combinación", - "editCombo": "Editar combinación", - "deleteCombo": "Eliminar combinación", + "createCombo": "Crear combo", + "editCombo": "Editar combo", + "deleteCombo": "Eliminar combo", "noModels": "Sin modelos", - "noModelsYet": "Aún no se han agregado modelos", - "addModel": "Agregar modelo", - "addModelToCombo": "Agregar modelo al combo", + "noModelsYet": "Aún no se han añadido modelos", + "addModel": "Añadir modelo", + "addModelToCombo": "Añadir modelo al combo", "routingStrategy": "Estrategia de enrutamiento", "maxRetries": "Reintentos máximos", "timeout": "Tiempo de espera (ms)", - "healthcheck": "control de salud", + "healthcheck": "Comprobación de estado", "priority": "Prioridad", - "fallback": "Respaldo", - "roundRobin": "Ronda Robin", + "fallback": "Fallback", + "roundRobin": "Round Robin", "random": "Aleatorio", "leastLatency": "Menor latencia", - "comboName": "Nombre combinado", + "comboName": "Nombre del combo", "comboNamePlaceholder": "mi-combo", - "comboDescription": "Description", - "comboDescriptionPlaceholder": "Optional note describing this combo", - "deleteConfirm": "¿Eliminar esta combinación?", - "noCombosYet": "Aún no hay combinaciones", - "comboCreated": "Combo creado exitosamente", - "comboUpdated": "Combo actualizado exitosamente", - "comboDeleted": "Combinación eliminada", - "failedCreate": "No se pudo crear el combo", - "failedUpdate": "No se pudo actualizar el combo", - "errorCreating": "Error al crear combo", + "comboDescription": "Descripción", + "comboDescriptionPlaceholder": "Nota opcional que describe este combo", + "deleteConfirm": "¿Eliminar este combo?", + "noCombosYet": "Aún no hay combos", + "comboCreated": "Combo creado correctamente", + "comboUpdated": "Combo actualizado correctamente", + "comboDeleted": "Combo eliminado", + "failedCreate": "Error al crear el combo", + "failedUpdate": "Error al actualizar el combo", + "errorCreating": "Error al crear el combo", "errorUpdating": "Error al actualizar el combo", "errorDeleting": "Error al eliminar el combo", "testFailed": "La solicitud de prueba falló", - "failedToggle": "No se pudo alternar el combo", - "testResults": "Resultados de la prueba: {name}", + "failedToggle": "Error al alternar el combo", + "testResults": "Resultados de la prueba — {name}", "resolvedBy": "Resuelto por:", "more": "+{count} más", - "reqs": "requisitos", + "reqs": "solicitudes", "success": "éxito", "proxyConfigured": "Proxy configurado", - "copyComboName": "Copiar nombre combinado", - "enableCombo": "Habilitar combinación", - "disableCombo": "Desactivar combinación", - "testCombo": "combinación de prueba", + "copyComboName": "Copiar nombre del combo", + "enableCombo": "Habilitar combo", + "disableCombo": "Desactivar combo", + "testCombo": "Probar combo", "duplicate": "Duplicar", "proxyConfig": "Configuración de proxy", "nameRequired": "El nombre es obligatorio", - "nameInvalid": "Sólo letras, números, -, _, / y . permitido", - "nameHint": "Letras, números, -, _, / y . permitido", - "priorityDesc": "Retroceso secuencial: prueba primero el modelo 1, luego el 2, etc.", - "weightedDesc": "Distribuye el tráfico por porcentaje de peso con respaldo", + "nameInvalid": "Solo se permiten letras, números, -, _, / y .", + "nameHint": "Se permiten letras, números, -, _, / y .", + "priorityDesc": "Fallback secuencial: prueba primero el modelo 1, luego el 2, etc.", + "weightedDesc": "Distribuye el tráfico por porcentaje de peso con fallback", "roundRobinDesc": "Distribución circular: cada solicitud pasa al siguiente modelo en rotación", "contextRelay": "Context Relay", - "contextRelayDesc": "Preserves session continuity with handoff summaries when accounts rotate", - "randomDesc": "Selección aleatoria uniforme y luego recurrir a los modelos restantes.", - "leastUsedDesc": "Elige el modelo con menos solicitudes y equilibra la carga a lo largo del tiempo.", - "costOptimizedDesc": "Rutas al modelo más barato primero según el precio", - "cacheOptimizedDesc": "Routes each reusable prompt prefix consistently to the same provider account", + "contextRelayDesc": "Preserva la continuidad de la sesión con resúmenes de transferencia cuando las cuentas rotan", + "randomDesc": "Selección aleatoria uniforme, luego fallback a los modelos restantes", + "leastUsedDesc": "Elige el modelo con menos solicitudes, equilibrando la carga con el tiempo", + "costOptimizedDesc": "Enruta primero al modelo más barato según el precio", + "cacheOptimizedDesc": "Enruta cada prefijo de prompt reutilizable de forma consistente a la misma cuenta de proveedor", "resetAware": "RR con reconocimiento de reinicio", - "resetAwareDesc": "Equilibra la cuota restante con los restablecimientos semanales y de 5 h, y luego realiza todos contra todos puntuaciones similares", - "strictRandom": "Strict Random", - "strictRandomDesc": "Shuffle deck — uses each model once before reshuffling", - "fusion": "Fusion", - "fusionDesc": "Fans the prompt to every panel model in parallel, then a judge model synthesizes one final answer", - "fusionJudgeModel": "Judge model", - "fusionJudgeModelHelp": "Model that synthesizes the panel answers into one final response. Leave empty to use the first panel model.", - "fusionMinPanel": "Min panel", - "fusionMinPanelHelp": "Successful panel answers required before stragglers get a grace window (default 2).", - "fusionStragglerGraceMs": "Straggler grace (ms)", - "fusionStragglerGraceMsHelp": "How long to wait for slow panel models once quorum is reached (default 8000).", - "fusionPanelHardTimeoutMs": "Panel hard timeout (ms)", - "fusionPanelHardTimeoutMsHelp": "Absolute cap so one hung model can't stall the whole panel (default 90000).", + "resetAwareDesc": "Equilibra la cuota restante frente a reinicios de 5h y semanales, luego realiza round-robin con puntuaciones similares", + "strictRandom": "Aleatorio estricto", + "strictRandomDesc": "Baraja: utiliza cada modelo una vez antes de volver a barajar", + "fusion": "Fusión", + "fusionDesc": "Envía el prompt a cada modelo del panel en paralelo, luego un modelo juez sintetiza una respuesta final", + "fusionJudgeModel": "Modelo juez", + "fusionJudgeModelHelp": "Modelo que sintetiza las respuestas del panel en una respuesta final. Déjelo vacío para usar el primer modelo del panel.", + "fusionMinPanel": "Panel mínimo", + "fusionMinPanelHelp": "Respuestas de panel exitosas requeridas antes de que los modelos lentos reciban una ventana de gracia (predeterminado 2).", + "fusionStragglerGraceMs": "Gracia para modelos lentos (ms)", + "fusionStragglerGraceMsHelp": "Cuánto tiempo esperar a los modelos lentos del panel una vez alcanzado el quórum (predeterminado 8000).", + "fusionPanelHardTimeoutMs": "Tiempo de espera máximo del panel (ms)", + "fusionPanelHardTimeoutMsHelp": "Límite absoluto para que un modelo bloqueado no detenga todo el panel (predeterminado 90000).", "models": "Modelos", "autoBalance": "Equilibrio automático", - "advancedSettings": "Configuración avanzada", - "retryDelay": "Retardo de reintento (ms)", + "advancedSettings": "Ajustes avanzados", + "retryDelay": "Retraso de reintento (ms)", "concurrencyPerModel": "Concurrencia / Modelo", "queueTimeout": "Tiempo de espera de cola (ms)", - "contextRelayHandoffThreshold": "Handoff Threshold", - "contextRelayHandoffThresholdHelp": "When quota usage reaches this threshold, OmniRoute generates a structured handoff summary before the active account is exhausted.", - "contextRelayMaxMessages": "Max Messages For Summary", - "contextRelayMaxMessagesHelp": "Limits how much recent history is condensed into the relay summary.", - "contextRelaySummaryModel": "Summary Model", - "contextRelaySummaryModelHelp": "Optional override model used only for generating the handoff summary. Leave empty to reuse the active combo model.", - "contextRelayProviderNote": "Context Relay currently generates handoffs for Codex account rotation. Pair it with multiple accounts of the same provider for the best continuity.", - "advancedHint": "Déjelo vacío para usar los valores predeterminados globales. Estos anulan la configuración por proveedor.", + "contextRelayHandoffThreshold": "Umbral de transferencia", + "contextRelayHandoffThresholdHelp": "Cuando el uso de la cuota alcanza este umbral, OmniRoute genera un resumen de transferencia estructurado antes de que se agote la cuenta activa.", + "contextRelayMaxMessages": "Máximo de mensajes para el resumen", + "contextRelayMaxMessagesHelp": "Limita cuánta historia reciente se condensa en el resumen de transferencia.", + "contextRelaySummaryModel": "Modelo de resumen", + "contextRelaySummaryModelHelp": "Modelo de anulación opcional utilizado solo para generar el resumen de transferencia. Déjelo vacío para reutilizar el modelo del combo activo.", + "contextRelayProviderNote": "Context Relay genera actualmente transferencias para la rotación de cuentas de Codex. Combínalo con varias cuentas del mismo proveedor para obtener la mejor continuidad.", + "advancedHint": "Déjalo vacío para usar los valores predeterminados globales. Estos anulan la configuración por proveedor.", "failoverBeforeRetry": "Conmutación por error antes de reintentar", - "maxSetRetries": "Reintentos de configuración máxima", - "setRetryDelayMs": "Establecer retraso de reintento (ms)", + "maxSetRetries": "Reintentos máximos del conjunto", + "setRetryDelayMs": "Retraso de reintento del conjunto (ms)", "moveUp": "Subir", "moveDown": "Bajar", "removeModel": "Quitar", "saving": "Guardando...", - "liveNoProviders": "No providers observed yet.", - "liveFleetDataHint": "Fleet data arrives through live combo events.", - "liveActiveCount": "Active ({count})", - "liveErrorCount": "Errors ({count})", - "liveInactiveCount": "Inactive ({count})", - "liveNoRun": "No combo run available.", - "liveDataHint": "Live data arrives through the WebSocket combo channel.", - "liveDisconnected": "Live disabled — WebSocket disconnected. Showing last known state.", - "liveSelectCombo": "Select combo", - "liveSelectComboPlaceholder": "— select combo —", - "liveTargetCount": "{count, plural, one {# target} other {# targets}}", - "liveSingle": "Single", - "liveFleet": "Fleet", - "playgroundStatusAvailable": "Available", - "playgroundStatusNoQuota": "No Quota", - "playgroundStatusDegraded": "Degraded", + "liveNoProviders": "Aún no se han observado proveedores.", + "liveFleetDataHint": "Los datos de la flota llegan a través de eventos de combo en directo.", + "liveActiveCount": "Activas ({count})", + "liveErrorCount": "Errores ({count})", + "liveInactiveCount": "Inactivas ({count})", + "liveNoRun": "No hay ninguna ejecución de combo disponible.", + "liveDataHint": "Los datos en directo llegan a través del canal de combos de WebSocket.", + "liveDisconnected": "Directo desactivado — WebSocket desconectado. Mostrando el último estado conocido.", + "liveSelectCombo": "Seleccionar combo", + "liveSelectComboPlaceholder": "— seleccionar combo —", + "liveTargetCount": "{count, plural, one {# destino} other {# destinos}}", + "liveSingle": "Único", + "liveFleet": "Flota", + "playgroundStatusAvailable": "Disponible", + "playgroundStatusNoQuota": "Sin cuota", + "playgroundStatusDegraded": "Degradado", "playgroundStatusError": "Error", - "playgroundStatusUnknown": "Unknown", - "playgroundNetworkError": "Network error during simulation", - "playgroundTitle": "Combo Playground", - "playgroundDescription": "Simulate how requests will be routed through your combos", - "playgroundConfiguration": "Configuration", - "playgroundNoCombosConfigured": "No combos configured", - "active": "active", - "inactive": "inactive", - "playgroundEstimatedPromptTokens": "Estimated Prompt Tokens", - "playgroundSimulating": "Simulating...", - "playgroundSimulateRoute": "Simulate Route", - "playgroundRoutingPath": "Routing Path", - "playgroundStrategy": "Strategy", - "playgroundEstimatedCost": "Est. Cost", - "playgroundEstimatedLatency": "Est. Latency", + "playgroundStatusUnknown": "Desconocido", + "playgroundNetworkError": "Error de red durante la simulación", + "playgroundTitle": "Entorno de pruebas de combos", + "playgroundDescription": "Simula cómo se enrutarán las solicitudes a través de tus combos", + "playgroundConfiguration": "Configuración", + "playgroundNoCombosConfigured": "No hay combos configurados", + "active": "activo", + "inactive": "inactivo", + "playgroundEstimatedPromptTokens": "Tokens de prompt estimados", + "playgroundSimulating": "Simulando...", + "playgroundSimulateRoute": "Simular ruta", + "playgroundRoutingPath": "Ruta de enrutamiento", + "playgroundStrategy": "Estrategia", + "playgroundEstimatedCost": "Coste est.", + "playgroundEstimatedLatency": "Latencia est.", "playgroundFallback": "fallback", - "playgroundWeight": "weight {value}", - "playgroundWarningCount": "Warnings ({count})", - "playgroundErrorCount": "Errors ({count})", - "playgroundEmptyHint": "Select a combo and click Simulate Route to see the routing path.", - "playgroundNoCombosYet": "No combos configured yet.", - "playgroundCreateFirst": "Create one first", - "weighted": "ponderado", + "playgroundWeight": "peso {value}", + "playgroundWarningCount": "Advertencias ({count})", + "playgroundErrorCount": "Errores ({count})", + "playgroundEmptyHint": "Selecciona un combo y haz clic en Simular ruta para ver la ruta de enrutamiento.", + "playgroundNoCombosYet": "Aún no hay combos configurados.", + "playgroundCreateFirst": "Crea uno primero", + "weighted": "Ponderado", "leastUsed": "Menos utilizado", - "costOpt": "Opción de costo", + "costOpt": "Optimizado por coste", "strategyGuideTitle": "Cómo utilizar esta estrategia", - "strategyGuideWhen": "cuando usar", - "strategyGuideAvoid": "evitar cuando", + "strategyGuideWhen": "Cuándo usar", + "strategyGuideAvoid": "Evitar cuando", "strategyGuideExample": "Ejemplo", "strategyGuide": { "priority": { - "when": "Tiene un modelo preferido y sólo desea recurrir al fracaso.", - "avoid": "Necesita distribución de solicitudes entre modelos.", - "example": "Modelo de codificación primaria con respaldo más económico para cortes." + "when": "Tienes un modelo preferido y solo quieres usar el fallback si falla.", + "avoid": "Necesitas distribuir las solicitudes entre varios modelos.", + "example": "Modelo de programación principal con una alternativa más económica para las caídas." }, "weighted": { - "when": "Necesita tráfico controlado dividido entre modelos.", - "avoid": "No se pueden mantener pesos precisos a lo largo del tiempo.", - "example": "80% de modelo estable + 20% de implementación de modelo canario." + "when": "Necesitas un reparto de tráfico controlado entre los modelos.", + "avoid": "No puedes mantener unos pesos precisos a lo largo del tiempo.", + "example": "80% de modelo estable + 20% de despliegue de modelo canary." }, "round-robin": { - "when": "Quiere una distribución predecible y uniforme.", - "avoid": "Los modelos difieren demasiado en latencia o costo.", - "example": "Mismo modelo en varias cuentas para distribuir el rendimiento." + "when": "Quieres una distribución predecible y uniforme.", + "avoid": "Los modelos difieren demasiado en latencia o coste.", + "example": "El mismo modelo en varias cuentas para repartir el rendimiento." }, "random": { - "when": "Quiere una distribución sencilla con una configuración mínima.", - "avoid": "Necesita estrictas garantías de tráfico.", + "when": "Quieres una distribución sencilla con una configuración mínima.", + "avoid": "Necesitas garantías estrictas de tráfico.", "example": "Creación rápida de prototipos con modelos equivalentes." }, "least-used": { - "when": "Quiere un equilibrio adaptativo basado en la demanda en vivo.", + "when": "Quieres un equilibrio adaptativo basado en la demanda en tiempo real.", "avoid": "El tráfico es demasiado bajo para beneficiarse del equilibrio de uso.", - "example": "Cargas de trabajo mixtas en las que un modelo a menudo se sobrecarga." + "example": "Cargas de trabajo mixtas en las que un modelo suele sobrecargarse." }, "cost-optimized": { - "when": "La reducción de costos es su principal prioridad.", - "avoid": "Faltan datos de precios o están desactualizados.", - "example": "Trabajos en segundo plano o por lotes donde se prefiere un menor costo." + "when": "La reducción de costes es tu máxima prioridad.", + "avoid": "Faltan los datos de precios o están desactualizados.", + "example": "Trabajos en segundo plano o por lotes en los que se prefiere un coste menor." }, "reset-aware": { - "when": "Se enruta a través de varias cuentas con telemetría de cuotas y diferentes ventanas de restablecimiento.", - "avoid": "La telemetría de cuotas no está disponible para la mayoría de las cuentas.", - "example": "Prefiera un restablecimiento semanal del 60 % de la cuenta mañana a un restablecimiento del 80 % más tarde." + "when": "Enrutas entre varias cuentas con telemetría de cuota y diferentes ventanas de restablecimiento.", + "avoid": "La telemetría de cuota no está disponible para la mayoría de las cuentas.", + "example": "Prefiere una cuenta con el 60% que se reinicia mañana frente a una con el 80% que se reinicia más tarde." }, "strict-random": { - "when": "Use when you want perfectly even spread — each model used once before repeating.", - "avoid": "Avoid when models have different quality or latency and order matters.", - "example": "Example: Multiple accounts of the same model to distribute usage evenly." + "when": "Úsalo cuando quieras un reparto perfectamente uniforme: cada modelo se utiliza una vez antes de repetir.", + "avoid": "Evítalo cuando los modelos tengan distinta calidad o latencia y el orden importe.", + "example": "Ejemplo: múltiples cuentas del mismo modelo para distribuir el uso de forma uniforme." }, "p2c": { - "when": "Use when you want low-latency selection using Power-of-Two-Choices algorithm.", - "avoid": "Avoid for small combos with 2 or fewer models — no benefit over round-robin.", - "example": "Example: High-throughput inference across 4+ equivalent model endpoints." + "when": "Úsalo cuando quieras una selección de baja latencia mediante el algoritmo Power-of-Two-Choices.", + "avoid": "Evítalo para combos pequeños de 2 o menos modelos; no aporta ventajas frente a round-robin.", + "example": "Ejemplo: inferencia de alto rendimiento en más de 4 endpoints de modelos equivalentes." }, "context-relay": { - "when": "Use when long sessions must survive account rotation without losing the working context.", - "avoid": "Avoid when account switching is rare or when you do not want extra summarization requests.", - "example": "Example: Codex sessions that rotate across multiple accounts near quota exhaustion." + "when": "Úsalo cuando las sesiones largas deban sobrevivir a la rotación de cuentas sin perder el contexto de trabajo.", + "avoid": "Evítalo cuando el cambio de cuenta sea infrecuente o no quieras solicitudes de resumen adicionales.", + "example": "Ejemplo: sesiones de Codex que rotan entre varias cuentas cerca de agotar la cuota." }, "fill-first": { - "when": "Úselo cuando desee agotar por completo la cuota de un proveedor antes de pasar al siguiente.", - "avoid": "Evite cuando necesite equilibrio de carga a nivel de solicitud entre proveedores.", - "example": "Ejemplo: utilice todos los créditos de Deepgram de $200 antes de recurrir a Groq." + "when": "Úsalo cuando quieras agotar por completo la cuota de un proveedor antes de pasar al siguiente.", + "avoid": "Evítalo cuando necesites un equilibrado de carga a nivel de solicitud entre proveedores.", + "example": "Ejemplo: consumir los 200 $ de créditos de Deepgram antes de pasar a Groq." }, "auto": { - "when": "Úselo cuando necesite un enrutamiento de puntuación multifactor basado en el costo, la latencia y la calidad.", - "avoid": "Evítelo cuando necesite un orden de prioridad estricto o persistencia histórica.", - "example": "Ejemplo: solicitudes de equilibrio entre modelos con diferentes puntos fuertes." + "when": "Úsalo cuando necesites un enrutamiento con puntuación multifactor basada en coste, latencia y calidad.", + "avoid": "Evítalo cuando necesites un orden de prioridad estricto o persistencia histórica.", + "example": "Ejemplo: equilibrar solicitudes entre modelos con diferentes puntos fuertes." }, "lkgp": { - "when": "Úselo cuando desee enrutar según las tasas históricas de éxito y el rendimiento.", - "avoid": "Evite cuando los datos históricos sean limitados o poco confiables.", - "example": "Ejemplo: ruta hacia modelos con un buen historial en tareas específicas." + "when": "Úsalo cuando quieras enrutar según las tasas de éxito históricas y el rendimiento.", + "avoid": "Evítalo cuando los datos históricos sean limitados o poco fiables.", + "example": "Ejemplo: enrutar a modelos con un buen historial en tareas específicas." }, "context-optimized": { - "when": "Úselo cuando necesite optimizar el uso de la ventana de contexto en todos los modelos.", - "avoid": "Evite cuando los modelos tengan una duración de contexto similar o las tareas sean simples.", + "when": "Úsalo cuando necesites optimizar el uso de la ventana de contexto entre modelos.", + "avoid": "Evítalo cuando los modelos tengan longitudes de contexto similares o las tareas sean sencillas.", "example": "Ejemplo: distribuir conversaciones largas entre modelos con ventanas de contexto más grandes." } }, "advancedHelp": { - "maxRetries": "Cuántos reintentos se intentan antes de fallar una solicitud.", - "retryDelay": "Initial wait between retries. Higher values reduce burst pressure.", - "timeout": "Maximum request duration before aborting.", - "healthcheck": "Skips unhealthy models/providers from routing decisions.", - "concurrencyPerModel": "Max simultaneous requests allowed per model in round-robin.", - "queueTimeout": "How long a request can wait in queue before timing out.", - "failoverBeforeRetry": "Cuando está habilitado, cualquier error ascendente desencadena una conmutación por error inmediata al siguiente destino combinado, omitiendo todos los reintentos y las URL alternativas.", - "maxSetRetries": "Número de veces que se reintenta el conjunto de objetivos completo cuando todos los objetivos fallan. 0 = ningún reintento de nivel establecido.", - "setRetryDelayMs": "Retraso entre reintentos de nivel establecido, lo que da tiempo a los problemas transitorios para resolverse.", - "disableSessionStickiness": "Rotate to a different connection on every request instead of pinning a whole conversation to one connection by the first-message hash. Overrides the global default. Leave on Inherit to preserve prompt-cache hits for multi-turn chats." + "maxRetries": "Número de reintentos que se intentarán antes de que falle una solicitud.", + "retryDelay": "Espera inicial entre reintentos. Los valores más altos reducen la presión por picos.", + "timeout": "Duración máxima de la solicitud antes de cancelarla.", + "healthcheck": "Omite los modelos o proveedores no saludables en las decisiones de enrutamiento.", + "concurrencyPerModel": "Máximo de solicitudes simultáneas permitidas por modelo en round-robin.", + "queueTimeout": "Tiempo que una solicitud puede esperar en la cola antes de agotar el tiempo de espera.", + "failoverBeforeRetry": "Cuando está habilitado, cualquier error ascendente activa una conmutación por error inmediata al siguiente destino del combo, omitiendo todos los reintentos y las URL de fallback.", + "maxSetRetries": "Número de veces que se reintenta el conjunto de destinos completo cuando todos fallan. 0 = sin reintentos a nivel de conjunto.", + "setRetryDelayMs": "Retraso entre los intentos de reintento del conjunto, dando tiempo a que se resuelvan los problemas transitorios.", + "disableSessionStickiness": "Rota a una conexión diferente en cada solicitud en lugar de fijar una conversación entera a una conexión mediante el hash del primer mensaje. Anula el valor predeterminado global. Déjalo en Heredar para preservar las coincidencias de caché de prompts en chats de varios turnos." }, - "templatesTitle": "Quick templates", - "templatesDescription": "Apply a starting profile, then adjust models and config.", - "templateApply": "Apply template", - "templateHighAvailability": "High availability", - "templateHighAvailabilityDesc": "Priority routing with health checks and safe retries.", - "templateCostSaver": "Cost saver", - "templateCostSaverDesc": "Cost-optimized routing for budget-first workloads.", - "templateBalanced": "Balanced load", - "templateBalancedDesc": "Rutas menos utilizadas para distribuir la demanda a lo largo del tiempo.", - "usageGuideHide": "Esconder", + "templatesTitle": "Plantillas rápidas", + "templatesDescription": "Aplica un perfil inicial y, a continuación, ajusta los modelos y la configuración.", + "templateApply": "Aplicar plantilla", + "templateHighAvailability": "Alta disponibilidad", + "templateHighAvailabilityDesc": "Enrutamiento prioritario con comprobaciones de estado y reintentos seguros.", + "templateCostSaver": "Ahorro de costes", + "templateCostSaverDesc": "Enrutamiento optimizado por coste para cargas de trabajo con presupuesto limitado.", + "templateBalanced": "Carga equilibrada", + "templateBalancedDesc": "Enrutamiento al menos utilizado para repartir la demanda a lo largo del tiempo.", + "usageGuideHide": "Ocultar", "usageGuideDontShowAgain": "No volver a mostrar", - "usageGuideShow": "mostrar guía", + "usageGuideShow": "Mostrar guía", "quickTestTitle": "Combo listo para validar", - "quickTestDescription": "Ejecute una prueba ahora para confirmar el comportamiento de reserva y latencia.", - "testNow": "Prueba ahora", + "quickTestDescription": "Ejecuta una prueba ahora para confirmar el comportamiento del fallback y la latencia.", + "testNow": "Probar ahora", "pricingCoverage": "Cobertura de precios", - "pricingCoverageHint": "La optimización de costos funciona mejor cuando todos los modelos combinados tienen precios.", + "pricingCoverageHint": "La optimización por coste funciona mejor cuando todos los modelos del combo tienen precios.", "pricingAvailable": "Precios disponibles", "pricingMissing": "Sin precios", - "pricingAvailableShort": "carillo", + "pricingAvailableShort": "con precio", "pricingMissingShort": "sin precio", "warningRoundRobinSingleModel": "El round-robin es más útil con al menos 2 modelos.", - "warningCostOptimizedPartialPricing": "Solo {priced} de los modelos {total} tienen precios. El enrutamiento puede tener en cuenta parcialmente los costos.", - "warningCostOptimizedNoPricing": "No se encontraron datos de precios para este combo. El costo optimizado puede enrutarse inesperadamente.", - "filterAll": "All", - "filterIntelligent": "Intelligent", - "filterDeterministic": "Deterministic", - "filterEmptyTitle": "No combos match this strategy filter.", - "filterEmptyIntelligentDescription": "Create an auto or LKGP combo to populate the intelligent routing dashboard.", - "filterEmptyDeterministicDescription": "Only auto and LKGP combos exist right now. Switch back to All or create a deterministic combo.", - "readinessTitle": "¿Listo para guardar?", - "readinessDescription": "Revisa la lista de verificación antes de crear o actualizar este combo.", + "warningCostOptimizedPartialPricing": "Solo {priced} de {total} modelos tienen precios. Es posible que el enrutamiento tenga parcialmente en cuenta los costes.", + "warningCostOptimizedNoPricing": "No se han encontrado datos de precios para este combo. El enrutamiento optimizado por coste puede comportarse de forma inesperada.", + "filterAll": "Todos", + "filterIntelligent": "Inteligente", + "filterDeterministic": "Determinista", + "filterEmptyTitle": "Ningún combo coincide con este filtro de estrategia.", + "filterEmptyIntelligentDescription": "Crea un combo automático o LKGP para poblar el panel de enrutamiento inteligente.", + "filterEmptyDeterministicDescription": "Actualmente solo existen combos automáticos y LKGP. Vuelve a Todos o crea un combo determinista.", + "readinessTitle": "¿Todo listo para guardar?", + "readinessDescription": "Revisa la lista de comprobación antes de crear o actualizar este combo.", "readinessCheckName": "El nombre del combo es válido", "readinessCheckModels": "Hay al menos un modelo seleccionado", - "readinessCheckWeights": "El total de pesos es 100%", - "readinessCheckWeightsOptional": "La regla de pesos no aplica", - "readinessCheckPricing": "Hay datos de precios disponibles", - "readinessCheckPricingOptional": "La regla de precios no aplica", - "saveBlockedTitle": "El guardado está bloqueado hasta corregir estos puntos:", + "readinessCheckWeights": "El total de los pesos es 100%", + "readinessCheckWeightsOptional": "La regla de pesos no es necesaria", + "readinessCheckPricing": "Los datos de precios están disponibles", + "readinessCheckPricingOptional": "La regla de precios no es necesaria", + "saveBlockedTitle": "El guardado está bloqueado hasta que se resuelvan los siguientes elementos:", "saveBlockName": "Define un nombre para el combo.", "saveBlockModels": "Añade al menos un modelo.", - "saveBlockWeighted": "Ajusta los pesos a 100% (actual: {total}%).", - "saveBlockPricing": "Añade precios para al menos un modelo o elige otra estrategia.", + "saveBlockWeighted": "Ajusta los pesos al 100% (actual: {total}%).", + "saveBlockPricing": "Añade precios para al menos un modelo o elige una estrategia diferente.", "recommendationsLabel": "Configuración recomendada", "applyRecommendations": "Aplicar recomendaciones", "recommendationsUpdated": "Recomendaciones actualizadas para {strategy}.", - "recommendationsApplied": "Se aplicaron recomendaciones a este combo.", - "intelligentPanelTitle": "Intelligent Routing Dashboard", - "intelligentPanelDesc": "Real-time scoring and health status for this auto-routing combo.", + "recommendationsApplied": "Recomendaciones aplicadas a este combo.", + "intelligentPanelTitle": "Panel de enrutamiento inteligente", + "intelligentPanelDesc": "Puntuación en tiempo real y estado de salud para este combo de enrutamiento automático.", "configOnlyStatus": "Vista de configuración", - "configOnlyHint": "Este panel muestra solo los parámetros de enrutamiento. El estado del disyuntor en tiempo real está en la página de Salud.", + "configOnlyHint": "Este panel muestra únicamente los parámetros de enrutamiento. El estado del disyuntor en tiempo real está disponible en la página de Salud.", "routingInputs": "Parámetros de enrutamiento", - "routingInputsHint": "El paquete de modos y los pesos se mantienen aquí; el estado del disyuntor en tiempo real se mantiene en la página de Salud.", - "emailVisibilityHint": "Los correos de cuentas aquí siguen el selector global de privacidad.", - "emailVisibilityTooltip": "Use the eye icon to reveal or hide account emails globally across combos, providers and quota screens.", - "manualModel": "Manual model", - "manualModelInvalid": "Enter a model as provider/model.", - "manualModelUnknownProvider": "Unknown provider prefix.", - "builderDynamicAccountShort": "Dynamic account", - "builderNeedValidName": "Define a valid combo name before continuing.", - "statusOverview": "Status Overview", - "normalOperation": "Normal Operation", - "allProvidersHealthy": "Providers are reporting healthy routing conditions.", - "incidentMode": "Incident Mode", - "highCircuitBreakerRate": "High circuit breaker trip rate detected.", - "activeModePack": "Active Mode Pack", - "modePackUpdated": "Mode pack updated to {pack}.", - "modePackHint": "Switch presets to bias the routing engine without rebuilding the combo.", - "providerScores": "Provider Scores", - "allProvidersEvaluated": "No candidate pool configured. All active providers are evaluated at runtime.", - "excludedProviders": "Excluded Providers", - "excludedProvidersHint": "Providers with an OPEN circuit breaker are temporarily excluded from routing.", - "noExcludedProviders": "No providers are currently excluded.", + "routingInputsHint": "El paquete de modos y la ponderación se quedan aquí; el estado de ejecución del disyuntor se queda en la página de Salud.", + "emailVisibilityHint": "Los correos de las cuentas siguen aquí el interruptor global de privacidad.", + "emailVisibilityTooltip": "Usa el icono del ojo para mostrar u ocultar los correos de las cuentas de forma global en los combos, proveedores y pantallas de cuotas.", + "manualModel": "Modelo manual", + "manualModelInvalid": "Introduce un modelo como proveedor/modelo.", + "manualModelUnknownProvider": "Prefijo de proveedor desconocido.", + "builderDynamicAccountShort": "Cuenta dinámica", + "builderNeedValidName": "Define un nombre de combo válido antes de continuar.", + "statusOverview": "Resumen de estado", + "normalOperation": "Operación normal", + "allProvidersHealthy": "Los proveedores informan de condiciones de enrutamiento saludables.", + "incidentMode": "Modo de incidencia", + "highCircuitBreakerRate": "Se ha detectado una alta tasa de activación del disyuntor.", + "activeModePack": "Paquete de modos activo", + "modePackUpdated": "Paquete de modos actualizado a {pack}.", + "modePackHint": "Cambia los preajustes para sesgar el motor de enrutamiento sin necesidad de reconstruir el combo.", + "providerScores": "Puntuaciones de proveedores", + "allProvidersEvaluated": "No hay ningún conjunto de candidatos configurado. Todos los proveedores activos se evalúan en tiempo de ejecución.", + "excludedProviders": "Proveedores excluidos", + "excludedProvidersHint": "Los proveedores con un circuit breaker ABIERTO (OPEN) se excluyen temporalmente del enrutamiento.", + "noExcludedProviders": "No hay ningún proveedor excluido actualmente.", "cooldownMinutes": "Cooldown: {minutes}m", - "builderIntelligentTitle": "Intelligent Routing Configuration", - "builderIntelligentDesc": "Configure the multi-factor scoring engine for this auto-routing combo.", - "candidatePoolLabel": "Candidate Pool", - "candidatePoolHint": "Select which providers this engine should evaluate. Leave empty to use all active providers.", - "candidatePoolEmpty": "No active providers available yet.", - "candidatePoolAllProviders": "All providers", - "modePackLabel": "Mode Pack", - "routerStrategyLabel": "Router Strategy", - "strategyRules": "Rules (6-Factor Scoring)", - "explorationRateLabel": "Exploration Rate", - "explorationRateHint": "{percent}% of requests can explore non-optimal providers.", - "budgetCapLabel": "Budget Cap (USD / request)", - "budgetCapPlaceholder": "No limit", - "advancedWeightsTitle": "Advanced: Scoring Weights", - "nestedComboFlatten": "Flatten nested combos", - "nestedComboExecute": "Execute nested combos as targets", - "effectiveRoutingShare": "Effective routing share (weight ÷ total)", - "weightQuota": "Quota", - "weightHealth": "Health", - "weightCostInv": "Cost", - "weightLatencyInv": "Latency", - "weightTaskFit": "Task Fit", - "weightStability": "Stability", - "weightTierPriority": "Tier", - "weightCacheAffinity": "Cache Hit Affinity", - "reviewIntelligentTitle": "Intelligent Routing Config", + "builderIntelligentTitle": "Configuración de enrutamiento inteligente", + "builderIntelligentDesc": "Configura el motor de puntuación multifactor para este combo de autoenrutamiento.", + "candidatePoolLabel": "Pool de candidatos", + "candidatePoolHint": "Selecciona los proveedores que debe evaluar este motor. Déjalo vacío para usar todos los proveedores activos.", + "candidatePoolEmpty": "Aún no hay proveedores activos disponibles.", + "candidatePoolAllProviders": "Todos los proveedores", + "modePackLabel": "Pack de modo", + "routerStrategyLabel": "Estrategia de enrutamiento", + "strategyRules": "Reglas (puntuación de 6 factores)", + "explorationRateLabel": "Tasa de exploración", + "explorationRateHint": "El {percent}% de las solicitudes puede explorar proveedores no óptimos.", + "budgetCapLabel": "Límite de presupuesto (USD / solicitud)", + "budgetCapPlaceholder": "Sin límite", + "advancedWeightsTitle": "Avanzado: Pesos de puntuación", + "nestedComboFlatten": "Aplanar combos anidados", + "nestedComboExecute": "Ejecutar combos anidados como destinos", + "effectiveRoutingShare": "Cuota de enrutamiento efectiva (peso ÷ total)", + "weightQuota": "Cuota", + "weightHealth": "Estado de salud", + "weightCostInv": "Coste", + "weightLatencyInv": "Latencia", + "weightTaskFit": "Ajuste a la tarea", + "weightStability": "Estabilidad", + "weightTierPriority": "Nivel", + "weightCacheAffinity": "Afinidad de aciertos en caché", + "reviewIntelligentTitle": "Config. de enrutamiento inteligente", "strategyRecommendations": { "priority": { "title": "Base tolerante a fallos", - "description": "Usa un modelo principal y mantén una cadena de fallback corta y confiable.", - "tip1": "Coloca primero tu modelo más confiable.", - "tip2": "Mantén 1-2 modelos de respaldo con calidad similar.", + "description": "Usa un modelo principal y mantén una cadena de fallback corta y fiable.", + "tip1": "Coloca primero tu modelo más fiable.", + "tip2": "Mantén 1-2 modelos de respaldo con una calidad similar.", "tip3": "Usa reintentos seguros para absorber fallos transitorios del proveedor." }, "weighted": { "title": "Reparto de tráfico controlado", "description": "Ideal para despliegues canary y migraciones graduales entre modelos.", "tip1": "Empieza con una división conservadora como 90/10.", - "tip2": "Mantén el total en 100% y autoequilibra tras cambios.", - "tip3": "Monitorea éxito y latencia antes de subir el peso canary." + "tip2": "Mantén el total en un 100 % y autoequilibra tras realizar cambios.", + "tip3": "Supervisa el éxito y la latencia antes de aumentar el peso canary." }, "round-robin": { "title": "Reparto de carga predecible", - "description": "Mejor cuando los modelos son equivalentes y necesitas distribución estable.", + "description": "Ideal cuando los modelos son equivalentes y necesitas una distribución uniforme.", "tip1": "Usa al menos 2 modelos.", - "tip2": "Define límites de concurrencia para evitar ráfagas.", - "tip3": "Usa timeout de cola para fallar rápido bajo saturación." + "tip2": "Define límites de concurrencia para evitar sobrecargas por ráfagas.", + "tip3": "Usa el tiempo de espera (timeout) de la cola para fallar rápido en caso de saturación." }, "random": { "title": "Distribución rápida con poca configuración", - "description": "Úsala cuando necesites reparto simple sin garantías estrictas.", + "description": "Úsala cuando necesites una distribución sencilla sin garantías estrictas.", "tip1": "Usa modelos con perfiles de latencia similares.", - "tip2": "Mantén reintentos activos para absorber fallos aleatorios.", - "tip3": "Prefiérela para experimentación, no para SLA estrictos." + "tip2": "Mantén los reintentos activados para absorber fallos aleatorios.", + "tip3": "Úsala preferentemente para experimentación, no para SLA estrictos." }, "least-used": { - "title": "Balanceo adaptativo", - "description": "Enruta a modelos menos usados para reducir cuellos de botella con el tiempo.", + "title": "Equilibrio adaptativo", + "description": "Enruta a modelos menos utilizados para reducir puntos calientes con el tiempo.", "tip1": "Funciona mejor con tráfico continuo.", - "tip2": "Combínala con health checks para un balanceo más seguro.", - "tip3": "Sigue el uso por modelo para validar la distribución." + "tip2": "Combínala con comprobaciones de estado para un balanceo más seguro.", + "tip3": "Rastrea el uso por modelo para validar las mejoras de distribución." }, "cost-optimized": { - "title": "Enrutamiento orientado a costo", - "description": "Enruta a modelos más baratos cuando hay metadatos de precio disponibles.", - "tip1": "Asegura cobertura de precios para todos los modelos seleccionados.", - "tip2": "Mantén un fallback de calidad para prompts difíciles.", - "tip3": "Úsala en batch/tareas de fondo donde el costo sea el KPI principal." + "title": "Enrutamiento priorizando el coste", + "description": "Enruta a modelos de menor coste cuando se dispone de metadatos de precios.", + "tip1": "Asegúrate de tener cobertura de precios para todos los modelos seleccionados.", + "tip2": "Mantén un fallback de calidad para prompts complejos.", + "tip3": "Úsala para tareas por lotes o en segundo plano donde el coste sea el KPI principal." }, "reset-aware": { - "title": "Rotación de cuentas con reconocimiento de reinicio", - "description": "Equilibra la cuota restante del proveedor con el tiempo de reinicio.", - "tip1": "Utilice pasos de cuenta explícitos o enrutamiento de etiquetas de cuenta para proveedores con telemetría de cuotas.", - "tip2": "Sesión de ajuste versus pesas semanales cuando el agotamiento a corto plazo es más riesgoso.", - "tip3": "Mantenga la banda de unión pequeña para que las cuentas equivalentes sigan rotando de manera justa." + "title": "Rotación de cuentas adaptada al reinicio", + "description": "Equilibra la cuota restante del proveedor con los tiempos de reinicio.", + "tip1": "Usa pasos explícitos de cuenta o enrutamiento por etiquetas de cuenta en proveedores con telemetría de cuota.", + "tip2": "Ajusta los pesos de sesión frente a los semanales cuando el agotamiento a corto plazo sea más riesgoso.", + "tip3": "Mantén un margen de empate estrecho para que las cuentas equivalentes sigan rotando de forma equitativa." }, "strict-random": { - "title": "Shuffle deck distribution", - "description": "Each model is used exactly once per cycle before reshuffling.", - "tip1": "Use at least 2 models for meaningful distribution.", - "tip2": "Works best with equivalent-performance models.", - "tip3": "Ideal for load balancing across multiple API accounts." + "title": "Distribución tipo barajado", + "description": "Cada modelo se utiliza exactamente una vez por ciclo antes de volver a barajar.", + "tip1": "Usa al menos 2 modelos para obtener una distribución significativa.", + "tip2": "Funciona mejor con modelos de rendimiento equivalente.", + "tip3": "Ideal para el balanceo de carga entre múltiples cuentas de API." }, "fill-first": { - "description": "Agote las cuotas de los proveedores de forma secuencial antes de retroceder.", - "tip1": "Úselo para enrutamiento basado en cuotas con cadenas de respaldo claras.", - "tip2": "Establezca cuotas con precisión para evitar retrocesos prematuros.", - "tip3": "Funciona mejor con proveedores que ofrecen niveles gratuitos o grupos de crédito.", - "title": "Agotamiento de cuotas" + "description": "Agota secuencialmente las cuotas de los proveedores antes de recurrir al fallback.", + "tip1": "Usa esta estrategia para el enrutamiento basado en cuotas con cadenas de fallback claras.", + "tip2": "Define las cuotas con precisión para evitar fallbacks prematuros.", + "tip3": "Funciona mejor con proveedores que ofrecen niveles gratuitos o bolsas de crédito.", + "title": "Agotamiento de cuota" }, "auto": { - "description": "Ruta basada en puntuación en tiempo real de costo, latencia, calidad y estado.", - "tip1": "Deje que el motor equilibre múltiples factores automáticamente.", - "tip2": "Supervise qué factores impulsan las decisiones de enrutamiento en los registros.", - "tip3": "Úselo para cargas de trabajo complejas donde ningún factor domina.", + "description": "Enruta en función de la puntuación en tiempo real de coste, latencia, calidad y estado de salud.", + "tip1": "Deja que el motor equilibre varios factores automáticamente.", + "tip2": "Supervisa en los logs qué factores impulsan las decisiones de enrutamiento.", + "tip3": "Úsalo para cargas de trabajo complejas en las que no domine un solo factor.", "title": "Optimización multifactor" }, "lkgp": { - "description": "Ruta basada en patrones históricos de desempeño y éxito.", - "tip1": "Requiere suficiente historial de solicitudes para realizar predicciones precisas.", - "tip2": "Bueno para cargas de trabajo con patrones de rendimiento de modelo consistentes.", - "tip3": "Supervise la precisión de la predicción y ajuste las ponderaciones según sea necesario.", + "description": "Enruta en función del rendimiento histórico y los patrones de éxito.", + "tip1": "Requiere un historial de solicitudes suficiente para realizar predicciones precisas.", + "tip2": "Adecuado para cargas de trabajo con patrones de rendimiento de modelo consistentes.", + "tip3": "Supervisa la precisión de las predicciones y ajusta los pesos según sea necesario.", "title": "Enrutamiento basado en historial" }, "context-optimized": { - "description": "Optimice el enrutamiento según el uso de la ventana de contexto y la eficiencia del token.", - "tip1": "Enrute conversaciones largas a modelos con ventanas de contexto más grandes.", - "tip2": "Supervise la utilización del contexto para evitar el desperdicio de tokens.", - "tip3": "Lo mejor para la IA conversacional que requiere una amplia retención del contexto.", + "description": "Optimiza el enrutamiento según el uso de la ventana de contexto y la eficiencia de los tokens.", + "tip1": "Enruta conversaciones largas a modelos con ventanas de contexto más amplias.", + "tip2": "Supervisa el uso del contexto para evitar el desperdicio de tokens.", + "tip3": "Ideal para IA conversacional que requiere conservar un contexto amplio.", "title": "Optimización del contexto" }, "context-relay": { - "description": "Es mejor cuando se espera una rotación de cuentas y la siguiente cuenta debe heredar un resumen de tareas simplificado.", - "tip1": "Úselo con proveedores que rotan cuentas para la misma familia de modelos.", - "tip2": "Establezca el umbral de transferencia por debajo de los límites estrictos de cuota para el tiempo de generación del resumen.", - "tip3": "Solo establezca un modelo de resumen dedicado si el principal es demasiado caro o inestable.", + "description": "Ideal cuando se prevé una rotación de cuentas y la siguiente cuenta deba heredar un resumen simplificado de la tarea.", + "tip1": "Úsalo con proveedores que rotan cuentas dentro de la misma familia de modelos.", + "tip2": "Define el umbral de traspaso por debajo de los límites estrictos de cuota para dejar tiempo a la generación del resumen.", + "tip3": "Define un modelo de resumen dedicado únicamente si el principal es demasiado caro o inestable.", "title": "Prioridad de continuidad de sesión" }, "p2c": { - "description": "Ruta al proveedor con la carga actual más baja según métricas en tiempo real.", - "tip1": "Supervise las métricas de estado del proveedor para una evaluación de carga precisa.", - "tip2": "Funciona mejor con grupos de proveedores homogéneos.", - "tip3": "Ajuste la sensibilidad para evitar oscilaciones durante los picos de tráfico.", + "description": "Enruta al proveedor con la menor carga actual basándose en métricas en tiempo real.", + "tip1": "Supervisa las métricas de estado de salud del proveedor para evaluar la carga con precisión.", + "tip2": "Funciona mejor con pools de proveedores homogéneos.", + "tip3": "Ajusta la sensibilidad para evitar oscilaciones durante picos de tráfico.", "title": "El poder de dos opciones" } }, "templateFreeStack": "Free Stack ($0)", - "templateFreeStackDesc": "Round-robin across all free providers: Kiro (Claude), Qoder (5 models), Qwen (4 models). Zero cost, never stops coding.", - "auto": "Auto Combo", - "autoDesc": "Self-healing smart routing pool (Performance optimized)", - "lkgp": "LKGP Mode", - "lkgpDesc": "Last Known Good Provider (Predictable resilience)", - "wizardGuideTitle": "Getting Started with Combos", - "wizardGuideDesc": "Create model combos to route AI traffic intelligently", - "wizardGuideHint": "or click + Create Combo above", - "createFirstCombo": "Create Your First Combo", - "wizardStep1Title": "Name Your Combo", - "wizardStep1Desc": "Give your combo a unique name to identify it in routing rules", - "wizardStep2Title": "Add Models", - "wizardStep2Desc": "Select AI models and arrange their fallback priority order", - "wizardStep3Title": "Choose Strategy", - "wizardStep3Desc": "Pick how requests are distributed across your models - 13 strategies available", - "wizardStep4Title": "Review & Save", - "wizardStep4Desc": "Review your configuration and activate the combo", - "emailVisibilityStateOn": "On", - "emailVisibilityStateOff": "Off", - "reorderHandle": "Drag to reorder", - "failedReorder": "Failed to reorder models", - "builderFlowTitle": "Combo Builder Flow", + "templateFreeStackDesc": "Round-robin entre todos los proveedores gratuitos: Kiro (Claude), Qoder (5 modelos), Qwen (4 modelos). Sin coste, sin parar de programar.", + "auto": "Auto inteligente", + "autoDesc": "Pool de enrutamiento inteligente autorreparable con puntuación multifactor", + "lkgp": "Modo LKGP", + "lkgpDesc": "Prioriza el último proveedor que completó con éxito una solicitud", + "wizardGuideTitle": "Primeros pasos con Combos", + "wizardGuideDesc": "Crea combos de modelos para enrutar el tráfico de IA de forma inteligente", + "wizardGuideHint": "o haz clic en + Crear combo arriba", + "createFirstCombo": "Crea tu primer combo", + "wizardStep1Title": "Asigna un nombre a tu combo", + "wizardStep1Desc": "Asigna un nombre único a tu combo para identificarlo en las reglas de enrutamiento", + "wizardStep2Title": "Añade modelos", + "wizardStep2Desc": "Selecciona modelos de IA y organiza su orden de prioridad de fallback", + "wizardStep3Title": "Elige la estrategia", + "wizardStep3Desc": "Selecciona cómo se distribuyen las solicitudes entre tus modelos: 14 estrategias disponibles", + "wizardStep4Title": "Revisar y guardar", + "wizardStep4Desc": "Revisa tu configuración y activa el combo", + "emailVisibilityStateOn": "Activado", + "emailVisibilityStateOff": "Desactivado", + "reorderHandle": "Arrastrar para reordenar", + "failedReorder": "Error al reordenar los modelos", + "builderFlowTitle": "Flujo del generador de combos", "builderStage": { "basics": { - "label": "Basics", - "description": "Name and starting template" + "label": "Básicos", + "description": "Nombre y plantilla inicial" }, "steps": { - "label": "Steps", - "description": "Provider, model, and account selection" + "label": "Pasos", + "description": "Selección de proveedor, modelo y cuenta" }, "strategy": { - "label": "Strategy", - "description": "Routing behavior and advanced settings" + "label": "Estrategia", + "description": "Comportamiento de enrutamiento y ajustes avanzados" }, "intelligent": { - "label": "Smart Routing", - "description": "Auto-routing candidate pool, presets, and scoring" + "label": "Enrutamiento inteligente", + "description": "Pool de candidatos de autoenrutamiento, ajustes preestablecidos y puntuación" }, "review": { - "label": "Review", - "description": "Final validation before saving" + "label": "Revisar", + "description": "Validación final antes de guardar" } }, - "builderStageVisited": "Stage completed", - "builderStageCurrent": "Current stage", - "builderStagePending": "Pending", - "builderStageLocked": "Locked — complete previous stage first", - "builderTitle": "Build a Combo", - "builderBrowseCatalog": "Browse catalog", - "builderProvider": "Provider", - "builderLoadingProviders": "Loading providers...", - "builderSelectProvider": "Select provider", - "builderModel": "Model", - "builderSelectModel": "Select model", - "builderProviderFirst": "Pick provider first", - "builderAccount": "Account", - "builderPreview": "Preview", - "builderAddStep": "Add step", + "builderStageVisited": "Etapa completada", + "builderStageCurrent": "Etapa actual", + "builderStagePending": "Pendiente", + "builderStageLocked": "Bloqueada: completa primero la etapa anterior", + "builderTitle": "Crear un combo", + "builderBrowseCatalog": "Explorar catálogo", + "builderProvider": "Proveedor", + "builderLoadingProviders": "Cargando proveedores...", + "builderSelectProvider": "Seleccionar proveedor", + "builderModel": "Modelo", + "builderSelectModel": "Seleccionar modelo", + "builderProviderFirst": "Elige primero un proveedor", + "builderAccount": "Cuenta", + "builderPreview": "Vista previa", + "builderAddStep": "Añadir paso", "builderDuplicateExact": "Este paso exacto de proveedor/modelo/cuenta ya está en el combo.", - "builderComboRef": "Combo Ref", - "builderAddComboRef": "Add combo reference", - "builderComboRefStep": "Add combo reference", - "builderPinnedAccount": "Pinned Account", - "builderLegacyEntry": "Legacy entry", - "reviewName": "Name", - "reviewStrategy": "Strategy", - "reviewSteps": "Steps", - "reviewAccounts": "Accounts", - "reviewProviders": "Providers", - "reviewComboRefs": "Combo References", - "reviewAdvanced": "Advanced Settings", - "reviewAgentFlags": "Agent Flags", - "reviewSequence": "Model Sequence", - "reviewNoSteps": "No steps configured", - "builderStagesDescription": "Complete cada etapa para definir combos, crear pasos, seleccionar una estrategia de enrutamiento y revisar los resultados.", - "builderStepsDescription": "Cree cada paso combinado en orden: proveedor, modelo y luego cuenta. Esto permite reutilizar el mismo proveedor y modelo en diferentes cuentas.", - "selectProvider": "Seleccionar Proveedor", - "selectProviderPlaceholder": "Seleccione un proveedor", + "builderComboRef": "Ref. de combo", + "builderAddComboRef": "Añadir referencia a combo", + "builderComboRefStep": "Añadir referencia a combo", + "builderPinnedAccount": "Cuenta fijada", + "builderLegacyEntry": "Entrada heredada", + "reviewName": "Nombre", + "reviewStrategy": "Estrategia", + "reviewSteps": "Pasos", + "reviewAccounts": "Cuentas", + "reviewProviders": "Proveedores", + "reviewComboRefs": "Referencias a combo", + "reviewAdvanced": "Ajustes avanzados", + "reviewAgentFlags": "Indicadores de agente", + "reviewSequence": "Secuencia de modelos", + "reviewNoSteps": "No hay pasos configurados", + "builderStagesDescription": "Completa cada etapa en orden para definir combos, crear pasos, seleccionar la estrategia de enrutamiento y revisar los resultados.", + "builderStepsDescription": "Crea cada paso del combo en orden: proveedor, modelo y luego cuenta. Esto permite reutilizar el mismo proveedor y modelo en diferentes cuentas.", + "selectProvider": "Seleccionar proveedor", + "selectProviderPlaceholder": "Selecciona un proveedor", "selectModel": "Seleccionar modelo", - "selectModelPlaceholder": "Seleccione un proveedor primero", + "selectModelPlaceholder": "Selecciona un proveedor primero", "selectAccount": "Seleccionar cuenta", - "selectComboToReference": "Seleccione combo para referencia", - "comboReference": "Referencia combinada", - "addComboReference": "Agregar referencia combinada", - "addStepBeforeContinue": "Agregue al menos un paso antes de pasar a la siguiente etapa.", + "selectComboToReference": "Selecciona un combo al que hacer referencia", + "comboReference": "Referencia a combo", + "addComboReference": "Añadir referencia a combo", + "addStepBeforeContinue": "Añade al menos un paso antes de continuar con la siguiente etapa.", "previewNextStep": "Vista previa del siguiente paso", - "autoSelectAccount": "Seleccionar cuenta automáticamente en tiempo de ejecución", - "modePackBalanced": "equilibrado", - "modePackBudget": "Presupuesto", + "autoSelectAccount": "Seleccionar la cuenta automáticamente en tiempo de ejecución", + "modePackBalanced": "Equilibrado", + "modePackBudget": "Económico", "modePackPerformance": "Rendimiento", - "modePackCustom": "personalizado", - "browseLegacyCatalog": "Explorar el catálogo combinado heredado", + "modePackCustom": "Personalizado", + "browseLegacyCatalog": "Explorar el catálogo de combos heredado", "agentFeaturesTitle": "Funciones del agente", - "agentFeaturesDescription": "Habilite funciones avanzadas para los agentes que usan este combo", - "responseValidationTitle": "Response validation", - "responseValidationHelp": "Fail over to the next target when a 200 OK body fails these checks (assistant content).", - "responseValidationForbidden": "Forbidden substrings (one per line)", - "responseValidationRequired": "Required substrings (one per line)", - "responseValidationMinLength": "Minimum content length (chars)", - "responseValidationJsonPaths": "JSON-path checks", - "responseValidationAddCheck": "+ Add check", + "agentFeaturesDescription": "Habilita funciones avanzadas para los agentes que usan este combo", + "responseValidationTitle": "Validación de respuesta", + "responseValidationHelp": "Realiza un fallback al siguiente destino cuando un cuerpo 200 OK no supera estas comprobaciones (contenido del asistente).", + "responseValidationForbidden": "Subcadenas prohibidas (una por línea)", + "responseValidationRequired": "Subcadenas obligatorias (una por línea)", + "responseValidationMinLength": "Longitud mínima del contenido (caracteres)", + "responseValidationJsonPaths": "Comprobaciones de JSON-path", + "responseValidationAddCheck": "+ Añadir comprobación", "agentFeaturesSystemMessageOverride": "Anular mensaje del sistema", "agentFeaturesSystemMessagePlaceholder": "Eres un asistente experto...", - "agentFeaturesSystemMessageHint": "Anulación de mensajes del sistema para agentes", + "agentFeaturesSystemMessageHint": "Anulación de mensaje del sistema para agentes", "agentFeaturesToolFilterRegex": "/patrón-regex/", "agentFeaturesToolFilterHint": "Regex de filtro de herramientas para agentes", - "agentFeaturesContextCacheHint": "Habilite el caché en contexto para las herramientas del agente", - "agentFeaturesContextCacheProtection": "Proteger el caché de las mutaciones de la herramienta del agente", + "agentFeaturesContextCacheHint": "Habilita la caché en contexto para las herramientas del agente", + "agentFeaturesContextCacheProtection": "Proteger la caché de las mutaciones de la herramienta del agente", "agentFeaturesContextLength": "Longitud del contexto", - "agentFeaturesContextLengthPlaceholder": "por ej. 128000", + "agentFeaturesContextLengthPlaceholder": "p. ej. 128000", "agentFeaturesContextLengthHint": "Define la ventana de contexto para este combo en /v1/models.", - "agentFeaturesContextLengthErrorInteger": "La longitud del contexto debe ser un número entero válido.", + "agentFeaturesContextLengthErrorInteger": "La longitud del contexto debe ser un número entero válido", "agentFeaturesContextLengthErrorRange": "La longitud del contexto debe estar entre 1000 y 2000000", "compressionOverride": "Anulación de compresión", "modePack": "Paquete de modo", - "disableSessionStickiness": "Disable session stickiness", - "sessionStickinessEnabled": "Stickiness on", - "sessionStickinessDisabled": "Stickiness off", - "kimiPresetTitle": "Kimi Coding preset", - "kimiPresetDescription": "Kimi K3 as the primary model (Moonshot API), with automatic fallback to your Kimi Code connections (kimi-coding, kimi-web) when configured.", - "kimiPresetCta": "Add preset" + "disableSessionStickiness": "Desactivar persistencia de sesión", + "sessionStickinessEnabled": "Persistencia activada", + "sessionStickinessDisabled": "Persistencia desactivada", + "kimiPresetTitle": "Preajuste de Kimi Coding", + "kimiPresetDescription": "Kimi K3 como modelo principal (Moonshot API), con fallback automático a tus conexiones de Kimi Code (kimi-coding, kimi-web) cuando esté configurado.", + "kimiPresetCta": "Añadir preajuste" }, "costs": { - "title": "Costos", - "pageDescription": "Realice un seguimiento de los gastos, analice tendencias y administre su presupuesto de IA en todos los proveedores", + "title": "Costes", + "pageDescription": "Realiza un seguimiento de los gastos, analiza tendencias y gestiona tu presupuesto de IA en todos los proveedores", "overview": "Descripción general", "budget": "Presupuesto", - "totalCost": "Costo total", - "breakdown": "Desglose de costos", - "noData": "Sin datos de coste", + "totalCost": "Coste total", + "breakdown": "Desglose de costes", + "noData": "Sin datos de costes", "byModel": "Por modelo", "byProvider": "Por proveedor", - "range7d": "7 dias", - "range30d": "30 dias", + "range7d": "7 días", + "range30d": "30 días", "range90d": "90 días", - "range180d": "180 Days", - "range365d": "365 Days", + "range180d": "180 días", + "range365d": "365 días", "rangeAll": "Todo el tiempo", - "spend30d": "Spend30D", - "activeModels": "Active Models", - "selectedWindow": "Selected Window", - "activeProviders": "Active Providers", - "overviewTitle": "Overview Title", - "spend7d": "Spend7D", - "avgCostPerRequest": "Avg Cost Per Request", - "noCostDataDescription": "No Cost Data Description", - "spendToday": "Spend Today", - "overviewLoadFailed": "Overview Load Failed", - "overviewDescription": "Overview Description", - "providerShare": "Provider Share", - "topProviders": "Top Providers", - "costTrend": "Cost Trend", - "noCostDataTitle": "No Cost Data Title", - "topModels": "Top Models", - "requestsInWindow": "Requests In Window", + "spend30d": "Gasto 30D", + "activeModels": "Modelos activos", + "selectedWindow": "Periodo seleccionado", + "activeProviders": "Proveedores activos", + "overviewTitle": "Descripción general de costes", + "spend7d": "Gasto 7D", + "avgCostPerRequest": "Coste medio / solicitud", + "noCostDataDescription": "Empieza a realizar solicitudes para ver los datos de costes aquí. Los costes se registran automáticamente para todos los proveedores.", + "spendToday": "Gasto de hoy", + "overviewLoadFailed": "Error al cargar la descripción general de costes", + "overviewDescription": "Desglose de gastos en tiempo real en todos los proveedores y modelos conectados", + "providerShare": "Cuota por proveedor", + "topProviders": "Proveedores principales", + "costTrend": "Tendencia de costes", + "noCostDataTitle": "Aún no hay datos de costes", + "topModels": "Modelos principales", + "requestsInWindow": "Solicitudes en el periodo", "tokenUsage": "Uso de tokens", - "totalTokens": "Fichas totales", - "inputTokens": "Fichas de entrada", - "outputTokens": "Fichas de salida", - "inputOutputRatio": "Relación entrada/salida", - "tokens": "fichas", + "totalTokens": "Total de tokens", + "inputTokens": "Tokens de entrada", + "outputTokens": "Tokens de salida", + "inputOutputRatio": "Ratio entrada/salida", + "tokens": "tokens", "routingEfficiency": "Eficiencia de enrutamiento", - "fallbackCount": "Solicitudes de respaldo", - "fallbackRate": "Tasa de retroceso", - "modelCoverage": "Cobertura del modelo", + "fallbackCount": "Solicitudes de fallback", + "fallbackRate": "Tasa de fallback", + "modelCoverage": "Cobertura de modelos", "modelCoverageDesc": "% de solicitudes con modelo explícito", - "outOfRequests": "fuera de {total} solicitudes", - "costByApiKey": "Costo por clave API", - "costByAccount": "Costo por cuenta", - "apiKeyName": "Clave API", - "account": "cuenta", + "outOfRequests": "de {total} solicitudes", + "costByApiKey": "Coste por clave de API", + "costByAccount": "Coste por cuenta", + "apiKeyName": "Clave de API", + "account": "Cuenta", "requests": "Solicitudes", - "cost": "Costo", - "dayStreak": "racha de dias", + "cost": "Coste", + "dayStreak": "días de racha", "weeklyUsagePattern": "Patrón de uso semanal", "activityHeatmap": "Actividad (365 días)", - "less": "menos", + "less": "Menos", "more": "Más", "monthlyForecast": "Pronóstico mensual", "forecastBasis": "Basado en los últimos {days} días", - "avgDailyCost": "Promedio costo diario", + "avgDailyCost": "Coste diario medio", "daysRemaining": "Quedan {days} días", - "periodComparison": "Comparación de períodos", - "previousPeriod": "Mitad anterior", - "currentPeriod": "Mitad actual", + "periodComparison": "Comparación de periodos", + "previousPeriod": "Periodo anterior", + "currentPeriod": "Periodo actual", "exportCSV": "Exportar como CSV", "exportJSON": "Exportar como JSON", "legacyFreeLabel": "Heredado / Gratuito", - "costExplorerTitle": "Cost Explorer", - "costExplorerDescription": "Explore spend by provider, model, API key, account, or service tier.", - "groupProvider": "Provider", - "groupModel": "Model", - "groupApiKey": "API Key", - "groupAccount": "Account", - "groupServiceTier": "Service Tier", + "costExplorerTitle": "Explorador de costes", + "costExplorerDescription": "Explora el gasto por proveedor, modelo, clave de API, cuenta o nivel de servicio.", + "groupProvider": "Proveedor", + "groupModel": "Modelo", + "groupApiKey": "Clave de API", + "groupAccount": "Cuenta", + "groupServiceTier": "Nivel de servicio", "serviceTierFast": "Rápido", "serviceTierFlex": "Flexible", "serviceTierStandard": "Estándar", "serviceTierBreakdownTitle": "Nivel de servicio", - "serviceTierBreakdownSubtitle": "Fast / Flex / Standard split", - "serviceTierUsageSaved": "usage saved", - "serviceTierCostSaved": "saved", - "serviceTierCostShareSuffix": "of cost", - "dimension": "Dimension", - "share": "Share", - "legacyOrFree": "Legacy / Free", - "filterRows": "Filter rows…", - "filterCostExplorerRows": "Filter Cost Explorer rows", - "noMatchingCostRows": "No matching cost rows", - "noMatchingCostRowsDescription": "Adjust the search text, grouping, or selected time window.", - "showingCostRows": "Showing {shown} of {total} matching rows.", - "showingTopCostRows": "Showing {shown} of {total} matching rows (top 50)." + "serviceTierBreakdownSubtitle": "Desglose Fast / Flex / Standard", + "serviceTierUsageSaved": "uso ahorrado", + "serviceTierCostSaved": "ahorrado", + "serviceTierCostShareSuffix": "del coste", + "dimension": "Dimensión", + "share": "Cuota", + "legacyOrFree": "Heredado / Gratuito", + "filterRows": "Filtrar filas...", + "filterCostExplorerRows": "Filtrar filas del explorador de costes", + "noMatchingCostRows": "No hay filas de costes coincidentes", + "noMatchingCostRowsDescription": "Ajusta el texto de búsqueda, la agrupación o el periodo de tiempo seleccionado.", + "showingCostRows": "Mostrando {shown} de {total} filas coincidentes.", + "showingTopCostRows": "Mostrando {shown} de {total} filas coincidentes (top 50)." }, "endpoint": { - "title": "Punto final API", - "available": "Puntos finales disponibles", - "cloudProxy": "Proxy en la nube", - "disableConfirm": "¿Está seguro de que desea desactivar el proxy en la nube?", - "baseUrl": "URL básica", - "apiKeyLabel": "Clave API", + "title": "Endpoint de API", + "available": "Endpoints disponibles", + "cloudProxy": "Cloud Proxy", + "disableConfirm": "¿Seguro que quieres desactivar el Cloud Proxy?", + "baseUrl": "URL base", + "apiKeyLabel": "Clave de API", "registeredKeys": "Claves registradas", - "chatCompletions": "Finalizaciones de chat", + "chatCompletions": "Chat Completions", "responses": "Respuestas", "listModels": "Listar modelos", - "usingCloudProxy": "Usando el proxy en la nube", - "usingLocalServer": "Usando el servidor local", + "usingCloudProxy": "Usando Cloud Proxy", + "usingLocalServer": "Usando servidor local", "machineId": "ID de máquina: {id}...", - "disableCloud": "Deshabilitar la nube", - "enableCloud": "Habilitar la nube", - "modelsAcrossEndpoints": "{models} modelos en {endpoints} puntos finales", - "loadingModels": "Loading available models...", - "chatDesc": "Chat streaming y no streaming con todos los proveedores", - "embeddings": "Incrustaciones", - "embeddingsDesc": "Inserciones de texto para búsqueda y canales RAG", + "disableCloud": "Desactivar nube", + "enableCloud": "Activar nube", + "modelsAcrossEndpoints": "{models} modelos en {endpoints} endpoints", + "loadingModels": "Cargando modelos disponibles...", + "chatDesc": "Chat con streaming y sin streaming con todos los proveedores", + "embeddings": "Embeddings", + "embeddingsDesc": "Embeddings de texto para búsqueda y pipelines RAG", "imageGeneration": "Generación de imágenes", - "imageDesc": "Generar imágenes a partir de mensajes de texto", - "rerank": "Reclasificar", + "imageDesc": "Generar imágenes a partir de prompts de texto", + "rerank": "Rerank", "rerankDesc": "Reclasificar documentos por relevancia para una consulta", "audioTranscription": "Transcripción de audio", "audioTranscriptionDesc": "Transcribir archivos de audio a texto (Whisper)", "textToSpeech": "Texto a voz", - "textToSpeechDesc": "Convierta texto en voz con sonido natural", - "musicGeneration": "Music Generation", - "musicDesc": "Generate music and audio tracks via ComfyUI (Stable Audio, MusicGen)", + "textToSpeechDesc": "Convertir texto en voz con sonido natural", + "musicGeneration": "Generación de música", + "musicDesc": "Generar música y pistas de audio mediante ComfyUI (Stable Audio, MusicGen)", "moderations": "Moderaciones", - "moderationsDesc": "Moderación de contenidos y clasificación de seguridad.", - "responsesDesc": "API Responses de OpenAI para Codex y flujos de trabajo agénticos avanzados", + "moderationsDesc": "Moderación de contenido y clasificación de seguridad", + "responsesDesc": "API de respuestas de OpenAI para Codex y workflows agénticos avanzados", "listModelsDesc": "Listar todos los modelos disponibles en todos los proveedores conectados", "settingsApiDesc": "Leer y modificar la configuración de OmniRoute a través de la API", - "settingsApi": "Settings API", - "categoryCore": "APIs Principales", + "settingsApi": "API de ajustes", + "categoryCore": "APIs principales", "categoryMedia": "Medios y Multi-Modal", - "categorySearch": "Search & Discovery", - "categoryUtility": "Utilidades y Gestión", - "webSearch": "Web Search", - "webSearchDesc": "Unified web search across multiple providers with automatic failover and caching", - "searchProvider": "Search Provider", - "searchProviderDesc": "This provider is used for web search via POST /v1/search. No model configuration needed — search providers are ready to use once an API key is connected.", - "enableCloudTitle": "Habilitar proxy en la nube", - "whatYouGet": "lo que obtendrás", + "categorySearch": "Búsqueda y descubrimiento", + "categoryUtility": "Utilidades y gestión", + "webSearch": "Búsqueda web", + "webSearchDesc": "Búsqueda web unificada en múltiples proveedores con fallback automático y caché", + "searchProvider": "Proveedor de búsqueda", + "searchProviderDesc": "Este proveedor se utiliza para la búsqueda web mediante POST /v1/search. No se necesita configuración de modelo: los proveedores de búsqueda están listos para usar una vez que se conecta una clave de API.", + "enableCloudTitle": "Activar Cloud Proxy", + "whatYouGet": "Lo que obtendrás", "cloudBenefitAccess": "Accede a tu API desde cualquier parte del mundo", - "cloudBenefitShare": "Comparta el punto final con su equipo fácilmente", + "cloudBenefitShare": "Comparte el endpoint con tu equipo fácilmente", "cloudBenefitPorts": "No es necesario abrir puertos ni configurar el firewall", - "cloudBenefitEdge": "Red de borde global rápida", - "cloudSessionNote": "Cloud mantendrá su sesión de autenticación durante 1 día. Si no se utiliza, se eliminará automáticamente.", - "cloudUnstableNote": "Actualmente, la nube es inestable con Claude Code OAuth en algunos casos.", - "cloudConnected": "¡Proxy en la nube conectado!", - "connectingToCloud": "Conectándose a la nube...", + "cloudBenefitEdge": "Red global de borde rápida", + "cloudSessionNote": "La nube mantendrá tu sesión de autenticación durante 1 día. Si no se utiliza, se eliminará automáticamente.", + "cloudUnstableNote": "La nube es actualmente inestable con Claude Code OAuth en algunos casos.", + "cloudConnected": "¡Cloud Proxy conectado!", + "connectingToCloud": "Conectando a la nube...", "verifyingConnection": "Verificando conexión...", "connecting": "Conectando...", "verifying": "Verificando...", "connected": "¡Conectado!", - "disableCloudTitle": "Deshabilitar el proxy en la nube", + "disableCloudTitle": "Desactivar Cloud Proxy", "disableWarning": "Todas las sesiones de autenticación se eliminarán de la nube.", - "syncingData": "Sincronizando datos más recientes...", - "disablingCloud": "Deshabilitando la nube...", + "syncingData": "Sincronizando datos recientes...", + "disablingCloud": "Desactivando la nube...", "syncing": "Sincronizando...", "disabling": "Desactivando...", "cloudConnectedVerified": "¡Cloud Proxy conectado y verificado!", - "connectedVerificationPending": "Conectado: verificación pendiente", - "connectedVerificationPendingWithError": "Conectado - verificación pendiente: {error}", - "cloudDisabledSuccess": "Nube deshabilitada exitosamente", - "syncedSuccess": "Sincronizado exitosamente", + "connectedVerificationPending": "Conectado — verificación pendiente", + "connectedVerificationPendingWithError": "Conectado — verificación pendiente: {error}", + "cloudDisabledSuccess": "Nube deshabilitada correctamente", + "syncedSuccess": "Sincronizado correctamente", "failedDisable": "No se pudo desactivar la nube", "failedEnable": "No se pudo habilitar la nube", - "cloudRequestTimeout": "Tiempo de espera de solicitud de nube", - "cloudRequestFailed": "Error en la solicitud de nube", - "cloudWorkerUnreachable": "No se pudo comunicar con el trabajador de la nube. Asegúrese de que el servicio en la nube se esté ejecutando (npm run dev en /cloud).", - "connectionFailed": "La conexión falló", + "cloudRequestTimeout": "Tiempo de espera agotado para la solicitud en la nube", + "cloudRequestFailed": "Error en la solicitud en la nube", + "cloudWorkerUnreachable": "No se pudo contactar con el worker de la nube. Asegúrate de que el servicio en la nube se esté ejecutando (npm run dev en /cloud).", + "connectionFailed": "Error de conexión", "syncFailed": "No se pudieron sincronizar los datos de la nube", "cloudflaredTitle": "Cloudflare Quick Tunnel", - "cloudflaredDescription": "Create a Cloudflare Quick Tunnel for this endpoint to make it accessible from the internet without configuring DNS.", - "cloudflaredUrlNotice": "Creates a temporary Cloudflare Quick Tunnel. URLs change after restart.", - "cloudflaredEnable": "Enable Tunnel", - "cloudflaredInstallAndEnable": "Install & Enable", - "cloudflaredDisable": "Stop Tunnel", - "cloudflaredRunning": "Running", - "cloudflaredStarting": "Starting", - "cloudflaredStoppedState": "Stopped", - "cloudflaredNotInstalled": "Not installed", - "cloudflaredUnsupported": "Unsupported", + "cloudflaredDescription": "Crea un Cloudflare Quick Tunnel para este endpoint.", + "cloudflaredUrlNotice": "Crea un Cloudflare Quick Tunnel temporal. La URL cambia después de cada reinicio.", + "cloudflaredEnable": "Habilitar túnel", + "cloudflaredInstallAndEnable": "Instalar y habilitar", + "cloudflaredDisable": "Detener túnel", + "cloudflaredRunning": "En ejecución", + "cloudflaredStarting": "Iniciando", + "cloudflaredStoppedState": "Detenido", + "cloudflaredNotInstalled": "No instalado", + "cloudflaredUnsupported": "No compatible", "cloudflaredError": "Error", - "cloudflaredStarted": "Cloudflare tunnel started", - "cloudflaredStopped": "Cloudflare tunnel stopped", - "cloudflaredRequestFailed": "Failed to update Cloudflare tunnel", - "cloudflaredTemporaryNote": "Quick Tunnel URLs are temporary and will change after restart.", - "cloudflaredUnsupportedNote": "This platform is not supported for managed installation.", - "cloudflaredIdleNote": "Create a temporary Cloudflare Quick Tunnel for this endpoint.", - "cloudflaredLastError": "Last error: {error}", + "cloudflaredStarted": "Túnel de Cloudflare iniciado", + "cloudflaredStopped": "Túnel de Cloudflare detenido", + "cloudflaredRequestFailed": "No se pudo actualizar el túnel de Cloudflare", + "cloudflaredTemporaryNote": "Las URL de Quick Tunnel son temporales y cambiarán después de cada reinicio.", + "cloudflaredUnsupportedNote": "Esta plataforma no es compatible con instalaciones gestionadas. Instala cloudflared manualmente o asigna CLOUDFLARED_BIN a un binario existente.", + "cloudflaredIdleNote": "Crea un Cloudflare Quick Tunnel temporal para este endpoint.", + "cloudflaredLastError": "Último error: {error}", "providerModelsTitle": "{provider} — Modelos", "noModelsForProvider": "No hay modelos disponibles para este proveedor.", - "chat": "Charla", - "embedding": "incrustar", + "chat": "Chat", + "embedding": "Embedding", "image": "Imagen", "custom": "personalizado", - "modelsCount": "{count, plural, one {# model} other {# models}}", + "modelsCount": "{count, plural, one {# modelo} other {# modelos}}", "sectionTitle": "Superficie de integración", - "sectionDescription": "API compatibles con OpenAI y puntos finales de protocolo operativo", - "tabApis": "__MISSING__:APIs", + "sectionDescription": "API compatibles con OpenAI y endpoints de protocolos operativos", + "tabApis": "API", "tabProtocols": "Protocolos", - "tabsAria": "Secciones de punto final", + "tabsAria": "Secciones de endpoints", "protocolsTitle": "Protocolos", - "protocolsDescription": "MCP y A2A son puntos finales de primera clase con observabilidad y controles dedicados.", + "protocolsDescription": "MCP y A2A son endpoints principales con observabilidad y controles dedicados.", "mcpCardTitle": "Servidor MCP", - "mcpCardDescription": "Protocolo de contexto modelo sobre stdio", + "mcpCardDescription": "Model Context Protocol sobre stdio", "a2aCardTitle": "Servidor A2A", - "a2aCardDescription": "Punto final Agent2Agent JSON-RPC", + "a2aCardDescription": "Endpoint JSON-RPC de Agent2Agent", "protocolToolsLabel": "Herramientas", "protocolTasksLabel": "Tareas", - "protocolActiveStreamsLabel": "Corrientes activas", + "protocolActiveStreamsLabel": "Streaming activo", "protocolLastActivity": "Última actividad", "quickStart": "Inicio rápido", - "openMcpDashboard": "Gestión abierta de MCP", - "openA2aDashboard": "Gestión A2A abierta", + "openMcpDashboard": "Abrir gestión de MCP", + "openA2aDashboard": "Abrir gestión de A2A", "mcpQuickStartTitle": "Inicio rápido de MCP", - "mcpQuickStartStep1": "Ejecute el servidor MCP a través de `omniroute --mcp`.", - "mcpQuickStartStep2": "Configure su cliente MCP para conectarse a través del transporte estándar.", + "mcpQuickStartStep1": "Ejecuta el servidor MCP mediante `omniroute --mcp`.", + "mcpQuickStartStep2": "Configura tu cliente MCP para conectar a través del transporte stdio.", "mcpQuickStartStep3": "Invoca herramientas como `omniroute_get_health` y `omniroute_list_combos`.", "a2aQuickStartTitle": "Inicio rápido de A2A", - "a2aQuickStartStep1": "Descubra la tarjeta de agente en `/.well-known/agent.json`.", - "a2aQuickStartStep2": "Envíe solicitudes JSON-RPC a `POST /a2a` usando `message/send` o `message/stream`.", - "a2aQuickStartStep3": "Realice un seguimiento y controle las tareas utilizando `tasks/get` y `tasks/cancel`.", + "a2aQuickStartStep1": "Descubre la tarjeta de agente en `/.well-known/agent.json`.", + "a2aQuickStartStep2": "Envía solicitudes JSON-RPC a `POST /a2a` usando `message/send` o `message/stream`.", + "a2aQuickStartStep3": "Rastrea y controla tareas usando `tasks/get` y `tasks/cancel`.", "completionsLegacy": "Completions (Legacy)", - "completionsLegacyDesc": "Legacy OpenAI text completions — accepts both prompt string and messages array format", - "messagesApi": "Mensajes", - "messagesApiDesc": "Formato API nativo de mensajes antrópicos para proveedores compatibles con Claude", - "imageEdits": "Ediciones de imágenes", - "imageEditsDesc": "Edite y modifique imágenes existentes con IA (pintura interna, pintura externa, variaciones)", - "batchApi": "API por lotes", - "batchApiDesc": "Procese grandes lotes de solicitudes de forma asincrónica (compatible con OpenAI)", - "filesApi": "API de archivos", - "filesApiDesc": "Cargar y administrar archivos para procesamiento por lotes", - "videoGeneration": "Video Generation", - "videoDesc": "Generate videos using AI models like ComfyUI and Stable Video Diffusion.", - "tailscaleRequestFailed": "Failed to load Tailscale status", - "tailscaleEnableFailed": "Failed to enable Tailscale Funnel", - "tailscaleWaitingForLogin": "Complete the Tailscale login in the opened browser tab. OmniRoute will retry automatically.", - "tailscaleLoginTimedOut": "Timed out waiting for Tailscale login", - "tailscaleWaitingForFunnel": "Enable Funnel for this device in the opened browser tab. OmniRoute will keep polling.", - "tailscaleFunnelTimedOut": "Timed out waiting for Tailscale Funnel to be enabled", - "tailscaleStarted": "Tailscale Funnel enabled", - "tailscaleDisableFailed": "Failed to disable Tailscale Funnel", - "tailscaleStopped": "Tailscale Funnel disabled", - "tailscaleInstallFailed": "Failed to install Tailscale", - "tailscaleInstallProgress": "Working...", - "tailscaleInstalled": "Tailscale installed successfully", - "tailscaleRunning": "Running", - "tailscaleNeedsLogin": "Needs Login", - "tailscaleStoppedState": "Stopped", - "tailscaleNotInstalled": "Not installed", - "tailscaleUnsupported": "Unsupported", + "completionsLegacyDesc": "Completions de texto clásicas de OpenAI: acepta tanto cadenas de prompt como formatos de matriz de mensajes.", + "messagesApi": "Messages", + "messagesApiDesc": "Formato de API de Messages nativo de Anthropic para proveedores compatibles con Claude", + "imageEdits": "Ediciones de imagen", + "imageEditsDesc": "Edita y modifica imágenes existentes con IA (inpainting, outpainting, variaciones)", + "batchApi": "Batch API", + "batchApiDesc": "Procesa lotes grandes de solicitudes de forma asíncrona (compatible con OpenAI)", + "filesApi": "Files API", + "filesApiDesc": "Sube y administra archivos para procesamiento por lotes", + "videoGeneration": "Generación de vídeo", + "videoDesc": "Genera vídeos utilizando modelos de IA como ComfyUI y Stable Video Diffusion.", + "tailscaleRequestFailed": "No se pudo cargar el estado de Tailscale", + "tailscaleEnableFailed": "No se pudo habilitar Tailscale Funnel", + "tailscaleWaitingForLogin": "Completa el inicio de sesión de Tailscale en la pestaña del navegador abierta. OmniRoute lo reintentará automáticamente.", + "tailscaleLoginTimedOut": "Se agotó el tiempo de espera para el inicio de sesión de Tailscale", + "tailscaleWaitingForFunnel": "Habilita Funnel para este dispositivo en la pestaña del navegador abierta. OmniRoute seguirá comprobando el estado.", + "tailscaleFunnelTimedOut": "Se agotó el tiempo de espera para habilitar Tailscale Funnel", + "tailscaleStarted": "Tailscale Funnel habilitado", + "tailscaleDisableFailed": "No se pudo deshabilitar Tailscale Funnel", + "tailscaleStopped": "Tailscale Funnel deshabilitado", + "tailscaleInstallFailed": "No se pudo instalar Tailscale", + "tailscaleInstallProgress": "Trabajando...", + "tailscaleInstalled": "Tailscale instalado correctamente", + "tailscaleRunning": "En ejecución", + "tailscaleNeedsLogin": "Requiere inicio de sesión", + "tailscaleStoppedState": "Detenido", + "tailscaleNotInstalled": "No instalado", + "tailscaleUnsupported": "No compatible", "tailscaleError": "Error", - "tailscaleDisable": "Stop Funnel", - "tailscaleInstallAndEnable": "Install & Enable", - "tailscaleLoginAndEnable": "Login & Enable", - "tailscaleEnable": "Enable Funnel", - "tailscaleUrlNotice": "Uses your Tailscale .ts.net address. Login and Funnel approval may be required on first use.", + "tailscaleDisable": "Detener Funnel", + "tailscaleInstallAndEnable": "Instalar y habilitar", + "tailscaleLoginAndEnable": "Iniciar sesión y habilitar", + "tailscaleEnable": "Habilitar Funnel", + "tailscaleUrlNotice": "Usa tu dirección de Tailscale .ts.net. Es posible que se requiera iniciar sesión y aprobar Funnel en el primer uso.", "tailscaleTitle": "Tailscale Funnel", - "tailscaleNeedsLoginHint": "Authenticate this machine with Tailscale, then enable Funnel.", - "tailscaleBinaryPath": "Binary: {path}", - "tailscaleLastError": "Last error: {error}", - "tailscaleInstallTitle": "Install Tailscale", - "tailscaleInstallIntro": "Installs Tailscale on this machine and prepares OmniRoute to enable Funnel.", - "tailscaleInstallPasswordHint": "On macOS and Linux, sudo may be required for the package install and daemon start.", - "tailscaleSudoPlaceholder": "Optional sudo password", - "tailscaleInstalling": "Installing", - "tailscaleSudoLabel": "Contraseña de Sudo (obligatoria en macOS/Linux)", - "ngrokTitle": "túnel ngrok", - "ngrokRunning": "corriendo", - "ngrokStarting": "Comenzando", + "tailscaleNeedsLoginHint": "Autentica esta máquina con Tailscale y, a continuación, habilita Funnel.", + "tailscaleBinaryPath": "Binario: {path}", + "tailscaleLastError": "Último error: {error}", + "tailscaleInstallTitle": "Instalar Tailscale", + "tailscaleInstallIntro": "Instala Tailscale en esta máquina y prepara OmniRoute para habilitar Funnel.", + "tailscaleInstallPasswordHint": "En macOS y Linux, es posible que se requiera sudo para la instalación del paquete y el inicio del demonio.", + "tailscaleSudoPlaceholder": "Contraseña de sudo opcional", + "tailscaleInstalling": "Instalando", + "tailscaleSudoLabel": "Contraseña de sudo (obligatoria en macOS/Linux)", + "ngrokTitle": "Túnel ngrok", + "ngrokRunning": "En ejecución", + "ngrokStarting": "Iniciando", "ngrokStoppedState": "Detenido", - "ngrokNeedsAuth": "Necesita autenticación", + "ngrokNeedsAuth": "Requiere autenticación", "ngrokNotInstalled": "No instalado", "ngrokUnsupported": "No compatible", - "ngrokError": "error", + "ngrokError": "Error", "ngrokEnable": "Habilitar túnel", - "ngrokDisable": "Detener el túnel", - "ngrokUrlNotice": "Crea un túnel público ngrok.", + "ngrokDisable": "Detener túnel", + "ngrokUrlNotice": "Crea un túnel ngrok público.", "ngrokAuthTokenLabel": "Authtoken (obligatorio si NGROK_AUTHTOKEN no está configurado)", - "ngrokAuthTokenPlaceholder": "Ingrese su token de autenticación de ngrok", + "ngrokAuthTokenPlaceholder": "Introduce tu authtoken de ngrok", "ngrokLastError": "Último error: {error}", - "ngrokStarted": "El túnel de ngrok comenzó", - "ngrokStopped": "El túnel de Ngrok se detuvo", - "ngrokRequestFailed": "No se pudo actualizar el túnel ngrok", - "apiEndpointsCatalogUnavailable": "Catálogo API no disponible", - "apiEndpointsSearchPlaceholder": "Buscar puntos finales...", + "ngrokStarted": "Túnel de ngrok iniciado", + "ngrokStopped": "Túnel de ngrok detenido", + "ngrokRequestFailed": "No se pudo actualizar el túnel de ngrok", + "apiEndpointsCatalogUnavailable": "Catálogo de API no disponible", + "apiEndpointsSearchPlaceholder": "Buscar endpoints...", "apiEndpointsRequiresAuth": "Requiere autenticación", - "apiEndpointsNoMatch": "Ningún punto final coincide con su filtro", - "endpointSections": "Endpoint sections", + "apiEndpointsNoMatch": "Ningún endpoint coincide con tu filtro", + "endpointSections": "Secciones de endpoints", "tabMcp": "MCP", "tabA2a": "A2A", - "tabContextSources": "Context Sources", - "activeEndpoints": "Active Endpoints", + "tabContextSources": "Orígenes de contexto", + "activeEndpoints": "Endpoints activos", "activeLocal": "Local", - "activeCloud": "Cloud", - "copyUrlTitle": "Copy {url}", - "statusRunning": "Running", - "tunnels": "Tunnels", - "activeTunnelCount": "{active} / {total} active", + "activeCloud": "Nube", + "copyUrlTitle": "Copiar {url}", + "statusRunning": "En ejecución", + "tunnels": "Túneles", + "activeTunnelCount": "{active} / {total} activos", "badgeLocal": "LOCAL", - "badgeProtected": "PROTECTED", - "badgeInternal": "INTERNAL", - "catalogLoadFailed": "API catalog request failed with HTTP {status}", - "catalogLoadFailedGeneric": "Failed to load API catalog", - "apiKeysLoadFailed": "Failed to load API keys ({status})", - "apiKeysLoadFailedGeneric": "Failed to load API keys", - "apiKeyRevealDisabled": "API key reveal is disabled (ALLOW_API_KEY_REVEAL). Change it on the Feature Flags page or paste an API key manually.", - "apiKeyRevealFailed": "Failed to reveal API key ({status})", - "apiKeyRevealInvalid": "API key reveal returned an invalid response", - "apiKeyRequired": "An API key is required for this endpoint.", - "requestFailed": "Request failed ({status})", + "badgeProtected": "PROTEGIDO", + "badgeInternal": "INTERNO", + "catalogLoadFailed": "La solicitud al catálogo de API falló con el código HTTP {status}", + "catalogLoadFailedGeneric": "No se pudo cargar el catálogo de API", + "apiKeysLoadFailed": "No se pudieron cargar las claves de API ({status})", + "apiKeysLoadFailedGeneric": "No se pudieron cargar las claves de API", + "apiKeyRevealDisabled": "La visualización de claves de API está desactivada (ALLOW_API_KEY_REVEAL). Cámbialo en la página de Feature Flags o pega una clave de API manualmente.", + "apiKeyRevealFailed": "No se pudo mostrar la clave de API ({status})", + "apiKeyRevealInvalid": "La visualización de la clave de API devolvió una respuesta no válida", + "apiKeyRequired": "Se requiere una clave de API para este endpoint.", + "requestFailed": "La solicitud falló ({status})", "errorStatus": "Error", - "catalogStats": "{endpoints} endpoints across {categories} categories", - "catalogUnavailableDescription": "The OpenAPI specification could not be loaded.", - "openJsonResponse": "Open JSON response", - "all": "All", - "more": "+{count} more", - "showInternalTooltip": "Show or hide internal routes (hidden by default)", - "bearerAuth": "Bearer Auth", - "requestBody": "Request Body", - "close": "Close", - "tryIt": "Try It", - "example": "Example", - "apiKey": "API Key", - "switchToSelection": "Switch to Selection", - "enterManually": "Enter Manually", - "pasteApiKey": "Paste your API key here", - "noActiveApiKeys": "No active API keys found. Toggle manual entry to paste one.", - "requestBodyJson": "Request Body (JSON)", - "sending": "Sending...", - "sendRequest": "Send Request", - "dataSchemas": "Data Schemas", - "vscodeAliasTitle": "VS Code Token Alias", - "vscodeAliasDescriptionReady": "Ready-to-paste compatibility URLs using the /api/v1/vscode/TOKEN/... endpoint.", - "vscodeAliasDescriptionError": "Showing placeholder URLs because CLI keys could not be loaded in this session.", - "vscodeAliasDescriptionLoading": "Loading CLI keys. Placeholder URLs are shown until a key is available.", - "vscodeAliasDescriptionPlaceholder": "Showing placeholder URLs. Create or activate an API key in CLI Tools to replace TOKEN.", - "vscodeAliasManage": "CLI Tools", - "vscodeAliasBaseLabel": "VS Code base", - "vscodeAliasModelsLabel": "VS Code models", - "vscodeAliasChatLabel": "VS Code chat", + "catalogStats": "{endpoints} endpoints en {categories} categorías", + "catalogUnavailableDescription": "No se pudo cargar la especificación OpenAPI.", + "openJsonResponse": "Abrir respuesta JSON", + "all": "Todos", + "more": "+{count} más", + "showInternalTooltip": "Mostrar u ocultar rutas internas (ocultas por defecto)", + "bearerAuth": "Autenticación Bearer", + "requestBody": "Cuerpo de la solicitud", + "close": "Cerrar", + "tryIt": "Probar", + "example": "Ejemplo", + "apiKey": "Clave de API", + "switchToSelection": "Cambiar a selección", + "enterManually": "Introducir manualmente", + "pasteApiKey": "Pega tu clave de API aquí", + "noActiveApiKeys": "No se encontraron claves de API activas. Activa la entrada manual para pegar una.", + "requestBodyJson": "Cuerpo de la solicitud (JSON)", + "sending": "Enviando...", + "sendRequest": "Enviar solicitud", + "dataSchemas": "Esquemas de datos", + "vscodeAliasTitle": "Alias de token de VS Code", + "vscodeAliasDescriptionReady": "URL de compatibilidad listas para pegar usando el endpoint /api/v1/vscode/TOKEN/...", + "vscodeAliasDescriptionError": "Se muestran URL de ejemplo porque no se pudieron cargar las claves de CLI en esta sesión.", + "vscodeAliasDescriptionLoading": "Cargando claves de CLI. Se muestran URL de ejemplo hasta que haya una clave disponible.", + "vscodeAliasDescriptionPlaceholder": "Se muestran URL de ejemplo. Crea o activa una clave de API en Herramientas de CLI para reemplazar TOKEN.", + "vscodeAliasManage": "Herramientas de CLI", + "vscodeAliasBaseLabel": "Base de VS Code", + "vscodeAliasModelsLabel": "Modelos de VS Code", + "vscodeAliasChatLabel": "Chat de VS Code", "localServer": "Servidor local", - "cloudOmniroute": "OmniRuta en la nube", + "cloudOmniroute": "Cloud OmniRoute", "copyUrl": "Copiar URL", - "badgeLoopbackTooltip": "Este extremo solo es accesible localmente (loopback)", - "badgeAlwaysProtectedTooltip": "Este extremo siempre está protegido y requiere autorización", - "badgeInternalTooltip": "Este es un extremo interno del sistema", + "badgeLoopbackTooltip": "Este endpoint solo es accesible localmente (solo loopback)", + "badgeAlwaysProtectedTooltip": "Este endpoint siempre está protegido y requiere autorización", + "badgeInternalTooltip": "Este es un endpoint interno del sistema", "tierAll": "Todos", "tierAuth": "Autenticado", "tierLoopback": "Loopback", - "tierAlwaysProtected": "Always Protected", + "tierAlwaysProtected": "Siempre protegido", "tierPublic": "Público", - "hideInternal": "Hide Internal", - "showInternal": "Show Internal", - "customSystemPromptTitle": "Custom System Prompt", - "customSystemPromptDescription": "Inject a custom system prompt into every model request", - "customSystemPromptPlaceholder": "e.g. Always respond in pirate speak...", - "obsidianEnterToken": "Please enter an Obsidian API token", - "obsidianConnectFailed": "Failed to connect", - "obsidianConnectionFailed": "Connection failed", - "obsidianDisconnectFailed": "Failed to disconnect", - "obsidianEnterVaultPath": "Please enter the vault directory path", - "obsidianWebdavEnabledMessage": "WebDAV sync enabled. Configure your mobile device below.", - "obsidianEnableWebdavFailed": "Failed to enable WebDAV", - "obsidianWebdavDisabledMessage": "WebDAV sync disabled", - "obsidianDisableWebdavFailed": "Failed to disable WebDAV", - "obsidianConnected": "Connected", - "obsidianNotConnected": "Not connected", - "obsidianWebdavSync": "WebDAV Sync", - "obsidianDescription": "Search, read, write, and manage notes in Obsidian through routed AI models", - "obsidianRestToken": "Obsidian Local REST API Token", - "obsidianApiKeyPlaceholder": "Obsidian API key", - "obsidianConnect": "Connect", - "obsidianBaseUrlOptional": "Base URL (optional)", - "obsidianPortWarning": "Port 27124 is the MCP endpoint (HTTPS, self-signed certificate). The REST API uses HTTP on port 27123.", - "obsidianRemoteVaultHint": "Default: {defaultUrl}. For remote vaults, enter the Tailscale IP + port (e.g., http://100.x.x.x:27123). Enable the Local REST API plugin on the machine running Obsidian.", - "obsidianTokenConfigured": "Token configured. Obsidian tools are available via MCP.", - "obsidianDisconnect": "Disconnect", - "obsidianVaultSync": "Vault Sync (WebDAV)", - "obsidianVaultSyncDescription": "Sync your vault to Obsidian mobile using WebDAV over Tailscale. Obsidian mobile has built-in WebDAV support — no plugins needed.", - "obsidianVaultDirectoryPath": "Vault Directory Path", - "obsidianEnable": "Enable", - "obsidianWebdavEnabled": "WebDAV sync enabled", - "obsidianDisable": "Disable", - "obsidianConfigureMobile": "Configure Obsidian Mobile", - "obsidianMobileInstructions": "In Obsidian mobile: Settings → Sync → WebDAV → enter the following:", - "obsidianWebdavUrl": "WebDAV URL", - "obsidianUsername": "Username", - "obsidianPassword": "Password", - "obsidianTailscaleHint": "Use your Tailscale IP instead of localhost if connecting from mobile. Both devices must be on the same Tailscale network." + "hideInternal": "Ocultar internos", + "showInternal": "Mostrar internos", + "customSystemPromptTitle": "Prompt de sistema personalizado", + "customSystemPromptDescription": "Inyecta un prompt de sistema personalizado en cada solicitud al modelo", + "customSystemPromptPlaceholder": "p. ej. Responde siempre como un pirata...", + "obsidianEnterToken": "Introduce un token de la API de Obsidian", + "obsidianConnectFailed": "Error al conectar", + "obsidianConnectionFailed": "Conexión fallida", + "obsidianDisconnectFailed": "Error al desconectar", + "obsidianEnterVaultPath": "Introduce la ruta del directorio de la bóveda", + "obsidianWebdavEnabledMessage": "Sincronización WebDAV activada. Configura tu dispositivo móvil a continuación.", + "obsidianEnableWebdavFailed": "Error al activar WebDAV", + "obsidianWebdavDisabledMessage": "Sincronización WebDAV desactivada", + "obsidianDisableWebdavFailed": "Error al desactivar WebDAV", + "obsidianConnected": "Conectado", + "obsidianNotConnected": "No conectado", + "obsidianWebdavSync": "Sincronización WebDAV", + "obsidianDescription": "Busca, lee, escribe y gestiona notas en Obsidian a través de modelos de IA enrutados", + "obsidianRestToken": "Token de la API REST local de Obsidian", + "obsidianApiKeyPlaceholder": "Clave de API de Obsidian", + "obsidianConnect": "Conectar", + "obsidianBaseUrlOptional": "URL base (opcional)", + "obsidianPortWarning": "El puerto 27124 es el endpoint de MCP (HTTPS, certificado autofirmado). La API REST utiliza HTTP en el puerto 27123.", + "obsidianRemoteVaultHint": "Por defecto: {defaultUrl}. Para bóvedas remotas, introduce la IP de Tailscale + puerto (p. ej., http://100.x.x.x:27123). Activa el plugin Local REST API en el equipo que ejecuta Obsidian.", + "obsidianTokenConfigured": "Token configurado. Las herramientas de Obsidian están disponibles a través de MCP.", + "obsidianDisconnect": "Desconectar", + "obsidianVaultSync": "Sincronización de la bóveda (WebDAV)", + "obsidianVaultSyncDescription": "Sincroniza tu bóveda con Obsidian móvil mediante WebDAV a través de Tailscale. Obsidian móvil cuenta con soporte WebDAV integrado; no se necesitan plugins.", + "obsidianVaultDirectoryPath": "Ruta del directorio de la bóveda", + "obsidianEnable": "Activar", + "obsidianWebdavEnabled": "Sincronización WebDAV activada", + "obsidianDisable": "Desactivar", + "obsidianConfigureMobile": "Configurar Obsidian móvil", + "obsidianMobileInstructions": "En Obsidian móvil: Ajustes → Sincronización → WebDAV → introduce lo siguiente:", + "obsidianWebdavUrl": "URL de WebDAV", + "obsidianUsername": "Nombre de usuario", + "obsidianPassword": "Contraseña", + "obsidianTailscaleHint": "Utiliza tu IP de Tailscale en lugar de localhost si te conectas desde el móvil. Ambos dispositivos deben estar en la misma red de Tailscale." }, "endpoints": { - "tabProxy": "Endpoint Proxy", + "tabProxy": "Proxy de endpoints", "tabApiEndpoints": "Endpoints de API", "apiEndpointsTitle": "Endpoints de API", - "apiEndpointsDescription": "Endpoints de API backend que pueden ser consumidos por otras aplicaciones y servicios.", + "apiEndpointsDescription": "Endpoints de API backend que pueden ser consumidos por otras aplicaciones y servicios. Esta sección listará todas las API REST disponibles con documentación y capacidades de prueba.", "comingSoon": "Próximamente", - "plannedFeatures": "Funciones Planeadas", - "featureRestApi": "Catálogo de endpoints REST API con documentación interactiva", - "featureWebhooks": "Configuración de webhooks y suscripciones de eventos", + "plannedFeatures": "Funciones planificadas", + "featureRestApi": "Catálogo de endpoints de API REST con documentación interactiva", + "featureWebhooks": "Configuración de webhooks y suscripciones a eventos", "featureSwagger": "Generación automática de especificaciones OpenAPI / Swagger", - "featureAuth": "Gestión de claves API y alcances OAuth por endpoint" + "featureAuth": "Gestión de claves de API y alcances de OAuth por endpoint" }, "mcpDashboard": { "loading": "Cargando el panel de MCP...", "activate": "activar", "deactivate": "desactivar", - "confirmSwitchCombo": "¿Confirmar el combo {action} \"{combo}\"?", - "switchComboFailed": "No se pudo cambiar el estado combinado.", + "confirmSwitchCombo": "¿Confirmar {action} el combo \"{combo}\"?", + "switchComboFailed": "Error al cambiar el estado del combo.", "switchComboSuccess": "Combo \"{combo}\" actualizado.", - "confirmApplyProfile": "¿Aplicar perfil de resiliencia \"{profile}\"?", - "applyProfileFailed": "No se pudo aplicar el perfil de resiliencia.", + "confirmApplyProfile": "¿Aplicar el perfil de resiliencia \"{profile}\"?", + "applyProfileFailed": "Error al aplicar el perfil de resiliencia.", "applyProfileSuccess": "Perfil \"{profile}\" aplicado.", - "confirmResetBreakers": "¿Reiniciar todos los disyuntores?", - "resetBreakersFailed": "No se pudo restablecer los disyuntores.", - "resetBreakersSuccess": "Restablecimiento de los disyuntores.", + "confirmResetBreakers": "¿Restablecer todos los disyuntores?", + "resetBreakersFailed": "Error al restablecer los disyuntores.", + "resetBreakersSuccess": "Disyuntores restablecidos.", "processStatus": "Estado del proceso", "online": "En línea", "offline": "Desconectado", "disableLabel": "Desactivar {label}", "enableLabel": "Activar {label}", "transportMode": "Modo de transporte", - "transportStdioDesc": "Local — El IDE ejecuta el proceso a través de omniroute --mcp", - "transportSseDesc": "Remoto — Server-Sent Events sobre HTTP", - "transportStreamableHttpDesc": "Remote — Modern bidirectional HTTP", - "copy": "Copy", + "transportStdioDesc": "Local: el IDE genera el proceso a través de omniroute --mcp", + "transportSseDesc": "Remoto: Server-Sent Events sobre HTTP", + "transportStreamableHttpDesc": "Remoto: HTTP bidireccional moderno", + "copy": "Copiar", "mcpDashboardCopyUrl": "Copiar URL", - "mcpDisabledTitle": "MCP is disabled", - "mcpDisabledDesc": "Enable MCP above to configure transport mode and view server telemetry.", - "mcpIntro": "Model Context Protocol — {tools} tools across {scopes} scopes, {transports} transports (stdio / SSE / Streamable HTTP).", - "mcpStep1": "Run via {code}", - "mcpStep2": "Configure your MCP client to connect over stdio transport.", - "mcpStep3": "Invoke tools like {code1} and {code2}.", + "mcpDisabledTitle": "MCP está desactivado", + "mcpDisabledDesc": "Activa MCP arriba para configurar el modo de transporte y ver la telemetría del servidor.", + "mcpIntro": "Model Context Protocol — {tools} herramientas en {scopes} ámbitos, {transports} transportes (stdio / SSE / Streamable HTTP).", + "mcpStep1": "Ejecutar mediante {code}", + "mcpStep2": "Configura tu cliente MCP para conectarse a través del transporte stdio.", + "mcpStep3": "Invoca herramientas como {code1} y {code2}.", "pid": "PID", - "sessionUptime": "tiempo de actividad de la sesión", - "lastHeartbeat": "último latido", - "activity24h": "Actividad (24h)", + "sessionUptime": "Tiempo de actividad de la sesión", + "lastHeartbeat": "Último latido", + "activity24h": "Actividad (24 h)", "totalCalls": "Llamadas totales", "successRate": "Tasa de éxito", - "avgLatency": "Latencia promedio", - "topTools": "Herramientas superiores", - "noToolCalls24h": "No hubo llamadas de herramientas en las últimas 24 horas.", - "runtimeDetails": "Detalles del tiempo de ejecución", + "avgLatency": "Latencia media", + "topTools": "Herramientas principales", + "noToolCalls24h": "No hay llamadas a herramientas en las últimas 24 horas.", + "runtimeDetails": "Detalles del entorno de ejecución", "transport": "Transporte", "scopesEnforced": "Alcances aplicados", - "yes": "Sí", - "no": "No", - "lastCall": "última llamada", - "heartbeatPath": "Camino del latido del corazón", + "yes": "sí", + "no": "no", + "lastCall": "Última llamada", + "heartbeatPath": "Ruta del latido", "operationalControls": "Controles operativos", - "switchCombo": "Combinación de interruptores", + "switchCombo": "Cambiar combo", "inactive": "inactivo", "active": "activo", "activateCombo": "Activar combo", @@ -3967,8 +3969,8 @@ "profileConservative": "conservador", "applyProfile": "Aplicar perfil", "resetCircuitBreakers": "Restablecer disyuntores", - "resetCircuitBreakersHelp": "Borra el estado actual del interruptor y los contadores de fallas para los proveedores.", - "resetAllBreakers": "Restablecer todos los interruptores", + "resetCircuitBreakersHelp": "Borra el estado actual de los disyuntores y los contadores de fallos para los proveedores.", + "resetAllBreakers": "Restablecer todos los disyuntores", "toolsAndScopes": "Herramientas y alcances", "tableTool": "Herramienta", "tableScopes": "Alcances", @@ -3979,683 +3981,683 @@ "allTools": "Todas las herramientas", "allResults": "Todos los resultados", "success": "Éxito", - "failure": "Falla", + "failure": "Fallo", "apiKeyIdPlaceholder": "apiKeyId", - "loadingAuditEntries": "Loading audit entries...", - "noAuditEntriesForFilters": "No audit entries found for current filters.", - "tableTimestamp": "Timestamp", - "tableDuration": "Duration", - "tableResult": "Result", - "tableApiKey": "API key", - "failed": "failed", - "previous": "Previous", - "next": "Next", - "apiKeyId": "Api Key Id", - "offset": "Offset", - "limit": "Limit", - "tool": "Tool" + "loadingAuditEntries": "Cargando entradas de auditoría...", + "noAuditEntriesForFilters": "No se encontraron entradas de auditoría para los filtros actuales.", + "tableTimestamp": "Marca de tiempo", + "tableDuration": "Duración", + "tableResult": "Resultado", + "tableApiKey": "Clave de API", + "failed": "fallido", + "previous": "Anterior", + "next": "Siguiente", + "apiKeyId": "ID de clave de API", + "offset": "Desplazamiento", + "limit": "Límite", + "tool": "Herramienta" }, "a2aDashboard": { - "loading": "Loading A2A dashboard...", - "confirmCancelTask": "Cancel task {taskId}?", - "cancelTaskFailed": "No se pudo cancelar la tarea.", + "loading": "Cargando el panel de A2A...", + "confirmCancelTask": "¿Cancelar la tarea {taskId}?", + "cancelTaskFailed": "Error al cancelar la tarea.", "cancelTaskSuccess": "Tarea {taskId} cancelada.", - "smokeSendFailed": "message/send smoke test failed.", - "smokeSendSuccessWithTask": "message/send ok (task {taskId}).", - "smokeSendSuccess": "message/send ok.", - "smokeStreamFailed": "message/stream smoke test failed.", - "smokeStreamSuccessWithTask": "message/stream ok (task {taskId}{stateSuffix}).", - "smokeStreamNoTaskId": "message/stream finished without task id.", - "health": "Health", - "ok": "ok", - "totalTasks": "Total tasks", - "activeStreams": "Corrientes activas", - "lastTask": "Last task", - "taskStateOverview": "Task state overview", + "smokeSendFailed": "Falló la prueba de humo de message/send.", + "smokeSendSuccessWithTask": "message/send correcto (tarea {taskId}).", + "smokeSendSuccess": "message/send correcto.", + "smokeStreamFailed": "Falló la prueba de humo de message/stream.", + "smokeStreamSuccessWithTask": "message/stream correcto (tarea {taskId}{stateSuffix}).", + "smokeStreamNoTaskId": "message/stream finalizó sin ID de tarea.", + "health": "Estado", + "ok": "correcto", + "totalTasks": "Tareas totales", + "activeStreams": "Flujos activos", + "lastTask": "Última tarea", + "taskStateOverview": "Resumen del estado de tareas", "state": { - "submitted": "submitted", - "working": "working", - "completed": "completed", - "failed": "failed", - "cancelled": "cancelado" + "submitted": "enviada", + "working": "en curso", + "completed": "completada", + "failed": "fallida", + "cancelled": "cancelada" }, - "agentCard": "tarjeta de agente", + "agentCard": "Tarjeta de agente", "agentCardPath": "/.well-known/agent.json", "version": "Versión", "url": "URL", "capabilities": "Capacidades", "agentCardNotAvailable": "Tarjeta de agente no disponible.", "quickValidation": "Validación rápida", - "quickValidationDescription": "Ejecuta llamadas de humo a través del punto final `/a2a` en vivo.", - "runMessageSend": "Run message/send", - "runMessageStream": "Run message/stream", - "taskManagement": "Task management", - "taskSummary": "{total} tasks | page {page} of {totalPages}", - "allStates": "all", - "allSkills": "all skills", - "loadingTasks": "Loading tasks...", - "noTasksForFilters": "No tasks found for current filters.", - "tableTask": "Task", + "quickValidationDescription": "Ejecuta llamadas de humo a través del endpoint `/a2a` en vivo.", + "runMessageSend": "Ejecutar message/send", + "runMessageStream": "Ejecutar message/stream", + "taskManagement": "Gestión de tareas", + "taskSummary": "{total} tareas | página {page} de {totalPages}", + "allStates": "todos", + "allSkills": "todas las skills", + "loadingTasks": "Cargando tareas...", + "noTasksForFilters": "No se han encontrado tareas para los filtros actuales.", + "tableTask": "Tarea", "tableSkill": "Skill", - "tableState": "State", - "tableUpdated": "Updated", - "tableActions": "Actions", + "tableState": "Estado", + "tableUpdated": "Actualizado", + "tableActions": "Acciones", "view": "Vista", "cancel": "Cancelar", - "previous": "Previous", - "next": "Next", + "previous": "Anterior", + "next": "Siguiente", "taskDetail": "Detalle de la tarea", - "close": "Cerca", + "close": "Cerrar", "metadata": "Metadatos", "events": "Eventos", "artifacts": "Artefactos", - "tablePhase": "Table Phase", + "tablePhase": "Fase de la tabla", "offset": "Offset", - "limit": "Limit", + "limit": "Límite", "skill": "Skill", - "rpcEndpoint": "ENVIAR /a2a", - "rpcMethodSend": "mensaje/enviar", - "rpcMethodStream": "mensaje/transmisión", - "rpcMethodGet": "tareas/obtener", - "rpcMethodCancel": "tareas/cancelar", + "rpcEndpoint": "POST /a2a", + "rpcMethodSend": "message/send", + "rpcMethodStream": "message/stream", + "rpcMethodGet": "tasks/get", + "rpcMethodCancel": "tasks/cancel", "serviceLabel": "A2A", "online": "En línea", "offline": "Desconectado", "disableLabel": "Desactivar {label}", "enableLabel": "Activar {label}", - "a2aDisabledTitle": "A2A is disabled", - "a2aDisabledDesc": "Enable A2A above to view task telemetry, agent details, and validation tools.", - "a2aIntro": "Agent2Agent JSON-RPC 2.0 endpoint — send tasks, stream responses, cancel in-flight jobs.", - "a2aStep1": "Discover the agent card at {code}.", - "a2aStep2": "Send JSON-RPC to {code1} using {code2} or {code3}.", - "a2aStep3": "Track and cancel tasks with {code1} and {code2}." + "a2aDisabledTitle": "A2A está desactivado", + "a2aDisabledDesc": "Activa A2A arriba para ver la telemetría de tareas, detalles del agente y herramientas de validación.", + "a2aIntro": "Endpoint de Agent2Agent JSON-RPC 2.0: envía tareas, haz streaming de respuestas y cancela trabajos en curso.", + "a2aStep1": "Descubre la tarjeta del agente en {code}.", + "a2aStep2": "Envía JSON-RPC a {code1} usando {code2} o {code3}.", + "a2aStep3": "Realiza el seguimiento y cancela tareas con {code1} y {code2}." }, "memory": { "a": "A", - "actions": "Actions", - "addMemory": "Add Memory", - "allTypes": "All Types", + "actions": "Acciones", + "addMemory": "Añadir memoria", + "allTypes": "Todos los tipos", "cancel": "Cancelar", - "checkHealth": "comprobar la salud", - "checkingHealth": "Comprobando…", - "compactOld": "Compact old", + "checkHealth": "Comprobar estado", + "checkingHealth": "Comprobando...", + "compactOld": "Compactar antiguas", "concept": { - "title": "Conversational Memory", - "description": "OmniRoute learns from every conversation, remembering facts, episodes, procedures, and semantic concepts that make responses more accurate and context-aware.", - "howWorksToggle": "How it works", - "howWorksContent": "1. Automatic extraction: at the end of each response, facts and episodes are detected and saved automatically.\n2. Retrieval: before each response, the most relevant memories are searched via FTS5 (exact), vector (semantic), or hybrid RRF.\n3. Injection: relevant memories are injected into the assistant context to improve response quality.\n4. Management: use this page to view, edit, export, and compact old memories." + "title": "Memoria conversacional", + "description": "OmniRoute aprende de cada conversación, recordando hechos, episodios, procedimientos y conceptos semánticos que hacen que las respuestas sean más precisas y conscientes del contexto.", + "howWorksToggle": "Cómo funciona", + "howWorksContent": "1. Extracción automática: al final de cada respuesta, los hechos y episodios se detectan y guardan automáticamente.\n2. Recuperación: antes de cada respuesta, se buscan las memorias más relevantes mediante FTS5 (exacta), vector (semántica) o RRF híbrido.\n3. Inyección: las memorias relevantes se inyectan en el contexto del asistente para mejorar la calidad de la respuesta.\n4. Gestión: utiliza esta página para ver, editar, exportar y compactar memorias antiguas." }, - "content": "Content", + "content": "Contenido", "contentPlaceholder": "Valor o contenido JSON para recordar", - "created": "Created", - "delete": "Delete", - "deleteConfirmDesc": "This action cannot be undone. The memory will be permanently removed.", - "deleteConfirmTitle": "Delete memory?", - "description": "View and manage stored memory entries", - "editMemory": "Edit memory", + "created": "Creado", + "delete": "Eliminar", + "deleteConfirmDesc": "Esta acción no se puede deshacer. La memoria se eliminará permanentemente.", + "deleteConfirmTitle": "¿Eliminar memoria?", + "description": "Ver y gestionar las entradas de memoria almacenadas", + "editMemory": "Editar memoria", "editModal": { - "title": "Edit Memory", - "metadataLabel": "Metadata (JSON)", - "metadataInvalid": "Invalid JSON", - "saveFailed": "Failed to save memory" + "title": "Editar memoria", + "metadataLabel": "Metadatos (JSON)", + "metadataInvalid": "JSON no válido", + "saveFailed": "Error al guardar la memoria" }, "embedding": { - "autoLabel": "Automatic", - "autoDesc": "Uses best available: remote provider > static > transformers", - "remoteLabel": "Remote provider", - "remoteDesc": "Uses embedding via provider API (requires API key)", - "staticLabel": "Static local (potion)", - "staticDesc": "Local embedding without WASM or external dependencies", + "autoLabel": "Automático", + "autoDesc": "Utiliza la mejor opción disponible: proveedor remoto > estático > transformers", + "remoteLabel": "Proveedor remoto", + "remoteDesc": "Utiliza embedding mediante la API del proveedor (requiere clave de API)", + "staticLabel": "Local estático (potion)", + "staticDesc": "Embedding local sin WASM ni dependencias externas", "transformersLabel": "Transformers.js (MiniLM)", - "transformersDesc": "Local embedding via @huggingface/transformers (~400MB RAM)", - "providerModelLabel": "Provider / Model", - "noRemoteProviders": "No providers with configured API key", - "selectProviderModel": "Select a model", - "staticEnabledLabel": "Enable Static Potion", - "staticEnabledDesc": "Download and use potion-base-8M model locally", - "transformersEnabledLabel": "Enable Transformers.js", - "transformersEnabledDesc": "Opt-in for local MiniLM (~400MB RAM, ~3s cold start)", - "transformersWarning": "Requires ~400MB RAM and ~3s cold start on the first semantic query." + "transformersDesc": "Embedding local mediante @huggingface/transformers (~400MB RAM)", + "providerModelLabel": "Proveedor / Modelo", + "noRemoteProviders": "No hay proveedores con clave de API configurada", + "selectProviderModel": "Selecciona un modelo", + "staticEnabledLabel": "Activar Static Potion", + "staticEnabledDesc": "Descargar y usar el modelo potion-base-8M localmente", + "transformersEnabledLabel": "Activar Transformers.js", + "transformersEnabledDesc": "Optar por MiniLM local (~400MB RAM, ~3s de arranque en frío)", + "transformersWarning": "Requiere ~400MB de RAM y ~3s de arranque en frío en la primera consulta semántica." }, "emptyState": { - "title": "No memories yet", - "description": "Memories are created automatically from conversations. You can also add them manually using the button above." + "title": "Aún no hay memorias", + "description": "Las memorias se crean automáticamente a partir de las conversaciones. También puedes añadirlas manualmente usando el botón de arriba." }, "engine": { - "statusTitle": "Engine Status", - "embeddingTitle": "Embedding Source", - "rerankTitle": "Rerank (optional)", - "reindexNow": "Reindex now", - "reindexStarted": "Reindexing started ({pending} pending)", - "reindexFailed": "Failed to start reindexing", - "keywordLabel": "Keyword (FTS5)", - "keywordReason": "Keyword search always available", + "statusTitle": "Estado del motor", + "embeddingTitle": "Fuente de embedding", + "rerankTitle": "Rerank (opcional)", + "reindexNow": "Reindexar ahora", + "reindexStarted": "Reindexación iniciada ({pending} pendientes)", + "reindexFailed": "Error al iniciar la reindexación", + "keywordLabel": "Palabra clave (FTS5)", + "keywordReason": "La búsqueda por palabras clave siempre está disponible", "embeddingLabel": "Embedding", "vectorStoreLabel": "Vector Store", "qdrantLabel": "Qdrant", "rerankLabel": "Rerank", - "qdrantDisabled": "Disabled", - "qdrantOk": "Healthy ({latencyMs}ms)", - "qdrantError": "Connection error", - "needsReindex": "{count} memory(ies) need reindexing", - "configureCta": "Configure", - "vectorStoreInstallHint": "To enable vector search: npm install sqlite-vec (needs native Node.js, not WASM), then restart." + "qdrantDisabled": "Desactivado", + "qdrantOk": "Saludable ({latencyMs}ms)", + "qdrantError": "Error de conexión", + "needsReindex": "{count} memoria(s) necesitan reindexación", + "configureCta": "Configurar", + "vectorStoreInstallHint": "Para activar la búsqueda vectorial: npm install sqlite-vec (requiere Node.js nativo, no WASM), luego reinicia." }, - "episodic": "Episodic", - "export": "Export", + "episodic": "Episódica", + "export": "Exportar", "factual": "Factual", - "healthUnknown": "Salud desconocida", - "hitRate": "Hit Rate", - "import": "Import", - "importError": "Failed to import file", - "importResult": "{imported} imported, {skipped} skipped", - "key": "Key", - "keyPlaceholder": "por ej. tema.preferencias.de.usuario", - "loading": "Loading memories...", - "memories": "Memories", + "healthUnknown": "Estado desconocido", + "hitRate": "Tasa de aciertos", + "import": "Importar", + "importError": "Error al importar el archivo", + "importResult": "{imported} importadas, {skipped} omitidas", + "key": "Clave", + "keyPlaceholder": "p. ej. user.preferences.theme", + "loading": "Cargando memorias...", + "memories": "Memorias", "next": "Siguiente", - "noMemories": "No memories found", + "noMemories": "No se han encontrado memorias", "pageInfo": "Página {page} de {totalPages} ({total} en total)", - "pipelineError": "error de canalización", + "pipelineError": "Error de canalización", "pipelineOk": "Canalización correcta ({latencyMs}ms)", "playground": { "infoTitle": "Memory Playground", - "infoDesc": "Simulate what would be retrieved for a given query. No memories are modified — read-only preview.", - "queryLabel": "Test query", - "queryPlaceholder": "Type a question or test phrase...", - "strategyLabel": "Strategy", - "strategyExact": "Exact (FTS5)", - "strategySemantic": "Semantic (vector)", - "strategyHybrid": "Hybrid (RRF)", - "budgetLabel": "Budget (tokens)", - "simulate": "Simulate", - "resultsTitle": "{count} result(s)", - "resolutionTitle": "Search resolution", + "infoDesc": "Simula lo que se recuperaría para una consulta determinada. No se modifica ninguna memoria: vista previa de solo lectura.", + "queryLabel": "Consulta de prueba", + "queryPlaceholder": "Escribe una pregunta o frase de prueba...", + "strategyLabel": "Estrategia", + "strategyExact": "Exacta (FTS5)", + "strategySemantic": "Semántica (vector)", + "strategyHybrid": "Híbrida (RRF)", + "budgetLabel": "Presupuesto (tokens)", + "simulate": "Simular", + "resultsTitle": "{count} resultado(s)", + "resolutionTitle": "Resolución de búsqueda", "resolutionEmbedding": "Embedding", "resolutionStore": "Vector store", - "resolutionStrategy": "Strategy used", - "rerankApplied": "Rerank applied", + "resolutionStrategy": "Estrategia utilizada", + "rerankApplied": "Rerank aplicado", "fallback": "Fallback", - "noResults": "No memories found for this query.", - "tokensUsed": "tokens used", - "none": "none", - "errorFetch": "Failed to fetch preview" + "noResults": "No se han encontrado memorias para esta consulta.", + "tokensUsed": "tokens utilizados", + "none": "ninguno", + "errorFetch": "Error al obtener la vista previa" }, "previous": "Anterior", "procedural": "Procedural", "qdrant": { - "title": "Qdrant (Vector Store Tier 2)", - "description": "Optional Qdrant integration for scalable semantic search", - "enableLabel": "Enable Qdrant", - "enableDesc": "When enabled, Qdrant is used as the primary vector store", - "banner": "Tier 2 vector store — an external, scalable alternative to the built-in sqlite-vec (Tier 1). Enable it only if you have a very large memory set or want shared memory across instances; most users are fine on sqlite-vec. When enabled it becomes the primary store and automatically falls back to sqlite-vec if unreachable.", - "hostHelp": "Local Docker: http://localhost:6333 · Qdrant Cloud: your cluster URL", - "collectionHelp": "Any name — OmniRoute creates it on first use", - "embeddingModelHelp": "Sets the vector dimension automatically on first use. Existing memories are not back-filled, and changing the model after data exists needs a fresh collection.", - "testConnection": "Test connection", - "testing": "Testing...", - "statusActive": "Active", + "title": "Qdrant (Vector Store Nivel 2)", + "description": "Integración opcional con Qdrant para búsqueda semántica escalable", + "enableLabel": "Activar Qdrant", + "enableDesc": "Cuando está activado, Qdrant se utiliza como el vector store principal", + "banner": "Vector store de Nivel 2: una alternativa externa y escalable al sqlite-vec integrado (Nivel 1). Actívalo solo si tienes un conjunto de memoria muy grande o quieres memoria compartida entre instancias; la mayoría de los usuarios tienen suficiente con sqlite-vec. Cuando está activado, se convierte en el almacén principal y automáticamente recurre a sqlite-vec si no está disponible.", + "hostHelp": "Docker local: http://localhost:6333 · Qdrant Cloud: URL de tu clúster", + "collectionHelp": "Cualquier nombre: OmniRoute lo crea en el primer uso", + "embeddingModelHelp": "Establece la dimensión del vector automáticamente en el primer uso. Las memorias existentes no se rellenan y cambiar el modelo después de que existan datos requiere una nueva colección.", + "testConnection": "Probar conexión", + "testing": "Probando...", + "statusActive": "Activo", "statusError": "Error", - "statusDisabled": "Disabled", - "healthOk": "Connection OK ({latencyMs}ms)", - "healthError": "Connection error", - "saved": "Settings saved", - "saveError": "Failed to save", - "portLabel": "Port", - "embeddingModelLabel": "Embedding Model", - "optional": "optional", - "apiKeyKeepPlaceholder": "Leave blank to keep current key", - "apiKeyOptional": "Leave blank if not using authentication", - "removeApiKey": "Remove", - "quickSelectModel": "Quick select", - "searchTestTitle": "Semantic search test", - "searchPlaceholder": "Type a test query...", - "searching": "Searching...", - "search": "Search", - "cleanupTitle": "Clean up old points", - "cleanupDesc": "Remove Qdrant points for expired memories (retention period).", - "cleaning": "Cleaning...", - "cleanNow": "Clean now", - "cleanupSuccess": "{count} point(s) removed", - "cleanupFailed": "Cleanup failed" + "statusDisabled": "Desactivado", + "healthOk": "Conexión correcta ({latencyMs}ms)", + "healthError": "Error de conexión", + "saved": "Ajustes guardados", + "saveError": "Error al guardar", + "portLabel": "Puerto", + "embeddingModelLabel": "Modelo de embedding", + "optional": "opcional", + "apiKeyKeepPlaceholder": "Déjalo en blanco para mantener la clave actual", + "apiKeyOptional": "Déjalo en blanco si no usas autenticación", + "removeApiKey": "Eliminar", + "quickSelectModel": "Selección rápida", + "searchTestTitle": "Prueba de búsqueda semántica", + "searchPlaceholder": "Escribe una consulta de prueba...", + "searching": "Buscando...", + "search": "Buscar", + "cleanupTitle": "Limpiar puntos antiguos", + "cleanupDesc": "Eliminar puntos de Qdrant para memorias caducadas (periodo de retención).", + "cleaning": "Limpiando...", + "cleanNow": "Limpiar ahora", + "cleanupSuccess": "{count} punto(s) eliminado(s)", + "cleanupFailed": "Error en la limpieza" }, "rerank": { - "enableLabel": "Enable Rerank", - "enableDesc": "Reorders results with a reranking model after search", - "warning": "Rerank adds +200-500ms latency and additional cost per request. Use sparingly.", - "providerModelLabel": "Rerank Provider / Model", - "noProviderWithKey": "No provider with configured API key. Configure a provider to use rerank.", - "selectProviderModel": "Select a provider/model" + "enableLabel": "Activar Rerank", + "enableDesc": "Reordena los resultados con un modelo de reranking después de la búsqueda", + "warning": "Rerank añade +200-500ms de latencia y un coste adicional por solicitud. Úsalo con moderación.", + "providerModelLabel": "Proveedor / Modelo de Rerank", + "noProviderWithKey": "No hay proveedor con clave de API configurada. Configura un proveedor para usar rerank.", + "selectProviderModel": "Selecciona un proveedor/modelo" }, "save": "Guardar", - "saving": "Saving...", - "search": "Search memories...", - "semantic": "Semantic", + "saving": "Guardando...", + "search": "Buscar recuerdos...", + "semantic": "Semántica", "summarize": { - "title": "Compact old memories", - "noCandidates": "No memories eligible for compaction (criteria: >30 days old).", - "candidatesDesc": "{count} memories will be compacted into summaries. This action cannot be undone.", - "confirm": "Compact now" + "title": "Compactar recuerdos antiguos", + "noCandidates": "No hay recuerdos aptos para compactar (criterio: >30 días de antigüedad).", + "candidatesDesc": "Se compactarán {count} recuerdos en resúmenes. Esta acción no se puede deshacer.", + "confirm": "Compactar ahora" }, "tabs": { - "memories": "Memories", + "memories": "Recuerdos", "playground": "Playground", - "engine": "Engine" + "engine": "Motor" }, - "title": "Memory Management", - "tokensUsed": "Tokens Used", + "title": "Gestión de memoria", + "tokensUsed": "Tokens usados", "tooltip": { - "totalEntries": "Total memories stored for this API key", - "tokensUsed": "Estimated total tokens occupied by active memories", - "hitRate": "Read-by-ID cache hit rate (not semantic recall accuracy)", - "factual": "Objective, permanent facts from user context", - "episodic": "Events and experiences from conversation history", - "procedural": "Procedures, workflows, and instructions the assistant should follow", - "semantic": "Concepts, preferences, and domain knowledge" + "totalEntries": "Total de recuerdos almacenados para esta clave de API", + "tokensUsed": "Estimación del total de tokens ocupados por recuerdos activos", + "hitRate": "Tasa de aciertos de caché por lectura de ID (no precisión de recuperación semántica)", + "factual": "Hechos objetivos y permanentes del contexto del usuario", + "episodic": "Eventos y experiencias del historial de conversación", + "procedural": "Procedimientos, workflows e instrucciones que el asistente debe seguir", + "semantic": "Conceptos, preferencias y conocimiento de dominio" }, - "totalEntries": "Total Entries", - "type": "Type", - "memoryEnabled": "Memory enabled" + "totalEntries": "Entradas totales", + "type": "Tipo", + "memoryEnabled": "Memoria activada" }, "skills": { "title": "Skills", - "description": "Manage and monitor AI skills", + "description": "Gestionar y monitorizar las skills de IA", "skillsTab": "Skills", - "executionsTab": "Executions", - "selectSkillToInspect": "Select a skill on the left to inspect.", - "schemaTab": "Schema", - "handlerTab": "Handler", - "inputSchema": "Input Schema", - "outputSchema": "Output Schema", - "handlerCode": "Handler Code", - "handlerUnavailable": "Handler not available", - "runTestPlaceholder": "Run test (placeholder)", - "setModeAria": "Set mode {mode}", - "uninstallSkill": "Uninstall skill", + "executionsTab": "Ejecuciones", + "selectSkillToInspect": "Selecciona una skill a la izquierda para inspeccionarla.", + "schemaTab": "Esquema", + "handlerTab": "Controlador", + "inputSchema": "Esquema de entrada", + "outputSchema": "Esquema de salida", + "handlerCode": "Código del controlador", + "handlerUnavailable": "Controlador no disponible", + "runTestPlaceholder": "Ejecutar prueba (placeholder)", + "setModeAria": "Establecer modo {mode}", + "uninstallSkill": "Desinstalar skill", "sandboxTab": "Sandbox", - "loading": "Loading skills...", - "noSkills": "No skills found", - "noExecutions": "No executions found", - "enabled": "Enabled", - "disabled": "Disabled", - "delete": "Delete", - "version": "Version", - "tableDescription": "Description", + "loading": "Cargando skills...", + "noSkills": "No se encontraron skills", + "noExecutions": "No se encontraron ejecuciones", + "enabled": "Activado", + "disabled": "Desactivado", + "delete": "Eliminar", + "version": "Versión", + "tableDescription": "Descripción", "skill": "Skill", - "status": "Status", - "duration": "Duration", - "time": "Time", - "sandboxConfig": "Sandbox Configuration", - "cpuLimit": "CPU Limit", - "cpuLimitDesc": "Maximum execution time per skill", - "memoryLimit": "Memory Limit", - "memoryLimitDesc": "Maximum memory allocation", - "timeout": "Timeout", - "timeoutDesc": "Maximum wait time for response", - "networkAccess": "Network Access", - "networkAccessDesc": "Allow outbound network requests", - "mode": "Mode", + "status": "Estado", + "duration": "Duración", + "time": "Hora", + "sandboxConfig": "Configuración del sandbox", + "cpuLimit": "Límite de CPU", + "cpuLimitDesc": "Tiempo máximo de ejecución por skill", + "memoryLimit": "Límite de memoria", + "memoryLimitDesc": "Asignación máxima de memoria", + "timeout": "Tiempo de espera", + "timeoutDesc": "Tiempo máximo de espera para la respuesta", + "networkAccess": "Acceso a la red", + "networkAccessDesc": "Permitir solicitudes de red salientes", + "mode": "Modo", "q": "Q", - "filterSkillsPlaceholder": "Filtrar habilidades por nombre, descripción o etiqueta", + "filterSkillsPlaceholder": "Filtrar skills por nombre, descripción o etiqueta", "allModes": "Todos los modos", - "totalSkills": "Total de habilidades", + "totalSkills": "Total de skills", "enabledSkills": "Activadas", "totalExecutions": "Ejecuciones", "successRate": "Tasa de éxito", - "marketplaceTab": "Mercado de habilidades", - "applyFilters": "Apply filters", - "popularDefaultsLabel": "Popular by default for selected provider:", + "marketplaceTab": "Marketplace", + "applyFilters": "Aplicar filtros", + "popularDefaultsLabel": "Populares por defecto para el proveedor seleccionado:", "onMode": "ON", "offMode": "OFF", "autoMode": "AUTO", - "installSkillButton": "Install Skill", - "installSkillModalTitle": "Install Skill", - "installJsonPlaceholder": "Paste skill manifest JSON here...", + "installSkillButton": "Instalar skill", + "installSkillModalTitle": "Instalar skill", + "installJsonPlaceholder": "Pega aquí el JSON del manifiesto de la skill...", "installing": "Instalando...", - "installSuccess": "Habilidad instalada ({id})", - "installError": "Install failed", - "invalidJson": "Invalid JSON", - "searchMarketplacePlaceholder": "Search skills...", - "searchMarketplace": "Search Marketplace", - "marketplaceEmpty": "No skills found in marketplace", - "marketplaceError": "Search failed", - "installingFromMarketplace": "Installing from marketplace...", - "popularSkills": "Popular Skills", - "skillsMarketplace": "Mercado de habilidades", - "searching": "Searching...", - "pageInfo": "Page {page} of {totalPages} ({total} total)", - "previous": "Previous", - "next": "Next", - "activeProvider": "Active provider:", - "changeInSettings": "Change this in Settings → Memory & Skills.", - "installs": "installs", - "marketplaceSkillsMpHint": "Configure your SkillsMP API key in Settings to browse the marketplace.", - "marketplaceSkillsShHint": "Search the skills.sh open directory to discover and install agent skills.", - "installSkillModalDesc": "Paste a skill manifest JSON or upload a .json file.", - "uploadJson": "Upload JSON", - "cancel": "Cancel", - "installSkill": "Instalar habilidad" + "installSuccess": "Skill instalada ({id})", + "installError": "Error al instalar", + "invalidJson": "JSON no válido", + "searchMarketplacePlaceholder": "Buscar skills...", + "searchMarketplace": "Buscar en el Marketplace", + "marketplaceEmpty": "No se encontraron skills en el marketplace", + "marketplaceError": "Error en la búsqueda", + "installingFromMarketplace": "Instalando desde el marketplace...", + "popularSkills": "Skills populares", + "skillsMarketplace": "Marketplace de skills", + "searching": "Buscando...", + "pageInfo": "Página {page} de {totalPages} ({total} en total)", + "previous": "Anterior", + "next": "Siguiente", + "activeProvider": "Proveedor activo:", + "changeInSettings": "Cambia esto en Ajustes → Memoria y Skills.", + "installs": "instalaciones", + "marketplaceSkillsMpHint": "Configura tu clave de API de SkillsMP en Ajustes para explorar el marketplace.", + "marketplaceSkillsShHint": "Busca en el directorio abierto skills.sh para descubrir e instalar skills de agentes.", + "installSkillModalDesc": "Pega un JSON de manifiesto de skill o sube un archivo .json.", + "uploadJson": "Subir JSON", + "cancel": "Cancelar", + "installSkill": "Instalar skill" }, "health": { "title": "Estado del sistema", - "description": "Monitoreo en tiempo real de su instancia de OmniRoute", - "healthy": "saludable", - "degraded": "degradado", - "down": "abajo", - "uptime": "tiempo de actividad", + "description": "Monitoreo en tiempo real de tu instancia de OmniRoute", + "healthy": "Saludable", + "degraded": "Degradado", + "down": "Inactivo", + "uptime": "Tiempo de actividad", "memory": "Memoria", "memoryRss": "Memoria (RSS)", - "heap": "montón", + "heap": "Montón (heap)", "cpu": "CPU", "database": "Base de datos", "version": "Versión", - "lastCheck": "último cheque", - "providerHealth": "Salud del proveedor", + "lastCheck": "Última comprobación", + "providerHealth": "Estado de los proveedores", "systemMetrics": "Métricas del sistema", - "tokenHealth": "Salud del token", + "tokenHealth": "Estado de los tokens", "refreshAll": "Actualizar todo", "checkNow": "Comprobar ahora", - "loadingHealth": "Cargando datos de salud...", - "failedToLoad": "No se pudieron cargar los datos de salud: {error}", + "loadingHealth": "Cargando datos de estado...", + "failedToLoad": "No se pudieron cargar los datos de estado: {error}", "retry": "Reintentar", - "allOperational": "Todos los sistemas operativos.", + "allOperational": "Todo operativo", "issuesDetected": "Problemas del sistema detectados", - "updatedAt": "Actualizado {time}", + "updatedAt": "Actualizado a las {time}", "latency": "Latencia", "latencyP50": "p50", "latencyP95": "p95", "latencyP99": "p99", - "millisecondsShort": "{value}ms", + "millisecondsShort": "{value} ms", "notAvailable": "—", "totalRequests": "Solicitudes totales", "noDataYet": "Aún no hay datos", - "promptCache": "Caché de aviso", + "promptCache": "Caché de prompt", "entries": "Entradas", "hitRate": "Tasa de aciertos", - "hitsMisses": "Aciertos/fallos", + "hitsMisses": "Aciertos / Fallos", "signatureCache": "Caché de firma", - "signatureDefaults": "Valores predeterminados", + "signatureDefaults": "Predeterminados", "signatureTool": "Herramienta", - "signatureFamily": "familia", + "signatureFamily": "Familia", "signatureSession": "Sesión", "recovering": "Recuperando", - "noCBData": "No hay datos de disyuntores disponibles. Primero haga algunas solicitudes.", + "noCBData": "No hay datos de disyuntores (circuit breakers) disponibles. Realiza algunas solicitudes primero.", "providerHealthStatusAria": "Estado de salud del proveedor", "issuesLabel": "Problemas detectados", "operational": "Operacional", "providers": "Proveedores", - "configuredProvidersLabel": "Configurado en el tablero", + "configuredProvidersLabel": "Configurados en el panel", "configuredProvidersHint": "Proveedores con credenciales guardadas en /dashboard/providers, independientemente del estado de ejecución.", - "activeProviders": "{count} active", + "activeProviders": "{count} activo", "activeProvidersHint": "Proveedores configurados actualmente habilitados para enrutar solicitudes.", - "monitoredProviders": "{count} monitored", - "monitoredProvidersHint": "Proveedores actualmente rastreados por monitores de estado de interruptores.", + "monitoredProviders": "{count} monitorizado", + "monitoredProvidersHint": "Proveedores actualmente rastreados por los monitores de estado de los disyuntores.", "healthyCount": "{count} saludable", - "nodeVersion": "Nodo {version}", + "nodeVersion": "Node {version}", "failures": "{count} error", - "failuresPlural": "{count} fallas", - "lastFailure": "último", - "rateLimitStatus": "Estado del límite de tarifa", + "failuresPlural": "{count} errores", + "lastFailure": "Último", + "rateLimitStatus": "Estado del rate limit", "activeLimiters": "{count} limitador activo", "activeLimitersPlural": "{count} limitadores activos", "queued": "En cola", "queuedCount": "{count} en cola", - "running": "corriendo", - "runningCount": "{count} ejecutándose", - "ok": "bien", + "running": "ejecutándose", + "runningCount": "{count} en ejecución", + "ok": "OK", "activeLockouts": "Bloqueos activos", - "resetConfirm": "¿Restablecer todos los disyuntores a un estado saludable? Esto borrará todos los recuentos de fallas y restaurará todos los proveedores al estado operativo.", - "resetAllTitle": "Restablezca todos los disyuntores al estado saludable", + "resetConfirm": "¿Restablecer todos los disyuntores a un estado saludable? Esto borrará todos los recuentos de errores y restaurará a todos los proveedores al estado operacional.", + "resetAllTitle": "Restablecer todos los disyuntores a un estado saludable", "resetting": "Restableciendo...", "resetAll": "Restablecer todo", - "until": "Hasta {time}", - "limitExhausted": "Exhausted", - "learnedFromHeaders": "Learned from headers", - "remainingOfLimit": "{remaining}/{limit} remaining", + "until": "Hasta las {time}", + "limitExhausted": "Agotado", + "learnedFromHeaders": "Aprendido de las cabeceras", + "remainingOfLimit": "{remaining}/{limit} restantes", "throttleStatus": "Throttle: {value}", - "lastHeaderUpdate": "Header update: {age}", + "lastHeaderUpdate": "Actualización de cabecera: {age}", "databaseHealth": "Estado de la base de datos", - "databaseHealthDescription": "Diagnose and repair stale quota/domain rows and broken combo references.", - "status": "Status", - "attentionNeeded": "Attention needed", - "repairs": "Repairs", - "repairing": "Repairing...", - "runAutoRepair": "Run Auto-Repair", - "repairBackupCreated": "A repair backup was created before mutating.", - "sessionActivity": "Session Activity", - "activeCount": "{count} active", - "requestCount": "{count, plural, one {# request} other {# requests}}", - "idleSeconds": "{count}s idle", - "ageSeconds": "{count}s age", - "quotaMonitors": "Quota Monitors", - "alerting": "Alerting", - "errors": "Errors", - "degradationFull": "Full", - "degradationReduced": "Reduced", - "degradationMinimal": "Minimal", - "degradationDefault": "Default", - "sinceTime": "Since {time}", - "retryIn": "retry in {duration}", - "stickyBoundSessions": "Sesiones encuadernadas", - "sessionsByApiKey": "Sesiones por clave API", - "noActiveSessionsTracked": "Aún no se han registrado sesiones activas.", + "databaseHealthDescription": "Diagnosticar y reparar filas de cuota/dominio obsoletas y referencias rotas en combinaciones.", + "status": "Estado", + "attentionNeeded": "Requiere atención", + "repairs": "Reparaciones", + "repairing": "Reparando...", + "runAutoRepair": "Ejecutar autorreparación", + "repairBackupCreated": "Se creó una copia de seguridad de reparación antes de modificar.", + "sessionActivity": "Actividad de la sesión", + "activeCount": "{count} activas", + "requestCount": "{count, plural, one {# solicitud} other {# solicitudes}}", + "idleSeconds": "{count} s inactivo", + "ageSeconds": "Antigüedad: {count} s", + "quotaMonitors": "Monitores de cuota", + "alerting": "En alerta", + "errors": "Errores", + "degradationFull": "Total", + "degradationReduced": "Reducida", + "degradationMinimal": "Mínima", + "degradationDefault": "Predeterminada", + "sinceTime": "Desde {time}", + "retryIn": "reintentar en {duration}", + "stickyBoundSessions": "Sesiones con vinculación persistente", + "sessionsByApiKey": "Sesiones por clave de API", + "noActiveSessionsTracked": "Aún no se ha hecho seguimiento de sesiones activas.", "noSessionQuotaMonitorsActive": "No hay monitores de cuota de sesión activos.", - "gracefulDegradationStatus": "Estado de degradación elegante", - "additionalModels": "+{count} más modelos", - "providerHealthMatrixTitle": "Matriz de salud de proveedores", - "providerHealthMatrixDescription": "Estados de Proveedor × Cuenta × Modelo obtenidos de disyuntores, enfriamientos, bloqueos y registros.", - "healthMatrixRange": "Rango de la matriz de salud", + "gracefulDegradationStatus": "Estado de degradación progresiva", + "additionalModels": "+{count} modelos más", + "providerHealthMatrixTitle": "Matriz de estado de proveedores", + "providerHealthMatrixDescription": "Estados de proveedor × cuenta × modelo procedentes de disyuntores, cooldowns, bloqueos y logs.", + "healthMatrixRange": "Rango de la matriz de estado", "providerFilter": "Filtro de proveedor", "onlyIssues": "Solo problemas", - "refresh": "Refresh", - "accounts": "Accounts", - "models": "Models", - "issues": "Issues", - "loadingProviderHealthMatrix": "Loading provider health matrix...", - "failedProviderHealthMatrix": "Failed to load Provider Health Matrix: {error}", - "noProvidersMatchedFilters": "No providers matched the current filters.", - "modelPillSummary": "{requests} req · {successRate} success · {latency} avg", - "modelLockoutSummary": "{reason} · {duration} left", - "locked": "locked", - "inferred": "inferred", - "inactive": "Inactive", - "noConnectionId": "no connection id", - "accountModelSummary": "{connectionId} · {count} models", - "cooldown": "Enfriamiento", - "durationRemaining": "{duration} remaining", - "noSyncedModelsOrTraffic": "No synced models or recent traffic yet.", - "providerRowSummary": "{active}/{total} active accounts · {requests} req · {successRate} success · {latency} avg", - "cooldownCount": "{count} cooldown", - "lockoutCount": "{count} lockouts", - "issueCount": "{count} issues", - "score": "Score", - "lastRequest": "Last request", + "refresh": "Actualizar", + "accounts": "Cuentas", + "models": "Modelos", + "issues": "Problemas", + "loadingProviderHealthMatrix": "Cargando matriz de estado de proveedores...", + "failedProviderHealthMatrix": "Error al cargar la matriz de estado de proveedores: {error}", + "noProvidersMatchedFilters": "Ningún proveedor coincide con los filtros actuales.", + "modelPillSummary": "{requests} sol. · {successRate} éxito · {latency} media", + "modelLockoutSummary": "{reason} · quedan {duration}", + "locked": "bloqueado", + "inferred": "inferido", + "inactive": "Inactivo", + "noConnectionId": "sin ID de conexión", + "accountModelSummary": "{connectionId} · {count} modelos", + "cooldown": "enfriamiento", + "durationRemaining": "quedan {duration}", + "noSyncedModelsOrTraffic": "Aún no hay modelos sincronizados ni tráfico reciente.", + "providerRowSummary": "{active}/{total} cuentas activas · {requests} sol. · {successRate} éxito · {latency} media", + "cooldownCount": "{count} en enfriamiento", + "lockoutCount": "{count} bloqueos", + "issueCount": "{count} problemas", + "score": "Puntuación", + "lastRequest": "Última solicitud", "lastError": "Último error" }, "telemetry": { "title": "Telemetría del sistema", "description": "Señales continuas de solicitud, tiempo de ejecución, sesión y memoria de este proceso OmniRoute.", - "uptime": "tiempo de actividad", + "uptime": "Tiempo de actividad", "totalRequests": "Solicitudes totales", - "avgLatency": "Latencia promedio", + "avgLatency": "Latencia media", "errorRate": "Tasa de errores", "activeConnections": "Conexiones activas", - "memoryUsage": "Uso de la memoria", + "memoryUsage": "Uso de memoria", "latencyTrend": "Tendencia de latencia", "throughputTrend": "Tendencia de rendimiento", - "memoryTrend": "Tendencia de la memoria", + "memoryTrend": "Tendencia de memoria", "refresh": "Actualizar", "updatedAt": "Actualizado {time}", - "loadFailed": "No se pudo cargar la telemetría.", + "loadFailed": "Error al cargar la telemetría.", "partialData": "La telemetría está parcialmente disponible: {error}" }, "mitm": { "title": "Proxy MITM", "description": "Proxy transparente para interceptar y enrutar solicitudes de clientes.", "enable": "Habilitar el proxy MITM", - "enableDesc": "Inicie o detenga el proceso de interceptación local y anulación de DNS.", + "enableDesc": "Inicie o detenga el proceso de interceptación local y la invalidación de DNS.", "status": "Estado", - "running": "corriendo", + "running": "En ejecución", "stopped": "Detenido", - "start": "Empezar", + "start": "Iniciar", "stop": "Detener", "refresh": "Actualizar", - "port": "Puerto proxy", - "apiKey": "Clave API del enrutador", - "apiKeyPlaceholder": "Opcional; vuelve a una clave local", - "sudoPassword": "Contraseña sudo", - "cachedPassword": "En caché para este proceso", - "saveSettings": "Guardar configuración", - "settingsSaved": "Configuración MITM guardada.", - "startedSuccess": "Se inició el proxy MITM.", - "stoppedSuccess": "El proxy MITM se detuvo.", - "saveFailed": "No se pudo actualizar la configuración de MITM.", - "loadFailed": "No se pudo cargar la configuración de MITM.", - "invalidPort": "La interceptación MITM transparente actualmente requiere el puerto 443.", + "port": "Puerto del proxy", + "apiKey": "Clave de API del enrutador", + "apiKeyPlaceholder": "Opcional; recurre a una clave local", + "sudoPassword": "Contraseña de sudo", + "cachedPassword": "Guardada en caché para este proceso", + "saveSettings": "Guardar ajustes", + "settingsSaved": "Ajustes de MITM guardados.", + "startedSuccess": "Proxy MITM iniciado.", + "stoppedSuccess": "Proxy MITM detenido.", + "saveFailed": "Error al actualizar los ajustes de MITM.", + "loadFailed": "Error al cargar los ajustes de MITM.", + "invalidPort": "La interceptación transparente MITM requiere actualmente el puerto 443.", "certificate": "Certificado de CA", "certificateReady": "El certificado está disponible para la instalación de confianza del cliente.", "certificateMissing": "El certificado aún no se ha generado.", "available": "Disponible", - "missing": "desaparecido", - "downloadCert": "Descargar Certificado CA", - "regenerateCert": "Certificado regenerado", - "regenerateConfirm": "Esto invalidará la confianza existente del cliente. ¿Continuar?", + "missing": "Ausente", + "downloadCert": "Descargar certificado de CA", + "regenerateCert": "Regenerar certificado", + "regenerateConfirm": "Esto invalidará la confianza del cliente existente. ¿Continuar?", "regenerateSuccess": "Certificado MITM regenerado.", - "regenerateFailed": "No se pudo regenerar el certificado MITM.", + "regenerateFailed": "Error al regenerar el certificado MITM.", "targetRoutes": "Rutas de destino", "interceptedRequests": "Solicitudes interceptadas", "activeConnections": "Conexiones activas", "dnsConfigured": "DNS configurado", "pid": "PID", - "lastIntercept": "Última intercepción", - "target": "Objetivo", - "host": "Anfitrión", - "localPort": "Puerto Local", - "endpoints": "Puntos finales", + "lastIntercept": "Última interceptación", + "target": "Destino", + "host": "Host", + "localPort": "Puerto local", + "endpoints": "Endpoints", "enabled": "Habilitado", "configured": "Configurado", - "yes": "si", + "yes": "Sí", "no": "No", "noTargets": "No hay rutas de destino configuradas." }, "limits": { "title": "Límites y cuotas", - "rateLimit": "Límite de tarifa", - "remaining": "restante", + "rateLimit": "Rate limit", + "remaining": "Restante", "requestsPerMinute": "Solicitudes/min", - "tokensPerMinute": "Fichas/min", + "tokensPerMinute": "Tokens/min", "dailyLimit": "Límite diario" }, "logs": { - "title": "Registros", - "requestLogs": "Solicitar registros", - "proxyLogs": "Registros de proxy", - "auditLog": "Registro de auditoría", + "title": "Logs", + "requestLogs": "Logs de solicitudes", + "proxyLogs": "Logs de proxy", + "auditLog": "Log de auditoría", "console": "Consola", - "auditLogDesc": "Acciones administrativas y eventos de seguridad.", + "auditLogDesc": "Acciones administrativas y eventos de seguridad", "loading": "Cargando...", "refresh": "Actualizar", "filterByAction": "Filtrar por acción...", "filterByActor": "Filtrar por actor...", - "filterEntriesAria": "Filtrar entradas del registro de auditoría", + "filterEntriesAria": "Filtrar entradas del log de auditoría", "filterByActionTypeAria": "Filtrar por tipo de acción", "filterByActorAria": "Filtrar por actor", - "refreshAuditLogAria": "Actualizar el registro de auditoría", - "tableAria": "Entradas del registro de auditoría", - "failedFetchAuditLog": "No se pudo recuperar el registro de auditoría", - "showing": "Mostrando entradas {count} (desplazamiento {offset})", + "refreshAuditLogAria": "Actualizar el log de auditoría", + "tableAria": "Entradas del log de auditoría", + "failedFetchAuditLog": "Error al obtener el log de auditoría", + "showing": "Mostrando {count} entradas (desplazamiento {offset})", "search": "Buscar", "timestamp": "Marca de tiempo", - "action": "acción", + "action": "Acción", "actor": "Actor", - "target": "Objetivo", + "target": "Destino", "details": "Detalles", "ipAddress": "Dirección IP", "notAvailable": "—", - "noEntries": "No se encontraron entradas del registro de auditoría", + "noEntries": "No se encontraron entradas en el log de auditoría", "previous": "Anterior", "next": "Siguiente", - "providerWarningTitle": "Provider Warning Title", - "viewDetails": "View Details", - "eventMetadata": "Event Metadata", - "eventPayload": "Event Payload", - "requestId": "Request Id", - "providerWarningDesc": "Provider Warning Desc", + "providerWarningTitle": "Advertencias de proveedores", + "viewDetails": "Ver detalles", + "eventMetadata": "Metadatos del evento", + "eventPayload": "Payload del evento", + "requestId": "ID de solicitud", + "providerWarningDesc": "Algunos proveedores devolvieron advertencias durante el procesamiento de la solicitud", "a": "A", - "offset": "Offset", - "limit": "Limit", - "status": "Status", - "resourceType": "Resource Type", - "totalEntries": "Total Entries", - "tab": "Tab", - "auditModalSubtitle": "Audit Modal Subtitle", - "close": "Close", - "runningRequests": "Active Requests", - "runningRequestsDesc": "Real-time view of currently running upstream requests", + "offset": "Desplazamiento", + "limit": "Límite", + "status": "Estado", + "resourceType": "Tipo de recurso", + "totalEntries": "Entradas totales", + "tab": "Pestaña", + "auditModalSubtitle": "Detalles y metadatos del evento", + "close": "Cerrar", + "runningRequests": "Solicitudes activas", + "runningRequestsDesc": "Vista en tiempo real de las solicitudes de servidor superior en ejecución", "clearAll": "Borrar todo", "confirmClearActiveRequests": "¿Borrar todas las solicitudes activas?", - "model": "Model", - "provider": "Provider", - "account": "Account", - "elapsed": "Elapsed", + "model": "Modelo", + "provider": "Proveedor", + "account": "Cuenta", + "elapsed": "Transcurrido", "activeStage": "Etapa", "activeStageUnknown": "Aún no se ha enviado al servidor superior", "activeStageRegistered": "Registrado", - "activeStagePayloadPrepared": "Carga útil preparada", + "activeStagePayloadPrepared": "Payload preparado", "activeStageWaitingAccountSlot": "Esperando ranura de cuenta", - "activeStageWaitingRateLimit": "Waiting for rate limiter", - "activeStageRateLimitSlotAcquired": "Rate limit slot acquired", - "activeStageSendingToProvider": "Sending to upstream", - "activeStageProviderResponseStarted": "Upstream response started", - "count": "Count", + "activeStageWaitingRateLimit": "Esperando limitador de tasa", + "activeStageRateLimitSlotAcquired": "Ranura de rate limit obtenida", + "activeStageSendingToProvider": "Enviando al servidor superior", + "activeStageProviderResponseStarted": "Respuesta del servidor superior iniciada", + "count": "Recuento", "payloads": "Payloads", - "viewPayloads": "View", - "activeCount": "{count} active", - "clientPayload": "Client Request Payload", - "upstreamPayload": "Upstream Provider Payload", - "upstreamNotSentYet": "Not sent to upstream yet", - "runningRequestDetailMeta": "Account: {account} — Elapsed: {elapsed}", - "export": "Export", - "exporting": "Exporting...", - "exportFailed": "Export failed", - "cleanHistoryButton": "Clean history", - "cleanHistoryTitle": "Clean log history?", - "cleanHistoryMessage": "This permanently clears all request log rows, legacy detail rows, and local artifact files under DATA_DIR/call_logs. The live page will refresh after cleanup.", - "cleanHistoryConfirm": "Clean history", - "cleanHistoryCancel": "Cancel", - "cleanHistorySuccess": "Cleaned {deleted} log entries, {deletedArtifacts} artifacts, and {deletedDetailedLogs} legacy detail rows.", - "cleanHistoryEmpty": "No request log history was found.", - "cleanHistoryFailed": "Failed to clean log history.", - "timeRange": "Time Range", - "lastNHours": "Last {hours}", - "defaultRange": "default", + "viewPayloads": "Ver", + "activeCount": "{count} activo", + "clientPayload": "Payload de la solicitud del cliente", + "upstreamPayload": "Payload del proveedor upstream", + "upstreamNotSentYet": "Aún no enviado al upstream", + "runningRequestDetailMeta": "Cuenta: {account} — Transcurrido: {elapsed}", + "export": "Exportar", + "exporting": "Exportando...", + "exportFailed": "Error al exportar", + "cleanHistoryButton": "Limpiar historial", + "cleanHistoryTitle": "¿Limpiar el historial de logs?", + "cleanHistoryMessage": "Esto borrará permanentemente todas las filas de logs de solicitudes, filas de detalles antiguos y archivos de artefactos locales en DATA_DIR/call_logs. La página se actualizará tras la limpieza.", + "cleanHistoryConfirm": "Limpiar historial", + "cleanHistoryCancel": "Cancelar", + "cleanHistorySuccess": "Se han limpiado {deleted} entradas de log, {deletedArtifacts} artefactos y {deletedDetailedLogs} filas de detalles antiguos.", + "cleanHistoryEmpty": "No se encontró historial de logs de solicitudes.", + "cleanHistoryFailed": "Error al limpiar el historial de logs.", + "timeRange": "Intervalo de tiempo", + "lastNHours": "Últimas {hours}", + "defaultRange": "predeterminado", "consoleViewer": { - "fetchFailed": "Failed to fetch logs", - "copyFailed": "Failed to copy log entry", - "copyLogEntry": "Copy log entry", - "filterByLevel": "Filter by log level", - "searchPlaceholder": "Search logs…", - "searchAria": "Search log entries", - "disableAutoScroll": "Disable auto-scroll", - "enableAutoScroll": "Enable auto-scroll", - "autoScroll": "Auto-scroll", - "entryCount": "{count, plural, one {# entry} other {# entries}}", - "lastHour": "Last 1h", - "updatedAt": "Updated {time}", - "fileLoggingRequired": "Make sure the application is writing logs to a file (APP_LOG_TO_FILE=true)", - "consoleAria": "Application console logs", - "applicationConsole": "Application Console", - "emptyFileLoggingHint": "Ensure APP_LOG_TO_FILE=true is set in your .env file" + "fetchFailed": "Error al obtener los logs", + "copyFailed": "Error al copiar la entrada de log", + "copyLogEntry": "Copiar entrada de log", + "filterByLevel": "Filtrar por nivel de log", + "searchPlaceholder": "Buscar en logs…", + "searchAria": "Buscar entradas de log", + "disableAutoScroll": "Desactivar desplazamiento automático", + "enableAutoScroll": "Activar desplazamiento automático", + "autoScroll": "Desplazamiento automático", + "entryCount": "{count, plural, one {# entrada} other {# entradas}}", + "lastHour": "Última hora", + "updatedAt": "Actualizado {time}", + "fileLoggingRequired": "Asegúrate de que la aplicación esté escribiendo logs en un archivo (APP_LOG_TO_FILE=true)", + "consoleAria": "Logs de la consola de la aplicación", + "applicationConsole": "Consola de la aplicación", + "emptyFileLoggingHint": "Asegúrate de que APP_LOG_TO_FILE=true esté configurado en tu archivo .env" }, - "compressionLogTitle": "Compression Log", - "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.", + "compressionLogTitle": "Log de compresión", + "compressionLogEmpty": "Aún no hay solicitudes comprimidas. Las estadísticas de compresión aparecerán aquí cuando se procesen solicitudes con la compresión activada.", "tokens": "tokens" }, "onboarding": { "welcome": "Bienvenido", - "tiers": "Tiers", + "tiers": "Niveles", "security": "Seguridad", - "test": "prueba", + "test": "Prueba", "ready": "¡Listo!", "setPassword": "Establecer contraseña", "addProvider": "Añade tu primer proveedor", @@ -4670,115 +4672,115 @@ "confirmPasswordPlaceholder": "Confirmar contraseña", "passwordsMismatch": "Las contraseñas no coinciden", "setupComplete": "¡Configuración completa!", - "goToDashboard": "Ir al Panel →", - "welcomeDesc": "OmniRoute es su proxy API de IA local. Enruta solicitudes a múltiples proveedores de IA con equilibrio de carga, conmutación por error y seguimiento de uso.", + "goToDashboard": "Ir al panel →", + "welcomeDesc": "OmniRoute es tu proxy de API de IA local. Enruta solicitudes a múltiples proveedores de IA con equilibrio de carga, failover y seguimiento de uso.", "multiProvider": "Multiproveedor", "usageTracking": "Seguimiento de uso", - "securityDesc": "Establezca una contraseña para proteger su panel u omítala por ahora.", - "providerDesc": "Conecte su primer proveedor de IA. Puedes agregar más más tarde.", - "apiKeyRequired": "Clave API (obligatoria)", + "securityDesc": "Establece una contraseña para proteger tu panel, o sáltalo por ahora.", + "providerDesc": "Conecta tu primer proveedor de IA. Puedes añadir más adelante.", + "apiKeyRequired": "Clave de API (obligatoria)", "customUrlOptional": "URL personalizada (opcional)", - "testDesc": "Verifiquemos que la conexión de su proveedor funcione.", + "testDesc": "Vamos a verificar que la conexión con tu proveedor funciona.", "runTest": "Ejecutar prueba de conexión", "testingConnection": "Probando conexión...", - "connectionSuccessful": "¡Conexión exitosa! Su proveedor está listo.", - "noProviderFound": "No se encontró ningún proveedor. Puede agregar uno desde el panel más tarde.", - "testFailed": "La prueba falló, pero puedes configurar esto más tarde.", + "connectionSuccessful": "¡Conexión exitosa! Tu proveedor está listo.", + "noProviderFound": "No se encontró ningún proveedor. Puedes añadir uno desde el panel más tarde.", + "testFailed": "La prueba falló, pero puedes configurarlo más tarde.", "couldNotTest": "No se pudo realizar la prueba en este momento. Puedes probar desde el panel.", - "doneDesc": "¡Estás listo! Su instancia de OmniRoute está configurada y lista para enviar solicitudes de IA.", - "yourEndpoint": "Su punto final:", + "doneDesc": "¡Todo listo! Tu instancia de OmniRoute está configurada y lista para hacer proxy de solicitudes de IA.", + "yourEndpoint": "Tu endpoint:", "continue": "Continuar", "retry": "Reintentar", - "failedSetPassword": "No se pudo establecer la contraseña. Intentar otra vez.", - "failedAddProvider": "No se pudo agregar el proveedor. Intentar otra vez.", - "connectionError": "Error de conexión. Por favor inténtalo de nuevo.", + "failedSetPassword": "Error al establecer la contraseña. Inténtalo de nuevo.", + "failedAddProvider": "Error al añadir el proveedor. Inténtalo de nuevo.", + "connectionError": "Error de conexión. Por favor, inténtalo de nuevo.", "provider": "Proveedor", - "apiKeyHelp": "Una clave API es una contraseña para los servicios de IA. Obtenga uno del sitio web de su proveedor (por ejemplo, platform.openai.com, console.anthropic.com).", + "apiKeyHelp": "Una clave de API es una contraseña para servicios de IA. Obtén una en el sitio web de tu proveedor (ej. platform.openai.com, console.anthropic.com).", "tier": { - "subtitle": "OmniRoute organiza a los proveedores en tres niveles para que las rutas prefieran primero la ruta más confiable y de menor costo.", - "flowCaption": "Requests flow through your subscription quotas first, then pay-per-token cheap providers, then free-tier providers — automatic, zero-config.", - "afterSetup": "after setup.", + "subtitle": "OmniRoute organiza los proveedores en tres niveles para que el enrutamiento prefiera primero la ruta más fiable y de menor coste.", + "flowCaption": "Las solicitudes pasan primero por tus cuotas de suscripción, luego por proveedores baratos de pago por token y, finalmente, por proveedores de nivel gratuito: automático y sin configuración.", + "afterSetup": "después de la configuración.", "tier1": { "label": "Clientes premium", "description": "CLI de primera clase con flujos de autenticación nativos y modelos de razonamiento." }, "tier2": { - "label": "Costo optimizado", - "description": "Proveedores baratos y de alto rendimiento utilizados para el tráfico diario." + "label": "Optimizado por coste", + "description": "Proveedores económicos de alto rendimiento para el tráfico diario." }, "tier3": { "label": "Respaldo y especialidad", - "description": "Puntos finales especializados o alojados localmente que se utilizan como alternativas." + "description": "Endpoints alojados localmente o especializados usados como fallback." }, "configure": "Configurar proveedores" }, - "tierFlowDiagramAlt": "Diagrama alternativo de 3 niveles de OmniRoute", - "apiKeyMgmt": "Gestión de claves API" + "tierFlowDiagramAlt": "Diagrama de fallback de 3 niveles de OmniRoute", + "apiKeyMgmt": "Gestión de claves de API" }, "providers": { "title": "Proveedores", - "Account Deactivated": "Account Deactivated", + "Account Deactivated": "Cuenta desactivada", "allProviders": "Todos los proveedores", "audioProviders": "Proveedores de audio", - "showFreeOnly": "Sólo gratis", - "addProvider": "Agregar proveedor", + "showFreeOnly": "Solo gratuitos", + "addProvider": "Añadir proveedor", "addFirstProvider": "Añade tu primer proveedor", - "addFirstProviderDesc": "Conecte un proveedor de IA para comenzar a enrutar solicitudes a través de OmniRoute. Puede utilizar proveedores gratuitos, claves API o cuentas OAuth.", + "addFirstProviderDesc": "Conecta un proveedor de IA para empezar a enrutar solicitudes a través de OmniRoute. Puedes usar proveedores gratuitos, claves de API o cuentas OAuth.", "learnMore": "Más información", - "importFromFile": "Import from file", - "importFromFileTitle": "Import providers from file", - "importFromFileDescription": "Upload a CSV or JSON file listing multiple providers (each row can be a different provider type). Review the parsed rows below and pick which ones to import.", - "importFromFileChoose": "Choose file", - "importFromFileSelectHint": "{count} of {total} selected", - "importFromFileColProvider": "Provider", - "importFromFileColName": "Name", + "importFromFile": "Importar desde archivo", + "importFromFileTitle": "Importar proveedores desde archivo", + "importFromFileDescription": "Sube un archivo CSV o JSON con una lista de proveedores (cada fila puede ser un tipo de proveedor distinto). Revisa las filas analizadas abajo y elige cuáles importar.", + "importFromFileChoose": "Elegir archivo", + "importFromFileSelectHint": "{count} de {total} seleccionados", + "importFromFileColProvider": "Proveedor", + "importFromFileColName": "Nombre", "importFromFileColBaseUrl": "Base URL", - "importFromFileErrorLine": "Row {line}: {reason}", - "importErrorMissingProvider": "missing provider", - "importErrorMissingName": "missing name", - "importErrorMissingApiKey": "missing API key", - "importErrorInvalidPriority": "invalid priority (must be 1-100)", - "importErrorMalformedRow": "malformed row", - "importErrorNotArray": "file must contain a JSON array", - "importFromFileImporting": "Importing…", - "importFromFileImport": "Import {count} providers", - "importFromFileResult": "Imported {success} providers ({failed} failed)", + "importFromFileErrorLine": "Fila {line}: {reason}", + "importErrorMissingProvider": "falta el proveedor", + "importErrorMissingName": "falta el nombre", + "importErrorMissingApiKey": "falta la clave de API", + "importErrorInvalidPriority": "prioridad no válida (debe ser 1-100)", + "importErrorMalformedRow": "fila mal formada", + "importErrorNotArray": "el archivo debe contener un array JSON", + "importFromFileImporting": "Importando…", + "importFromFileImport": "Importar {count} proveedores", + "importFromFileResult": "Se han importado {success} proveedores ({failed} fallidos)", "adaptaTutorial": { - "title": "How to connect Adapta Web", - "introPrefix": "Adapta authenticates through Clerk. The token", - "introSuffix": "is a long-lived JWT that lets OmniRoute refresh sessions automatically.", - "or": "or", - "step1Title": "Open Adapta chat", - "step1DescPrefix": "Open", - "step1DescSuffix": "and sign in with your Gold or Business account.", - "step2Title": "Open DevTools", - "step2DescPrefix": "Press", - "step2DescSuffix": "to open Developer Tools.", - "step3Title": "Go to Application → Cookies", - "step3DescPrefix": "In the", - "step3DescMiddle": "expand", - "step3DescSuffix": "and click", - "step4Title": "Copy the cookie value for", - "step4DescPrefix": "Find the cookie named", - "step4DescMiddle": "in the list. Click it and copy the content from the", - "step4DescSuffix": "column. It starts with", - "step5Title": "Paste it here and save", - "step5DescPrefix": "Click", - "step5DescMiddle": "paste the", - "step5DescSuffix": "value into the API Key field, then save. OmniRoute will refresh the session automatically.", - "tipLabel": "Tip:", - "tipPrefix": "The", - "tipSuffix": "cookie is long-lived, usually for months. You only need to renew it if you sign out or Adapta invalidates the session." + "title": "Cómo conectar Adapta Web", + "introPrefix": "Adapta se autentica a través de Clerk. El token", + "introSuffix": "es un JWT de larga duración que permite a OmniRoute refrescar las sesiones automáticamente.", + "or": "o", + "step1Title": "Abrir chat de Adapta", + "step1DescPrefix": "Abre", + "step1DescSuffix": "e inicia sesión con tu cuenta Gold o Business.", + "step2Title": "Abrir DevTools", + "step2DescPrefix": "Pulsa", + "step2DescSuffix": "para abrir las herramientas de desarrollador.", + "step3Title": "Ir a Application → Cookies", + "step3DescPrefix": "En", + "step3DescMiddle": "despliega", + "step3DescSuffix": "y haz clic en", + "step4Title": "Copiar el valor de la cookie para", + "step4DescPrefix": "Busca la cookie llamada", + "step4DescMiddle": "en la lista. Haz clic en ella y copia el contenido de la columna", + "step4DescSuffix": ". Empieza por", + "step5Title": "Pégalo aquí y guarda", + "step5DescPrefix": "Haz clic en", + "step5DescMiddle": "pega el valor", + "step5DescSuffix": "en el campo de clave de API y guarda. OmniRoute refrescará la sesión automáticamente.", + "tipLabel": "Consejo:", + "tipPrefix": "La cookie", + "tipSuffix": "es de larga duración, normalmente meses. Solo necesitas renovarla si cierras sesión o Adapta invalida la sesión." }, "editProvider": "Editar proveedor", "deleteProvider": "Eliminar proveedor", "noProviders": "No hay proveedores configurados", - "modelAvailability": "Disponibilidad del modelo", + "modelAvailability": "Disponibilidad de modelos", "accounts": "Cuentas", "newAccount": "Nueva cuenta", - "deleteConfirm": "¿Está seguro de que desea eliminar este proveedor?", + "deleteConfirm": "¿Estás seguro de que quieres eliminar este proveedor?", "testing": "Probando...", - "testConnection": "Conexión de prueba", + "testConnection": "Probar conexión", "testSuccess": "Conexión exitosa", "testFailed": "La conexión falló", "available": "Disponible", @@ -4786,469 +4788,469 @@ "unavailable": "No disponible", "unknown": "Desconocido", "oauthLabel": "OAuth", - "compatibleLabel": "compatibles", - "chat": "Charla", + "compatibleLabel": "Compatible", + "chat": "Chat", "responses": "Respuestas", "messages": "Mensajes", - "oauthProviders": "Proveedores de OAuth", + "oauthProviders": "Proveedores OAuth", "freeProviders": "Proveedores gratuitos", - "apiKeyProviders": "Proveedores de claves API", - "compatibleProviders": "Proveedores compatibles con claves API", - "testAll": "Probar todo", + "apiKeyProviders": "Proveedores de clave de API", + "compatibleProviders": "Proveedores compatibles con clave de API", + "testAll": "Probar todos", "reorderByAvailability": "Reordenar", "reorderByAvailabilityTitle": "Reordenar conexiones por disponibilidad", - "reorderByAvailabilityError": "No se pudieron reordenar las conexiones por disponibilidad", - "distributeProxies": "Distribute Proxies", - "distributing": "Distributing...", - "selectedCount": "{count, plural, one {# selected} other {# selected}}", - "accountsCount": "{count, plural, one {# account} other {# accounts}}", - "testAllOAuth": "Pruebe todas las conexiones OAuth", - "testAllFree": "Pruebe todas las conexiones gratuitas", - "testAllApiKey": "Pruebe todas las conexiones de clave API", - "testAllCompatible": "Pruebe todas las conexiones compatibles", - "testAllModels": "Test all models", - "testAllModelsConfirm": "Test all visible models? Failed models will be hidden if auto-hide is enabled.", - "testingAllModels": "Testing {done}/{total}...", - "testAllResults": "{ok} of {total} models working", - "noModelsToTest": "No models match the current filter", - "showAllModels": "All", - "showVisibleOnly": "Visible only", - "freeFilterAll": "All", - "freeFilterFreeOnly": "Free only", - "freeFilterPaidOnly": "Paid only", - "sortFreeFirst": "Free first", - "showHiddenOnly": "Hidden only", - "filterByVisibility": "Filter by visibility", - "autoHideFailed": "Auto-hide failed models", - "autoHideFailedHint": "When enabled, Test all hides non-transient failures from public catalogs such as /v1/models. Single-model tests never auto-hide.", - "connected": "{count} Conectado", - "errorCount": "{count} Error ({code})", - "errorCountNoCode": "{count} Error", - "testAllCompleted": "Tested {total} models: {ok} OK, {failed} failed", - "modelAutoHidden": "Model {model} auto-hidden (test failed)", + "reorderByAvailabilityError": "Error al reordenar las conexiones por disponibilidad", + "distributeProxies": "Distribuir proxies", + "distributing": "Distribuyendo...", + "selectedCount": "{count, plural, one {# seleccionado} other {# seleccionados}}", + "accountsCount": "{count, plural, one {# cuenta} other {# cuentas}}", + "testAllOAuth": "Probar todas las conexiones OAuth", + "testAllFree": "Probar todas las conexiones gratuitas", + "testAllApiKey": "Probar todas las conexiones de clave de API", + "testAllCompatible": "Probar todas las conexiones compatibles", + "testAllModels": "Probar todos los modelos", + "testAllModelsConfirm": "¿Probar todos los modelos visibles? Los modelos con errores se ocultarán si la ocultación automática está activada.", + "testingAllModels": "Probando {done}/{total}...", + "testAllResults": "{ok} de {total} modelos funcionando", + "noModelsToTest": "Ningún modelo coincide con el filtro actual", + "showAllModels": "Todos", + "showVisibleOnly": "Solo visibles", + "freeFilterAll": "Todos", + "freeFilterFreeOnly": "Solo gratuitos", + "freeFilterPaidOnly": "Solo de pago", + "sortFreeFirst": "Gratuitos primero", + "showHiddenOnly": "Solo ocultos", + "filterByVisibility": "Filtrar por visibilidad", + "autoHideFailed": "Ocultar automáticamente modelos con errores", + "autoHideFailedHint": "Cuando está activado, Probar todos oculta los errores no transitorios de los catálogos públicos como /v1/models. Las pruebas de un solo modelo nunca se ocultan automáticamente.", + "connected": "{count} conectado", + "errorCount": "{count} error ({code})", + "errorCountNoCode": "{count} error", + "testAllCompleted": "Modelos probados {total}: {ok} correctos, {failed} con errores", + "modelAutoHidden": "Modelo {model} ocultado automáticamente (prueba fallida)", "filterAll": "Todos", - "filterVisible": "Visible only", - "filterHidden": "Hidden only", - "modelsHiddenCount": "{count} hidden", - "warningCount": "{count} Advertencia", + "filterVisible": "Solo visibles", + "filterHidden": "Solo ocultos", + "modelsHiddenCount": "{count} ocultos", + "warningCount": "{count} advertencia", "noConnections": "Sin conexiones", - "expiredBadge": "Expired", - "expiringSoonBadge": "Expiring Soon", + "expiredBadge": "Caducado", + "expiringSoonBadge": "Caduca pronto", "freeTier": "Nivel gratuito", "freeTierAvailable": "Nivel gratuito disponible", "hasFreeTooltip": "Nivel gratuito disponible", "noAuthLabel": "Sin autenticación", "noAuthProviders": "Proveedores sin autenticación", "upstreamProxyLabel": "Proxy superior", - "freeAggregated": "Todos los proveedores con nivel gratuito (también mostrados en su categoría nativa)", + "freeAggregated": "Todos los proveedores con nivel gratuito (también se muestran en su categoría nativa)", "deprecated": "En desuso", - "deprecatedProvider": "Este proveedor ha quedado obsoleto.", + "deprecatedProvider": "Este proveedor ha quedado obsoleto", "riskNotice": { - "title": "Before continuing", - "tooltip": "Provider with usage caveats — click for details", - "oauth": "This provider uses your official product session/OAuth, which is not authorized for proxy/router use. We don't recommend intensive autonomous agent usage (OpenCloud-style, long multi-step flows, large batches) — the upstream may react by restricting or banning the account. Use at your own risk.", - "webCookie": "This provider authenticates through your web session cookies. The upstream service may invalidate the session at any time, requiring you to log in again. Not recommended for long unattended operations. Use at your own risk.", - "deprecated": "This provider was discontinued by its upstream and may stop working without notice. Existing connections may continue working until the upstream fully removes access. Consider alternatives.", - "dontShowAgain": "Don't show this again for this provider", - "understand": "I understand, continue", - "cancel": "Cancel" + "title": "Antes de continuar", + "tooltip": "Proveedor con advertencias de uso; haz clic para ver los detalles", + "oauth": "Este proveedor utiliza tu sesión de producto oficial/OAuth, que no está autorizada para su uso con proxy/router. No recomendamos el uso intensivo de agentes autónomos (estilo OpenCloud, flujos largos de varios pasos, lotes grandes); el sistema superior puede reaccionar restringiendo o bloqueando la cuenta. Úsalo bajo tu propia responsabilidad.", + "webCookie": "Este proveedor se autentica mediante tus cookies de sesión web. El servicio superior puede invalidar la sesión en cualquier momento, lo que requerirá que vuelvas a iniciar sesión. No recomendado para operaciones largas sin supervisión. Úsalo bajo tu propia responsabilidad.", + "deprecated": "Este proveedor ha sido discontinuado por su proveedor superior y puede dejar de funcionar sin previo aviso. Las conexiones existentes pueden seguir funcionando hasta que el proveedor superior elimine por completo el acceso. Considera alternativas.", + "dontShowAgain": "No volver a mostrar esto para este proveedor", + "understand": "Entendido, continuar", + "cancel": "Cancelar" }, - "disabled": "Discapacitado", + "disabled": "Desactivado", "enableProvider": "Habilitar proveedor", "disableProvider": "Deshabilitar proveedor", "testResults": "Resultados de la prueba", - "noCompatibleYet": "Aún no se han agregado proveedores compatibles", - "compatibleHint": "Utilice los botones de arriba para agregar puntos finales compatibles con OpenAI o Anthropic", - "addOpenAICompatible": "Agregar compatibilidad con OpenAI", - "addAnthropicCompatible": "Añadir compatible antrópico", - "addNewProvider": "Agregar nuevo proveedor", - "backToProviders": "Volver a Proveedores", - "configureNewProvider": "Configure un nuevo proveedor de IA para usarlo con sus aplicaciones.", + "noCompatibleYet": "Aún no se han añadido proveedores compatibles", + "compatibleHint": "Usa los botones de arriba para añadir endpoints compatibles con OpenAI o Anthropic", + "addOpenAICompatible": "Añadir compatible con OpenAI", + "addAnthropicCompatible": "Añadir compatible con Anthropic", + "addNewProvider": "Añadir nuevo proveedor", + "backToProviders": "Volver a proveedores", + "configureNewProvider": "Configura un nuevo proveedor de IA para usarlo con tus aplicaciones.", "providerLabel": "Proveedor", - "selectProvider": "Seleccione un proveedor", + "selectProvider": "Selecciona un proveedor", "selectedProvider": "Proveedor seleccionado", "authMethod": "Método de autenticación", - "apiKeyLabel": "Clave API", - "apiKeyRequired": "Se requiere clave API", - "selectProviderRequired": "Por favor seleccione un proveedor", - "enterApiKey": "Ingrese su clave API", - "apiKeySecure": "Su clave API se cifrará y almacenará de forma segura.", - "oauth2Connect": "Conéctate con OAuth2", + "apiKeyLabel": "Clave de API", + "apiKeyRequired": "Se requiere una clave de API", + "selectProviderRequired": "Por favor, selecciona un proveedor", + "enterApiKey": "Introduce tu clave de API", + "apiKeySecure": "Tu clave de API se cifrará y almacenará de forma segura.", + "oauth2Connect": "Conectar con OAuth2", "oauth2Label": "OAuth2", - "oauth2Desc": "Conecte su cuenta mediante la autenticación OAuth2.", + "oauth2Desc": "Conecta tu cuenta mediante la autenticación OAuth2.", "displayName": "Nombre para mostrar", - "displayNamePlaceholder": "por ejemplo, API de producción, entorno de desarrollo", + "displayNamePlaceholder": "p. ej., API de producción, entorno de desarrollo", "displayNameHint": "Opcional. Un nombre descriptivo para identificar esta configuración.", "active": "Activo", - "activeDescription": "Habilite este proveedor para usarlo en sus aplicaciones", + "activeDescription": "Habilita este proveedor para usarlo en tus aplicaciones", "cancel": "Cancelar", "createProvider": "Crear proveedor", "failedCreate": "No se pudo crear el proveedor", - "errorOccurred": "Se produjo un error. Por favor inténtalo de nuevo.", + "errorOccurred": "Se ha producido un error. Por favor, inténtalo de nuevo.", "modelStatus": "Estado del modelo", - "showConfiguredOnly": "Configured only", - "allModelsOperational": "Todos los modelos operativos.", + "showConfiguredOnly": "Solo configurados", + "allModelsOperational": "Todos los modelos operativos", "modelsWithIssues": "{count} modelo(s) con problemas", "allModelsNormal": "Todos los modelos están respondiendo normalmente.", - "cooldownCleared": "Tiempo de reutilización borrado para {model}", - "failedClearCooldown": "No se pudo borrar el tiempo de reutilización", + "cooldownCleared": "Tiempo de espera restablecido para {model}", + "failedClearCooldown": "No se pudo restablecer el tiempo de espera", "loadingAvailability": "Cargando disponibilidad de modelos...", "clearCooldown": "Borrar", - "clearing": "Limpiando...", - "until": "Hasta {time}", - "providerTestFailed": "La prueba del proveedor falló", - "providerTestTimeout": "Provider test timed out — too many connections to test at once", - "modeTest": "{mode} Prueba", - "passedCount": "{count} pasó", - "failedCount": "{count} falló", - "testedCount": "{count} probado", - "millisecondsAbbr": "{value}ms", - "okShort": "bien", + "clearing": "Borrando...", + "until": "Hasta las {time}", + "providerTestFailed": "La prueba del proveedor ha fallado", + "providerTestTimeout": "La prueba del proveedor ha agotado el tiempo de espera; hay demasiadas conexiones para probar a la vez", + "modeTest": "Prueba de {mode}", + "passedCount": "{count} superadas", + "failedCount": "{count} fallidas", + "testedCount": "{count} probadas", + "millisecondsAbbr": "{value} ms", + "okShort": "OK", "errorShort": "ERROR", - "noActiveConnectionsInGroup": "No se encontraron conexiones activas para este grupo.", - "allTestsPassed": "Todas las pruebas {total} pasaron", - "testSummary": "{passed}/{total} pasó, {failed} falló", + "noActiveConnectionsInGroup": "No se han encontrado conexiones activas para este grupo.", + "allTestsPassed": "Las {total} pruebas se han superado con éxito", + "testSummary": "{passed}/{total} superadas, {failed} fallidas", "nameLabel": "Nombre", "prefixLabel": "Prefijo", - "baseUrlLabel": "URL básica", + "baseUrlLabel": "URL base", "apiTypeLabel": "Tipo de API", - "prefixHint": "Requerido. Prefijo único para nombres de modelos.", - "nameHint": "Requerido. Una etiqueta amigable para este nodo.", - "baseUrlHint": "Requerido. URL base de la API del proveedor.", - "iconUrlLabel": "Icon URL", - "iconUrlHint": "Optional. Image URL shown as this provider's icon.", - "anthropicPrefixPlaceholder": "producto ac", + "prefixHint": "Obligatorio. Prefijo único para los nombres de los modelos.", + "nameHint": "Obligatorio. Una etiqueta descriptiva para este nodo.", + "baseUrlHint": "Obligatorio. URL base de la API del proveedor.", + "iconUrlLabel": "URL del icono", + "iconUrlHint": "Opcional. URL de la imagen que se muestra como icono de este proveedor.", + "anthropicPrefixPlaceholder": "ac-prod", "openaiPrefixPlaceholder": "oc-prod", "anthropicBaseUrlPlaceholder": "https://api.anthropic.com/v1", "openaiBaseUrlPlaceholder": "https://api.openai.com/v1", "validateConnection": "Validar conexión", "validating": "Validando...", "connectionValid": "¡La conexión es válida!", - "connectionFailed": "La conexión falló. Verifique la URL y la clave.", - "testKeyLabel": "Clave API de prueba", + "connectionFailed": "La conexión ha fallado. Comprueba la URL y la clave.", + "testKeyLabel": "Clave de API de prueba", "testKeyPlaceholder": "sk-... (solo para validación)", "providerNotFound": "Proveedor no encontrado", "deleteConnectionConfirm": "¿Eliminar esta conexión?", - "deleteConnectionConfirmNamed": "¿Estás seguro de que deseas eliminar {name}? Esta acción no se puede deshacer.", - "batchDeleteSelected": "Delete Selected ({count})", - "batchDeleteConfirm": "Delete {count} connection(s)? This action cannot be undone.", - "batchDeleteSuccess": "Deleted {count} connection(s)", - "batchActivateSelected": "Activate", - "batchDeactivateSelected": "Deactivate", - "batchRetestSelected": "Retest", - "batchActivateSuccess": "Activated {count} connection(s)", - "batchDeactivateSuccess": "Deactivated {count} connection(s)", - "batchUpdatePartial": "{count} updated, {skipped} skipped (no longer exist)", - "batchUpdateNone": "No connections were updated (they may no longer exist)", - "batchRetestLimit": "Retest up to {max} connections at a time", - "noConnectionsToTest": "No matching connections to test", - "batchDeleteConfirmTitle": "Delete connections", - "batchDeleteConfirmButton": "Delete", + "deleteConnectionConfirmNamed": "¿Seguro que quieres eliminar {name}? Esta acción no se puede deshacer.", + "batchDeleteSelected": "Eliminar seleccionadas ({count})", + "batchDeleteConfirm": "¿Eliminar {count} conexión(es)? Esta acción no se puede deshacer.", + "batchDeleteSuccess": "{count} conexión(es) eliminada(s)", + "batchActivateSelected": "Activar", + "batchDeactivateSelected": "Desactivar", + "batchRetestSelected": "Volver a probar", + "batchActivateSuccess": "{count} conexión(es) activada(s)", + "batchDeactivateSuccess": "{count} conexión(es) desactivada(s)", + "batchUpdatePartial": "{count} actualizadas, {skipped} omitidas (ya no existen)", + "batchUpdateNone": "No se ha actualizado ninguna conexión (es posible que ya no existan)", + "batchRetestLimit": "Volver a probar hasta {max} conexiones a la vez", + "noConnectionsToTest": "No hay conexiones coincidentes para probar", + "batchDeleteConfirmTitle": "Eliminar conexiones", + "batchDeleteConfirmButton": "Eliminar", "filterActive": "Activo", "filterError": "Error", "filterBanned": "Bloqueado", "filterCreditsExhausted": "Créditos agotados", - "accountSearchPlaceholder": "Search accounts…", - "noFilteredConnections": "No connections match the current filter.", + "accountSearchPlaceholder": "Buscar cuentas...", + "noFilteredConnections": "Ninguna conexión coincide con el filtro actual.", "failedSetAlias": "No se pudo establecer el alias", - "setAliasSuccess": "Alias {alias} set", - "deleteAliasSuccess": "Alias {alias} deleted", + "setAliasSuccess": "Alias {alias} establecido", + "deleteAliasSuccess": "Alias {alias} eliminado", "failedSaveConnection": "No se pudo guardar la conexión", - "failedSaveConnectionRetry": "No se pudo guardar la conexión. Por favor inténtalo de nuevo.", + "failedSaveConnectionRetry": "No se pudo guardar la conexión. Por favor, inténtalo de nuevo.", "failedRetestConnection": "No se pudo volver a probar la conexión", - "deleteCompatibleNodeConfirm": "¿Eliminar este {type} nodo compatible?", - "anthropicCompatibleDetails": "Detalles compatibles antrópicos", + "deleteCompatibleNodeConfirm": "¿Eliminar este nodo compatible con {type}?", + "anthropicCompatibleDetails": "Detalles compatibles con Anthropic", "openaiCompatibleDetails": "Detalles compatibles con OpenAI", "messagesApi": "API de mensajes", "responsesApi": "API de respuestas", "embeddings": "Embeddings", - "audioTranscriptions": "Audio Transcriptions", - "audioSpeech": "Audio Speech", - "imagesGenerations": "Images Generations", - "chatCompletions": "Finalizaciones de chat", + "audioTranscriptions": "Transcripciones de audio", + "audioSpeech": "Audio a voz", + "imagesGenerations": "Generación de imágenes", + "chatCompletions": "Chat Completions", "importingModels": "Importando...", - "importFromModels": "Importar desde /modelos", - "modelsImported": "{count} models imported", + "importFromModels": "Importar desde /models", + "modelsImported": "{count} modelos importados", "allModelsAlreadyImported": "Todos los modelos ya están importados", - "noNewModelsToImport": "No hay modelos nuevos para importar — todos los modelos ya están en el registro o en la lista de modelos personalizados", + "noNewModelsToImport": "No hay modelos nuevos para importar; todos los modelos ya están en el registro o en la lista de modelos personalizados", "skippingExistingModels": "Omitiendo {count} modelos existentes", "autoSync": "Sincronización automática", "autoSyncShort": "Sincronizar", - "autoSyncTooltip": "Actualiza automáticamente la lista de modelos cada 24 horas (configurable vía MODEL_SYNC_INTERVAL_HOURS)", - "autoSyncEnabled": "Sincronización automática activada — los modelos se actualizarán periódicamente", + "autoSyncTooltip": "Actualizar automáticamente la lista de modelos cada 24 horas (configurable mediante MODEL_SYNC_INTERVAL_HOURS)", + "autoSyncEnabled": "Sincronización automática activada; los modelos se actualizarán periódicamente", "autoSyncDisabled": "Sincronización automática desactivada", - "autoSyncToggleFailed": "Error al alternar sincronización automática", + "autoSyncToggleFailed": "No se pudo cambiar el estado de la sincronización automática", "autoSyncPartialFailure": "Sincronización automática actualizada para algunas conexiones, pero no todas", "clearAllModels": "Borrar todos los modelos", - "clearAllModelsConfirm": "¿Estás seguro de que quieres eliminar todos los modelos de este proveedor?", + "clearAllModelsConfirm": "¿Seguro que quieres eliminar todos los modelos de este proveedor? Esta acción no se puede deshacer.", "clearAllModelsSuccess": "Todos los modelos borrados", - "clearAllModelsFailed": "Error al borrar modelos", - "addConnectionToImport": "Agregue una conexión para permitir la importación.", + "clearAllModelsFailed": "No se pudieron borrar los modelos", + "addConnectionToImport": "Añade una conexión para habilitar la importación.", "noModelsConfigured": "No hay modelos configurados", "connectionCount": "{count} conexión(es)", - "fetchingModels": "Recuperando modelos disponibles...", - "failedFetchModels": "No se pudieron recuperar los modelos", - "noFreeModelsFound": "No free models found for this provider — nothing imported.", - "fetchModelsSuccess": "Found {count} new models", - "fetchModelsFailed": "Could not auto-fetch models (you can retry from settings)", - "noModelsFound": "No se encontraron modelos", - "importFailed": "Importación fallida", - "noNewModelsAdded": "No se agregaron nuevos modelos.", - "adding": "Añadiendo...", - "close": "Close", - "importingModelsTitle": "Importar modelos", + "fetchingModels": "Obteniendo los modelos disponibles...", + "failedFetchModels": "Error al obtener los modelos", + "noFreeModelsFound": "No se han encontrado modelos gratuitos para este proveedor; no se ha importado nada.", + "fetchModelsSuccess": "Se han encontrado {count} modelos nuevos", + "fetchModelsFailed": "No se han podido obtener los modelos automáticamente (puedes reintentarlo desde los ajustes)", + "noModelsFound": "No se han encontrado modelos", + "importFailed": "Error al importar", + "noNewModelsAdded": "No se ha añadido ningún modelo nuevo.", + "adding": "Añadiendo…", + "close": "Cerrar", + "importingModelsTitle": "Importando modelos", "copyModel": "Copiar modelo", "filterModels": "Filtrar modelos…", - "testAllRateLimited": "Rate limit reached, stopped early", - "hideFailedAuto": "Auto-hide failed models", - "selectAllModels": "Select all", - "hideAllModels": "Hide all", - "modelsActive": "activos", + "testAllRateLimited": "Se ha alcanzado el rate limit, el proceso se ha detenido antes de tiempo", + "hideFailedAuto": "Ocultar automáticamente modelos fallidos", + "selectAllModels": "Seleccionar todo", + "hideAllModels": "Ocultar todo", + "modelsActive": "Activos", "showModel": "Mostrar modelo", "hideModel": "Ocultar modelo", - "removeModel": "Quitar modelo", + "removeModel": "Eliminar modelo", "rateLimitProtected": "Protegido", "rateLimitUnprotected": "Desprotegido", - "providerQuotaShort": "Quota", - "hideConnectionFromProviderQuota": "Hide this account from Provider Quota", - "showConnectionInProviderQuota": "Show this account in Provider Quota", - "quotaVisibilityUpdateFailed": "Failed to update Provider Quota visibility", - "enableRateLimitProtection": "Haga clic para habilitar la protección del límite de velocidad", - "disableRateLimitProtection": "Haga clic para desactivar la protección del límite de velocidad", - "testAllProgress": "Tested {done}/{total}", - "testAllFailedHidden": "{count} failed models hidden", - "testAllDone": "All models tested", + "providerQuotaShort": "Cuota", + "hideConnectionFromProviderQuota": "Ocultar esta cuenta en la cuota del proveedor", + "showConnectionInProviderQuota": "Mostrar esta cuenta en la cuota del proveedor", + "quotaVisibilityUpdateFailed": "Error al actualizar la visibilidad de la cuota del proveedor", + "enableRateLimitProtection": "Haz clic para activar la protección de rate limit", + "disableRateLimitProtection": "Haz clic para desactivar la protección de rate limit", + "testAllProgress": "Comprobados {done}/{total}", + "testAllFailedHidden": "{count} modelos fallidos ocultos", + "testAllDone": "Todos los modelos comprobados", "productionKey": "Clave de producción", - "enterNewApiKey": "Ingrese la nueva clave API", - "codexApplyModalTitle": "Aplicar al códice local", + "enterNewApiKey": "Introduce la nueva clave de API", + "codexApplyModalTitle": "Aplicar a Codex local", "codexApplyTargetLabel": "Ruta de destino", "codexApplyBackupLabel": "Copias de seguridad", - "codexApplyWarning": "Esto reemplazará el auth.json existente. ¿Continuar?", - "codexApplyConfirmCheckbox": "Confirmo que quiero reemplazar el auth.json existente", + "codexApplyWarning": "Esto reemplazará el archivo auth.json existente. ¿Continuar?", + "codexApplyConfirmCheckbox": "Confirmo que quiero reemplazar el archivo auth.json existente", "codexApply": "Aplicar", - "bulkTabSingle": "soltero", - "bulkTabBulkAdd": "Agregar en masa", - "bulkAddFormatHint": "Una clave por línea. Formato: nombre|apiKey o simplemente apiKey (nombrado automáticamente por índice).", + "bulkTabSingle": "Individual", + "bulkTabBulkAdd": "Añadir en lote", + "bulkAddFormatHint": "Una clave por línea. Formato: nombre|apiKey o solo apiKey (nombrada automáticamente según el índice).", "bulkValidateKeys": "Validar cada clave antes de guardar (más lento)", - "bulkAddAllKeys": "Agregar todas las claves", - "bulkAddedCount": "{count, plural, one {# key added} other {# keys added}}", - "bulkFailedCount": "{count, plural, one {# failed} other {# failed}}", + "bulkAddAllKeys": "Añadir todas las claves", + "bulkAddedCount": "{count, plural, one {# clave añadida} other {# claves añadidas}}", + "bulkFailedCount": "{count, plural, one {# fallida} other {# fallidas}}", "optional": "Opcional", - "anthropicCompatibleName": "Compatible antrópico", + "anthropicCompatibleName": "Compatible con Anthropic", "openaiCompatibleName": "Compatible con OpenAI", - "compatibleDefaultModelLabel": "Default Model", - "compatibleDefaultModelHint": "Enter the model ID exactly as your compatible endpoint expects it. This model will be saved as the connection default.", - "failedImportModels": "No se pudieron importar modelos", - "noModelsReturnedFromEndpoint": "No se devolvieron modelos desde el punto final /models.", - "importingModelsProgress": "Importando {current} de {total} modelos...", - "foundModelsStartingImport": "Se encontraron {count} modelos. Iniciando importación...", - "importingModelById": "Importando {modelId}...", - "importSuccessCount": "¡Importado exitosamente {count, plural, one {# model} other {# models}}!", - "noNewModelsAddedExisting": "No se agregaron nuevos modelos (todos ya existen).", - "importDoneCount": "✓ ¡Listo! {count, plural, one {# model imported.} other {# models imported.}}", - "unexpectedErrorOccurred": "Ocurrió un error inesperado", - "connectionCountLabel": "{count, plural, one {# connection} other {# connections}}", - "messagesPath": "mensajes", - "responsesPath": "respuestas", - "chatCompletionsPath": "chat/finalizaciones", + "compatibleDefaultModelLabel": "Modelo predeterminado", + "compatibleDefaultModelHint": "Introduce el ID del modelo exactamente como lo espera tu endpoint compatible. Este modelo se guardará como predeterminado para la conexión.", + "failedImportModels": "Error al importar modelos", + "noModelsReturnedFromEndpoint": "El endpoint /models no ha devuelto ningún modelo.", + "importingModelsProgress": "Importando {current} de {total} modelos…", + "foundModelsStartingImport": "Se han encontrado {count} modelos. Iniciando importación…", + "importingModelById": "Importando {modelId}…", + "importSuccessCount": "¡{count, plural, one {# modelo importado} other {# modelos importados}} correctamente!", + "noNewModelsAddedExisting": "No se ha añadido ningún modelo nuevo (todos ya existen).", + "importDoneCount": "✓ ¡Listo! {count, plural, one {# modelo importado.} other {# modelos importados.}}", + "unexpectedErrorOccurred": "Ha ocurrido un error inesperado", + "connectionCountLabel": "{count, plural, one {# conexión} other {# conexiones}}", + "messagesPath": "messages", + "responsesPath": "responses", + "chatCompletionsPath": "chat/completions", "add": "Añadir", "edit": "Editar", "delete": "Eliminar", - "anthropic": "antrópico", - "openai": "AbiertoAI", - "singleConnectionPerCompatible": "Sólo se permite una conexión por nodo compatible. Agregue otro nodo si necesita más conexiones.", + "anthropic": "Anthropic", + "openai": "OpenAI", + "singleConnectionPerCompatible": "Solo se permite una conexión por nodo compatible. Añade otro nodo si necesitas más conexiones.", "connections": "Conexiones", "providerProxyTitleConfigured": "Proxy del proveedor: {host}", "configured": "configurado", - "providerProxyConfigureHint": "Configurar proxy para todas las conexiones de este proveedor", + "providerProxyConfigureHint": "Configurar el proxy para todas las conexiones de este proveedor", "providerProxy": "Proxy del proveedor", "repairEnv": "Reparar .env", - "repairEnvWorking": "Reparando...", - "repairEnvHint": "Restaura en .env las variables OAuth predeterminadas que faltan sin sobrescribir los valores existentes.", - "repairEnvSuccess": "Valores OAuth predeterminados restaurados", - "repairEnvFailed": "No se pudo reparar .env", + "repairEnvWorking": "Reparando…", + "repairEnvHint": "Restaura en el archivo .env los valores predeterminados de OAuth que falten sin sobrescribir los existentes.", + "repairEnvSuccess": "Valores predeterminados de OAuth restaurados", + "repairEnvFailed": "Error al reparar .env", "noConnectionsYet": "Aún no hay conexiones", - "addFirstConnectionHint": "Agregue su primera conexión para comenzar", - "addConnection": "Agregar conexión", + "addFirstConnectionHint": "Añade tu primera conexión para empezar", + "addConnection": "Añadir conexión", "availableModels": "Modelos disponibles", - "builtInModels": "Built-in models", - "builtInModelsHint": "Registry models for this provider. Use the pencil to set compatibility options.", - "pageAutoRefresh": "La página se actualizará automáticamente...", - "statusDisabled": "discapacitado", + "builtInModels": "Modelos integrados", + "builtInModelsHint": "Modelos del registro para este proveedor. Usa el lápiz para configurar las opciones de compatibilidad.", + "pageAutoRefresh": "La página se actualizará automáticamente…", + "statusDisabled": "desactivado", "statusConnected": "conectado", - "statusRuntimeIssue": "problema de tiempo de ejecución", - "statusAuthFailed": "autenticación fallida", - "statusRateLimited": "tarifa limitada", + "statusRuntimeIssue": "problema en tiempo de ejecución", + "statusAuthFailed": "fallo de autenticación", + "statusRateLimited": "rate limit alcanzado", "statusNetworkIssue": "problema de red", "statusTestUnsupported": "prueba no compatible", "statusUnavailable": "no disponible", "statusFailed": "falló", "statusError": "error", - "oauthAccount": "Cuenta OAuth", + "oauthAccount": "Cuenta de OAuth", "errorTypeRuntime": "Tiempo de ejecución local", - "errorTypeUpstreamAuth": "autenticación ascendente", - "errorTypeMissingCredential": "credencial faltante", + "errorTypeUpstreamAuth": "Autenticación upstream", + "errorTypeMissingCredential": "Credencial faltante", "errorTypeRefreshFailed": "Error al actualizar", "errorTypeTokenExpired": "Token caducado", - "errorTypeRateLimited": "Tarifa limitada", + "errorTypeRateLimited": "Rate limit alcanzado", "errorTypeUpstreamUnavailable": "Upstream no disponible", - "errorTypeNetworkError": "error de red", + "errorTypeNetworkError": "Error de red", "errorTypeTestUnsupported": "Prueba no compatible", - "errorTypeUpstreamError": "Error ascendente", - "errorTypeCreditsExhausted": "No credits", - "errorTypeBanned": "403 Banned", - "proxySourceGlobal": "Mundial", + "errorTypeUpstreamError": "Error en upstream", + "errorTypeCreditsExhausted": "Sin créditos", + "errorTypeBanned": "Bloqueado (403)", + "proxySourceGlobal": "Global", "proxySourceProvider": "Proveedor", - "proxySourceKey": "clave", + "proxySourceKey": "Clave", "proxyConfiguredBySource": "Proxy ({source}): {host}", - "proxyOn": "Proxy On", - "proxyOff": "Direct (bypass proxy)", - "proxyEnabledTitle": "Proxy is enabled for this connection", - "proxyDisabledTitle": "Direct connection — bypasses every proxy (including the global proxy) for this connection", - "perKeyProxyOn": "Per-key", - "perKeyProxyOff": "Connection", - "perKeyProxyEnabledTitle": "Per-key proxy assignment enabled for this provider", - "perKeyProxyDisabledTitle": "Per-key proxy assignment disabled for this provider", + "proxyOn": "Proxy activado", + "proxyOff": "Directo (omitir proxy)", + "proxyEnabledTitle": "El proxy está activado para esta conexión", + "proxyDisabledTitle": "Conexión directa: omite todos los proxies (incluido el proxy global) para esta conexión", + "perKeyProxyOn": "Por clave", + "perKeyProxyOff": "Conexión", + "perKeyProxyEnabledTitle": "Asignación de proxy por clave activada para este proveedor", + "perKeyProxyDisabledTitle": "Asignación de proxy por clave desactivada para este proveedor", "autoPriority": "Automático: {priority}", - "proxy": "apoderado", - "retestAuthentication": "Volver a probar la autenticación", + "proxy": "Proxy", + "retestAuthentication": "Volver a probar autenticación", "retest": "Volver a probar", "disableConnection": "Desactivar conexión", - "enableConnection": "Habilitar conexión", + "enableConnection": "Activar conexión", "reauthenticateConnection": "Volver a autenticar esta conexión", "proxyConfig": "Configuración de proxy", - "aliasExistsAlert": "El alias \"{alias}\" ya existe. Utilice un modelo diferente o edite el alias existente.", - "aliasInputPlaceholder": "alias name", - "clickToSetAlias": "Click to set alias", - "clickToEditAlias": "Alias: {alias} (click to edit)", - "openRouterAnyModelHint": "OpenRouter admite cualquier modelo. Agregue modelos y cree alias para un acceso rápido.", + "aliasExistsAlert": "El alias «{alias}» ya existe. Usa un modelo diferente o edita el alias existente.", + "aliasInputPlaceholder": "nombre del alias", + "clickToSetAlias": "Haz clic para definir el alias", + "clickToEditAlias": "Alias: {alias} (haz clic para editar)", + "openRouterAnyModelHint": "OpenRouter es compatible con cualquier modelo. Añade modelos y crea alias para un acceso rápido.", "modelIdFromOpenRouter": "ID del modelo (de OpenRouter)", - "openRouterModelPlaceholder": "antrópico/claude-3-opus", + "openRouterModelPlaceholder": "anthropic/claude-3-opus", "customModels": "Modelos personalizados", - "customModelsHint": "Agregue ID de modelo que no estén en la lista predeterminada. Estos estarán disponibles para enrutamiento.", - "normalizeToolCallIdLabel": "Normalize tool call IDs to 9 characters (e.g. Mistral)", - "preserveDeveloperRoleLabel": "Keep OpenAI Responses developer role (do not map to system)", - "compatAdjustmentsTitle": "Compatibility", - "compatButtonLabel": "Compatibility", - "compatToolIdShort": "Tool ID 9", - "compatDeveloperShort": "Developer role", - "compatDoNotPreserveDeveloper": "Do not preserve developer role", - "compatBadgeNoPreserve": "No preserve", - "compatProtocolLabel": "Client request protocol", - "compatProtocolHint": "These options apply when OmniRoute detects this request shape (OpenAI Chat, Responses API, or Anthropic Messages).", + "customModelsHint": "Añade ID de modelos que no estén en la lista predeterminada. Estarán disponibles para el enrutamiento.", + "normalizeToolCallIdLabel": "Normalizar ID de llamadas a herramientas a 9 caracteres (p. ej., Mistral)", + "preserveDeveloperRoleLabel": "Mantener el rol developer de OpenAI Responses (no mapear a system)", + "compatAdjustmentsTitle": "Compatibilidad", + "compatButtonLabel": "Compatibilidad", + "compatToolIdShort": "ID de herramienta 9", + "compatDeveloperShort": "Rol developer", + "compatDoNotPreserveDeveloper": "No conservar el rol developer", + "compatBadgeNoPreserve": "Sin conservar", + "compatProtocolLabel": "Protocolo de solicitud del cliente", + "compatProtocolHint": "Estas opciones se aplican cuando OmniRoute detecta la estructura de esta solicitud (OpenAI Chat, Responses API o Anthropic Messages).", "compatProtocolOpenAI": "OpenAI Chat Completions", "compatProtocolOpenAIResponses": "OpenAI Responses API", "compatProtocolClaude": "Anthropic Messages", - "targetFormatLabel": "Target Format", - "targetFormatHint": "Override the upstream wire format. Use 'Anthropic Messages' to route OpenAI-compatible providers (e.g. opencode-go) through the /v1/messages endpoint.", - "targetFormatAuto": "Default (auto)", + "targetFormatLabel": "Formato de destino", + "targetFormatHint": "Anular el formato de transferencia en upstream. Usa 'Anthropic Messages' para enrutar proveedores compatibles con OpenAI (p. ej., opencode-go) a través del endpoint /v1/messages.", + "targetFormatAuto": "Predeterminado (auto)", "targetFormatGemini": "Gemini", "targetFormatAntigravity": "Antigravity", - "contextWindowOverrideLabel": "Context Window Override", - "contextWindowOverridePlaceholder": "e.g. 131072", - "contextWindowOverrideHint": "Manually set this model's real context window (tokens) when the provider misreports it. Wins over auto-detected/catalog values and prevents combo routing from dropping the model.", - "contextWindowOverrideInvalid": "Context window override must be a positive whole number of tokens", - "visionCapableLabel": "Vision capable", - "visionCapableHint": "Manually flag this model as vision-capable when the provider's discovery metadata doesn't report an image input modality (common for self-hosted/local backends).", - "compatParamFiltersLabel": "Param Filters", - "compatBlockedParamsHint": "Blocked params (stripped from requests)", - "compatAllowedParamsHint": "Allowed params (re-added after deny)", - "paramFiltersSectionTitle": "Param Filters", - "paramFiltersSectionHint": "Strip or re-add request parameters before sending to this provider. Used to avoid 400 errors from providers that reject certain params (e.g. NVIDIA NIM rejects thinking).", - "paramFiltersBlockedLabel": "Blocked parameters", - "paramFiltersBlockedHint": "These params are stripped from outgoing requests (denylist).", - "paramFiltersAllowedLabel": "Allowed parameters", - "paramFiltersAllowedHint": "These params are re-added after denylist stripping (only if the client sent them).", - "paramFiltersAutoLearnLabel": "Auto-learn from 400 errors", - "paramFiltersAutoLearnHint": "When enabled, if the upstream returns a 400 with \"Unsupported parameter: X\", the param is automatically added to the block list and the request retried.", - "paramFiltersSaving": "Saving…", - "paramFiltersSaveChanges": "Save Changes", - "paramFiltersResetToDefault": "Reset to Default", - "paramFiltersLoadError": "Failed to load param filter config: {error}", - "paramFiltersSaveSuccess": "Param filter config saved", - "paramFiltersSaveError": "Failed to save param filter config: {error}", - "paramFiltersResetSuccess": "Param filter config reset to defaults", - "paramFiltersResetError": "Failed to reset param filter config: {error}", - "interceptionSectionTitle": "Web Tool Interception", - "interceptionSectionHint": "Route this provider's native web_search / web_fetch tool calls through OmniRoute's own search and fetch endpoints instead of letting the provider run them natively. Off by default — existing behavior is unchanged.", - "interceptSearchLabel": "Intercept web_search", - "interceptSearchHint": "Rewrite native web_search tool calls to OmniRoute's /v1/search.", - "interceptFetchLabel": "Intercept web_fetch", - "interceptFetchHint": "Rewrite native web_fetch tool calls to OmniRoute's /v1/web/fetch.", - "interceptionLoadError": "Failed to load interception settings: {error}", - "interceptionSaveError": "Failed to save interception settings: {error}", - "compatUpstreamHeadersLabel": "Extra upstream headers", - "compatUpstreamHeadersHint": "High-privilege setting — same trust level as editing provider API credentials; only trusted admins should use it. Merged after OmniRoute adds auth from the provider API key. If a custom header uses the same name as an existing one (e.g. Authorization), your value fully replaces the auto-generated header (including the Bearer token) — the upstream only sees what you typed, not the key from settings. Misconfiguration can cause 401 or broken upstream auth. One row per header (e.g. extra Authentication for some gateways). Hover or focus the value to preview. Saves on blur, outside click, or closing this panel.", - "compatUpstreamHeaderName": "Header name", - "compatUpstreamHeaderValue": "Value", - "compatUpstreamAddRow": "Add header", - "compatUpstreamRemoveRow": "Remove row", - "compatBadgeUpstreamHeaders": "Headers", - "perModelQuotaLabel": "Per Model Quota Label", - "perModelQuotaDescription": "Per Model Quota Description", - "importFreeModelsOnlyLabel": "Import only free models", - "importFreeModelsOnlyHint": "When enabled, only this provider's free models are imported. Paid models are skipped.", + "contextWindowOverrideLabel": "Anulación de la ventana de contexto", + "contextWindowOverridePlaceholder": "p. ej., 131072", + "contextWindowOverrideHint": "Define manualmente la ventana de contexto real de este modelo (tokens) si el proveedor la notifica de forma incorrecta. Tiene prioridad sobre los valores detectados automáticamente o del catálogo y evita que el enrutamiento combinado descarte el modelo.", + "contextWindowOverrideInvalid": "La anulación de la ventana de contexto debe ser un número entero positivo de tokens", + "visionCapableLabel": "Capacidad de visión", + "visionCapableHint": "Marca manualmente este modelo con capacidad de visión cuando los metadatos de detección del proveedor no devuelvan la modalidad de entrada por imagen (habitual en entornos locales o autohospedados).", + "compatParamFiltersLabel": "Filtros de parámetros", + "compatBlockedParamsHint": "Parámetros bloqueados (eliminados de las solicitudes)", + "compatAllowedParamsHint": "Parámetros permitidos (reañadidos tras la denegación)", + "paramFiltersSectionTitle": "Filtros de parámetros", + "paramFiltersSectionHint": "Elimina o reañade parámetros de solicitud antes de enviarla a este proveedor. Sirve para evitar errores 400 de proveedores que rechazan ciertos parámetros (p. ej., NVIDIA NIM rechaza thinking).", + "paramFiltersBlockedLabel": "Parámetros bloqueados", + "paramFiltersBlockedHint": "Estos parámetros se eliminan de las solicitudes salientes (lista negra).", + "paramFiltersAllowedLabel": "Parámetros permitidos", + "paramFiltersAllowedHint": "Estos parámetros se reañaden tras aplicar la lista negra (solo si el cliente los envió).", + "paramFiltersAutoLearnLabel": "Aprendizaje automático a partir de errores 400", + "paramFiltersAutoLearnHint": "Cuando se activa, si el upstream devuelve un error 400 con «Unsupported parameter: X», el parámetro se añade automáticamente a la lista de bloqueados y se reintenta la solicitud.", + "paramFiltersSaving": "Guardando…", + "paramFiltersSaveChanges": "Guardar cambios", + "paramFiltersResetToDefault": "Restablecer a valores predeterminados", + "paramFiltersLoadError": "Error al cargar la configuración de los filtros de parámetros: {error}", + "paramFiltersSaveSuccess": "Configuración de los filtros de parámetros guardada", + "paramFiltersSaveError": "Error al guardar la configuración de los filtros de parámetros: {error}", + "paramFiltersResetSuccess": "Configuración del filtro de parámetros restablecida a los valores predeterminados", + "paramFiltersResetError": "No se pudo restablecer la configuración del filtro de parámetros: {error}", + "interceptionSectionTitle": "Intercepción de herramientas web", + "interceptionSectionHint": "Enruta las llamadas a las herramientas nativas web_search / web_fetch de este proveedor a través de los endpoints de búsqueda y obtención propios de OmniRoute, en lugar de dejar que el proveedor las ejecute de forma nativa. Desactivado por defecto; el comportamiento existente no cambia.", + "interceptSearchLabel": "Interceptar web_search", + "interceptSearchHint": "Reescribir las llamadas a la herramienta nativa web_search a /v1/search de OmniRoute.", + "interceptFetchLabel": "Interceptar web_fetch", + "interceptFetchHint": "Reescribir las llamadas a la herramienta nativa web_fetch a /v1/web/fetch de OmniRoute.", + "interceptionLoadError": "No se pudieron cargar los ajustes de intercepción: {error}", + "interceptionSaveError": "No se pudieron guardar los ajustes de intercepción: {error}", + "compatUpstreamHeadersLabel": "Cabeceras upstream adicionales", + "compatUpstreamHeadersHint": "Ajuste de privilegios elevados: mismo nivel de confianza que editar las credenciales de la API del proveedor; solo deben usarlo administradores de confianza. Se fusiona después de que OmniRoute añada la autenticación de la clave de API del proveedor. Si una cabecera personalizada usa el mismo nombre que una existente (p. ej., Authorization), tu valor reemplaza completamente la cabecera autogenerada (incluido el token Bearer); el upstream solo ve lo que escribiste, no la clave de los ajustes. Una configuración incorrecta puede causar errores 401 o romper la autenticación upstream. Una fila por cabecera (p. ej., Authentication adicional para algunas pasarelas). Pasa el ratón o enfoca el valor para previsualizar. Se guarda al perder el foco, hacer clic fuera o cerrar este panel.", + "compatUpstreamHeaderName": "Nombre de la cabecera", + "compatUpstreamHeaderValue": "Valor", + "compatUpstreamAddRow": "Añadir cabecera", + "compatUpstreamRemoveRow": "Eliminar fila", + "compatBadgeUpstreamHeaders": "Cabeceras", + "perModelQuotaLabel": "Cuota por modelo", + "perModelQuotaDescription": "Cuando está activado, los errores 429/404 solo bloquean el modelo específico, no toda la conexión. Úsalo para proveedores con rate limits por modelo (p. ej., ModelScope).", + "importFreeModelsOnlyLabel": "Importar solo modelos gratuitos", + "importFreeModelsOnlyHint": "Cuando está activado, solo se importan los modelos gratuitos de este proveedor. Los modelos de pago se omiten.", "perModelQuotaToggle": "Alternar cuota por modelo", "modelId": "ID del modelo", - "customModelPlaceholder": "por ej. gpt-4.5-turbo", + "customModelPlaceholder": "p. ej. gpt-4.5-turbo", "loading": "Cargando...", "removeCustomModel": "Eliminar modelo personalizado", - "noCustomModels": "Aún no se han agregado modelos personalizados.", - "allSuggestedAliasesExist": "Todos los alias sugeridos ya existen. Elija un modelo diferente o elimine los alias conflictivos.", + "noCustomModels": "Aún no se han añadido modelos personalizados.", + "allSuggestedAliasesExist": "Todos los alias sugeridos ya existen. Elige un modelo diferente o elimina los alias conflictivos.", "failedSaveCustomModel": "No se pudo guardar el modelo personalizado", - "modelAddedSuccess": "Modelo {modelId} agregado exitosamente", - "failedAddModelTryAgain": "No se pudo agregar el modelo. Por favor inténtalo de nuevo.", + "modelAddedSuccess": "Modelo {modelId} añadido correctamente", + "failedAddModelTryAgain": "No se pudo añadir el modelo. Por favor, inténtalo de nuevo.", "failedSaveImportedModel": "No se pudo guardar el modelo importado en la base de datos personalizada", - "failedImportModelsTryAgain": "No se pudieron importar modelos. Por favor inténtalo de nuevo.", + "failedImportModelsTryAgain": "No se pudieron importar los modelos. Por favor, inténtalo de nuevo.", "failedRemoveModelFromDatabase": "No se pudo eliminar el modelo de la base de datos", "modelRemovedSuccess": "Modelo eliminado correctamente", - "failedDeleteModelTryAgain": "No se pudo eliminar el modelo. Por favor inténtalo de nuevo.", - "compatibleModelsDescription": "Agregue modelos compatibles con {type} manualmente o impórtelos desde el punto final /models.", + "failedDeleteModelTryAgain": "No se pudo eliminar el modelo. Por favor, inténtalo de nuevo.", + "compatibleModelsDescription": "Añade modelos compatibles con {type} manualmente o impórtalos desde el endpoint /models.", "anthropicCompatibleModelPlaceholder": "claude-3-opus-20240229", "openaiCompatibleModelPlaceholder": "gpt-4o", - "apiKeyValidationFailed": "La validación de la clave API falló. Por favor verifique su clave e inténtelo nuevamente.", - "addProviderApiKeyTitle": "Agregar clave API {provider}", + "apiKeyValidationFailed": "La validación de la clave de API falló. Por favor, comprueba tu clave e inténtalo de nuevo.", + "addProviderApiKeyTitle": "Añadir clave de API de {provider}", "checking": "Comprobando...", - "check": "comprobar", + "check": "Comprobar", "valid": "Válido", - "invalid": "Inválido", + "invalid": "No válido", "creating": "Creando...", - "validationChecksAnthropicCompatible": "La validación verifica {provider} verificando la clave API.", - "validationChecksOpenAiCompatible": "La validación verifica {provider} a través de /models en su URL base.", + "validationChecksAnthropicCompatible": "La validación comprueba {provider} verificando la clave de API.", + "validationChecksOpenAiCompatible": "La validación comprueba {provider} a través de /models en tu URL base.", "priorityLabel": "Prioridad", "saving": "Guardando...", "save": "Guardar", "editConnection": "Editar conexión", - "accountName": "Nombre de cuenta", + "accountName": "Nombre de la cuenta", "email": "Correo electrónico", "healthCheckMinutes": "Control de salud (min)", - "healthCheckHint": "Intervalo de actualización de token proactivo. 0 = deshabilitado.", - "deselectAllModels": "Deselect all", - "modelsActiveCount": "{active}/{total} active", - "noModelsMatch": "No models match \"{filter}\"", - "groupLabel": "Environment", - "groupPlaceholder": "e.g. eKaizen, Personal", + "healthCheckHint": "Intervalo de actualización proactiva de token. 0 = deshabilitado.", + "deselectAllModels": "Deseleccionar todo", + "modelsActiveCount": "{active}/{total} activos", + "noModelsMatch": "Ningún modelo coincide con \"{filter}\"", + "groupLabel": "Entorno", + "groupPlaceholder": "p. ej. eKaizen, Personal", "failedTestConnection": "No se pudo probar la conexión", "failed": "Fallido", - "leaveBlankKeepCurrentApiKey": "Déjelo en blanco para conservar la clave API actual.", - "editCompatibleTitle": "Editar {type} Compatible", - "compatibleBaseUrlHint": "Root URL of your {type}-compatible API. Use Advanced Settings for custom endpoint paths.", - "apiKeyForCheck": "Clave API (para verificación)", - "testModelIdLabel": "Model ID (optional)", - "testModelIdPlaceholder": "e.g. my-model-id", - "testModelIdHint": "If the provider lacks a /models endpoint, enter a model ID to validate via /chat/completions instead.", - "compatibleProdPlaceholder": "{type} Compatible (Prod.)", - "tokenRefreshed": "Token refreshed successfully", - "tokenRefreshFailed": "Token refresh failed", - "applyCodexAuthLocal": "Apply auth", - "exportCodexAuthFile": "Export auth", + "leaveBlankKeepCurrentApiKey": "Déjalo en blanco para mantener la clave de API actual.", + "editCompatibleTitle": "Editar compatible con {type}", + "compatibleBaseUrlHint": "URL raíz de tu API compatible con {type}. Usa los ajustes avanzados para rutas de endpoint personalizadas.", + "apiKeyForCheck": "Clave de API (para comprobación)", + "testModelIdLabel": "ID del modelo (opcional)", + "testModelIdPlaceholder": "p. ej. mi-id-de-modelo", + "testModelIdHint": "Si el proveedor no tiene un endpoint /models, introduce un ID de modelo para validar a través de /chat/completions.", + "compatibleProdPlaceholder": "Compatible con {type} (Prod)", + "tokenRefreshed": "Token actualizado correctamente", + "tokenRefreshFailed": "Error al actualizar el token", + "applyCodexAuthLocal": "Aplicar autenticación", + "exportCodexAuthFile": "Exportar autenticación", "applyClaudeAuthLocal": "Aplicar autenticación", - "exportClaudeAuthFile": "Autenticación de exportación", + "exportClaudeAuthFile": "Exportar autenticación", "importClaudeAuth": "Importar autenticación", - "claudeApplyModalTitle": "Aplicar al código Claude local", + "claudeApplyModalTitle": "Aplicar a Claude Code local", "claudeApplyTargetLabel": "Ruta de destino", "claudeApplyBackupLabel": "Copias de seguridad", - "claudeApplyMcpHint": "Se conservará el estado existente de MCP OAuth.", + "claudeApplyMcpHint": "Se conservará el estado de OAuth de MCP existente.", "claudeApplyWarning": "Esto reemplazará la sección claudeAiOauth existente. ¿Continuar?", "claudeApplyConfirmCheckbox": "Confirmo que quiero reemplazar la sección claudeAiOauth existente", "claudeApply": "Aplicar", @@ -5257,730 +5259,730 @@ "claudeAuthExported": "Archivo de autenticación de Claude exportado", "claudeAuthExportFailed": "No se pudo exportar el archivo de autenticación de Claude", "claudeImportModalTitle": "Importar autenticación de Claude", - "claudeImportTabSingle": "soltero", - "claudeImportTabBulk": "A granel", + "claudeImportTabSingle": "Individual", + "claudeImportTabBulk": "Masivo", "claudeImportTabUpload": "Subir archivo", "claudeImportTabPaste": "Pegar JSON", - "claudeImportFileLabel": "Elija .credentials.json", - "claudeImportPasteLabel": "Pegue el contenido JSON", + "claudeImportFileLabel": "Elegir .credentials.json", + "claudeImportPasteLabel": "Pegar el contenido JSON", "claudeImportEmailLabel": "Correo electrónico de la cuenta", "claudeImportNameLabel": "Nombre de la conexión (opcional)", "claudeImportOverwriteLabel": "Reemplazar la conexión existente si la cuenta ya existe", "claudeImportSubmit": "Importar", - "claudeImportSuccess": "Conexión Claude importada exitosamente", + "claudeImportSuccess": "Conexión de Claude importada correctamente", "claudeImportInvalidJson": "No se pudo analizar el archivo como JSON", "claudeImportInvalidShape": "El archivo no es un .credentials.json válido", - "claudeImportDuplicate": "La cuenta ya existe: habilite \"Reemplazar existente\" para sobrescribir", - "claudeImportIdentityUnverified": "Bootstrap no pudo verificar la cuenta. Habilite \"Reemplazar existente\" o proporcione un correo electrónico.", + "claudeImportDuplicate": "La cuenta ya existe; activa \"Reemplazar existente\" para sobrescribir", + "claudeImportIdentityUnverified": "Bootstrap no pudo verificar la cuenta. Activa \"Reemplazar existente\" o proporciona un correo electrónico.", "claudeImportFailed": "No se pudo importar la autenticación de Claude", "claudeImportBulkModeUpload": "Subir archivos", - "claudeImportBulkModePaste": "Pegar matriz JSON", + "claudeImportBulkModePaste": "Pegar array JSON", "claudeImportBulkModeZip": "Subir ZIP", - "claudeImportBulkUploadHint": "Coloque o recoja hasta 50 archivos .credentials.json (256 KB cada uno, 10 MB en total).", - "claudeImportBulkPasteHint": "Pegue una matriz de objetos: [{ json, name?, email? }...]", - "claudeImportBulkZipHint": "ZIP que contiene entradas .json. Máximo 50 entradas, 10 MB descomprimidos.", + "claudeImportBulkUploadHint": "Arrastra o selecciona hasta 50 archivos .credentials.json (256 KB cada uno, 10 MB en total).", + "claudeImportBulkPasteHint": "Pega un array de objetos: [{ json, name?, email? }...]", + "claudeImportBulkZipHint": "ZIP que contiene entradas .json. Máximo 50 entradas, 10 MB descomprimido.", "claudeImportBulkSubmit": "Importar todo", - "claudeImportBulkSuccess": "Conexiones Claude {count} importadas", + "claudeImportBulkSuccess": "{count} conexiones de Claude importadas", "claudeImportBulkFailed": "Algunas entradas no se pudieron importar", "claudeImportBulkZipExtracting": "Extrayendo ZIP…", "claudeImportBulkZipError": "No se pudo extraer el ZIP", "geminiAuthAppliedLocal": "Autenticación de Gemini aplicada localmente", "geminiAuthApplyFailed": "No se pudo aplicar la autenticación de Gemini localmente", - "geminiAuthExported": "Archivo de autenticación Gemini exportado", + "geminiAuthExported": "Archivo de autenticación de Gemini exportado", "geminiAuthExportFailed": "No se pudo exportar el archivo de autenticación de Gemini", - "geminiImportModalTitle": "Importar autenticación de Géminis", - "geminiImportTabSingle": "soltero", - "geminiImportTabBulk": "A granel", + "geminiImportModalTitle": "Importar autenticación de Gemini", + "geminiImportTabSingle": "Individual", + "geminiImportTabBulk": "Masivo", "geminiImportTabUpload": "Subir archivo", "geminiImportTabPaste": "Pegar JSON", - "geminiImportFileLabel": "Elija oauth_creds.json", - "geminiImportPasteLabel": "Pegue el contenido JSON", + "geminiImportFileLabel": "Elegir oauth_creds.json", + "geminiImportPasteLabel": "Pegar el contenido JSON", "geminiImportEmailLabel": "Correo electrónico de la cuenta", "geminiImportNameLabel": "Nombre de la conexión (opcional)", "geminiImportOverwriteLabel": "Reemplazar la conexión existente si la cuenta ya existe", "geminiImportSubmit": "Importar", - "geminiImportSuccess": "Conexión Gemini importada exitosamente", + "geminiImportSuccess": "Conexión de Gemini importada correctamente", "geminiImportInvalidJson": "No se pudo analizar el archivo como JSON", "geminiImportInvalidShape": "El archivo no es un oauth_creds.json válido", - "geminiImportDuplicate": "La cuenta ya existe: habilite \"Reemplazar existente\" para sobrescribir", - "geminiImportIdentityUnverified": "No se pudo verificar la identidad de id_token. Habilite \"Reemplazar existente\" o proporcione un correo electrónico.", + "geminiImportDuplicate": "La cuenta ya existe; activa \"Reemplazar existente\" para sobrescribir", + "geminiImportIdentityUnverified": "No se pudo verificar la identidad desde id_token. Activa \"Reemplazar existente\" o proporciona un correo electrónico.", "geminiImportFailed": "No se pudo importar la autenticación de Gemini", "geminiImportBulkModeUpload": "Subir archivos", - "geminiImportBulkModePaste": "Pegar matriz JSON", + "geminiImportBulkModePaste": "Pegar array JSON", "geminiImportBulkModeZip": "Subir ZIP", - "geminiImportBulkUploadHint": "Suelte o recoja hasta 50 archivos oauth_creds.json (256 KB cada uno, 10 MB en total).", - "geminiImportBulkPasteHint": "Pegue una matriz de objetos: [{ json, name?, email? }...]", - "geminiImportBulkZipHint": "ZIP que contiene entradas oauth_creds.json. Máximo 50 entradas, 10 MB descomprimidos.", + "geminiImportBulkUploadHint": "Arrastra o selecciona hasta 50 archivos oauth_creds.json (256 KB cada uno, 10 MB en total).", + "geminiImportBulkPasteHint": "Pega un array de objetos: [{ json, name?, email? }...]", + "geminiImportBulkZipHint": "ZIP que contiene entradas oauth_creds.json. Máximo 50 entradas, 10 MB descomprimido.", "geminiImportBulkSubmit": "Importar todo", - "geminiImportBulkSuccess": "{count} conexiones Gemini importadas", + "geminiImportBulkSuccess": "{count} conexiones de Gemini importadas", "geminiImportBulkFailed": "Algunas entradas no se pudieron importar", "geminiImportBulkZipExtracting": "Extrayendo ZIP…", "geminiImportBulkZipError": "No se pudo extraer el ZIP", - "codexAuthAppliedLocal": "Codex auth.json applied locally", - "codexAuthApplyFailed": "Failed to apply Codex auth.json locally", - "codexAuthExported": "Codex auth.json exported", - "codexAuthExportFailed": "Failed to export Codex auth.json", - "codexCliGuideButton": "Codex CLI Guide", - "codexCliGuideTitle": "Codex CLI Guide", - "codexCliGuideLoading": "Loading guide...", - "codexCliGuideLoadFailed": "Could not load the guide.", - "codexExternalLinkButton": "External Codex link", - "codexExternalLinkModalTitle": "External Codex link", - "codexExternalLinkModalDescription": "Share this single-use link with the person who will authenticate the Codex account. They open it in their own browser, complete the OpenAI login, and the connection is registered here. The link expires in 15 minutes.", - "codexExternalLinkGenerating": "Generating link...", - "codexExternalLinkWaiting": "Waiting for browser authentication. This window refreshes automatically.", - "codexExternalLinkCreateFailed": "Failed to generate the link.", - "codexExternalLinkNetworkError": "Could not contact the server.", - "codexExternalLinkConnected": "Codex account connected through the external link.", - "codexExternalLinkExpired": "The link expired before completion.", + "codexAuthAppliedLocal": "Codex auth.json aplicado localmente", + "codexAuthApplyFailed": "No se pudo aplicar el archivo Codex auth.json localmente", + "codexAuthExported": "Codex auth.json exportado", + "codexAuthExportFailed": "No se pudo exportar el archivo Codex auth.json", + "codexCliGuideButton": "Guía de la CLI de Codex", + "codexCliGuideTitle": "Guía de la CLI de Codex", + "codexCliGuideLoading": "Cargando guía...", + "codexCliGuideLoadFailed": "No se pudo cargar la guía.", + "codexExternalLinkButton": "Enlace externo de Codex", + "codexExternalLinkModalTitle": "Enlace externo de Codex", + "codexExternalLinkModalDescription": "Comparte este enlace de un solo uso con la persona que autenticará la cuenta de Codex. Deberá abrirlo en su navegador, completar el inicio de sesión de OpenAI y la conexión se registrará aquí. El enlace caduca en 15 minutos.", + "codexExternalLinkGenerating": "Generando enlace...", + "codexExternalLinkWaiting": "Esperando la autenticación del navegador. Esta ventana se actualiza automáticamente.", + "codexExternalLinkCreateFailed": "No se pudo generar el enlace.", + "codexExternalLinkNetworkError": "No se pudo contactar con el servidor.", + "codexExternalLinkConnected": "Cuenta de Codex conectada a través del enlace externo.", + "codexExternalLinkExpired": "El enlace caducó antes de completarse.", "importCodexAuth": "Importar autenticación", - "codexImportModalTitle": "Importar autenticación del Codex", - "codexImportTabSingle": "soltero", - "codexImportTabBulk": "A granel", + "codexImportModalTitle": "Importar autenticación de Codex", + "codexImportTabSingle": "Individual", + "codexImportTabBulk": "Masivo", "codexImportTabUpload": "Subir archivo", "codexImportTabPaste": "Pegar JSON", - "codexImportFileLabel": "Elija autenticación.json", - "codexImportFileHint": "Seleccione el archivo auth.json exportado desde Codex o desde OmniRoute.", - "codexImportPasteLabel": "Pegue el contenido JSON", + "codexImportFileLabel": "Elegir auth.json", + "codexImportFileHint": "Selecciona el archivo auth.json exportado desde Codex o desde OmniRoute.", + "codexImportPasteLabel": "Pegar el contenido JSON", "codexImportEmailLabel": "Correo electrónico de la cuenta", - "codexImportEmailHint": "Detectado automáticamente desde el archivo; editar si es necesario.", + "codexImportEmailHint": "Detectado automáticamente desde el archivo; edita si es necesario.", "codexImportNameLabel": "Nombre de la conexión (opcional)", "codexImportOverwriteLabel": "Reemplazar la conexión existente si la cuenta ya existe", "codexImportSubmit": "Importar", - "codexImportSuccess": "Conexión Codex importada exitosamente", + "codexImportSuccess": "Conexión Codex importada con éxito", "codexImportInvalidJson": "No se pudo analizar el archivo como JSON", - "codexImportInvalidShape": "El archivo no es un Codex auth.json válido", - "codexImportDuplicate": "La cuenta ya existe: habilite \"Reemplazar existente\" para sobrescribir", - "codexImportFailed": "No se pudo importar la autenticación del Codex", + "codexImportInvalidShape": "El archivo no es un auth.json de Codex válido", + "codexImportDuplicate": "La cuenta ya existe; activa «Reemplazar existente» para sobrescribirla", + "codexImportFailed": "No se pudo importar la autenticación de Codex", "codexImportDetectedEmail": "Detectado: {email}", - "codexImportNoEmailDetected": "No se detectó ningún correo electrónico en el archivo", + "codexImportNoEmailDetected": "No se ha detectado ningún correo electrónico en el archivo", "codexImportBulkModeUpload": "Subir archivos", "codexImportBulkModePaste": "Pegar lista", - "codexImportBulkModeZip": "archivo ZIP", - "codexImportBulkUploadHint": "Seleccione varios archivos .json o arrástrelos y suéltelos", + "codexImportBulkModeZip": "Archivo ZIP", + "codexImportBulkUploadHint": "Selecciona varios archivos .json o arrástralos y suéltalos", "codexImportBulkPasteHint": "Matriz JSON [ {...}, {...} ] o varios JSON separados por --- en su propia línea", - "codexImportBulkZipHint": "Cargue un archivo .zip que contenga archivos auth.json (máximo 50 archivos, 10 MB)", + "codexImportBulkZipHint": "Sube un .zip que contenga archivos auth.json (máximo 50 archivos, 10 MB)", "codexImportBulkSubmit": "Importar {count} cuentas", "codexImportBulkLimit": "Máximo 50 archivos por importación", - "codexImportBulkSuccess": "{count} importado", - "codexImportBulkFailed": "{count} falló", + "codexImportBulkSuccess": "{count} importados", + "codexImportBulkFailed": "{count} fallidos", "codexImportBulkZipExtracting": "Extrayendo ZIP…", "codexImportBulkZipError": "No se pudo extraer el ZIP", - "advancedSettings": "Advanced Settings", - "chatPathLabel": "Chat Endpoint Path", + "advancedSettings": "Ajustes avanzados", + "chatPathLabel": "Ruta del endpoint de chat", "chatPathPlaceholder": "/chat/completions", - "chatPathHint": "Custom chat path for providers with non-standard APIs (e.g. /v4/chat/completions)", - "modelsPathLabel": "Models Endpoint Path", + "chatPathHint": "Ruta de chat personalizada para proveedores con APIs no estándar (p. ej., /v4/chat/completions)", + "modelsPathLabel": "Ruta del endpoint de modelos", "modelsPathPlaceholder": "/models", - "modelsPathHint": "Custom models path for validation (e.g. /v4/models)", - "clientIdentityLabel": "Client Identity", - "clientIdentityHint": "Optional. Adds client fingerprint headers (e.g. User-Agent) matching a known CLI for compatible gateways that expect one.", - "statusDeactivated": "Deactivated (Manual)", - "statusBanned": "Banned / Sandbox Violation", - "statusCreditsExhausted": "Insufficient Balance / Quota Exhausted", - "showEmails": "Show all emails", - "hideEmails": "Hide all emails", + "modelsPathHint": "Ruta de modelos personalizada para validación (p. ej., /v4/models)", + "clientIdentityLabel": "Identidad de cliente", + "clientIdentityHint": "Opcional. Añade cabeceras de huella digital del cliente (p. ej., User-Agent) que coincidan con una CLI conocida para pasarelas compatibles que las requieran.", + "statusDeactivated": "Desactivado (manual)", + "statusBanned": "Bloqueado / Infracción del sandbox", + "statusCreditsExhausted": "Saldo insuficiente / Cuota agotada", + "showEmails": "Mostrar todos los correos electrónicos", + "hideEmails": "Ocultar todos los correos electrónicos", "a": "A", - "accountConcurrencyCapHint": "Account Concurrency Cap Hint", - "accountConcurrencyCapLabel": "Account Concurrency Cap Label", - "accountIdHint": "Account Id Hint", - "accountIdLabel": "Account Id Label", - "accountIdPlaceholder": "Account Id Placeholder", - "addAnotherApiKey": "Add another API key or paste multiple keys", - "addCcCompatible": "Add Cc Compatible", - "aggregatorsGateways": "Aggregators Gateways", + "accountConcurrencyCapHint": "Solicitudes simultáneas máximas que esta conexión o cuenta puede gestionar. Las cuentas de suscripción suelen permitir pocas (1-3); superar este límite provoca errores 429 y periodos de enfriamiento. Déjalo en blanco para usar el valor predeterminado.", + "accountConcurrencyCapLabel": "Límite de concurrencia de la cuenta", + "accountIdHint": "Requerido por algunos proveedores (p. ej., Cloudflare Workers AI) junto con el token de API.", + "accountIdLabel": "ID de cuenta", + "accountIdPlaceholder": "Tu ID de cuenta de proveedor", + "addAnotherApiKey": "Añadir otra clave de API o pegar varias claves", + "addCcCompatible": "Añadir compatible con CC", + "aggregatorsGateways": "Pasarelas agregadoras", "enterpriseCloud": "Empresa y nube", - "apiFormatLabel": "Api Format Label", - "apiKeyOptionalHint": "Api Key Optional Hint", - "apiKeyOptionalLabel": "Api Key Optional Label", - "apiRegionChina": "Api Region China", - "apiRegionHint": "Api Region Hint", - "apiRegionInternational": "Api Region International", - "apiRegionLabel": "Api Region Label", - "apikey": "Apikey", + "apiFormatLabel": "Formato de API", + "apiKeyOptionalHint": "La clave de API es opcional para este proveedor.", + "apiKeyOptionalLabel": "Clave de API opcional", + "apiRegionChina": "Región de API: China", + "apiRegionHint": "Selecciona la región geográfica del endpoint de la API.", + "apiRegionInternational": "Región de API: Internacional", + "apiRegionLabel": "Región de API", + "apikey": "Clave de API", "audio": "Audio", - "audioProvidersHeading": "Audio Providers Heading", + "audioProvidersHeading": "Proveedores de audio", "cloudAgentProviders": "Proveedores de agentes en la nube", - "audioShortLabel": "Audio Short Label", - "azureOpenAiBaseUrlHint": "Azure Open Ai Base Url Hint", - "bailianBaseUrlHint": "Bailian Base Url Hint", - "claudeWebCookieHint": "Open claude.ai → DevTools → Application → Cookies → claude.ai, copy the 'sessionKey' value. Also need cf_clearance, __cf_bm, _cfuvid for Cloudflare.", + "audioShortLabel": "Audio", + "azureOpenAiBaseUrlHint": "Sugerencia de URL base de Azure OpenAI", + "bailianBaseUrlHint": "URL base personalizada para Alibaba Cloud Bailian.", + "claudeWebCookieHint": "Abre claude.ai → DevTools → Application → Cookies → claude.ai, y copia el valor de 'sessionKey'. También se necesitan cf_clearance, __cf_bm y _cfuvid para Cloudflare.", "claudeWebCookiePlaceholder": "sessionKey=sk-ant-...", - "blackboxWebCookieHint": "Blackbox Web Cookie Hint", - "blackboxWebCookiePlaceholder": "Blackbox Web Cookie Placeholder", - "t3ChatWebCookieHint": "Abra t3.chat → DevTools → Aplicación → Almacenamiento local → https://t3.chat, copie 'convex-session-id'. Luego abra DevTools → Red, copie el encabezado completo de la cookie de cualquier solicitud de chat. Pegue ambos valores en los campos siguientes.", - "t3ChatWebCookiePlaceholder": "ID-sesión-convexa=abc123...", - "grokWebCookieHint": "Grok Web Cookie Hint", - "blockClaudeExtraUsageDescription": "__MISSING__:When enabled, OmniRoute marks this Claude connection unavailable as soon as the usage API reports queued extra usage, so fallback switches to another connection instead of continuing on pay-as-you-go extra billing.", - "blockClaudeExtraUsageLabel": "__MISSING__:Block extra Claude usage", - "disableCoolingDescription": "Skip the transient cooldown so this connection stays eligible even after recoverable errors (terminal states like banned/expired still apply).", - "disableCoolingLabel": "Disable cooldown for this connection", - "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}", - "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicate skipped} other {# duplicates skipped}}", - "bulkPasteHint": "Paste one API key per line. Empty lines are ignored and duplicate keys are skipped.", - "ccCompatibleBaseUrlHint": "Cc Compatible Base Url Hint", - "ccCompatibleBaseUrlPlaceholder": "Cc Compatible Base Url Placeholder", - "ccCompatibleChatPathHint": "Cc Compatible Chat Path Hint", - "ccCompatibleContext1mDescription": "Cc Compatible Context1M Description", - "ccCompatibleContext1mLabel": "Cc Compatible Context1M Label", - "ccCompatibleRedactThinkingDescription": "Adds the redact-thinking beta header for CC Compatible upstreams that require hidden Claude thinking streams.", - "ccCompatibleRedactThinkingLabel": "Enable redact-thinking beta", - "ccCompatibleSummarizeThinkingDescription": "Adds `display: \"summarized\"` to CC Compatible thinking requests so supported Claude models stream visible thinking deltas.", - "ccCompatibleSummarizeThinkingLabel": "Enable summarized thinking display", - "ccCompatibleDetailsTitle": "Cc Compatible Details Title", - "ccCompatibleLabel": "Cc Compatible Label", - "ccCompatibleModelsDescription": "Cc Compatible Models Description", - "ccCompatibleNameHint": "Cc Compatible Name Hint", - "ccCompatibleNamePlaceholder": "Cc Compatible Name Placeholder", - "ccCompatiblePrefixHint": "Cc Compatible Prefix Hint", - "ccCompatiblePrefixPlaceholder": "Cc Compatible Prefix Placeholder", - "ccCompatibleValidationHint": "Cc Compatible Validation Hint", - "claudeExtraUsageShort": "Claude Extra Usage Short", - "claudeExtraUsageToggleTitle": "Claude Extra Usage Toggle Title", - "codex5hToggleTitle": "Codex5H Toggle Title", - "codexFastServiceTierDescription": "Use the priority service tier for Codex requests when available.", - "codexFastServiceTierLabel": "Codex fast service tier", - "codexWeeklyToggleTitle": "Codex Weekly Toggle Title", - "compatUpstreamHeaderNamePlaceholder": "Compat Upstream Header Name Placeholder", - "compatUpstreamHeaderValuePlaceholder": "Compat Upstream Header Value Placeholder", + "blackboxWebCookieHint": "Abre blackbox.ai, abre DevTools y copia la cookie de sesión requerida.", + "blackboxWebCookiePlaceholder": "session=...", + "t3ChatWebCookieHint": "Abre t3.chat → DevTools → Aplicación → Almacenamiento local → https://t3.chat, copia 'convex-session-id'. Luego abre DevTools → Red, copia el encabezado completo de la cookie de cualquier solicitud de chat. Pegue ambos valores en los campos siguientes.", + "t3ChatWebCookiePlaceholder": "convex-session-id=abc123...", + "grokWebCookieHint": "Abre x.com (Grok), abre DevTools → Application → Cookies y copia las cookies de sesión requeridas.", + "blockClaudeExtraUsageDescription": "Cuando está activado, OmniRoute marca esta conexión de Claude como no disponible tan pronto como la API de uso informe de uso adicional en cola, para que el fallback cambie a otra conexión en lugar de continuar con la facturación adicional de pago por uso.", + "blockClaudeExtraUsageLabel": "Bloquear el uso adicional de Claude", + "disableCoolingDescription": "Omite el enfriamiento transitorio para que esta conexión siga estando disponible incluso después de errores recuperables (los estados terminales como bloqueado/caducado siguen aplicándose).", + "disableCoolingLabel": "Desactivar el enfriamiento para esta conexión", + "bulkPasteAdded": "{count, plural, one {1 clave añadida} other {# claves añadidas}}", + "bulkPasteDuplicatesIgnored": "{count, plural, one {1 duplicado omitido} other {# duplicados omitidos}}", + "bulkPasteHint": "Pega una clave de API por línea. Las líneas vacías se ignoran y las claves duplicadas se omiten.", + "ccCompatibleBaseUrlHint": "URL base para un relé exclusivo de Claude Code. No incluyas /messages.", + "ccCompatibleBaseUrlPlaceholder": "https://relay.example.com/v1", + "ccCompatibleChatPathHint": "Utiliza por defecto la ruta estricta de la API de mensajes de Claude Code. Cámbiala solo si tu relé documenta una ruta diferente.", + "ccCompatibleContext1mDescription": "Añade la cabecera beta context-1m cuando el modelo de Claude seleccionado lo admita.", + "ccCompatibleContext1mLabel": "Activar la beta de contexto de 1M", + "ccCompatibleRedactThinkingDescription": "Añade la cabecera beta redact-thinking para los upstreams compatibles con CC que requieran flujos de razonamiento ocultos de Claude.", + "ccCompatibleRedactThinkingLabel": "Activar la beta de ocultación de razonamiento", + "ccCompatibleSummarizeThinkingDescription": "Añade `display: \"summarized\"` a las solicitudes de razonamiento compatibles con CC para que los modelos de Claude compatibles transmitan deltas de razonamiento visibles.", + "ccCompatibleSummarizeThinkingLabel": "Activar la visualización de razonamiento resumido", + "ccCompatibleDetailsTitle": "Detalles del relé compatible con CC", + "ccCompatibleLabel": "Compatible con CC", + "ccCompatibleModelsDescription": "Los relés compatibles con CC no exponen el listado de modelos. Añade los IDs de los modelos de Claude que acepta tu relé.", + "ccCompatibleNameHint": "Nombre para mostrar de este relé exclusivo de Claude Code.", + "ccCompatibleNamePlaceholder": "Relé CC de producción", + "ccCompatiblePrefixHint": "Se utiliza en alias de modelos como prefijo/id-de-modelo.", + "ccCompatiblePrefixPlaceholder": "cc", + "ccCompatibleValidationHint": "Usa este proveedor solo para relés que den servicio exclusivamente a clientes de Claude Code. OmniRoute reescribe cualquier solicitud entrante al formato de cable compatible con Claude Code para que dichos relés la acepten. Si solo quieres usar la CLI de Claude Code o no estás seguro de qué significa este tipo de relé, utiliza un proveedor compatible con Anthropic normal en su lugar.", + "claudeExtraUsageShort": "Uso adicional", + "claudeExtraUsageToggleTitle": "Bloquear el recuento de uso adicional de Claude para esta conexión", + "codex5hToggleTitle": "Rastrear la cuota de 5 horas de Codex para esta conexión", + "codexFastServiceTierDescription": "Utiliza el nivel de servicio prioritario para las solicitudes de Codex cuando esté disponible.", + "codexFastServiceTierLabel": "Nivel de servicio rápido de Codex", + "codexWeeklyToggleTitle": "Rastrear la cuota semanal de Codex para esta conexión", + "compatUpstreamHeaderNamePlaceholder": "Nombre de cabecera de upstream compatible", + "compatUpstreamHeaderValuePlaceholder": "Valor de cabecera de upstream compatible", "compatible": "Compatible", - "configuredCount": "Configured Count", - "consoleApiKeyOracleHint": "Console Api Key Oracle Hint", - "consoleApiKeyOracleLabel": "Console Api Key Oracle Label", - "consoleApiKeyOraclePlaceholder": "Console Api Key Oracle Placeholder", - "newApiUserIdLabel": "ID de usuario New-API", + "configuredCount": "Número configurado", + "consoleApiKeyOracleHint": "Introduce la clave de API de la consola de Oracle AI.", + "consoleApiKeyOracleLabel": "Clave de API de la consola", + "consoleApiKeyOraclePlaceholder": "Clave de API de la consola de Oracle", + "newApiUserIdLabel": "ID de usuario de New-API", "newApiUserIdPlaceholder": "p. ej. 12345", - "newApiUserIdHint": "Valor del encabezado New-Api-User de AgentRouter, usado junto con la clave de API de la consola para consultar el saldo de cuota.", - "cpaModeDisabledTitle": "Cpa Mode Disabled Title", - "cpaModeEnabledTitle": "Cpa Mode Enabled Title", - "customUserAgentHint": "Custom User Agent Hint", - "customUserAgentLabel": "Custom User Agent Label", - "databricksBaseUrlHint": "Databricks Base Url Hint", - "defaultThinkingStrengthHint": "Used when a request does not specify reasoning effort.", - "defaultThinkingStrengthLabel": "Default thinking strength", - "deleteAllExtraApiKeys": "Delete all", - "excludedModelsHint": "Excluded Models Hint", - "excludedModelsLabel": "Excluded Models Label", - "excludedModelsPlaceholder": "Excluded Models Placeholder", - "expirationBannerExpired": "Expiration Banner Expired", - "expirationBannerExpiredDesc": "Expiration Banner Expired Desc", - "expirationBannerExpiringSoon": "Expiration Banner Expiring Soon", - "expirationBannerExpiringSoonDesc": "Expiration Banner Expiring Soon Desc", - "extraApiKeyMasked": "Key {index}: {prefix}••••{suffix}", - "extraApiKeysHint": "Extra Api Keys Hint", - "extraApiKeysLabel": "Extra Api Keys Label", - "apiKeyHealthLabel": "API Key Health", - "apiKeyStatusActive": "Active", - "apiKeyStatusWarning": "Warning ({count} failures)", - "apiKeyStatusInvalid": "Invalid", - "primaryKey": "Primary Key", - "apiKeyInvalidAlert": "{count} API key(s) marked as invalid due to authentication failures in connections: {connections}. They will be skipped in rotation. Click to review.", - "apiKeyInvalidAlertTitle": "API Key Health Alert", - "apiKeyWarningAlert": "{count} API key(s) in warning state due to elevated failure rate in connections: {connections}. Review to prevent rotation issues.", - "apiKeyWarningAlertTitle": "API Key Warning", - "googlePseInfo": "Google Pse Info", + "newApiUserIdHint": "Valor de la cabecera New-Api-User de AgentRouter, usado junto con la clave de API de la consola para consultar el saldo de cuota.", + "cpaModeDisabledTitle": "El modo de compatibilidad de CLIProxyAPI está desactivado", + "cpaModeEnabledTitle": "El modo de compatibilidad de CLIProxyAPI está activado", + "customUserAgentHint": "Define una cadena de User-Agent personalizada para enviar en las peticiones HTTP.", + "customUserAgentLabel": "User-Agent personalizado", + "databricksBaseUrlHint": "URL base del endpoint de Databricks Model Serving.", + "defaultThinkingStrengthHint": "Se utiliza cuando una solicitud no especifica el esfuerzo de razonamiento.", + "defaultThinkingStrengthLabel": "Intensidad de razonamiento predeterminada", + "deleteAllExtraApiKeys": "Eliminar todo", + "excludedModelsHint": "Lista de IDs de modelos que se excluirán de este proveedor, separados por comas.", + "excludedModelsLabel": "Modelos excluidos", + "excludedModelsPlaceholder": "modelo-1, modelo-2", + "expirationBannerExpired": "La conexión ha caducado", + "expirationBannerExpiredDesc": "Las credenciales de esta conexión han caducado y ya no se pueden usar.", + "expirationBannerExpiringSoon": "La conexión caduca pronto", + "expirationBannerExpiringSoonDesc": "Las credenciales de esta conexión caducarán pronto. Renuévelas para evitar interrupciones.", + "extraApiKeyMasked": "Clave {index}: {prefix}••••{suffix}", + "extraApiKeysHint": "Claves de API adicionales para usar en rotación con la clave principal.", + "extraApiKeysLabel": "Claves de API adicionales", + "apiKeyHealthLabel": "Estado de la clave de API", + "apiKeyStatusActive": "Activa", + "apiKeyStatusWarning": "Advertencia ({count} fallos)", + "apiKeyStatusInvalid": "No válida", + "primaryKey": "Clave principal", + "apiKeyInvalidAlert": "{count} clave(s) de API marcada(s) como no válida(s) debido a errores de autenticación en las conexiones: {connections}. Se omitirán en la rotación. Haz clic para revisar.", + "apiKeyInvalidAlertTitle": "Alerta de salud de la clave de API", + "apiKeyWarningAlert": "{count} clave(s) de API en estado de advertencia debido a una tasa de errores elevada en las conexiones: {connections}. Revísalas para evitar problemas de rotación.", + "apiKeyWarningAlertTitle": "Advertencia de clave de API", + "googlePseInfo": "Configuración de Google Programmable Search Engine (PSE).", "antigravityProjectIdHint": "Anulación opcional para solicitudes de Antigravity Cloud Code. Déjelo en blanco para utilizar el proyecto descubierto durante Google OAuth.", - "antigravityClientProfileLabel": "Client profile", - "antigravityClientProfileHint": "Choose which Antigravity client identity OmniRoute presents to the API.", + "antigravityClientProfileLabel": "Perfil de cliente", + "antigravityClientProfileHint": "Elige qué identidad de cliente de Antigravity presenta OmniRoute a la API.", "antigravityClientProfileIde": "IDE", - "antigravityClientProfileCli": "Harness / CLI", - "codexFastTierActiveChip": "Codex Fast tier is active", - "tierFast": "Fast", + "antigravityClientProfileCli": "CLI", + "codexFastTierActiveChip": "El nivel rápido de Codex está activo", + "tierFast": "Rápido", "antigravityProjectIdLabel": "ID del proyecto de Google Cloud", "antigravityProjectIdPlaceholder": "mi-id-proyecto-gcp", - "grokWebCookiePlaceholder": "Grok Web Cookie Placeholder", - "herokuBaseUrlHint": "Heroku Base Url Hint", - "hideEmail": "Hide Email", - "imageProviders": "Image Providers", + "grokWebCookiePlaceholder": "session=...", + "herokuBaseUrlHint": "URL base para tu despliegue de Heroku.", + "hideEmail": "Ocultar correo", + "imageProviders": "Proveedores de imágenes", "videoProviders": "Generación de vídeo", "embeddingRerankProviders": "Incrustaciones y reclasificación", - "imagesShortLabel": "Images Short Label", - "llmProviders": "Llm Providers", - "localProviderApiKeyOptionalHint": "Local Provider Api Key Optional Hint", - "localProviderBaseUrlHint": "Local Provider Base Url Hint", - "localProviders": "Local Providers", - "maxConcurrentWholeNumberError": "Max Concurrent Whole Number Error", - "m365TierLabel": "Copilot tier", - "m365TierHint": "Choose which Microsoft 365 Copilot surface this connection uses. Individual is the default consumer BizChat; Education and Enterprise (work) opt into their tenant surfaces.", - "m365TierIndividualOption": "Individual (default)", - "m365TierEduOption": "Education", - "m365TierEnterpriseOption": "Enterprise / Work", - "tierOverrideLabel": "Tier override", - "tierOverrideAuto": "Auto (routing decides)", - "tierOverrideFree": "Free", - "tierOverrideCheap": "Cheap", - "tierOverridePremium": "Premium", - "tierOverrideHelpText": "Pin this provider to a routing tier instead of letting OmniRoute infer it from model pricing.", - "museSparkWebCookieHint": "Muse Spark Web Cookie Hint", - "museSparkWebCookiePlaceholder": "Muse Spark Web Cookie Placeholder", - "oauth": "Oauth", - "openCliTools": "Open Cli Tools", - "openSettings": "Open Settings", - "openaiResponsesStoreDescription": "Allow compatible Responses API requests to preserve stored response state.", - "openaiResponsesStoreLabel": "OpenAI Responses store", - "perplexitySearchSharedKeyInfo": "Perplexity Search Shared Key Info", - "perplexityWebCookieHint": "Perplexity Web Cookie Hint", - "perplexityWebCookiePlaceholder": "Perplexity Web Cookie Placeholder", - "personalAccessTokenLabel": "Personal Access Token Label", - "qoderPatHint": "Qoder Pat Hint", - "qoderPatPlaceholder": "Qoder Pat Placeholder", - "rateLimitOverridesSection": "Rate Limit Overrides", - "rateLimitOverridesMaxConcurrentHint": "Max concurrent requests override for this connection. Overrides the account-level cap.", - "rateLimitOverridesMaxConcurrentLabel": "Max Concurrent (Rate Limit)", - "rateLimitOverridesMinTimeHint": "Minimum time (ms) between requests. Overrides the default rate limiter delay.", - "rateLimitOverridesMinTimeLabel": "Min Interval (ms)", - "rateLimitOverridesRpmHint": "Max requests per minute for this connection. Overrides the provider default.", - "rateLimitOverridesRpmLabel": "RPM (Requests/min)", - "rateLimitOverridesTpdHint": "Max tokens per day for this connection. Overrides the provider default.", - "rateLimitOverridesTpdLabel": "TPD (Tokens/day)", - "rateLimitOverridesTpmHint": "Max tokens per minute for this connection. Overrides the provider default.", + "imagesShortLabel": "Imágenes", + "llmProviders": "Proveedores de LLM", + "localProviderApiKeyOptionalHint": "La clave de API suele ser opcional para despliegues locales.", + "localProviderBaseUrlHint": "Sugerencia de URL base del proveedor local", + "localProviders": "Proveedores locales", + "maxConcurrentWholeNumberError": "Introduce un número entero válido para la concurrencia máxima.", + "m365TierLabel": "Nivel de Copilot", + "m365TierHint": "Elige qué superficie de Microsoft 365 Copilot utiliza esta conexión. Individual es el BizChat de consumidor predeterminado; Educación y Empresa (trabajo) optan por sus superficies de inquilino.", + "m365TierIndividualOption": "Individual (predeterminado)", + "m365TierEduOption": "Educación", + "m365TierEnterpriseOption": "Empresa / Trabajo", + "tierOverrideLabel": "Anulación de nivel", + "tierOverrideAuto": "Automático (el enrutamiento decide)", + "tierOverrideFree": "Gratuito", + "tierOverrideCheap": "Económico", + "tierOverridePremium": "Prémium", + "tierOverrideHelpText": "Asigna este proveedor a un nivel de enrutamiento fijo en lugar de dejar que OmniRoute lo infiera a partir de los precios del modelo.", + "museSparkWebCookieHint": "Introduce la cookie de sesión para Muse Spark.", + "museSparkWebCookiePlaceholder": "session=...", + "oauth": "OAuth", + "openCliTools": "Abrir herramientas de CLI", + "openSettings": "Abrir ajustes", + "openaiResponsesStoreDescription": "Permitir que las solicitudes compatibles de la API Responses conserven el estado de respuesta almacenado.", + "openaiResponsesStoreLabel": "Almacenamiento de Responses de OpenAI", + "perplexitySearchSharedKeyInfo": "Información sobre la clave compartida de búsqueda de Perplexity.", + "perplexityWebCookieHint": "Abre perplexity.ai, abre DevTools y copia la cookie de sesión.", + "perplexityWebCookiePlaceholder": "__cf_bm=...", + "personalAccessTokenLabel": "Token de acceso personal", + "qoderPatHint": "Pega tu token de acceso personal (PAT) de Qoder. Genera uno desde Qoder → Settings → Personal Access Tokens.", + "qoderPatPlaceholder": "Tu token de acceso personal de Qoder", + "rateLimitOverridesSection": "Excepciones de límites de tasa", + "rateLimitOverridesMaxConcurrentHint": "Anulación de solicitudes simultáneas máximas para esta conexión. Sobrescribe el límite a nivel de cuenta.", + "rateLimitOverridesMaxConcurrentLabel": "Máximo de solicitudes simultáneas (rate limit)", + "rateLimitOverridesMinTimeHint": "Tiempo mínimo (ms) entre solicitudes. Oculta el retraso predeterminado del limitador de velocidad.", + "rateLimitOverridesMinTimeLabel": "Intervalo mín. (ms)", + "rateLimitOverridesRpmHint": "Máximo de solicitudes por minuto para esta conexión. Oculta el valor predeterminado del proveedor.", + "rateLimitOverridesRpmLabel": "RPM (Solicitudes/min)", + "rateLimitOverridesTpdHint": "Máximo de tokens por día para esta conexión. Oculta el valor predeterminado del proveedor.", + "rateLimitOverridesTpdLabel": "TPD (Tokens/día)", + "rateLimitOverridesTpmHint": "Máximo de tokens por minuto para esta conexión. Oculta el valor predeterminado del proveedor.", "rateLimitOverridesTpmLabel": "TPM (Tokens/min)", - "refreshOauthTokenTitle": "Refresh Oauth Token Title", - "regionHint": "Region Hint", - "regionLabel": "Region Label", - "removeThisKey": "Remove This Key", - "routingTagsHint": "Routing Tags Hint", - "routingTagsLabel": "Routing Tags Label", - "routingTagsPlaceholder": "Routing Tags Placeholder", - "search": "Search", - "searchEngineIdHint": "Search Engine Id Hint", - "searchEngineIdLabel": "Search Engine Id Label", - "searchEngineIdRequired": "Search Engine Id Required", - "searchProvider": "Search Provider", - "searchProviderDesc": "Search Provider Desc", + "refreshOauthTokenTitle": "Actualizar título del token OAuth", + "regionHint": "Sugerencia de región", + "regionLabel": "Etiqueta de región", + "removeThisKey": "Eliminar esta clave", + "routingTagsHint": "Sugerencia de etiquetas de enrutamiento", + "routingTagsLabel": "Etiquetas de enrutamiento", + "routingTagsPlaceholder": "Etiquetas de enrutamiento", + "search": "Buscar", + "searchEngineIdHint": "Sugerencia de ID de motor de búsqueda", + "searchEngineIdLabel": "ID de motor de búsqueda", + "searchEngineIdRequired": "ID de motor de búsqueda requerido", + "searchProvider": "Proveedor de búsqueda", + "searchProviderDesc": "Descripción del proveedor de búsqueda", "searchProviders": "Buscar proveedores...", - "searchByModel": "Search by model…", - "searchProvidersHeading": "Search Providers Heading", - "searxngBaseUrlHint": "Searxng Base Url Hint", - "searxngInfo": "Searxng Info", - "sessionCookieLabel": "Session Cookie Label", - "showEmail": "Show Email", - "snowflakeBaseUrlHint": "Snowflake Base Url Hint", - "supportedEndpointAudio": "Supported Endpoint Audio", - "supportedEndpointChat": "Supported Endpoint Chat", - "supportedEndpointEmbeddings": "Supported Endpoint Embeddings", - "supportedEndpointImages": "Supported Endpoint Images", - "supportedEndpointsLabel": "Supported Endpoints Label", - "tagGroupHint": "Tag Group Hint", - "tagGroupLabel": "Tag Group Label", - "tagGroupPlaceholder": "Tag Group Placeholder", - "testModel": "Test Model", - "testingModel": "Testing Model", - "toggleOffShort": "Toggle Off Short", - "toggleOnShort": "Toggle On Short", - "tokenExpiredBadge": "Token Expired Badge", - "tokenExpiredTitle": "Token Expired Title", - "tokenExpiresSoonTitle": "Token Expires Soon Title", - "tokenShort": "Token Short", - "totalKeysRotating": "{count, plural, one {1 key rotating} other {# keys rotating}}", - "unhideModel": "Unhide Model", - "upstreamProxyProviders": "Upstream Proxy Providers", - "validationModelIdHint": "Validation Model Id Hint", - "validationModelIdLabel": "Validation Model Id Label", - "validationModelIdPlaceholder": "Validation Model Id Placeholder", - "vertexServiceAccountPlaceholder": "Paste your Service Account JSON ({\"type\":\"service_account\",\"project_id\":\"…\",\"client_email\":\"…\",\"private_key\":\"…\"}) or an OAuth access_token", - "webCookieProviders": "Web Cookie Providers", - "weeklyShort": "Weekly Short", - "xiaomiMimoBaseUrlHint": "Xiaomi Mimo Base Url Hint", - "globalCodexServiceMode": "Global Codex service mode", - "connect": "Connect", - "manualApiKey": "Manual API key", - "addPat": "Add PAT", - "experimentalOauth": "Experimental OAuth", - "importAuth": "Import auth", - "importGrokAuth": "Import Grok Build auth", - "zedImportTitle": "Import from Zed Keychain", - "zedImportDescription": "Discover AI provider credentials (OpenAI, Anthropic, Google, Mistral, xAI) stored by Zed IDE in the OS keychain and import them as connections. Zed IDE must be installed on this machine.", - "zedImportButton": "__MISSING__:Import from Zed", - "zedImportFailed": "__MISSING__:Zed import failed", - "zedImportHint": "Zed Import Hint", - "zedImportNetworkError": "Zed Import Network Error", - "zedImportNone": "Zed Import None", + "searchByModel": "Buscar por modelo…", + "searchProvidersHeading": "Encabezado de búsqueda de proveedores", + "searxngBaseUrlHint": "Sugerencia de URL base de Searxng", + "searxngInfo": "Información de Searxng", + "sessionCookieLabel": "Etiqueta de cookie de sesión", + "showEmail": "Mostrar correo electrónico", + "snowflakeBaseUrlHint": "Sugerencia de URL base de Snowflake", + "supportedEndpointAudio": "Audio", + "supportedEndpointChat": "Chat", + "supportedEndpointEmbeddings": "Embeddings", + "supportedEndpointImages": "Imágenes", + "supportedEndpointsLabel": "Endpoints compatibles", + "tagGroupHint": "Sugerencia de grupo de etiquetas", + "tagGroupLabel": "Grupo de etiquetas", + "tagGroupPlaceholder": "Grupo de etiquetas", + "testModel": "Probar modelo", + "testingModel": "Probando modelo", + "toggleOffShort": "Desactivado", + "toggleOnShort": "Activado", + "tokenExpiredBadge": "Insignia de token caducado", + "tokenExpiredTitle": "Token caducado", + "tokenExpiresSoonTitle": "El token caduca pronto", + "tokenShort": "Token", + "totalKeysRotating": "{count, plural, one {1 clave rotando} other {# claves rotando}}", + "unhideModel": "Mostrar modelo", + "upstreamProxyProviders": "Proveedores de proxy ascendente", + "validationModelIdHint": "Modelo utilizado para verificar la clave de API. Déjalo en blanco para usar el primer modelo disponible del proveedor.", + "validationModelIdLabel": "Modelo de validación", + "validationModelIdPlaceholder": "p. ej., meta-llama/llama-3.1-8b-instruct", + "vertexServiceAccountPlaceholder": "Pega el JSON de tu cuenta de servicio ({\"type\":\"service_account\",\"project_id\":\"…\",\"client_email\":\"…\",\"private_key\":\"…\"}) o un access_token de OAuth", + "webCookieProviders": "Proveedores de cookies web", + "weeklyShort": "Semanal", + "xiaomiMimoBaseUrlHint": "Sugerencia de URL base de Xiaomi Mimo", + "globalCodexServiceMode": "Modo de servicio global de Codex", + "connect": "Conectar", + "manualApiKey": "Clave de API manual", + "addPat": "Añadir PAT", + "experimentalOauth": "OAuth experimental", + "importAuth": "Importar autenticación", + "importGrokAuth": "Importar autenticación de Grok Build", + "zedImportTitle": "Importar desde el llavero de Zed", + "zedImportDescription": "Detecta las credenciales de proveedores de IA (OpenAI, Anthropic, Google, Mistral, xAI) guardadas por Zed IDE en el llavero del SO e impórtalas como conexiones. Zed IDE debe estar instalado en este equipo.", + "zedImportButton": "Importar desde Zed", + "zedImportFailed": "Error al importar desde Zed", + "zedImportHint": "Sugerencia de importación de Zed", + "zedImportNetworkError": "Error de red al importar desde Zed", + "zedImportNone": "Sin importaciones de Zed", "zedImportSuccess": "Se han importado {credentials} credencial(es) de Zed para {providers} proveedor(es)", - "zedImporting": "__MISSING__:Importing…", - "zedNoCredentials": "No Zed credentials found in the keychain", - "zedUnsupportedCredentials": "Found {count} keychain credential(s), but none matched supported providers", - "zedManualTitle": "Manual Token Import", - "zedManualDescription": "Use this when OmniRoute runs in Docker or the keychain is unavailable. Paste the API key that Zed stored under ~/.config/zed/settings.json, or copy it from the Zed AI settings panel.", - "zedPasteApiKey": "Paste API key…", - "zedSaving": "Saving…", - "zedImportAction": "Import", - "zedManualImportFailed": "Manual import failed", - "zedManualImportSuccess": "Imported {provider} token from Zed", - "grokImportTitle": "Import Grok Build Auth", - "grokImportDescription": "Import your Grok Build ~/.grok/auth.json file. You can get it by running grok login in your terminal.", - "grokUploadFile": "Upload file", - "grokPasteJson": "Paste JSON", - "grokInvalidAuth": "This is not a valid Grok Build auth.json file. Expected an object with a key containing a JWT.", - "grokParseFailed": "Could not parse JSON", - "grokImportFailed": "Failed to import Grok Build auth", - "grokImportSuccess": "Grok Build connection imported successfully", - "grokValidToken": "Valid Grok Build token detected", - "grokRefreshIncluded": "Refresh token included — automatic token renewal is enabled", - "grokRefreshMissing": "No refresh token found — re-import after the token expires", - "grokConnectionName": "Connection name (optional)", - "grokSaving": "Saving…", - "grokSaveConnection": "Save Connection", - "freeTierProviders": "Proveedores de nivel gratuito", + "zedImporting": "Importando…", + "zedNoCredentials": "No se han encontrado credenciales de Zed en el llavero", + "zedUnsupportedCredentials": "Se han encontrado {count} credencial(es) en el llavero, pero ninguna coincide con los proveedores compatibles", + "zedManualTitle": "Importación manual de token", + "zedManualDescription": "Usa esta opción cuando OmniRoute se ejecute en Docker o el llavero no esté disponible. Pega la clave de API que Zed guardó en ~/.config/zed/settings.json o cópiala desde el panel de ajustes de Zed AI.", + "zedPasteApiKey": "Pega la clave de API…", + "zedSaving": "Guardando…", + "zedImportAction": "Importar", + "zedManualImportFailed": "Error en la importación manual", + "zedManualImportSuccess": "Token de Zed importado para {provider}", + "grokImportTitle": "Importar autenticación de Grok Build", + "grokImportDescription": "Importa tu archivo de autenticación de Grok Build ~/.grok/auth.json. Puedes obtenerlo ejecutando grok login en tu terminal.", + "grokUploadFile": "Subir archivo", + "grokPasteJson": "Pegar JSON", + "grokInvalidAuth": "Este no es un archivo auth.json de Grok Build válido. Se esperaba un objeto con una clave que contenga un JWT.", + "grokParseFailed": "No se ha podido analizar el JSON", + "grokImportFailed": "Error al importar la autenticación de Grok Build", + "grokImportSuccess": "Conexión de Grok Build importada correctamente", + "grokValidToken": "Se ha detectado un token de Grok Build válido", + "grokRefreshIncluded": "Token de actualización incluido; la renovación automática de tokens está activada", + "grokRefreshMissing": "No se ha encontrado ningún token de actualización; vuelve a importar después de que el token caduque", + "grokConnectionName": "Nombre de la conexión (opcional)", + "grokSaving": "Guardando…", + "grokSaveConnection": "Guardar conexión", + "freeTierProviders": "Proveedores con nivel gratuito", "freeTierLabel": "Nivel gratuito disponible", - "freeTierProvidersDesc": "Proveedores con niveles gratuitos: algunos requieren un registro de clave API, otros no necesitan ninguna credencial.", - "providerSummaryAll": "totales", - "ideProviders": "Proveedores IDE", - "ideProvidersDesc": "Editores con suscripción a IA incorporada. Utilice la página del proveedor para importar credenciales directamente desde el llavero IDE.", - "noIdeProviders": "Ningún proveedor IDE coincide con los filtros actuales.", - "providerDetailFastTierTooltip": "Aplicar el nivel Codex Fast a todas las conexiones Codex de forma predeterminada", - "providerDetailFastDefaultLabel": "predeterminado rápido", - "providerDetailBrowserManualConnect": "Navegador/conexión manual", + "freeTierProvidersDesc": "Proveedores con niveles gratuitos; algunos requieren registrarse para obtener una clave de API y otros no necesitan ninguna credencial.", + "providerSummaryAll": "Totales", + "ideProviders": "Proveedores de IDE", + "ideProvidersDesc": "Editores con suscripción de IA integrada. Utiliza la página del proveedor para importar credenciales directamente desde el llavero del IDE.", + "noIdeProviders": "Ningún proveedor de IDE coincide con los filtros actuales.", + "providerDetailFastTierTooltip": "Aplicar el nivel rápido de Codex a todas las conexiones de Codex de forma predeterminada", + "providerDetailFastDefaultLabel": "Predeterminado rápido", + "providerDetailBrowserManualConnect": "Conexión manual/navegador", "providerDetailAuthUrl": "URL de autenticación", "providerDetailCallbackUrl": "URL de devolución de llamada", - "providerDetailValidClaudeCredentialsFile": "Archivo de credenciales Claude válido", - "providerDetailPathAutoDetectedAllOs": "La ruta se detecta automáticamente por sistema operativo (Linux/Mac/Windows).", - "providerDetailMyClaudeAccountPlaceholder": "Mi cuenta Claude", - "providerDetailPathAutoDetected": "La ruta se detecta automáticamente por sistema operativo (Linux/Mac).", - "compatBlockedParamsPlaceholder": "thinking, … (comma-separated)", - "compatAllowedParamsPlaceholder": "reasoning, … (comma-separated)", - "compatSaving": "saving…", - "paramFiltersBlockedPlaceholder": "thinking, reasoning_budget, … (comma-separated)", - "paramFiltersAllowedPlaceholder": "reasoning, … (comma-separated)", - "customGatewayNamePlaceholder": "My Gateway", - "inherit": "Inherit", - "claudeImportEntryName": "entry {number}", - "claudeImportParseError": "parse error", - "claudeImportNoValidEntries": "No valid entries to import", - "webFetch": "Web Fetch", - "webFetchTooltip": "Providers that extract content from web URLs (HTML → Markdown, scrape, screenshot)", - "webFetchProvidersHeading": "Web Fetch Providers", - "compatibleProvidersDesc": "OpenAI-compatible and Anthropic-compatible endpoints you host or configure. Point any OpenAI SDK to your own URL and route requests here.", - "oauthProvidersDesc": "Providers authenticated via OAuth — sign in once and OmniRoute handles token rotation automatically.", - "webCookieProvidersDesc": "Estos proveedores utilizan sesiones web del navegador, cookies o tokens web en lugar de claves API. Abra un proveedor para agregar la credencial de sesión requerida.", - "apiKeyProvidersDesc": "Standard API key providers. Add your key once and OmniRoute routes, retries, and rate-limits on your behalf.", - "noAuthProvidersDesc": "Open endpoints that require no credentials — ready to use immediately without any sign-up.", - "upstreamProxyProvidersDesc": "Route outbound traffic through an upstream proxy before it reaches the provider. Useful for corporate networks or traffic inspection.", - "webFetchProvidersDesc": "Providers that fetch and extract content from web URLs. Use them to ground prompts with live web data.", - "aggregatorsGatewaysDesc": "Multi-provider aggregators and AI gateways that expose a single unified API across dozens of underlying models.", - "enterpriseCloudDesc": "Enterprise-tier and cloud-hosted models with enhanced SLAs, compliance certifications, and dedicated capacity.", - "cloudAgentProvidersDesc": "Autonomous cloud agents that execute long-running tasks with plan approval and live status tracking.", - "localProvidersDesc": "Self-hosted models running on your own hardware. No data leaves your infrastructure.", - "searchProvidersDesc": "Web and document search providers. Attach them to LLM calls for Retrieval-Augmented Generation.", - "audioProvidersDesc": "Text-to-speech and speech-to-text providers for voice I/O and audio transcription pipelines.", - "embeddingRerankProvidersDesc": "Vector embedding and reranking providers for semantic search, RAG pipelines, and similarity scoring.", - "imageProvidersDesc": "Image generation and vision providers — create images from text or analyse existing ones.", - "videoProvidersDesc": "Video generation providers. Create short video clips from text prompts or images.", + "providerDetailValidClaudeCredentialsFile": "Archivo de credenciales de Claude válido", + "providerDetailPathAutoDetectedAllOs": "La ruta se detecta automáticamente según el SO (Linux/Mac/Windows).", + "providerDetailMyClaudeAccountPlaceholder": "Mi cuenta de Claude", + "providerDetailPathAutoDetected": "La ruta se detecta automáticamente según el SO (Linux/Mac).", + "compatBlockedParamsPlaceholder": "thinking, … (separados por comas)", + "compatAllowedParamsPlaceholder": "reasoning, … (separados por comas)", + "compatSaving": "guardando…", + "paramFiltersBlockedPlaceholder": "thinking, reasoning_budget, … (separados por comas)", + "paramFiltersAllowedPlaceholder": "reasoning, … (separados por comas)", + "customGatewayNamePlaceholder": "Mi pasarela", + "inherit": "Heredar", + "claudeImportEntryName": "entrada {number}", + "claudeImportParseError": "error de análisis", + "claudeImportNoValidEntries": "No hay entradas válidas para importar", + "webFetch": "Obtención web", + "webFetchTooltip": "Proveedores que extraen contenido de URLs web (HTML → Markdown, extracción, captura de pantalla)", + "webFetchProvidersHeading": "Proveedores de Web Fetch", + "compatibleProvidersDesc": "Endpoints compatibles con OpenAI y Anthropic que alojas o configuras. Dirige cualquier SDK de OpenAI a tu propia URL y enruta las solicitudes aquí.", + "oauthProvidersDesc": "Proveedores autenticados mediante OAuth: inicia sesión una vez y OmniRoute gestionará la rotación de tokens automáticamente.", + "webCookieProvidersDesc": "Estos proveedores utilizan sesiones web del navegador, cookies o tokens web en lugar de claves API. Abre un proveedor para añadir la credencial de sesión requerida.", + "apiKeyProvidersDesc": "Proveedores estándar de clave de API. Añade tu clave una vez y OmniRoute se encargará del enrutamiento, los reintentos y la limitación de velocidad en tu nombre.", + "noAuthProvidersDesc": "Endpoints abiertos que no requieren credenciales; listos para usar de inmediato sin ningún registro.", + "upstreamProxyProvidersDesc": "Enruta el tráfico saliente a través de un proxy ascendente antes de que llegue al proveedor. Útil para redes corporativas o inspección de tráfico.", + "webFetchProvidersDesc": "Proveedores que obtienen y extraen contenido de URLs web. Úsalos para fundamentar prompts con datos web en directo.", + "aggregatorsGatewaysDesc": "Agregadores multiproveedor y pasarelas de IA que exponen una única API unificada en docenas de modelos subyacentes.", + "enterpriseCloudDesc": "Modelos de nivel empresarial y alojados en la nube con SLA mejorados, certificaciones de cumplimiento y capacidad dedicada.", + "cloudAgentProvidersDesc": "Agentes en la nube autónomos que ejecutan tareas de larga duración con aprobación de planes y seguimiento de estado en directo.", + "localProvidersDesc": "Modelos autoalojados que se ejecutan en tu propio hardware. Ningún dato abandona tu infraestructura.", + "searchProvidersDesc": "Proveedores de búsqueda web y de documentos. Adjúntalos a llamadas de LLM para la generación aumentada por recuperación (RAG).", + "audioProvidersDesc": "Proveedores de conversión de texto a voz y de voz a texto para E/S de voz y pipelines de transcripción de audio.", + "embeddingRerankProvidersDesc": "Proveedores de embeddings vectoriales y reordenamiento para búsqueda semántica, pipelines de RAG y puntuación de similitud.", + "imageProvidersDesc": "Proveedores de generación de imágenes y visión: crea imágenes a partir de texto o analiza las existentes.", + "videoProvidersDesc": "Proveedores de generación de vídeo. Crea clips de vídeo cortos a partir de prompts de texto o imágenes.", "onboardingWizard": "Asistente de incorporación de proveedores", "onboardingWizardShort": "Asistente de incorporación", - "onboardingWizardDescription": "Conecte proveedores de clave API, compatibles personalizados y OAuth con validación, persistencia y una prueba de conexión inmediata.", + "onboardingWizardDescription": "Conecta proveedores de claves de API, compatibles personalizados y OAuth con validación, persistencia y una prueba de conexión inmediata.", "onboardingStepType": "Tipo", "onboardingStepProvider": "Proveedor", "onboardingStepCredentials": "Credenciales", "onboardingStepResult": "Resultado", - "onboardingTypeApiKeyTitle": "Proveedor de claves API", - "onboardingTypeApiKeyText": "Utilice proveedores integrados como OpenAI, Anthropic, Gemini, Groq, Azure y más.", + "onboardingTypeApiKeyTitle": "Proveedor de clave de API", + "onboardingTypeApiKeyText": "Utiliza proveedores integrados como OpenAI, Anthropic, Gemini, Groq, Azure, entre otros.", "onboardingTypeCustomTitle": "Proveedor compatible personalizado", - "onboardingTypeCustomText": "Cree un punto final compatible con OpenAI, Anthropic o Claude Code y agregue su clave.", - "onboardingTypeOAuthTitle": "Proveedor de OAuth", - "onboardingTypeOAuthText": "Reutilice los flujos de importación locales, de código de dispositivo o de OAuth existentes para los proveedores de codificación.", - "onboardingChooseOAuthProvider": "Elija un proveedor de OAuth", - "onboardingChooseApiKeyProvider": "Elija un proveedor de claves API", - "onboardingChooseProviderDescription": "Seleccione un proveedor y luego el asistente lo guiará a través de las credenciales y las pruebas.", - "onboardingChangeType": "Tipo de cambio", + "onboardingTypeCustomText": "Crea un endpoint compatible con OpenAI, Anthropic o Claude Code y añade su clave.", + "onboardingTypeOAuthTitle": "Proveedor OAuth", + "onboardingTypeOAuthText": "Reutiliza los flujos existentes de OAuth, código de dispositivo o importación local para proveedores de código.", + "onboardingChooseOAuthProvider": "Elige un proveedor OAuth", + "onboardingChooseApiKeyProvider": "Elige un proveedor de clave de API", + "onboardingChooseProviderDescription": "Selecciona un proveedor y el asistente te guiará a través de las credenciales y las pruebas.", + "onboardingChangeType": "Cambiar tipo", "onboardingChangeProvider": "Cambiar proveedor", - "onboardingSearchProviders": "Proveedores de búsqueda…", - "onboardingApiKeyOptional": "Clave API opcional", + "onboardingSearchProviders": "Buscar proveedores…", + "onboardingApiKeyOptional": "Clave de API opcional", "onboardingProviderConnected": "Proveedor conectado", "onboardingProviderSavedWithWarnings": "Proveedor guardado con advertencias", - "onboardingProviderFinished": "Incorporación de proveedores finalizada", - "onboardingYourProviderConnection": "Conexión de tu proveedor", + "onboardingProviderFinished": "Incorporación de proveedor finalizada", + "onboardingYourProviderConnection": "La conexión de tu proveedor", "onboardingTestPassed": "Prueba superada", "onboardingTestFailed": "Prueba fallida", "onboardingOpenProviderDetails": "Abrir detalles del proveedor", - "onboardingTryInPlayground": "Pruébalo en el patio de recreo", - "onboardingDefaultConnectionName": "{provider} Primario", - "onboardingTestingConnection": "Probando la conexión del proveedor...", + "onboardingTryInPlayground": "Probar en el playground", + "onboardingDefaultConnectionName": "{provider} principal", + "onboardingTestingConnection": "Probando la conexión del proveedor…", "onboardingValidatingCredentials": "Validando credenciales…", - "onboardingSavingConnection": "Guardando conexión de proveedor…", - "onboardingProviderFailed": "Falló la incorporación del proveedor", + "onboardingSavingConnection": "Guardando la conexión del proveedor…", + "onboardingProviderFailed": "Error en la incorporación del proveedor", "onboardingCreatingCompatibleProvider": "Creando proveedor compatible…", - "onboardingSavingCompatibleConnection": "Guardando conexión de proveedor compatible...", + "onboardingSavingCompatibleConnection": "Guardando la conexión del proveedor compatible…", "onboardingCustomProviderFallbackName": "Proveedor personalizado", - "onboardingCustomProviderFailed": "Falló la incorporación del proveedor personalizado", + "onboardingCustomProviderFailed": "Error en la incorporación del proveedor personalizado", "onboardingLoadingOAuthConnection": "Cargando conexión OAuth…", - "onboardingOAuthNoConnectionFound": "OAuth finalizó, pero no se encontró ninguna conexión de proveedor.", - "onboardingOAuthFailed": "Error al incorporar OAuth", + "onboardingOAuthNoConnectionFound": "OAuth finalizó, pero no se ha encontrado ninguna conexión de proveedor.", + "onboardingOAuthFailed": "Error en la incorporación de OAuth", "onboardingAddProvider": "Añadir {provider}", - "onboardingConnectionName": "Nombre de conexión", - "onboardingApiKeyOptionalLabel": "Clave API (opcional)", + "onboardingConnectionName": "Nombre de la conexión", + "onboardingApiKeyOptionalLabel": "Clave de API (opcional)", "onboardingBaseUrlOverride": "Anulación de URL base", - "onboardingBaseUrlOverrideHint": "Opcional. Almacenado como proveedorSpecificData.baseUrl.", + "onboardingBaseUrlOverrideHint": "Opcional. Se almacena como proveedorSpecificData.baseUrl.", "onboardingRegion": "Región", - "onboardingSearchCx": "Buscar CX / ID del motor", - "onboardingProviderSpecificIdPlaceholder": "Identificación opcional específica del proveedor", - "onboardingCustomUserAgent": "Agente de usuario personalizado", + "onboardingSearchCx": "Search CX / ID del motor", + "onboardingProviderSpecificIdPlaceholder": "ID opcional específico del proveedor", + "onboardingCustomUserAgent": "User-Agent personalizado", "onboardingWorking": "Trabajando…", "onboardingValidateSaveTest": "Validar, guardar y probar", "onboardingBack": "Atrás", "onboardingCreateCustomCompatibleProvider": "Crear proveedor compatible personalizado", - "onboardingCreateCustomCompatibleDescription": "El asistente primero crea un nodo de proveedor, luego almacena y prueba su conexión de clave API.", + "onboardingCreateCustomCompatibleDescription": "El asistente crea primero un nodo de proveedor y, a continuación, almacena y prueba su conexión mediante clave de API.", "onboardingProtocol": "Protocolo", "onboardingOpenAiCompatible": "Compatible con OpenAI", "onboardingAnthropicCompatible": "Compatible con Anthropic", - "onboardingClaudeCodeCompatible": "Compatible con el Código Claude", + "onboardingClaudeCodeCompatible": "Compatible con Claude Code", "onboardingProviderPrefix": "Prefijo de proveedor", - "onboardingProviderPrefixHint": "Se utiliza para generar la identificación del proveedor administrado.", + "onboardingProviderPrefixHint": "Se utiliza para generar el ID del proveedor gestionado.", "onboardingChatPath": "Ruta de chat", "onboardingModelsPath": "Ruta de modelos", "onboardingCreateSaveTest": "Crear, guardar y probar", "onboardingConnectProvider": "Conectar {provider}", - "onboardingOAuthFlowDescription": "OmniRoute abrirá el flujo OAuth existente para este proveedor. Después de iniciar sesión, el asistente recarga la conexión guardada y ejecuta la misma prueba de conexión que la página del proveedor.", - "onboardingStartOAuthFlow": "Iniciar flujo de OAuth", + "onboardingOAuthFlowDescription": "OmniRoute abrirá el flujo OAuth existente para este proveedor. Tras iniciar sesión, el asistente recargará la conexión guardada y ejecutará la misma prueba de conexión que en la página del proveedor.", + "onboardingStartOAuthFlow": "Iniciar flujo OAuth", "onboardingProviderDescriptions": { - "360ai": "Get API key at ai.360.cn", - "agentrouter": "Get $200 free credits at https://agentrouter.org/register — no credit card required.", - "agnes": "Get API key at agnes-ai.com", - "aimlapi": "Free tier paused (2026) — AI/ML API is now pay-as-you-go only (min $20 top-up); no recurring free credits.", - "ai21": "$10 trial credits on signup (valid 3 months), no credit card required", - "alibaba": "Connect Alibaba with an API key.", - "alibaba-cn": "Connect Alibaba (China) with an API key.", - "bailian-coding-plan": "Connect Alibaba Coding Plan with an API key.", - "bedrock": "Native Bedrock integration: model discovery uses Bedrock foundation models and inference profiles, while chat uses the regional Bedrock Runtime Converse/ConverseStream APIs.", - "anthropic": "Connect Anthropic with an API key.", - "ant-ling": "Register and create an API key at the Ant Ling API console (https://chat.ant-ling.com/open), then paste it here. OmniRoute routes chat traffic to https://api.ant-ling.com/v1/chat/completions; the provider is OpenAI-compatible and also exposes an Anthropic-compatible surface.", - "api-airforce": "Get your API key from https://panel.api.airforce — OpenAI-compatible endpoint at https://api.airforce/v1", - "arcee-ai": "Get API key at arcee.ai", - "azure-ai": "Foundry uses the OpenAI v1 surface with deployment names as models. OmniRoute normalizes root resource URLs to the v1 chat and /models endpoints.", - "azure-openai": "Use your Azure OpenAI API key. Base URL should be your resource endpoint, for example https://my-resource.openai.azure.com.", - "bai": "Bearer API key for the b.ai OpenAI-compatible LLM gateway (distinct from TheB.AI). Create a key at https://docs.b.ai, then use https://api.b.ai/v1 as the OpenAI-compatible base URL.", - "baichuan": "Get API key at platform.baichuan-ai.com", - "baidu": "Get API key at console.bce.baidu.com", - "qianfan": "Use a Qianfan API key from Baidu AI Cloud. The default endpoint is OpenAI-compatible v2.", - "baseten": "$30 free trial credits for GPU inference", - "bazaarlink": "Create a free API key at https://bazaarlink.ai — model 'auto:free' routes to zero-cost inference. All models use the provider/model-name format, e.g. xiaomi/mimo-v2.5-pro.", - "black-forest-labs": "Connect Black Forest Labs with an API key.", - "blackbox": "Free tier: unlimited basic chat plus Minimax-M2.5, no credit card required", - "bluesminds": "Get your API key at https://www.bluesminds.com — OpenAI-compatible endpoint at https://api.bluesminds.com/v1 with free daily credits. VIP models (Claude Opus 4.5, Gemini 2.5 Pro) consume pi credits.", - "byteplus": "Connect BytePlus ModelArk with an API key.", - "bytez": "$1 free credits, refreshes every 4 weeks", - "cerebras": "Free Trial: 1M tokens/day, 30K TPM, 5 RPM — no credit card.", - "charm-hyper": "Create an API key at https://hyper.charm.land, then paste it here as a Bearer token.", - "chutes": "Bearer API key for the Chutes OpenAI-compatible gateway.", - "clarifai": "Clarifai exposes OpenAI-compatible chat, responses and /models on /v2/ext/openai/v1. Public/community models typically require a PAT; app-scoped keys only work for resources inside that app.", - "cloudflare-ai": "Requires API Token AND Account ID (found at dash.cloudflare.com)", - "clova-studio": "CLOVA Studio (HyperCLOVA X) is OpenAI-compatible on /v1/openai. OmniRoute probes /v1/openai/models and routes chat traffic to /v1/openai/chat/completions. Uses the current clovastudio.stream.ntruss.com host — the legacy clovastudio.apigw.ntruss.com endpoint is being deprecated.", - "codestral": "Connect Codestral with an API key.", - "cohere": "Free Trial: 1,000 API calls/month for testing, no credit card required", - "command-code": "Create or copy an API key from Command Code, then paste it here as a Bearer token.", - "coze": "Get API key at coze.com/open/api", - "crof": "Connect CrofAI with an API key.", - "databricks": "Connect Databricks with an API key.", - "datarobot": "The default gateway catalogs active models from /genai/llmgw/catalog/. Deployment URLs are also supported for direct OpenAI-compatible chat requests.", - "deepinfra": "Free signup credits for API testing and model exploration", - "deepseek": "5M free tokens on signup - no credit card required", - "dgrid": "Create a DGrid API key at https://dgrid.ai, then use https://api.dgrid.ai/v1 as the OpenAI-compatible base URL.", - "dify": "Get API key from your Dify instance.", - "digitalocean": "Connect DigitalOcean with an API key.", - "dit": "dit.ai (Distributed Intelligence Trade) is an OpenAI-compatible router/gateway with dynamic per-request pricing, exposing /v1/chat/completions at https://api.dit.ai/v1. OmniRoute uses the OpenAI protocol; spend/savings analytics live in the dit.ai dashboard.", - "doubao": "Get API key at console.volcengine.com", - "empower": "Empower exposes OpenAI-compatible chat on https://app.empower.dev/api/v1 with tool-calling support on empower-functions.", - "factory": "Get your Factory API key at https://app.factory.ai/settings/api-keys, then paste it as a Bearer token. OpenAI-compatible endpoint at https://api.factory.ai/v1.", - "fal-ai": "Connect Fal.ai with an API key.", - "featherless-ai": "Free tier available — no credit card required", - "fenayai": "Bearer API key for the FenayAI OpenAI-compatible gateway.", - "firecrawl": "Connect Firecrawl with an API key.", - "fireworks": "$1 free starter credits on signup for API testing", - "freeaiapikey": "Discounted API proxy for 40+ models including GPT-5, Claude Opus 4.6, Claude Sonnet 4.6, Qwen 3.5. Get your API key at https://freeaiapikey.com/dashboard. Base URL: https://freeaiapikey.com/v1.", - "freemodel-dev": "Get $300 free API credits at https://freemodel.dev — no payment info required. OpenAI-compatible endpoint. GPT-5.4 and GPT-5.5 models available.", - "friendliai": "Free tier for serverless inference — no credit card required", - "gemini": "Free forever: 1,500 req/day for Gemini 2.5 Flash — no credit card, get key at aistudio.google.com", - "gigachat": "Connect GigaChat (Sber) with an API key.", - "github-models": "Create a GitHub PAT with 'models: read' scope at github.com/settings/tokens", - "gitlab": "GitLab personal access token for the public Code Suggestions API. Configure a self-hosted base URL when not using gitlab.com.", - "gitlawb-gmi": "Get your API key from Gitlawb Opengateway dashboard.", - "gitlawb": "Get your API key from Gitlawb Opengateway dashboard.", - "glm": "Connect GLM Coding with an API key.", - "glm-cn": "Connect GLM Coding (China) with an API key.", - "glmt": "Preset GLM profile with higher token budget, thinking enabled, and longer timeout.", - "getgoapi": "Connect GoAPI with an API key.", - "groq": "Free tier: 30 RPM / 14.4K RPD — no credit card", - "hackclub": "Sign in with your Hack Club account at ai.hackclub.com.", - "haiper": "Get API key at haiper.ai/haiper-api", - "heroku": "Connect Heroku AI with an API key.", - "hcnsec": "Get API key at api.hcnsec.cn", - "huggingface": "Free Inference API for thousands of models (Whisper, VITS, SDXL…)", - "hyperbolic": "$1-5 trial credits on signup for serverless inference", - "watsonx": "The watsonx model gateway exposes OpenAI-compatible /chat/completions and /models under /ml/gateway/v1.", - "ideogram": "Get API key at ideogram.ai/docs/api", - "iflytek": "Get API key at console.xfyun.cn", - "inception": "Inception Labs is OpenAI-compatible at https://api.inceptionlabs.ai/v1. mercury-2 is the first diffusion LLM (dLLM) in the catalog — 5-10x faster generation than comparable autoregressive models, with tool calling, json_mode, and structured outputs.", - "inference-net": "$25 free credits on signup plus research grants available", - "internlm": "Free monthly quota ~1M input / 3M output tokens (~10 RPM)", - "jina-ai": "Bearer API key for the Jina AI rerank API.", - "jina-reader": "Connect Jina Reader with an API key.", - "kenari": "Kenari exposes an OpenAI-compatible chat completions endpoint at https://kenari.id/v1/chat/completions, plus a live /v1/models catalog covering Claude, GPT, DeepSeek, GLM, Kimi and more. OmniRoute uses the OpenAI protocol and lists models via passthrough.", - "kie": "Connect KIE.AI with an API key.", - "kilo-gateway": "Connect Kilo Gateway with an API key.", - "kimi": "Connect Kimi with an API key.", - "kimi-coding-apikey": "Connect Kimi Coding (API Key) with an API key.", - "lambda-ai": "Connect Lambda AI with an API key.", - "laozhang": "Connect LaoZhang AI with an API key.", - "leonardo": "Get API key at leonardo.ai/developer", - "liquid": "Get API key at liquid.ai", - "llamagate": "Connect LlamaGate with an API key.", - "llm7": "Works without API key (use 'unused' as key). Get free token at token.llm7.io for higher limits.", - "longcat": "Free: one-time 10M-token grant after account signup + KYC verification (LongCat-2.0). One-time only — not a recurring daily/monthly allowance.", - "maritalk": "Connect Maritalk with an API key.", - "meta-llama": "Connect Meta Llama API with an API key.", - "minimax-cn": "Connect Minimax (China) with an API key.", - "minimax": "Connect Minimax Coding with an API key.", - "mistral": "Free Experiment tier: rate-limited access to all models, no credit card required", - "modal": "Modal commonly serves user-hosted OpenAI-compatible apps on /v1. OmniRoute will probe /v1/models and route chat traffic to /v1/chat/completions.", - "modelscope": "Free tier via ModelScope API-Inference — Alibaba account required.", - "monsterapi": "Get API key at monsterapi.ai", - "moonshot": "Connect Kimi with an API key.", - "morph": "Free tier: 250K credits/month, $0", - "nanogpt": "Connect NanoGPT with an API key.", - "nebius": "~$1 trial credits on signup for API testing", - "nlpcloud": "NLP Cloud uses a proprietary chatbot API instead of OpenAI chat/completions. OmniRoute adapts OpenAI messages to input/context/history and exposes a local catalog of supported chatbot models.", - "nomic": "Get API key at atlas.nomic.ai", - "nous-research": "Nous exposes an OpenAI-compatible /v1 surface with a large remote /models catalog. The /chat/completions endpoint requires a valid API key for programmatic inference.", - "novita": "$0.50 trial credits on signup (valid about 1 year)", - "nscale": "$5 free credits on signup for inference testing", - "nube": "Connect Nube.sh with an API key.", - "nvidia": "Free dev access: ~40 RPM, 70+ models (Kimi K2.5, GLM 4.7, DeepSeek V3.2...)", - "oci": "OCI exposes OpenAI-compatible chat and responses endpoints. Project ID is optional in OmniRoute but may be required for Responses and agentic workflows.", - "ollama-cloud": "Connect Ollama Cloud with an API key.", - "openadapter": "OpenAdapter exposes an OpenAI-compatible chat completions endpoint at https://api.openadapter.in/v1/chat/completions, aggregating 70+ open-source models (DeepSeek, Qwen, Kimi, MiniMax, GLM, Llama, Mistral, …). OmniRoute uses the OpenAI protocol.", - "openai": "Connect OpenAI with an API key.", - "opencode-go": "Connect OpenCode Go with an API key.", - "opencode-zen": "Connect OpenCode Zen with an API key.", - "openrouter": "Free models at $0/token with :free suffix - 20 RPM / 200 RPD", - "openvecta": "Free credits on signup for OpenAI-compatible inference across LLMs, embeddings, and reasoning models", - "orcarouter": "Create an API key (starts with sk-orca-) at https://www.orcarouter.ai, then paste it as a Bearer token. OpenAI-compatible endpoint at https://api.orcarouter.ai/v1.", - "ovhcloud": "Connect OVHcloud AI with an API key.", - "perplexity": "Connect Perplexity with an API key.", - "piapi": "Connect PiAPI with an API key.", - "pioneer": "$75 free usage credits — no credit card required", - "plamo": "PLaMo is OpenAI-compatible at https://api.platform.preferredai.jp/v1. Built by Preferred Networks and optimized for Japanese. Docs are primarily in Japanese.", - "poe": "Poe exposes OpenAI-compatible chat and responses on https://api.poe.com/v1, with authenticated balance checks on /usage/current_balance.", - "pollinations": "Free keyless tier: openai, openai-fast, openai-large, qwen-coder, mistral, deepseek, grok, gemini-flash-lite-3.1, perplexity-fast, perplexity-reasoning. Premium models (claude, gemini, midijourney) require a Pollinations API key from enter.pollinations.ai.", - "publicai": "Requires an API key — one-time signup credit, then paid", - "puter": "Get token at puter.com/dashboard → Copy Auth Token", - "qiniu": "Create a Qiniu AI inference API key at https://portal.qiniu.com/ai-inference/api-key, then paste it here as a Bearer token. OpenAI-compatible endpoint at https://api.qnaigc.com/v1, proxying DeepSeek, Claude, Kimi and more behind one key.", - "recraft": "Connect Recraft with an API key.", - "reka": "Reka Chat is OpenAI-compatible on /v1. OmniRoute probes /v1/models and routes chat traffic to /v1/chat/completions.", - "requesty": "Create an API key at https://app.requesty.ai, then paste it here as a Bearer token. OpenAI-compatible endpoint at https://router.requesty.ai/v1, with a live /v1/models catalog.", - "runwayml": "Runway video generation is task-based. OmniRoute submits text-to-video or image-to-video jobs, polls /v1/tasks/[id], and normalizes the finished video outputs back into the OpenAI-like /v1/videos/generations response.", - "sambanova": "$5 free credits on signup (30-day validity), no credit card required", - "sap": "Model discovery uses /v2/lm/scenarios/foundation-models/models on AI_API_URL. Chat requests use deploymentUrl/chat/completions and require AI-Resource-Group.", - "sarvam": "Sarvam AI is OpenAI-compatible on /v1. OmniRoute probes /v1/models and routes chat traffic to /v1/chat/completions. Models are tuned for Indic languages.", - "scaleway": "1M free tokens for new accounts — EU/GDPR compliant (Paris), Qwen3 235B & Llama 70B", - "sensenova": "Get API key at platform.sensenova.cn", - "siliconflow": "$1 free credits plus permanently free models after identity verification", - "snowflake": "Connect Snowflake Cortex with an API key.", - "sparkdesk": "Get API key at console.xfyun.cn", - "stability-ai": "Connect Stability AI with an API key.", - "stepfun": "Get API key at platform.stepfun.com", - "sumopod": "SumoPod exposes an OpenAI-compatible chat completions endpoint at https://ai.sumopod.com/v1/chat/completions, plus a live /v1/models catalog. OmniRoute uses the OpenAI protocol and lists models via passthrough.", - "suno": "Paste session cookie from suno.ai (Clerk auth)", - "synthetic": "Connect Synthetic with an API key.", - "tencent": "Get API key at console.cloud.tencent.com", - "thebai": "Bearer API key for the TheB.AI OpenAI-compatible gateway.", - "tinyfish": "X-API-Key from agent.tinyfish.ai/api-keys", - "together": "Connect Together AI with an API key.", - "tokenrouter": "TokenRouter exposes an OpenAI-compatible chat completions endpoint at https://api.tokenrouter.com/v1/chat/completions, plus a working /v1/models catalog. OmniRoute uses the OpenAI protocol.", - "topaz": "Connect Topaz with an API key.", - "typhoon": "Typhoon is OpenAI-compatible on /v1. Built by SCB 10X (Thailand); typhoon-v2.5-30b-a3b-instruct is a thai-first, multilingual model.", - "udio": "Paste session cookie from udio.com (Supabase auth)", - "uncloseai": "No auth required. API accepts any non-empty string as key for identification.", - "upstage": "Connect Upstage with an API key.", - "v0-vercel": "Connect v0 (Vercel) with an API key.", - "venice": "Connect Venice.ai with an API key.", - "vercel-ai-gateway": "Connect Vercel AI Gateway with an API key.", - "vertex": "Provide Service Account JSON or OAuth access_token", - "vertex-partner": "Provide the same Service Account JSON used for Vertex AI partner models.", - "volcengine": "Connect Volcengine with an API key.", - "voyage-ai": "Bearer API key for Voyage AI embeddings and rerank APIs.", - "wafer": "API key from https://wafer.ai", - "wandb": "Connect Weights & Biases Inference with an API key.", - "writer": "Writer Palmyra is OpenAI-compatible at https://api.writer.com/v1. palmyra-x5 offers a 1M-token context window.", - "x5lab": "X5Lab exposes an OpenAI-compatible chat completions endpoint at https://api.x5lab.dev/v1/chat/completions, plus a live /v1/models catalog. OmniRoute uses the OpenAI protocol and lists models via passthrough.", - "xai": "Connect xAI (Grok) with an API key.", - "xiaomi-mimo": "Connect Xiaomi MiMo with an API key.", - "yi": "Get API key at platform.lingyiwanwu.com", - "zai": "API key from https://open.bigmodel.cn/usercenter/apikeys", - "zenmux": "ZenMux exposes an OpenAI-compatible chat completions endpoint at /api/v1/chat/completions, plus Anthropic Messages (/api/anthropic/v1/messages) and Google Gemini (/api/vertex-ai) protocol surfaces. OmniRoute uses the OpenAI protocol.", - "galadriel": "Connect Galadriel with an API key.", - "predibase": "$25 free trial credits (30-day validity)", - "chenzk": "OpenAI-compatible gateway with a live model catalog at chenzk.top.", - "freepik": "Generate images with Freepik's Mystic API.", - "freetheai": "Free OpenAI-compatible gateway with passthrough model support.", - "g4f-gemini": "Free no-key g4f.space reverse proxy to Gemini, limited to 5 requests per minute.", - "g4f-groq": "Free no-key g4f.space reverse proxy to Groq, limited to 5 requests per minute.", - "g4f-nvidia": "Free no-key g4f.space reverse proxy to NVIDIA NIM, limited to 5 requests per minute.", - "g4f-ollama": "Free no-key hosted Ollama gateway from g4f.space, limited to 5 requests per minute.", - "g4f-pollinations": "Free no-key g4f.space reverse proxy to Pollinations, limited to 5 requests per minute.", - "mixedbread": "Create embeddings with the Mixedbread API.", - "segmind": "Generate images and videos with Segmind's hosted models.", - "amazon-q": "Uses the same AWS Builder ID or imported refresh-token flow as Kiro, but keeps Amazon Q connections separate.", - "antigravity": "Connect Antigravity with the existing OAuth flow.", - "agy": "Import your Antigravity CLI (`agy`) login (paste/upload its token file), auto-detect a local CLI login, or sign in with Google. Shares the Antigravity backend (incl. Claude models).", - "claude": "Connect Claude Code with the existing OAuth flow.", - "cline": "Connect Cline with the existing OAuth flow.", - "cursor": "Connect Cursor IDE with the existing OAuth flow.", - "github": "Connect GitHub Copilot with the existing OAuth flow.", - "gitlab-duo": "OAuth application with ai_features + read_user scopes. Configure GITLAB_DUO_OAUTH_CLIENT_ID and optionally GITLAB_DUO_OAUTH_CLIENT_SECRET on this OmniRoute instance.", - "kilocode": "Connect Kilo Code with the existing OAuth flow.", - "kimi-coding": "Connect Kimi Coding with the existing OAuth flow.", - "kiro": "Free tier: 50 credits/month (~25K–100K tokens). ⚠️ Kiro ToS prohibits third-party proxy/harness use.", - "codex": "Connect OpenAI Codex with the existing OAuth flow.", - "qwen": "Connect Qwen Code with the existing OAuth flow." + "360ai": "Obtén tu clave de API en ai.360.cn", + "agentrouter": "Obtén 200 $ en créditos gratuitos en https://agentrouter.org/register; no se requiere tarjeta de crédito.", + "agnes": "Obtén tu clave de API en agnes-ai.com", + "aimlapi": "Nivel gratuito en pausa (2026). AI/ML API solo funciona bajo demanda (recarga mínima de 20 $); no hay créditos gratuitos recurrentes.", + "ai21": "10 $ en créditos de prueba al registrarte (válidos durante 3 meses), no se requiere tarjeta de crédito.", + "alibaba": "Conecta Alibaba con una clave de API.", + "alibaba-cn": "Conecta Alibaba (China) con una clave de API.", + "bailian-coding-plan": "Conecta Alibaba Coding Plan con una clave de API.", + "bedrock": "Integración nativa con Bedrock: la detección de modelos utiliza modelos base y perfiles de inferencia de Bedrock, mientras que el chat utiliza las APIs regionales Bedrock Runtime Converse/ConverseStream.", + "anthropic": "Conecta Anthropic con una clave de API.", + "ant-ling": "Regístrate y crea una clave de API en la consola de Ant Ling API (https://chat.ant-ling.com/open) y pégala aquí. OmniRoute enruta el tráfico de chat a https://api.ant-ling.com/v1/chat/completions; el proveedor es compatible con OpenAI y también expone una interfaz compatible con Anthropic.", + "api-airforce": "Obtén tu clave de API en https://panel.api.airforce; endpoint compatible con OpenAI en https://api.airforce/v1", + "arcee-ai": "Obtén tu clave de API en arcee.ai", + "azure-ai": "Foundry utiliza la interfaz OpenAI v1 con nombres de despliegue como modelos. OmniRoute normaliza las URLs de recursos raíz a los endpoints v1 chat y /models.", + "azure-openai": "Utiliza tu clave de API de Azure OpenAI. La URL base debe ser el endpoint de tu recurso, por ejemplo: https://my-resource.openai.azure.com.", + "bai": "Clave de API Bearer para la pasarela LLM de b.ai compatible con OpenAI (distinta de TheB.AI). Crea una clave en https://docs.b.ai y utiliza https://api.b.ai/v1 como URL base compatible con OpenAI.", + "baichuan": "Obtén tu clave de API en platform.baichuan-ai.com", + "baidu": "Obtén tu clave de API en console.bce.baidu.com", + "qianfan": "Utiliza una clave de API de Qianfan de Baidu AI Cloud. El endpoint predeterminado es compatible con OpenAI v2.", + "baseten": "30 $ en créditos de prueba gratuitos para inferencia en GPU.", + "bazaarlink": "Crea una clave de API gratuita en https://bazaarlink.ai; el modelo 'auto:free' enruta a inferencia sin coste. Todos los modelos utilizan el formato proveedor/nombre-del-modelo, p. ej., xiaomi/mimo-v2.5-pro.", + "black-forest-labs": "Conecta Black Forest Labs con una clave de API.", + "blackbox": "Nivel gratuito: chat básico ilimitado más Minimax-M2.5, no se requiere tarjeta de crédito.", + "bluesminds": "Obtén tu clave de API en https://www.bluesminds.com; endpoint compatible con OpenAI en https://api.bluesminds.com/v1 con créditos diarios gratuitos. Los modelos VIP (Claude Opus 4.5, Gemini 2.5 Pro) consumen créditos pi.", + "byteplus": "Conecta BytePlus ModelArk con una clave de API.", + "bytez": "1 $ en créditos gratuitos, se renuevan cada 4 semanas.", + "cerebras": "Prueba gratuita: 1M de tokens/día, 30K TPM, 5 RPM; no se requiere tarjeta de crédito.", + "charm-hyper": "Crea una clave de API en https://hyper.charm.land y pégala aquí como token Bearer.", + "chutes": "Clave de API Bearer para la pasarela de Chutes compatible con OpenAI.", + "clarifai": "Clarifai expone chat, respuestas y /models compatibles con OpenAI en /v2/ext/openai/v1. Los modelos públicos/comunitarios suelen requerir un PAT; las claves con ámbito de aplicación solo funcionan para recursos dentro de esa aplicación.", + "cloudflare-ai": "Requiere API Token Y Account ID (disponibles en dash.cloudflare.com).", + "clova-studio": "CLOVA Studio (HyperCLOVA X) es compatible con OpenAI en /v1/openai. OmniRoute sondea /v1/openai/models y enruta el tráfico de chat a /v1/openai/chat/completions. Utiliza el host actual clovastudio.stream.ntruss.com; el endpoint heredado clovastudio.apigw.ntruss.com está siendo retirado.", + "codestral": "Conecta Codestral con una clave de API.", + "cohere": "Prueba gratuita: 1000 llamadas a la API al mes para pruebas, no se requiere tarjeta de crédito.", + "command-code": "Crea o copia una clave de API de Command Code y pégala aquí como token Bearer.", + "coze": "Obtén tu clave de API en coze.com/open/api", + "crof": "Conecta CrofAI con una clave de API.", + "databricks": "Conecta Databricks con una clave de API.", + "datarobot": "La pasarela predeterminada cataloga los modelos activos desde /genai/llmgw/catalog/. También se admiten URLs de despliegue para solicitudes de chat directas compatibles con OpenAI.", + "deepinfra": "Créditos de registro gratuitos para pruebas de API y exploración de modelos.", + "deepseek": "5M de tokens gratuitos al registrarte; no se requiere tarjeta de crédito.", + "dgrid": "Crea una clave de API de DGrid en https://dgrid.ai y utiliza https://api.dgrid.ai/v1 como URL base compatible con OpenAI.", + "dify": "Obtén la clave de API de tu instancia de Dify.", + "digitalocean": "Conecta DigitalOcean con una clave de API.", + "dit": "dit.ai (Distributed Intelligence Trade) es un router/pasarela compatible con OpenAI con precios dinámicos por solicitud, que expone /v1/chat/completions en https://api.dit.ai/v1. OmniRoute utiliza el protocolo OpenAI; los análisis de gasto/ahorro se encuentran en el panel de dit.ai.", + "doubao": "Obtén tu clave de API en console.volcengine.com", + "empower": "Empower expone chat compatible con OpenAI en https://app.empower.dev/api/v1 con soporte para llamadas a herramientas en empower-functions.", + "factory": "Obtén tu clave de API de Factory en https://app.factory.ai/settings/api-keys y pégala como token Bearer. Endpoint compatible con OpenAI en https://api.factory.ai/v1.", + "fal-ai": "Conecta Fal.ai con una clave de API.", + "featherless-ai": "Nivel gratuito disponible; no se requiere tarjeta de crédito.", + "fenayai": "Clave de API Bearer para la pasarela de FenayAI compatible con OpenAI.", + "firecrawl": "Conecta Firecrawl con una clave de API.", + "fireworks": "1 $ en créditos de inicio gratuitos al registrarte para pruebas de API.", + "freeaiapikey": "Proxy de API con descuento para más de 40 modelos, incluidos GPT-5, Claude Opus 4.6, Claude Sonnet 4.6 y Qwen 3.5. Obtén tu clave de API en https://freeaiapikey.com/dashboard. URL base: https://freeaiapikey.com/v1.", + "freemodel-dev": "Obtén 300 $ en créditos de API gratuitos en https://freemodel.dev; no se requiere información de pago. Endpoint compatible con OpenAI. Modelos GPT-5.4 y GPT-5.5 disponibles.", + "friendliai": "Nivel gratuito para inferencia serverless; no se requiere tarjeta de crédito.", + "gemini": "Gratis para siempre: 1500 solicitudes/día para Gemini 2.5 Flash; no se requiere tarjeta de crédito, obtén la clave en aistudio.google.com", + "gigachat": "Conecta GigaChat (Sber) con una clave de API.", + "github-models": "Crea un PAT de GitHub con el ámbito 'models: read' en github.com/settings/tokens", + "gitlab": "Token de acceso personal de GitLab para la API pública de Code Suggestions. Configura una URL base autohospedada si no utilizas gitlab.com.", + "gitlawb-gmi": "Obtén tu clave de API en el panel de Gitlawb Opengateway.", + "gitlawb": "Obtén tu clave de API en el panel de Gitlawb Opengateway.", + "glm": "Conecta GLM Coding con una clave de API.", + "glm-cn": "Conecta GLM Coding (China) con una clave de API.", + "glmt": "Perfil GLM preestablecido con mayor presupuesto de tokens, razonamiento activado y tiempo de espera más largo.", + "getgoapi": "Conecta GoAPI con una clave de API.", + "groq": "Nivel gratuito: 30 RPM / 14.4K RPD; no se requiere tarjeta de crédito.", + "hackclub": "Inicia sesión con tu cuenta de Hack Club en ai.hackclub.com.", + "haiper": "Obtén tu clave de API en haiper.ai/haiper-api", + "heroku": "Conecta Heroku AI con una clave de API.", + "hcnsec": "Obtén tu clave de API en api.hcnsec.cn", + "huggingface": "API de inferencia gratuita para miles de modelos (Whisper, VITS, SDXL…)", + "hyperbolic": "1-5 $ en créditos de prueba al registrarte para inferencia serverless.", + "watsonx": "La pasarela de modelos watsonx expone /chat/completions y /models compatibles con OpenAI bajo /ml/gateway/v1.", + "ideogram": "Obtén tu clave de API en ideogram.ai/docs/api", + "iflytek": "Obtén tu clave de API en console.xfyun.cn", + "inception": "Inception Labs es compatible con OpenAI en https://api.inceptionlabs.ai/v1. mercury-2 es el primer LLM de difusión (dLLM) en el catálogo: generación 5-10 veces más rápida que modelos autorregresivos comparables, con llamadas a herramientas, json_mode y salidas estructuradas.", + "inference-net": "25 $ en créditos gratuitos al registrarte, además de becas de investigación disponibles.", + "internlm": "Cuota mensual gratuita de ~1M de tokens de entrada / 3M de salida (~10 RPM).", + "jina-ai": "Clave de API Bearer para la API de rerank de Jina AI.", + "jina-reader": "Conecta Jina Reader con una clave de API.", + "kenari": "Kenari expone un endpoint de chat completions compatible con OpenAI en https://kenari.id/v1/chat/completions, además de un catálogo /v1/models en vivo que cubre Claude, GPT, DeepSeek, GLM, Kimi y más. OmniRoute utiliza el protocolo OpenAI y lista los modelos mediante passthrough.", + "kie": "Conecta KIE.AI con una clave de API.", + "kilo-gateway": "Conecta Kilo Gateway con una clave de API.", + "kimi": "Conecta Kimi con una clave de API.", + "kimi-coding-apikey": "Conecta Kimi Coding (API Key) con una clave de API.", + "lambda-ai": "Conecta Lambda AI con una clave de API.", + "laozhang": "Conecta LaoZhang AI con una clave de API.", + "leonardo": "Obtén tu clave de API en leonardo.ai/developer", + "liquid": "Obtén tu clave de API en liquid.ai", + "llamagate": "Conecta LlamaGate con una clave de API.", + "llm7": "Funciona sin clave de API (usa 'unused' como clave). Obtén un token gratuito en token.llm7.io para límites más altos.", + "longcat": "Gratis: concesión única de 10M de tokens tras el registro de cuenta + verificación KYC (LongCat-2.0). Solo una vez; no es una asignación diaria/mensual recurrente.", + "maritalk": "Conecta Maritalk con una clave de API.", + "meta-llama": "Conecta Meta Llama API con una clave de API.", + "minimax-cn": "Conecta Minimax (China) con una clave de API.", + "minimax": "Conecta Minimax Coding con una clave de API.", + "mistral": "Nivel de experimento gratuito: acceso limitado por tasa a todos los modelos, no se requiere tarjeta de crédito.", + "modal": "Modal suele servir aplicaciones compatibles con OpenAI alojadas por el usuario en /v1. OmniRoute sondeará /v1/models y enrutará el tráfico de chat a /v1/chat/completions.", + "modelscope": "Nivel gratuito mediante ModelScope API-Inference (se requiere cuenta de Alibaba).", + "monsterapi": "Obtén una clave de API en monsterapi.ai", + "moonshot": "Conecta Kimi con una clave de API.", + "morph": "Nivel gratuito: 250 mil créditos al mes, 0 $", + "nanogpt": "Conecta NanoGPT con una clave de API.", + "nebius": "Créditos de prueba de ~1 $ al registrarse para realizar pruebas de API", + "nlpcloud": "NLP Cloud utiliza una API de chatbot propietaria en lugar de chat/completions de OpenAI. OmniRoute adapta los mensajes de OpenAI a entrada/contexto/historial y expone un catálogo local de modelos de chatbot compatibles.", + "nomic": "Obtén una clave de API en atlas.nomic.ai", + "nous-research": "Nous expone una interfaz /v1 compatible con OpenAI con un amplio catálogo remoto de /models. El endpoint /chat/completions requiere una clave de API válida para la inferencia programática.", + "novita": "Créditos de prueba de 0,50 $ al registrarse (válidos durante aproximadamente 1 año)", + "nscale": "Créditos gratuitos de 5 $ al registrarse para pruebas de inferencia", + "nube": "Conecta Nube.sh con una clave de API.", + "nvidia": "Acceso gratuito para desarrolladores: ~40 RPM, más de 70 modelos (Kimi K2.5, GLM 4.7, DeepSeek V3.2...)", + "oci": "OCI expone endpoints de chat y respuestas compatibles con OpenAI. El ID de proyecto es opcional en OmniRoute, pero puede ser necesario para las respuestas y los workflows agénticos.", + "ollama-cloud": "Conecta Ollama Cloud con una clave de API.", + "openadapter": "OpenAdapter expone un endpoint de completados de chat compatible con OpenAI en https://api.openadapter.in/v1/chat/completions, que agrupa más de 70 modelos de código abierto (DeepSeek, Qwen, Kimi, MiniMax, GLM, Llama, Mistral, …). OmniRoute utiliza el protocolo de OpenAI.", + "openai": "Conecta OpenAI con una clave de API.", + "opencode-go": "Conecta OpenCode Go con una clave de API.", + "opencode-zen": "Conecta OpenCode Zen con una clave de API.", + "openrouter": "Modelos gratuitos a 0 $/token con el sufijo :free - 20 RPM / 200 RPD", + "openvecta": "Créditos gratuitos al registrarse para inferencia compatible con OpenAI en LLMs, embeddings y modelos de razonamiento", + "orcarouter": "Crea una clave de API (empieza por sk-orca-) en https://www.orcarouter.ai y, a continuación, pégala como token Bearer. Endpoint compatible con OpenAI en https://api.orcarouter.ai/v1.", + "ovhcloud": "Conecta OVHcloud AI con una clave de API.", + "perplexity": "Conecta Perplexity con una clave de API.", + "piapi": "Conecta PiAPI con una clave de API.", + "pioneer": "Créditos de uso gratuito de 75 $ (no se requiere tarjeta de crédito)", + "plamo": "PLaMo es compatible con OpenAI en https://api.platform.preferredai.jp/v1. Desarrollado por Preferred Networks y optimizado para japonés. La documentación está principalmente en japonés.", + "poe": "Poe expone chat y respuestas compatibles con OpenAI en https://api.poe.com/v1, con comprobaciones de saldo autenticadas en /usage/current_balance.", + "pollinations": "Nivel gratuito sin clave: openai, openai-fast, openai-large, qwen-coder, mistral, deepseek, grok, gemini-flash-lite-3.1, perplexity-fast, perplexity-reasoning. Los modelos prémium (claude, gemini, midijourney) requieren una clave de API de Pollinations de enter.pollinations.ai.", + "publicai": "Requiere una clave de API: crédito único de registro, después de pago", + "puter": "Obtén el token en puter.com/dashboard → Copy Auth Token", + "qiniu": "Crea una clave de API de inferencia de IA de Qiniu en https://portal.qiniu.com/ai-inference/api-key y, a continuación, pégala aquí como token Bearer. Endpoint compatible con OpenAI en https://api.qnaigc.com/v1, haciendo proxy de DeepSeek, Claude, Kimi y más con una sola clave.", + "recraft": "Conecta Recraft con una clave de API.", + "reka": "Reka Chat es compatible con OpenAI en /v1. OmniRoute explora /v1/models y enruta el tráfico de chat a /v1/chat/completions.", + "requesty": "Crea una clave de API en https://app.requesty.ai y, a continuación, pégala aquí como token Bearer. Endpoint compatible con OpenAI en https://router.requesty.ai/v1, con un catálogo de /v1/models en directo.", + "runwayml": "La generación de vídeo de Runway se basa en tareas. OmniRoute envía trabajos de texto a vídeo o imagen a vídeo, sondea /v1/tasks/[id] y normaliza los resultados de vídeo finalizados para devolverlos en la respuesta /v1/videos/generations similar a la de OpenAI.", + "sambanova": "Créditos gratuitos de 5 $ al registrarse (validez de 30 días), no se requiere tarjeta de crédito", + "sap": "El descubrimiento de modelos utiliza /v2/lm/scenarios/foundation-models/models en AI_API_URL. Las solicitudes de chat utilizan deploymentUrl/chat/completions y requieren AI-Resource-Group.", + "sarvam": "Sarvam AI es compatible con OpenAI en /v1. OmniRoute explora /v1/models y enruta el tráfico de chat a /v1/chat/completions. Los modelos están optimizados para idiomas índicos.", + "scaleway": "1 millón de tokens gratuitos para cuentas nuevas (cumplimiento de la normativa europea de protección de datos en París), Qwen3 235B y Llama 70B", + "sensenova": "Obtén una clave de API en platform.sensenova.cn", + "siliconflow": "Créditos gratuitos de 1 $ y modelos gratuitos de forma permanente tras la verificación de identidad", + "snowflake": "Conecta Snowflake Cortex con una clave de API.", + "sparkdesk": "Obtén una clave de API en console.xfyun.cn", + "stability-ai": "Conecta Stability AI con una clave de API.", + "stepfun": "Obtén una clave de API en platform.stepfun.com", + "sumopod": "SumoPod expone un endpoint de completados de chat compatible con OpenAI en https://ai.sumopod.com/v1/chat/completions, además de un catálogo de /v1/models en directo. OmniRoute utiliza el protocolo de OpenAI y enumera los modelos mediante transferencia directa (passthrough).", + "suno": "Pega la cookie de sesión de suno.ai (autenticación de Clerk)", + "synthetic": "Conecta Synthetic con una clave de API.", + "tencent": "Obtén una clave de API en console.cloud.tencent.com", + "thebai": "Clave de API Bearer para la pasarela compatible con OpenAI de TheB.AI.", + "tinyfish": "X-API-Key de agent.tinyfish.ai/api-keys", + "together": "Conecta Together AI con una clave de API.", + "tokenrouter": "TokenRouter expone un endpoint de completados de chat compatible con OpenAI en https://api.tokenrouter.com/v1/chat/completions, además de un catálogo de /v1/models operativo. OmniRoute utiliza el protocolo de OpenAI.", + "topaz": "Conecta Topaz con una clave de API.", + "typhoon": "Typhoon es compatible con OpenAI en /v1. Desarrollado por SCB 10X (Tailandia); typhoon-v2.5-30b-a3b-instruct es un modelo multilingüe diseñado inicialmente para el tailandés.", + "udio": "Pega la cookie de sesión de udio.com (autenticación de Supabase)", + "uncloseai": "No se requiere autenticación. La API acepta cualquier cadena que no esté vacía como clave para la identificación.", + "upstage": "Conecta Upstage con una clave de API.", + "v0-vercel": "Conecta v0 (Vercel) con una clave de API.", + "venice": "Conecta Venice.ai con una clave de API.", + "vercel-ai-gateway": "Conecta Vercel AI Gateway con una clave de API.", + "vertex": "Proporciona el JSON de la cuenta de servicio o el access_token de OAuth", + "vertex-partner": "Proporciona el mismo JSON de cuenta de servicio utilizado para los modelos asociados de Vertex AI.", + "volcengine": "Conecta Volcengine con una clave de API.", + "voyage-ai": "Clave de API Bearer para las API de embeddings y reordenación (rerank) de Voyage AI.", + "wafer": "Clave de API de https://wafer.ai", + "wandb": "Conecta Weights & Biases Inference con una clave de API.", + "writer": "Writer Palmyra es compatible con OpenAI en https://api.writer.com/v1. palmyra-x5 ofrece una ventana de contexto de 1 millón de tokens.", + "x5lab": "X5Lab expone un endpoint de completados de chat compatible con OpenAI en https://api.x5lab.dev/v1/chat/completions, además de un catálogo de /v1/models en directo. OmniRoute utiliza el protocolo de OpenAI y enumera los modelos mediante transferencia directa (passthrough).", + "xai": "Conecta xAI (Grok) con una clave de API.", + "xiaomi-mimo": "Conecta Xiaomi MiMo con una clave de API.", + "yi": "Obtén una clave de API en platform.lingyiwanwu.com", + "zai": "Clave de API de https://open.bigmodel.cn/usercenter/apikeys", + "zenmux": "ZenMux expone un endpoint de completados de chat compatible con OpenAI en /api/v1/chat/completions, además de superficies de protocolo de Anthropic Messages (/api/anthropic/v1/messages) y Google Gemini (/api/vertex-ai). OmniRoute utiliza el protocolo de OpenAI.", + "galadriel": "Conecta Galadriel con una clave de API.", + "predibase": "Créditos de prueba gratuita de 25 $ (validez de 30 días)", + "chenzk": "Pasarela compatible con OpenAI con un catálogo de modelos en directo en chenzk.top.", + "freepik": "Genera imágenes con la API Mystic de Freepik.", + "freetheai": "Pasarela gratuita compatible con OpenAI con compatibilidad con modelos de transferencia directa (passthrough).", + "g4f-gemini": "Proxy inverso gratuito sin clave de g4f.space a Gemini, limitado a 5 solicitudes por minuto.", + "g4f-groq": "Proxy inverso gratuito sin clave de g4f.space a Groq, limitado a 5 solicitudes por minuto.", + "g4f-nvidia": "Proxy inverso gratuito sin clave de g4f.space a NVIDIA NIM, limitado a 5 solicitudes por minuto.", + "g4f-ollama": "Pasarela de Ollama alojada gratuita sin clave de g4f.space, limitada a 5 solicitudes por minuto.", + "g4f-pollinations": "Proxy inverso gratuito sin clave de g4f.space a Pollinations, limitado a 5 solicitudes por minuto.", + "mixedbread": "Crea embeddings con la API de Mixedbread.", + "segmind": "Genera imágenes y vídeos con los modelos alojados de Segmind.", + "amazon-q": "Utiliza el mismo ID de AWS Builder o flujo de token de actualización importado que Kiro, pero mantiene las conexiones de Amazon Q separadas.", + "antigravity": "Conecta Antigravity con el flujo de OAuth existente.", + "agy": "Importa tu inicio de sesión de la CLI de Antigravity (`agy`) (pega/sube su archivo de token), detecta automáticamente un inicio de sesión de la CLI local o inicia sesión con Google. Comparte el backend de Antigravity (incluidos los modelos de Claude).", + "claude": "Conecta Claude Code con el flujo de OAuth existente.", + "cline": "Conecta Cline con el flujo de OAuth existente.", + "cursor": "Conecta Cursor IDE con el flujo de OAuth existente.", + "github": "Conecta GitHub Copilot con el flujo de OAuth existente.", + "gitlab-duo": "Aplicación OAuth con los ámbitos ai_features + read_user. Configura GITLAB_DUO_OAUTH_CLIENT_ID y, opcionalmente, GITLAB_DUO_OAUTH_CLIENT_SECRET en esta instancia de OmniRoute.", + "kilocode": "Conecta Kilo Code con el flujo de OAuth existente.", + "kimi-coding": "Conecta Kimi Coding con el flujo de OAuth existente.", + "kiro": "Nivel gratuito: 50 créditos/mes (~25K-100K tokens). ⚠️ Los términos de servicio de Kiro prohíben el uso de proxies/arneses de terceros.", + "codex": "Conecta OpenAI Codex con el flujo de OAuth existente.", + "qwen": "Conecta Qwen Code con el flujo de OAuth existente." }, - "passthroughModelsDescription": "{provider} acepta ID de modelo nativo del proveedor. Importe desde /models o agregue ID personalizados para enrutamiento.", - "bedrockModelsDescription": "Los modelos de Amazon Bedrock tienen como alcance la región de AWS. Importe desde /models o agregue ID de modelo Bedrock habilitados en la región seleccionada.", - "bedrockModelPlaceholder": "antrópico.claude-soneto-4-6", - "addProviderSessionCookieTitle": "Agregar cookie de sesión {provider}", - "openWebProviderSite": "Open {host}", - "addProviderWebTokenTitle": "Agregar token web {provider}", - "addProviderConnectionTitle": "Agregar conexión {provider}", - "webTokenCredentialLabel": "token de sesión web", + "passthroughModelsDescription": "{provider} acepta IDs de modelo nativos del proveedor. Importa desde /models o añade IDs personalizados para el enrutamiento.", + "bedrockModelsDescription": "Los modelos de Amazon Bedrock están acotados por región de AWS. Importa desde /models o añade IDs de modelo de Bedrock habilitados en la región seleccionada.", + "bedrockModelPlaceholder": "anthropic.claude-sonnet-4-6", + "addProviderSessionCookieTitle": "Añadir cookie de sesión de {provider}", + "openWebProviderSite": "Abrir {host}", + "addProviderWebTokenTitle": "Añadir token web de {provider}", + "addProviderConnectionTitle": "Añadir conexión de {provider}", + "webTokenCredentialLabel": "Token de sesión web", "webNoAuthCredentialLabel": "No se requiere credencial", - "webCookieCredentialHint": "Cookie requerida: {credential}. Pegue el valor del encabezado de Cookie de su propia sesión web {provider} que haya iniciado sesión. No incluya el prefijo Cookie:.", - "webTokenCredentialHint": "Credencial: {credential}. Pegue el valor del token de su propia sesión web {provider} iniciada o una exportación HAR de DevTools si el proveedor lo admite.", - "webCookieEditHint": "Déjelo en blanco para conservar la cookie de la sesión actual. Cookie requerida: {credential}.", - "webTokenEditHint": "Déjelo en blanco para conservar el token de la sesión web actual. Credencial: {credential}.", + "webCookieCredentialHint": "Cookie requerida: {credential}. Pega el valor del encabezado Cookie de tu propia sesión web de {provider} con la sesión iniciada. No incluyas el prefijo Cookie:.", + "webTokenCredentialHint": "Credencial: {credential}. Pega el valor del token de tu propia sesión web de {provider} con la sesión iniciada, o una exportación HAR de DevTools si el proveedor lo admite.", + "webCookieEditHint": "Déjalo en blanco para conservar la cookie de sesión actual. Cookie requerida: {credential}.", + "webTokenEditHint": "Déjalo en blanco para conservar el token de sesión web actual. Credencial: {credential}.", "webSessionGuideTitle": "Cómo obtener la credencial de sesión", - "webSessionGuideIntro": "{provider} utiliza una sesión web del navegador en lugar de una clave API.", + "webSessionGuideIntro": "{provider} utiliza una sesión web de navegador en lugar de una clave de API.", "webCookieRequiredCredential": "Cookie requerida: {credential}", "webTokenRequiredCredential": "Token requerido: {credential}", "webSessionGuideStep1": "Inicie sesión en {provider} en su navegador.", "webSessionGuideStep2": "Abra las herramientas de desarrollo del navegador e inspeccione una solicitud realizada por la aplicación web.", "webSessionGuideStep3": "Copie la credencial requerida del propio dominio del proveedor. Para las cookies, copie solo el valor del encabezado Cookie y omita Cookie:.", - "webSessionGuideStep4": "Pégalo aquí y comprueba la conexión. Si deja de funcionar, inicie sesión nuevamente y reemplácelo con un valor nuevo.", + "webSessionGuideStep4": "Péguelo aquí y compruebe la conexión. Si deja de funcionar, inicie sesión nuevamente y reemplácelo con un valor nuevo.", "webSessionSecurityHint": "Trate esto como una contraseña: puede acceder a su cuenta web iniciada hasta que caduque o sea revocada.", "webNoAuthGuideTitle": "No se requiere credencial", - "webNoAuthGuideBody": "{provider} no necesita una clave API ni una cookie. Guarde la conexión para utilizar su punto final web gratuito.", - "webSessionCredentialValidationFailed": "Error en la validación de credenciales de sesión. Inicie sesión nuevamente, copie una credencial nueva e inténtelo nuevamente.", - "checkCookie": "comprobar galleta", - "checkWebToken": "ficha de cheque", - "huggingchatLabel": "HuggingChat (Free)", - "huggingchatDesc": "Free LLM chat via huggingface.co/chat", + "webNoAuthGuideBody": "{provider} no necesita una clave de API ni una cookie. Guarde la conexión para utilizar su endpoint web gratuito.", + "webSessionCredentialValidationFailed": "Error en la validación de credenciales de sesión. Inicie sesión nuevamente, copie una credencial nueva e inténtelo de nuevo.", + "checkCookie": "Comprobar cookie", + "checkWebToken": "Comprobar token", + "huggingchatLabel": "HuggingChat (Gratis)", + "huggingchatDesc": "Chat LLM gratuito vía huggingface.co/chat", "poeWebLabel": "Poe Web", - "poeWebDesc": "Multi-model chat via poe.com", + "poeWebDesc": "Chat multimodelo vía poe.com", "veniceWebLabel": "Venice Web", - "veniceWebDesc": "Privacy-focused AI chat", + "veniceWebDesc": "Chat de IA centrado en la privacidad", "v0VercelWebLabel": "v0 Vercel Web", - "v0VercelWebDesc": "AI code generation via v0.dev", + "v0VercelWebDesc": "Generación de código mediante IA vía v0.dev", "kimiWebLabel": "Kimi Web", - "kimiWebDesc": "Moonshot AI consumer chat via www.kimi.com (international, Connect-RPC API)", + "kimiWebDesc": "Chat de consumo de Moonshot AI vía www.kimi.com (internacional, Connect-RPC API)", "doubaoWebLabel": "Dola Web", - "doubaoWebDesc": "ByteDance AI chat via dola.com", - "overrideBaseUrlAdvanced": "Advanced: override base URL", - "overrideBaseUrlHint": "Advanced: point this built-in provider at a custom endpoint. Leave blank to use the default.", - "bulkAddFormatHintCloudflare": "One key per line. Format: name|accountId|apiKey (Cloudflare account ID + API token).", - "lmarenaWebCookieHint": "Open arena.ai, sign in, then copy the full Cookie header from a Network request. Include arena-auth-prod-v1.0 and arena-auth-prod-v1.1 (and further chunks if present), preferably with cf_clearance. Do not paste only the empty arena-auth-prod-v1 cookie. Optional: providerSpecificData.recaptchaV3Token if create-evaluation still returns 403.", - "kimiOfficialSupporterBadge": "Official Supporter", - "kimiOfficialSupporterTooltip": "Kimi (Moonshot AI) is an official OmniRoute launch partner", + "doubaoWebDesc": "Chat de IA de ByteDance vía dola.com", + "overrideBaseUrlAdvanced": "Avanzado: sobrescribir URL base", + "overrideBaseUrlHint": "Avanzado: apunte este proveedor integrado a un endpoint personalizado. Déjelo en blanco para usar el predeterminado.", + "bulkAddFormatHintCloudflare": "Una clave por línea. Formato: name|accountId|apiKey (ID de cuenta de Cloudflare + clave de API).", + "lmarenaWebCookieHint": "Abra arena.ai, inicie sesión y copie el encabezado Cookie completo de una solicitud de red. Incluya arena-auth-prod-v1.0 y arena-auth-prod-v1.1 (y fragmentos adicionales si los hay), preferiblemente con cf_clearance. No pegue solo la cookie vacía arena-auth-prod-v1. Opcional: providerSpecificData.recaptchaV3Token si create-evaluation sigue devolviendo 403.", + "kimiOfficialSupporterBadge": "Colaborador fundador", + "kimiOfficialSupporterTooltip": "Kimi (Moonshot AI) es un Open Source Friend fundador de OmniRoute", "cheaperInferenceSupporterBadge": "Amigo del código abierto", "cheaperInferenceSupporterTooltip": "Cheaper Inference apoya a OmniRoute como amigo del código abierto", - "kimiPartnerLinkNote": "Partner link — supports OmniRoute at no extra cost to you", + "kimiPartnerLinkNote": "Enlace de socio: apoya a OmniRoute sin coste adicional para usted", "ccAliasSectionTitle": "__MISSING__:Expose in Claude Code (claude/…)", "ccAliasSectionHint": "__MISSING__:Advertise this provider's models under claude/<provider>/<model> mirror ids so Claude Code's gateway model discovery can list them. Off by default — enabling this doubles catalog entries for all clients.", "ccAliasProviderLevelLabel": "__MISSING__:Provider default", @@ -5995,98 +5997,98 @@ "ccAliasSaveError": "__MISSING__:Failed to save discovery-alias setting: {error}" }, "settings": { - "title": "Configuración", - "general": "generales", + "title": "Ajustes", + "general": "General", "security": "Seguridad", "appearance": "Apariencia", "routing": "Enrutamiento", - "cache": "caché", + "cache": "Caché", "resilience": "Resiliencia", - "description": "Description", - "enable": "Enable", - "disable": "Disable", - "update": "Update", - "routingSettingsIntro": "Controla cómo se enrutan, transforman y envían sus solicitudes a proveedores de IA.", + "description": "Descripción", + "enable": "Habilitar", + "disable": "Deshabilitar", + "update": "Actualizar", + "routingSettingsIntro": "Controla cómo se enrutan, transforman y envían sus solicitudes a los proveedores de IA.", "routingOpDropParagraphContainsLabel": "Descartar párrafo (contiene)", "routingOpDropParagraphStartsWithLabel": "Descartar párrafo (empieza por)", "routingOpReplaceTextLabel": "Reemplazar texto", "routingOpReplaceRegexLabel": "Reemplazar expresión regular", "routingOpDropBlockContainsLabel": "Descartar bloque (contiene)", - "routingOpPrependSystemBlockLabel": "Prepend system block", - "routingOpAppendSystemBlockLabel": "Append system block", - "routingOpInjectBillingHeaderLabel": "Inject billing header", - "routingOpObfuscateWordsLabel": "Obfuscate words (ZWJ)", - "routingOpDropParagraphContainsDesc": "Removes any paragraph (text block split on blank lines) inside the system prompt whose text contains ANY of the listed substrings. Use to strip third-party client fingerprints like 'github.com/anomalyco/opencode' or 'docs.openwebui.com' that Anthropic's classifier flags.", - "routingOpDropParagraphStartsWithDesc": "Removes any paragraph that STARTS WITH one of the listed prefixes. Use for identity lines like 'You are OpenCode' or 'You are Open WebUI' that announce the calling client.", - "routingOpReplaceTextDesc": "Replaces a literal substring with another literal substring. Use for known trigger phrases — e.g. rewrite 'Here is some useful information about the environment you are running in:' to 'Environment context you are running in:' (an empirically-validated trigger phrase).", - "routingOpReplaceRegexDesc": "Replaces text matching a regular expression. Use when you need patterns (character classes, optional whitespace, anchors) instead of literal substrings. A malformed pattern is caught at runtime when the op runs.", - "routingOpDropBlockContainsDesc": "Removes ENTIRE system blocks (not just paragraphs) whose text contains any of the listed substrings. Use when a whole block is fingerprint-bearing and you want it gone — e.g. an injected MCP-server description.", - "routingOpPrependSystemBlockDesc": "Inserts a new text block at the FRONT of the system array. Use to add the SDK identity 'You are a Claude agent, built on Anthropic's Claude Agent SDK.' that Anthropic's classifier expects.", - "routingOpAppendSystemBlockDesc": "Inserts a new text block at the END of the system array. Use for cosmetic additions that don't need to be at position [0].", - "routingOpInjectBillingHeaderDesc": "Prepends the special 'x-anthropic-billing-header: cc_version=...; cc_entrypoint=...; cch=...;' text block that Anthropic's classifier validates. Required for CC bridge relay endpoints; for the native claude provider OmniRoute already injects its own billing line so this op is usually redundant there.", - "routingOpObfuscateWordsDesc": "Inserts a Zero-Width-Joiner character after the first letter of each listed word, so 'opencode' becomes 'o‍pencode'. Reads identical to humans but bypasses classifier word matches. Targets system blocks, user/assistant messages, and tool descriptions.", - "routingNeedlesHint": "List of substrings. A paragraph matches if it contains ANY one of them. Add one per line via 'Add entry'.", - "routingPrefixesHint": "List of strings. A paragraph matches if it starts with any one of them (leading whitespace is trimmed before matching).", - "routingCaseSensitiveHint": "When ON, 'OpenCode' and 'opencode' are different strings. When OFF (default), the comparison ignores case.", - "routingMatchLiteralHint": "Exact literal substring to find. No regex syntax — special chars like . * ? are treated as themselves.", - "routingReplacementTextHint": "Replacement string. Leave blank to delete the match. The output preserves surrounding text.", - "routingAllOccurrencesHint": "When ON (default), every instance is replaced. When OFF, only the first match is replaced.", - "routingPatternHint": "JavaScript regex source. Don't wrap in slashes — just 'foo(.*)bar'. Server rejects patterns that fail to compile.", - "routingRegexFlagsHint": "JavaScript regex flags (g = all matches, i = case-insensitive, s = dot matches newline, m = multiline). Default 'g'.", - "routingBlockTextHint": "Full text of the new system block. Use a literal string; the system block stores text only.", - "routingIdempotencyKeyHint": "Optional. If set, the op skips when a block whose text starts with this key is already present. Prevents double-prepend on retries.", - "routingBillingEntrypointHint": "Value injected as 'cc_entrypoint='. Anthropic accepts 'sdk-cli' (Agent SDK), 'cli' (Claude Code CLI), or other documented values.", - "routingBillingVersionFormatHint": "How the 3-char build hash after cc_version= is computed. 'ex-machina' = sha256 of CCH_SALT+chars-from-first-user-msg+version (per-message). 'omniroute-daystamp' = sha256 of YYYY-MM-DD+version (stable per-day).", - "routingBillingCchAlgoHint": "How the 5-char cch= token is computed. 'sha256-first-user' = sha256 of first user message text. 'xxhash64-body' = body-level signing fills it later. 'static-zero' = literal '00000' placeholder.", - "routingObfuscateWordsHint": "Lowercase words to obfuscate. ZWJ insertion is applied case-insensitively, so 'opencode' also matches 'OpenCode' and 'OPENCODE'.", - "routingObfuscateTargetsHint": "Which body regions to scan for the words: system blocks, user/assistant messages, and/or tool descriptions.", - "routingObfuscateTargetsLabel": "Targets", - "routingSummarizeDropParagraphContains": "drop paragraphs containing: {items}", - "routingSummarizeDropParagraphStartsWith": "drop paragraphs starting with: {items}", - "routingSummarizeReplaceText": "replace \"{match}\" → \"{replacement}\"", + "routingOpPrependSystemBlockLabel": "Anteponer bloque de sistema", + "routingOpAppendSystemBlockLabel": "Añadir bloque de sistema", + "routingOpInjectBillingHeaderLabel": "Inyectar encabezado de facturación", + "routingOpObfuscateWordsLabel": "Ofuscar palabras (ZWJ)", + "routingOpDropParagraphContainsDesc": "Elimina cualquier párrafo (bloque de texto separado por líneas en blanco) dentro del prompt del sistema cuyo texto contenga CUALQUIERA de las subcadenas listadas. Úselo para eliminar huellas digitales de clientes de terceros como 'github.com/anomalyco/opencode' o 'docs.openwebui.com' que el clasificador de Anthropic detecta.", + "routingOpDropParagraphStartsWithDesc": "Elimina cualquier párrafo que EMPIECE POR uno de los prefijos listados. Úselo para líneas de identidad como 'You are OpenCode' o 'You are Open WebUI' que anuncian el cliente que realiza la llamada.", + "routingOpReplaceTextDesc": "Reemplaza una subcadena literal por otra. Úselo para frases de activación conocidas; por ejemplo, reescribir 'Here is some useful information about the environment you are running in:' a 'Environment context you are running in:' (una frase de activación validada empíricamente).", + "routingOpReplaceRegexDesc": "Reemplaza texto que coincide con una expresión regular. Úselo cuando necesite patrones (clases de caracteres, espacios en blanco opcionales, anclas) en lugar de subcadenas literales. Un patrón mal formado se detecta en tiempo de ejecución cuando se ejecuta la operación.", + "routingOpDropBlockContainsDesc": "Elimina bloques de sistema COMPLETOS (no solo párrafos) cuyo texto contenga cualquiera de las subcadenas listadas. Úselo cuando un bloque entero contenga huellas digitales y desee eliminarlo; por ejemplo, una descripción de servidor MCP inyectada.", + "routingOpPrependSystemBlockDesc": "Inserta un nuevo bloque de texto al PRINCIPIO de la matriz del sistema. Úselo para añadir la identidad del SDK 'You are a Claude agent, built on Anthropic's Claude Agent SDK.' que espera el clasificador de Anthropic.", + "routingOpAppendSystemBlockDesc": "Inserta un nuevo bloque de texto al FINAL de la matriz del sistema. Úselo para adiciones cosméticas que no necesitan estar en la posición [0].", + "routingOpInjectBillingHeaderDesc": "Antepone el bloque de texto especial 'x-anthropic-billing-header: cc_version=...; cc_entrypoint=...; cch=...;' que valida el clasificador de Anthropic. Requerido para endpoints de retransmisión de puente CC; para el proveedor nativo de Claude, OmniRoute ya inyecta su propia línea de facturación, por lo que esta operación suele ser redundante allí.", + "routingOpObfuscateWordsDesc": "Inserta un carácter Zero-Width-Joiner después de la primera letra de cada palabra listada, de modo que 'opencode' se convierte en 'o‍pencode'. Se lee igual para los humanos pero evita las coincidencias de palabras del clasificador. Afecta a bloques de sistema, mensajes de usuario/asistente y descripciones de herramientas.", + "routingNeedlesHint": "Lista de subcadenas. Un párrafo coincide si contiene CUALQUIERA de ellas. Añada una por línea mediante 'Añadir entrada'.", + "routingPrefixesHint": "Lista de cadenas. Un párrafo coincide si empieza por cualquiera de ellas (el espacio en blanco inicial se recorta antes de comparar).", + "routingCaseSensitiveHint": "Cuando está activado, 'OpenCode' y 'opencode' son cadenas diferentes. Cuando está desactivado (predeterminado), la comparación ignora las mayúsculas y minúsculas.", + "routingMatchLiteralHint": "Subcadena literal exacta a buscar. Sin sintaxis de expresión regular: los caracteres especiales como . * ? se tratan como tales.", + "routingReplacementTextHint": "Cadena de reemplazo. Déjelo en blanco para eliminar la coincidencia. La salida conserva el texto circundante.", + "routingAllOccurrencesHint": "Cuando está activado (predeterminado), se reemplaza cada instancia. Cuando está desactivado, solo se reemplaza la primera coincidencia.", + "routingPatternHint": "Fuente de expresión regular de JavaScript. No envuelva en barras, solo 'foo(.*)bar'. El servidor rechaza los patrones que no se compilan.", + "routingRegexFlagsHint": "Flags de expresión regular de JavaScript (g = todas las coincidencias, i = ignorar mayúsculas/minúsculas, s = el punto coincide con nueva línea, m = multilínea). Predeterminado 'g'.", + "routingBlockTextHint": "Texto completo del nuevo bloque de sistema. Use una cadena literal; el bloque de sistema solo almacena texto.", + "routingIdempotencyKeyHint": "Opcional. Si se establece, la operación se omite cuando ya existe un bloque cuyo texto comienza con esta clave. Evita el doble antepuesto en reintentos.", + "routingBillingEntrypointHint": "Valor inyectado como 'cc_entrypoint='. Anthropic acepta 'sdk-cli' (Agent SDK), 'cli' (Claude Code CLI) u otros valores documentados.", + "routingBillingVersionFormatHint": "Cómo se calcula el hash de compilación de 3 caracteres después de cc_version=. 'ex-machina' = sha256 de CCH_SALT+caracteres-del-primer-mensaje-de-usuario+versión (por mensaje). 'omniroute-daystamp' = sha256 de AAAA-MM-DD+versión (estable por día).", + "routingBillingCchAlgoHint": "Cómo se calcula el token cch= de 5 caracteres. 'sha256-first-user' = sha256 del texto del primer mensaje del usuario. 'xxhash64-body' = la firma a nivel de cuerpo lo rellena más tarde. 'static-zero' = marcador de posición literal '00000'.", + "routingObfuscateWordsHint": "Palabras en minúsculas a ofuscar. La inserción de ZWJ se aplica sin distinguir entre mayúsculas y minúsculas, por lo que 'opencode' también coincide con 'OpenCode' y 'OPENCODE'.", + "routingObfuscateTargetsHint": "Qué regiones del cuerpo escanear en busca de las palabras: bloques de sistema, mensajes de usuario/asistente y/o descripciones de herramientas.", + "routingObfuscateTargetsLabel": "Objetivos", + "routingSummarizeDropParagraphContains": "descartar párrafos que contienen: {items}", + "routingSummarizeDropParagraphStartsWith": "descartar párrafos que empiezan por: {items}", + "routingSummarizeReplaceText": "reemplazar \"{match}\" → \"{replacement}\"", "routingSummarizeReplaceRegex": "regex /{pattern}/{flags} → \"{replacement}\"", - "routingSummarizeDropBlockContains": "drop blocks containing: {items}", - "routingSummarizePrependSystemBlock": "prepend block: \"{text}\"", - "routingSummarizeAppendSystemBlock": "append block: \"{text}\"", - "routingSummarizeInjectBillingHeader": "inject billing header (entrypoint={entrypoint}, version={versionFormat}, cch={cchAlgo})", - "routingSummarizeObfuscateWords": "obfuscate {count} word(s) via ZWJ in {targets}", - "routingDefaultAutoVariantLKGP": "Last Known Good Provider", - "routingDefaultAutoVariantLKGPDesc": "Last Known Good Provider", - "routingDefaultAutoVariantCoding": "Quality-first for code", - "routingDefaultAutoVariantCodingDesc": "Quality-first for code", - "routingDefaultAutoVariantFast": "Low-latency routing", - "routingDefaultAutoVariantFastDesc": "Low-latency routing", - "routingDefaultAutoVariantCheap": "Cost-optimized", - "routingDefaultAutoVariantCheapDesc": "Cost-optimized", - "routingDefaultAutoVariantOffline": "High availability", - "routingDefaultAutoVariantOfflineDesc": "High availability", - "routingDefaultAutoVariantSmart": "Best discovery (10% explore)", - "routingDefaultAutoVariantSmartDesc": "Best discovery (10% explore)", - "routingOpSummaryCount": "{count, plural, =0 {no ops} one {# op} other {# ops}}", - "routingOpEnabled": "enabled", - "routingOpDisabled": "disabled", + "routingSummarizeDropBlockContains": "descartar bloques que contienen: {items}", + "routingSummarizePrependSystemBlock": "anteponer bloque: \"{text}\"", + "routingSummarizeAppendSystemBlock": "añadir bloque: \"{text}\"", + "routingSummarizeInjectBillingHeader": "inyectar encabezado de facturación (entrypoint={entrypoint}, version={versionFormat}, cch={cchAlgo})", + "routingSummarizeObfuscateWords": "ofuscar {count} palabra(s) vía ZWJ en {targets}", + "routingDefaultAutoVariantLKGP": "Último proveedor conocido en buen estado", + "routingDefaultAutoVariantLKGPDesc": "Último proveedor conocido en buen estado", + "routingDefaultAutoVariantCoding": "Calidad primero para código", + "routingDefaultAutoVariantCodingDesc": "Calidad primero para código", + "routingDefaultAutoVariantFast": "Enrutamiento de baja latencia", + "routingDefaultAutoVariantFastDesc": "Enrutamiento de baja latencia", + "routingDefaultAutoVariantCheap": "Optimizado en costes", + "routingDefaultAutoVariantCheapDesc": "Optimizado en costes", + "routingDefaultAutoVariantOffline": "Alta disponibilidad", + "routingDefaultAutoVariantOfflineDesc": "Alta disponibilidad", + "routingDefaultAutoVariantSmart": "Mejor descubrimiento (10% exploración)", + "routingDefaultAutoVariantSmartDesc": "Mejor descubrimiento (10% exploración)", + "routingOpSummaryCount": "{count, plural, =0 {sin operaciones} one {# operación} other {# operaciones}}", + "routingOpEnabled": "habilitado", + "routingOpDisabled": "deshabilitado", "routingOpStatusSeparator": " ·", - "resilienceSettingsIntro": "Reintento, enfriamiento y respaldo automáticos cuando fallan los proveedores.", - "aiSettingsIntro": "Configuraciones específicas de IA para pensar en el presupuesto, el comportamiento del modelo y la compresión.", - "systemPrompt": "Aviso del sistema", - "thinkingBudget": "Pensando en el presupuesto", - "proxy": "apoderado", + "resilienceSettingsIntro": "Reintentos, cooldown y fallback automáticos cuando fallan los proveedores.", + "aiSettingsIntro": "Configuraciones específicas de IA para el presupuesto de razonamiento, comportamiento del modelo y compresión.", + "systemPrompt": "Prompt de sistema", + "thinkingBudget": "Presupuesto de razonamiento", + "proxy": "Proxy", "httpProxy": "HTTP Proxy", "1proxy": "1proxy", - "proxySubTabsAria": "Proxy sections", - "requestBodyLimitTitle": "Request Body Limit", - "requestBodyLimitDescription": "Maximum API payload size accepted before a request body is parsed. Dedicated upload routes keep at least their built-in 100 MB limit.", - "requestBodyLimitInputLabel": "Request body limit in MB", - "requestBodyLimitEmptyError": "Enter a limit in MB", - "requestBodyLimitWholeNumberError": "Use a whole number", - "requestBodyLimitMinimumError": "Minimum is {min} MB", - "requestBodyLimitMaximumError": "Maximum is {max} MB", - "requestBodyLimitLoadFailed": "Failed to load request limit settings", - "requestBodyLimitSaveSuccess": "Request body limit saved", - "requestBodyLimitSaveFailed": "Failed to save request body limit", - "requestBodyLimitSaving": "Saving...", - "requestBodyLimitSave": "Save", - "requestBodyLimitCurrent": "Current: {value}", + "proxySubTabsAria": "Secciones de proxy", + "requestBodyLimitTitle": "Límite del cuerpo de la solicitud", + "requestBodyLimitDescription": "Tamaño máximo de carga útil de API aceptado antes de analizar el cuerpo de una solicitud. Las rutas de carga dedicadas mantienen al menos su límite integrado de 100 MB.", + "requestBodyLimitInputLabel": "Límite del cuerpo de la solicitud en MB", + "requestBodyLimitEmptyError": "Introduzca un límite en MB", + "requestBodyLimitWholeNumberError": "Use un número entero", + "requestBodyLimitMinimumError": "El mínimo es {min} MB", + "requestBodyLimitMaximumError": "El máximo es {max} MB", + "requestBodyLimitLoadFailed": "Error al cargar los ajustes del límite de solicitud", + "requestBodyLimitSaveSuccess": "Límite del cuerpo de la solicitud guardado", + "requestBodyLimitSaveFailed": "Error al guardar el límite del cuerpo de la solicitud", + "requestBodyLimitSaving": "Guardando...", + "requestBodyLimitSave": "Guardar", + "requestBodyLimitCurrent": "Actual: {value}", "cacheConfigLoadFailed": "No se pudo cargar la configuración de caché", "cacheConfigSaveSuccess": "Configuración de caché guardada", "cacheConfigSaveFailed": "No se pudo guardar la configuración de caché", @@ -6109,119 +6111,119 @@ "changePassword": "Cambiar contraseña", "enablePassword": "Habilitar contraseña", "darkMode": "Modo oscuro", - "lightMode": "Modo de luz", - "memoryTitle": "Memory", - "memoryDesc": "Persistent cross-session conversational memory", - "memoryEnabled": "Enable Memory", - "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", - "memoryTokenCostWarning": "Heads up: with memory enabled, OmniRoute injects up to {tokens} tokens of retrieved context into every chat request — this increases token usage and cost. To skip injection for a specific request, send the \"x-omniroute-no-memory: true\" header.", - "maxTokens": "Max Tokens", - "retentionDays": "Retention", - "recent": "Recent", - "recentDesc": "Chronological window", - "semantic": "Semantic", - "semanticDesc": "Vector search", - "hybrid": "Hybrid", - "hybridDesc": "Recent + Semantic", - "skillsTitle": "Skills", - "skillsDesc": "Tools for models", - "skillsEnabled": "Enable Skills", - "skillsEnabledDesc": "Allows agents to trigger functions.", - "skillsComingSoon": "Skills marketplace coming soon.", - "memorySkillsTitle": "Memory & Skills", - "memorySkillsDesc": "Persistent context & capabilities", - "modelsDevTitle": "Model Database", - "modelsDevDesc": "Auto-sync pricing, capabilities & specs from models.dev", - "modelsDevEnabled": "Enable models.dev Sync", - "modelsDevEnabledDesc": "Fetch model pricing, capabilities, and specs from the open-source models.dev database", - "modelsDevInterval": "Sync Interval", - "syncNow": "Sync Now", - "syncing": "Syncing...", - "lastSync": "Last sync", - "never": "Never", - "justNow": "justo ahora", - "modelsDevStats": "Sync Statistics", - "modelsDevStatsDesc": "Current models.dev data coverage", + "lightMode": "Modo claro", + "memoryTitle": "Memoria", + "memoryDesc": "Memoria conversacional persistente entre sesiones", + "memoryEnabled": "Habilitar memoria", + "memoryEnabledDesc": "Cuando está habilitado, OmniRoute inyectará contexto pasado relevante.", + "memoryTokenCostWarning": "Atención: con la memoria habilitada, OmniRoute inyecta hasta {tokens} tokens de contexto recuperado en cada solicitud de chat; esto aumenta el uso de tokens y el coste. Para omitir la inyección en una solicitud específica, envíe el encabezado \"x-omniroute-no-memory: true\".", + "maxTokens": "Máximo de tokens", + "retentionDays": "Retención", + "recent": "Reciente", + "recentDesc": "Ventana cronológica", + "semantic": "Semántico", + "semanticDesc": "Búsqueda vectorial", + "hybrid": "Híbrido", + "hybridDesc": "Reciente + Semántico", + "skillsTitle": "Habilidades", + "skillsDesc": "Herramientas para modelos", + "skillsEnabled": "Habilitar habilidades", + "skillsEnabledDesc": "Permite a los agentes activar funciones.", + "skillsComingSoon": "Marketplace de habilidades próximamente.", + "memorySkillsTitle": "Memoria y habilidades", + "memorySkillsDesc": "Contexto y capacidades persistentes", + "modelsDevTitle": "Base de datos de modelos", + "modelsDevDesc": "Sincronización automática de precios, capacidades y especificaciones desde models.dev", + "modelsDevEnabled": "Habilitar sincronización de models.dev", + "modelsDevEnabledDesc": "Obtener precios, capacidades y especificaciones de modelos desde la base de datos de código abierto models.dev", + "modelsDevInterval": "Intervalo de sincronización", + "syncNow": "Sincronizar ahora", + "syncing": "Sincronizando...", + "lastSync": "Última sincronización", + "never": "Nunca", + "justNow": "Justo ahora", + "modelsDevStats": "Estadísticas de sincronización", + "modelsDevStatsDesc": "Cobertura de datos actual de models.dev", "providers": "Proveedores", - "modelsWithPricing": "Models with Pricing", - "capabilities": "Capabilities", - "lastSyncCount": "Last Sync Count", - "lastSyncFull": "Last full sync", - "modelsDevInfo": "How It Works", - "modelsDevInfoDesc": "models.dev is an open-source database of AI model specifications maintained by the SST/OpenCode team. It provides pricing, capabilities, context limits, and modalities for 4,000+ models across 100+ providers.", - "modelsDevInfoResolution": "Pricing resolution order (highest priority first):", - "modelsDevInfoOrder": "User Override → models.dev → LiteLLM → Hardcoded Default", + "modelsWithPricing": "Modelos con precios", + "capabilities": "Capacidades", + "lastSyncCount": "Último recuento de sincronización", + "lastSyncFull": "Última sincronización completa", + "modelsDevInfo": "Cómo funciona", + "modelsDevInfoDesc": "models.dev es una base de datos de código abierto con especificaciones de modelos de IA mantenida por el equipo de SST/OpenCode. Proporciona precios, capacidades, límites de contexto y modalidades para más de 4000 modelos de más de 100 proveedores.", + "modelsDevInfoResolution": "Orden de resolución de precios (prioridad más alta primero):", + "modelsDevInfoOrder": "Anulación de usuario → models.dev → LiteLLM → Predeterminado incrustado", "systemTheme": "Tema del sistema", - "debugToggle": "Enable Debug Mode", - "logToolSourcesToggle": "Log Tool Sources", - "logToolSourcesDescription": "Emit a diagnostic log line per request summarizing tool count and MCP/hosted/client source breakdown.", - "homePinProviderQuotaToHome": "Pin Information to Home Page", - "homePinnedSectionsDesc": "Choose which sections to pin to the top of the Home page.", - "homeProviderQuotaLimits": "Provider Quota Limits", - "homeProviderQuotaLimitsDesc": "Pin the Provider Quota status container (with Refresh All button) to the top of the Home page.", - "homeQuickStart": "Quick Start", - "homeQuickStartDesc": "Show the Quick Start panel on the Home page.", - "homeProviderTopology": "Provider Topology", - "homeProviderTopologyDesc": "Show the Provider Topology on the Home page.", - "accountEmailVisibility": "Account email visibility", - "accountEmailVisibilityDesc": "Show full account emails across providers, combos, logs, quota, and playground screens. Turn this off to mask them by default.", - "comboConfigMode": "Combo configuration mode", - "comboConfigModeDesc": "Choose how the combo create and edit dialog is organized.", - "comboConfigModeGuided": "Guided", - "comboConfigModeGuidedDesc": "Use the current step-by-step combo builder.", - "comboConfigModeExpert": "Expert", - "comboConfigModeExpertDesc": "Show every combo option on one page and enable direct model entry.", - "providerQuotaAutoRefresh": "Provider Quota auto refresh", - "providerQuotaAutoRefreshDesc": "Refresh the Provider Limits view automatically while it stays open.", - "providerQuotaAutoRefreshToggle": "Automatic refresh", - "providerQuotaAutoRefreshToggleDesc": "Refresh the quota view every few minutes while the page is visible.", - "providerQuotaAutoRefreshInterval": "Refresh interval", - "providerQuotaAutoRefreshIntervalDesc": "How often the quota view should refresh, in seconds.", - "seconds": "seconds", - "sidebarVisibilityToggle": "Show Sidebar Items", + "debugToggle": "Habilitar modo de depuración", + "logToolSourcesToggle": "Registrar fuentes de herramientas", + "logToolSourcesDescription": "Emitir una línea de registro de diagnóstico por solicitud que resuma el recuento de herramientas y el desglose de fuentes de MCP/alojadas/de cliente.", + "homePinProviderQuotaToHome": "Fijar información en la página de inicio", + "homePinnedSectionsDesc": "Elige qué secciones fijar en la parte superior de la página de inicio.", + "homeProviderQuotaLimits": "Límites de cuota del proveedor", + "homeProviderQuotaLimitsDesc": "Fijar el contenedor de estado de cuota del proveedor (con el botón Actualizar todo) en la parte superior de la página de inicio.", + "homeQuickStart": "Inicio rápido", + "homeQuickStartDesc": "Mostrar el panel de inicio rápido en la página de inicio.", + "homeProviderTopology": "Topología de proveedores", + "homeProviderTopologyDesc": "Mostrar la topología de proveedores en la página de inicio.", + "accountEmailVisibility": "Visibilidad del correo de la cuenta", + "accountEmailVisibilityDesc": "Mostrar los correos completos de las cuentas en las pantallas de proveedores, combos, registros, cuota y playground. Desactiva esta opción para ocultarlos por defecto.", + "comboConfigMode": "Modo de configuración de combos", + "comboConfigModeDesc": "Elige cómo se organiza el diálogo de creación y edición de combos.", + "comboConfigModeGuided": "Guiado", + "comboConfigModeGuidedDesc": "Utilizar el asistente de creación de combos paso a paso actual.", + "comboConfigModeExpert": "Experto", + "comboConfigModeExpertDesc": "Mostrar todas las opciones de los combos en una sola página y permitir la introducción directa de modelos.", + "providerQuotaAutoRefresh": "Actualización automática de cuota de proveedores", + "providerQuotaAutoRefreshDesc": "Actualizar la vista de límites de proveedores automáticamente mientras permanezca abierta.", + "providerQuotaAutoRefreshToggle": "Actualización automática", + "providerQuotaAutoRefreshToggleDesc": "Actualizar la vista de cuota cada pocos minutos mientras la página esté visible.", + "providerQuotaAutoRefreshInterval": "Intervalo de actualización", + "providerQuotaAutoRefreshIntervalDesc": "Frecuencia con la que debe actualizarse la vista de cuota, en segundos.", + "seconds": "segundos", + "sidebarVisibilityToggle": "Mostrar elementos de la barra lateral", "enableCache": "Habilitar caché", "cacheTTL": "TTL de caché", "maxCacheSize": "Tamaño máximo de caché", "clearCache": "Borrar caché", - "cacheCleared": "Cache cleared successfully", - "clearCacheFailed": "Failed to clear cache", - "cacheHits": "Visitas de caché", - "cacheMisses": "Errores de caché", + "cacheCleared": "Caché borrada correctamente", + "clearCacheFailed": "No se pudo borrar la caché", + "cacheHits": "Aciertos de caché", + "cacheMisses": "Fallos de caché", "hitRate": "Tasa de aciertos", "cacheEntries": "Entradas de caché", - "cacheSettings": "Cache Settings", - "semanticCache": "Semantic Cache", - "maxEntries": "Max Entries", - "ttlMinutes": "TTL (minutes)", - "promptCache": "Caché de aviso", - "strategy": "Strategy", - "preserveClientCache": "Preserve Client Cache", - "enabled": "Enabled", - "loading": "Loading...", + "cacheSettings": "Ajustes de caché", + "semanticCache": "Caché semántica", + "maxEntries": "Entradas máximas", + "ttlMinutes": "TTL (minutos)", + "promptCache": "Caché de prompts", + "strategy": "Estrategia", + "preserveClientCache": "Conservar caché de cliente", + "enabled": "Habilitado", + "loading": "Cargando…", "saving": "Guardando...", - "save": "Save", + "save": "Guardar", "circuitBreaker": "Disyuntor", - "retryPolicy": "Política de reintento", + "retryPolicy": "Política de reintentos", "maxRetries": "Reintentos máximos", - "retryDelay": "Retardo de reintento", + "retryDelay": "Retraso de reintento", "timeoutMs": "Tiempo de espera (ms)", - "enableSystemPrompt": "Habilitar mensaje del sistema", - "systemPromptText": "Texto de aviso del sistema", - "autoDisableBannedAccounts": "Auto-Disable Banned Accounts", - "autoDisableDescription": "Permanently mark provider connections as deactivated if they return specific terminal ban signals (e.g. HTTP 403 'verify your account'). This removes them from the combo rotation.", - "autoDisableThreshold": "Ban Threshold", - "autoDisableThresholdDesc": "Consecutive ban signals required before permanent deactivation.", - "customBannedSignals": "Banned Keywords", - "customBannedSignalsDesc": "Additional keywords that trigger permanent account ban detection. Built-in keywords always apply.", - "customBannedSignalsPlaceholder": "e.g. api key revoked", - "noCustomBannedSignals": "No custom keywords. Only built-in keywords are active.", - "resilienceStructureTitle": "Resilience Structure", - "resilienceStructureDesc": "Esta página solo configura el comportamiento. El estado del interruptor activo se muestra en la página Salud. El reintento específico del combo y el control de espacios por turnos permanecen en la configuración del combo.", - "enableThinking": "Habilitar el pensamiento", - "maxThinkingTokens": "Fichas de pensamiento máximo", + "enableSystemPrompt": "Habilitar prompt del sistema", + "systemPromptText": "Texto del prompt del sistema", + "autoDisableBannedAccounts": "Desactivar automáticamente cuentas prohibidas", + "autoDisableDescription": "Marcar permanentemente las conexiones de proveedores como desactivadas si devuelven señales específicas de bloqueo definitivo (p. ej., HTTP 403 'verify your account'). Esto las elimina de la rotación de combos.", + "autoDisableThreshold": "Umbral de bloqueo", + "autoDisableThresholdDesc": "Señales de bloqueo consecutivas necesarias antes de la desactivación permanente.", + "customBannedSignals": "Palabras clave de bloqueo", + "customBannedSignalsDesc": "Palabras clave adicionales que activan la detección de bloqueo permanente de la cuenta. Las palabras clave integradas siempre se aplican.", + "customBannedSignalsPlaceholder": "p. ej., api key revoked", + "noCustomBannedSignals": "Sin palabras clave personalizadas. Solo las palabras clave integradas están activas.", + "resilienceStructureTitle": "Estructura de resiliencia", + "resilienceStructureDesc": "Esta página solo configura el comportamiento. El estado en tiempo real del disyuntor se muestra en la página de estado. El control de turnos y reintentos específicos de los combos permanece en los ajustes de los combos.", + "enableThinking": "Habilitar razonamiento", + "maxThinkingTokens": "Tokens máximos de razonamiento", "enableProxy": "Habilitar proxy", - "perKeyProxyEnabled": "Enable per-key proxy assignment", - "perKeyProxyEnabledDesc": "When enabled, each provider connection can use its own proxy assignment", + "perKeyProxyEnabled": "Habilitar asignación de proxy por clave", + "perKeyProxyEnabledDesc": "Cuando está habilitado, cada conexión de proveedor puede usar su propia asignación de proxy", "proxyUrl": "URL de proxy", "pricingRates": "Formato de tarifas de precios", "currentPricing": "Resumen de precios actuales", @@ -6234,42 +6236,42 @@ "cacheCreation": "Creación de caché", "customPricing": "Precios personalizados", "databaseSize": "Tamaño de la base de datos", - "backupDb": "Base de datos de respaldo", + "backupDb": "Copia de seguridad de la base de datos", "restoreDb": "Restaurar base de datos", "exportData": "Exportar datos", "importData": "Importar datos", "clearData": "Borrar todos los datos", - "clearDataConfirm": "Esto eliminará permanentemente todos los datos. ¿Está seguro?", + "clearDataConfirm": "Esto eliminará permanentemente todos los datos. ¿Estás seguro?", "enableRequestLogs": "Habilitar registros de solicitudes", "logRetention": "Retención de registros", "ipWhitelist": "Lista blanca de IP", "ipBlacklist": "Lista negra de IP", - "addIP": "Agregar IP", - "savedSuccessfully": "Configuración guardada exitosamente", + "addIP": "Añadir IP", + "savedSuccessfully": "Ajustes guardados correctamente", "ai": "IA", "advanced": "Avanzado", - "localMode": "Modo local: todos los datos almacenados en su máquina", - "settingsSectionsAria": "Secciones de configuración", + "localMode": "Modo local: todos los datos se almacenan en tu dispositivo", + "settingsSectionsAria": "Secciones de ajustes", "switchThemes": "Cambiar entre temas claros y oscuros", "themeSelectionAria": "Selección de tema", - "themeLight": "Luz", - "themeDark": "oscuro", + "themeLight": "Claro", + "themeDark": "Oscuro", "themeSystem": "Sistema", - "endpointTunnelVisibility": "Visibilidad del túnel de punto final", - "endpointTunnelVisibilityDesc": "Oculte los controles del túnel desde la página Endpoint sin cambiar el estado del túnel.", + "endpointTunnelVisibility": "Visibilidad del túnel del endpoint", + "endpointTunnelVisibilityDesc": "Ocultar los controles del túnel en la página del endpoint sin cambiar el estado del túnel.", "showCloudflareTunnel": "Túnel rápido de Cloudflare", - "showCloudflareTunnelDesc": "Muestre los controles de Cloudflare Quick Tunnel en la página Endpoint.", - "showTailscaleFunnel": "Embudo de escala de cola", - "showTailscaleFunnelDesc": "Muestre los controles de Tailscale Funnel en la página Endpoint.", - "showNgrokTunnel": "túnel ngrok", - "showNgrokTunnelDesc": "Muestre los controles del túnel ngrok en la página Punto final.", - "sidebarVisibility": "Hide sidebar items", - "sidebarVisibilityDesc": "Hide any sidebar navigation entry to reduce visual clutter.", - "sidebarVisibilityHint": "Any sidebar section is hidden automatically when a...", - "hideHealthLogs": "Ocultar registros de verificación de estado", - "hideHealthLogsDesc": "Cuando está activado, suprime los mensajes [HealthCheck] en la consola del servidor", + "showCloudflareTunnelDesc": "Mostrar los controles del túnel rápido de Cloudflare en la página del endpoint.", + "showTailscaleFunnel": "Tailscale Funnel", + "showTailscaleFunnelDesc": "Mostrar los controles de Tailscale Funnel en la página del endpoint.", + "showNgrokTunnel": "Túnel de ngrok", + "showNgrokTunnelDesc": "Mostrar los controles del túnel de ngrok en la página del endpoint.", + "sidebarVisibility": "Ocultar elementos de la barra lateral", + "sidebarVisibilityDesc": "Ocultar cualquier entrada de navegación de la barra lateral para reducir el desorden visual sin deshabilitar ninguna función", + "sidebarVisibilityHint": "Cualquier sección de la barra lateral se oculta automáticamente cuando se ocultan todas sus entradas", + "hideHealthLogs": "Ocultar registros de comprobación de estado", + "hideHealthLogsDesc": "Cuando está activado, se suprimen los mensajes [HealthCheck] en la consola del servidor", "themeAccent": "Color del tema", - "themeAccentDesc": "Elige un color predefinido o crea tu propio tema con un solo color", + "themeAccentDesc": "Elige un color preestablecido o crea tu propio tema con un solo color", "themeCreate": "Crear tema", "themeCustom": "Tema personalizado", "themeBlue": "Azul", @@ -6278,276 +6280,276 @@ "themeViolet": "Violeta", "themeOrange": "Naranja", "themeCyan": "Cian", - "whitelabeling": "Branding", - "whitelabelingDesc": "Customize the application name and logo", - "appName": "Application Name", - "appNameDesc": "Display name shown in sidebar and browser tab", - "customLogo": "Custom Logo URL", - "customLogoDesc": "URL to your custom logo image", - "uploadLogo": "Upload Logo", - "resetLogo": "Reset to Default", - "logoPreview": "Preview", - "customFavicon": "Browser Favicon", - "customFaviconDesc": "URL to your custom favicon (shown in browser tab)", - "uploadFavicon": "Upload Favicon", - "resetFavicon": "Reset Favicon", - "faviconPreview": "Favicon Preview", - "logoFileTooLarge": "Logo file must be less than 500KB", - "faviconFileTooLarge": "Favicon file must be less than 50KB", - "invalidLogoFileType": "Invalid file type. Please upload PNG, JPG, SVG, GIF, or WebP.", - "invalidFaviconFileType": "Invalid file type. Please upload PNG, ICO, SVG, GIF, or WebP.", - "failedToReadFile": "Failed to read file", - "startOnLogin": "Start on Login", - "startOnLoginDesc": "Automatically launch OmniRoute on system startup and run silently in the background tray.", + "whitelabeling": "Personalización de marca", + "whitelabelingDesc": "Personaliza el nombre y el logotipo de la aplicación", + "appName": "Nombre de la aplicación", + "appNameDesc": "Nombre mostrado en la barra lateral y en la pestaña del navegador", + "customLogo": "URL del logotipo personalizado", + "customLogoDesc": "URL de la imagen de tu logotipo personalizado", + "uploadLogo": "Subir logotipo", + "resetLogo": "Restaurar predeterminado", + "logoPreview": "Vista previa", + "customFavicon": "Favicon del navegador", + "customFaviconDesc": "URL de tu favicon personalizado (se muestra en la pestaña del navegador)", + "uploadFavicon": "Subir favicon", + "resetFavicon": "Restaurar favicon", + "faviconPreview": "Vista previa del favicon", + "logoFileTooLarge": "El archivo del logotipo debe ser inferior a 500 KB", + "faviconFileTooLarge": "El archivo del favicon debe ser inferior a 50 KB", + "invalidLogoFileType": "Tipo de archivo no válido. Sube un archivo PNG, JPG, SVG, GIF o WebP.", + "invalidFaviconFileType": "Tipo de archivo no válido. Sube un archivo PNG, ICO, SVG, GIF o WebP.", + "failedToReadFile": "No se pudo leer el archivo", + "startOnLogin": "Iniciar al iniciar sesión", + "startOnLoginDesc": "Iniciar automáticamente OmniRoute al arrancar el sistema y ejecutarlo en segundo plano en la bandeja del sistema.", "flushCache": "Vaciar caché", - "flushing": "Sonrojándose…", + "flushing": "Vaciando…", "size": "Tamaño", - "hits": "Visitas", - "evictions": "Desalojos", + "hits": "Aciertos", + "evictions": "Expulsiones", "loadingCacheStats": "Cargando estadísticas de caché…", "globalProxy": "Proxy global", - "globalProxyDesc": "Configure un proxy saliente global para todas las llamadas API. Los proveedores individuales, los combos y las claves pueden anular esto.", + "globalProxyDesc": "Configurar un proxy saliente global para todas las llamadas a la API. Los proveedores individuales, los combos y las claves pueden anular esto.", "noGlobalProxy": "No hay ningún proxy global configurado", - "proxyPool": "Proxy Pool", - "freePool": "Free Pool", - "proxyDocumentation": "Proxy Documentation", - "proxyGlobalConfigTab": "Global Config", - "proxyPoolTab": "Proxy Pool", - "freePoolTab": "Free Pool", - "proxyDocumentationTab": "Documentation", - "proxySubscriptionsTab": "Subscriptions", + "proxyPool": "Grupo de proxies", + "freePool": "Grupo gratuito", + "proxyDocumentation": "Documentación de proxy", + "proxyGlobalConfigTab": "Configuración global", + "proxyPoolTab": "Grupo de proxies", + "freePoolTab": "Grupo gratuito", + "proxyDocumentationTab": "Documentación", + "proxySubscriptionsTab": "Suscripciones", "proxySubscription": { "error": { - "LOCAL_CORE_ENDPOINT_INVALID": "Local proxy-core endpoint is invalid; SS/VMess/Trojan/VLESS nodes were ignored.", - "NEEDS_CORE_NOT_CONFIGURED": "This subscription has nodes that need a local proxy core (SS/VMess/Trojan/VLESS); they are not routed until you configure the local-core SOCKS5 endpoint.", - "NO_USABLE_NODES": "Subscription yielded no usable nodes (http/https/socks5 or nodes with a local core endpoint)." + "LOCAL_CORE_ENDPOINT_INVALID": "El endpoint del núcleo proxy local no es válido; se han ignorado los nodos SS/VMess/Trojan/VLESS.", + "NEEDS_CORE_NOT_CONFIGURED": "Esta suscripción tiene nodos que necesitan un núcleo proxy local (SS/VMess/Trojan/VLESS); no se enrutarán hasta que configures el endpoint SOCKS5 del núcleo local.", + "NO_USABLE_NODES": "La suscripción no ha devuelto ningún nodo utilizable (http/https/socks5 o nodos con un endpoint de núcleo local)." } }, - "bulkHealthcheck": "Bulk Healthcheck", - "bulkHealthcheckDesc": "Test all configured proxies against a target URL to find which ones work.", - "healthcheckTesting": "Testing...", - "healthcheckAll": "Healthcheck All", - "healthcheckFailed": "Failed to run healthcheck", - "healthcheckTestingAll": "Testing all proxies in parallel...", + "bulkHealthcheck": "Comprobación de salud masiva", + "bulkHealthcheckDesc": "Probar todos los proxies configurados contra una URL de destino para ver cuáles funcionan.", + "healthcheckTesting": "Probando...", + "healthcheckAll": "Comprobar salud de todos", + "healthcheckFailed": "No se pudo ejecutar la comprobación de salud", + "healthcheckTestingAll": "Probando todos los proxies en paralelo...", "healthcheckTotal": "Total", - "healthcheckWorking": "Working", - "healthcheckFailedLabel": "Failed", - "healthcheckStatus": "Status", - "healthcheckProxyUrl": "Proxy URL", - "healthcheckLatency": "Latency", - "proxyDocumentationScopeTitle": "Proxy scope resolution", - "proxyDocumentationScopeDescBefore": "OmniRoute resolves the outbound proxy in priority order:", - "proxyDocumentationScopeOrder": "combo → account → provider → global", - "proxyDocumentationScopeDescAfter": ". The most specific scope wins.", - "proxyDocumentationAddTitle": "Adding a custom proxy", - "proxyDocumentationAddDescBefore": "Go to the", - "proxyDocumentationAddDescMiddle": "tab → click", - "proxyDocumentationAddCta": "+ Add proxy", - "proxyDocumentationAddDescAfter": ". Fill in type (http/https/socks5), host, and port. Optionally assign it to a scope.", - "proxyDocumentationBulkTitle": "Bulk import format", - "proxyDocumentationBulkDesc": "Pipe-delimited fields:", - "proxyDocumentationSocks5DescBefore": "SOCKS5 proxies are disabled by default. Set", - "proxyDocumentationFreePoolDesc": "The Free Pool tab aggregates proxies from 1proxy, Proxifly, and IPLocate. Use ⊕ to test and promote a proxy to your registry. Only proxies that pass the connectivity test are added.", - "proxyDocumentationVercelRelayDescBefore": "The Vercel Relay is an outbound edge relay — not an inbound tunnel. Deploying one sends LLM API calls through Vercel's dynamic IPs, bypassing datacenter geo-blocks and rate limits. The relay is protected by a generated secret header", - "proxyDocumentationVercelRelayDescAfter": "Your Vercel token is used only during deploy and is never stored.", - "vercelRelayTokenRequired": "Token is required", - "vercelRelayDeployFailed": "Deploy failed", - "vercelRelayTokenHint": "Token is used only during deploy — never stored.", - "denoRelayTokenRequired": "Deno Deploy token is required", - "denoRelayOrgDomainRequired": "Organization domain is required", - "denoRelayDeployFailed": "Deno Deploy failed", - "denoRelayTokenHint": "Organization token (prefix ddo_) from console.deno.com → Organization → Settings → Organization Tokens. Used once for deploy and never stored.", - "denoRelayOrgDomainHint": "Your Deno Deploy organization's default domain (e.g. acme.deno.net). The relay will be reachable at https://..deno.net.", - "proxyFreePoolFilterProtocol": "Filter by protocol", - "proxyFreePoolProtocol": "Protocol", - "proxyFreePoolCountryPlaceholder": "Country (e.g. US)", - "proxyFreePoolFilterCountry": "Filter by country", - "proxyFreePoolMinQualityPlaceholder": "Min quality", - "proxyFreePoolMinQualityLabel": "Minimum quality score", - "proxyFreePoolSyncAll": "Sync All", + "healthcheckWorking": "En funcionamiento", + "healthcheckFailedLabel": "Fallido", + "healthcheckStatus": "Estado", + "healthcheckProxyUrl": "URL del proxy", + "healthcheckLatency": "Latencia", + "proxyDocumentationScopeTitle": "Resolución del ámbito del proxy", + "proxyDocumentationScopeDescBefore": "OmniRoute resuelve el proxy de salida en orden de prioridad:", + "proxyDocumentationScopeOrder": "combo → cuenta → proveedor → global", + "proxyDocumentationScopeDescAfter": ". Gana el ámbito más específico.", + "proxyDocumentationAddTitle": "Añadir un proxy personalizado", + "proxyDocumentationAddDescBefore": "Ve a la pestaña", + "proxyDocumentationAddDescMiddle": "→ haz clic en", + "proxyDocumentationAddCta": "+ Añadir proxy", + "proxyDocumentationAddDescAfter": ". Rellena el tipo (http/https/socks5), el host y el puerto. Opcionalmente, asígnalo a un ámbito.", + "proxyDocumentationBulkTitle": "Formato de importación masiva", + "proxyDocumentationBulkDesc": "Campos delimitados por barras verticales (|):", + "proxyDocumentationSocks5DescBefore": "Los proxies SOCKS5 están desactivados por defecto. Configura", + "proxyDocumentationFreePoolDesc": "La pestaña Free Pool agrega proxies de 1proxy, Proxifly e IPLocate. Usa ⊕ para probar y promocionar un proxy a tu registro. Solo se añaden los proxies que superan la prueba de conectividad.", + "proxyDocumentationVercelRelayDescBefore": "Vercel Relay es un relé de borde de salida, no un túnel de entrada. Desplegar uno envía las solicitudes de la API de LLM a través de las IP dinámicas de Vercel, evitando bloqueos geográficos de centros de datos y rate limits. El relé está protegido por una cabecera secreta generada", + "proxyDocumentationVercelRelayDescAfter": "Tu token de Vercel solo se usa durante el despliegue y nunca se almacena.", + "vercelRelayTokenRequired": "El token es obligatorio", + "vercelRelayDeployFailed": "Error en el despliegue", + "vercelRelayTokenHint": "El token solo se usa durante el despliegue; nunca se almacena.", + "denoRelayTokenRequired": "El token de Deno Deploy es obligatorio", + "denoRelayOrgDomainRequired": "El dominio de la organización es obligatorio", + "denoRelayDeployFailed": "Error en Deno Deploy", + "denoRelayTokenHint": "Token de organización (prefijo ddo_) desde console.deno.com → Organization → Settings → Organization Tokens. Se usa una vez para el despliegue y nunca se almacena.", + "denoRelayOrgDomainHint": "El dominio predeterminado de tu organización en Deno Deploy (ej. acme.deno.net). El relé será accesible en https://..deno.net.", + "proxyFreePoolFilterProtocol": "Filtrar por protocolo", + "proxyFreePoolProtocol": "Protocolo", + "proxyFreePoolCountryPlaceholder": "País (ej. ES)", + "proxyFreePoolFilterCountry": "Filtrar por país", + "proxyFreePoolMinQualityPlaceholder": "Calidad mín.", + "proxyFreePoolMinQualityLabel": "Puntuación de calidad mínima", + "proxyFreePoolSyncAll": "Sincronizar todo", "proxyFreePoolTotal": "Total", - "proxyFreePoolInPool": "In pool", - "proxyFreePoolAvgQuality": "Avg quality", - "proxyFreePoolSelected": "{count} selected", - "proxyFreePoolAddSelected": "Add selected to pool", - "proxyFreePoolAddVisible": "Add all visible to pool", - "proxyFreePoolSource": "Source", - "proxyFreePoolHostPort": "Host:Port", - "proxyFreePoolType": "Type", - "proxyFreePoolCountry": "Country", - "proxyFreePoolQuality": "Quality", - "proxyFreePoolLatency": "Latency", - "proxyFreePoolEmpty": "No proxies found. Click Sync All to fetch from sources.", - "proxyToggleSources": "Toggle proxy sources", - "proxyFreePoolTesting": "Testing proxies...", - "proxyFreePoolBulkResult": "{succeeded} added, {failed} failed", - "proxyFreePoolPageSummary": "Page {page} of {totalPages} ({total} total proxies)", - "proxyFreePoolTotalSummary": "{total} total proxies", - "proxyFreePoolSearchPlaceholder": "Search host…", - "proxyFreePoolSearchLabel": "Search proxies by host", - "proxyFreePoolSortLabel": "Sort proxies", - "proxyFreePoolSortQuality": "Quality", - "proxyFreePoolSortLatency": "Latency", - "proxyFreePoolSortRecent": "Recently validated", - "proxyFreePoolListTotal": "Listed", - "proxyFreePoolLoadMore": "Load more", - "close": "Close", - "cancel": "Cancel", - "globalLabel": "Mundial", + "proxyFreePoolInPool": "En el pool", + "proxyFreePoolAvgQuality": "Calidad media", + "proxyFreePoolSelected": "{count} seleccionados", + "proxyFreePoolAddSelected": "Añadir seleccionados al pool", + "proxyFreePoolAddVisible": "Añadir todos los visibles al pool", + "proxyFreePoolSource": "Fuente", + "proxyFreePoolHostPort": "Host:Puerto", + "proxyFreePoolType": "Tipo", + "proxyFreePoolCountry": "País", + "proxyFreePoolQuality": "Calidad", + "proxyFreePoolLatency": "Latencia", + "proxyFreePoolEmpty": "No se encontraron proxies. Haz clic en Sincronizar todo para obtenerlos de las fuentes.", + "proxyToggleSources": "Alternar fuentes de proxy", + "proxyFreePoolTesting": "Probando proxies...", + "proxyFreePoolBulkResult": "{succeeded} añadidos, {failed} fallidos", + "proxyFreePoolPageSummary": "Página {page} de {totalPages} ({total} proxies en total)", + "proxyFreePoolTotalSummary": "{total} proxies en total", + "proxyFreePoolSearchPlaceholder": "Buscar host…", + "proxyFreePoolSearchLabel": "Buscar proxies por host", + "proxyFreePoolSortLabel": "Ordenar proxies", + "proxyFreePoolSortQuality": "Calidad", + "proxyFreePoolSortLatency": "Latencia", + "proxyFreePoolSortRecent": "Validado recientemente", + "proxyFreePoolListTotal": "Listados", + "proxyFreePoolLoadMore": "Cargar más", + "close": "Cerrar", + "cancel": "Cancelar", + "globalLabel": "Global", "configure": "Configurar", - "globalSystemPrompt": "Aviso del sistema global", + "globalSystemPrompt": "System Prompt global", "saved": "Guardado", - "beforePromptLabel": "Before Prompt", - "beforePromptDesc": "Injected before agent/provider system instructions", - "beforePromptPlaceholder": "Instructions inserted before agent/provider prompt...", - "afterPromptLabel": "After Prompt", - "afterPromptDesc": "Injected after agent/provider system instructions", - "afterPromptPlaceholder": "Instructions inserted after agent/provider prompt...", + "beforePromptLabel": "Prompt inicial", + "beforePromptDesc": "Insertado antes de las instrucciones del sistema del agente/proveedor", + "beforePromptPlaceholder": "Instrucciones insertadas antes del prompt del agente/proveedor...", + "afterPromptLabel": "Prompt final", + "afterPromptDesc": "Insertado después de las instrucciones del sistema del agente/proveedor", + "afterPromptPlaceholder": "Instrucciones insertadas después del prompt del agente/proveedor...", "chars": "{count} caracteres", - "thinkingBudgetTitle": "Pensando en el presupuesto", - "thinkingBudgetDesc": "Controle el uso del token de razonamiento de IA en todas las solicitudes", - "passthrough": "Paso a través", - "passthroughDesc": "Sin cambios: el cliente controla el presupuesto pensando en", - "auto": "Automático", - "autoDesc": "Elimine toda configuración de pensamiento: deje que el proveedor decida", - "custom": "personalizado", - "customDesc": "Establecer un presupuesto de token fijo para todas las solicitudes", + "thinkingBudgetTitle": "Presupuesto de razonamiento", + "thinkingBudgetDesc": "Controla el uso de tokens de razonamiento de la IA en todas las solicitudes", + "passthrough": "Passthrough", + "passthroughDesc": "Sin cambios: el cliente controla el presupuesto de razonamiento", + "auto": "Combo automático", + "autoDesc": "Pool de enrutamiento inteligente autorreparable (optimizado para rendimiento)", + "custom": "Personalizado", + "customDesc": "Establecer un presupuesto de tokens fijo para todas las solicitudes", "adaptive": "Adaptativo", - "adaptiveDesc": "Escale el presupuesto según la complejidad de la solicitud", - "effortNone": "Ninguno (0 fichas)", + "adaptiveDesc": "Escalar el presupuesto según la complejidad de la solicitud", + "effortNone": "Ninguno (0 tokens)", "effortLow": "Bajo (1K tokens)", - "effortMedium": "Medio (10.000 tokens)", - "effortHigh": "Alto (128.000 tokens)", - "tokenBudget": "Presupuesto simbólico", - "tokens": "fichas", + "effortMedium": "Medio (10K tokens)", + "effortHigh": "Alto (128K tokens)", + "tokenBudget": "Presupuesto de tokens", + "tokens": "tokens", "baseEffortLevel": "Nivel de esfuerzo base", - "adaptiveHint": "El modo adaptable escala desde este nivel base según el recuento de mensajes, el uso de herramientas y la duración del mensaje.", + "adaptiveHint": "El modo adaptativo escala desde este nivel base según el número de mensajes, el uso de herramientas y la longitud del prompt.", "requireLogin": "Requerir inicio de sesión", - "requireLoginDesc": "Cuando está activado, el panel requiere contraseña. Cuando esté APAGADO, acceda sin iniciar sesión.", + "requireLoginDesc": "Cuando está activado, el panel requiere contraseña. Cuando está desactivado, el acceso es libre.", "currentPassword": "Contraseña actual", - "enterCurrentPassword": "Ingrese la contraseña actual", + "enterCurrentPassword": "Introduce la contraseña actual", "newPassword": "Nueva contraseña", - "enterNewPassword": "Ingrese una nueva contraseña", + "enterNewPassword": "Introduce la nueva contraseña", "confirmPassword": "Confirmar nueva contraseña", - "confirmPasswordPlaceholder": "Confirmar nueva contraseña", + "confirmPasswordPlaceholder": "Confirma la nueva contraseña", "passwordsNoMatch": "Las contraseñas no coinciden", - "passwordUpdated": "Contraseña actualizada exitosamente", - "failedUpdatePassword": "No se pudo actualizar la contraseña", - "errorOccurred": "Se produjo un error", + "passwordUpdated": "Contraseña actualizada correctamente", + "failedUpdatePassword": "Error al actualizar la contraseña", + "errorOccurred": "Se ha producido un error", "updatePassword": "Actualizar contraseña", "setPassword": "Establecer contraseña", - "apiEndpointProtection": "Protección de terminales API", - "requireAuthModels": "Requerir clave API para /models", - "requireAuthModelsDesc": "Cuando está activado, el punto final /v1/models devuelve 404 para solicitudes no autenticadas. Impide el descubrimiento del modelo por parte de usuarios no autorizados.", - "authModelHeading": "Modelo de autorización activa", - "authModelClient": "Los puntos finales de la API del cliente (/v1/*, /chat/*, /responses/*, /codex/*, /messages/*) requieren una clave de API de portador.", - "authModelManagement": "Los puntos finales de administración (/dashboard, /api/*) requieren una sesión de panel o una credencial de administración.", - "authModelPublic": "Sólo las rutas de inicio de sesión, estado y arranque son públicas.", - "bruteForceProtection": "Iniciar sesión protección de fuerza bruta", - "bruteForceProtectionDesc": "Acelere y bloquee /api/auth/login después de fallas repetidas desde la misma IP.", + "apiEndpointProtection": "Protección de endpoints de API", + "requireAuthModels": "Requerir clave de API para /models", + "requireAuthModelsDesc": "Cuando está activado, el endpoint /v1/models devuelve 404 para solicitudes no autenticadas. Evita el descubrimiento de modelos por usuarios no autorizados.", + "authModelHeading": "Modelo de autorización activo", + "authModelClient": "Los endpoints de la API de cliente (/v1/*, /chat/*, /responses/*, /codex/*, /messages/*) requieren una clave de API Bearer.", + "authModelManagement": "Los endpoints de gestión (/dashboard, /api/*) requieren una sesión de panel o credenciales de gestión.", + "authModelPublic": "Solo las rutas de inicio de sesión, estado y arranque son públicas.", + "bruteForceProtection": "Protección contra fuerza bruta en inicio de sesión", + "bruteForceProtectionDesc": "Limita y bloquea /api/auth/login tras fallos repetidos desde la misma IP.", "corsAllowedOrigins": "Orígenes permitidos por CORS", - "corsAllowedOriginsDesc": "Lista separada por comas de orígenes de navegadores permitidos para llamar a este servidor. Lista vacía = sin acceso CORS del navegador (la conexión de servidor a servidor aún funciona). Utilice CORS_ALLOW_ALL=true env var solo para desarrollo.", + "corsAllowedOriginsDesc": "Lista separada por comas de orígenes de navegador permitidos para llamar a este servidor. Lista vacía = sin acceso CORS desde navegador (la conexión servidor a servidor sigue funcionando). Usa la variable de entorno CORS_ALLOW_ALL=true solo para desarrollo.", "blockedProviders": "Proveedores bloqueados", - "blockedProvidersDesc": "Oculte proveedores específicos de la respuesta /v1/models. Los proveedores bloqueados no aparecerán en los listados de modelos.", + "blockedProvidersDesc": "Oculta proveedores específicos de la respuesta /v1/models. Los proveedores bloqueados no aparecerán en los listados de modelos.", "providersBlocked": "{count} proveedor(es) bloqueado(s) en /models", "blockProviderTitle": "Bloquear {provider}", "unblockProviderTitle": "Desbloquear {provider}", - "cliFingerprint": "CLI Fingerprint Matching", - "cliFingerprintDesc": "Match native CLI binary signatures when proxying requests. Reorders headers and body fields to look identical to the official CLI tools. Your proxy IP is preserved.", - "cliFingerprintEnabled": "{count} provider(s) with CLI fingerprint active", - "enableFingerprintTitle": "Enable fingerprint for {provider}", - "disableFingerprintTitle": "Disable fingerprint for {provider}", - "systemTransforms": "Canalización de transformación de bloque de sistema", - "systemTransformsDesc": "Canalización de transformaciones ordenada por proveedor aplicada al cuerpo de la solicitud antes del reenvío. Admite cualquier ID de proveedor.", - "systemTransformsAddProvider": "Agregar proveedor", - "systemTransformsAddProviderPlaceholder": "Seleccione un proveedor...", - "systemTransformsAddProviderAllConfigured": "Todos los proveedores ya configurados", + "cliFingerprint": "Coincidencia de huella digital (fingerprint) de CLI", + "cliFingerprintDesc": "Normaliza las cabeceras de solicitud y los campos del cuerpo para que coincidan con las firmas de las herramientas CLI oficiales. Actívalo por proveedor.", + "cliFingerprintEnabled": "{count} proveedor(es) con huella digital de CLI activa", + "enableFingerprintTitle": "Activar huella digital para {provider}", + "disableFingerprintTitle": "Desactivar huella digital para {provider}", + "systemTransforms": "Pipeline de transformación de bloques del sistema", + "systemTransformsDesc": "Pipeline de transformaciones ordenado por proveedor, aplicado al cuerpo de la solicitud antes del reenvío. Admite cualquier ID de proveedor.", + "systemTransformsAddProvider": "Añadir proveedor", + "systemTransformsAddProviderPlaceholder": "Selecciona un proveedor…", + "systemTransformsAddProviderAllConfigured": "Todos los proveedores ya están configurados", "systemTransformsRemoveProvider": "Eliminar proveedor", - "systemTransformsNoProviders": "No hay proveedores configurados. Agregue un proveedor para comenzar.", + "systemTransformsNoProviders": "No hay proveedores configurados. Añade uno para empezar.", "systemTransformsOpMoveUp": "Subir", "systemTransformsOpMoveDown": "Bajar", "systemTransformsOpDelete": "Eliminar operación", "routingStrategy": "Estrategia de enrutamiento", - "routingAdvancedGuideTitle": "Guía de ruta avanzada", - "routingAdvancedGuideHint1": "Utilice Fill First para una prioridad predecible, Round Robin para equidad y P2C para resistencia a la latencia.", - "routingAdvancedGuideHint2": "Si los proveedores varían en calidad/costo, comience con Opción de costo para trabajo en segundo plano y Menos usado para desgaste equilibrado.", + "routingAdvancedGuideTitle": "Guía de enrutamiento avanzado", + "routingAdvancedGuideHint1": "Esta estrategia se sincroniza tanto con los valores predeterminados de los nuevos combos como con el enrutamiento de fallback global de la cuenta.", + "routingAdvancedGuideHint2": "Usa 'Fill First' para una prioridad de cuenta predecible, 'Round Robin' con 'Sticky Limit' para lotes de cuentas, y 'P2C' para resiliencia ante la latencia.", "fillFirst": "Llenar primero", - "fillFirstDesc": "Utilice cuentas en orden de prioridad", - "roundRobin": "Ronda Robin", - "roundRobinDesc": "Recorrer todas las cuentas", + "fillFirstDesc": "Usar cuentas en orden de prioridad", + "roundRobin": "Round Robin", + "roundRobinDesc": "Alternar entre todas las cuentas", "p2c": "P2C", - "p2cDesc": "Elige 2 al azar, usa el más saludable.", + "p2cDesc": "Elegir 2 al azar, usar el más saludable", "random": "Aleatorio", - "randomDesc": "Cuenta aleatoria cada solicitud", + "randomDesc": "Cuenta aleatoria en cada solicitud", "leastUsed": "Menos usado", - "leastUsedDesc": "Elija la cuenta utilizada menos recientemente", - "costOpt": "Opción de costo", - "costOptDesc": "Prefiere la cuenta más barata disponible", + "leastUsedDesc": "Elegir la cuenta menos usada recientemente", + "costOpt": "Optimización de costes", + "costOptDesc": "Preferir la cuenta disponible más barata", "resetAware": "RR con reconocimiento de reinicio", - "resetAwareDesc": "Prefiere cuentas con cuota restante saludable y reinicios más cercanos", - "strictRandom": "Strict Random", - "strictRandomDesc": "Shuffle deck — uses each account once before reshuffling", - "stickyLimit": "Límite fijo", - "stickyLimitDesc": "Llamadas por cuenta antes de cambiar", - "routingStrategyTitle": "Routing Strategy", - "routingStrategySubtitle": "Match 9router: account round-robin, sticky limits, and combo rotation", + "resetAwareDesc": "Preferir cuentas con cuota restante saludable y reinicios más cercanos", + "strictRandom": "Aleatorio estricto", + "strictRandomDesc": "Barajar: usa cada cuenta una vez antes de volver a barajar", + "stickyLimit": "Límite de persistencia (Sticky Limit)", + "stickyLimitDesc": "Llamadas por cuenta antes de cambiar cuando el fallback global usa Round Robin", + "routingStrategyTitle": "Estrategia de enrutamiento", + "routingStrategySubtitle": "Coincidir con 9router: round-robin de cuentas, límites de persistencia y rotación de combos", "accountRoundRobin": "Round Robin", - "accountRoundRobinDesc": "Cycle through accounts to distribute load", + "accountRoundRobinDesc": "Alternar entre cuentas para distribuir la carga", "comboRoundRobin": "Combo Round Robin", - "comboRoundRobinDesc": "Cycle through combo targets instead of always starting with the first", - "comboStickyLimit": "Combo Sticky Limit", - "comboStickyLimitDesc": "Calls per combo target before switching", - "routingStrategyAccountSummary": "Distributing requests across accounts with {limit} calls per account.", - "routingStrategyFillFirstSummary": "Using accounts in priority order (Fill First).", - "routingStrategyComboSummary": " Combos rotate after {limit} call(s) per target.", - "routingStrategyComboFallbackSummary": " Combos use each combo's configured strategy (default priority/fallback).", - "providerAccountRoutingTitle": "Multi-account routing", - "providerAccountRoutingDesc": "Override global account strategy for this provider (9router parity).", - "providerRoutingStrategy": "Account strategy", - "providerRoutingInheritGlobal": "Inherit global default", + "comboRoundRobinDesc": "Alternar entre objetivos de combo en lugar de empezar siempre por el primero", + "comboStickyLimit": "Límite de persistencia de combo", + "comboStickyLimitDesc": "Llamadas por objetivo de combo antes de cambiar", + "routingStrategyAccountSummary": "Distribuyendo solicitudes entre cuentas con {limit} llamadas por cuenta.", + "routingStrategyFillFirstSummary": "Usando cuentas en orden de prioridad (Fill First).", + "routingStrategyComboSummary": " Los combos rotan tras {limit} llamada(s) por objetivo.", + "routingStrategyComboFallbackSummary": " Los combos usan la estrategia configurada de cada combo (prioridad/fallback predeterminado).", + "providerAccountRoutingTitle": "Enrutamiento multicuenta", + "providerAccountRoutingDesc": "Sobrescribir la estrategia de cuenta global para este proveedor (paridad con 9router).", + "providerRoutingStrategy": "Estrategia de cuenta", + "providerRoutingInheritGlobal": "Heredar valor predeterminado global", "modelAliases": "Alias de modelo", - "modelAliasesTitle": "Aliases de Modelo", - "modelAliasesDesc": "Remap model names using exact matches or wildcard patterns.", - "addCustomAlias": "Agregar Alias Personalizado", - "deprecatedModelId": "ID del modelo obsoleto", - "newModelId": "Nuevo ID del modelo", - "customAliases": "Aliases Personalizados", - "builtInAliases": "Aliases Integrados", - "backgroundDegradationTitle": "Degradación de Tareas en Segundo Plano", - "backgroundDegradationDesc": "Detecta automáticamente tareas en segundo plano (títulos, resúmenes) y redirige a modelos más baratos", - "enableDegradation": "Activar Degradación en Segundo Plano", - "enableDegradationHint": "Cuando está activado, las tareas en segundo plano como generación de títulos y resúmenes se redirigen automáticamente a modelos más baratos", + "modelAliasesTitle": "Alias de modelo", + "modelAliasesDesc": "Remapear nombres de modelos usando coincidencias exactas o patrones comodín.", + "addCustomAlias": "Añadir alias personalizado", + "deprecatedModelId": "ID de modelo obsoleto", + "newModelId": "ID de modelo nuevo", + "customAliases": "Alias personalizados", + "builtInAliases": "Alias integrados", + "backgroundDegradationTitle": "Degradación de tareas en segundo plano", + "backgroundDegradationDesc": "Detectar automáticamente tareas en segundo plano (títulos, resúmenes) y enrutar a modelos más económicos", + "enableDegradation": "Activar degradación en segundo plano", + "enableDegradationHint": "Cuando está activado, las tareas en segundo plano como la generación de títulos y resúmenes se enrutan automáticamente a modelos más económicos", "tasksDetected": "Tareas detectadas", - "degradationMap": "Mapa de Degradación de Modelos", + "degradationMap": "Mapa de degradación de modelos", "premiumModel": "Modelo premium", "cheapModel": "Modelo económico", - "detectionPatterns": "Patrones de Detección", - "newPattern": "ej: \"generar un título\"", - "aliasPatternPlaceholder": "claude-soneto-*", - "aliasTargetPlaceholder": "claude-soneto-4-20250514", + "detectionPatterns": "Patrones de detección", + "newPattern": "ej. \"generate a title\"", + "aliasPatternPlaceholder": "claude-sonnet-*", + "aliasTargetPlaceholder": "claude-sonnet-4-20250514", "pattern": "Patrón", "targetModel": "Modelo objetivo", - "add": "+ Agregar", + "add": "+ Añadir", "session": "Sesión", "sessionDetailsAria": "Detalles de la sesión", "status": "Estado", "authenticated": "Autenticado", "guest": "Invitado", "loginTime": "Hora de inicio de sesión", - "sessionAge": "Edad de la sesión", + "sessionAge": "Antigüedad de la sesión", "browser": "Navegador", "clearLocalData": "Borrar datos locales", "logout": "Cerrar sesión", - "clearLocalDataConfirm": "¿Borrar todos los datos locales? Esto restablecerá sus preferencias.", + "clearLocalDataConfirm": "¿Borrar todos los datos locales? Esto restablecerá tus preferencias.", "unknown": "Desconocido", "systemActor": "sistema", "ipAccessControl": "Control de acceso IP", "ipAccessControlDesc": "Bloquear o permitir direcciones IP específicas", - "ipModeDisabled": "Discapacitado", + "ipModeDisabled": "Desactivado", "ipModeBlacklist": "Lista negra", "ipModeWhitelist": "Lista blanca", - "ipModeWhitelistPriority": "Prioridad WL", - "addIpAddress": "Agregar dirección IP", + "ipModeWhitelistPriority": "Prioridad de lista blanca", + "addIpAddress": "Añadir dirección IP", "ipAddressPlaceholder": "192.168.1.0/24 o 10.0.*.*", "block": "+ Bloquear", "allow": "+ Permitir", @@ -6556,1689 +6558,1689 @@ "temporaryBans": "Prohibiciones temporales ({count})", "minLeft": "{min}m restantes", "auditLog": "Registro de auditoría", - "searchAuditLogs": "Buscar registros de auditoría...", + "searchAuditLogs": "Buscar en los registros de auditoría...", "failedLoadAuditLog": "No se pudo cargar el registro de auditoría", "noAuditEvents": "No se encontraron eventos de auditoría", - "action": "acción", + "action": "Acción", "actor": "Actor", "details": "Detalles", - "time": "tiempo", - "fallbackChainsTitle": "Cadenas de respaldo", - "fallbackChainsDesc": "Definir el orden de reserva del proveedor por modelo", - "addChain": "+ Agregar cadena", + "time": "Hora", + "fallbackChainsTitle": "Cadenas de fallback", + "fallbackChainsDesc": "Definir el orden de fallback del proveedor por modelo", + "addChain": "+ Añadir cadena", "modelName": "Nombre del modelo", - "modelNamePlaceholder": "claude-soneto-4-20250514", + "modelNamePlaceholder": "claude-sonnet-4-20250514", "providersCommaSeparated": "Proveedores (separados por comas, en orden de prioridad)", - "providersCommaSeparatedPlaceholder": "antrópico, openai, géminis", + "providersCommaSeparatedPlaceholder": "anthropic, openai, gemini", "createChain": "Crear cadena", - "noFallbackChains": "Sin cadenas de respaldo", - "noFallbackChainsDesc": "Cree una cadena para definir el orden de reserva del proveedor para un modelo.", - "loadingFallbackChains": "Cargando cadenas de reserva...", - "deleteChainConfirm": "¿Eliminar la cadena alternativa para \"{model}\"?", + "noFallbackChains": "Sin cadenas de fallback", + "noFallbackChainsDesc": "Crea una cadena para definir el orden de fallback del proveedor para un modelo.", + "loadingFallbackChains": "Cargando cadenas de fallback...", + "deleteChainConfirm": "¿Eliminar la cadena de fallback para \"{model}\"?", "chainCreated": "Cadena creada para {model}", "chainDeleted": "Cadena eliminada para {model}", "failedCreateChain": "No se pudo crear la cadena", "failedDeleteChain": "No se pudo eliminar la cadena", "deleteChain": "Eliminar cadena", - "fillModelAndProviders": "Por favor complete el nombre del modelo y los proveedores", + "fillModelAndProviders": "Por favor, completa el nombre del modelo y los proveedores", "addAtLeastOneProvider": "Añade al menos un proveedor", - "comboDefaultsTitle": "Valores predeterminados combinados", - "comboDefaultsGuideTitle": "Cómo ajustar los valores predeterminados del combo", - "comboDefaultsGuideHint1": "Mantenga bajos los reintentos en flujos de baja latencia; aumente el tiempo de espera solo para tareas de larga generación.", - "comboDefaultsGuideHint2": "Utilice Ajustes específicos de proveedores cuando un proveedor necesite un comportamiento de tiempo de espera/reintento diferente al de los valores predeterminados globales.", - "globalComboConfig": "Configuración combinada global", - "moveUp": "Move up", - "moveDown": "Move down", - "allProvidersAdded": "All providers added", - "noProvidersFound": "No providers found", + "comboDefaultsTitle": "Valores predeterminados de combo", + "comboDefaultsGuideTitle": "Cómo ajustar los valores predeterminados de combo", + "comboDefaultsGuideHint1": "Mantén los reintentos bajos en flujos de baja latencia; aumenta el timeout solo para tareas de generación largas.", + "comboDefaultsGuideHint2": "Usa las anulaciones de proveedor cuando un proveedor necesite un comportamiento de timeout o reintentos diferente al de los valores predeterminados globales.", + "globalComboConfig": "Configuración global de combos", + "moveUp": "Mover arriba", + "moveDown": "Mover abajo", + "allProvidersAdded": "Todos los proveedores añadidos", + "noProvidersFound": "No se han encontrado proveedores", "defaultStrategy": "Estrategia predeterminada", - "defaultStrategyDesc": "Aplicado a nuevos combos sin estrategia explícita.", - "comboStrategyAria": "estrategia combinada", + "defaultStrategyDesc": "Se aplica a los nuevos combos sin estrategia explícita y se sincroniza con el enrutamiento de fallback global de la cuenta", + "comboStrategyAria": "Estrategia de combo", "priority": "Prioridad", - "weighted": "ponderado", + "weighted": "Ponderado", "contextRelay": "Context Relay", - "contextRelayDesc": "Hands off context between providers with automatic summarization", + "contextRelayDesc": "Enrutamiento de estilo prioritario con transferencias automáticas de contexto cuando se produce la rotación de cuentas", "maxRetriesLabel": "Reintentos máximos", "retryDelayLabel": "Retardo de reintento (ms)", - "timeoutLabel": "Tiempo de espera (ms)", - "healthCheck": "Control de salud", - "healthCheckDesc": "Verificar previamente la disponibilidad del proveedor", - "trackMetrics": "Seguimiento de métricas", - "trackMetricsDesc": "Registre métricas de solicitudes por combo", - "providerOverrides": "Ajustes específicos de proveedores", - "providerOverridesDesc": "Anule el tiempo de espera y los reintentos por proveedor. La configuración del proveedor anula los valores predeterminados globales.", - "providerMaxRetriesAria": "{provider} reintentos máximos", - "providerTimeoutAria": "{provider} tiempo de espera ms", - "removeProviderOverrideAria": "Eliminar la anulación de {provider}", - "selectProviderPlaceholder": "Select provider...", - "searchProviderPlaceholder": "Search providers...", - "searchProviderAria": "Search providers", - "newProviderNamePlaceholder": "por ej. google, openai...", - "newProviderNameAria": "Nuevo nombre del proveedor", + "timeoutLabel": "Timeout (ms)", + "healthCheck": "Comprobación de estado", + "healthCheckDesc": "Comprobar previamente la disponibilidad del proveedor", + "trackMetrics": "Rastrear métricas", + "trackMetricsDesc": "Registrar métricas de solicitudes por combo", + "providerOverrides": "Anulaciones de proveedor", + "providerOverridesDesc": "Anular el timeout y los reintentos por proveedor. Los ajustes del proveedor anulan los valores predeterminados globales.", + "providerMaxRetriesAria": "Reintentos máximos de {provider}", + "providerTimeoutAria": "Timeout en ms de {provider}", + "removeProviderOverrideAria": "Eliminar anulación de {provider}", + "selectProviderPlaceholder": "Seleccionar proveedor...", + "searchProviderPlaceholder": "Buscar proveedores...", + "searchProviderAria": "Buscar proveedores", + "newProviderNamePlaceholder": "ej. google, openai...", + "newProviderNameAria": "Nombre del nuevo proveedor", "retries": "reintentos", - "ms": "señora", - "saveComboDefaults": "Guardar valores predeterminados combinados", + "ms": "ms", + "saveComboDefaults": "Guardar valores predeterminados de combo", "maxNestingDepth": "Profundidad máxima de anidamiento", "concurrencyPerModel": "Concurrencia / Modelo", - "queueTimeout": "Tiempo de espera de cola (ms)", - "queueDepth": "Queue Depth", - "contextRelayHandoffThreshold": "Handoff Threshold", - "contextRelayMaxMessages": "Max Messages For Summary", - "contextRelaySummaryModel": "Summary Model", - "contextRelayProviderNote": "Context Relay currently generates handoffs for Codex accounts and uses these values as global defaults for new or unconfigured combos.", - "providerProfiles": "Perfiles de proveedores", - "providerProfilesDesc": "Configuraciones de resiliencia separadas para proveedores de OAuth (basado en sesiones) y de clave API (medidas). Los proveedores de OAuth tienen umbrales más estrictos debido a límites de tarifas más bajos.", - "oauthProviders": "Proveedores de OAuth", - "apiKeyProviders": "Proveedores de claves API", + "queueTimeout": "Timeout de cola (ms)", + "queueDepth": "Profundidad de cola", + "contextRelayHandoffThreshold": "Umbral de transferencia", + "contextRelayMaxMessages": "Mensajes máximos para resumen", + "contextRelaySummaryModel": "Modelo de resumen", + "contextRelayProviderNote": "Context Relay actualmente genera transferencias para cuentas de Codex y utiliza estos valores como valores predeterminados globales para combos nuevos o sin configurar.", + "providerProfiles": "Perfiles de proveedor", + "providerProfilesDesc": "Ajustes de resiliencia separados para proveedores OAuth (basados en sesión) y con clave de API (de pago por uso). Los proveedores OAuth tienen umbrales más estrictos debido a un rate limit más bajo.", + "oauthProviders": "Proveedores OAuth", + "apiKeyProviders": "Proveedores con clave de API", "transientCooldown": "Enfriamiento transitorio", - "rateLimitCooldown": "Enfriamiento del límite de velocidad", - "maxBackoffLevel": "Nivel máximo de retroceso", - "cbThreshold": "Umbral CB", - "cbResetTime": "Tiempo de reinicio del CB", - "rateLimiting": "Limitación de tasa", - "rateLimitingDesc": "Los proveedores de claves API tienen una velocidad limitada automáticamente con valores predeterminados seguros. Los límites se aprenden de los encabezados de respuesta y se adaptan con el tiempo.", + "rateLimitCooldown": "Enfriamiento por rate limit", + "maxBackoffLevel": "Nivel máximo de backoff", + "cbThreshold": "Umbral del disyuntor", + "cbResetTime": "Tiempo de restablecimiento del disyuntor", + "rateLimiting": "Control de rate limit", + "rateLimitingDesc": "Los proveedores con clave de API se limitan automáticamente con valores predeterminados seguros. Los límites se aprenden de las cabeceras de respuesta y se adaptan con el tiempo.", "defaultSafetyNet": "Red de seguridad predeterminada", "rpm": "RPM", - "minGap": "Brecha mínima", + "minGap": "Intervalo mínimo", "maxConcurrent": "Máximo concurrente", "activeLimiters": "Limitadores activos", - "noActiveLimiters": "Aún no hay limitadores de tarifas activos.", - "reservoir": "depósito", - "running": "corriendo", + "noActiveLimiters": "Aún no hay limitadores de rate limit activos.", + "reservoir": "Depósito", + "running": "En ejecución", "queued": "En cola", "circuitBreakers": "Disyuntores", "breakerStateClosed": "Cerrado", "breakerStateOpen": "Abierto", - "breakerStateHalfOpen": "Medio abierto", - "tripped": "{count} se disparó", - "healthy": "{count} saludable", + "breakerStateHalfOpen": "Semiavierto", + "tripped": "{count} disparados", + "healthy": "{count} saludables", "resetAll": "Restablecer todo", - "noCircuitBreakers": "Aún no hay disyuntores activos. Se crean automáticamente cuando las solicitudes fluyen a través del canal combinado.", - "failures": "{count} falla(s)", + "noCircuitBreakers": "Aún no hay circuit breakers activos. Se crean automáticamente cuando las solicitudes pasan por el pipeline del combo.", + "failures": "{count} error(es)", "policiesLocked": "Políticas e identificadores bloqueados", - "allOperational": "Todos los sistemas operativos: sin bloqueos ni disyuntores disparados", + "allOperational": "Todo operativo; sin bloqueos ni circuit breakers activados", "loadingPolicies": "Cargando políticas...", "lockedIdentifiers": "Identificadores bloqueados", "unlockedIdentifier": "Desbloqueado: {identifier}", - "sinceDate": "desde {date}", + "sinceDate": "desde el {date}", "forceUnlock": "Forzar desbloqueo", "unlocking": "Desbloqueando...", "failedUnlock": "No se pudo desbloquear", - "failedLoadWithStatus": "No se pudo cargar: {status}", + "failedLoadWithStatus": "Error al cargar: {status}", "failedLoadResilience": "No se pudo cargar el estado de resiliencia", "saveFailed": "Error al guardar", "resetFailed": "Error al restablecer", "loadingResilience": "Cargando estado de resiliencia...", "retry": "Reintentar", - "systemStorage": "Sistema y almacenamiento", - "allDataLocal": "Todos los datos almacenados localmente en su máquina", + "systemStorage": "Almacenamiento", + "allDataLocal": "Todos los datos se almacenan localmente en tu equipo", "databasePath": "Ruta de la base de datos", - "export": "Export", + "export": "Exportar", "exportDatabase": "Exportar base de datos", "exportAll": "Exportar todo (.tar.gz)", "importDatabase": "Importar base de datos", - "confirmDbImport": "Confirmar la importación de la base de datos", + "confirmDbImport": "Confirmar importación de base de datos", "confirmDbImportDesc": "Esto reemplazará todos los datos actuales con el contenido de {file}. Se creará una copia de seguridad automáticamente antes de la importación.", - "yesImport": "Si, importar", + "yesImport": "Sí, importar", "lastBackup": "Última copia de seguridad", - "noBackupYet": "Aún no hay copia de seguridad", - "backupNow": "Copia de seguridad ahora", + "noBackupYet": "Aún no hay copias de seguridad", + "backupNow": "Hacer copia de seguridad ahora", "backupRestore": "Copia de seguridad y restauración", "viewBackups": "Ver copias de seguridad", "hide": "Ocultar", - "backupRetentionDesc": "Las instantáneas de la base de datos se crean automáticamente antes de la restauración y cada 15 minutos cuando cambian los datos. Retención: 24 horas + 30 respaldos diarios con rotación inteligente.", + "backupRetentionDesc": "Las instantáneas de la base de datos se crean automáticamente antes de la restauración y cada 15 minutos cuando los datos cambian. Retención: 24 copias horarias + 30 diarias con rotación inteligente.", "loadingBackups": "Cargando copias de seguridad...", - "noBackupsYet": "Aún no hay copias de seguridad disponibles. Las copias de seguridad se crearán automáticamente cuando cambien los datos.", + "noBackupsYet": "Aún no hay copias de seguridad disponibles. Se crearán automáticamente cuando los datos cambien.", "backupsAvailable": "{count} copias de seguridad disponibles", "refresh": "Actualizar", "confirm": "¿Confirmar?", - "yes": "si", + "yes": "Sí", "no": "No", "restore": "Restaurar", - "invalidFileType": "Tipo de archivo no válido. Sólo se aceptan archivos .sqlite.", - "exportFailed": "Exportación fallida", - "exportFailedWithError": "Error al exportar: {error}", + "invalidFileType": "Tipo de archivo no válido. Solo se aceptan archivos .sqlite.", + "exportFailed": "Error en la exportación", + "exportFailedWithError": "Error en la exportación: {error}", "fullExportFailedWithError": "Error en la exportación completa: {error}", "backupCreated": "Copia de seguridad creada: {file}", - "restoreSuccess": "¡Restaurado! {connections} conexiones, {nodes} nodos, {combos} combos, {apiKeys} claves API.", - "importSuccess": "¡Base de datos importada! {connections} conexiones, {nodes} nodos, {combos} combos, {apiKeys} claves API.", + "restoreSuccess": "¡Restaurado! {connections} conexiones, {nodes} nodos, {combos} combos, {apiKeys} claves de API.", + "importSuccess": "¡Base de datos importada! {connections} conexiones, {nodes} nodos, {combos} combos, {apiKeys} claves de API.", "minutesAgo": "Hace {count}m", "hoursAgo": "Hace {count}h", "daysAgo": "Hace {count}d", - "backupReasonManual": "manuales", + "backupReasonManual": "manual", "backupReasonPreRestore": "pre-restauración", - "connectionsCount": "{count, plural, one {# connection} other {# connections}}", + "connectionsCount": "{count, plural, one {# conexión} other {# conexiones}}", "noChangesSinceBackup": "No hay cambios desde la última copia de seguridad", "backupFailed": "Error en la copia de seguridad", - "restoreFailed": "Restauración fallida", - "importFailed": "Importación fallida", - "errorDuringRestore": "Se produjo un error durante la restauración.", - "errorDuringImport": "Se produjo un error durante la importación.", + "restoreFailed": "Error en la restauración", + "importFailed": "Error en la importación", + "errorDuringRestore": "Se produjo un error durante la restauración", + "errorDuringImport": "Se produjo un error durante la importación", "modelPricing": "Precios del modelo", - "modelPricingDesc": "Configurar tarifas de costo por modelo • Todas las tarifas en tokens de $/1 millón", - "pricingCoverage": "Coverage", - "pricingAuth": "Auth", - "pricingSort": "Sort", - "pricingAll": "All", - "pricingAuthUnknown": "Unknown", - "pricingMostModels": "Most models", - "pricingHighestCoverage": "Highest coverage", - "pricingLowestCoverage": "Lowest coverage", - "pricingNameAscending": "Name (A–Z)", - "pricingCoverageGaps": "Coverage gaps", - "pricingClearFilters": "Clear filters", - "pricingShowingProviders": "Showing {visible} of {total}", - "pricingFilteredFrom": "(filtered from {count})", - "pricingShowMoreProviders": "Show {count} more ({remaining} remaining)", - "modelOverridesTitle": "Model Overrides", - "modelOverridesDesc": "Override provider/model capabilities used by routing and request shaping. Targets use the same provider/model form as combos.", - "searchModelOverrideTargets": "Search provider/model...", - "selectedModel": "Selected model", - "configured": "configured", - "none": "None", - "modelOverrideValuePlaceholder": "Numeric value", - "addKeyValue": "Add key value", - "noModelOverrides": "No overrides configured for this model.", - "modelOverrideLoadFailed": "Failed to load model overrides", - "modelOverrideSaved": "Model override saved", - "modelOverrideRemoved": "Model override removed", - "modelOverrideSaveFailed": "Failed to save model override", - "modelOverrideRemoveFailed": "Failed to remove model override", + "modelPricingDesc": "Configurar tarifas de costo por modelo • Todas las tarifas en $/1M tokens", + "pricingCoverage": "Cobertura", + "pricingAuth": "Autenticación", + "pricingSort": "Ordenar", + "pricingAll": "Todos", + "pricingAuthUnknown": "Desconocido", + "pricingMostModels": "La mayoría de los modelos", + "pricingHighestCoverage": "Mayor cobertura", + "pricingLowestCoverage": "Menor cobertura", + "pricingNameAscending": "Nombre (A–Z)", + "pricingCoverageGaps": "Brechas de cobertura", + "pricingClearFilters": "Borrar filtros", + "pricingShowingProviders": "Mostrando {visible} de {total}", + "pricingFilteredFrom": "(filtrado de {count})", + "pricingShowMoreProviders": "Mostrar {count} más ({remaining} restantes)", + "modelOverridesTitle": "Anulaciones de modelo", + "modelOverridesDesc": "Anular capacidades de proveedor/modelo utilizadas por el enrutamiento y el modelado de solicitudes. Los destinos usan el mismo formato de proveedor/modelo que los combos.", + "searchModelOverrideTargets": "Buscar proveedor/modelo...", + "selectedModel": "Modelo seleccionado", + "configured": "configurado", + "none": "Ninguno", + "modelOverrideValuePlaceholder": "Valor numérico", + "addKeyValue": "Añadir par clave-valor", + "noModelOverrides": "No hay anulaciones configuradas para este modelo.", + "modelOverrideLoadFailed": "Error al cargar las anulaciones de modelo", + "modelOverrideSaved": "Anulación de modelo guardada", + "modelOverrideRemoved": "Anulación de modelo eliminada", + "modelOverrideSaveFailed": "Error al guardar la anulación de modelo", + "modelOverrideRemoveFailed": "Error al eliminar la anulación de modelo", "registry": "Registro", - "priced": "Precio", + "priced": "Con precio", "searchProvidersModels": "Buscar proveedores o modelos...", "showAll": "Mostrar todo", "noProvidersMatch": "Ningún proveedor coincide con su búsqueda.", "howPricingWorks": "Cómo funcionan los precios", "cacheWrite": "Escritura en caché", - "unsaved": "no salvo", + "unsaved": "sin guardar", "resetDefaults": "__MISSING__:Reset defaults", "saveProvider": "Guardar proveedor", - "model": "modelo", - "models": "modelos", - "moreProviders": "{count} más proveedores", + "model": "Modelo", + "models": "Modelos", + "moreProviders": "{count} proveedores más", "withPricing": "con precios configurados", "policiesCircuitBreakers": "Políticas y disyuntores", "activeIssuesDetected": "Problemas activos detectados", "off": "Apagado", "resetPricingConfirm": "¿Restablecer todos los precios de {provider} a los valores predeterminados?", - "pricingDescInput": "Entrada: tokens enviados al modelo.", + "pricingDescInput": "Entrada: tokens enviados al modelo", "pricingDescOutput": "Salida: tokens generados", "pricingDescCached": "En caché: entrada reutilizada (~50% de la tasa de entrada)", - "pricingDescReasoning": "Razonamiento: tokens de pensamiento (vuelve a Salida)", - "pricingDescCacheWrite": "Escritura de caché: creación de entradas de caché (recurre a Entrada)", + "pricingDescReasoning": "Razonamiento: tokens de pensamiento (recurre a Salida)", + "pricingDescCacheWrite": "Escritura en caché: creación de entradas de caché (recurre a Entrada)", "pricingDescFormula": "Costo = (entrada × tasa_entrada) + (salida × tasa_salida) + (almacenado en caché × tasa_almacenamiento) por millón de tokens.", "pricingSettingsTitle": "Configuración de precios", "totalModels": "Modelos totales", "active": "Activo", "costCalculation": "Cálculo de costos", - "costCalculationDesc": "Los costos se calculan en función del uso de tokens y las tarifas de precios configuradas para cada modelo.", + "costCalculationDesc": "Los costos se calculan en función del uso de tokens y las tarifas configuradas para cada modelo.", "pricingFormat": "Formato de precios", - "pricingFormatDesc": "Todas las tarifas están en tokens de $/1 millón (dólares por millón de tokens).", + "pricingFormatDesc": "Todas las tarifas están en $/1M tokens (dólares por millón de tokens).", "tokenTypes": "Tipos de tokens", - "inputTokenDesc": "Fichas de aviso estándar", - "outputTokenDesc": "Fichas de finalización/respuesta", - "cachedTokenDesc": "Tokens de entrada almacenados en caché (normalmente el 50 % de la tasa de entrada)", - "reasoningTokenDesc": "Fichas especiales de razonamiento/pensamiento (retroceso a la tasa de producción)", - "cacheCreationTokenDesc": "Tokens utilizados para crear entradas de caché (retroceso a la tasa de entrada)", - "customPricingNote": "Puede anular los precios predeterminados para modelos específicos. Las Ajustes específicos personalizadas tienen prioridad sobre los precios detectados automáticamente.", + "inputTokenDesc": "Tokens de prompt estándar", + "outputTokenDesc": "Tokens de finalización/respuesta", + "cachedTokenDesc": "Tokens de entrada en caché (normalmente el 50% de la tasa de entrada)", + "reasoningTokenDesc": "Tokens especiales de razonamiento/pensamiento (recurre a la tasa de salida)", + "cacheCreationTokenDesc": "Tokens utilizados para crear entradas de caché (recurre a la tasa de entrada)", + "customPricingNote": "Puede anular los precios predeterminados para modelos específicos. Las anulaciones personalizadas tienen prioridad sobre los precios detectados automáticamente.", "editPricing": "Editar precios", "viewFullDetails": "Ver todos los detalles", "themeCoral": "Coral", - "adaptiveVolumeRouting": "Adaptive Volume Routing", - "adaptiveVolumeRoutingDesc": "Scale connections dynamically based on payload volume and throughput pressure.", - "lkgpToggleTitle": "Last Known Good Provider (LKGP)", - "lkgpToggleDesc": "When enabled, the router remembers which provider last served a successful response and tries it first on subsequent requests.", - "echoRequestedModelTitle": "Echo requested model name in responses", - "echoRequestedModelDesc": "When enabled, the response `model` field echoes the alias or combo name the client requested instead of the upstream model name. Fixes strict clients (e.g. Claude Desktop) that reject a response whose model does not match the request.", - "webSearchRouteTitle": "Web search routing", - "webSearchRouteDesc": "When a request includes a native web_search tool, route the whole request to this model instead of the default — useful for providers that don't implement Anthropic's web_search server tool. Leave blank to disable.", - "webSearchRoutePlaceholder": "Search or select a model…", - "paidModelPatternWarning": "This pattern only matches paid models — enable paid models or adjust the pattern.", - "clearLkgpCache": "Clear LKGP Cache", - "lkgpCacheCleared": "LKGP cache cleared successfully", - "lkgpCacheClearFailed": "Failed to clear LKGP cache", - "days": "Days", - "lkgp": "LKGP Mode", - "lkgpDesc": "Last Known Good Provider (Predictable resilience)", - "maintenance": "Maintenance", - "purgeExpiredLogs": "Purge Expired Logs", - "purgeLogsFailed": "Failed to purge logs", - "logsDeleted": "{count, plural, =0 {No expired logs purged} one {Purged # expired log} other {Purged # expired logs}}", - "resetUsageData": "Reset Usage Data", - "resetUsageDataDesc": "Select how far back you want to delete usage, request logs, and analytics data. Provider configuration, connections, API keys, combos, and settings are preserved. This action cannot be undone.", - "resetUsagePeriod_5m": "5 minutes", - "resetUsagePeriod_1h": "1 hour", - "resetUsagePeriod_3h": "3 hours", - "resetUsagePeriod_6h": "6 hours", - "resetUsagePeriod_12h": "12 hours", - "resetUsagePeriod_1d": "1 day", - "resetUsagePeriod_7d": "7 days", - "resetUsagePeriod_30d": "30 days", - "resetUsagePeriod_all": "All time", - "resetUsageSuccess": "{count, plural, =0 {No usage data rows deleted} one {Reset usage data (# row deleted)} other {Reset usage data (# rows deleted)}}", - "resetUsageFailed": "Failed to reset usage data", - "reset": "Reset", - "resetting": "Resetting...", - "contextOpt": "Context Optimized", - "contextOptDesc": "Routes based on context window requirements and conversation length", - "cacheOpt": "Cache Optimized", - "cacheOptDesc": "Keeps the same reusable prompt prefix on the same provider account", - "priorityDesc": "Sequential fallback - tries provider 1 first, then provider 2, and so on", - "weightedDesc": "Distributes traffic by percentage weights across providers", - "modelRoutingTitle": "Model Routing Rules", - "modelRoutingDesc": "Automatically route models to specific combos using glob patterns", - "addRule": "Add Rule", - "routeToCombo": "Route to Combo", - "selectCombo": "Select combo...", - "priorityHint": "Higher = checked first. Use 10+ for specific patterns.", - "patternHint": "Use * for any chars, ? for single char. Case-insensitive.", - "noRoutingRules": "No routing rules configured. Requests use the global combo by default.", - "routingRuleHint": "Add a rule like claude-opus* -> frontier-combo to automatically route requests.", - "deleteRoutingRule": "Delete this model routing rule?", - "exactMatchMode": "Exact Match", - "wildcardPatternMode": "Wildcard Pattern", - "exactMatchModeDesc": "Use exact aliases for deprecated or renamed model IDs.", - "wildcardPatternModeDesc": "Use wildcard aliases with * and ? when a family of models should map to one target.", - "noExactAliasesConfigured": "No exact-match aliases configured.", - "wildcardRulesTitle": "Wildcard Rules", - "noWildcardAliasesConfigured": "No wildcard aliases configured.", - "overview": "Overview", - "unknownError": "Unknown Error", - "pricingSourceLiteLLM": "Pricing Source Lite Llm", - "clearSyncedPricingConfirm": "Clear Synced Pricing Confirm", - "clearSyncedPricingFailed": "Clear Synced Pricing Failed", - "pricingSourceUser": "Pricing Source User", - "pageDescription": "Page Description", - "pricingSyncStatus": "Pricing Sync Status", - "whitelist": "Whitelist", - "syncDisabled": "Sync Disabled", - "pricingLoadFailed": "Pricing Load Failed", - "pricingSyncDescription": "Pricing Sync Description", - "clearSyncedPricingSuccess": "Clear Synced Pricing Success", + "adaptiveVolumeRouting": "Enrutamiento de volumen adaptativo", + "adaptiveVolumeRoutingDesc": "Escalar conexiones dinámicamente según el volumen de carga y la presión de rendimiento.", + "lkgpToggleTitle": "Proveedor funcional conocido (LKGP)", + "lkgpToggleDesc": "Cuando está habilitado, el enrutador recuerda qué proveedor sirvió por última vez una respuesta exitosa y lo intenta primero en solicitudes posteriores.", + "echoRequestedModelTitle": "Hacer eco del nombre del modelo solicitado en las respuestas", + "echoRequestedModelDesc": "Cuando está habilitado, el campo `model` de la respuesta hace eco del alias o nombre de combo que el cliente solicitó en lugar del nombre del modelo upstream. Corrige a clientes estrictos (p. ej., Claude Desktop) que rechazan una respuesta cuyo modelo no coincide con la solicitud.", + "webSearchRouteTitle": "Enrutamiento de búsqueda web", + "webSearchRouteDesc": "Cuando una solicitud incluye una herramienta web_search nativa, enrutar toda la solicitud a este modelo en lugar del predeterminado; útil para proveedores que no implementan la herramienta de servidor web_search de Anthropic. Dejar en blanco para deshabilitar.", + "webSearchRoutePlaceholder": "Buscar o seleccionar un modelo...", + "paidModelPatternWarning": "Este patrón solo coincide con modelos de pago; habilite modelos de pago o ajuste el patrón.", + "clearLkgpCache": "Borrar caché LKGP", + "lkgpCacheCleared": "Caché LKGP borrada correctamente", + "lkgpCacheClearFailed": "Error al borrar la caché LKGP", + "days": "Días", + "lkgp": "Modo LKGP", + "lkgpDesc": "Proveedor funcional conocido (resiliencia predecible)", + "maintenance": "Mantenimiento", + "purgeExpiredLogs": "Purgar registros caducados", + "purgeLogsFailed": "Error al purgar registros", + "logsDeleted": "{count, plural, =0 {No se purgaron registros caducados} one {Purgado # registro caducado} other {Purgados # registros caducados}}", + "resetUsageData": "Restablecer datos de uso", + "resetUsageDataDesc": "Seleccione cuánto tiempo atrás desea eliminar los datos de uso, registros de solicitudes y analíticas. La configuración del proveedor, las conexiones, las claves de API, los combos y los ajustes se conservan. Esta acción no se puede deshacer.", + "resetUsagePeriod_5m": "5 minutos", + "resetUsagePeriod_1h": "1 hora", + "resetUsagePeriod_3h": "3 horas", + "resetUsagePeriod_6h": "6 horas", + "resetUsagePeriod_12h": "12 horas", + "resetUsagePeriod_1d": "1 día", + "resetUsagePeriod_7d": "7 días", + "resetUsagePeriod_30d": "30 días", + "resetUsagePeriod_all": "Todo el tiempo", + "resetUsageSuccess": "{count, plural, =0 {No se eliminaron filas de datos de uso} one {Datos de uso restablecidos (# fila eliminada)} other {Datos de uso restablecidos (# filas eliminadas)}}", + "resetUsageFailed": "Error al restablecer los datos de uso", + "reset": "Restablecer", + "resetting": "Restableciendo...", + "contextOpt": "Optimizado para contexto", + "contextOptDesc": "Enruta según los requisitos de la ventana de contexto y la longitud de la conversación", + "cacheOpt": "Optimizado para caché", + "cacheOptDesc": "Mantiene el mismo prefijo de prompt reutilizable en la misma cuenta de proveedor", + "priorityDesc": "Fallback secuencial: intenta primero con el proveedor 1, luego con el proveedor 2, y así sucesivamente", + "weightedDesc": "Distribuye el tráfico por pesos porcentuales entre los proveedores", + "modelRoutingTitle": "Reglas de enrutamiento de modelos", + "modelRoutingDesc": "Enrutar automáticamente modelos a combos específicos usando patrones glob", + "addRule": "Añadir regla", + "routeToCombo": "Enrutar a combo", + "selectCombo": "Seleccionar combo...", + "priorityHint": "Mayor = comprobado primero. Use 10+ para patrones específicos.", + "patternHint": "Use * para cualquier carácter, ? para un solo carácter. No distingue entre mayúsculas y minúsculas.", + "noRoutingRules": "No hay reglas de enrutamiento configuradas. Las solicitudes usan el combo global por defecto.", + "routingRuleHint": "Añada una regla como claude-opus* -> frontier-combo para enrutar solicitudes automáticamente.", + "deleteRoutingRule": "¿Eliminar esta regla de enrutamiento de modelo?", + "exactMatchMode": "Coincidencia exacta", + "wildcardPatternMode": "Patrón comodín", + "exactMatchModeDesc": "Use alias exactos para IDs de modelo obsoletos o renombrados.", + "wildcardPatternModeDesc": "Use alias comodín con * y ? cuando una familia de modelos deba asignarse a un destino.", + "noExactAliasesConfigured": "No hay alias de coincidencia exacta configurados.", + "wildcardRulesTitle": "Reglas de comodín", + "noWildcardAliasesConfigured": "No hay alias comodín configurados.", + "overview": "Visión general", + "unknownError": "Error desconocido", + "pricingSourceLiteLLM": "LiteLLM (Comunidad)", + "clearSyncedPricingConfirm": "¿Borrar todos los datos de precios sincronizados? Se utilizarán los valores predeterminados del proveedor.", + "clearSyncedPricingFailed": "Error al borrar los precios sincronizados", + "pricingSourceUser": "Anulación de usuario", + "pageDescription": "Gestionar ajustes de la aplicación, alias de modelos, precios y reglas de enrutamiento", + "pricingSyncStatus": "Estado de sincronización", + "whitelist": "Lista blanca", + "syncDisabled": "Sincronización deshabilitada", + "pricingLoadFailed": "Error al cargar los datos de precios", + "pricingSyncDescription": "Sincronizar automáticamente los precios de los modelos desde fuentes externas para mantener precisos los cálculos de costos", + "clearSyncedPricingSuccess": "Datos de precios sincronizados borrados", "clearSyncedPricingFailedWithReason": "No se pudo borrar el precio: {reason}", - "pricingSourceDefault": "Pricing Source Default", - "pricingSyncSuccess": "Pricing Sync Success", - "enableSyncError": "Enable Sync Error", - "syncEnabled": "Sync Enabled", - "blacklist": "Blacklist", - "pricingSourceModelsDev": "Pricing Source Models Dev", - "syncedModels": "Synced Models", - "budget": "Budget", - "pricingSyncTitle": "Pricing Sync Title", + "pricingSourceDefault": "Predeterminado integrado", + "pricingSyncSuccess": "Precios sincronizados correctamente", + "enableSyncError": "Error al alternar la sincronización de precios", + "syncEnabled": "Sincronización habilitada", + "blacklist": "Lista negra", + "pricingSourceModelsDev": "Models.dev", + "syncedModels": "Modelos sincronizados", + "budget": "Presupuesto", + "pricingSyncTitle": "Sincronización de precios", "pricingResetFailedWithReason": "No se pudo restablecer el precio: {reason}", - "tab": "Tab", + "tab": "Pestaña", "pricingSavedProvider": "Precios guardados para {provider}", - "pricingSyncFailed": "Pricing Sync Failed", + "pricingSyncFailed": "Error al sincronizar los precios", "pricingSaveFailedWithReason": "No se pudo guardar el precio: {reason}", "pricingResetProvider": "Restablecimiento de precios para {provider}", - "nextSync": "Next Sync", + "nextSync": "Siguiente sincronización", "pricingSyncFailedWithReason": "Falló la sincronización de precios: {reason}", - "clearSyncedPricing": "Clear Synced Pricing", - "compressionTitle": "Prompt Compression", - "compressionDesc": "Reduce token usage by compressing prompts before sending to providers", - "compressionGuidanceFullGuideLink": "Full compression guide", - "compressionGuidanceShow": "Details", - "compressionGuidanceHide": "Hide details", - "compressionGuidanceSafeDefault": "Safe default", - "compressionGuidanceCacheImpact": "Cache impact", - "tokenSaverTitle": "Token Saver", - "tokenSaverSubtitle": "Spend fewer tokens on every request.", - "tokenSaverToolOutput": "Tool output", - "tokenSaverToolOutputDesc": "Clean git, grep, ls, tree, and log output before it reaches the provider.", - "tokenSaverLlmOutput": "LLM output", - "tokenSaverLlmOutputDesc": "Inject terse response instructions without rewriting provider output.", - "tokenSaverInputCompression": "Input compression", - "tokenSaverInputCompressionDesc": "Rewrite eligible chat history while preserving code, URLs, and intent.", - "tokenSaverFineTunePrefix": "Fine-tune each engine on", - "tokenSaverFineTuneSuffix": "or combine engines per request on", - "compressionMode": "Compression Mode", - "compressionModeOff": "Off", - "compressionModeOffDesc": "No compression applied", - "compressionModeLite": "Lite", - "compressionModeLiteDesc": "Whitespace and blank line reduction", - "compressionModeStandard": "Standard (Caveman)", - "compressionModeStandardDesc": "Rule-based compression with 30+ patterns, preserves code blocks and URLs", - "compressionModeAggressive": "Aggressive", - "compressionModeAggressiveDesc": "Summarization + tool result compression + progressive aging for maximum savings", + "clearSyncedPricing": "Borrar precios sincronizados", + "compressionTitle": "Compresión de prompts", + "compressionDesc": "Reduce el uso de tokens comprimiendo los prompts antes de enviarlos a los proveedores", + "compressionGuidanceFullGuideLink": "Guía completa de compresión", + "compressionGuidanceShow": "Detalles", + "compressionGuidanceHide": "Ocultar detalles", + "compressionGuidanceSafeDefault": "Predeterminado seguro", + "compressionGuidanceCacheImpact": "Impacto en caché", + "tokenSaverTitle": "Ahorro de tokens", + "tokenSaverSubtitle": "Gasta menos tokens en cada solicitud.", + "tokenSaverToolOutput": "Salida de herramientas", + "tokenSaverToolOutputDesc": "Limpia la salida de git, grep, ls, tree y log antes de que llegue al proveedor.", + "tokenSaverLlmOutput": "Salida de LLM", + "tokenSaverLlmOutputDesc": "Inyecta instrucciones de respuesta concisas sin reescribir la salida del proveedor.", + "tokenSaverInputCompression": "Compresión de entrada", + "tokenSaverInputCompressionDesc": "Reescribe el historial de chat apto conservando código, URLs e intención.", + "tokenSaverFineTunePrefix": "Ajustar cada motor en", + "tokenSaverFineTuneSuffix": "o combinar motores por solicitud en", + "compressionMode": "Modo de compresión", + "compressionModeOff": "Desactivado", + "compressionModeOffDesc": "Sin compresión aplicada", + "compressionModeLite": "Ligero", + "compressionModeLiteDesc": "Reducción de espacios en blanco y líneas en blanco", + "compressionModeStandard": "Estándar (Caveman)", + "compressionModeStandardDesc": "Compresión basada en reglas con más de 30 patrones, conserva bloques de código y URLs", + "compressionModeAggressive": "Agresivo", + "compressionModeAggressiveDesc": "Resumen + compresión de resultados de herramientas + envejecimiento progresivo para un ahorro máximo", "compressionModeUltra": "Ultra", - "compressionModeUltraDesc": "Maximum compression with all techniques including semantic deduplication", - "compressionAggressiveConfig": "Configuración agresiva del motor", - "compressionAggressiveConfigDesc": "Ajustar el resumen, la compresión de herramientas y los umbrales de antigüedad", + "compressionModeUltraDesc": "Poda heurística de tokens con fallback a SLM local opcional", + "compressionAggressiveConfig": "Configuración del motor agresivo", + "compressionAggressiveConfigDesc": "Ajusta con precisión el resumen, la compresión de herramientas y los umbrales de antigüedad", "compressionUltraConfig": "Configuración del motor ultra", - "compressionUltraConfigDesc": "Ajuste la poda heurística, el respaldo de SLM y los umbrales por mensaje", - "compressionUltraRate": "Mantener tasa", + "compressionUltraConfigDesc": "Ajusta con precisión la poda heurística, el fallback de SLM y los umbrales por mensaje", + "compressionUltraRate": "Tasa de retención", "compressionUltraMinScore": "Umbral de puntuación mínima", - "compressionUltraSlmFallback": "Regreso a lo agresivo", + "compressionUltraSlmFallback": "Fallback a agresivo", "compressionUltraModelPath": "Ruta del modelo SLM", - "compressionUltraEngine": "Ultra tier", - "compressionUltraEngineHeuristic": "Heuristic (Tier-A, default)", - "compressionUltraEngineSlm": "SLM (LLMLingua-2, opt-in)", - "compressionUltraSlmHint": "SLM downloads a small ONNX model on first use (cold-start) and transparently falls back to the heuristic on timeout or if unavailable.", - "compressionUltraSlmPrewarm": "Pre-warm SLM model on enable", + "compressionUltraEngine": "Nivel Ultra", + "compressionUltraEngineHeuristic": "Heurístico (Nivel A, predeterminado)", + "compressionUltraEngineSlm": "SLM (LLMLingua-2, opcional)", + "compressionUltraSlmHint": "SLM descarga un modelo ONNX pequeño en el primer uso (inicio en frío) y recurre de forma transparente al heurístico si se agota el tiempo de espera o no está disponible.", + "compressionUltraSlmPrewarm": "Precalentar el modelo SLM al habilitarlo", "compressionSummarizerEnabled": "Habilitar resumen", - "compressionMaxTokensPerMessage": "Tokens máximos por mensaje", + "compressionMaxTokensPerMessage": "Máximo de tokens por mensaje", "compressionMinSavings": "Umbral mínimo de ahorro", "compressionAgingThresholds": "Umbrales de envejecimiento", - "compressionAgingThresholdsDesc": "Número de mensajes recientes mantenidos en cada nivel de antigüedad (mayor = más conservados)", + "compressionAgingThresholdsDesc": "Número de mensajes recientes conservados en cada nivel de antigüedad (mayor = mayor conservación)", "compressionToolStrategies": "Estrategias de resultados de herramientas", - "compressionToolStrategiesDesc": "Alternar estrategias de compresión para diferentes tipos de resultados de herramientas", - "compressionGeneral": "General Settings", - "compressionAutoTrigger": "Auto-Trigger Threshold", - "compressionCacheTTL": "Cache TTL", - "compressionPreserveSystem": "Preserve System Prompt", - "compressionPreserveSystemAlways": "Always", - "compressionPreserveSystemWhenNoCache": "When no cache", - "compressionPreserveSystemNever": "Never", - "compressionLiveZoneTitle": "Cache-aligned Live Zone", - "compressionLiveZoneDesc": "Keep the compressed conversation prefix stable and process only newly appended items.", - "compressionExclusionsTitle": "Compression Exclusions", - "compressionExclusionsDesc": "Model ids or provider/model patterns that must never be compressed. `*` is the only wildcard (e.g. `openai/*`, `*embedding*`). A matching request passes through byte-identical — no compression engine runs.", - "compressionExclusionsPlaceholder": "One pattern per line, e.g.\nopenai/text-embedding-3-large\nanthropic/*", - "compressionExclusionsSave": "Save", - "compressionExclusionsSaved": "Saved", - "compressionExclusionsCount": "{count, plural, one {# exclusion} other {# exclusions}} configured", - "compressionExclusionsEmpty": "No exclusions configured — every model/endpoint is eligible for compression (default behavior).", - "compressionCavemanConfig": "Caveman Engine Configuration", - "compressionCavemanConfigDesc": "Fine-tune the rule-based compression engine", - "compressionCavemanPanelHint": "Its on/off and level are set in the panel:", - "compressionRoles": "Compress Message Roles", - "compressionRoleUser": "User", - "compressionRoleAssistant": "Assistant", - "compressionRoleSystem": "System", - "compressionMinLength": "Minimum Message Length", - "compressionSkipRules": "Skip Compression Rules", - "compressionSkipRulesDesc": "Click rules to skip them during compression", - "compressionPreservePatterns": "Preserve Patterns", - "compressionPreservePatternsDesc": "Regex patterns that are never compressed (one per line)", - "compressionLogTitle": "Compression Log", - "compressionLogEmpty": "No compressed requests yet. Compression stats will appear here when requests are processed with compression enabled.", + "compressionToolStrategiesDesc": "Alterna las estrategias de compresión para diferentes tipos de resultados de herramientas", + "compressionGeneral": "Ajustes generales", + "compressionAutoTrigger": "Umbral de activación automática", + "compressionCacheTTL": "TTL de caché", + "compressionPreserveSystem": "Conservar prompt del sistema", + "compressionPreserveSystemAlways": "Siempre", + "compressionPreserveSystemWhenNoCache": "Cuando no hay caché", + "compressionPreserveSystemNever": "Nunca", + "compressionLiveZoneTitle": "Zona activa alineada con la caché", + "compressionLiveZoneDesc": "Mantiene estable el prefijo de la conversación comprimida y procesa solo los elementos recién añadidos.", + "compressionExclusionsTitle": "Exclusiones de compresión", + "compressionExclusionsDesc": "IDs de modelo o patrones de proveedor/modelo que nunca deben comprimirse. `*` es el único comodín (p. ej., `openai/*`, `*embedding*`). Una solicitud que coincida pasa idéntica a nivel de bytes; no se ejecuta ningún motor de compresión.", + "compressionExclusionsPlaceholder": "Un patrón por línea, p. ej.\nopenai/text-embedding-3-large\nanthropic/*", + "compressionExclusionsSave": "Guardar", + "compressionExclusionsSaved": "Guardado", + "compressionExclusionsCount": "{count, plural, one {# exclusión configurada} other {# exclusiones configuradas}}", + "compressionExclusionsEmpty": "No hay exclusiones configuradas; todos los modelos/endpoints son aptos para la compresión (comportamiento predeterminado).", + "compressionCavemanConfig": "Configuración del motor Caveman", + "compressionCavemanConfigDesc": "Ajusta con precisión el motor de compresión basado en reglas", + "compressionCavemanPanelHint": "Su estado de activación y nivel se configuran en el panel:", + "compressionRoles": "Roles de mensaje a comprimir", + "compressionRoleUser": "Usuario", + "compressionRoleAssistant": "Asistente", + "compressionRoleSystem": "Sistema", + "compressionMinLength": "Longitud mínima de mensaje", + "compressionSkipRules": "Omitir reglas de compresión", + "compressionSkipRulesDesc": "Haz clic en las reglas para omitirlas durante la compresión", + "compressionPreservePatterns": "Conservar patrones", + "compressionPreservePatternsDesc": "Patrones de expresiones regulares que nunca se comprimen (uno por línea)", + "compressionLogTitle": "Registro de compresión", + "compressionLogEmpty": "Aún no hay solicitudes comprimidas. Las estadísticas de compresión aparecerán aquí cuando se procesen solicitudes con la compresión habilitada.", "minutes": "minutos", "compressionModeRtk": "RTK", - "compressionModeRtkDesc": "Command-aware tool output filtering", - "compressionModeCodexResponses": "Respuestas Codex", - "compressionModeCodexResponsesDesc": "Comprime transcripciones de salidas de herramientas según el formato de Respuestas Codex.", - "compressionModeStacked": "Stacked", - "compressionModeStackedDesc": "RTK tool-output filtering followed by Caveman message compression", - "qdrantTitle": "Qdrant (Vector memory)", - "qdrantDesc": "Optional. Indexes semantic memories in an external vector database for faster retrieval.", - "qdrantStatusActive": "Active", + "compressionModeRtkDesc": "Filtrado de salidas de herramientas compatible con comandos", + "compressionModeCodexResponses": "Salida de herramientas de Respuestas", + "compressionModeCodexResponsesDesc": "Compresión conservadora para salidas válidas de shell, patch, search, build y JSON", + "compressionModeStacked": "Apilado", + "compressionModeStackedDesc": "Filtrado de salidas de herramientas RTK seguido de la compresión de mensajes Caveman", + "qdrantTitle": "Qdrant (Memoria vectorial)", + "qdrantDesc": "Opcional. Indexa recuerdos semánticos en una base de datos vectorial externa para una recuperación más rápida.", + "qdrantStatusActive": "Activo", "qdrantStatusError": "Error", - "qdrantStatusDisabled": "Disabled", - "qdrantEnable": "Enable Qdrant", - "qdrantEnableDesc": "When enabled, semantic/hybrid strategy can use Qdrant to retrieve memories.", - "qdrantTesting": "Testing...", - "qdrantTestConnection": "Test connection", - "qdrantSaved": "Configuration saved", - "qdrantSaveError": "Failed to save configuration", - "qdrantHostHint": "Without port. Example: 127.0.0.1 or http://qdrant", - "qdrantPort": "Port", - "qdrantPortHint": "Qdrant default: 6333", - "qdrantCollectionHint": "Where memory points will be stored.", - "qdrantEmbeddingModel": "Embedding model", - "qdrantHelpTitle": "Quick setup help", - "qdrantHelpQuickTitle": "Quick setup (Qdrant + OpenRouter)", - "qdrantHelpStep1": "1. Host: Qdrant IP/URL, Port: 6333, Collection: omniroute_memory.", - "qdrantHelpStep2": "2. If using nvidia/llama-nemotron-embed-vl-1b-v2:free, use collection dimension 2048.", - "qdrantHelpStep3": "3. Model field: openrouter/nvidia/llama-nemotron-embed-vl-1b-v2:free.", - "qdrantHelpStep4": "4. Save, test connection, then test search.", - "qdrantEmbeddingQuickSelect": "Quick select from discovered models...", + "qdrantStatusDisabled": "Desactivado", + "qdrantEnable": "Habilitar Qdrant", + "qdrantEnableDesc": "Cuando está habilitado, la estrategia semántica/híbrida puede usar Qdrant para recuperar recuerdos.", + "qdrantTesting": "Probando...", + "qdrantTestConnection": "Probar conexión", + "qdrantSaved": "Configuración guardada", + "qdrantSaveError": "Error al guardar la configuración", + "qdrantHostHint": "Sin puerto. Ejemplo: 127.0.0.1 o http://qdrant", + "qdrantPort": "Puerto", + "qdrantPortHint": "Predeterminado de Qdrant: 6333", + "qdrantCollectionHint": "Dónde se almacenarán los puntos de memoria.", + "qdrantEmbeddingModel": "Modelo de embedding", + "qdrantHelpTitle": "Ayuda de configuración rápida", + "qdrantHelpQuickTitle": "Configuración rápida (Qdrant + OpenRouter)", + "qdrantHelpStep1": "1. Host: IP/URL de Qdrant, Puerto: 6333, Colección: omniroute_memory.", + "qdrantHelpStep2": "2. Si usas nvidia/llama-nemotron-embed-vl-1b-v2:free, usa una dimensión de colección de 2048.", + "qdrantHelpStep3": "3. Campo de modelo: openrouter/nvidia/llama-nemotron-embed-vl-1b-v2:free.", + "qdrantHelpStep4": "4. Guarda, prueba la conexión y luego prueba la búsqueda.", + "qdrantEmbeddingQuickSelect": "Selección rápida de modelos descubiertos...", "qdrantEmbeddingInputPlaceholder": "openai/text-embedding-3-small", - "qdrantEmbeddingHint": "Format: provider/model. The provider credential must be configured.", - "qdrantApiKeyPlaceholderKeep": "(leave empty to keep current key)", - "qdrantApiKeyPlaceholderOptional": "(leave empty if not used)", - "qdrantSaveHint": "Tip: edit host/port/collection/model and click Save. API key is optional.", - "qdrantSearchTestTitle": "Search test", - "qdrantSearchTestDesc": "Generates embedding and searches in Qdrant.", - "qdrantSearchPlaceholder": "Example: user preferences, history, etc", - "qdrantNoResults": "No results (or Qdrant is not configured).", - "qdrantCleanupTitle": "Retention and cleanup", - "qdrantCleanupDesc": "Removes expired and old points based on", - "searching": "Searching...", - "cleaning": "Cleaning...", - "cleanNow": "Clean now", + "qdrantEmbeddingHint": "Formato: proveedor/modelo. Las credenciales del proveedor deben estar configuradas.", + "qdrantApiKeyPlaceholderKeep": "(dejar en blanco para mantener la clave actual)", + "qdrantApiKeyPlaceholderOptional": "(dejar en blanco si no se usa)", + "qdrantSaveHint": "Consejo: edita el host, puerto, colección o modelo y haz clic en Guardar. La clave de API es opcional.", + "qdrantSearchTestTitle": "Prueba de búsqueda", + "qdrantSearchTestDesc": "Genera un embedding y realiza una búsqueda en Qdrant.", + "qdrantSearchPlaceholder": "Ejemplo: preferencias de usuario, historial, etc.", + "qdrantNoResults": "Sin resultados (o Qdrant no está configurado).", + "qdrantCleanupTitle": "Retención y limpieza", + "qdrantCleanupDesc": "Elimina los puntos caducados y antiguos según", + "searching": "Buscando...", + "cleaning": "Limpiando...", + "cleanNow": "Limpiar ahora", "optional": "Opcional", "current": "Actual", "remove": "Quitar", "search": "Buscar", - "oneproxyTitle": "1proxy Mercado de proxy gratuito", - "oneproxyTotalProxies": "Representantes totales", - "oneproxyAvgQuality": "Calidad promedio", - "resilienceScope": "Alcance:", + "oneproxyTitle": "Mercado de proxy gratuito de 1proxy", + "oneproxyTotalProxies": "Proxies totales", + "oneproxyAvgQuality": "Calidad media", + "resilienceScope": "Ámbito:", "resilienceTrigger": "Desencadenante:", "resilienceEffect": "Efecto:", - "resilienceRequestQueueTitle": "Request Queue & Rate", - "resilienceAutoEnableApiKeyProviders": "Auto-enable for API-key providers", - "resilienceRequestsPerMinute": "Requests per minute", - "resilienceMinTimeBetweenRequests": "Minimum time between requests", - "resilienceConcurrentRequests": "Concurrent requests", + "resilienceRequestQueueTitle": "Cola de solicitudes y tasa", + "resilienceAutoEnableApiKeyProviders": "Habilitar automáticamente para proveedores con clave de API", + "resilienceRequestsPerMinute": "Solicitudes por minuto", + "resilienceMinTimeBetweenRequests": "Tiempo mínimo entre solicitudes", + "resilienceConcurrentRequests": "Solicitudes simultáneas", "resilienceMaxQueueWaitTime": "Tiempo máximo de espera en cola", - "resilienceBaseCooldown": "Base cooldown", - "resilienceUseUpstreamRetryHints": "Use upstream retry hints", - "resilienceDefaultPerProvider": "Default (per provider)", - "resilienceAlwaysOn": "Always on", - "resilienceAlwaysOff": "Always off", + "resilienceBaseCooldown": "Enfriamiento base", + "resilienceUseUpstreamRetryHints": "Usar indicaciones de reintento del servidor superior", + "resilienceDefaultPerProvider": "Predeterminado (por proveedor)", + "resilienceAlwaysOn": "Siempre activado", + "resilienceAlwaysOff": "Siempre desactivado", "routingRemoveEntry": "Eliminar entrada", - "routingNeedlesSubstrings": "Agujas (subcadenas para combinar)", - "routingCaseSensitive": "Distingue entre mayúsculas y minúsculas", + "routingNeedlesSubstrings": "Términos de búsqueda (subcadenas a coincidir)", + "routingCaseSensitive": "Distingue mayúsculas y minúsculas", "routingPrefixes": "Prefijos", - "routingMatch": "Partido", + "routingMatch": "Coincidencia", "routingReplacement": "Reemplazo", "routingReplaceAllOccurrences": "Reemplazar todas las ocurrencias", - "routingPatternRegex": "Patrón (expresión regular)", - "routingFlags": "Banderas", - "routingNeedles": "Agujas", + "routingPatternRegex": "Patrón (regex)", + "routingFlags": "Indicadores", + "routingNeedles": "Términos de búsqueda", "routingBlockText": "Bloquear texto", - "routingIdempotencyKey": "clave de idempotencia", + "routingIdempotencyKey": "Clave de idempotencia", "routingEntrypoint": "Punto de entrada", "routingVersionFormat": "Formato de versión", - "routingCchAlgorithm": "algoritmo CCH", - "routingWordsToObfuscate": "Palabras para ofuscar (ZWJ insertado después del primer carácter)", - "logsSettingsTitle": "Configuración de registros", + "routingCchAlgorithm": "Algoritmo CCH", + "routingWordsToObfuscate": "Palabras a ofuscar (ZWJ insertado tras el primer carácter)", + "logsSettingsTitle": "Ajustes de registros", "detailedLogsLabel": "Registros detallados habilitados", - "detailedLogsDesc": "Habilitar el registro detallado de solicitudes/respuestas", - "callLogPipelineLabel": "Canalización de registro de llamadas", - "callLogPipelineDesc": "Habilitar la canalización de procesamiento del registro de llamadas", - "maxDetailSizeLabel": "Tamaño máximo de detalle (KB)", - "maxDetailSizeDesc": "Tamaño máximo para entradas de registro detalladas", - "ringBufferSizeLabel": "Tamaño del búfer de anillo", - "ringBufferSizeDesc": "Tamaño del búfer circular para registros", + "detailedLogsDesc": "Habilitar el registro detallado de solicitudes y respuestas", + "callLogPipelineLabel": "Pipeline de registro de llamadas", + "callLogPipelineDesc": "Habilitar el pipeline de procesamiento de registros de llamadas", + "maxDetailSizeLabel": "Tamaño máximo de detalles (KB)", + "maxDetailSizeDesc": "Tamaño máximo para las entradas de registro detalladas", + "ringBufferSizeLabel": "Tamaño del búfer circular", + "ringBufferSizeDesc": "Tamaño del búfer circular para los registros", "semanticCacheEnabledLabel": "Caché semántica habilitada", - "semanticCacheMaxSizeLabel": "Tamaño máximo de caché semántica", - "semanticCacheMaxSizeDesc": "Número máximo de entradas de caché semántica", - "semanticCacheTTLLabel": "TTL de caché semántica", - "promptCacheEnabledLabel": "Caché de aviso habilitado", - "promptCacheEnabledDesc": "Habilitar el almacenamiento en caché de avisos", - "promptCacheStrategyLabel": "Estrategia de caché rápida", - "promptCacheStrategyDesc": "Estrategia para el almacenamiento en caché rápido", + "semanticCacheMaxSizeLabel": "Tamaño máximo de la caché semántica", + "semanticCacheMaxSizeDesc": "Número máximo de entradas en la caché semántica", + "semanticCacheTTLLabel": "TTL de la caché semántica", + "promptCacheEnabledLabel": "Caché de prompts habilitada", + "promptCacheEnabledDesc": "Habilitar el almacenamiento en caché de prompts", + "promptCacheStrategyLabel": "Estrategia de caché de prompt", + "promptCacheStrategyDesc": "Estrategia para el almacenamiento en caché de prompts", "alwaysPreserveClientCacheLabel": "Preservar siempre la caché del cliente", "alwaysPreserveClientCacheDesc": "Política de preservación de caché del cliente", "logRetentionPolicyTitle": "Política de retención de registros", - "resilienceUseUpstream429HintsForBreaker": "Utilice sugerencias 429 ascendentes (interruptor)", + "resilienceUseUpstream429HintsForBreaker": "Usar sugerencias 429 ascendentes (interruptor)", "appearanceLogoPreviewAlt": "Vista previa del logotipo", "appearanceFaviconPreviewAlt": "Vista previa del favicon", "oneproxyLastSync": "Última sincronización", "oneproxyAllProtocols": "Todos los protocolos", - "oneproxyCountryCodePlaceholder": "Código de país (por ejemplo, EE. UU.)", + "oneproxyCountryCodePlaceholder": "Código de país (p. ej., US)", "oneproxyMinQualityPlaceholder": "Calidad mínima", - "oneproxyLoadingProxies": "Cargando servidores proxy...", + "oneproxyLoadingProxies": "Cargando proxies...", "oneproxyLastSyncLabel": "Última sincronización:", "oneproxyProxiesFetched": "Proxies obtenidos:", "oneproxyConsecutiveFailures": "Fallos consecutivos:", "oneproxyErrorLabel": "Error:", - "oneproxyNever": "nunca", + "oneproxyNever": "Nunca", "oneproxySyncStatusTitle": "Estado de sincronización", "oneproxySuccess": "Éxito", "oneproxyFailed": "Fallido", - "routingAntigravitySignatureTitle": "Modo de caché de firma antigravedad", - "routingAntigravitySignatureDesc": "Control whether OmniRoute reuses only stored Gemini thought signatures or accepts validated client-provided signatures in Antigravity-compatible tool-call flows.", - "routingAntigravitySignatureEnabledLabel": "Enabled", - "routingAntigravitySignatureEnabledDesc": "Current behavior. Ignore client-provided signatures and keep using the stored OmniRoute flow.", + "routingAntigravitySignatureTitle": "Modo de caché de firma Antigravity", + "routingAntigravitySignatureDesc": "Controla si OmniRoute reutiliza solo las firmas de razonamiento de Gemini almacenadas o acepta firmas validadas proporcionadas por el cliente en flujos de llamadas a herramientas compatibles con Antigravity.", + "routingAntigravitySignatureEnabledLabel": "Activado", + "routingAntigravitySignatureEnabledDesc": "Comportamiento actual. Ignora las firmas proporcionadas por el cliente y sigue usando el flujo de OmniRoute almacenado.", "routingAntigravitySignatureBypassLabel": "Bypass", - "routingAntigravitySignatureBypassDesc": "Accept client-provided signatures after lightweight validation and fall back to the stored signature when invalid.", - "routingAntigravitySignatureBypassStrictLabel": "Bypass Strict", - "routingAntigravitySignatureBypassStrictDesc": "Require full protobuf validation before accepting a client-provided signature.", + "routingAntigravitySignatureBypassDesc": "Acepta firmas proporcionadas por el cliente tras una validación ligera y recurre a la firma almacenada si no es válida.", + "routingAntigravitySignatureBypassStrictLabel": "Bypass estricto", + "routingAntigravitySignatureBypassStrictDesc": "Requiere una validación protobuf completa antes de aceptar una firma proporcionada por el cliente.", "routingHeaderFingerprintTitle": "Huella digital del encabezado (por proveedor)", "routingServerRejectedSave": "⚠ El servidor rechazó guardar:", "routingAddTransformOp": "Agregar una operación de transformación", "routingClientCacheControlTitle": "Control de caché del cliente", - "routingClientCacheControlDesc": "Configure whether OmniRoute preserves client-provided cache_control markers", - "routingClientCacheControlAutoDesc": "For deterministic Claude-compatible flows, preserve client-provided cache_control as-is. If the request has no cache_control, OmniRoute does not inject any bridge-owned markers for CC-compatible third-party proxy compatibility.", - "routingClientCacheControlAlwaysLabel": "Always Preserve", - "routingClientCacheControlAlwaysDesc": "Always forward client-provided cache_control headers to upstream providers as-is.", - "routingClientCacheControlNeverLabel": "Never Preserve", - "routingClientCacheControlNeverDesc": "Always remove client cache_control headers and let OmniRoute manage caching where native provider flows support it.", + "routingClientCacheControlDesc": "Configura si OmniRoute preserva los marcadores cache_control proporcionados por el cliente.", + "routingClientCacheControlAutoDesc": "Para flujos deterministas compatibles con Claude, preserva el cache_control proporcionado por el cliente tal cual. Si la solicitud no tiene cache_control, OmniRoute no inyecta ningún marcador propio para mantener la compatibilidad con proxies de terceros compatibles con CC.", + "routingClientCacheControlAlwaysLabel": "Preservar siempre", + "routingClientCacheControlAlwaysDesc": "Reenvía siempre los encabezados cache_control proporcionados por el cliente a los proveedores ascendentes tal cual.", + "routingClientCacheControlNeverLabel": "No preservar nunca", + "routingClientCacheControlNeverDesc": "Elimina siempre los encabezados cache_control del cliente y permite que OmniRoute gestione el almacenamiento en caché donde los flujos nativos del proveedor lo admitan.", "routingZeroConfigTitle": "Enrutamiento automático sin configuración", - "routingZeroConfigDesc": "Enable automatic provider selection using the auto/ prefix. When enabled, requests to auto, auto/coding, auto/fast, etc. will dynamically route across all connected providers.", + "routingZeroConfigDesc": "Habilita la selección automática de proveedores usando el prefijo auto/. Cuando está activado, las solicitudes a auto, auto/coding, auto/fast, etc., se enrutarán dinámicamente entre todos los proveedores conectados.", "routingDefaultAutoVariant": "Variante automática predeterminada", - "visionBridge": "Puente de visión", - "visionBridgeDesc": "Run an automatic vision-to-text fallback before routing image requests to text-only models.", - "visionBridgeEnabledLabel": "Enabled", - "visionBridgeEnabledDesc": "Toggle the pre-call bridge that replaces image parts with extracted text.", + "visionBridge": "Vision Bridge", + "visionBridgeDesc": "Ejecuta un fallback automático de visión a texto antes de enrutar solicitudes de imágenes a modelos solo de texto.", + "visionBridgeEnabledLabel": "Activado", + "visionBridgeEnabledDesc": "Activa el puente de pre-llamada que reemplaza las partes de imagen con texto extraído.", "visionBridgeModel": "Modelo de puente", "visionBridgeModelPlaceholder": "openai/gpt-4o-mini", - "visionBridgeModelHint": "Any OmniRoute model ID that supports vision can be used here.", - "visionBridgePrompt": "Aviso de puente", + "visionBridgeModelHint": "Se puede usar cualquier ID de modelo de OmniRoute que admita visión.", + "visionBridgePrompt": "Prompt del puente", "visionBridgePromptPlaceholder": "Describe esta imagen de manera concisa.", - "visionBridgePromptHint": "Sent to the vision model before the extracted description is injected back into the original request.", + "visionBridgePromptHint": "Se envía al modelo de visión antes de que la descripción extraída se inyecte de nuevo en la solicitud original.", "visionBridgeTimeoutMs": "Tiempo de espera (ms)", "visionBridgeMaxImagesPerRequest": "Máximo de imágenes por solicitud", - "resilienceMaxBackoffSteps": "Max backoff steps", - "resilienceProviderBreakerTitle": "Circuit Breaker per Provider", - "resilienceFailureThreshold": "Failure threshold", - "resilienceDegradationThreshold": "Degradation threshold", - "resilienceResetTimeout": "Restablecer el tiempo de espera", - "resilienceFailureThresholdLabel": "Umbral de falla", - "resilienceResetTimeoutLabel": "Restablecer el tiempo de espera", - "resilienceConnectionCooldownTitle": "Connection Cooldown", - "resilienceUseUpstreamRetryHintsLabel": "Utilice sugerencias de reintento ascendentes", - "resilienceUseUpstream429BreakerLabel": "Utilice sugerencias 429 ascendentes (interruptor)", - "resilienceMaxBackoffStepsLabel": "Pasos máximos de retroceso", - "resilienceYes": "si", + "resilienceMaxBackoffSteps": "Pasos máximos de backoff", + "resilienceProviderBreakerTitle": "Circuit Breaker por proveedor", + "resilienceFailureThreshold": "Umbral de fallos", + "resilienceDegradationThreshold": "Umbral de degradación", + "resilienceResetTimeout": "Restablecer tiempo de espera", + "resilienceFailureThresholdLabel": "Umbral de fallos", + "resilienceResetTimeoutLabel": "Restablecer tiempo de espera", + "resilienceConnectionCooldownTitle": "Enfriamiento de conexión", + "resilienceUseUpstreamRetryHintsLabel": "Usar sugerencias de reintento ascendentes", + "resilienceUseUpstream429BreakerLabel": "Usar sugerencias 429 ascendentes (interruptor)", + "resilienceMaxBackoffStepsLabel": "Pasos máximos de backoff", + "resilienceYes": "Sí", "resilienceNo": "No", - "resilienceDefault": "Default", - "storageDatabaseBackupRetention": "Retención de copias de seguridad", - "storageDatabaseBackups": "Database backups", - "storageBackupRetentionDescription": "Automatic SQLite backups are stored in", - "storageBackupRetentionHelp": "Configure how many snapshots to keep and optionally delete backups older than a chosen number of days.", - "storageBackupCount": "{count} backups", - "storageBackupMaximum": "Max {count}", - "storageBackupAgeRetention": "{count}d retention", - "storageBackupAgeRetentionOff": "Age retention off", - "storageBackupKeepLatest": "Keep latest backups", - "storageBackupDeleteOlderThan": "Delete older than days", - "storageBackupSaveRetention": "Save retention", - "storageBackupCleanOld": "Clean old backups", - "storageDatabaseStatistics": "Database Statistics", - "storageIntegrityNotChecked": "Not checked", - "backupRetentionSaved": "Backup retention saved.", - "backupRetentionSaveFailed": "Failed to save backup retention", - "backupCleanupSuccess": "Deleted {backups} backup set(s) and {files} file(s).", - "backupCleanupFailed": "Failed to clean database backups", - "purgeQuotaSnapshotsSuccess": "Purged {count} quota snapshots", - "purgeQuotaSnapshotsFailed": "Failed to purge quota snapshots", - "purgeCallLogsSuccess": "Purged {count} call logs", - "purgeCallLogsFailed": "Failed to purge call logs", - "purgeDetailedLogsSuccess": "Purged {count} detailed logs", - "purgeDetailedLogsFailed": "Failed to purge detailed logs", - "vacuumCompleted": "VACUUM completed", - "vacuumFailed": "VACUUM failed", - "jsonExportFailed": "JSON export failed", - "invalidJsonFileType": "Invalid file type. Only .json files are allowed.", - "legacyJsonImportSuccess": "Legacy JSON imported successfully!", - "jsonImportFailed": "Failed to import JSON", - "jsonImportError": "Error during JSON import", + "resilienceDefault": "Predeterminado", + "storageDatabaseBackupRetention": "Retención de copias de seguridad de base de datos", + "storageDatabaseBackups": "Copias de seguridad de base de datos", + "storageBackupRetentionDescription": "Las copias de seguridad automáticas de SQLite se almacenan en", + "storageBackupRetentionHelp": "Configura cuántas instantáneas conservar y, opcionalmente, elimina las copias de seguridad anteriores a un número determinado de días.", + "storageBackupCount": "{count} copias de seguridad", + "storageBackupMaximum": "Máx. {count}", + "storageBackupAgeRetention": "Retención de {count}d", + "storageBackupAgeRetentionOff": "Retención por antigüedad desactivada", + "storageBackupKeepLatest": "Conservar copias de seguridad más recientes", + "storageBackupDeleteOlderThan": "Eliminar anteriores a (días)", + "storageBackupSaveRetention": "Guardar retención", + "storageBackupCleanOld": "Limpiar copias de seguridad antiguas", + "storageDatabaseStatistics": "Estadísticas de base de datos", + "storageIntegrityNotChecked": "No verificado", + "backupRetentionSaved": "Retención de copias de seguridad guardada.", + "backupRetentionSaveFailed": "Error al guardar la retención de copias de seguridad", + "backupCleanupSuccess": "Se eliminaron {backups} conjunto(s) de copia de seguridad y {files} archivo(s).", + "backupCleanupFailed": "Error al limpiar las copias de seguridad de la base de datos", + "purgeQuotaSnapshotsSuccess": "Se purgaron {count} instantáneas de cuota", + "purgeQuotaSnapshotsFailed": "Error al purgar las instantáneas de cuota", + "purgeCallLogsSuccess": "Se purgaron {count} registros de llamadas", + "purgeCallLogsFailed": "Error al purgar los registros de llamadas", + "purgeDetailedLogsSuccess": "Se purgaron {count} registros detallados", + "purgeDetailedLogsFailed": "Error al purgar los registros detallados", + "vacuumCompleted": "VACUUM completado", + "vacuumFailed": "VACUUM fallido", + "jsonExportFailed": "Error en la exportación JSON", + "invalidJsonFileType": "Tipo de archivo no válido. Solo se permiten archivos .json.", + "legacyJsonImportSuccess": "¡JSON heredado importado correctamente!", + "jsonImportFailed": "Error al importar JSON", + "jsonImportError": "Error durante la importación JSON", "storagePurgeData": "Purgar datos", - "storagePurgeDataDesc": "Immediately delete all records without applying retention checks. Use with caution.", - "storageRetentionCleanup": "Retention Settings", - "storageRetentionCleanupDesc": "Configure operational record retention and database backup cleanup.", - "retentionCallDays": "Call {count}d", + "storagePurgeDataDesc": "Elimina inmediatamente todos los registros sin aplicar comprobaciones de retención. Úsalo con precaución.", + "storageRetentionCleanup": "Ajustes de retención", + "storageRetentionCleanupDesc": "Configura la retención de registros operativos y la limpieza de copias de seguridad de la base de datos.", + "retentionCallDays": "Llamadas {count}d", "retentionAppDays": "App {count}d", - "retentionRows": "{count} rows", + "retentionRows": "{count} filas", "retentionQuotaSnapshots": "Instantáneas de cuota (días)", - "retentionCompressionAnalytics": "Compression Analytics (days)", + "retentionCompressionAnalytics": "Análisis de compresión (días)", "retentionMcpAudit": "Auditoría MCP (días)", "retentionA2aEvents": "Eventos A2A (días)", "retentionCallLogs": "Registros de llamadas (días)", "retentionUsageHistory": "Historial de uso (días)", "retentionMemoryEntries": "Entradas de memoria (días)", - "retentionXpAuditLog": "XP Audit Log (days)", - "saveRetentionSettings": "Save retention settings", + "retentionXpAuditLog": "Registro de auditoría XP (días)", + "saveRetentionSettings": "Guardar ajustes de retención", "storageAutoVacuumMode": "Modo de vacío automático", "storageScheduledVacuum": "Vacío programado", "storageVacuumHour": "Hora de vacío (0-23)", "storagePageSize": "Tamaño de página (bytes)", - "storageOptimizationSettings": "Optimization Settings", - "storageJournalModeNone": "None", - "storageJournalModeFull": "Full", + "storageOptimizationSettings": "Ajustes de optimización", + "storageJournalModeNone": "Ninguno", + "storageJournalModeFull": "Completo", "storageJournalModeIncremental": "Incremental", - "storageVacuumNever": "Never", - "storageVacuumDaily": "Daily", - "storageVacuumWeekly": "Weekly", - "storageVacuumMonthly": "Monthly", - "storageCacheSizeKb": "Cache Size (KB)", - "storageOptimizeOnStartup": "Optimize on Startup", - "storageSaveOptimization": "Save Optimization Settings", - "storageCompressionAggregation": "Compression & Aggregation Settings", - "storageEnableAggregation": "Enable Data Aggregation", - "storageRawDataRetention": "Raw Data Retention (days)", - "storageGranularity": "Granularity", - "storageHourly": "Hourly", - "storageDaily": "Daily", - "storageWeekly": "Weekly", - "storageSaveAggregation": "Save Aggregation Settings", - "exportJson": "Export JSON", - "importJson": "Import JSON", - "manualVacuum": "Manual VACUUM", - "purgeQuotaSnapshots": "Purge Quota Snapshots", - "purgeCallLogs": "Purge Call Logs", - "purgeDetailedLogs": "Purge Detailed Logs", + "storageVacuumNever": "Nunca", + "storageVacuumDaily": "Diario", + "storageVacuumWeekly": "Semanal", + "storageVacuumMonthly": "Mensual", + "storageCacheSizeKb": "Tamaño de caché (KB)", + "storageOptimizeOnStartup": "Optimizar al iniciar", + "storageSaveOptimization": "Guardar ajustes de optimización", + "storageCompressionAggregation": "Ajustes de compresión y agregación", + "storageEnableAggregation": "Habilitar agregación de datos", + "storageRawDataRetention": "Retención de datos sin procesar (días)", + "storageGranularity": "Granularidad", + "storageHourly": "Por hora", + "storageDaily": "Diario", + "storageWeekly": "Semanal", + "storageSaveAggregation": "Guardar ajustes de agregación", + "exportJson": "Exportar JSON", + "importJson": "Importar JSON", + "manualVacuum": "VACUUM manual", + "purgeQuotaSnapshots": "Purgar instantáneas de cuota", + "purgeCallLogs": "Purgar registros de llamadas", + "purgeDetailedLogs": "Purgar registros detallados", "storageDatabaseSize": "Tamaño de la base de datos", "storagePageCount": "Conteo de páginas", "storageFreelistCount": "Recuento de listas libres", - "storageLastVacuum": "último vacío", + "storageLastVacuum": "Último vacío", "storageLastOptimization": "Última optimización", "storageIntegrityCheck": "Verificación de integridad", - "storageIntegrityOk": "✓ Aceptar", - "storageIntegrityError": "✗Error", - "storageUsageTokenBuffer": "Búfer de token de uso", - "storageUsageTokenBufferDesc": "Extra tokens added to reported usage to account for system prompt overhead.", - "storageUsageTokenBufferHint": "Set to 0 to report raw provider token counts. Default: 2000.", - "storageUsageTokenBufferCurrent": "Current: {value}", - "redisLauncherTitle": "Local Redis", - "redisLauncherDesc": "One-click launch a Redis 7 container (Podman or Docker) for response cache, quota tracking, and rate limiting.", - "redisLauncherRefresh": "Refresh", - "redisLauncherStop": "Stop", - "redisLauncherLaunching": "Launching...", - "redisLauncherLaunch": "Launch Redis", - "redisLauncherContainer": "Container", - "redisLauncherRunning": "Running", - "redisLauncherReachable": "Reachable", + "storageIntegrityOk": "✓ OK", + "storageIntegrityError": "✗ Error", + "storageUsageTokenBuffer": "Búfer de tokens de uso", + "storageUsageTokenBufferDesc": "Tokens adicionales añadidos al uso reportado para compensar el overhead del prompt del sistema.", + "storageUsageTokenBufferHint": "Establecer en 0 para reportar conteos de tokens brutos del proveedor. Predeterminado: 2000.", + "storageUsageTokenBufferCurrent": "Actual: {value}", + "redisLauncherTitle": "Redis local", + "redisLauncherDesc": "Inicia con un clic un contenedor Redis 7 (Podman o Docker) para caché de respuestas, seguimiento de cuotas y rate limit.", + "redisLauncherRefresh": "Actualizar", + "redisLauncherStop": "Detener", + "redisLauncherLaunching": "Iniciando...", + "redisLauncherLaunch": "Iniciar Redis", + "redisLauncherContainer": "Contenedor", + "redisLauncherRunning": "En ejecución", + "redisLauncherReachable": "Accesible", "redisLauncherError": "Error: {message}", - "redisLauncherHint": "Equivalent to running `omniroute redis up`. The container is named `omniroute-redis` and listens on 127.0.0.1:6379.", + "redisLauncherHint": "Equivalente a ejecutar `omniroute redis up`. El contenedor se llama `omniroute-redis` y escucha en 127.0.0.1:6379.", "compressionSettingsAutoTriggerMode": "Modo de disparo automático", "compressionSettingsMcpDescriptionCompression": "Compresión de descripción MCP", - "mcpAccessibilityTitle": "MCP accessibility output", + "mcpAccessibilityTitle": "Salida de accesibilidad MCP", "compressionSettingsCavemanIntensity": "Intensidad cavernícola", "compressionSettingsCavemanOutputMode": "Modo de salida cavernícola", - "compressionSettingsOutputStyles": "Output styles", - "compressionStylesTileTitle": "Output styles", + "compressionSettingsOutputStyles": "Estilos de salida", + "compressionStylesTileTitle": "Estilos de salida", "compressionSettingsOutputIntensity": "Intensidad de salida", "compressionSettingsAutoClarityBypass": "Bypass de claridad automática", - "compressionEffectivePipeline": "Effective pipeline:", - "compressionDerivedOff": "off", - "compressionDerivedRuns": "runs: {pipeline}", - "compressionDerivedMode": "mode: {mode}", - "compressionAdaptiveOff": "Adaptive context budget: off (legacy auto-trigger)", - "compressionAdaptiveTarget": "Adaptive ({mode}, policy: {policy}) — target ≈ {target, number} tokens (for a {contextLimit, number}-token window)", - "compressionOutputStylesDescription": "Inject response-shaping instructions without rewriting provider output. Combine freely.", - "mcpAccessibilityDescription": "Scopes MCP tool outputs (separate store).", - "compressionStylesTileSummary": "{tokens, number} tokens saved · {runs, plural, one {# run styled} other {# runs styled}}", - "compressionStylesTileEmpty": "No styled runs yet.", + "compressionEffectivePipeline": "Pipeline efectivo:", + "compressionDerivedOff": "desactivado", + "compressionDerivedRuns": "ejecuciones: {pipeline}", + "compressionDerivedMode": "modo: {mode}", + "compressionAdaptiveOff": "Presupuesto de contexto adaptativo: desactivado (activación automática heredada)", + "compressionAdaptiveTarget": "Adaptativo ({mode}, política: {policy}) — objetivo ≈ {target, number} tokens (para una ventana de {contextLimit, number} tokens)", + "compressionOutputStylesDescription": "Inyecta instrucciones de formato de respuesta sin reescribir la salida del proveedor. Combínalas libremente.", + "mcpAccessibilityDescription": "Define el ámbito de las salidas de herramientas MCP (almacenamiento separado).", + "compressionStylesTileSummary": "{tokens, number} tokens guardados · {runs, plural, one {# ejecución con estilo} other {# ejecuciones con estilo}}", + "compressionStylesTileEmpty": "Todavía no hay ejecuciones con estilo.", "compressionLevel": { - "minimal": "Minimal", - "standard": "Standard", - "aggressive": "Aggressive", - "lite": "Lite", - "full": "Full", + "minimal": "Mínimo", + "standard": "Estándar", + "aggressive": "Agresivo", + "lite": "Ligero", + "full": "Completo", "ultra": "Ultra" }, "compressionEngine": { "session-dedup": { - "label": "Session Dedup", - "description": "Cross-turn block deduplication." + "label": "Deduplicación de sesión", + "description": "Deduplicación de bloques entre turnos." }, "ccr": { - "label": "CCR (Retrieval)", - "description": "Content-addressed retrieval markers." + "label": "CCR (Recuperación)", + "description": "Marcadores de recuperación direccionados por contenido." }, "lite": { - "label": "Lite", - "description": "Whitespace and format cleanup." + "label": "Ligero", + "description": "Limpieza de espacios en blanco y formatos." }, "rtk": { "label": "RTK", - "description": "Command-output filtering." + "description": "Filtrado de salidas de comandos." }, "codex-responses": { - "label": "Responses Tool Output", - "description": "Conservative compression for supported Responses tool outputs." + "label": "Salida de herramientas de respuestas", + "description": "Compresión conservadora para las salidas de herramientas de respuestas compatibles." }, "headroom": { - "label": "Headroom", - "description": "Tabular JSON compaction." + "label": "Margen", + "description": "Compactación de JSON tabular." }, "relevance": { - "label": "Relevance", - "description": "Extractive sentence scoring against the last user query." + "label": "Relevancia", + "description": "Puntuación de frases extractivas frente a la última consulta del usuario." }, "caveman": { "label": "Caveman", - "description": "Rule-based prose compression." + "description": "Compresión de prosa basada en reglas." }, "aggressive": { - "label": "Aggressive", - "description": "Summarize and age old turns." + "label": "Agresivo", + "description": "Resumir y envejecer turnos antiguos." }, "llmlingua": { "label": "LLMLingua (SLM)", - "description": "Semantic pruning (ONNX)." + "description": "Poda semántica (ONNX)." }, "ultra": { "label": "Ultra", - "description": "Heuristic token pruning with an optional SLM." + "description": "Poda heurística de tokens con un SLM opcional." }, "omniglyph": { "label": "OmniGlyph", - "description": "Context as an image (Claude Fable 5, direct route)." + "description": "Contexto como imagen (Claude Fable 5, ruta directa)." } }, "compressionOutputStyle": { "terse-prose": { - "label": "Terse prose", - "description": "Drop filler, articles, and hedging while keeping technical substance exact." + "label": "Prosa concisa", + "description": "Elimina palabras de relleno, artículos y matices protectores manteniendo intacta la sustancia técnica." }, "less-code": { - "label": "Less code", - "description": "YAGNI ladder: smallest working change, no unrequested abstractions." + "label": "Menos código", + "description": "Escala YAGNI: el cambio funcional más pequeño, sin abstracciones no solicitadas." }, "ponytail": { "label": "Ponytail (lazy senior dev)", "description": "Lazy senior-dev discipline: climb the YAGNI ladder, fix root cause, smallest working diff." }, "terse-cjk": { - "label": "Terse CJK (文言)", - "description": "Classical-Chinese ultra-terse style (available only for Chinese)." + "label": "CJK conciso (文言)", + "description": "Estilo ultra conciso en chino clásico (disponible solo para chino)." } }, - "resilienceWaitForCooldown": "Esperar a que se enfríe", - "resilienceEnableServerSideWait": "Habilitar la espera del lado del servidor", + "resilienceWaitForCooldown": "Esperar al enfriamiento", + "resilienceEnableServerSideWait": "Habilitar la espera en el servidor", "resilienceMaximumRetries": "Reintentos máximos", "resilienceMaximumWaitPerRetry": "Espera máxima por reintento", - "memorySkillsSkillsmpMarketplace": "Mercado de habilidades MP", - "memorySkillsFailedToSave": "No se pudo guardar", - "memorySkillsApiKey": "Clave API", + "memorySkillsSkillsmpMarketplace": "Marketplace de SkillsMP", + "memorySkillsFailedToSave": "Error al guardar", + "memorySkillsApiKey": "Clave de API", "memorySkillsActiveSkillsProvider": "Proveedor de habilidades activas", - "cliproxyapiFallback": "Reserva de CLIProxyAPI", - "cliproxyapiEnableFallback": "Habilitar el respaldo de CLIProxyAPI", + "cliproxyapiFallback": "Fallback de CLIProxyAPI", + "cliproxyapiEnableFallback": "Habilitar el fallback de CLIProxyAPI", "cliproxyapiUrl": "URL de CLIProxyAPI", "cliproxyapiStatus": "Estado de CLIProxyAPI", "cliproxyapiNotDetected": "No detectado", - "cliproxyapiImportAuthTitle": "Import accounts from CLIProxyAPI", - "cliproxyapiImportAuthDesc": "Import the OAuth accounts CLIProxyAPI already saved in ~/.cli-proxy-api/ as OmniRoute connections, so you don't have to log in to each account again. Supported account types (Gemini, Codex, Claude, Antigravity, Qwen, Kimi) are imported; others are skipped.", - "cliproxyapiImportAuthButton": "Import accounts", - "payloadRulesTitle": "Reglas de carga útil", - "payloadRulesDesc": "Configure request payload mutations by model and protocol. Changes are persisted in settings and hot reloaded into the runtime immediately after save.", - "payloadRuleDefaultTitle": "default", - "payloadRuleDefaultDesc": "Applies params only when the target path is missing from the outgoing payload.", - "payloadRuleOverrideTitle": "override", - "payloadRuleOverrideDesc": "Forces values onto the payload, replacing anything already present at that path.", - "payloadRuleFilterTitle": "filter", - "payloadRuleFilterDesc": "Removes blocked params from the payload before the upstream request is sent.", + "cliproxyapiImportAuthTitle": "Importar cuentas de CLIProxyAPI", + "cliproxyapiImportAuthDesc": "Importa las cuentas OAuth que CLIProxyAPI ya tiene guardadas en ~/.cli-proxy-api/ como conexiones de OmniRoute para que no tengas que iniciar sesión en cada una de nuevo. Se importarán los tipos de cuenta compatibles (Gemini, Codex, Claude, Antigravity, Qwen, Kimi); el resto se omitirán.", + "cliproxyapiImportAuthButton": "Importar cuentas", + "payloadRulesTitle": "Reglas de payload", + "payloadRulesDesc": "Configura las mutaciones del payload de la solicitud por modelo y protocolo. Los cambios se guardan en los ajustes y se recargan en caliente en el tiempo de ejecución inmediatamente después de guardar.", + "payloadRuleDefaultTitle": "predeterminado", + "payloadRuleDefaultDesc": "Aplica parámetros solo cuando falta la ruta de destino en el payload saliente.", + "payloadRuleOverrideTitle": "sobrescritura", + "payloadRuleOverrideDesc": "Impone valores en el payload, reemplazando cualquier elemento que ya esté presente en esa ruta.", + "payloadRuleFilterTitle": "filtro", + "payloadRuleFilterDesc": "Elimina los parámetros bloqueados del payload antes de enviar la solicitud al upstream.", "payloadRuleDefaultRawTitle": "defaultRaw", - "payloadRuleDefaultRawDesc": "Like default, but string values are parsed as JSON first when possible. The legacy input alias default-raw is also accepted on save.", + "payloadRuleDefaultRawDesc": "Igual que default, pero los valores de texto se analizan primero como JSON cuando es posible. También se acepta el alias de entrada heredado default-raw al guardar.", "payloadEditorTitle": "Editor", - "payloadEditorDesc": "Use the runtime schema shape: default, override, filter, defaultRaw. The API also accepts the legacy input key default-raw.", - "payloadEditorReady": "Ready", - "payloadResetInfo": "Editor reset to the neutral template. Save to apply it.", - "payloadSaveSuccess": "Payload rules saved and hot reloaded.", - "payloadJsonParseError": "JSON parse error: {error}", - "payloadMustBeObject": "Payload rules must be a JSON object.", - "payloadInvalidJson": "Invalid JSON payload.", - "payloadValidJsonRequired": "Payload rules must be valid JSON before saving.", - "savePayloadRules": "Save Payload Rules", - "requestLimitsTitle": "Request Limits", - "requestLimitsDesc": "Configure global request limits and concurrency guards.", - "maxRequestSizeLabel": "Max Request Size (MB)", - "maxRequestSizeDesc": "Maximum allowed size for incoming API requests.", - "maxResponseSizeLabel": "Max Response Size (MB)", - "maxResponseSizeDesc": "Maximum allowed size for outgoing API responses.", - "maxRequestTokensLabel": "Max Request Tokens", - "maxRequestTokensDesc": "Maximum total tokens allowed in a single request.", - "maxResponseTokensLabel": "Max Response Tokens", - "maxResponseTokensDesc": "Maximum total tokens allowed in a single response.", - "modelCooldownsTitle": "Modelos en tiempo de reutilización", - "modelCooldownsEmpty": "No hay modelos en tiempo de reutilización en este momento.", - "modelCooldownsDescription": "Models temporarily isolated after a failure. When the cooldown expires they come back automatically.", - "modelCooldownsLoadFailed": "Failed to load cooldowns", - "modelCooldownReactivated": "Model reactivated: {model}", - "modelCooldownClearFailed": "Failed to clear cooldown", - "modelCooldownsAllReactivated": "All models in cooldown have been reactivated.", - "modelCooldownsClearFailed": "Failed to clear cooldowns", - "modelCooldownsReactivateAll": "Reactivate all", - "modelCooldownsReasonRemaining": "reason: {reason} • remaining: {remaining}", - "modelCooldownsReactivate": "Reactivate", - "responsesStateTitle": "Responses State", - "responsesStateDesc": "Control how OmniRoute forwards previous_response_id.", - "responsesStateModeLabel": "previous_response_id handling", - "responsesStateModeAuto": "Auto", - "responsesStateModeStrip": "Strip", - "responsesStateModePreserve": "Preserve", - "responsesStateHint": "Auto strips previous_response_id unless a connection explicitly enables OpenAI Responses storage. Strip is safest for stateless clients such as VS Code Custom Endpoint; context then depends on the client sending full history.", - "responsesStateSaveError": "Failed to update Responses state setting", + "payloadEditorDesc": "Usa la estructura de esquema de ejecución: default, override, filter, defaultRaw. La API también acepta la clave de entrada heredada default-raw.", + "payloadEditorReady": "Listo", + "payloadResetInfo": "Editor restablecido a la plantilla neutral. Guarda para aplicar los cambios.", + "payloadSaveSuccess": "Reglas de payload guardadas y recargadas en caliente.", + "payloadJsonParseError": "Error de análisis JSON: {error}", + "payloadMustBeObject": "Las reglas de payload deben ser un objeto JSON.", + "payloadInvalidJson": "Payload JSON no válido.", + "payloadValidJsonRequired": "Las reglas de payload deben ser un JSON válido antes de guardar.", + "savePayloadRules": "Guardar reglas de payload", + "requestLimitsTitle": "Límites de solicitudes", + "requestLimitsDesc": "Configura los límites globales de solicitudes y las protecciones de concurrencia.", + "maxRequestSizeLabel": "Tamaño máx. de solicitud (MB)", + "maxRequestSizeDesc": "Tamaño máximo permitido para las solicitudes de API entrantes.", + "maxResponseSizeLabel": "Tamaño máx. de respuesta (MB)", + "maxResponseSizeDesc": "Tamaño máximo permitido para las respuestas de API salientes.", + "maxRequestTokensLabel": "Tokens máx. de solicitud", + "maxRequestTokensDesc": "Número total máximo de tokens permitidos en una sola solicitud.", + "maxResponseTokensLabel": "Tokens máx. de respuesta", + "maxResponseTokensDesc": "Número total máximo de tokens permitidos en una sola respuesta.", + "modelCooldownsTitle": "Modelos en enfriamiento", + "modelCooldownsEmpty": "No hay modelos en enfriamiento en este momento.", + "modelCooldownsDescription": "Modelos aislados temporalmente tras un error. Cuando finaliza el periodo de enfriamiento, vuelven automáticamente.", + "modelCooldownsLoadFailed": "Error al cargar los tiempos de enfriamiento", + "modelCooldownReactivated": "Modelo reactivado: {model}", + "modelCooldownClearFailed": "Error al restablecer el enfriamiento", + "modelCooldownsAllReactivated": "Se han reactivado todos los modelos en enfriamiento.", + "modelCooldownsClearFailed": "Error al restablecer los enfriamientos", + "modelCooldownsReactivateAll": "Reactivar todo", + "modelCooldownsReasonRemaining": "motivo: {reason} • restante: {remaining}", + "modelCooldownsReactivate": "Reactivar", + "responsesStateTitle": "Estado de las respuestas", + "responsesStateDesc": "Controla cómo reenvía OmniRoute previous_response_id.", + "responsesStateModeLabel": "Gestión de previous_response_id", + "responsesStateModeAuto": "Automático", + "responsesStateModeStrip": "Eliminar", + "responsesStateModePreserve": "Conservar", + "responsesStateHint": "El modo automático elimina previous_response_id a menos que una conexión habilite explícitamente el almacenamiento de respuestas de OpenAI. Eliminar es lo más seguro para clientes sin estado como Custom Endpoint de VS Code; en ese caso, el contexto depende de que el cliente envíe el historial completo.", + "responsesStateSaveError": "Error al actualizar el ajuste de estado de respuestas", "codexFastTierTitle": "Codex Fast Tier", - "codexFastTierDesc": "Inyectar globalmente service_tier=priority para las solicitudes de OpenAI Codex.", - "codexFastTierHint": "Cuando está habilitado, OmniRoute añade service_tier=priority a las solicitudes salientes de Codex para las conexiones que aún no especifican un tier. El tier priority requiere una clave API de OpenAI Enterprise o la ruta de Codex con autenticación ChatGPT; otros tipos de claves recibirán un error relacionado con el tier de OpenAI. Los ajustes por conexión en la página del proveedor Codex tienen prioridad.", + "codexFastTierDesc": "Inyecta globalmente service_tier=priority para las solicitudes de OpenAI Codex.", + "codexFastTierHint": "Cuando está habilitado, OmniRoute añade service_tier=priority a las solicitudes salientes de Codex para las conexiones que aún no especifican un tier. El tier priority requiere una clave de API de OpenAI Enterprise o la ruta de Codex con autenticación de ChatGPT; otros tipos de claves recibirán un error relacionado con el tier por parte de OpenAI. Los ajustes por conexión en la página del proveedor Codex tienen prioridad.", "codexFastTierSaveError": "Error al actualizar el ajuste de Codex Fast Tier", - "codexAutoPingTitle": "Codex Quota Auto-Ping", - "codexAutoPingDesc": "Opt-in per connection: sends a tiny request right after a Codex session window resets so it isn't cold when you need it.", - "codexAutoPingWarning": "Consumes a small amount of real Codex quota on every ping. Off by default — enable only for connections you actively rely on.", - "codexAutoPingSaveError": "Failed to update Codex Auto-Ping setting", - "codexAutoPingToggleAria": "Toggle Codex quota auto-ping for {connection}", - "codexFastTierTierLabel": "Service tier", + "codexAutoPingTitle": "Autoping de cuota de Codex", + "codexAutoPingDesc": "Opcional por conexión: envía una solicitud diminuta justo después de que se reinicie la ventana de sesión de Codex para que no esté fría cuando la necesites.", + "codexAutoPingWarning": "Consume una pequeña cantidad de cuota real de Codex en cada ping. Desactivado por defecto; actívalo solo para las conexiones de las que dependas activamente.", + "codexAutoPingSaveError": "Error al actualizar el ajuste de autoping de Codex", + "codexAutoPingToggleAria": "Alternar el autoping de cuota de Codex para {connection}", + "codexFastTierTierLabel": "Nivel de servicio (tier)", "codexFastTierTierPriority": "Priority", "codexFastTierTierFlex": "Flex", "codexFastTierTierDefault": "Default", - "codexFastTierModelsLabel": "Fast-tier models", - "codexFastTierModelsHint": "Only checked models receive service_tier when Fast Tier is enabled.", - "codexFastTierModelCheckbox": "Enable Fast Tier for {model}", + "codexFastTierModelsLabel": "Modelos con tier rápido", + "codexFastTierModelsHint": "Solo los modelos seleccionados reciben service_tier cuando Fast Tier está habilitado.", + "codexFastTierModelCheckbox": "Habilitar Fast Tier para {model}", "claudeFastModeTitle": "Claude Fast Mode", - "claudeFastModeDesc": "Activar el Fast Mode de Anthropic (speed:\"fast\") en las solicitudes Claude seleccionadas.", - "claudeFastModeHint": "Anthropic no admite oficialmente Fast Mode para clientes en modo SDK. Cuando está habilitado, OmniRoute reenvía un encabezado X-CPA-Force-Fast-Mode para que una compilación compatible de CLIProxyAPI pueda reescribir el entrypoint. Solo los modelos Opus listados pasan la verificación del binario de Anthropic. La suscripción, el plan Max y el saldo de créditos Fast Mode siguen aplicándose en el servidor — Anthropic puede devolver out_of_credits incluso con el toggle activado.", + "claudeFastModeDesc": "Activa el Fast Mode de Anthropic (speed:\"fast\") en las solicitudes de Claude seleccionadas.", + "claudeFastModeHint": "Anthropic no admite oficialmente Fast Mode para clientes de tipo SDK. Cuando está habilitado, OmniRoute reenvía una cabecera X-CPA-Force-Fast-Mode para que una compilación emparejada de CLIProxyAPI pueda suplantar el punto de entrada. Solo los modelos Opus enumerados están limitados por la comprobación del lado del cliente de Anthropic. El nivel de suscripción, el plan Max y el saldo de créditos de Fast Mode se siguen aplicando en el servidor; Anthropic puede devolver out_of_credits incluso con el interruptor activado.", "claudeFastModeModelsLabel": "Aplicado a los modelos ({count})", - "claudeFastModeModelCheckbox": "Activar Fast Mode para {model}", + "claudeFastModeModelCheckbox": "Habilitar Fast Mode para {model}", "claudeFastModeSaveError": "Error al actualizar el ajuste de Claude Fast Mode", "authz": { "cors": { "wildcard": { - "title": "CORS is open to every origin (CORS_ALLOW_ALL=true)", - "desc": "Any website can call this server's API from a visitor's browser. Use only on trusted networks — set explicit origins in ALLOWED_ORIGINS and disable CORS_ALLOW_ALL in production." + "title": "CORS está abierto a cualquier origen (CORS_ALLOW_ALL=true)", + "desc": "Cualquier sitio web puede llamar a la API de este servidor desde el navegador de un visitante. Úsalo solo en redes de confianza: configura orígenes explícitos en ALLOWED_ORIGINS y desactiva CORS_ALLOW_ALL en producción." } }, - "title": "Authorization Inventory", - "description": "5-tier route classification with live bypass policy. Read shows the full taxonomy; mutations re-prompt for the management password.", - "loading": "Loading inventory…", - "loadError": "Failed to load authz inventory", + "title": "Inventario de autorización", + "description": "Clasificación de rutas de 5 niveles con política de bypass en tiempo real. La lectura muestra toda la taxonomía; las modificaciones vuelven a solicitar la contraseña de gestión.", + "loading": "Cargando inventario…", + "loadError": "Error al cargar el inventario de autorización", "tier": { - "LOCAL_ONLY": "Local only", - "ALWAYS_PROTECTED": "Always protected", - "MANAGEMENT": "Management", - "CLIENT_API": "Client API", - "PUBLIC": "Public" + "LOCAL_ONLY": "Solo local", + "ALWAYS_PROTECTED": "Siempre protegido", + "MANAGEMENT": "Gestión", + "CLIENT_API": "API de cliente", + "PUBLIC": "Público" }, "bypass": { - "section": "Manage-scope bypass", + "section": "Bypass del ámbito de gestión", "kill_switch": { - "label": "Bypass kill-switch", - "desc": "Master toggle. When off, no LOCAL_ONLY prefix is reachable from non-loopback regardless of the per-prefix list." + "label": "Interruptor de emergencia del bypass", + "desc": "Interruptor maestro. Cuando está desactivado, ningún prefijo LOCAL_ONLY es accesible desde fuera del bucle local (non-loopback), independientemente de la lista por prefijo." }, "prefix": { - "label": "Bypassable prefixes", - "desc": "LOCAL_ONLY prefixes that manage-scope API keys (or dashboard sessions) may reach from non-loopback hosts.", - "add": "Add prefix", + "label": "Prefijos omitibles (bypassable)", + "desc": "Prefijos LOCAL_ONLY a los que las claves de API con ámbito de gestión (o las sesiones del panel) pueden acceder desde hosts externos al bucle local.", + "add": "Añadir prefijo", "placeholder": "/api/mcp/v2/", - "empty": "No prefixes configured. Bypass effectively off." + "empty": "No hay prefijos configurados. El bypass está efectivamente desactivado." }, - "cli_tools_runtime_note": "Spawn-capable prefix. Compile-time deny; cannot be made bypassable. Shown read-only." + "cli_tools_runtime_note": "Prefijo con capacidad de despliegue (spawn). Denegado en tiempo de compilación; no se puede configurar como omitible. Se muestra de solo lectura." }, "password": { "prompt": { - "label": "Current password", - "desc": "Re-confirm to apply security-impacting changes." + "label": "Contraseña actual", + "desc": "Vuelve a confirmar para aplicar cambios que afectan a la seguridad." }, - "placeholder": "Current management password", - "cancel": "Cancel", - "submit": "Apply" + "placeholder": "Contraseña de gestión actual", + "cancel": "Cancelar", + "submit": "Aplicar" }, - "save": "Save changes", - "saved": "Authz settings updated", - "pending": "Unsaved changes", + "save": "Guardar cambios", + "saved": "Ajustes de autorización actualizados", + "pending": "Cambios sin guardar", "badge": { - "bypassable": "Bypassable via manage scope", - "strict": "Strict loopback", - "auth_required": "Auth required", - "public": "Public", - "always_protected": "Always protected", - "spawn_capable": "Spawn-capable" + "bypassable": "Omitible mediante el ámbito de gestión", + "strict": "Bucle local estricto", + "auth_required": "Autenticación requerida", + "public": "Público", + "always_protected": "Siempre protegido", + "spawn_capable": "Capacidad de spawn" }, "error": { - "PASSWORD_REQUIRED": "Current password required to apply these changes.", - "PASSWORD_MISMATCH": "Current password is incorrect.", - "INSUFFICIENT_SCOPE": "API key lacks the manage scope.", - "BYPASS_PREFIX_NOT_ALLOWED": "One or more prefixes target spawn-capable routes and cannot be bypassed.", - "GENERIC": "Failed to update authz settings." + "PASSWORD_REQUIRED": "Se requiere la contraseña actual para aplicar estos cambios.", + "PASSWORD_MISMATCH": "La contraseña actual es incorrecta.", + "INSUFFICIENT_SCOPE": "La clave de API carece del ámbito de gestión.", + "BYPASS_PREFIX_NOT_ALLOWED": "Uno o más prefijos apuntan a rutas con capacidad de spawn y no se pueden omitir.", + "GENERIC": "Error al actualizar los ajustes de autorización." } }, - "resilienceBaseCooldownLabel": "Enfriamiento básico", + "resilienceBaseCooldownLabel": "Enfriamiento base", "scopeLabel": "Alcance", - "triggerLabel": "gatillo", + "triggerLabel": "Activador", "effectLabel": "Efecto", "statusEnabled": "Habilitado", - "statusDisabled": "Discapacitado", + "statusDisabled": "Deshabilitado", "resilienceRequestQueueScope": "Por cola de solicitudes", "resilienceRequestQueueTrigger": "Antes de enviar al upstream", - "resilienceRequestQueueEffect": "Pone en cola las solicitudes, limita la simultaneidad y espacia las llamadas", - "resilienceRequestQueueDesc": "Esta capa solo controla las colas y el ritmo. No almacena tiempos de reutilización ni disyuntores abiertos.", - "resilienceAutoEnableApiKeyProvidersDesc": "Habilita la protección de colas de forma predeterminada para conexiones de clave API activas.", + "resilienceRequestQueueEffect": "Pone en cola las solicitudes, limita la concurrencia y espacia las llamadas", + "resilienceRequestQueueDesc": "Esta capa solo controla las colas y el ritmo. No almacena tiempos de enfriamiento ni abre disyuntores.", + "resilienceAutoEnableApiKeyProvidersDesc": "Habilita la protección de colas por defecto para las conexiones de clave de API activas.", "resilienceMaxQueueWait": "Tiempo máximo de espera en cola", "resilienceConnectionCooldownScope": "Conexión individual", "resilienceConnectionCooldownTrigger": "Cuando una conexión devuelve un error ascendente transitorio", - "resilienceConnectionCooldownEffect": "Omite temporalmente esa conexión y aumenta la interrupción en caso de fallas repetidas", - "resilienceConnectionCooldownDesc": "El tiempo de reutilización básico cubre fallas de conexión transitorias. Cuando se habilitan las sugerencias de reintento ascendentes, la ventana explícita del proveedor anula el tiempo de reutilización local.", - "resilienceUseUpstreamRetryHintsDesc": "Utiliza valores de reintento posterior/restablecimiento del proveedor ascendente cuando están disponibles.", - "resilienceUseUpstream429BreakerHints": "Utilice sugerencias 429 ascendentes para el tiempo de reutilización del interruptor", - "resilienceUseUpstream429BreakerHintsShort": "Utilice sugerencias 429 ascendentes", - "resilienceUseUpstream429BreakerHintsDesc": "Aplique señales de reintento posterior/cuota agotada de 429 respuestas a la duración del enfriamiento del disyuntor. De forma predeterminada, se utiliza una política por proveedor: los proveedores de nube directos están activados de manera predeterminada; Los proveedores de proxy inverso, autohospedados y respaldados por CLI están desactivados de forma predeterminada. Independiente de \"Usar sugerencias de reintento ascendentes\".", + "resilienceConnectionCooldownEffect": "Omite temporalmente esa conexión y aumenta el backoff en caso de fallos repetidos", + "resilienceConnectionCooldownDesc": "El tiempo de reutilización básico cubre fallos de conexión transitorios. Cuando las sugerencias de reintento ascendentes están habilitadas, la ventana explícita del proveedor anula el tiempo de reutilización local.", + "resilienceUseUpstreamRetryHintsDesc": "Utiliza valores de retry-after/reset del proveedor ascendente cuando están disponibles.", + "resilienceUseUpstream429BreakerHints": "Usar sugerencias 429 ascendentes para el tiempo de reutilización del disyuntor", + "resilienceUseUpstream429BreakerHintsShort": "Usar sugerencias 429 ascendentes", + "resilienceUseUpstream429BreakerHintsDesc": "Aplica señales de reintento posterior/cuota agotada de respuestas 429 a la duración del tiempo de reutilización del disyuntor. Por defecto, se utiliza una política por proveedor: los proveedores de nube directos están activados por defecto; los proveedores de proxy inverso, autohospedados y respaldados por CLI están desactivados por defecto. Independiente de \"Usar sugerencias de reintento ascendentes\".", "resilienceProviderBreakerScope": "Proveedor completo", - "resilienceProviderBreakerTrigger": "Errores finales de transporte/servidor después de que se agote el respaldo de la conexión", + "resilienceProviderBreakerTrigger": "Errores finales de transporte/servidor después de agotar el fallback de conexión", "resilienceProviderBreakerEffect": "Bloquea temporalmente a ese proveedor hasta que expire el tiempo de reinicio", - "resilienceProviderBreakerDesc": "El estado del interruptor activo aparece solo en la página Salud. Los límites de velocidad 429 con alcance de conexión permanecen en el tiempo de reutilización de la conexión y no activan el disyuntor del proveedor.", - "resilienceResetTime": "Restablecer tiempo", - "resilienceWaitForCooldownTitle": "Espere el tiempo de reutilización", + "resilienceProviderBreakerDesc": "El estado del disyuntor activo aparece solo en la página Salud. Los rate limits 429 con alcance de conexión permanecen en el tiempo de reutilización de la conexión y no activan el disyuntor del proveedor.", + "resilienceResetTime": "Tiempo de reinicio", + "resilienceWaitForCooldownTitle": "Esperar al tiempo de reutilización", "resilienceWaitForCooldownScope": "Solicitud de cliente actual", - "resilienceWaitForCooldownTrigger": "Cuando todas las conexiones candidatas ya se estén enfriando", - "resilienceWaitForCooldownEffect": "Espera en el servidor y vuelve a intentarlo cuando expira el primer tiempo de reutilización.", - "resilienceWaitForCooldownDesc": "Esto sólo afecta a la solicitud actual. No almacena la conexión ni el estado del proveedor.", - "resilienceEnableServerWait": "Habilitar la espera del lado del servidor", - "resilienceEnableServerWaitDesc": "Cuando está habilitado, OmniRoute espera a que expire el primer tiempo de reutilización y lo vuelve a intentar automáticamente.", + "resilienceWaitForCooldownTrigger": "Cuando todas las conexiones candidatas ya están en tiempo de reutilización", + "resilienceWaitForCooldownEffect": "Espera en el servidor y reintenta cuando expira el primer tiempo de reutilización", + "resilienceWaitForCooldownDesc": "Esto solo afecta a la solicitud actual. No almacena el estado de la conexión ni del proveedor.", + "resilienceEnableServerWait": "Habilitar espera del lado del servidor", + "resilienceEnableServerWaitDesc": "Cuando está habilitado, OmniRoute espera a que expire el primer tiempo de reutilización y reintenta automáticamente.", "resilienceMaxAttempts": "Intentos máximos", "resilienceMaxWaitPerAttempt": "Espera máxima por intento", - "resilienceComboCooldownWaitTitle": "Quota-share combo cooldown wait", - "resilienceComboCooldownWaitDesc": "For quota-share combos only: wait out a short transient cooldown and re-dispatch instead of returning a 429 immediately. Never waits on quota_exhausted.", - "resilienceComboCooldownWaitToggleDesc": "Quota-share combos only; never waits on quota_exhausted.", - "resilienceComboCooldownMaxWaitMs": "Maximum wait per attempt", - "resilienceComboCooldownBudgetMs": "Total wait budget", - "resilienceQuotaShareConcurrencyTitle": "Quota-share per-connection concurrency", - "resilienceQuotaShareConcurrencyDesc": "For quota-share combos only: when a connection sets a Max Concurrent cap, serialize concurrent requests to that subscription account so it is never flooded past its ceiling. Excess requests wait in the queue instead of getting a 429. The cap comes from each connection's Max Concurrent field; this switch only enables or disables honoring it.", - "resilienceQuotaShareConcurrencyToggleDesc": "Quota-share combos only; honors each connection's Max Concurrent cap.", - "resilienceProviderCooldownTitle": "Provider Cooldown", - "resilienceProviderCooldownScope": "All combo requests", - "resilienceProviderCooldownTrigger": "When a provider/connection fails", - "resilienceProviderCooldownEffect": "Skips the failed provider for a cooldown period before retrying", - "resilienceProviderCooldownDesc": "Prevents subsequent requests from re-walking the same failing providers. Cooldown scales exponentially with consecutive failures.", - "resilienceProviderCooldownEnabled": "Enable global provider cooldown", - "resilienceProviderCooldownEnabledDesc": "When enabled, failed providers are tracked globally and skipped for a cooldown period.", - "resilienceProviderCooldownMin": "Minimum cooldown", - "resilienceProviderCooldownMax": "Maximum cooldown", + "resilienceComboCooldownWaitTitle": "Espera de tiempo de reutilización combinado de cuota compartida", + "resilienceComboCooldownWaitDesc": "Solo para combinaciones de cuota compartida: espera un breve tiempo de reutilización transitorio y vuelve a enviar en lugar de devolver un 429 inmediatamente. Nunca espera en caso de quota_exhausted.", + "resilienceComboCooldownWaitToggleDesc": "Solo para combinaciones de cuota compartida; nunca espera en caso de quota_exhausted.", + "resilienceComboCooldownMaxWaitMs": "Espera máxima por intento", + "resilienceComboCooldownBudgetMs": "Presupuesto total de espera", + "resilienceQuotaShareConcurrencyTitle": "Concurrencia por conexión de cuota compartida", + "resilienceQuotaShareConcurrencyDesc": "Solo para combinaciones de cuota compartida: cuando una conexión establece un límite de concurrencia máxima, serializa las solicitudes concurrentes a esa cuenta de suscripción para que nunca supere su límite. Las solicitudes en exceso esperan en la cola en lugar de recibir un 429. El límite proviene del campo de concurrencia máxima de cada conexión; este interruptor solo habilita o deshabilita su cumplimiento.", + "resilienceQuotaShareConcurrencyToggleDesc": "Solo para combinaciones de cuota compartida; respeta el límite de concurrencia máxima de cada conexión.", + "resilienceProviderCooldownTitle": "Tiempo de reutilización del proveedor", + "resilienceProviderCooldownScope": "Todas las solicitudes combinadas", + "resilienceProviderCooldownTrigger": "Cuando un proveedor/conexión falla", + "resilienceProviderCooldownEffect": "Omite el proveedor fallido durante un periodo de tiempo de reutilización antes de reintentar", + "resilienceProviderCooldownDesc": "Evita que las solicitudes posteriores vuelvan a pasar por los mismos proveedores fallidos. El tiempo de reutilización aumenta exponencialmente con fallos consecutivos.", + "resilienceProviderCooldownEnabled": "Habilitar tiempo de reutilización global del proveedor", + "resilienceProviderCooldownEnabledDesc": "Cuando está habilitado, los proveedores fallidos se rastrean globalmente y se omiten durante un periodo de tiempo de reutilización.", + "resilienceProviderCooldownMin": "Tiempo de reutilización mínimo", + "resilienceProviderCooldownMax": "Tiempo de reutilización máximo", "forcedFingerprintTitle": "Siempre activado para {provider}; necesario para la seguridad de las cuentas OAuth y no se puede desactivar.", "forcedFingerprintBadge": "Obligatorio", - "sessionAffinityTitle": "Session affinity", - "sessionAffinityDesc": "Keeps one conversation on the same account for this many seconds, for any provider. 0 disables it.", - "sessionAffinityTtl": "Affinity TTL (seconds)", - "resetAwareQuotaCacheTitle": "Caché de cuotas con reinicio", - "resetAwareQuotaCacheDesc": "Almacena en caché la telemetría de cuota solo para pedidos con reconocimiento de reinicio. La verificación previa de cuotas aún protege las solicitudes. 0/0 sigue obteniendo en vivo.", + "sessionAffinityTitle": "Afinidad de sesión", + "sessionAffinityDesc": "Mantiene una conversación en la misma cuenta durante estos segundos, para cualquier proveedor. 0 lo deshabilita.", + "sessionAffinityTtl": "TTL de afinidad (segundos)", + "resetAwareQuotaCacheTitle": "Caché de cuotas con reconocimiento de reinicio", + "resetAwareQuotaCacheDesc": "Almacena en caché la telemetría de cuota solo para pedidos con reconocimiento de reinicio. La verificación previa de cuotas sigue protegiendo las solicitudes. 0/0 mantiene la obtención en vivo.", "resetAwareQuotaCacheTtl": "TTL nuevo (segundos)", "resetAwareQuotaCacheMaxStale": "Máximo obsoleto (segundos)", "qdrantCleanupSuccess": "OK: eliminado {count} punto(s) (retención: {days} días)", "qdrantCleanupFailed": "Error de limpieza", "qdrantCleanupError": "Error: {error}", - "vercelRelaySuccess": "Vercel Relay deployed successfully", - "vercelRelayButton": "Deploy Vercel Relay", - "vercelRelayModalTitle": "Deploy Vercel Relay", - "vercelRelayWarning": "Warning: A Vercel deployment token is required. This token will only be used to create the serverless relay and will never be stored by OmniRoute.", - "vercelRelayTokenLabel": "Vercel Access Token", - "vercelRelayProjectNameLabel": "Vercel Project Name", - "vercelRelayFreeTierNote": "Relays are lightweight proxy endpoints deployed on Vercel's free tier to bypass local network/region limitations.", - "vercelRelayDeploying": "Deploying...", - "vercelRelayDeploy": "Deploy", - "deployRelayButton": "Deploy Relay", - "denoRelayButton": "Deploy Deno Relay", - "denoRelayModalTitle": "Deploy Deno Relay", - "denoRelayWarning": "Warning: A Deno Deploy organization token is required. This token will only be used to create the relay app and will never be stored by OmniRoute.", - "denoRelayTokenLabel": "Deno Deploy Organization Token", - "denoRelayOrgDomainLabel": "Organization Domain", - "denoRelayProjectNameLabel": "Deno App Name", - "denoRelayFreeTierNote": "Deno Deploy v2 runs on a global edge network. Free tier: 1M requests & 100GiB outbound traffic per month, no per-request CPU limits, up to 20 active apps & 50 custom domains.", - "denoRelayDeploying": "Deploying...", - "denoRelayDeploy": "Deploy", - "cloudflareRelaySuccess": "Cloudflare Relay deployed successfully", - "cloudflareRelayButton": "Deploy Cloudflare Relay", - "cloudflareRelayModalTitle": "Deploy Cloudflare Worker Relay", - "cloudflareRelayWarning": "Deploys a Cloudflare Worker that proxies LLM requests through Cloudflare's edge network — masking the host IP behind dynamic Cloudflare addresses. The Worker enforces a one-time auth secret so the public workers.dev URL cannot be reused as an open relay.", - "cloudflareRelayTokenHowto": "Create the API token under My Profile -> API Tokens -> Create Token -> Custom Token -> Account / Workers Scripts / Edit.", - "cloudflareRelayAccountIdLabel": "Cloudflare Account ID", - "cloudflareRelayAccountIdHint": "Found on the right side of the Cloudflare dashboard overview page.", - "cloudflareRelayApiTokenLabel": "Cloudflare API Token", - "cloudflareRelayApiTokenHint": "Requires 'Workers Scripts: Edit' permission. The token is used only at deploy time and is never stored.", - "cloudflareRelayProjectNameLabel": "Worker Name", - "cloudflareRelayFreeTierNote": "Free tier: 100,000 requests/day per Cloudflare account.", - "cloudflareRelayDeploying": "Deploying...", - "cloudflareRelayDeploy": "Deploy", - "cloudflareRelayCredsRequired": "Account ID and API Token are required", - "cloudflareRelayDeployFailed": "Deploy failed", - "modelLockout": "Model Lockout", - "modelLockoutPageDescription": "Configure which HTTP error codes trigger per-model lockout and control the cooldown behavior.", - "modelLockoutLoadFailed": "Failed to load model lockout settings", - "modelLockoutSaveFailed": "Failed to save model lockout settings", - "modelLockoutLoading": "Loading model lockout settings...", - "modelLockoutBaseRangeError": "Base Cooldown must be between 5,000ms and 600,000ms", - "modelLockoutMaxRangeError": "Max Cooldown must be between 5,000ms and 3,600,000ms", - "modelLockoutOrderError": "Max Cooldown must be greater than or equal to Base Cooldown", - "modelLockoutStepsRangeError": "Max Backoff Steps must be between 0 and 20", - "removeErrorCode": "Remove {code}", - "addErrorCode": "Add error code...", - "suggestions": "Suggestions:", - "modelLockoutMaxCooldownHint": "≥ Base Cooldown — 3,600,000ms", - "modelLockoutEnabled": "Enable Model Lockout", - "modelLockoutEnabledDescription": "When enabled, models that fail with configured error codes are temporarily locked to prevent retry loops.", - "modelLockoutErrorCodes": "Error Codes", - "modelLockoutErrorCodesDescription": "HTTP status codes that trigger model lockout. Type a code and click Add, or select from suggestions.", - "modelLockoutBaseCooldown": "Base Cooldown (ms)", - "modelLockoutBaseCooldownDescription": "Initial cooldown duration in milliseconds before a model can be retried.", - "modelLockoutMaxCooldown": "Max Cooldown (ms)", - "modelLockoutMaxCooldownDescription": "Maximum cooldown duration in milliseconds. Prevents excessively long lockouts.", - "modelLockoutExponentialBackoff": "Exponential Backoff", - "modelLockoutExponentialBackoffDescription": "When enabled, each consecutive failure increases the cooldown duration exponentially.", - "modelLockoutMaxBackoffSteps": "Max Backoff Steps", - "modelLockoutMaxBackoffStepsDescription": "Maximum number of backoff steps before the cooldown stops growing. The Max Cooldown cap is reached first in most configurations, making this a safety ceiling for when Max Cooldown is raised.", - "disableSessionStickiness": "Disable session stickiness", - "disableSessionStickinessDesc": "Round-robin and random combos rotate to a different connection on every request instead of pinning a whole conversation to one connection by the first-message hash. Leave off to preserve prompt-cache hits for multi-turn chats. Per-combo overrides take precedence.", - "promptCacheAffinity": "Prompt-cache locality routing", - "promptCacheAffinityDesc": "Prefer the same provider account for matching prompt-cache keys while preserving health and quota failover.", - "credentialRedaction": "Credential Redaction", - "credentialRedactionDesc": "Redact API keys, tokens, and secrets from context sent to providers and from responses.", - "enableCredentialRedaction": "Enable credential redaction", - "enableCredentialRedactionDesc": "Scrubs API keys, tokens, private keys, and JWTs from messages, tool calls, and responses.", - "pricingAutoSyncDisabled": "Automatic Sync Disabled", - "pricingAutoSyncEnabled": "Automatic Sync Enabled" + "vercelRelaySuccess": "Vercel Relay desplegado correctamente", + "vercelRelayButton": "Desplegar Vercel Relay", + "vercelRelayModalTitle": "Desplegar Vercel Relay", + "vercelRelayWarning": "Advertencia: Se requiere un token de despliegue de Vercel. Este token solo se utilizará para crear el relay serverless y nunca será almacenado por OmniRoute.", + "vercelRelayTokenLabel": "Token de acceso de Vercel", + "vercelRelayProjectNameLabel": "Nombre del proyecto de Vercel", + "vercelRelayFreeTierNote": "Los relays son endpoints proxy ligeros desplegados en el nivel gratuito de Vercel para evitar limitaciones de red/región local.", + "vercelRelayDeploying": "Desplegando...", + "vercelRelayDeploy": "Desplegar", + "deployRelayButton": "Desplegar Relay", + "denoRelayButton": "Desplegar Deno Relay", + "denoRelayModalTitle": "Desplegar Deno Relay", + "denoRelayWarning": "Advertencia: Se requiere un token de organización de Deno Deploy. Este token solo se utilizará para crear la aplicación relay y nunca será almacenado por OmniRoute.", + "denoRelayTokenLabel": "Token de organización de Deno Deploy", + "denoRelayOrgDomainLabel": "Dominio de la organización", + "denoRelayProjectNameLabel": "Nombre de la aplicación Deno", + "denoRelayFreeTierNote": "Deno Deploy v2 se ejecuta en una red edge global. Nivel gratuito: 1M de solicitudes y 100GiB de tráfico saliente al mes, sin límites de CPU por solicitud, hasta 20 aplicaciones activas y 50 dominios personalizados.", + "denoRelayDeploying": "Desplegando...", + "denoRelayDeploy": "Desplegar", + "cloudflareRelaySuccess": "Cloudflare Relay desplegado correctamente", + "cloudflareRelayButton": "Desplegar Cloudflare Relay", + "cloudflareRelayModalTitle": "Desplegar Cloudflare Worker Relay", + "cloudflareRelayWarning": "Despliega un Cloudflare Worker que hace proxy de las solicitudes LLM a través de la red edge de Cloudflare, ocultando la IP del host detrás de direcciones dinámicas de Cloudflare. El Worker aplica un secreto de autenticación de un solo uso para que la URL pública workers.dev no pueda reutilizarse como un relay abierto.", + "cloudflareRelayTokenHowto": "Cree el token de API en Mi perfil -> Tokens de API -> Crear token -> Token personalizado -> Cuenta / Scripts de Workers / Editar.", + "cloudflareRelayAccountIdLabel": "ID de cuenta de Cloudflare", + "cloudflareRelayAccountIdHint": "Se encuentra en el lado derecho de la página de resumen del panel de Cloudflare.", + "cloudflareRelayApiTokenLabel": "Token de API de Cloudflare", + "cloudflareRelayApiTokenHint": "Requiere el permiso 'Workers Scripts: Edit'. El token solo se utiliza en el momento del despliegue y nunca se almacena.", + "cloudflareRelayProjectNameLabel": "Nombre del Worker", + "cloudflareRelayFreeTierNote": "Nivel gratuito: 100.000 solicitudes/día por cuenta de Cloudflare.", + "cloudflareRelayDeploying": "Desplegando...", + "cloudflareRelayDeploy": "Desplegar", + "cloudflareRelayCredsRequired": "Se requieren el ID de cuenta y el token de API", + "cloudflareRelayDeployFailed": "Error en el despliegue", + "modelLockout": "Bloqueo de modelo", + "modelLockoutPageDescription": "Configure qué códigos de error HTTP activan el bloqueo por modelo y controle el comportamiento del tiempo de reutilización.", + "modelLockoutLoadFailed": "Error al cargar los ajustes de bloqueo de modelo", + "modelLockoutSaveFailed": "Error al guardar los ajustes de bloqueo de modelo", + "modelLockoutLoading": "Cargando ajustes de bloqueo de modelo...", + "modelLockoutBaseRangeError": "El tiempo de reutilización base debe estar entre 5.000ms y 600.000ms", + "modelLockoutMaxRangeError": "El tiempo de reutilización máximo debe estar entre 5.000ms y 3.600.000ms", + "modelLockoutOrderError": "El tiempo de reutilización máximo debe ser mayor o igual al tiempo de reutilización base", + "modelLockoutStepsRangeError": "Los pasos máximos de backoff deben estar entre 0 y 20", + "removeErrorCode": "Eliminar {code}", + "addErrorCode": "Añadir código de error...", + "suggestions": "Sugerencias:", + "modelLockoutMaxCooldownHint": "≥ Tiempo de reutilización base — 3.600.000ms", + "modelLockoutEnabled": "Habilitar bloqueo de modelo", + "modelLockoutEnabledDescription": "Cuando está habilitado, los modelos que fallan con los códigos de error configurados se bloquean temporalmente para evitar bucles de reintento.", + "modelLockoutErrorCodes": "Códigos de error", + "modelLockoutErrorCodesDescription": "Códigos de estado HTTP que activan el bloqueo de modelo. Escriba un código y haga clic en Añadir, o seleccione de las sugerencias.", + "modelLockoutBaseCooldown": "Tiempo de reutilización base (ms)", + "modelLockoutBaseCooldownDescription": "Duración inicial del tiempo de reutilización en milisegundos antes de que un modelo pueda ser reintentado.", + "modelLockoutMaxCooldown": "Tiempo de reutilización máximo (ms)", + "modelLockoutMaxCooldownDescription": "Duración máxima del tiempo de reutilización en milisegundos. Evita bloqueos excesivamente largos.", + "modelLockoutExponentialBackoff": "Backoff exponencial", + "modelLockoutExponentialBackoffDescription": "Cuando está habilitado, cada fallo consecutivo aumenta la duración del tiempo de reutilización exponencialmente.", + "modelLockoutMaxBackoffSteps": "Pasos máximos de backoff", + "modelLockoutMaxBackoffStepsDescription": "Número máximo de pasos de backoff antes de que el tiempo de reutilización deje de crecer. El límite de tiempo de reutilización máximo se alcanza primero en la mayoría de las configuraciones, lo que lo convierte en un techo de seguridad para cuando se aumenta el tiempo de reutilización máximo.", + "disableSessionStickiness": "Deshabilitar persistencia de sesión", + "disableSessionStickinessDesc": "Las combinaciones round-robin y aleatorias rotan a una conexión diferente en cada solicitud en lugar de fijar toda una conversación a una conexión mediante el hash del primer mensaje. Déjelo desactivado para preservar los aciertos de prompt-cache en chats de múltiples turnos. Las anulaciones por combinación tienen prioridad.", + "promptCacheAffinity": "Enrutamiento de localidad de prompt-cache", + "promptCacheAffinityDesc": "Prefiera la misma cuenta de proveedor para las claves de prompt-cache coincidentes mientras preserva la salud y el failover de cuota.", + "credentialRedaction": "Redacción de credenciales", + "credentialRedactionDesc": "Redacte claves de API, tokens y secretos del contexto enviado a los proveedores y de las respuestas.", + "enableCredentialRedaction": "Habilitar redacción de credenciales", + "enableCredentialRedactionDesc": "Elimina claves de API, tokens, claves privadas y JWT de los mensajes, llamadas a herramientas y respuestas.", + "pricingAutoSyncDisabled": "Sincronización automática desactivada", + "pricingAutoSyncEnabled": "Sincronización automática activada" }, "contextRtk": { - "title": "RTK Engine", - "description": "Command-aware compression for tool output, terminal logs and build results.", - "enabled": "Enabled", - "intensity": "Intensity", - "intensityMinimal": "Minimal", - "intensityStandard": "Standard", - "intensityAggressive": "Aggressive", - "toolResults": "Tool results", - "assistantMessages": "Assistant messages", - "codeBlocks": "Code blocks", + "title": "Motor RTK", + "description": "Compresión con reconocimiento de comandos para resultados de herramientas, logs de terminal y resultados de compilación.", + "enabled": "Habilitado", + "intensity": "Intensidad", + "intensityMinimal": "Mínima", + "intensityStandard": "Estándar", + "intensityAggressive": "Agresiva", + "toolResults": "Resultados de herramientas", + "assistantMessages": "Mensajes del asistente", + "codeBlocks": "Bloques de código", "filterCatalog": "Catálogo de filtros", "filterCatalogDesc": "Filtros de salida disponibles por categoría", "guidedConfig": "Configuración", "guidedConfigDesc": "Ajuste cómo RTK filtra la salida de su terminal", - "maxLines": "Max lines", - "maxChars": "Max chars", + "maxLines": "Líneas máximas", + "maxChars": "Caracteres máximos", "deduplicateThreshold": "Umbral de deduplicación", "customFilters": "Filtros personalizados", "detectedType": "Tipo detectado", - "confidence": "confianza", + "confidence": "Confianza", "beforeAfter": "Antes / Después", "trustProjectFilters": "Filtros de proyectos de confianza", - "rawOutputRetention": "Retención de producción bruta", - "rawOutputNever": "nunca", + "rawOutputRetention": "Retención de salida sin procesar", + "rawOutputNever": "Nunca", "rawOutputFailures": "Fallos", - "rawOutputAlways": "siempre", + "rawOutputAlways": "Siempre", "rawOutputMaxBytes": "Bytes máximos de salida sin procesar", - "filterTesting": "Filter Testing", - "pasteOutput": "Paste tool output to test filtering...", - "presetHigh": "agresivo", - "presetLow": "Luz", - "presetMaxChars": "Caracteres de salida máximos", - "presetMaxLines": "Líneas de salida máximas", + "filterTesting": "Prueba de filtros", + "pasteOutput": "Pegue la salida de la herramienta para probar el filtrado...", + "presetHigh": "Agresivo", + "presetLow": "Ligero", + "presetMaxChars": "Caracteres máximos de salida", + "presetMaxLines": "Líneas máximas de salida", "presetMedium": "Estándar", - "run": "Run", - "result": "Result", - "previewEmpty": "Run a sample to preview RTK output.", - "detected": "Detected", - "masterSwitchOffAlert": "El interruptor principal de Token Saver está DESACTIVADO — estos ajustes no afectarán a las solicitudes hasta que lo actives en la página de Puntos de conexión.", - "tokensFiltered": "Tokens filtered", - "filtersActive": "Filters active", - "requests": "Requests", - "avgSavings": "Avg savings", + "run": "Ejecutar", + "result": "Resultado", + "previewEmpty": "Ejecute una muestra para previsualizar la salida de RTK.", + "detected": "Detectado", + "masterSwitchOffAlert": "El interruptor principal de Token Saver está DESACTIVADO; estos ajustes no afectarán a las solicitudes hasta que lo active en los Ajustes de compresión.", + "tokensFiltered": "Tokens filtrados", + "filtersActive": "Filtros activos", + "requests": "Solicitudes", + "avgSavings": "Ahorro promedio", "simpleMode": "Sencillo", "advancedMode": "Avanzado", "searchFilters": "Filtros de búsqueda...", "tooltipDedup": "Qué tan agresivamente eliminar las líneas repetidas.", "tooltipMaxChars": "Máximo de caracteres por bloque de salida.", - "tooltipMaxLines": "Líneas máximas para evitar la salida del comando. El exceso se trunca.", - "learnDiscoverTitle": "Learn & Discover filters", - "learnDiscoverDesc": "Mine your captured command output (Raw Output retention must be on) to suggest new RTK filters. Suggestions only — you review and save them.", - "discoverHeading": "Discover repeated noise", - "discoverButton": "Scan samples", - "discoverScanning": "Scanning…", - "discoverEmpty": "No repeated noise found. Enable Raw Output retention and run a few commands first.", - "discoverSamples": "{count} sample(s) scanned", - "discoverHits": "{hits}× across samples", - "learnHeading": "Learn a filter for a command", - "learnCommandPlaceholder": "e.g. npm install", - "learnButton": "Suggest filter", - "learnEmpty": "No suggestion yet. Type a command you have run and scan.", - "learnSamplesUsed": "Learned from {count} matching sample(s)", - "suggestionError": "Could not load suggestions. Check management auth and try again.", - "tomlImportTitle": "Import RTK TOML filters", - "tomlImportDesc": "Validate RTK TOML schema v1 filters and install them globally. Installation writes DATA_DIR/rtk/filters.toml; existing files are replaced only after explicit confirmation.", - "tomlChooseFile": "Choose a TOML file", - "tomlImportPlaceholder": "Paste RTK filters.toml content here...", - "tomlValidate": "Validate", - "tomlValidating": "Validating…", - "tomlInstall": "Install globally", - "tomlInstalling": "Installing…", - "tomlConfirmOverwrite": "Replace the existing global file and create a backup", - "tomlValidationPassed": "Validation passed", - "tomlValidationFailed": "Validation completed with failing inline tests", - "tomlValidationSummary": "{filters} filter(s), {tests} inline test(s)", - "tomlInstalled": "Installed at {path}", - "tomlBackupCreated": "A backup of the previous file was created.", - "tomlTestCount": "{count} test(s)", - "tomlTestPassed": "Passed", - "tomlTestFailed": "Failed", - "tomlImportError": "Could not process the RTK TOML file.", - "tomlFileReadError": "Could not read the selected TOML file." + "tooltipMaxLines": "Líneas máximas a mantener de la salida del comando. El exceso se trunca.", + "learnDiscoverTitle": "Aprender y descubrir filtros", + "learnDiscoverDesc": "Analiza la salida de tus comandos capturados (la retención de salida en bruto debe estar activada) para sugerir nuevos filtros RTK. Solo son sugerencias: tú las revisas y guardas.", + "discoverHeading": "Descubrir ruido repetido", + "discoverButton": "Escanear muestras", + "discoverScanning": "Escaneando...", + "discoverEmpty": "No se ha encontrado ruido repetido. Activa la retención de salida en bruto y ejecuta algunos comandos primero.", + "discoverSamples": "{count} muestra(s) escaneada(s)", + "discoverHits": "{hits}× en las muestras", + "learnHeading": "Aprender un filtro para un comando", + "learnCommandPlaceholder": "p. ej., npm install", + "learnButton": "Sugerir filtro", + "learnEmpty": "Aún no hay sugerencias. Escribe un comando que hayas ejecutado y escanéalo.", + "learnSamplesUsed": "Aprendido de {count} muestra(s) coincidente(s)", + "suggestionError": "No se han podido cargar las sugerencias. Comprueba la autenticación de gestión e inténtalo de nuevo.", + "tomlImportTitle": "Importar filtros TOML de RTK", + "tomlImportDesc": "Valida los filtros del esquema v1 de RTK TOML e instálalos globalmente. La instalación escribe en DATA_DIR/rtk/filters.toml; los archivos existentes solo se reemplazan tras una confirmación explícita.", + "tomlChooseFile": "Elegir un archivo TOML", + "tomlImportPlaceholder": "Pega el contenido de filters.toml de RTK aquí...", + "tomlValidate": "Validar", + "tomlValidating": "Validando...", + "tomlInstall": "Instalar globalmente", + "tomlInstalling": "Instalando...", + "tomlConfirmOverwrite": "Reemplazar el archivo global existente y crear una copia de seguridad", + "tomlValidationPassed": "Validación superada", + "tomlValidationFailed": "Validación completada con pruebas en línea fallidas", + "tomlValidationSummary": "{filters} filtro(s), {tests} prueba(s) en línea", + "tomlInstalled": "Instalado en {path}", + "tomlBackupCreated": "Se ha creado una copia de seguridad del archivo anterior.", + "tomlTestCount": "{count} prueba(s)", + "tomlTestPassed": "Superada", + "tomlTestFailed": "Fallida", + "tomlImportError": "No se ha podido procesar el archivo TOML de RTK.", + "tomlFileReadError": "No se ha podido leer el archivo TOML seleccionado." }, "compressionEngineConfig": { - "loading": "Loading…", - "loadFailed": "Failed to load engine information.", - "engineNotFound": "Engine \"{engine}\" not found.", - "saveFailed": "Failed to save configuration.", - "previewFailed": "Preview failed.", - "panelPointerPrefix": "Turn this layer on or off and set its level in", - "compressionSettings": "Compression Settings", - "panelPointerSuffix": ". This page edits its detailed configuration only.", - "configuration": "Configuration", - "noAdditionalConfiguration": "No additional configuration.", - "save": "Save", - "saving": "Saving…", - "globalSettingsOnly": "This layer is configured by the global settings; there is no per-engine override to save here yet.", - "preview": "Preview", - "previewInput": "Preview input", - "processing": "Processing…", - "previewSample": "The quick brown fox jumps over the lazy dog. This is a sample message used to preview compression. It contains enough text to show meaningful token savings.", - "originalTokens": "Original tokens", - "compressedTokens": "Compressed tokens", - "savings": "Savings", + "loading": "Cargando...", + "loadFailed": "No se ha podido cargar la información del motor.", + "engineNotFound": "No se ha encontrado el motor \"{engine}\".", + "saveFailed": "No se ha podido guardar la configuración.", + "previewFailed": "La vista previa ha fallado.", + "panelPointerPrefix": "Activa o desactiva esta capa y establece su nivel en", + "compressionSettings": "Ajustes de compresión", + "panelPointerSuffix": ". Esta página solo edita su configuración detallada.", + "configuration": "Configuración", + "noAdditionalConfiguration": "Sin configuración adicional.", + "save": "Guardar", + "saving": "Guardando...", + "globalSettingsOnly": "Esta capa está configurada mediante los ajustes globales; todavía no hay ninguna anulación por motor para guardar aquí.", + "preview": "Vista previa", + "previewInput": "Entrada de vista previa", + "processing": "Procesando...", + "previewSample": "El rápido zorro marrón salta sobre el perro perezoso. Este es un mensaje de muestra utilizado para previsualizar la compresión. Contiene suficiente texto para mostrar un ahorro de tokens significativo.", + "originalTokens": "Tokens originales", + "compressedTokens": "Tokens comprimidos", + "savings": "Ahorro", "original": "Original", - "compressed": "Compressed", - "diff": "Diff", - "last7Days": "Last 7 days", - "noDataYet": "No data yet", - "runs": "Runs", - "tokensSaved": "Tokens saved", - "averageSavings": "Average savings", + "compressed": "Comprimido", + "diff": "Diferencias", + "last7Days": "Últimos 7 días", + "noDataYet": "Aún no hay datos", + "runs": "Ejecuciones", + "tokensSaved": "Tokens ahorrados", + "averageSavings": "Ahorro medio", "diffLabels": { - "change": "Change", - "added": "Added", - "removed": "Removed", - "modified": "Modified" + "change": "Cambio", + "added": "Añadido", + "removed": "Eliminado", + "modified": "Modificado" }, "engines": { "headroom": { "name": "Headroom SmartCrusher", - "description": "Lossless tabular compaction of homogeneous JSON arrays with explicit row-count markers." + "description": "Compactación tabular sin pérdida de matrices JSON homogéneas con marcadores explícitos de recuento de filas." }, "session-dedup": { - "name": "Session Dedup", - "description": "Cross-turn block deduplication with recoverable content markers." + "name": "Deduplicación de sesión", + "description": "Deduplicación de bloques entre turnos con marcadores de contenido recuperables." }, "ccr": { "name": "CCR", - "description": "Content-addressed retrieval markers for repeated context blocks." + "description": "Marcadores de recuperación direccionada por contenido para bloques de contexto repetidos." }, "llmlingua": { - "name": "LLMLingua-2 (Semantic Pruning)", - "description": "ONNX-based semantic token classification. Compresses prose only; code blocks and preserved constructs are protected. Fails open on model or worker errors." + "name": "LLMLingua-2 (poda semántica)", + "description": "Clasificación de tokens semánticos basada en ONNX. Comprime solo prosa; los bloques de código y las construcciones preservadas están protegidos. Falla abierta ante errores de modelo o de trabajador." }, "lite": { "name": "Lite", - "description": "Fast whitespace, tool-result and image URL reduction." + "description": "Reducción rápida de espacios en blanco, resultados de herramientas y URL de imágenes." }, "aggressive": { - "name": "Aggressive", - "description": "Summarization, tool-result compression and progressive aging." + "name": "Agresivo", + "description": "Resumen, compresión de resultados de herramientas y envejecimiento progresivo." }, "ultra": { "name": "Ultra", - "description": "Heuristic token pruning with an optional local SLM fallback." + "description": "Poda heurística de tokens con un fallback opcional a un SLM local." } }, "fields": { "minBlockChars": { - "label": "Minimum block characters", - "description": "Minimum character count for a suffix block to be a deduplication candidate." + "label": "Caracteres mínimos de bloque", + "description": "Recuento mínimo de caracteres para que un bloque de sufijos sea candidato a la deduplicación." }, "fuzzy": { - "label": "Fuzzy near-duplicate deduplication", - "description": "Opt in to replace whole messages that are at least about 85% similar to an earlier message with a recoverable CCR marker." + "label": "Deduplicación difusa de casi duplicados", + "description": "Habilita la sustitución de mensajes enteros que sean al menos un 85% similares a un mensaje anterior por un marcador CCR recuperable." }, "minChars": { - "label": "Minimum block characters", - "description": "Minimum character count for a block to be a CCR candidate." + "label": "Caracteres mínimos de bloque", + "description": "Recuento mínimo de caracteres para que un bloque sea candidato a CCR." }, "retrievalRampFactor": { - "label": "Retrieval ramp factor (H8)", - "description": "Controls how strongly frequently retrieved blocks resist compression. Each prior retrieval raises the effective minimum block size linearly; 1 disables the ramp." + "label": "Factor de rampa de recuperación (H8)", + "description": "Controla con qué intensidad los bloques recuperados con frecuencia resisten la compresión. Cada recuperación previa aumenta linealmente el tamaño mínimo efectivo del bloque; 1 desactiva la rampa." }, "model": { - "label": "Model" + "label": "Modelo" }, "minTokens": { - "label": "Minimum tokens (floor)" + "label": "Tokens mínimos (mínimo base)" }, "compressionRate": { - "label": "Compression rate" + "label": "Tasa de compresión" }, "modelPath": { - "label": "Model path" + "label": "Ruta del modelo" }, "minRows": { - "label": "Minimum rows to compact", - "description": "Minimum rows in a homogeneous JSON array required to trigger tabular compaction. Default: 8." + "label": "Filas mínimas para compactar", + "description": "Número mínimo de filas en una matriz JSON homogénea necesario para activar la compactación tabular. Predeterminado: 8." }, "preserveSystemPrompt": { - "label": "Preserve system prompt" + "label": "Conservar el prompt del sistema" }, "summarizerEnabled": { - "label": "Enable summarizer" + "label": "Activar el resumen" }, "maxTokensPerMessage": { - "label": "Maximum tokens per message" + "label": "Máximo de tokens por mensaje" }, "minSavingsThreshold": { - "label": "Minimum savings threshold" + "label": "Umbral de ahorro mínimo" }, "minScoreThreshold": { - "label": "Minimum score threshold" + "label": "Umbral de puntuación mínimo" }, "slmFallbackToAggressive": { - "label": "Fall back to Aggressive" + "label": "Usar fallback a Agresivo" }, "intensity": { - "label": "Intensity" + "label": "Intensidad" }, "minMessageLength": { - "label": "Minimum message length" + "label": "Longitud mínima de mensaje" } }, "engineFields": { "llmlingua": { "compressionRate": { - "label": "Compression rate (keep ratio)" + "label": "Tasa de compresión (proporción a conservar)" }, "modelPath": { - "label": "Model path (offline override)" + "label": "Ruta del modelo (anulación sin conexión)" } } }, "options": { "model": { - "tinybert": "TinyBERT (57 MB, fast — default)", - "bert-base": "BERT-base (710 MB, higher accuracy)" + "tinybert": "TinyBERT (57 MB, rápido; predeterminado)", + "bert-base": "BERT-base (710 MB, mayor precisión)" }, "intensity": { "lite": "Lite", - "full": "Full", + "full": "Completa", "ultra": "Ultra" } } }, "contextCombos": { - "title": "Compression Combos", - "description": "Define how engines are combined for different routing scenarios.", - "createCombo": "Create Compression Combo", - "editCombo": "Edit", - "deleteCombo": "Delete", - "deleteConfirm": "Delete this compression combo?", + "title": "Combos de compresión", + "description": "Define cómo se combinan los motores para diferentes escenarios de enrutamiento.", + "createCombo": "Crear combo de compresión", + "editCombo": "Editar", + "deleteCombo": "Eliminar", + "deleteConfirm": "¿Eliminar este combo de compresión?", "pipeline": "Pipeline", - "addStep": "Add Step", - "removeStep": "Remove", - "name": "Name", - "descriptionField": "Description", - "languagePacks": "Language Packs", - "outputMode": "Output Mode", - "assignToRouting": "Assign to Routing Combos", - "noAssignments": "No routing combos available", - "default": "Default", - "setAsDefault": "Set as Default", - "save": "Save", - "cancel": "Cancel", - "enabled": "Enabled", - "loading": "Loading…", - "hubTitle": "Compression Hub", - "hubDescription": "Pick which compression profile runs globally.", - "hideExplanation": "Hide explanation", - "howItWorks": "How it works", - "saveSettingsFailed": "Failed to save settings.", - "explanationIntro": "Compression reduces tokens and cost by rewriting history before it is sent to the provider while preserving meaning.", - "explanationActiveProfile": "Active profile: chooses which compression profile runs globally — the panel-derived Default or one of your saved named combos.", - "explanationDefault": "Default (from panel): derived from the master switch and per-engine toggles you configure in Compression Settings.", - "explanationNamedCombos": "Named combos: saved pipelines you build in the named-combo editor. Selecting one makes it the active profile for every request.", - "explanationPreview": "Preview: shows which engines the active profile runs, in order.", - "activeProfile": "Active profile", - "activeProfileDescription": "Pick which compression profile runs globally — the panel-derived Default or a saved named combo.", - "defaultFromPanel": "Default (from panel)", - "runs": "Runs:", - "defaultConfiguredPrefix": "Default — configured in", - "compressionSettings": "Compression Settings", - "providerDelegated": "Provider-delegated compression", - "contextEditingClaude": "Context Editing (Claude)", - "contextEditingDescription": "Lets the provider clear old tool-use blocks server-side, without rewriting the message.", - "contextEditingAria": "Context Editing", - "contextEditingNote": "Currently available for Claude (Anthropic) only. It is a delegated mode: the provider clears old tool-use blocks server-side — we do not rewrite the message. It does not affect other providers.", - "namedCombos": "Named combos", - "namedCombosDescription": "Save different pipelines and assign them to specific routing combos.", - "comboNamePlaceholder": "Combo name", - "descriptionPlaceholder": "Description", - "nameRequired": "Enter a combo name before saving.", - "pipelineRequired": "Add at least one pipeline step before saving.", - "saveComboFailed": "Failed to save combo (HTTP {status}).", - "deleteNamedConfirm": "Delete combo “{name}”?", + "addStep": "Añadir paso", + "removeStep": "Eliminar", + "name": "Nombre", + "descriptionField": "Descripción", + "languagePacks": "Paquetes de idiomas", + "outputMode": "Modo de salida", + "assignToRouting": "Asignar a combos de enrutamiento", + "noAssignments": "No hay combos de enrutamiento disponibles", + "default": "Predeterminado", + "setAsDefault": "Establecer como predeterminado", + "save": "Guardar", + "cancel": "Cancelar", + "enabled": "Activado", + "loading": "Cargando...", + "hubTitle": "Centro de compresión", + "hubDescription": "Elige qué perfil de compresión se ejecuta globalmente.", + "hideExplanation": "Ocultar explicación", + "howItWorks": "Cómo funciona", + "saveSettingsFailed": "No se han podido guardar los ajustes.", + "explanationIntro": "La compresión reduce los tokens y el coste reescribiendo el historial antes de enviarlo al proveedor mientras se preserva el significado.", + "explanationActiveProfile": "Perfil activo: elige qué perfil de compresión se ejecuta globalmente: el predeterminado derivado del panel o uno de tus combos con nombre guardados.", + "explanationDefault": "Predeterminado (del panel): derivado del interruptor principal y los selectores por motor que configures en los ajustes de compresión.", + "explanationNamedCombos": "Combos con nombre: pipelines guardados que creas en el editor de combos con nombre. Seleccionar uno lo convierte en el perfil activo para cada solicitud.", + "explanationPreview": "Vista previa: muestra qué motores ejecuta el perfil activo, en orden.", + "activeProfile": "Perfil activo", + "activeProfileDescription": "Elige qué perfil de compresión se ejecuta globalmente: el predeterminado derivado del panel o un combo con nombre guardado.", + "defaultFromPanel": "Predeterminado (del panel)", + "runs": "Ejecuciones:", + "defaultConfiguredPrefix": "Predeterminado — configurado en", + "compressionSettings": "Ajustes de compresión", + "providerDelegated": "Compresión delegada en el proveedor", + "contextEditingClaude": "Edición de contexto (Claude)", + "contextEditingDescription": "Permite al proveedor borrar bloques antiguos de uso de herramientas en el lado del servidor, sin reescribir el mensaje.", + "contextEditingAria": "Edición de contexto", + "contextEditingNote": "Disponible actualmente solo para Claude (Anthropic). Es un modo delegado: el proveedor borra los bloques antiguos de uso de herramientas en el servidor; nosotros no reescribimos el mensaje. No afecta a otros proveedores.", + "namedCombos": "Combos con nombre", + "namedCombosDescription": "Guarda diferentes pipelines y asígnalos a combos de enrutamiento específicos.", + "comboNamePlaceholder": "Nombre del combo", + "descriptionPlaceholder": "Descripción", + "nameRequired": "Introduce un nombre para el combo antes de guardar.", + "pipelineRequired": "Añade al menos un paso de pipeline antes de guardar.", + "saveComboFailed": "No se ha podido guardar el combo (HTTP {status}).", + "deleteNamedConfirm": "¿Eliminar el combo \"{name}\"?", "intensityLite": "Lite", - "intensityFull": "Full", + "intensityFull": "Completa", "intensityUltra": "Ultra", - "active": "Active", - "languagePacksList": "Language packs: {packs}", - "dragToReorder": "Drag to reorder step", - "engine": "Engine", - "intensity": "Intensity" + "active": "Activo", + "languagePacksList": "Paquetes de idiomas: {packs}", + "dragToReorder": "Arrastrar para reordenar el paso", + "engine": "Motor", + "intensity": "Intensidad" }, "compressionStudio": { - "noRun": "No compression run available.", - "liveDataHint": "Live data arrives through the WebSocket compression channel.", - "cockpitView": "Cockpit view", - "canvas": "Canvas", - "waterfall": "Waterfall", - "replayDone": "Replay complete", - "pauseReplay": "Pause replay", - "playReplay": "Play replay", - "pause": "Pause", - "replay": "Replay", - "resetReplay": "Reset replay", - "stepProgress": "step {current}/{total}", - "inlineView": "Inline", - "splitComingSoon": "Split view (coming soon)", - "inputPlaceholder": "Paste a prompt, tool output, or context…", - "activeCombined": "Active in the combined flow", - "requiresOnnx": "requires an ONNX model", - "verifyFidelity": "Verify fidelity (reject any layer that corrupts content)", - "fuzzyDedup": "Fuzzy deduplication (near-duplicate → CCR)", - "protectSensitive": "Protect sensitive content (risk gate)", - "quantumLock": "QuantumLock (stabilize the cache prefix)", - "saliencyHeatmap": "Saliency heatmap", - "running": "Running…", - "run": "Run", - "laneRejected": "rejected: {reason}", + "noRun": "No hay ninguna ejecución de compresión disponible.", + "liveDataHint": "Los datos en directo llegan a través del canal de compresión de WebSocket.", + "cockpitView": "Vista de cabina", + "canvas": "Lienzo", + "waterfall": "Cascada", + "replayDone": "Reproducción completada", + "pauseReplay": "Pausar reproducción", + "playReplay": "Reproducir", + "pause": "Pausar", + "replay": "Reproducir", + "resetReplay": "Reiniciar reproducción", + "stepProgress": "paso {current}/{total}", + "inlineView": "En línea", + "splitComingSoon": "Vista dividida (próximamente)", + "inputPlaceholder": "Pega un prompt, la salida de una herramienta o un contexto...", + "activeCombined": "Activo en el flujo combinado", + "requiresOnnx": "requiere un modelo ONNX", + "verifyFidelity": "Verificar fidelidad (rechazar cualquier capa que corrompa el contenido)", + "fuzzyDedup": "Deduplicación difusa (casi duplicado → CCR)", + "protectSensitive": "Proteger contenido sensible (filtro de riesgo)", + "quantumLock": "QuantumLock (estabilizar el prefijo de caché)", + "saliencyHeatmap": "Mapa de calor de relevancia", + "running": "Ejecutando…", + "run": "Ejecutar", + "laneRejected": "rechazado: {reason}", "error": "error", - "combinedFlow": "Combined flow", - "eachLayer": "Each layer separately", - "diff": "Difference", - "combined": "combined", - "skipped": "skip", - "input": "INPUT", - "output": "OUTPUT", + "combinedFlow": "Flujo combinado", + "eachLayer": "Cada capa por separado", + "diff": "Diferencia", + "combined": "combinado", + "skipped": "omitir", + "input": "ENTRADA", + "output": "SALIDA", "tokenCount": "{count, number} tokens", "tokenShort": "tok", - "provider": "Provider", - "judgeModel": "Judge model", - "judgeModelPlaceholder": "e.g. claude-haiku", - "maxCostUsd": "USD cap", - "enterJudgeModel": "Enter a judge model", - "verifying": "Verifying…", - "verifyAll": "Verify all", - "spent": "spent ${spent} / ${cap}", - "capReached": "cap reached", - "loadAb": "Load A/B", - "engine": "Engine", - "savings": "Savings", - "retention": "Retention", - "outputTokensShort": "Output tokens", - "fidelity": "Fidelity", - "playTab": "Play", - "compareTab": "Compare", - "encoderComparison": "Encoder A/B — {count} array(s)", - "encoderWinner": "winner: {winner}", - "encoder": "encoder", + "provider": "Proveedor", + "judgeModel": "Modelo de evaluación", + "judgeModelPlaceholder": "p. ej., claude-haiku", + "maxCostUsd": "Límite en USD", + "enterJudgeModel": "Introduce un modelo de evaluación", + "verifying": "Verificando…", + "verifyAll": "Verificar todo", + "spent": "gastado ${spent} / ${cap}", + "capReached": "límite alcanzado", + "loadAb": "Cargar A/B", + "engine": "Motor", + "savings": "Ahorro", + "retention": "Retención", + "outputTokensShort": "Tokens de salida", + "fidelity": "Fidelidad", + "playTab": "Reproducir", + "compareTab": "Comparar", + "encoderComparison": "Codificador A/B — {count} array(s)", + "encoderWinner": "ganador: {winner}", + "encoder": "codificador", "bytes": "bytes", "tokensCl100k": "tokens (cl100k)" }, "omniglyph": { - "preview": "Preview", - "description": "Context-as-image compression. Renders the system prompt, tool documentation, and dense history as compact PNG pages that Claude Fable 5 reads instead of text. Image tokens are billed by dimensions rather than characters, so the converted block costs about 10× less. Direct Anthropic route only.", - "economicsTitle": "The economics", + "preview": "Vista previa", + "description": "Compresión de contexto como imagen. Renderiza el system prompt, la documentación de herramientas y el historial denso como páginas PNG compactas que Claude Fable 5 lee en lugar de texto. Los tokens de imagen se facturan por dimensiones en lugar de caracteres, por lo que el bloque convertido cuesta unas 10 veces menos. Solo ruta directa de Anthropic.", + "economicsTitle": "La economía", "economics": { - "fewerTokens": "fewer tokens on the converted block", - "savings": "end-to-end savings (measured)", - "imageTokens": "image tokens for a 1568×728 page (about 28k characters)", - "accuracy": "reading accuracy on Fable 5 (n=30)" + "fewerTokens": "menos tokens en el bloque convertido", + "savings": "ahorro integral (medido)", + "imageTokens": "tokens de imagen para una página de 1568×728 (unos 28k caracteres)", + "accuracy": "precisión de lectura en Fable 5 (n=30)" }, - "beforeAfterTitle": "Before → after", - "blockSavings": "−{percent}% tokens on this block", - "realRender": "A real render of {characters, number} characters of dense tool documentation — not a mockup.", - "textTokens": "Text · ≈ {tokens, number} tokens", - "renderedTokens": "Rendered page · ≈ {tokens, number} tokens", - "renderedImageAlt": "Rendered dense page, {width}×{height}px", - "gatesTitle": "When it fires", - "gatesDescription": "Fail-closed: every gate must pass, or the request passes through untouched (each skip is recorded as skip:<reason>).", + "beforeAfterTitle": "Antes → después", + "blockSavings": "−{percent}% tokens en este bloque", + "realRender": "Un renderizado real de {characters, number} caracteres de documentación técnica densa, no una maqueta.", + "textTokens": "Texto · ≈ {tokens, number} tokens", + "renderedTokens": "Página renderizada · ≈ {tokens, number} tokens", + "renderedImageAlt": "Página densa renderizada, {width}×{height}px", + "gatesTitle": "Cuándo se activa", + "gatesDescription": "Cierre por fallo: cada filtro debe pasar, o la solicitud pasa sin cambios (cada omisión se registra como skip:<reason>).", "gates": { "model": { - "label": "Model", + "label": "Modelo", "pass": "claude-fable-5", - "why": "Only Fable 5 reads dense pages at 100% accuracy (measured, n=30). GPT-5.5 and Gemini 2.5 Flash are blocked." + "why": "Solo Fable 5 lee páginas densas con un 100% de precisión (medido, n=30). GPT-5.5 y Gemini 2.5 Flash están bloqueados." }, "transport": { - "label": "Transport", - "pass": "direct Anthropic", - "why": "Aggregators resample images and destroy legibility — only the direct route is authoritative." + "label": "Transporte", + "pass": "Anthropic directo", + "why": "Los agregadores remuestrean las imágenes y destruyen la legibilidad; solo la ruta directa es autoritativa." }, "format": { - "label": "Format", - "pass": "native Claude", - "why": "The body must use Claude format and must never put a system role inside messages." + "label": "Formato", + "pass": "Claude nativo", + "why": "El cuerpo debe usar el formato de Claude y nunca debe incluir un rol de sistema dentro de los mensajes." }, "profitable": { - "label": "Profitable", - "pass": "dense enough", - "why": "The exact 28px-patch cost gate decides per request; small or sparse text passes through untouched." + "label": "Rentable", + "pass": "suficientemente denso", + "why": "El filtro de coste exacto de parches de 28px decide por solicitud; el texto pequeño o disperso pasa sin cambios." } }, - "enableTitle": "Enable the engine", - "enableDescription": "Runs last in the stack (after RTK/Caveman cleans the text, OmniGlyph converts the remainder to images) and also runs standalone through omniglyph mode. This is a preview and remains off by default until end-to-end validation is complete.", - "saved": "Saved.", - "saveFailed": "Could not save.", - "enableAria": "Enable the OmniGlyph engine" + "enableTitle": "Activar el motor", + "enableDescription": "Se ejecuta al final de la pila (después de que RTK/Caveman limpie el texto, OmniGlyph convierte el resto en imágenes) y también se ejecuta de forma independiente mediante el modo omniglyph. Esta es una vista previa y permanece desactivada por defecto hasta que se complete la validación integral.", + "saved": "Guardado.", + "saveFailed": "No se pudo guardar.", + "enableAria": "Activar el motor OmniGlyph" }, "embeddedServices": { - "title": "Embedded Services", - "description": "Local engines managed on demand — CLIProxyAPI, 9Router, Mux, and Bifrost. Accessible on loopback only.", - "stateRunning": "Running", - "stateStopped": "Stopped", - "stateStarting": "Starting", - "stateStopping": "Stopping", + "title": "Servicios integrados", + "description": "Motores locales gestionados bajo demanda: CLIProxyAPI, 9Router, Mux y Bifrost. Accesibles solo en loopback.", + "stateRunning": "En ejecución", + "stateStopped": "Detenido", + "stateStarting": "Iniciando", + "stateStopping": "Deteniendo", "stateError": "Error", - "stateNotInstalled": "Not installed", - "stateUnknown": "Unknown", - "port": "port {port}", - "externalBadge": "Externally managed", - "externalTitle": "External 9Router detected", - "externalDescription": "OmniRoute found 9Router at {host}:{port}. Its lifecycle, logs, updates, and service key remain managed by the external installation.", - "start": "Start", - "starting": "Starting…", - "stop": "Stop", - "stopping": "Stopping…", - "restart": "Restart", - "restarting": "Restarting…", - "update": "Update", - "updating": "Updating…", - "install": "Install", - "installing": "Installing…", - "autoStart": "Auto-start", - "autoStartDescription": "Launch {name} automatically when OmniRoute starts", - "apiKey": "API Key", - "apiKeyDescription": "Key used by OmniRoute to authenticate with {name}", - "keyRotated": "Key rotated — {name} restarted to apply the new key", - "keyRotateFailed": "Failed to rotate key", - "keyRevealFailed": "Failed to reveal key", - "keyRevealEmpty": "Reveal failed: key not returned", - "reveal": "Reveal", - "revealing": "Revealing…", - "hide": "Hide", - "rotateKey": "Rotate key", - "rotating": "Rotating…", - "keyAutoHide": "Key will be hidden automatically in 30 seconds.", - "revealTitle": "Reveal API Key", - "revealConfirm": "Revealing the API key will be logged in the audit trail. Continue?", - "cancel": "Cancel", - "install9Router": "Install 9Router", - "install9RouterDescription": "Downloads and installs 9Router via npm. Requires approximately 500 MB of disk space.", - "version": "Version", - "versionHint": "Enter “latest” or a specific version (for example, 1.2.3).", - "servicePort": "Port", - "servicePortHint": "OmniRoute and 9Router must use different ports. The default 9Router port is 20130.", - "installationFailed": "Installation failed (HTTP {status})", - "installationSucceeded": "9Router installed successfully. Starting up…", - "networkInstallFailed": "Network error — could not reach the install endpoint", - "availableModels": "Available Models", - "modelsLoading": "Loading…", - "modelsDiscovered": "{count, plural, one {# model discovered} other {# models discovered}}", - "modelsLoadFailed": "Failed to load models", - "refreshing": "Refreshing…", - "refreshNow": "Refresh now", - "noModels": "No models found. Select “Refresh now” to sync from the running service.", - "unavailable": "Unavailable", - "pageOf": "Page {page} of {total}", - "previous": "Previous", - "next": "Next", - "providerExposure": "Provider Exposure", - "providerExposureDescription": "Expose 9Router models as a routing target under the 9router/ prefix.", - "providerExposureLabel": "Expose as 9router/…", - "providerExposureHint": "When enabled, discovered models appear in provider selectors across OmniRoute.", - "providerExposureUpdateFailed": "Failed to update (HTTP {status})", - "providerExposureNetworkFailed": "Network error — could not update the provider exposure setting", - "webUi": "9Router Web UI", - "openNewTab": "Open in new tab", - "filterLogs": "Filter logs…", - "resume": "Resume", - "pause": "Pause", - "clear": "Clear", - "download": "Download", - "noLogs": "No log output yet.", - "logStreamFailed": "Unable to stream {name} logs. Check local access and service status.", - "fallbackRouting": "Fallback Routing", - "fallbackRoutingDescription": "Retry failed provider requests through CLIProxyAPI", - "enableFallback": "Enable fallback", - "cliproxyUrl": "CLIProxyAPI URL", - "fallbackCodes": "Fallback status codes (comma-separated)", - "invalidUrl": "Invalid URL — must start with http:// or https://", - "saved": "Saved", - "saveFailed": "Failed to save setting", - "modelMapping": "Model Mapping", - "modelMappingDescription": "Map OmniRoute model IDs to CLIProxyAPI model IDs (for example, \"gpt-4o\": \"openai-gpt-4o\")", - "modelMappingEditor": "Model mapping JSON editor", - "mappingSaved": "Mapping saved", - "mappingSaveFailed": "Failed to save mapping", - "mappingInvalidJson": "Invalid JSON.", - "mappingMustBeObject": "The mapping must be a JSON object, not an array or primitive value.", - "mappingValueMustBeString": "The value for key “{key}” must be a string.", - "save": "Save" + "stateNotInstalled": "No instalado", + "stateUnknown": "Desconocido", + "port": "puerto {port}", + "externalBadge": "Gestionado externamente", + "externalTitle": "9Router externo detectado", + "externalDescription": "OmniRoute encontró 9Router en {host}:{port}. Su ciclo de vida, logs, actualizaciones y clave de servicio siguen siendo gestionados por la instalación externa.", + "start": "Iniciar", + "starting": "Iniciando…", + "stop": "Detener", + "stopping": "Deteniendo…", + "restart": "Reiniciar", + "restarting": "Reiniciando…", + "update": "Actualizar", + "updating": "Actualizando…", + "install": "Instalar", + "installing": "Instalando…", + "autoStart": "Inicio automático", + "autoStartDescription": "Iniciar {name} automáticamente al arrancar OmniRoute", + "apiKey": "Clave de API", + "apiKeyDescription": "Clave utilizada por OmniRoute para autenticarse con {name}", + "keyRotated": "Clave rotada: {name} reiniciado para aplicar la nueva clave", + "keyRotateFailed": "Error al rotar la clave", + "keyRevealFailed": "Error al revelar la clave", + "keyRevealEmpty": "Error al revelar: no se devolvió la clave", + "reveal": "Revelar", + "revealing": "Revelando…", + "hide": "Ocultar", + "rotateKey": "Rotar clave", + "rotating": "Rotando…", + "keyAutoHide": "La clave se ocultará automáticamente en 30 segundos.", + "revealTitle": "Revelar clave de API", + "revealConfirm": "Revelar la clave de API se registrará en la pista de auditoría. ¿Continuar?", + "cancel": "Cancelar", + "install9Router": "Instalar 9Router", + "install9RouterDescription": "Descarga e instala 9Router mediante npm. Requiere aproximadamente 500 MB de espacio en disco.", + "version": "Versión", + "versionHint": "Introduce “latest” o una versión específica (por ejemplo, 1.2.3).", + "servicePort": "Puerto", + "servicePortHint": "OmniRoute y 9Router deben usar puertos diferentes. El puerto predeterminado de 9Router es 20130.", + "installationFailed": "Error en la instalación (HTTP {status})", + "installationSucceeded": "9Router instalado correctamente. Iniciando…", + "networkInstallFailed": "Error de red: no se pudo contactar con el endpoint de instalación", + "availableModels": "Modelos disponibles", + "modelsLoading": "Cargando…", + "modelsDiscovered": "{count, plural, one {# modelo descubierto} other {# modelos descubiertos}}", + "modelsLoadFailed": "Error al cargar los modelos", + "refreshing": "Actualizando…", + "refreshNow": "Actualizar ahora", + "noModels": "No se encontraron modelos. Selecciona “Actualizar ahora” para sincronizar desde el servicio en ejecución.", + "unavailable": "No disponible", + "pageOf": "Página {page} de {total}", + "previous": "Anterior", + "next": "Siguiente", + "providerExposure": "Exposición del proveedor", + "providerExposureDescription": "Exponer modelos de 9Router como destino de enrutamiento bajo el prefijo 9router/.", + "providerExposureLabel": "Exponer como 9router/…", + "providerExposureHint": "Cuando está activado, los modelos descubiertos aparecen en los selectores de proveedores en todo OmniRoute.", + "providerExposureUpdateFailed": "Error al actualizar (HTTP {status})", + "providerExposureNetworkFailed": "Error de red: no se pudo actualizar el ajuste de exposición del proveedor", + "webUi": "Interfaz web de 9Router", + "openNewTab": "Abrir en una pestaña nueva", + "filterLogs": "Filtrar logs…", + "resume": "Reanudar", + "pause": "Pausar", + "clear": "Limpiar", + "download": "Descargar", + "noLogs": "Aún no hay salida de log.", + "logStreamFailed": "No se pueden transmitir los logs de {name}. Comprueba el acceso local y el estado del servicio.", + "fallbackRouting": "Enrutamiento de fallback", + "fallbackRoutingDescription": "Reintentar solicitudes fallidas del proveedor a través de CLIProxyAPI", + "enableFallback": "Activar fallback", + "cliproxyUrl": "URL de CLIProxyAPI", + "fallbackCodes": "Códigos de estado de fallback (separados por comas)", + "invalidUrl": "URL no válida: debe comenzar con http:// o https://", + "saved": "Guardado", + "saveFailed": "Error al guardar el ajuste", + "modelMapping": "Mapeo de modelos", + "modelMappingDescription": "Mapear IDs de modelos de OmniRoute a IDs de modelos de CLIProxyAPI (por ejemplo, \"gpt-4o\": \"openai-gpt-4o\")", + "modelMappingEditor": "Editor JSON de mapeo de modelos", + "mappingSaved": "Mapeo guardado", + "mappingSaveFailed": "Error al guardar el mapeo", + "mappingInvalidJson": "JSON no válido.", + "mappingMustBeObject": "El mapeo debe ser un objeto JSON, no un array o un valor primitivo.", + "mappingValueMustBeString": "El valor para la clave “{key}” debe ser una cadena.", + "save": "Guardar" }, "contextCaveman": { - "title": "Caveman Engine", - "description": "Rule-based message compression, language packs, analytics and output mode controls.", + "title": "Motor Caveman", + "description": "Compresión de mensajes basada en reglas, paquetes de idioma, analíticas y controles de modo de salida.", "advancedConfig": "Configuración avanzada", "advancedConfigDesc": "Ajustar el comportamiento de compresión", "aggressiveSettings": "Configuraciones agresivas", "aggressiveSettingsDesc": "Máxima compresión con posibles compensaciones de calidad", - "requests": "Requests", - "tokensSaved": "Tokens saved", - "savingsPercent": "Savings %", - "avgLatency": "Avg latency", - "languagePacks": "Language Packs", - "languagePacksDesc": "Enable compression rules for specific languages.", + "requests": "Solicitudes", + "tokensSaved": "Tokens ahorrados", + "savingsPercent": "Ahorro %", + "avgLatency": "Latencia media", + "languagePacks": "Paquetes de idioma", + "languagePacksDesc": "Activar reglas de compresión para idiomas específicos.", "labelAutoTrigger": "Comprimir automáticamente cuando el contexto excede", "labelCompressionRate": "Fuerza de compresión", "labelMaxTokens": "Tokens de destino por mensaje", "labelMinLength": "Longitud mínima del mensaje", "labelMinSavings": "Tokens mínimos para ahorrar", - "enabled": "Enabled", - "autoDetect": "Auto-detect language", - "rulesCount": "{count} rules", + "enabled": "Activado", + "autoDetect": "Detectar idioma automáticamente", + "rulesCount": "{count} reglas", "inputCompressionTitle": "Compresión de entrada", - "inputCompressionDesc": "Reescribe el historial de chat con palabras más cortas. Reduce los tokens de entrada en un ~50%.", - "analyticsTitle": "Compression Analytics", - "noAnalytics": "No compression analytics yet.", - "masterDisabledWarning": "The Token Saver master switch is OFF — these settings will not affect requests until you turn it on from Compression Settings or change it here.", + "inputCompressionDesc": "Reescribe el historial del chat con expresiones más breves. Reduce los tokens de entrada en un ~50%.", + "analyticsTitle": "Análisis de compresión", + "noAnalytics": "Aún no hay análisis de compresión.", + "masterDisabledWarning": "El interruptor principal de Token Saver está DESACTIVADO; estos ajustes no afectarán a las solicitudes hasta que lo actives en los ajustes de compresión o lo cambies aquí.", "outputMode": "Modo de salida", - "outputModeDesc": "Instructs the LLM to respond in a terse, compact format.", - "outputModeTitle": "Output Mode", - "quickSettings": "Configuración rápida", - "quickSettingsDesc": "Configuraciones básicas de compresión para comenzar", - "autoClarity": "Auto-Clarity Bypass", - "bypassConditions": "Bypass conditions", + "outputModeDesc": "Controla cómo aparece la salida comprimida", + "outputModeTitle": "Modo de salida", + "quickSettings": "Ajustes rápidos", + "quickSettingsDesc": "Ajustes básicos de compresión para empezar", + "autoClarity": "Omisión de claridad automática", + "bypassConditions": "Condiciones de omisión", "bypassConditionsList": "seguridad, irreversible, aclaración, sensible al orden", - "simpleMode": "Sencillo", + "simpleMode": "Simple", "advancedMode": "Avanzado", - "tooltipAutoTrigger": "Comprime automáticamente cuando el contexto excede este tamaño.", + "tooltipAutoTrigger": "Comprime automáticamente cuando el contexto supera este tamaño.", "tooltipCompressionRate": "0,0 = ninguno, 1,0 = máximo. 0,5 = equilibrado.", "tooltipMaxTokens": "Recuento de tokens de destino después de la compresión. Más bajo = más agresivo.", "tooltipMinLength": "Los mensajes más cortos que esto no se comprimen. Más bajo = más compresión.", - "tooltipMinSavings": "Comprima solo si guarda al menos esta cantidad de tokens.", - "ultraSettings": "Configuración ultra", + "tooltipMinSavings": "Comprimir solo si se ahorra al menos esta cantidad de tokens.", + "ultraSettings": "Ajustes ultra", "ultraSettingsDesc": "Compresión semántica impulsada por SLM", "preview": { - "lite": "Respond concise. Preserve technical terms, code, errors, URLs, and identifiers.", - "full": "Respond terse and compact. Preserve all technical substance.", - "ultra": "Respond ultra terse with common technical abbreviations. Preserve exact symbols." + "lite": "Responde de forma concisa. Conserva los términos técnicos, el código, los errores, las URL y los identificadores.", + "full": "Responde de forma concisa y compacta. Conserva todo el contenido técnico.", + "ultra": "Responde de forma ultra concisa utilizando abreviaturas técnicas comunes. Conserva los símbolos exactos." } }, "translator": { "title": "Traductor", - "metaTitle": "Patio de juegos del traductor | OmniRuta", - "metaDescription": "Depurar, probar y visualizar traducciones de formatos API entre proveedores", - "playgroundTitle": "Patio de juegos del traductor", - "playground": "Zona de juegos", + "metaTitle": "Playground del traductor | OmniRoute", + "metaDescription": "Depura, prueba y visualiza las traducciones de formatos de API entre proveedores", + "playgroundTitle": "Playground del traductor", + "playground": "Playground", "realtime": "Actividad de traducción en tiempo real", "chatTester": "Probador de chat", "testBench": "Banco de pruebas", - "liveMonitor": "Monitor en vivo", - "modeDescriptionPlayground": "Pegue cualquier cuerpo de solicitud de API y vea cómo OmniRoute lo traduce entre formatos de proveedores (OpenAI ↔ Claude ↔ Gemini ↔ API de respuestas)", - "modeDescriptionChatTester": "Envíe solicitudes de chat reales a través de OmniRoute e inspeccione el recorrido completo: entrada, solicitud traducida, respuesta del proveedor y salida traducida.", - "modeDescriptionTestBench": "Ejecute escenarios predefinidos y compare la compatibilidad entre proveedores y modelos.", - "modeDescriptionLiveMonitor": "Vea los eventos de traducción en tiempo real a medida que las solicitudes fluyen a través de OmniRoute.", - "modeDescriptionFallback": "Depure, pruebe y visualice cómo OmniRoute traduce las solicitudes de API entre proveedores.", + "liveMonitor": "Monitor en directo", + "modeDescriptionPlayground": "Pega cualquier cuerpo de solicitud de API y observa cómo OmniRoute lo traduce entre los formatos de los proveedores (OpenAI ↔ Claude ↔ Gemini ↔ Responses API)", + "modeDescriptionChatTester": "Envía solicitudes de chat reales a través de OmniRoute e inspecciona todo el recorrido: entrada, solicitud traducida, respuesta del proveedor y salida traducida.", + "modeDescriptionTestBench": "Ejecuta escenarios predefinidos y compara la compatibilidad entre proveedores y modelos.", + "modeDescriptionLiveMonitor": "Observa los eventos de traducción en tiempo real a medida que las solicitudes fluyen a través de OmniRoute.", + "modeDescriptionFallback": "Depura, prueba y visualiza cómo OmniRoute traduce las solicitudes de API entre proveedores.", "recentTranslations": "Traducciones recientes", "noTranslations": "Aún no hay traducciones", - "source": "Fuente", - "target": "Objetivo", - "time": "tiempo", - "model": "modelo", + "source": "Origen", + "target": "Destino", + "time": "Hora", + "model": "Modelo", "status": "Estado", "latency": "Latencia", "totalTranslations": "Traducciones totales", - "successful": "Exitoso", + "successful": "Correctas", "errors": "Errores", - "avgLatency": "Latencia promedio", + "avgLatency": "Latencia media", "millisecondsShort": "{value}ms", "notAvailableSymbol": "—", - "liveAutoRefreshing": "En vivo: actualización automática", + "liveAutoRefreshing": "En directo — Actualización automática", "paused": "En pausa", - "eventsAppearHint": "Los eventos de traducción aparecen aquí a medida que las solicitudes fluyen a través de OmniRoute. Utilice cualquiera de estos métodos para generar eventos:", - "chatTesterTab": "Pestaña Probador de chat", - "testBenchTab": "Pestaña Banco de pruebas", - "externalApiCalls": "Llamadas API externas", - "ideCliIntegrations": "Integraciones IDE/CLI", - "inMemoryNote": "Nota: Los eventos se almacenan en la memoria y se restablecen cuando se reinicia el servidor.", - "ok": "bien", - "errorShort": "ERROR", - "formatConverter": "Convertidor de formato", - "formatConverterDescription": "Pegue o escriba un cuerpo de solicitud JSON. El traductor detectará automáticamente el formato de origen y lo convertirá al formato de destino. Utilice esto para depurar cómo OmniRoute traduce solicitudes entre formatos (OpenAI ↔ Claude ↔ Gemini ↔ API de respuestas).", + "eventsAppearHint": "Los eventos de traducción aparecen aquí a medida que las solicitudes fluyen a través de OmniRoute. Utiliza cualquiera de estos métodos para generar eventos:", + "chatTesterTab": "Pestaña de probador de chat", + "testBenchTab": "Pestaña de banco de pruebas", + "externalApiCalls": "Llamadas a API externas", + "ideCliIntegrations": "Integraciones de IDE/CLI", + "inMemoryNote": "Nota: Los eventos se almacenan en la memoria y se restablecen al reiniciar el servidor.", + "ok": "OK", + "errorShort": "ERR", + "formatConverter": "Conversor de formatos", + "formatConverterDescription": "Pega o escribe un cuerpo de solicitud JSON. El traductor detectará automáticamente el formato de origen y lo convertirá al formato de destino. Utiliza esto para depurar cómo OmniRoute traduce las solicitudes entre formatos (OpenAI ↔ Claude ↔ Gemini ↔ Responses API).", "translationPathHubSpoke": "{source} → OpenAI (intermedio) → {target}", "translationPathDirect": "{source} → {target} (traductor directo)", "translationPathPassthrough": "Mismo formato: no se necesita traducción", - "openaiIntermediatePanel": "Intermedio OpenAI", - "autoFeaturesTitle": "Qué hace OmniRoute automáticamente", + "openaiIntermediatePanel": "OpenAI intermedio", + "autoFeaturesTitle": "Lo que OmniRoute hace automáticamente", "autoFeaturesCount": "8 características", "featureReasoningCache": "Caché de razonamiento", - "featureReasoningCacheDesc": "Reinyecta contenido de razonamiento almacenado en caché para modelos en modo de pensamiento (DeepSeek V4, Kimi K2, Qwen) cuando los clientes lo omiten del historial de conversaciones.", + "featureReasoningCacheDesc": "Reinyecta reasoning_content en caché para modelos con modo de pensamiento (DeepSeek V4, Kimi K2, Qwen) cuando los clientes lo omiten del historial de conversación.", "featureSchemaCoercion": "Coerción de esquema", - "featureSchemaCoercionDesc": "Corrige esquemas de herramientas rotos: agrega propiedades adicionales faltantes, desinfecta descripciones largas, normaliza objetos anidados.", + "featureSchemaCoercionDesc": "Corrige esquemas de herramientas incorrectos: añade las propiedades adicionales que faltan, depura descripciones largas y normaliza objetos anidados.", "featureRoleNormalization": "Normalización de roles", - "featureRoleNormalizationDesc": "Desarrollador de mapas → sistema para objetivos que no son OpenAI. Sistema de mapas → usuario para modelos que no admiten la función del sistema.", + "featureRoleNormalizationDesc": "Mapea developer→system para destinos que no son de OpenAI. Mapea system→user para modelos que no admiten el rol de sistema.", "featureToolCallIds": "Normalización de ID de llamada de herramienta", - "featureToolCallIdsDesc": "Genera ID únicos de llamada de herramienta cuando faltan. Se normaliza al formato de 9 caracteres para proveedores como Mistral.", + "featureToolCallIdsDesc": "Genera ID de tool_call únicos cuando faltan. Los normaliza a un formato de 9 caracteres para proveedores como Mistral.", "featureMissingToolResponse": "Inyección de respuesta de herramienta", - "featureMissingToolResponseDesc": "Inyecta mensajes tool_result vacíos cuando los clientes envían tool_calls sin las respuestas correspondientes.", - "featureThinkingBudget": "Pensando en el presupuesto", + "featureMissingToolResponseDesc": "Inyecta mensajes tool_result vacíos cuando los clientes envían tool_calls sin sus correspondientes respuestas.", + "featureThinkingBudget": "Presupuesto de pensamiento", "featureThinkingBudgetDesc": "Gestiona automáticamente la configuración de pensamiento. Elimina los parámetros de pensamiento cuando el último mensaje no es del usuario.", "featureDirectPaths": "Rutas de traducción directa", - "featureDirectPathsDesc": "Algunos pares de formatos (Claude→Gemini) tienen traductores directos que pasan por alto el centro OpenAI, lo que produce resultados más precisos.", + "featureDirectPathsDesc": "Algunos pares de formatos (Claude→Gemini) cuentan con traductores directos que omiten el hub de OpenAI, lo que produce una salida más precisa.", "featureImageMapping": "Mapeo de tamaño de imagen", - "featureImageMappingDesc": "Traduce convenciones de dimensiones de imágenes entre formatos API (por ejemplo, niveles de detalle de OpenAI → dimensiones de Gemini).", + "featureImageMappingDesc": "Traduce las convenciones de dimensiones de imagen entre los formatos de API (p. ej., niveles de detalle de OpenAI → dimensiones de Gemini).", "input": "Entrada", "output": "Salida", - "auto": "Automático", + "auto": "Auto", "swapFormats": "Intercambiar formatos", "translateAction": "Traducir", "clear": "Borrar", - "inputPlaceholder": "Pegue el cuerpo de una solicitud aquí o seleccione una plantilla a continuación...", + "inputPlaceholder": "Pega un cuerpo de solicitud aquí o selecciona una plantilla abajo...", "exampleTemplates": "Plantillas de ejemplo", - "exampleTemplatesHint": "— Haga clic para cargar", - "templateLoadHint": "La plantilla carga la solicitud en formato {format}. Cambie el formato de origen para cargar en un formato diferente.", + "exampleTemplatesHint": "— Haz clic para cargar", + "templateLoadHint": "La plantilla carga la solicitud en formato {format}. Cambia el formato de origen para cargarla en un formato diferente.", "compatibilityTester": "Probador de compatibilidad", "compatibilityReport": "Informe de compatibilidad", - "testBenchDescription": "Ejecute escenarios predefinidos (chat simple, llamadas de herramientas, etc.) para verificar la traducción y la compatibilidad del proveedor. Seleccione un formato de origen y un proveedor de destino, luego ejecute todas las pruebas para ver un porcentaje de compatibilidad. Utilice esto para encontrar qué funciones funcionan en todos los proveedores.", - "targetProvider": "Proveedor objetivo", + "testBenchDescription": "Ejecuta escenarios predefinidos (Chat simple, Llamadas a herramientas, etc.) para verificar la traducción y la compatibilidad con el proveedor. Selecciona un formato de origen y un proveedor de destino, y ejecuta todas las pruebas para ver el porcentaje de compatibilidad. Utiliza esto para descubrir qué funciones funcionan entre diferentes proveedores.", + "targetProvider": "Proveedor de destino", "runAllTests": "Ejecutar todas las pruebas", "runTest": "Ejecutar prueba", "reRun": "Volver a ejecutar", - "running": "Corriendo...", - "passed": "pasó", - "failed": "falló", - "passedIconLabel": "✅ Aprobado", - "chunks": "trozos", - "scenarioSimpleChat": "Charla sencilla", - "scenarioToolCalling": "Llamada de herramientas", - "scenarioMultiTurn": "multivuelta", - "scenarioThinking": "Pensando", - "scenarioSystemPrompt": "Aviso del sistema", - "scenarioStreaming": "Transmisión", + "running": "Ejecutando...", + "passed": "superada", + "failed": "fallida", + "passedIconLabel": "✅ Superada", + "chunks": "fragmentos", + "scenarioSimpleChat": "Chat simple", + "scenarioToolCalling": "Llamada a herramientas", + "scenarioMultiTurn": "Multiturno", + "scenarioThinking": "Razonamiento", + "scenarioSystemPrompt": "Prompt del sistema", + "scenarioStreaming": "Streaming", "templateNames": { - "simple-chat": "Charla sencilla", - "tool-calling": "Llamada de herramientas", - "multi-turn": "multivuelta", - "thinking": "Pensando", - "system-prompt": "Aviso del sistema", - "streaming": "Transmisión", + "simple-chat": "Chat simple", + "tool-calling": "Llamada a herramientas", + "multi-turn": "Multiturno", + "thinking": "Razonamiento", + "system-prompt": "Prompt del sistema", + "streaming": "Streaming", "vision": "Visión", "schema-coercion": "Coerción de esquema" }, "templateDescriptions": { "simple-chat": "Mensaje de texto básico", "tool-calling": "Invocación de función/herramienta", - "multi-turn": "Conversación con la historia.", - "thinking": "Pensamiento/razonamiento extendido", - "system-prompt": "Instrucciones complejas del sistema", - "streaming": "Solicitud de transmisión SSE", - "vision": "Solicitud multimodal con entrada de imagen.", - "schema-coercion": "Aplicación de esquema JSON/salida estructurada" + "multi-turn": "Conversación con historial", + "thinking": "Razonamiento / pensamiento extendido", + "system-prompt": "Instrucciones de sistema complejas", + "streaming": "Solicitud de streaming SSE", + "vision": "Solicitud multimodal con entrada de imagen", + "schema-coercion": "Aplicación de esquema JSON / salida estructurada" }, "templatePayloads": { "simpleChat": { @@ -8246,22 +8248,22 @@ "userGreeting": "¡Hola! ¿Cómo estás hoy?" }, "toolCalling": { - "userWeather": "¿Cuál es el clima en São Paulo?", - "toolDescription": "Obtener el clima actual para una ubicación", + "userWeather": "¿Qué tiempo hace en São Paulo?", + "toolDescription": "Obtener el tiempo actual para una ubicación", "cityNameDescription": "Nombre de la ciudad" }, "multiTurn": { - "system": "Eres un asistente de codificación.", - "userInitial": "Escriba una función para ordenar una matriz en Python.", - "assistantExample": "Aquí hay una función de clasificación simple: ```pitón\ndef sort_array(arr): devolver ordenado(arr)\n```", - "userFollowUp": "Ahora haz que se clasifique en orden descendente." + "system": "Eres un asistente de programación.", + "userInitial": "Escribe una función para ordenar un array en Python.", + "assistantExample": "Aquí tienes una función de ordenación sencilla: ```python\ndef sort_array(arr): return sorted(arr)\n```", + "userFollowUp": "Ahora haz que ordene en orden descendente." }, "thinking": { "question": "¿Cuál es la suma de los primeros 100 números primos?" }, "systemPrompt": { - "systemInstruction": "Eres un ingeniero de software senior especializado en sistemas distribuidos. Responda preguntas de manera concisa utilizando las mejores prácticas de la industria. Proporcione siempre ejemplos de código cuando sea relevante. Formatee sus respuestas usando Markdown.", - "question": "¿Cómo implemento un patrón de disyuntor?" + "systemInstruction": "Eres un ingeniero de software sénior especializado en sistemas distribuidos. Responde a las preguntas de forma concisa utilizando las mejores prácticas de la industria. Proporciona siempre ejemplos de código cuando sea relevante. Formatea tus respuestas usando markdown.", + "question": "¿Cómo implemento el patrón circuit breaker?" }, "streaming": { "prompt": "Cuéntame una historia corta sobre un robot que aprende a pintar." @@ -8272,191 +8274,191 @@ "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/PNG_transparency_demonstration_1.png/600px-PNG_transparency_demonstration_1.png" }, "schemaCoercion": { - "userPrompt": "Busque el clima de Tokio usando unidades métricas e incluya el desglose por horas.", - "toolDescription": "Obtenga el clima de una ciudad con opciones estructuradas.", - "cityDescription": "La ciudad a consultar, p.e. 'Tokio' o 'Nueva York'." + "userPrompt": "Consulta el tiempo en Tokio usando unidades métricas e incluye el desglose por horas.", + "toolDescription": "Obtiene el tiempo para una ciudad con opciones estructuradas.", + "cityDescription": "La ciudad a consultar, p. ej., 'Tokyo' o 'New York'." } }, "openaiCompatibleLabel": "Compatible con OpenAI", - "anthropicCompatibleLabel": "Compatible antrópico", + "anthropicCompatibleLabel": "Compatible con Anthropic", "noTemplateForFormat": "No hay plantilla para este formato", "translationFailed": "Error de traducción: {error}", - "pipelineDebugger": "Depurador de canalización", - "translationPipeline": "Canal de traducción", - "loading": "Loading…", + "pipelineDebugger": "Depurador de pipeline", + "translationPipeline": "Pipeline de traducción", + "loading": "Cargando…", "compressionOriginal": "Original", - "compressionCompressed": "Compressed", - "compressionSaved": "Saved", - "compressionDuration": "Duration", - "pipelineStepsAria": "Pipeline steps", - "copyIntermediateJson": "Copy intermediate JSON", - "copyOutputJson": "Copy output JSON", - "pipelineVisualization": "Visualización de tuberías", - "pipelineVisualizationHint": "Envíe un mensaje para ver cómo fluye su solicitud a través de detección → traducción → llamada al proveedor.", - "chatTesterDescription": "Envíe mensajes en un formato de cliente específico e inspeccione cada paso del proceso de traducción.", - "chatTesterFlow": "Solicitud de cliente → Detección de formato → OpenAI Intermedio → Formato de proveedor → Respuesta", - "clickStepToInspect": "Haga clic en cualquier paso para inspeccionar los datos en esa etapa.", + "compressionCompressed": "Comprimido", + "compressionSaved": "Ahorrado", + "compressionDuration": "Duración", + "pipelineStepsAria": "Pasos del pipeline", + "copyIntermediateJson": "Copiar JSON intermedio", + "copyOutputJson": "Copiar JSON de salida", + "pipelineVisualization": "Visualización del pipeline", + "pipelineVisualizationHint": "Envía un mensaje para ver cómo fluye tu solicitud a través de detección → traducción → llamada al proveedor.", + "chatTesterDescription": "Envía mensajes con un formato de cliente específico e inspecciona cada paso del pipeline de traducción.", + "chatTesterFlow": "Solicitud de cliente → Detección de formato → OpenAI intermedio → Formato de proveedor → Respuesta", + "clickStepToInspect": "Haz clic en cualquier paso para inspeccionar los datos en esa fase.", "clientFormat": "Formato de cliente", "provider": "Proveedor", - "modelPlaceholder": "Seleccione o escriba un nombre de modelo...", - "sendMessageToSeePipeline": "Envíe un mensaje para ver el proceso de traducción", - "chatMessageHintPrefix": "Su mensaje tendrá el formato de", + "modelPlaceholder": "Selecciona o escribe un nombre de modelo...", + "sendMessageToSeePipeline": "Envía un mensaje para ver el pipeline de traducción", + "chatMessageHintPrefix": "Tu mensaje se formateará como", "chatMessageHintSuffix": "solicitud, traducida a través del proceso y enviada al proveedor seleccionado.", "youWithFormat": "Tú ({format})", - "assistant": "asistente", + "assistant": "Asistente", "typeMessage": "Escribe un mensaje...", - "send": "enviar", + "send": "Enviar", "clientRequest": "Solicitud de cliente", - "clientRequestDescription": "El cuerpo de la solicitud como lo enviaría su cliente.", + "clientRequestDescription": "El cuerpo de la solicitud tal como lo enviaría su cliente", "formatDetected": "Formato detectado", - "formatDetectedDescription": "OmniRoute auto-detects the API format from the request structure", + "formatDetectedDescription": "OmniRoute detecta automáticamente el formato de la API a partir de la estructura de la solicitud", "openaiIntermediate": "Intermedio OpenAI", - "openaiIntermediateDescription": "All formats are first normalized to OpenAI format (the universal bridge)", + "openaiIntermediateDescription": "Todos los formatos se normalizan primero al formato de OpenAI (el puente universal)", "providerFormat": "Formato del proveedor", - "providerFormatDescription": "OpenAI format is translated to the provider's native format", + "providerFormatDescription": "El formato de OpenAI se traduce al formato nativo del proveedor", "providerResponse": "Respuesta del proveedor", - "providerResponseRawDescription": "La respuesta cruda de la API del proveedor", + "providerResponseRawDescription": "La respuesta sin procesar de la API del proveedor", "providerResponseSseDescription": "El flujo SSE sin procesar de la API del proveedor", "unexpectedError": "Ocurrió un error inesperado", - "error": "error", + "error": "Error", "errorMessage": "Error: {message}", "requestFailed": "Solicitud fallida", - "noTextExtracted": "(No se extrae texto)", - "liveMonitorMemoryNote": "Los eventos se almacenan en la memoria y se pierden al reiniciar.", + "noTextExtracted": "(No se extrajo texto)", + "liveMonitorMemoryNote": "Los eventos se almacenan en memoria y se pierden al reiniciar.", "liveMonitorMemoryCapNote": "Máximo 200 eventos retenidos.", "eventSourcesLabel": "Fuentes de eventos:", "eventSourceTranslatorPage": "• Página de traductor (Chat Tester, Test Bench)", "eventSourceMainPipeline": "• Canalización de solicitudes principal (tráfico CLI/IDE/API)", - "liveMonitorDescriptionPrefix": "Shows translation events as API calls flow through OmniRoute. Events come from the in-memory buffer (resets on restart). uso", - "liveMonitorDescriptionSuffix": "o llamadas API externas para generar eventos.", - "streamTransformer": "Transformador de corriente", - "modeDescriptionStreamTransformer": "Ejecute transmisiones SSE de finalización de chat a través del transformador de Respuestas.", - "streamTransformerTitle": "Transformador de flujo de respuestas", - "streamTransformerDescription": "Pegue una secuencia SSE de finalización de chat, ejecútela a través del transformador de respuestas de OmniRoute e inspeccione los eventos de respuesta.* emitidos antes de conectar a un cliente.", + "liveMonitorDescriptionPrefix": "Muestra los eventos de traducción a medida que las llamadas a la API fluyen a través de OmniRoute. Los eventos provienen del búfer en memoria (se restablece al reiniciar). Use", + "liveMonitorDescriptionSuffix": ", o llamadas a la API externas para generar eventos.", + "streamTransformer": "Transformador de stream", + "modeDescriptionStreamTransformer": "Ejecute streams SSE de finalización de chat a través del transformador de respuestas.", + "streamTransformerTitle": "Transformador de stream de respuestas", + "streamTransformerDescription": "Pegue un stream SSE de finalización de chat, ejecútelo a través del transformador de respuestas de OmniRoute e inspeccione los eventos response.* emitidos antes de conectar un cliente.", "loadTextSample": "Cargar muestra de texto", "loadToolSample": "Cargar muestra de llamada a herramienta", "transformToResponses": "Transformar en respuestas", - "rawChatSseInput": "Finalizaciones de chat sin procesar SSE", - "transformedResponsesSse": "API de respuestas transformadas SSE", + "rawChatSseInput": "SSE de finalización de chat sin procesar", + "transformedResponsesSse": "SSE de API de respuestas transformadas", "noResultsYet": "Aún no hay resultados", "transformedEvents": "Eventos transformados", "uniqueEventTypes": "Tipos de eventos únicos", "inputLines": "Líneas de entrada", "outputLines": "Líneas de salida", - "transformedEventTimeline": "Cronología del evento transformada", - "transformerTimelineHint": "Ejecute el transformador para inspeccionar los eventos de respuesta.output_* emitidos en orden.", + "transformedEventTimeline": "Cronología de eventos transformada", + "transformerTimelineHint": "Ejecute el transformador para inspeccionar los eventos response.output_* emitidos en orden.", "eventType": "Tipo de evento", "eventPreview": "Vista previa", "comboRouted": "Combo enrutado", - "uniqueEndpoints": "Puntos finales únicos", + "uniqueEndpoints": "Endpoints únicos", "routeDetails": "Detalles de la ruta", - "comboBadge": "combinado", - "routeEndpointLabel": "Punto final", + "comboBadge": "Combo", + "routeEndpointLabel": "Endpoint", "routeConnectionLabel": "Conexión", "scenarioVision": "Visión (comprensión de imágenes)", "scenarioSchemaCoercion": "Coerción de esquema (salida estructurada)", "techniques": "Técnicas:", "friendlyTitle": "Translator", - "friendlySubtitle": "Use your existing app with any provider — without rewriting code.", - "conceptHeadline": "Your app speaks one API's \"language\". The Translator converts it to use another provider.", - "conceptDiagramAppLabel": "Your app", - "conceptDiagramSourceLabel": "Source format", + "friendlySubtitle": "Use su aplicación existente con cualquier proveedor, sin reescribir código.", + "conceptHeadline": "Su aplicación habla el \"lenguaje\" de una API. El Translator lo convierte para usar otro proveedor.", + "conceptDiagramAppLabel": "Su aplicación", + "conceptDiagramSourceLabel": "Formato de origen", "conceptDiagramHubLabel": "OpenAI (hub)", - "conceptDiagramTargetLabel": "Target provider", - "conceptDiagramExampleApp": "e.g. Anthropic SDK", + "conceptDiagramTargetLabel": "Proveedor de destino", + "conceptDiagramExampleApp": "p. ej., SDK de Anthropic", "conceptDiagramExampleSource": "claude", "conceptDiagramExampleTarget": "Gemini", - "conceptHowItWorksToggle": "How it works", - "conceptHowItWorksBody": "Your app sends a request in its own format. The Translator detects the format, converts it through OpenAI as an intermediate hub (or directly when a direct translator is available), sends it to the chosen provider, and returns the response converted back to your app's format.", - "tabTranslate": "Translate", - "tabMonitor": "Monitor", - "tabTranslateAriaLabel": "Go to the Translate tab", - "tabMonitorAriaLabel": "Go to the Monitor tab", - "simpleAppUsesLabel": "My app uses", - "simpleAppUsesHint": "The API format your app speaks (e.g. Anthropic SDK = claude).", - "simpleSendToLabel": "Send to", - "simpleSendToHint": "Where to actually send the request (a provider connected in OmniRoute).", - "simpleStartWithLabel": "Start with", - "simpleStartWithExamplePlaceholder": "Select a ready-made example", - "simpleStartWithCustomOption": "Paste your request (advanced)", - "simpleModeLabel": "Mode", - "simpleModePreview": "Preview translation only", - "simpleModeSend": "Send and see response", - "simpleAdvancedToggle": "Advanced", - "simpleInputPanelTitle": "Input", - "simpleInputPanelHint": "Free-text message or ready-made example", - "simpleResultPanelTitle": "Translation + Response", - "narratedDetected": "✓ Detected: {format}", - "narratedTranslating": "Translating to {target}...", - "narratedSending": "Sending to {target}...", - "narratedSuccess": "→ translated to {target} · response in {latency}ms", - "narratedError": "Failed: {reason}", - "narratedSeeTranslatedJson": "see translated JSON", - "narratedSeePipeline": "see pipeline", - "advancedSectionTitle": "Advanced", - "advancedSectionSubtitle": "Raw JSON, pipeline and technical tools. Everything here is the same as the old tabs — just reorganized.", - "advancedRawJsonTitle": "Raw JSON (auto-detect + Monaco)", - "advancedRawJsonSubtitle": "Paste a JSON request; the format is detected automatically.", - "advancedPipelineTitle": "OpenAI intermediate pipeline", - "advancedPipelineSubtitle": "Visualize each translation step (hub-and-spoke).", - "advancedStreamTransformTitle": "Stream Transformer (Chat → Responses SSE)", - "advancedStreamTransformSubtitle": "Converts Chat Completions SSE into Responses API.", - "advancedTestBenchTitle": "Test Bench (8 scenarios)", - "advancedTestBenchSubtitle": "Runs all scenarios and reports pass/fail + compatibility %.", - "advancedCompressionTitle": "Compression Preview", - "advancedCompressionSubtitle": "Estimate token savings across different compression modes.", - "monitorOriginHint": "Events generated by Translate or the main pipeline appear here in real time.", - "monitorEmptyCta": "Go to the Translate tab and send a request — it will appear here.", - "monitorOpenTranslateButton": "Go to Translate", - "pipelineStepClientRequest": "Client Request", - "pipelineStepClientRequestDesc": "Request received in client format", - "pipelineStepFormatDetected": "Format Detected", - "pipelineStepFormatDetectedDesc": "Auto-detected source format", - "pipelineStepOpenAIIntermediate": "OpenAI Intermediate", - "pipelineStepOpenAIIntermediateDesc": "Translated to OpenAI hub format", - "pipelineStepProviderFormat": "Provider Format", - "pipelineStepProviderFormatDesc": "Translated to provider target format", - "pipelineStepProviderResponse": "Provider Response", - "pipelineStepProviderResponseDesc": "Streaming response from provider", - "conceptDiagramArrow1": "speaks", - "conceptDiagramArrow2": "translates", - "conceptDiagramArrow3": "converts", + "conceptHowItWorksToggle": "Cómo funciona", + "conceptHowItWorksBody": "Su aplicación envía una solicitud en su propio formato. El Translator detecta el formato, lo convierte a través de OpenAI como hub intermedio (o directamente cuando hay un traductor directo disponible), lo envía al proveedor elegido y devuelve la respuesta convertida al formato de su aplicación.", + "tabTranslate": "Traducir", + "tabMonitor": "Monitorizar", + "tabTranslateAriaLabel": "Ir a la pestaña Traducir", + "tabMonitorAriaLabel": "Ir a la pestaña Monitorizar", + "simpleAppUsesLabel": "Mi aplicación usa", + "simpleAppUsesHint": "El formato de API que usa su aplicación (p. ej., SDK de Anthropic = claude).", + "simpleSendToLabel": "Enviar a", + "simpleSendToHint": "Dónde enviar realmente la solicitud (un proveedor conectado en OmniRoute).", + "simpleStartWithLabel": "Empezar con", + "simpleStartWithExamplePlaceholder": "Seleccione un ejemplo predefinido", + "simpleStartWithCustomOption": "Pegue su solicitud (avanzado)", + "simpleModeLabel": "Modo", + "simpleModePreview": "Solo vista previa de traducción", + "simpleModeSend": "Enviar y ver respuesta", + "simpleAdvancedToggle": "Avanzado", + "simpleInputPanelTitle": "Entrada", + "simpleInputPanelHint": "Mensaje de texto libre o ejemplo predefinido", + "simpleResultPanelTitle": "Traducción + Respuesta", + "narratedDetected": "✓ Detectado: {format}", + "narratedTranslating": "Traduciendo a {target}...", + "narratedSending": "Enviando a {target}...", + "narratedSuccess": "→ traducido a {target} · respuesta en {latency}ms", + "narratedError": "Fallido: {reason}", + "narratedSeeTranslatedJson": "ver JSON traducido", + "narratedSeePipeline": "ver pipeline", + "advancedSectionTitle": "Avanzado", + "advancedSectionSubtitle": "JSON sin procesar, pipeline y herramientas técnicas. Todo aquí es igual que en las pestañas antiguas, solo que reorganizado.", + "advancedRawJsonTitle": "JSON sin procesar (detección automática + Monaco)", + "advancedRawJsonSubtitle": "Pegue una solicitud JSON; el formato se detecta automáticamente.", + "advancedPipelineTitle": "Pipeline intermedio de OpenAI", + "advancedPipelineSubtitle": "Visualice cada paso de la traducción (hub-and-spoke).", + "advancedStreamTransformTitle": "Transformador de stream (Chat → Responses SSE)", + "advancedStreamTransformSubtitle": "Convierte SSE de Chat Completions a API de Responses.", + "advancedTestBenchTitle": "Test Bench (8 escenarios)", + "advancedTestBenchSubtitle": "Ejecuta todos los escenarios e informa de éxito/fallo + % de compatibilidad.", + "advancedCompressionTitle": "Vista previa de compresión", + "advancedCompressionSubtitle": "Estime el ahorro de tokens en diferentes modos de compresión.", + "monitorOriginHint": "Los eventos generados por Translate o el pipeline principal aparecen aquí en tiempo real.", + "monitorEmptyCta": "Vaya a la pestaña Traducir y envíe una solicitud; aparecerá aquí.", + "monitorOpenTranslateButton": "Ir a Traducir", + "pipelineStepClientRequest": "Solicitud de cliente", + "pipelineStepClientRequestDesc": "Solicitud recibida en formato de cliente", + "pipelineStepFormatDetected": "Formato detectado", + "pipelineStepFormatDetectedDesc": "Formato de origen detectado automáticamente", + "pipelineStepOpenAIIntermediate": "Intermedio OpenAI", + "pipelineStepOpenAIIntermediateDesc": "Traducido al formato de hub de OpenAI", + "pipelineStepProviderFormat": "Formato del proveedor", + "pipelineStepProviderFormatDesc": "Traducido al formato de destino del proveedor", + "pipelineStepProviderResponse": "Respuesta del proveedor", + "pipelineStepProviderResponseDesc": "Respuesta en streaming del proveedor", + "conceptDiagramArrow1": "habla", + "conceptDiagramArrow2": "traduce", + "conceptDiagramArrow3": "convierte", "conceptDiagramExampleHub": "OpenAI", - "conceptDiagramHubTooltip": "Intermediate hub used by the translator to convert between formats that don't have a direct mapping.", - "conceptDiagramSourceTooltip": "The API format your app speaks (e.g., Anthropic SDK = claude).", - "conceptDiagramTargetTooltip": "The provider where the request will actually be sent.", - "compressionEmptyHint": "Fill in the input field on the Translate tab (Simple Controls or Raw JSON) to enable the preview.", - "compressionModeLabel": "Compression mode", - "compressionPreviewButton": "Preview Compression", - "compressionPreviewing": "Previewing…", - "compressionPreviewFailed": "Compression preview failed", + "conceptDiagramHubTooltip": "Hub intermedio utilizado por el traductor para convertir entre formatos que no tienen una correspondencia directa.", + "conceptDiagramSourceTooltip": "El formato de API que usa su aplicación (p. ej., SDK de Anthropic = claude).", + "conceptDiagramTargetTooltip": "El proveedor al que se enviará realmente la solicitud.", + "compressionEmptyHint": "Rellene el campo de entrada en la pestaña Traducir (Controles simples o JSON sin procesar) para habilitar la vista previa.", + "compressionModeLabel": "Modo de compresión", + "compressionPreviewButton": "Vista previa de compresión", + "compressionPreviewing": "Generando vista previa...", + "compressionPreviewFailed": "Error en la vista previa de compresión", "tokens": "tokens", - "pauseAutoRefresh": "Pause auto-refresh", - "resumeAutoRefresh": "Resume auto-refresh", - "live": "Live", - "copyInput": "Copy input", - "copyOutput": "Copy output", - "streamTransformFailed": "Failed to transform stream" + "pauseAutoRefresh": "Pausar actualización automática", + "resumeAutoRefresh": "Reanudar actualización automática", + "live": "En directo", + "copyInput": "Copiar entrada", + "copyOutput": "Copiar salida", + "streamTransformFailed": "Error al transformar el stream" }, "usage": { "title": "Uso", - "loggerTab": "registrador", - "proxyTab": "apoderado", - "budgetManagement": "Gestión Presupuestaria", + "loggerTab": "Logger", + "proxyTab": "Proxy", + "budgetManagement": "Gestión presupuestaria", "budgetSaved": "Límites de presupuesto guardados", "budgetSaveFailed": "No se pudo guardar el presupuesto", "loadingBudgetData": "Cargando datos de presupuesto...", - "noApiKeysTitle": "Sin claves API", - "noApiKeysDescription": "Primero agregue claves API para configurar límites de presupuesto.", - "apiKey": "Clave API", + "noApiKeysTitle": "Sin claves de API", + "noApiKeysDescription": "Añada primero claves de API para configurar límites de presupuesto.", + "apiKey": "Clave de API", "todaysSpend": "Gasto de hoy", - "thisMonth": "este mes", + "thisMonth": "Este mes", "setLimits": "Establecer límites", "dailyLimitUsd": "Límite diario (USD)", "monthlyLimitUsd": "Límite mensual (USD)", "warningThresholdPercent": "Umbral de advertencia (%)", - "dailyLimitPlaceholder": "por ej. 5.00", - "monthlyLimitPlaceholder": "por ej. 50.00", + "dailyLimitPlaceholder": "p. ej. 5.00", + "monthlyLimitPlaceholder": "p. ej. 50.00", "warningThresholdPlaceholder": "80", "saveLimits": "Guardar límites", "budgetOk": "Presupuesto correcto: {remaining} restante", @@ -8467,104 +8469,104 @@ "latencyP50": "p50", "latencyP95": "p95", "latencyP99": "p99", - "promptCache": "Caché de aviso", + "promptCache": "Caché de prompt", "systemHealth": "Estado del sistema", "entries": "Entradas", "activeCount": "{count} activo", "openCircuitBreakersDetected": "Se detectaron disyuntores abiertos", "hitRate": "Tasa de aciertos", - "hitsMisses": "Aciertos/fallos", + "hitsMisses": "Aciertos / Fallos", "circuitBreakers": "Disyuntores", "lockedIPs": "IP bloqueadas", - "lockoutsAutoRefreshHint": "Bloqueos de límite de velocidad por modelo • Actualización automática 10 s", - "lockedCount": "{count, plural, one {# locked} other {# locked}}", - "timeLeft": "{time} izquierda", + "lockoutsAutoRefreshHint": "Bloqueos de rate limit por modelo • Actualización automática 10s", + "lockedCount": "{count, plural, one {# bloqueado} other {# bloqueados}}", + "timeLeft": "{time} restante", "howItWorks": "Cómo funciona", - "howItWorksSubtitle": "Learn how evaluations validate your LLM responses", + "howItWorksSubtitle": "Aprenda cómo las evaluaciones validan sus respuestas de LLM", "define": "Definir", - "defineStepDescription": "Create test cases with input prompts and expected output criteria using strategies like contains, regex, or exact match.", - "run": "correr", - "runStepDescription": "Execute test cases against your LLM endpoints through OmniRoute. Cada caso se envía como una solicitud API real.", - "evaluate": "evaluar", - "evaluateStepDescription": "Responses are compared against expected criteria. See pass/fail for each case with latency metrics and detailed feedback.", + "defineStepDescription": "Cree casos de prueba con prompts de entrada y criterios de salida esperados utilizando estrategias como contiene, regex o coincidencia exacta.", + "run": "Ejecutar", + "runStepDescription": "Ejecuta casos de prueba en tus endpoints de LLM a través de OmniRoute. Cada caso se envía como una solicitud de API real.", + "evaluate": "Evaluar", + "evaluateStepDescription": "Se comparan las respuestas con los criterios esperados. Consulta el resultado (superado/no superado) de cada caso con métricas de latencia y comentarios detallados.", "evalsStrategyContainsLabel": "Contiene", "evalsStrategyExactLabel": "Coincidencia exacta", - "evalsStrategyRegexLabel": "Expresión regular", + "evalsStrategyRegexLabel": "Regex", "evalsStrategyCustomLabel": "Lógica personalizada", "evalsStrategyContainsDescription": "Comprueba si la salida del LLM contiene la subcadena esperada.", - "evalsStrategyExactDescription": "Checks if the LLM output exactly matches the expected value.", - "evalsStrategyRegexDescription": "Validates the LLM output against a regular expression pattern.", - "evalsStrategyCustomDescription": "Custom evaluation logic (configured via JSON).", - "historyColumnSuiteName": "Suite Name", - "historyColumnTarget": "Target", - "historyColumnPassRate": "Pass Rate", - "historyColumnAvgLatencyMs": "Avg Latency", - "historyColumnCreatedAt": "Executed", + "evalsStrategyExactDescription": "Comprueba si la salida del LLM coincide exactamente con el valor esperado.", + "evalsStrategyRegexDescription": "Valida la salida del LLM con un patrón de expresión regular.", + "evalsStrategyCustomDescription": "Lógica de evaluación personalizada (configurada mediante JSON).", + "historyColumnSuiteName": "Nombre de suite", + "historyColumnTarget": "Destino", + "historyColumnPassRate": "Tasa de éxito", + "historyColumnAvgLatencyMs": "Latencia media", + "historyColumnCreatedAt": "Ejecutado", "evalSuites": "Suites de evaluación", - "evalSuitesHint": "Click a suite to view test cases, then run to evaluate your LLM endpoints", + "evalSuitesHint": "Haz clic en una suite para ver los casos de prueba y, a continuación, ejecútala para evaluar tus endpoints de LLM", "evalsLoading": "Cargando suites de evaluación...", - "noEvalSuitesFound": "No se encontraron suites Eval", - "noEvalSuitesDescription": "Eval suites can be defined via the API or in code. They test model outputs against expected results using strategies like contains, regex, exact match, and custom functions.", - "columnCase": "caso", + "noEvalSuitesFound": "No se han encontrado suites de evaluación", + "noEvalSuitesDescription": "Las suites de evaluación se pueden definir mediante la API o en el código. Permiten probar las salidas de los modelos frente a resultados esperados utilizando estrategias como contenido, regex, coincidencia exacta y funciones personalizadas.", + "columnCase": "Caso", "columnStatus": "Estado", "columnLatency": "Latencia", "columnDetails": "Detalles", - "columnModel": "modelo", + "columnModel": "Modelo", "columnStrategy": "Estrategia", - "columnExpected": "esperado", + "columnExpected": "Esperado", "statsSuites": "Suites", "statsTestCases": "Casos de prueba", "statsModels": "Modelos", "statsCoverage": "Cobertura", "statsStrategiesCount": "{count} estrategias", "evaluationStrategies": "Estrategias de evaluación", - "modelsUnderTest": "Modelos bajo prueba", - "searchSuitesPlaceholder": "Conjuntos de búsqueda...", - "passSuffix": "pasar", - "casesCount": "{count, plural, one {# case} other {# cases}}", + "modelsUnderTest": "Modelos en prueba", + "searchSuitesPlaceholder": "Buscar suites...", + "passSuffix": "superado", + "casesCount": "{count, plural, one {# caso} other {# casos}}", "runEval": "Ejecutar evaluación", "runAllSuites": "Ejecutar todo", - "runAllRunning": "Corriendo todo...", + "runAllRunning": "Ejecutando todo...", "runAllProgress": "Ejecutando {current}/{total}: {name}", - "runAllFailedSuites": "{count, plural, one {# suite failed} other {# suites failed}}", - "runAllCompleted": "Ejecutó {suites} suites: {passed} pasó, {failed} falló", - "runAllCompletedWithFailures": "Ejecutó {completed} suites; {failedSuites} no se pudo completar", + "runAllFailedSuites": "{count, plural, one {# suite no superada} other {# suites no superadas}}", + "runAllCompleted": "Se han ejecutado {suites} suites: {passed} superadas, {failed} no superadas", + "runAllCompletedWithFailures": "Se han ejecutado {completed} suites; {failedSuites} no se han podido completar", "runningProgress": "Ejecutando {current}/{total}...", - "passRate": "tasa de aprobación", - "summaryBreakdown": "{passed} aprobado · {failed} fallido · {total} total", - "passedIconLabel": "✅ Aprobado", - "failedIconLabel": "❌ Fallido", - "resultPassed": "Aprobado", - "resultFailed": "Fallido", - "expandResult": "Ampliar detalles de resultados", - "collapseResult": "Contraer detalles de resultados", + "passRate": "tasa de éxito", + "summaryBreakdown": "{passed} superadas · {failed} no superadas · {total} en total", + "passedIconLabel": "✅ Superado", + "failedIconLabel": "❌ No superado", + "resultPassed": "Superado", + "resultFailed": "No superado", + "expandResult": "Ampliar detalles del resultado", + "collapseResult": "Contraer detalles del resultado", "detailsContains": "Contiene: \"{term}\"", - "detailsRegex": "Expresión regular: {pattern}", - "detailsExpected": "Se esperaba: \"{expected}\"", + "detailsRegex": "Regex: {pattern}", + "detailsExpected": "Esperado: \"{expected}\"", "expectedOutputLabel": "Salida esperada", "noResultsYet": "Aún no hay resultados", "testCasesCount": "Casos de prueba ({count})", "noTestCasesDefined": "No hay casos de prueba definidos", - "runEvalHint": "Haga clic en \"Ejecutar evaluación\" para ejecutar todos los casos en su punto final LLM. Cada prueba envía una solicitud real a través de OmniRoute.", + "runEvalHint": "Haz clic en \"Ejecutar evaluación\" para ejecutar todos los casos en tu endpoint de LLM. Cada prueba envía una solicitud real a través de OmniRoute.", "notifyNoTestCases": "No hay casos de prueba definidos para esta suite", - "notifyAllCasesPassed": "Todos los {total} casos pasados ✅", - "notifySomeCasesFailed": "{passed}/{total} pasó, {failed} falló", - "notifyEvalRunFailed": "La ejecución de evaluación falló", + "notifyAllCasesPassed": "Los {total} casos se han superado ✅", + "notifySomeCasesFailed": "{passed}/{total} superados, {failed} no superados", + "notifyEvalRunFailed": "La ejecución de la evaluación ha fallado", "notifyEvalTitle": "Evaluación: {name}", "modelEvals": "Evaluaciones de modelos", - "evalsHeroDescription": "Pruebe y valide sus puntos finales de LLM ejecutando conjuntos de evaluación predefinidos. Cada conjunto contiene casos de prueba que envían indicaciones reales a través de OmniRoute y comparan respuestas con criterios esperados, lo que le ayuda a detectar regresiones, comparar modelos y garantizar la calidad de las respuestas entre proveedores.", + "evalsHeroDescription": "Prueba y valida tus endpoints de LLM ejecutando suites de evaluación predefinidas. Cada suite contiene casos de prueba que envían prompt reales a través de OmniRoute y comparan las respuestas con los criterios esperados, lo que te ayuda a detectar regresiones, comparar modelos y garantizar la calidad de las respuestas entre proveedores.", "qualityValidation": "Validación de calidad", "modelComparison": "Comparación de modelos", - "regressionDetection": "Detección de regresión", - "latencyBenchmarks": "Puntos de referencia de latencia", + "regressionDetection": "Detección de regresiones", + "latencyBenchmarks": "Benchmarks de latencia", "modelLockouts": "Bloqueos de modelos", "noLockouts": "No hay modelos bloqueados actualmente", "activeSessions": "Sesiones activas", "noSessions": "No hay sesiones activas", - "sessionsHint": "Las sesiones aparecen a medida que las solicitudes fluyen a través del proxy.", - "sessionsTrackedHint": "Seguimiento mediante solicitud de huellas dactilares • Actualización automática 5s", + "sessionsHint": "Las sesiones aparecen a medida que las solicitudes fluyen a través del proxy", + "sessionsTrackedHint": "Seguimiento mediante huella digital de solicitud • Actualización automática cada 5s", "session": "Sesión", - "age": "edad", + "age": "Antigüedad", "requests": "Solicitudes", "connection": "Conexión", "durationMillisecondsShort": "{value}ms", @@ -8575,346 +8577,346 @@ "notAvailableSymbol": "-", "providerLimits": "Límites del proveedor", "noProviders": "No hay proveedores conectados", - "connectProvidersForQuota": "Conéctese con proveedores con OAuth para realizar un seguimiento de los límites y el uso de su cuota de API.", - "accountsCount": "{count, plural, one {# account} other {# accounts}}", + "connectProvidersForQuota": "Conéctate a proveedores mediante OAuth para realizar un seguimiento de los límites de cuota de API y su uso.", + "accountsCount": "{count, plural, one {# cuenta} other {# cuentas}}", "filteredFromCount": "(filtrado de {count})", "autoRefresh": "Actualización automática", "refreshAll": "Actualizar todo", "loadingQuotas": "Cargando...", - "showMoreQuotas": "Show {count} more", - "showLessQuotas": "Show less", - "hideQuotaRow": "Hide this quota row", - "showQuotaRow": "Show this quota row", - "hiddenQuotaRowsLabel": "Hidden:", - "quotaVisibilityUpdateFailed": "Failed to update quota visibility", - "account": "cuenta", - "modelQuotas": "Cuotas modelo", - "lastUsed": "Last Refreshed", + "showMoreQuotas": "Mostrar {count} más", + "showLessQuotas": "Mostrar menos", + "hideQuotaRow": "Ocultar esta fila de cuota", + "showQuotaRow": "Mostrar esta fila de cuota", + "hiddenQuotaRowsLabel": "Ocultas:", + "quotaVisibilityUpdateFailed": "No se ha podido actualizar la visibilidad de la cuota", + "account": "Cuenta", + "modelQuotas": "Cuotas de modelos", + "lastUsed": "Última actualización", "actions": "Acciones", "refreshQuota": "Actualizar cuota", - "today": "hoy", - "tomorrow": "mañana", + "today": "Hoy", + "tomorrow": "Mañana", "dayTimeFormat": "{day}, {time}", "inDuration": "en {duration}", - "notApplicable": "N/A", - "rawPlanWithValue": "Plan sin formato: {plan}", + "notApplicable": "N/D", + "rawPlanWithValue": "Plan sin procesar: {plan}", "noPlanFromProvider": "Sin plan del proveedor", - "tokenExpiresIn": "Token expires in {time}", - "tokenExpired": "Token expired", + "tokenExpiresIn": "El token caduca en {time}", + "tokenExpired": "Token caducado", "noQuotaData": "Sin datos de cuota", - "cardExpand": "Expand", - "cardCollapse": "Collapse", - "moreQuotas": "+{count} more", - "ungrouped": "Ungrouped", - "viewFlat": "Flat", - "viewByEnvironment": "By Environment", + "cardExpand": "Ampliar", + "cardCollapse": "Contraer", + "moreQuotas": "+{count} más", + "ungrouped": "Sin agrupar", + "viewFlat": "Plano", + "viewByEnvironment": "Por entorno", "noQuotaDataAvailable": "No hay datos de cuota disponibles", - "noAccountsForTierFilter": "No se encontraron cuentas para el filtro de niveles", + "noAccountsForTierFilter": "No se han encontrado cuentas para el filtro de nivel", "tierAll": "Todos", - "tierEnterprise": "Empresa", - "tierTeam": "equipo", - "tierBusiness": "Negocios", + "tierEnterprise": "Enterprise", + "tierTeam": "Team", + "tierBusiness": "Business", "tierUltra": "Ultra", - "tierPro": "profesional", - "tierPlus": "Más", + "tierPro": "Pro", + "tierPlus": "Plus", "tierFree": "Gratis", "tierLite": "Lite", "tierUnknown": "Desconocido", "statTotal": "Total", - "statCritical": "Critical", - "statAlert": "Alert", - "statHealthy": "Healthy", - "filterPurchaseTypeLabel": "Type", - "filterTierLabel": "Tier", - "purchaseAll": "All", - "purchaseOauthSub": "Subscription", - "purchaseOauthFree": "OAuth Free", - "purchaseApiKey": "API Key", - "creditsLabel": "Credits", - "creditBalanceHint": "Remaining balance", - "unlimitedLabel": "Unlimited", - "refreshing": "Refreshing", - "resetsIn": "Resets in", - "usdCost": "USD Cost", + "statCritical": "Crítico", + "statAlert": "Alerta", + "statHealthy": "Saludable", + "filterPurchaseTypeLabel": "Tipo", + "filterTierLabel": "Nivel", + "purchaseAll": "Todos", + "purchaseOauthSub": "Suscripción", + "purchaseOauthFree": "OAuth gratuito", + "purchaseApiKey": "API key", + "creditsLabel": "Créditos", + "creditBalanceHint": "Saldo restante", + "unlimitedLabel": "Ilimitado", + "refreshing": "Actualizando", + "resetsIn": "Se reinicia en", + "usdCost": "Coste en USD", "editCutoffs": "Editar límites", "forceRefresh": "Actualizar ahora", - "resetCreditsLabel": "Reset credits", - "redeemResetCredit": "Redeem reset", - "manageResetCredits": "View credits", - "viewResetCredits": "View reset credits", - "resetCreditsModalTitle": "Codex reset credits", - "resetCreditsModalExplainer": "Credits are ordered by expiration. Automatic redemption always uses the credit that expires first.", - "resetCreditsLoadFailed": "Failed to load reset credits", - "resetCreditsDetailsUnavailable": "Credit details are currently unavailable. Refresh and try again.", - "noResetCreditsAvailable": "No reset credits are available.", - "resetCreditDefaultTitle": "Full reset", - "resetCreditExpiresFirst": "Expires first", - "resetCreditExpiresAt": "Expires {date}", - "resetCreditNoExpiry": "No expiration date", - "redeemThisResetCredit": "Redeem", - "confirmRedeemResetCreditTitle": "Redeem this reset credit?", - "confirmRedeemResetCredit": "Redeeming immediately resets the eligible Codex usage windows and permanently consumes this credit.", - "confirmRedeemResetCreditButton": "Redeem credit", - "resetCreditRedeemed": "Reset redeemed", - "resetCreditRedeemFailed": "Failed to redeem reset credit", - "suiteBuilderSaveFailed": "Failed to save suite", - "clone": "clonar", + "resetCreditsLabel": "Restablecer créditos", + "redeemResetCredit": "Canjear restablecimiento", + "manageResetCredits": "Ver créditos", + "viewResetCredits": "Ver créditos de restablecimiento", + "resetCreditsModalTitle": "Créditos de restablecimiento de Codex", + "resetCreditsModalExplainer": "Los créditos se ordenan por fecha de caducidad. El canje automático utiliza siempre el crédito que caduca antes.", + "resetCreditsLoadFailed": "No se han podido cargar los créditos de restablecimiento", + "resetCreditsDetailsUnavailable": "Los detalles de los créditos no están disponibles en este momento. Actualiza e inténtalo de nuevo.", + "noResetCreditsAvailable": "No hay créditos de restablecimiento disponibles.", + "resetCreditDefaultTitle": "Restablecimiento completo", + "resetCreditExpiresFirst": "Caduca primero", + "resetCreditExpiresAt": "Caduca el {date}", + "resetCreditNoExpiry": "Sin fecha de caducidad", + "redeemThisResetCredit": "Canjear", + "confirmRedeemResetCreditTitle": "¿Canjear este crédito de restablecimiento?", + "confirmRedeemResetCredit": "Canjearlo restablece inmediatamente las ventanas de uso de Codex elegibles y consume este crédito de forma permanente.", + "confirmRedeemResetCreditButton": "Canjear crédito", + "resetCreditRedeemed": "Restablecimiento canjeado", + "resetCreditRedeemFailed": "No se ha podido canjear el crédito de restablecimiento", + "suiteBuilderSaveFailed": "No se ha podido guardar la suite", + "clone": "Clonar", "exportSuite": "Exportar", "importSuite": "Importar", "suiteExported": "Suite exportada", - "suiteExportFailed": "No se pudo exportar el conjunto", + "suiteExportFailed": "No se ha podido exportar la suite", "suiteImportReady": "Importación de suite cargada para revisión", "suiteImportFailed": "No se pudo importar la suite", "suiteImportInvalid": "JSON del conjunto de evaluación no válido", - "suiteBuilderCloneSuffix": "copiar", + "suiteBuilderCloneSuffix": "copia", "suiteBuilderImportedSuite": "Suite importada", "scorecardTitle": "Scorecard", - "evalApiKey": "API Key", - "scorecardPassRate": "Pass Rate", - "targetTypeModel": "Model", - "actualOutputLabel": "Actual Output", - "evalTargetHint": "Select a model or combo to evaluate.", - "suiteBuilderDeleted": "Suite deleted successfully", - "suiteBuilderCaseCardHint": "Define the input prompt and expected output criteria.", - "nextResetUtc": "Next reset (UTC)", - "scorecardHint": "Aggregated pass rates across all evaluation suites.", - "suiteLatestRunsHint": "Most recent evaluation runs for this suite.", - "saving": "Saving", - "suiteBuilderCaseModelLabel": "Model (optional)", - "evalControlsTitle": "Evaluation Controls", - "suiteBuilderEditTitle": "Edit Eval Suite", - "suiteBuilderCaseStrategyLabel": "Validation Strategy", - "notifySelectDifferentCompareTarget": "Please select a different target for comparison", - "recentRunsHint": "Showing the most recent evaluation runs. Click a run to see detailed results.", - "evalCompareHint": "Optionally compare results against a second target.", - "suiteBuilderCaseInvalid": "This case has validation errors. Please fix before saving.", - "historyEmpty": "No evaluation history yet", - "suiteBuilderUpdated": "Suite updated successfully", - "resetInterval": "Reset Interval", - "suiteBuilderCreateTitle": "Create Eval Suite", - "activePeriodSpend": "Active Period Spend", - "evalApiKeyHint": "Select which API key to use for evaluation requests.", - "evalCompareOptional": "Compare (optional)", - "suiteBuilderDeleteFailed": "Failed to delete suite", - "suiteBuilderCaseSystemPromptPlaceholder": "Optional system instructions...", - "scorecardCases": "Cases", - "runCompletedWithScore": "Evaluation completed — {score}% pass rate", - "suiteBuilderCustomBadge": "Custom", - "targetSuiteDefaults": "Suite defaults", - "suiteBuilderDeleteConfirm": "Are you sure you want to delete this suite? This action cannot be undone.", - "suiteBuilderNameLabel": "Suite Name", + "evalApiKey": "Clave de API", + "scorecardPassRate": "Tasa de acierto", + "targetTypeModel": "Modelo", + "actualOutputLabel": "Salida real", + "evalTargetHint": "Selecciona un modelo o combinación para evaluar.", + "suiteBuilderDeleted": "Suite eliminada correctamente", + "suiteBuilderCaseCardHint": "Define el prompt de entrada y los criterios de salida esperados.", + "nextResetUtc": "Próximo restablecimiento (UTC)", + "scorecardHint": "Tasas de acierto agregadas en todas las suites de evaluación.", + "suiteLatestRunsHint": "Ejecuciones de evaluación más recientes para esta suite.", + "saving": "Guardando", + "suiteBuilderCaseModelLabel": "Modelo (opcional)", + "evalControlsTitle": "Controles de evaluación", + "suiteBuilderEditTitle": "Editar suite de evaluación", + "suiteBuilderCaseStrategyLabel": "Estrategia de validación", + "notifySelectDifferentCompareTarget": "Selecciona un objetivo diferente para comparar", + "recentRunsHint": "Mostrando las ejecuciones de evaluación más recientes. Haz clic en una ejecución para ver resultados detallados.", + "evalCompareHint": "Opcionalmente, compara los resultados con un segundo objetivo.", + "suiteBuilderCaseInvalid": "Este caso tiene errores de validación. Corrígelos antes de guardar.", + "historyEmpty": "Aún no hay historial de evaluación", + "suiteBuilderUpdated": "Suite actualizada correctamente", + "resetInterval": "Intervalo de restablecimiento", + "suiteBuilderCreateTitle": "Crear suite de evaluación", + "activePeriodSpend": "Gasto del periodo activo", + "evalApiKeyHint": "Selecciona qué clave de API usar para las solicitudes de evaluación.", + "evalCompareOptional": "Comparar (opcional)", + "suiteBuilderDeleteFailed": "No se pudo eliminar la suite", + "suiteBuilderCaseSystemPromptPlaceholder": "Instrucciones del sistema opcionales...", + "scorecardCases": "Casos", + "runCompletedWithScore": "Evaluación completada — {score}% de tasa de acierto", + "suiteBuilderCustomBadge": "Personalizado", + "targetSuiteDefaults": "Valores predeterminados de la suite", + "suiteBuilderDeleteConfirm": "¿Seguro que quieres eliminar esta suite? Esta acción no se puede deshacer.", + "suiteBuilderNameLabel": "Nombre de la suite", "scorecardSuites": "Suites", - "evalCompareTarget": "Compare Target", - "suiteBuilderCaseModelPlaceholder": "e.g. gpt-4o-mini", - "evalControlsHint": "Configure your evaluation target and API key, then run suites to validate model quality.", - "recentRunsTitle": "Recent Runs", + "evalCompareTarget": "Objetivo de comparación", + "suiteBuilderCaseModelPlaceholder": "p. ej., gpt-4o-mini", + "evalControlsHint": "Configura tu objetivo de evaluación y clave de API, luego ejecuta suites para validar la calidad del modelo.", + "recentRunsTitle": "Ejecuciones recientes", "suiteBuilderCaseSystemPromptLabel": "System Prompt", - "suiteBuilderCaseExpectedPlaceholder": "e.g. def fibonacci", - "suiteBuilderCaseExpectedPlaceholderContains": "por ej. fibonacci", - "suiteBuilderCaseExpectedPlaceholderExact": "Pegue la respuesta esperada exacta", - "suiteBuilderCaseExpectedPlaceholderRegex": "por ej. ^\\\\s*\\\\{.*\\\\}\\\\s*$", - "suiteBuilderCaseExpectedHintRegex": "Utilice una expresión regular de JavaScript sin barras diagonales.", - "suiteBuilderNamePlaceholder": "e.g. Coding Quality Suite", - "suiteBuilderAddCase": "Add Case", - "cancel": "Cancel", - "evalTarget": "Target", - "suiteBuilderCaseNameLabel": "Case Name", - "weeklyLimitUsd": "Weekly Limit (USD)", - "suiteBuilderCaseUserPromptPlaceholder": "e.g. Write a fibonacci function in Python", - "suiteBuilderNameRequired": "Suite name is required", + "suiteBuilderCaseExpectedPlaceholder": "p. ej., def fibonacci", + "suiteBuilderCaseExpectedPlaceholderContains": "p. ej., fibonacci", + "suiteBuilderCaseExpectedPlaceholderExact": "Pega la respuesta esperada exacta", + "suiteBuilderCaseExpectedPlaceholderRegex": "p. ej., ^\\\\s*\\\\{.*\\\\}\\\\s*$", + "suiteBuilderCaseExpectedHintRegex": "Utiliza una expresión regular de JavaScript sin barras diagonales.", + "suiteBuilderNamePlaceholder": "p. ej., Suite de calidad de código", + "suiteBuilderAddCase": "Añadir caso", + "cancel": "Cancelar", + "evalTarget": "Objetivo", + "suiteBuilderCaseNameLabel": "Nombre del caso", + "weeklyLimitUsd": "Límite semanal (USD)", + "suiteBuilderCaseUserPromptPlaceholder": "p. ej., Escribe una función de fibonacci en Python", + "suiteBuilderNameRequired": "El nombre de la suite es obligatorio", "suiteBuilderCaseUserPromptLabel": "User Prompt", - "daily": "Daily", + "daily": "Diario", "resultErrorLabel": "Error", - "suiteBuilderBuiltInBadge": "Built-in", - "suiteBuilderCaseCardTitle": "Test Case", + "suiteBuilderBuiltInBadge": "Integrado", + "suiteBuilderCaseCardTitle": "Caso de prueba", "suiteBuilderDuplicateCase": "Duplicar", - "weeklyLimitPlaceholder": "e.g. 50.00", - "suiteBuilderCaseTagsHint": "Comma-separated tags for organizing test cases.", - "notifyEvalRunFailedWithReason": "Evaluation failed: {reason}", - "weekly": "Weekly", - "runEvalRunning": "Running evaluation...", - "delete": "Delete", - "resetTimeUtc": "Reset Time (UTC)", - "evalApiKeyAuto": "Auto (use default)", - "suiteBuilderDescriptionPlaceholder": "Optional description of what this suite tests...", - "targetComparisonTitle": "Target Comparison", - "save": "Save", - "suiteBuilderCreated": "Suite created successfully", - "suiteLatestRuns": "Latest Runs", - "suiteBuilderCaseExpectedLabel": "Expected Value", - "historyLatency": "Latency", - "suiteBuilderCaseTagsPlaceholder": "e.g. coding, python", + "weeklyLimitPlaceholder": "p. ej., 50.00", + "suiteBuilderCaseTagsHint": "Etiquetas separadas por comas para organizar los casos de prueba.", + "notifyEvalRunFailedWithReason": "Error en la evaluación: {reason}", + "weekly": "Semanal", + "runEvalRunning": "Ejecutando evaluación...", + "delete": "Eliminar", + "resetTimeUtc": "Hora de restablecimiento (UTC)", + "evalApiKeyAuto": "Automático (usar predeterminado)", + "suiteBuilderDescriptionPlaceholder": "Descripción opcional de lo que prueba esta suite...", + "targetComparisonTitle": "Comparación de objetivos", + "save": "Guardar", + "suiteBuilderCreated": "Suite creada correctamente", + "suiteLatestRuns": "Últimas ejecuciones", + "suiteBuilderCaseExpectedLabel": "Valor esperado", + "historyLatency": "Latencia", + "suiteBuilderCaseTagsPlaceholder": "p. ej., coding, python", "targetTypeCombo": "Combo", - "scorecardPassed": "Passed", - "suiteBuilderCaseTagsLabel": "Tags", - "suiteBuilderNewSuite": "New Suite", - "notifyEvalLoadFailed": "Failed to load evaluation data", - "notConfigured": "Not Configured", - "suiteBuilderCaseNamePlaceholder": "e.g. Python fibonacci test", - "intervalLabel": "Interval", - "suiteBuilderCreateAction": "Create Suite", - "suiteBuilderCasesHint": "Each case sends a prompt and validates the response.", - "suiteBuilderUpdatedAt": "Updated", + "scorecardPassed": "Aprobado", + "suiteBuilderCaseTagsLabel": "Etiquetas", + "suiteBuilderNewSuite": "Nueva suite", + "notifyEvalLoadFailed": "No se pudieron cargar los datos de evaluación", + "notConfigured": "No configurado", + "suiteBuilderCaseNamePlaceholder": "p. ej., prueba de fibonacci en Python", + "intervalLabel": "Intervalo", + "suiteBuilderCreateAction": "Crear suite", + "suiteBuilderCasesHint": "Cada caso envía un prompt y valida la respuesta.", + "suiteBuilderUpdatedAt": "Actualizado", "errorBadge": "Error", - "suiteBuilderCasesTitle": "Test Cases", - "edit": "Edit", - "monthly": "Monthly", - "suiteBuilderCasesRequired": "At least one test case is required", - "weeklyLimitSummary": "Weekly budget limit summary", - "suiteBuilderDescriptionLabel": "Description", - "targetComparisonHint": "Side-by-side comparison of evaluation results between targets.", - "compareCompletedWithScore": "Comparison completed — {score}% pass rate", - "staleQuotaTooltip": "Last refresh failed — showing cached data", - "quotaThresholdLabel": "Min restante", + "suiteBuilderCasesTitle": "Casos de prueba", + "edit": "Editar", + "monthly": "Mensual", + "suiteBuilderCasesRequired": "Se requiere al menos un caso de prueba", + "weeklyLimitSummary": "Resumen del límite de presupuesto semanal", + "suiteBuilderDescriptionLabel": "Descripción", + "targetComparisonHint": "Comparación lado a lado de los resultados de evaluación entre objetivos.", + "compareCompletedWithScore": "Comparación completada — {score}% de tasa de acierto", + "staleQuotaTooltip": "La última actualización falló: mostrando datos en caché", + "quotaThresholdLabel": "Mín. restante", "quotaCutoffsColumnHelp": "Detenga las solicitudes cuando la cuota restante caiga a este porcentaje o menos.", "quotaCutoffsButtonDefault": "Predeterminado", "quotaCutoffsButtonHelp": "Edite los límites de cuota mínima restante para esta cuenta.", - "quotaCutoffsButtonDisabled": "Aún no hay períodos de cuota disponibles para esta cuenta.", - "deactivateAccount": "Deactivate account (stop routing)", - "activateAccount": "Activate account (resume routing)", - "accountActivated": "Account activated", - "accountDeactivated": "Account deactivated", - "toggleActiveFailed": "Failed to update account status", + "quotaCutoffsButtonDisabled": "Aún no hay periodos de cuota disponibles para esta cuenta.", + "deactivateAccount": "Desactivar cuenta (detener enrutamiento)", + "activateAccount": "Activar cuenta (reanudar enrutamiento)", + "accountActivated": "Cuenta activada", + "accountDeactivated": "Cuenta desactivada", + "toggleActiveFailed": "No se pudo actualizar el estado de la cuenta", "quotaCutoffsTitle": "Límites de cuota para {name} ({provider})", "quotaCutoffsExplainer": "Anule el porcentaje de cuota restante mínimo cuando esta cuenta deja de seleccionarse para cada ventana de cuota. Déjelo en blanco para heredar el valor predeterminado del proveedor.", - "quotaCutoffsDefaultHint": "Min restante predeterminado: {default}%", + "quotaCutoffsDefaultHint": "Mín. restante predeterminado: {default}%", "quotaCutoffsResetAll": "Restablecer todo", - "quotaCutoffsNoWindows": "Aún no hay períodos de cuota disponibles para esta cuenta.", + "quotaCutoffsNoWindows": "Aún no hay periodos de cuota disponibles para esta cuenta.", "quotaThresholdInvalid": "Introduzca un número entero del 0 al 100.", - "budgetKpiToday": "hoy", - "budgetKpiThisMonth": "este mes", - "budgetKpiProjEom": "MOE del proyecto", + "budgetKpiToday": "Hoy", + "budgetKpiThisMonth": "Este mes", + "budgetKpiProjEom": "Fin de mes proyectado", "budgetKpiBlocked": "Bloqueado", "budgetKpiAtRisk": "En riesgo", "budgetKpiActiveKeys": "Claves activas", - "budgetPageTitle": "Budget", - "budgetPageDescription": "Set daily, weekly, and monthly spending limits for each API key.", - "budgetTemplateStorageHint": "{count, plural, one {# template} other {# templates}} · edit via localStorage:", - "budgetAboveLimitShort": "above limit ⚠", - "budgetOnTrackShort": "on track", - "budgetAtOrAboveWarning": "≥ warning threshold", - "budgetTemplates": "Templates", - "budgetSelectKeysFirst": "Select keys first to apply", - "budgetApplyToSelected": "Apply to {count, plural, one {# selected key} other {# selected keys}}", - "budgetSelectedTemplateHint": "{count, plural, one {# selected} other {# selected}} · click a template to apply", - "budgetTemplateMonthlyAmount": "${amount}/month", - "budgetTemplateDailyAmount": "${amount}/day", - "budgetNoKeysSelected": "No keys selected", - "budgetTemplateApplied": "Applied \"{template}\" to {count, plural, one {# key} other {# keys}}", - "budgetTemplateApplyFailed": "Failed to apply template", + "budgetPageTitle": "Presupuesto", + "budgetPageDescription": "Establece límites de gasto diario, semanal y mensual para cada clave de API.", + "budgetTemplateStorageHint": "{count, plural, one {# plantilla} other {# plantillas}} · editar mediante localStorage:", + "budgetAboveLimitShort": "por encima del límite ⚠", + "budgetOnTrackShort": "en camino", + "budgetAtOrAboveWarning": "≥ umbral de advertencia", + "budgetTemplates": "Plantillas", + "budgetSelectKeysFirst": "Selecciona primero las claves para aplicar", + "budgetApplyToSelected": "Aplicar a {count, plural, one {# clave seleccionada} other {# claves seleccionadas}}", + "budgetSelectedTemplateHint": "{count, plural, one {# seleccionada} other {# seleccionadas}} · haz clic en una plantilla para aplicar", + "budgetTemplateMonthlyAmount": "${amount}/mes", + "budgetTemplateDailyAmount": "${amount}/día", + "budgetNoKeysSelected": "No hay claves seleccionadas", + "budgetTemplateApplied": "Se aplicó \"{template}\" a {count, plural, one {# clave} other {# claves}}", + "budgetTemplateApplyFailed": "No se pudo aplicar la plantilla", "budgetTemplateNames": { - "tpl-prod": "Production", - "tpl-dev": "Development", + "tpl-prod": "Producción", + "tpl-dev": "Desarrollo", "tpl-ci": "CI" }, "budgetStatus": { - "all": "All", - "blocked": "Blocked", - "alerting": "Alerting", - "warning": "Warning", - "safe": "Safe", - "no-limit": "No limit" + "all": "Todos", + "blocked": "Bloqueado", + "alerting": "Alertando", + "warning": "Advertencia", + "safe": "Seguro", + "no-limit": "Sin límite" }, - "budgetColumnKey": "Key", - "budgetColumnToday": "Today", - "budgetColumnMonth": "Month", - "budgetColumnStatus": "Status", - "budgetSearchKeysPlaceholder": "Claves de búsqueda...", + "budgetColumnKey": "Clave", + "budgetColumnToday": "Hoy", + "budgetColumnMonth": "Mes", + "budgetColumnStatus": "Estado", + "budgetSearchKeysPlaceholder": "Buscar claves...", "budgetSortPctUsed": "Ordenar: % usado ↓", "budgetSortTodayDollar": "Ordenar: Hoy $ ↓", "budgetSortMonthDollar": "Ordenar: Mes $ ↓", "budgetSortNameAZ": "Ordenar: Nombre (A–Z)", - "budgetColDailyLim": "límite diario", - "budgetColMonthlyLim": "límite mensual", + "budgetColDailyLim": "Límite diario", + "budgetColMonthlyLim": "Límite mensual", "budgetColUsedPct": "% usado", - "percentUsed": "{pct}% used", + "percentUsed": "{pct}% usado", "budgetLoading": "Cargando…", "budgetNoKeysMatch": "Ninguna clave coincide con los filtros", "budgetLinearExtrapolation": "extrapolación lineal", "budgetThisMonthSoFar": "Este mes hasta ahora", "budgetProjectedEndOfMonth": "Fin de mes proyectado", "budgetByProvider": "por proveedor", - "budgetProjection": "Projection", - "budgetAboveMonthlyLimit": "⚠ above {limit}/month", - "budgetCostBreakdown30d": "Cost breakdown (30 days)", - "budgetLimits": "Limits", - "budgetResetDaily": "Daily", - "budgetResetWeekly": "Weekly", - "budgetResetMonthly": "Monthly", - "budgetNextReset": "Next reset", - "budgetHardCapComingSoon": "Hard-cap policy and email alerts are coming soon", - "unknownProvider": "Unknown provider", - "budgetDailyDollar": "Diariamente $", + "budgetProjection": "Proyección", + "budgetAboveMonthlyLimit": "⚠ por encima de {limit}/mes", + "budgetCostBreakdown30d": "Desglose de costes (30 días)", + "budgetLimits": "Límites", + "budgetResetDaily": "Diario", + "budgetResetWeekly": "Semanal", + "budgetResetMonthly": "Mensual", + "budgetNextReset": "Próximo restablecimiento", + "budgetHardCapComingSoon": "La política de límite estricto y las alertas por correo electrónico llegarán pronto", + "unknownProvider": "Proveedor desconocido", + "budgetDailyDollar": "Diario $", "budgetWeeklyDollar": "Semanal $", "budgetMonthlyDollar": "$ Mensual", "budgetWarnAtPct": "Advertir al %", "quotaAlerts": "Alertas de cuota", - "quotaTableRefreshing": "⟳Refrescante...", + "quotaTableRefreshing": "⟳ Actualizando...", "noSpendLast30Days": "Sin gastos en los últimos 30 días", - "updatedShort": "Updated", - "lastRefreshed": "Last refreshed", - "providerQuota": "Provider Quota", - "providerQuotaHomeHint": "Live status across connected accounts" + "updatedShort": "Actualizado", + "lastRefreshed": "Última actualización", + "providerQuota": "Cuota del proveedor", + "providerQuotaHomeHint": "Estado en tiempo real de las cuentas conectadas" }, "modals": { "waitingAuth": "Esperando autorización", "verificationUrl": "URL de verificación", "yourCode": "Tu código", "remoteAccess": "Acceso remoto:", - "connectedSuccess": "¡Conectado exitosamente!", - "connectionFailed": "Conexión fallida", - "chooseAuthMethod": "Elija su método de autenticación:", - "awsBuilderId": "ID del creador de AWS", - "awsIamIdentity": "Centro de identidad de AWS IAM", + "connectedSuccess": "¡Conectado correctamente!", + "connectionFailed": "Error de conexión", + "chooseAuthMethod": "Elige tu método de autenticación:", + "awsBuilderId": "AWS Builder ID", + "awsIamIdentity": "AWS IAM Identity Center", "googleAccount": "Cuenta de Google", - "githubAccount": "Cuenta GitHub", + "githubAccount": "Cuenta de GitHub", "importToken": "Importar token", - "pasteToken": "Pegue el token de actualización de Kiro IDE.", + "pasteToken": "Pega el token de actualización de Kiro IDE.", "awsRegion": "Región de AWS", - "autoDetecting": "Tokens de detección automática...", - "readingFromCache": "Lectura de la caché de AWS SSO", - "readingFromCursor": "Lectura de la base de datos Cursor IDE", + "autoDetecting": "Detectando tokens automáticamente...", + "readingFromCache": "Leyendo de la caché de AWS SSO", + "readingFromCursor": "Leyendo de la base de datos de Cursor IDE", "initializing": "Inicializando...", "pricingConfig": "Configuración de precios", "loadingPricing": "Cargando datos de precios...", "pricingRatesFormat": "Formato de tarifas de precios", "noPricingData": "No hay datos de precios disponibles", - "noModelsFound": "No se encontraron modelos" + "noModelsFound": "No se han encontrado modelos" }, "loggers": { "allProviders": "Todos los proveedores", "allModels": "Todos los modelos", "allAccounts": "Todas las cuentas", - "allApiKeys": "Todas las claves API", + "allApiKeys": "Todas las claves de API", "allTypes": "Todos los tipos", "allLevels": "Todos los niveles", "modelAZ": "Modelo A-Z", "modelZA": "Modelo Z-A", "loadingLogs": "Cargando registros...", "loadingProxyLogs": "Cargando registros de proxy...", - "noLogEntries": "No se encontraron entradas de registro", - "noPayloadData": "No hay datos de carga disponibles para esta entrada de registro.", + "noLogEntries": "No se han encontrado entradas de registro", + "noPayloadData": "No hay datos de payload disponibles para esta entrada de registro.", "proxyEvent": "Evento de proxy", - "proxy": "apoderado", + "proxy": "Proxy", "level": "Nivel", "directNative": "Directo (nativo)", - "combo": "combinado", - "inputTokens": "Yo:", - "outputTokens": "Oh:" + "combo": "Combo", + "inputTokens": "E:", + "outputTokens": "S:" }, "stats": { - "usageOverview": "Descripción general de uso", - "outputTokens": "Fichas de salida", - "totalCost": "Costo total", + "usageOverview": "Resumen de uso", + "outputTokens": "Tokens de salida", + "totalCost": "Coste total", "usageByModel": "Uso por modelo", "usageByAccount": "Uso por cuenta", - "failedToLoad": "No se pudieron cargar las estadísticas de uso.", - "tokenHealth": "Salud del token", + "failedToLoad": "No se han podido cargar las estadísticas de uso.", + "tokenHealth": "Estado de los tokens", "totalOAuth": "OAuth total", - "healthy": "saludable", + "healthy": "Saludable", "warning": "Advertencia", - "errored": "Error", - "lastCheck": "último control", + "errored": "Con errores", + "lastCheck": "Última comprobación", "noData": "Sin datos", "share": "Compartir", "unableToLoad": "No se pueden cargar las métricas del sistema", @@ -8925,490 +8927,490 @@ "auth": { "welcome": "Bienvenido", "signIn": "Iniciar sesión", - "enterPassword": "Ingresa tu contraseña para continuar", + "enterPassword": "Introduce tu contraseña para continuar", "password": "Contraseña", "unifiedProxy": "Proxy de API de IA unificado", "unifiedAiApiProxy": "Proxy de API de IA unificado", - "unifiedAiApiProxyDesc": "Enrute solicitudes a múltiples proveedores de IA a través de un único punto final. Equilibrio de carga, conmutación por error y seguimiento de uso integrados.", - "passwordNotEnabled": "La protección con contraseña no está habilitada", + "unifiedAiApiProxyDesc": "Enruta solicitudes a múltiples proveedores de IA a través de un único endpoint. Equilibrado de carga, conmutación por error y seguimiento de uso integrados.", + "passwordNotEnabled": "La protección por contraseña no está habilitada", "loading": "Cargando...", "invalidPassword": "Contraseña no válida", - "errorOccurredRetry": "Se produjo un error. Por favor inténtalo de nuevo.", - "configureInstance": "Configuremos su instancia de OmniRoute", - "runOnboardingWizard": "Ejecuta el asistente de onboarding para configurar tu contraseña y conectar tu primer proveedor de IA.", - "startOnboarding": "Iniciar la incorporación", - "secureYourInstance": "Asegure su instancia", - "setPasswordDescription": "Establezca una contraseña para proteger su panel y proteger sus puntos finales API contra accesos no autorizados.", + "errorOccurredRetry": "Se ha producido un error. Inténtalo de nuevo.", + "configureInstance": "Vamos a configurar tu instancia de OmniRoute", + "runOnboardingWizard": "Ejecuta el asistente de configuración inicial para establecer tu contraseña y conectar tu primer proveedor de IA.", + "startOnboarding": "Iniciar configuración", + "secureYourInstance": "Protege tu instancia", + "setPasswordDescription": "Establece una contraseña para proteger tu panel y asegurar tus endpoints de API frente a accesos no autorizados.", "configurePassword": "Configurar contraseña", "continue": "Continuar", "windowWillClose": "Esta ventana se cerrará automáticamente...", "closeTabNow": "Puedes cerrar esta pestaña ahora.", "copyUrlManual": "Copia la URL de la barra de direcciones y pégala en la aplicación.", - "accessDeniedDescription": "No tienes permiso para acceder a este recurso. Verifique su clave API o comuníquese con el administrador.", + "accessDeniedDescription": "No tienes permisos para acceder a este recurso. Comprueba tu clave de API o ponte en contacto con el administrador.", "goToDashboard": "Ir al panel", "featureMultiProviderTitle": "Multiproveedor", "featureMultiProviderDesc": "OpenAI, Anthropic, Google y más", "featureLoadBalancingTitle": "Equilibrio de carga", - "featureLoadBalancingDesc": "Distribuya las solicitudes de forma inteligente", + "featureLoadBalancingDesc": "Distribuye las solicitudes de forma inteligente", "featureUsageTrackingTitle": "Seguimiento de uso", - "featureUsageTrackingDesc": "Monitorear costos y tokens", + "featureUsageTrackingDesc": "Monitorea costes y tokens", "resetPassword": "Restablecer contraseña", - "resetDescription": "Elija un método para recuperar el acceso a su panel", - "stopServer": "Detén el servidor OmniRoute", + "resetDescription": "Elige un método para recuperar el acceso a tu panel", + "stopServer": "Detener el servidor OmniRoute", "processing": "Procesando...", - "pleaseWait": "Espere mientras completamos la autorización.", - "authSuccess": "¡Autorización exitosa!", - "copyUrl": "Copia esta URL", + "pleaseWait": "Espera mientras completamos la autorización.", + "authSuccess": "¡Autorización correcta!", + "copyUrl": "Copiar esta URL", "accessDenied": "Acceso denegado", - "methodCliTitle": "Método 1: reinicio de CLI", - "methodCliDescription": "Ejecute el siguiente comando en el servidor donde se ejecuta OmniRoute:", - "methodCliHint": "Esto le pedirá que establezca una nueva contraseña. Primero se debe detener el servidor.", - "methodManualTitle": "Método 2: reinicio manual", - "methodManualDescription": "Elimina la contraseña de la base de datos y configura una nueva al iniciar:", - "setPasswordInYour": "Define una nueva contraseña en tu", + "methodCliTitle": "Método 1: Restablecimiento por CLI", + "methodCliDescription": "Ejecuta el siguiente comando en el servidor donde se está ejecutando OmniRoute:", + "methodCliHint": "Esto te pedirá que establezcas una nueva contraseña. El servidor debe estar detenido previamente.", + "methodManualTitle": "Método 2: Restablecimiento manual", + "methodManualDescription": "Elimina la contraseña de la base de datos y establece una nueva al iniciar:", + "setPasswordInYour": "Establece una nueva contraseña en tu", "fileLabelSuffix": "archivo:", "newPasswordPlaceholder": "tu_nueva_contraseña", "deleteSettingsFile": "Eliminar", - "orRemovePasswordHashField": "o eliminar el campo contraseñaHash", - "restartServerWithNewPassword": "Reinicia el servidor; usará la nueva contraseña", + "orRemovePasswordHashField": "o elimina el campo passwordHash", + "restartServerWithNewPassword": "Reinicia el servidor; utilizará la nueva contraseña", "backToLogin": "Volver a iniciar sesión", - "forgotPassword": "¿Olvidaste tu contraseña?", - "continueWithOidc": "Continue with OIDC", - "defaultPasswordHint": "Default password: CHANGEME (unless INITIAL_PASSWORD was set)", - "Authorization": "Autorización", - "Content-Disposition": "Disposición de contenido", - "waitingForAuthorization": "Waiting for authorization...", - "waitingForGoogleAuthorization": "Waiting for Google authorization...", - "waitingForOpenAIAuthorization": "Waiting for OpenAI authorization...", - "waitingForAntigravityAuthorization": "Waiting for Antigravity authorization...", - "waitingForQoderAuthorization": "Waiting for Qoder authorization...", - "exchangingCodeForTokens": "Exchanging code for tokens...", - "nodeIncompatibleTitle": "Incompatible Node.js Version", - "nodeIncompatibleDesc": "You are running Node.js {version}, which is outside OmniRoute's supported secure runtime policy. Use a patched Node.js 20.x or 22.x LTS release.", - "nodeIncompatibleFixLabel": "Fix: install a patched Node.js 22 LTS release", - "nodeIncompatibleHint": "OmniRoute requires Node.js 22.22.2+ (22.x LTS) or 24.0.0+ (24.x LTS). Node 24 LTS is recommended." + "forgotPassword": "¿Has olvidado tu contraseña?", + "continueWithOidc": "Continuar con OIDC", + "defaultPasswordHint": "Contraseña predeterminada: CHANGEME (a menos que se haya establecido INITIAL_PASSWORD)", + "Authorization": "Authorization", + "Content-Disposition": "Content-Disposition", + "waitingForAuthorization": "Esperando autorización...", + "waitingForGoogleAuthorization": "Esperando autorización de Google...", + "waitingForOpenAIAuthorization": "Esperando autorización de OpenAI...", + "waitingForAntigravityAuthorization": "Esperando autorización de Antigravity...", + "waitingForQoderAuthorization": "Esperando autorización de Qoder...", + "exchangingCodeForTokens": "Intercambiando código por tokens...", + "nodeIncompatibleTitle": "Versión de Node.js incompatible", + "nodeIncompatibleDesc": "Estás ejecutando Node.js {version}, que queda fuera de la política de entornos de ejecución seguros compatibles con OmniRoute. Utiliza una versión LTS parcheada de Node.js 20.x o 22.x.", + "nodeIncompatibleFixLabel": "Solución: instala una versión LTS parcheada de Node.js 22", + "nodeIncompatibleHint": "OmniRoute requiere Node.js 22.22.2+ (22.x LTS) o 24.0.0+ (24.x LTS). Se recomienda Node 24 LTS." }, "landing": { - "brandName": "OmniRuta", - "navigateHome": "Navegar a casa", + "brandName": "OmniRoute", + "navigateHome": "Ir al inicio", "toggleMenu": "Alternar menú", "featuresLink": "Características", - "docsLink": "Documentos", + "docsLink": "Documentación", "github": "GitHub", - "versionLive": "v1.0 ya está disponible", - "oneEndpoint": "Un punto final para", - "allProviders": "Todos los proveedores de IA", - "heroDescription": "Proxy de punto final de IA con panel web: un puerto JavaScript de CLIProxyAPI. Funciona a la perfección con Claude Code, OpenAI Codex, Cline, RooCode y otras herramientas CLI.", + "versionLive": "La versión v1.0 ya está disponible", + "oneEndpoint": "Un único endpoint para", + "allProviders": "todos los proveedores de IA", + "heroDescription": "Proxy de endpoint de IA con panel web: una adaptación a JavaScript de CLIProxyAPI. Funciona a la perfección con Claude Code, OpenAI Codex, Cline, RooCode y otras herramientas CLI.", "getStarted": "Empezar", "viewOnGithub": "Ver en GitHub", "powerfulFeatures": "Funciones potentes", - "featuresSubtitle": "Todo lo que necesita para administrar su infraestructura de IA en un solo lugar, diseñado para escalar.", - "featureUnifiedEndpointTitle": "Punto final unificado", - "featureUnifiedEndpointDesc": "Acceda a todos los proveedores a través de una única URL API estándar.", - "featureEasySetupTitle": "Fácil configuración", - "featureEasySetupDesc": "Póngase en funcionamiento en minutos con el comando npx.", - "featureModelFallbackTitle": "Modelo de reserva", - "featureModelFallbackDesc": "Cambie automáticamente de proveedor en caso de falla o alta latencia.", + "featuresSubtitle": "Todo lo que necesitas para gestionar tu infraestructura de IA en un solo lugar, diseñado para escalar.", + "featureUnifiedEndpointTitle": "Endpoint unificado", + "featureUnifiedEndpointDesc": "Accede a todos los proveedores a través de una única URL de API estándar.", + "featureEasySetupTitle": "Configuración sencilla", + "featureEasySetupDesc": "Pútsalo en marcha en cuestión de minutos con el comando npx.", + "featureModelFallbackTitle": "Fallback de modelos", + "featureModelFallbackDesc": "Cambia de proveedor automáticamente en caso de fallo o alta latencia.", "featureUsageTrackingTitle": "Seguimiento de uso", - "featureUsageTrackingDesc": "Análisis detallados y seguimiento de costes en todos los modelos.", - "featureOAuthApiKeysTitle": "Claves OAuth y API", - "featureOAuthApiKeysDesc": "Administre de forma segura las credenciales en una bóveda.", + "featureUsageTrackingDesc": "Analíticas detalladas y supervisión de costes en todos los modelos.", + "featureOAuthApiKeysTitle": "OAuth y claves de API", + "featureOAuthApiKeysDesc": "Gestiona credenciales de forma segura en un almacén centralizado.", "featureCloudSyncTitle": "Sincronización en la nube", - "featureCloudSyncDesc": "Sincronice sus configuraciones entre dispositivos al instante.", - "featureCliSupportTitle": "Soporte CLI", + "featureCloudSyncDesc": "Sincroniza tus configuraciones entre dispositivos al instante.", + "featureCliSupportTitle": "Compatibilidad con CLI", "featureCliSupportDesc": "Funciona con Claude Code, Codex, Cline, Cursor y más.", - "featureDashboardTitle": "Panel de control", - "featureDashboardDesc": "Panel visual para análisis de tráfico en tiempo real.", + "featureDashboardTitle": "Panel", + "featureDashboardDesc": "Panel visual para el análisis de tráfico en tiempo real.", "howItWorks": "Cómo funciona OmniRoute", - "howItWorksDescription": "Los datos fluyen sin problemas desde su aplicación a través de nuestra capa de enrutamiento inteligente hasta el mejor proveedor para el trabajo.", - "howItWorksStep1Title": "1. CLI y SDK", - "howItWorksStep1Description": "Sus solicitudes comienzan desde sus herramientas favoritas o nuestro SDK unificado. Simplemente cambie la URL base.", - "howItWorksStep2Title": "2. Centro OmniRoute", - "howItWorksStep2Description": "Nuestro motor analiza el aviso, verifica el estado del proveedor y las rutas para obtener la latencia o el costo más bajo.", + "howItWorksDescription": "Los datos fluyen sin interrupciones desde tu aplicación, a través de nuestra capa de enrutamiento inteligente, hasta el mejor proveedor para la tarea.", + "howItWorksStep1Title": "1. CLI y SDKs", + "howItWorksStep1Description": "Tus solicitudes se originan en tus herramientas favoritas o en nuestro SDK unificado. Solo tienes que cambiar la URL base.", + "howItWorksStep2Title": "2. Hub de OmniRoute", + "howItWorksStep2Description": "Nuestro motor analiza el prompt, comprueba el estado del proveedor y enruta hacia la menor latencia o coste.", "howItWorksStep3Title": "3. Proveedores de IA", - "howItWorksStep3Description": "OpenAI, Anthropic, Gemini u otros cumplen la solicitud al instante.", - "getStartedIn30Seconds": "Comience en 30 segundos", - "getStartedDescription": "Instale OmniRoute, configure sus proveedores a través del panel web y comience a enrutar solicitudes de IA.", + "howItWorksStep3Description": "OpenAI, Anthropic, Gemini u otros atienden la solicitud al instante.", + "getStartedIn30Seconds": "Empieza en 30 segundos", + "getStartedDescription": "Instala OmniRoute, configura tus proveedores mediante el panel web y empieza a enrutar solicitudes de IA.", "installOmniRoute": "Instalar OmniRoute", - "installStepDescription": "Ejecute el comando npx para iniciar el servidor al instante", + "installStepDescription": "Ejecuta el comando npx para iniciar el servidor al instante", "openDashboard": "Abrir panel", - "openDashboardStepDescription": "Configure proveedores y claves API a través de la interfaz web", - "routeRequests": "Solicitudes de ruta", - "routeRequestsStepDescription": "Apunte sus herramientas CLI a {endpoint}", - "terminal": "terminales", + "openDashboardStepDescription": "Configura proveedores y claves de API a través de la interfaz web", + "routeRequests": "Enrutar solicitudes", + "routeRequestsStepDescription": "Apunta tus herramientas CLI a {endpoint}", + "terminal": "terminal", "copy": "Copiar", "copied": "✓ Copiado", "startingOmniRoute": "Iniciando OmniRoute...", "serverRunningOnLabel": "Servidor ejecutándose en", "dashboardLabel": "Panel de control", - "readyToRoute": "¡Listo para la ruta! ✓", + "readyToRoute": "¡Listo para el enrutamiento! ✓", "configureProvidersNote": "📝 Configure proveedores en el panel o use variables de entorno", "dataLocation": "Ubicación de datos:", - "dataLocationMacLinux": "MacOS/Linux:", - "dataLocationWindows": "Ventanas:", + "dataLocationMacLinux": "macOS/Linux:", + "dataLocationWindows": "Windows:", "product": "Producto", "dashboardLink": "Panel de control", "changelog": "Registro de cambios", "resources": "Recursos", "documentation": "Documentación", - "npm": "MNP", - "legal": "Legales", + "npm": "NPM", + "legal": "Aviso legal", "mitLicense": "Licencia MIT", - "footerTagline": "El punto final unificado para la generación de IA. Conecte, enrute y administre sus proveedores de IA con facilidad.", - "copyright": "© {year} OmniRoute. Reservados todos los derechos.", - "flowToolClaudeCode": "Código Claude", - "flowToolOpenAICodex": "Códice OpenAI", - "flowToolCline": "Clina", + "footerTagline": "El endpoint unificado para la generación de IA. Conecte, enrute y gestione sus proveedores de IA con facilidad.", + "copyright": "© {year} OmniRoute. Todos los derechos reservados.", + "flowToolClaudeCode": "Claude Code", + "flowToolOpenAICodex": "OpenAI Codex", + "flowToolCline": "Cline", "flowToolCursor": "Cursor", - "flowProviderOpenAI": "AbiertoAI", - "flowProviderAnthropic": "antrópico", - "flowProviderGemini": "Géminis", - "flowProviderGithubCopilot": "Copiloto de GitHub", - "interactiveDiagram": "Diagrama interactivo visible en el escritorio.", + "flowProviderOpenAI": "OpenAI", + "flowProviderAnthropic": "Anthropic", + "flowProviderGemini": "Gemini", + "flowProviderGithubCopilot": "GitHub Copilot", + "interactiveDiagram": "Diagrama interactivo visible en escritorio", "ctaTitle": "¿Listo para simplificar su infraestructura de IA?", - "ctaDescription": "Únase a los desarrolladores que están optimizando sus integraciones de IA con OmniRoute. Código abierto y gratuito para comenzar.", - "startFree": "Comience gratis", + "ctaDescription": "Únase a los desarrolladores que están optimizando sus integraciones de IA con OmniRoute. Código abierto y gratuito para empezar.", + "startFree": "Empezar gratis", "readDocumentation": "Leer documentación" }, "docs": { "title": "Documentación", "quickStart": "Inicio rápido", - "deploymentGuides": "Guías de implementación", + "deploymentGuides": "Guías de despliegue", "features": "Características", "supportedProviders": "Proveedores compatibles", "supportedProvidersToc": "Proveedores", "commonUseCases": "Casos de uso comunes", - "clientCompatibility": "Compatibilidad del cliente", + "clientCompatibility": "Compatibilidad de clientes", "protocolsToc": "Protocolos", "apiReference": "Referencia de API", - "managementApiReference": "Management API Reference", - "managementApiDescription": "Automation endpoints for proxy registry, scope assignments, and legacy proxy migration.", + "managementApiReference": "Referencia de API de gestión", + "managementApiDescription": "Endpoints de automatización para el registro de proxy, asignaciones de ámbito y migración de proxies heredados.", "method": "Método", - "path": "Camino", + "path": "Ruta", "notes": "Notas", "modelPrefixes": "Prefijos de modelo", "prefix": "Prefijo", "troubleshooting": "Solución de problemas", - "supportsChat": "Admite puntos finales de chat y respuestas.", + "supportsChat": "Admite endpoints de chat y respuestas.", "oauthAutoRefresh": "Conexión OAuth con actualización automática de token.", - "fullStreaming": "Soporte completo de transmisión para todos los modelos.", - "docsLabel": "Documentos", - "docsHeroDescription": "Puerta de enlace de IA para LLM de múltiples proveedores. Un punto final para OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor y más de 20 proveedores.", - "openDashboard": "Abrir panel", - "endpointPage": "Página de punto final", + "fullStreaming": "Soporte completo de streaming para todos los modelos.", + "docsLabel": "Documentación", + "docsHeroDescription": "Gateway de IA para LLMs de múltiples proveedores. Un endpoint para OpenAI, Anthropic, Gemini, GitHub Copilot, Claude Code, Cursor y más de 20 proveedores.", + "openDashboard": "Abrir panel de control", + "endpointPage": "Página de endpoint", "github": "GitHub", - "reportIssue": "Informar problema", + "reportIssue": "Informar de un problema", "onThisPage": "En esta página", - "documentationVersion": "Documentación: v{version}", + "documentationVersion": "Documentación - v{version}", "quickStartStep1Title": "1. Instalar y ejecutar", - "quickStartStep1Prefix": "correr", + "quickStartStep1Prefix": "Ejecutar", "quickStartStep1Middle": "o clonar desde GitHub y ejecutar", - "quickStartStep2Title": "2. Crear clave API", - "quickStartStep2Text": "Vaya a Punto final -> Claves registradas. Genere una clave por entorno.", + "quickStartStep2Title": "2. Crear clave de API", + "quickStartStep2Text": "Vaya a Endpoint -> Claves registradas. Genere una clave por entorno.", "quickStartStep3Title": "3. Conectar proveedores", - "quickStartStep3Text": "Agregue cuentas de proveedor mediante el inicio de sesión de OAuth, la clave API o la conexión automática de nivel gratuito.", - "quickStartStep4Title": "4. Establecer la URL de la base de clientes", - "quickStartStep4Prefix": "Apunte su cliente IDE o API a", - "quickStartStep4Suffix": "Utilice el prefijo del proveedor, por ejemplo", + "quickStartStep3Text": "Añada cuentas de proveedor mediante inicio de sesión OAuth, clave de API o conexión automática de nivel gratuito.", + "quickStartStep4Title": "4. Establecer la URL base del cliente", + "quickStartStep4Prefix": "Apunte su IDE o cliente de API a", + "quickStartStep4Suffix": "Use el prefijo del proveedor, por ejemplo", "deploySetupTitle": "Guía de configuración", - "deploySetupText": "Instalación paso a paso, configuración del entorno y tutorial de primera ejecución de OmniRoute.", - "deployElectronTitle": "Escritorio electrónico", + "deploySetupText": "Instalación paso a paso, configuración del entorno y tutorial de primera ejecución para OmniRoute.", + "deployElectronTitle": "Escritorio (Electron)", "deployElectronText": "Ejecute OmniRoute como una aplicación de escritorio nativa en Windows, macOS y Linux.", - "deployDockerTitle": "acoplador", - "deployDockerText": "Implementación en contenedores con Docker Compose; listo para pilas de producción y Kubernetes.", + "deployDockerTitle": "Docker", + "deployDockerText": "Despliegue en contenedores con Docker Compose; listo para entornos de producción y Kubernetes.", "deployVmTitle": "Máquina virtual", - "deployVmText": "Autohospedaje en cualquier máquina virtual Linux. Incluye unidad systemd, rotación de registros y herramientas de respaldo.", - "deployFlyTitle": "volar.io", - "deployFlyText": "Implemente en el tiempo de ejecución perimetral de Fly.io con un fly.toml y un único comando de implementación.", + "deployVmText": "Autohospedaje en cualquier VM Linux. Incluye unidad systemd, rotación de logs y herramientas de backup.", + "deployFlyTitle": "Fly.io", + "deployFlyText": "Despliegue en el edge runtime de Fly.io con un archivo fly.toml y un único comando de despliegue.", "deployPwaTitle": "PWA", - "deployPwaText": "Instale OmniRoute como una aplicación web progresiva en Android, iOS y navegadores de escritorio.", + "deployPwaText": "Instale OmniRoute como una Progressive Web App en Android, iOS y navegadores de escritorio.", "deployTermuxTitle": "Termux (Android)", - "deployTermuxText": "Run OmniRoute headless on Android via Termux. Access the dashboard from your mobile browser.", + "deployTermuxText": "Ejecute OmniRoute en modo headless en Android mediante Termux. Acceda al panel de control desde su navegador móvil.", "featureRoutingTitle": "Enrutamiento multiproveedor", - "featureRoutingText": "Enrute solicitudes a más de 30 proveedores de IA a través de un único punto final compatible con OpenAI. Admite API de chat, respuestas, audio e imágenes.", - "featureCombosTitle": "Combos y equilibrio", - "featureCombosText": "Cree combinaciones de modelos con cadenas de respaldo y estrategias de equilibrio: round-robin, prioridad, aleatorio, menos utilizado y de costo optimizado.", - "featureUsageTitle": "Seguimiento de uso y costos", - "featureUsageText": "Recuento de tokens en tiempo real, cálculo de costos por proveedor/modelo y desglose detallado del uso por clave API y cuenta.", - "featureAnalyticsTitle": "Panel de análisis", - "featureAnalyticsText": "Análisis visual con gráficos de solicitudes, tokens, errores, latencia, costos y popularidad del modelo a lo largo del tiempo.", + "featureRoutingText": "Enrute solicitudes a más de 30 proveedores de IA a través de un único endpoint compatible con OpenAI. Admite APIs de chat, respuestas, audio e imágenes.", + "featureCombosTitle": "Combos y balanceo", + "featureCombosText": "Cree combinaciones de modelos con cadenas de fallback y estrategias de balanceo: round-robin, prioridad, aleatorio, menos usado y optimizado por coste.", + "featureUsageTitle": "Seguimiento de uso y costes", + "featureUsageText": "Conteo de tokens en tiempo real, cálculo de costes por proveedor/modelo y desglose detallado de uso por clave de API y cuenta.", + "featureAnalyticsTitle": "Panel de analíticas", + "featureAnalyticsText": "Analíticas visuales con gráficos de solicitudes, tokens, errores, latencia, costes y popularidad de modelos a lo largo del tiempo.", "featureHealthTitle": "Monitoreo de salud", - "featureHealthText": "Comprobaciones de estado en vivo, estado del proveedor, estados de los disyuntores y detección automática del límite de velocidad con retroceso exponencial.", + "featureHealthText": "Comprobaciones de salud en vivo, estado del proveedor, estados de circuit breaker y detección automática de rate limit con retroceso exponencial.", "featureCliTitle": "Herramientas CLI", - "featureCliText": "Administre configuraciones de IDE, exporte/importe copias de seguridad, descubra perfiles de códice y configure ajustes desde el panel.", + "featureCliText": "Gestione configuraciones de IDE, exporte/importe backups, descubra perfiles de codex y configure ajustes desde el panel de control.", "featureSecurityTitle": "Seguridad y políticas", - "featureSecurityText": "Autenticación de clave API, filtrado de IP, protección contra inyección rápida, políticas de dominio, gestión de sesiones y registro de auditoría.", + "featureSecurityText": "Autenticación mediante clave de API, filtrado de IP, protección contra prompt injection, políticas de dominio, gestión de sesiones y logs de auditoría.", "featureCloudSyncTitle": "Sincronización en la nube", - "featureCloudSyncText": "Sincronice su configuración con Cloudflare Workers para obtener acceso remoto con credenciales cifradas y conmutación por error automática.", + "featureCloudSyncText": "Sincronice su configuración con Cloudflare Workers para acceso remoto con credenciales cifradas y failover automático.", "providersAcrossConnectionTypes": "{count} proveedores en tres tipos de conexión.", - "manageProviders": "Administrar proveedores", + "manageProviders": "Gestionar proveedores", "providersCount": "{count} proveedores", "providerTypeFree": "Nivel gratuito", "providerTypeOAuth": "OAuth", - "providerTypeApiKey": "Clave API", - "useCaseSingleEndpointTitle": "Punto final único para muchos proveedores", - "useCaseSingleEndpointText": "Dirija a los clientes a una URL base y enrútelos por prefijo de modelo (por ejemplo: gh/, cc/, kr/, openai/).", - "useCaseFallbackTitle": "Retroceso y cambio de modelo con combos", - "useCaseFallbackText": "Cree modelos combinados en el Panel y mantenga estable la configuración del cliente mientras los proveedores rotan internamente.", - "useCaseUsageVisibilityTitle": "Visibilidad de uso, costo y depuración", - "useCaseUsageVisibilityText": "Realice un seguimiento de los tokens y el costo por proveedor, cuenta y clave API en las pestañas Uso y Análisis.", - "clientCherryStudioTitle": "estudio de cereza", - "baseUrlLabel": "URL básica", - "chatEndpointLabel": "Punto final del chat", - "modelRecommendationLabel": "Recomendación del modelo: prefijo explícito", - "clientCodexTitle": "Modelos de copiloto Codex/GitHub", - "clientCodexBullet1": "Utilice ID de modelo con", + "providerTypeApiKey": "Clave de API", + "useCaseSingleEndpointTitle": "Endpoint único para muchos proveedores", + "useCaseSingleEndpointText": "Apunte los clientes a una URL base y enrute por prefijo de modelo (por ejemplo: gh/, cc/, kr/, openai/).", + "useCaseFallbackTitle": "Fallback y cambio de modelo con combos", + "useCaseFallbackText": "Cree modelos combinados en el panel de control y mantenga la configuración del cliente estable mientras los proveedores rotan internamente.", + "useCaseUsageVisibilityTitle": "Visibilidad de uso, costes y depuración", + "useCaseUsageVisibilityText": "Realice un seguimiento de tokens y costes por proveedor, cuenta y clave de API en las pestañas de Uso y Analíticas.", + "clientCherryStudioTitle": "Cherry Studio", + "baseUrlLabel": "URL base", + "chatEndpointLabel": "Endpoint de chat", + "modelRecommendationLabel": "Recomendación de modelo: prefijo explícito", + "clientCodexTitle": "Modelos Codex / GitHub Copilot", + "clientCodexBullet1": "Use IDs de modelo con", "clientCodexBullet2": "Los modelos de la familia Codex se enrutan automáticamente a", - "clientCodexBullet3": "Los modelos que no pertenecen al Codex continúan", + "clientCodexBullet3": "Los modelos que no son Codex continúan en", "clientCursorTitle": "Cursor IDE", - "clientCursorBullet1": "uso", - "clientCursorBullet1Suffix": "Prefijo para modelos de cursor.", + "clientCursorBullet1": "Usa", + "clientCursorBullet1Suffix": "como prefijo para modelos de Cursor.", "clientCursorBullet2": "Conexión OAuth: inicie sesión desde la página de Proveedores.", - "clientClaudeTitle": "Código Claude / Antigravedad", - "clientClaudeBullet1Prefix": "uso", + "clientClaudeTitle": "Claude Code / Antigravity", + "clientClaudeBullet1Prefix": "Usa", "clientClaudeBullet1Middle": "(Claude) o", - "clientClaudeBullet1Suffix": "Prefijo (antigravedad).", - "clientWindsurfTitle": "windsurf", - "clientWindsurfBullet1": "Utilice OmniRoute como URL base compatible con OpenAI y mantenga prefijos de proveedor explícitos para un enrutamiento determinista.", - "clientWindsurfBullet2": "Apunte los modelos a `/v1/chat/completions` para el tráfico general y conserve `/v1/responses` para flujos de estilo Codex.", - "clientWindsurfBullet3": "Utilice Panel -> Herramientas CLI para obtener una guía de configuración de Windsurf lista para usar.", - "clientClineTitle": "Clina", - "clientClineBullet1": "Cline funciona mejor con prefijos explícitos de proveedor/modelo para que el enrutador nunca tenga que adivinar el backend.", - "clientClineBullet2": "Utilice `/v1/chat/completions` para modelos generales y reutilice la misma URL base de OmniRoute en diferentes cuentas.", - "clientClineBullet3": "Utilice el panel de proveedores para validar la clave OAuth/API antes de depurar problemas de tiempo de ejecución de Cline.", - "clientKimiTitle": "Codificación Kimi", - "clientKimiBullet1": "Utilice OmniRoute como URL base estable mientras rota cuentas o combinaciones de proveedores debajo.", - "clientKimiBullet2": "Prefiera modelos con prefijos en los flujos de codificación para que el respaldo y el seguimiento de auditoría sigan siendo explícitos.", - "clientKimiBullet3": "Utilice `/v1/responses` cuando desee un enrutamiento nativo estilo Respuestas para clientes que utilizan herramientas.", + "clientClaudeBullet1Suffix": "(Antigravity) como prefijo.", + "clientWindsurfTitle": "Windsurf", + "clientWindsurfBullet1": "Use OmniRoute como URL base compatible con OpenAI y mantenga prefijos de proveedor explícitos para un enrutamiento determinista.", + "clientWindsurfBullet2": "Apunte los modelos a `/v1/chat/completions` para tráfico general y conserve `/v1/responses` para flujos estilo Codex.", + "clientWindsurfBullet3": "Use Panel de control -> Herramientas CLI para obtener una guía de configuración de Windsurf lista para usar.", + "clientClineTitle": "Cline", + "clientClineBullet1": "Cline funciona mejor con prefijos explícitos de proveedor/modelo para que el router nunca tenga que adivinar el backend.", + "clientClineBullet2": "Use `/v1/chat/completions` para modelos generales y reutilice la misma URL base de OmniRoute en diferentes cuentas.", + "clientClineBullet3": "Use el panel de Proveedores para validar OAuth/clave de API antes de depurar problemas de runtime de Cline.", + "clientKimiTitle": "Kimi Coding", + "clientKimiBullet1": "Use OmniRoute como URL base estable mientras rota cuentas o combos de proveedores por debajo.", + "clientKimiBullet2": "Prefiera modelos con prefijo en flujos de codificación para que el fallback y el registro de auditoría permanezcan explícitos.", + "clientKimiBullet3": "Use `/v1/responses` cuando desee enrutamiento nativo estilo Responses para clientes que usan herramientas.", "protocolsTitle": "Protocolos: MCP y A2A", - "protocolsDescription": "OmniRoute expone dos protocolos operativos además de las API compatibles con OpenAI: MCP para la ejecución de herramientas y A2A para flujos de trabajo de agente a agente.", - "protocolMcpTitle": "MCP (Protocolo de contexto modelo)", - "protocolMcpDesc": "Utilice MCP sobre stdio para permitir que los clientes descubran y llamen a las herramientas OmniRoute con visibilidad de auditoría.", + "protocolsDescription": "OmniRoute expone dos protocolos operativos además de las APIs compatibles con OpenAI: MCP para ejecución de herramientas y A2A para flujos de trabajo agente-a-agente.", + "protocolMcpTitle": "MCP (Model Context Protocol)", + "protocolMcpDesc": "Use MCP sobre stdio para permitir que los clientes descubran y llamen a herramientas de OmniRoute con visibilidad de auditoría.", "protocolMcpStep1": "Inicie el transporte MCP con `omniroute --mcp`.", "protocolMcpStep2": "Apunte su cliente MCP al transporte stdio.", "protocolMcpStep3": "Llame a `omniroute_get_health` y `omniroute_list_combos` para validar la conectividad.", - "protocolA2aTitle": "A2A (Agente2Agente)", - "protocolA2aDesc": "Utilice A2A JSON-RPC para enviar tareas de forma sincrónica o mediante transmisión SSE.", - "protocolA2aStep1": "Lea `/.well-known/agent.json` para descubrir agentes.", + "protocolA2aTitle": "A2A (Agent2Agent)", + "protocolA2aDesc": "Use A2A JSON-RPC para enviar tareas de forma síncrona o mediante streaming SSE.", + "protocolA2aStep1": "Lea `/.well-known/agent.json` para el descubrimiento de agentes.", "protocolA2aStep2": "Envíe solicitudes `message/send` o `message/stream` a `POST /a2a`.", - "protocolA2aStep3": "Administre el ciclo de vida de las tareas con `tasks/get` y `tasks/cancel`.", - "protocolTroubleshootingTitle": "Solución de problemas de protocolo", - "protocolTroubleshooting1": "Si el estado de MCP está fuera de línea, verifique que el proceso stdio se esté ejecutando y que el archivo de latido se esté actualizando.", - "protocolTroubleshooting2": "Si las tareas A2A permanecen en `working`, inspeccione `/api/a2a/tasks/:id` y transmita eventos para ver el estado terminal.", - "protocolTroubleshooting3": "Utilice `/dashboard/mcp` y `/dashboard/a2a` para controles operativos y visibilidad de auditoría.", - "endpointChatNote": "Punto final de chat compatible con OpenAI (predeterminado).", - "endpointResponsesNote": "Punto final de API de respuestas (Codex, o-series).", + "protocolA2aStep3": "Gestione el ciclo de vida de las tareas con `tasks/get` y `tasks/cancel`.", + "protocolTroubleshootingTitle": "Solución de problemas de protocolos", + "protocolTroubleshooting1": "Si el estado de MCP es offline, verifique que el proceso stdio se esté ejecutando y que el archivo de heartbeat se esté actualizando.", + "protocolTroubleshooting2": "Si las tareas A2A permanecen en `working`, inspeccione `/api/a2a/tasks/:id` y los eventos de stream para ver el estado terminal.", + "protocolTroubleshooting3": "Use `/dashboard/mcp` y `/dashboard/a2a` para controles operativos y visibilidad de auditoría.", + "endpointChatNote": "Endpoint de chat compatible con OpenAI (predeterminado).", + "endpointResponsesNote": "Endpoint de API de respuestas (Codex, serie-o).", "endpointModelsNote": "Catálogo de modelos para todos los proveedores conectados.", "endpointAudioNote": "Transcripción de audio (Deepgram, AssemblyAI).", "endpointSpeechNote": "Generación de texto a voz (ElevenLabs, OpenAI TTS).", "endpointEmbeddingsNote": "Generación de embeddings de texto (OpenAI, Cohere, Voyage).", "endpointImagesNote": "Generación de imágenes (NanoBanana).", - "endpointRewriteChatNote": "Reescribir el asistente para clientes sin /v1.", - "endpointRewriteResponsesNote": "Reescriba el asistente para respuestas sin /v1.", - "endpointRewriteModelsNote": "Reescriba el asistente para el descubrimiento de modelos sin /v1.", - "mgmtProxiesListNote": "List saved proxy registry items (supports pagination).", - "mgmtProxiesCreateNote": "Create a reusable proxy item in the registry.", - "mgmtProxiesHealthNote": "Get 24h/rolling health metrics per saved proxy from proxy logs.", - "mgmtProxiesBulkAssignNote": "Assign or clear one proxy across many scope IDs in one request.", - "mgmtAssignmentsListNote": "List proxy assignments by scope, scope_id, or proxy_id.", - "mgmtAssignmentsUpdateNote": "Assign or clear proxy for global/provider/account/combo scope.", - "mgmtLegacyMigrationNote": "Import legacy proxyConfig maps into registry assignments.", - "modelPrefixesDescriptionStart": "Utilice el prefijo del proveedor antes del nombre del modelo para enrutar a un proveedor específico. Ejemplo:", - "modelPrefixesDescriptionEnd": "rutas al copiloto de GitHub.", + "endpointRewriteChatNote": "Asistente de reescritura para clientes sin /v1.", + "endpointRewriteResponsesNote": "Asistente de reescritura para Responses sin /v1.", + "endpointRewriteModelsNote": "Asistente de reescritura para descubrimiento de modelos sin /v1.", + "mgmtProxiesListNote": "Listar elementos del registro de proxy guardados (admite paginación).", + "mgmtProxiesCreateNote": "Crear un elemento de proxy reutilizable en el registro.", + "mgmtProxiesHealthNote": "Obtener métricas de salud de 24h/continuas por proxy guardado desde los logs de proxy.", + "mgmtProxiesBulkAssignNote": "Asignar o borrar un proxy en muchos IDs de ámbito en una sola solicitud.", + "mgmtAssignmentsListNote": "Listar asignaciones de proxy por ámbito, scope_id o proxy_id.", + "mgmtAssignmentsUpdateNote": "Asignar o borrar proxy para ámbitos global/proveedor/cuenta/combo.", + "mgmtLegacyMigrationNote": "Importar mapas de proxyConfig heredados a asignaciones de registro.", + "modelPrefixesDescriptionStart": "Use el prefijo del proveedor antes del nombre del modelo para enrutar a un proveedor específico. Ejemplo:", + "modelPrefixesDescriptionEnd": "enruta a GitHub Copilot.", "provider": "Proveedor", "type": "Tipo", - "troubleshootingModelRouting": "Si el cliente falla con el enrutamiento del modelo, utilice proveedor/modelo explícito (por ejemplo: gh/gpt-5.1-codex).", - "troubleshootingAmbiguousModels": "Si recibe errores de modelo ambiguos, elija un prefijo de proveedor en lugar de una identificación de modelo simple.", - "troubleshootingCodexFamily": "Para los modelos de la familia GitHub Codex, mantenga el modelo como gh/codex-model; El enrutador selecciona/respuestas automáticamente.", - "troubleshootingTestConnection": "Utilice Panel > Proveedores > Probar conexión antes de realizar pruebas desde IDE o clientes externos.", - "troubleshootingCircuitBreaker": "Si un proveedor muestra el disyuntor abierto, espere el tiempo de reutilización o consulte la página de Salud para obtener más detalles.", - "troubleshootingOAuth": "Para los proveedores de OAuth, vuelva a autenticarse si los tokens caducan. Verifique el indicador de estado de la tarjeta del proveedor.", - "endpointCompletionsNote": "Punto final de finalización heredado para la generación de texto.", - "endpointModerationsNote": "Moderación de contenidos y clasificación de seguridad.", - "endpointRerankNote": "Reclasificación de documentos para generación aumentada de recuperación (Cohere, Jina).", + "troubleshootingModelRouting": "Si el cliente falla con el enrutamiento de modelos, use proveedor/modelo explícito (por ejemplo: gh/gpt-5.1-codex).", + "troubleshootingAmbiguousModels": "Si recibe errores de modelo ambiguo, elija un prefijo de proveedor en lugar de un ID de modelo simple.", + "troubleshootingCodexFamily": "Para los modelos de la familia GitHub Codex, mantén el modelo como gh/codex-model; el enrutador selecciona /responses automáticamente.", + "troubleshootingTestConnection": "Usa Panel > Proveedores > Probar conexión antes de realizar pruebas desde IDEs o clientes externos.", + "troubleshootingCircuitBreaker": "Si un proveedor muestra el disyuntor abierto, espera el tiempo de reutilización o consulta la página de salud para obtener más detalles.", + "troubleshootingOAuth": "Para los proveedores de OAuth, vuelve a autenticarte si los tokens caducan. Comprueba el indicador de estado de la tarjeta del proveedor.", + "endpointCompletionsNote": "Endpoint de completions heredado para la generación de texto.", + "endpointModerationsNote": "Moderación de contenido y clasificación de seguridad.", + "endpointRerankNote": "Reclasificación de documentos para generación aumentada por recuperación (Cohere, Jina).", "endpointSearchNote": "Búsqueda web con 5 proveedores (Serper, Brave, Exa, Tavily, Perplexity).", "endpointSearchAnalyticsNote": "Análisis y métricas para solicitudes de búsqueda.", - "endpointVideoNote": "Generación de vídeo (ComfyUI, flujos de trabajo SD WebUI).", - "endpointMusicNote": "Generación de música a través de flujos de trabajo de ComfyUI.", - "endpointMessagesNote": "Punto final de mensajes nativos antrópicos.", - "endpointCountTokensNote": "Cuente los tokens para una carga útil de mensaje determinada.", + "endpointVideoNote": "Generación de vídeo (workflows de ComfyUI, SD WebUI).", + "endpointMusicNote": "Generación de música a través de workflows de ComfyUI.", + "endpointMessagesNote": "Endpoint de mensajes nativo de Anthropic.", + "endpointCountTokensNote": "Cuenta los tokens para un payload de mensaje determinado.", "endpointFilesNote": "Carga de archivos para entradas multimodales.", - "endpointBatchesNote": "Procesamiento por lotes para solicitudes API masivas.", - "endpointWsNote": "Punto final WebSocket para transmisión en tiempo real.", - "mgmtProvidersListNote": "Enumere todas las conexiones de proveedores registrados.", - "mgmtProvidersCreateNote": "Cree una nueva conexión de proveedor.", - "mgmtProvidersUpdateNote": "Actualizar una conexión de proveedor existente.", - "mgmtProvidersDeleteNote": "Eliminar una conexión de proveedor.", - "mgmtProvidersTestNote": "Pruebe la conectividad y la autenticación de un proveedor.", - "mgmtProvidersModelsNote": "Enumere los modelos disponibles para un proveedor específico.", - "mgmtSettingsGetNote": "Recuperar la configuración actual de la aplicación.", - "mgmtSettingsUpdateNote": "Actualizar la configuración de la aplicación.", - "mgmtPayloadRulesGetNote": "Obtenga reglas de transformación de carga útil.", - "mgmtPayloadRulesUpdateNote": "Actualice las reglas de transformación de carga útil.", + "endpointBatchesNote": "Procesamiento por lotes para solicitudes de API masivas.", + "endpointWsNote": "Endpoint WebSocket para streaming en tiempo real.", + "mgmtProvidersListNote": "Lista todas las conexiones de proveedores registradas.", + "mgmtProvidersCreateNote": "Crea una nueva conexión de proveedor.", + "mgmtProvidersUpdateNote": "Actualiza una conexión de proveedor existente.", + "mgmtProvidersDeleteNote": "Elimina una conexión de proveedor.", + "mgmtProvidersTestNote": "Prueba la conectividad y la autenticación de un proveedor.", + "mgmtProvidersModelsNote": "Lista los modelos disponibles para un proveedor específico.", + "mgmtSettingsGetNote": "Recupera la configuración actual de la aplicación.", + "mgmtSettingsUpdateNote": "Actualiza la configuración de la aplicación.", + "mgmtPayloadRulesGetNote": "Obtiene las reglas de transformación del payload.", + "mgmtPayloadRulesUpdateNote": "Actualiza las reglas de transformación del payload.", "mcpToolsTitle": "Herramientas MCP", - "mcpToolsDescription": "OmniRoute expone {count} herramientas a través del protocolo de contexto del modelo para la orquestación de agentes.", + "mcpToolsDescription": "OmniRoute expone {count} herramientas a través del Model Context Protocol para la orquestación de agentes.", "mcpToolsCount": "{count} herramientas", "mcpToolsToc": "Herramientas MCP", "mcpToolsRoutingTitle": "Enrutamiento y descubrimiento", - "mcpToolsRoutingDesc": "Comprobaciones de estado, gestión combinada, seguimiento de cuotas, informes de costes y acceso al catálogo de modelos.", + "mcpToolsRoutingDesc": "Comprobaciones de salud, gestión de combos, supervisión de cuotas, informes de costes y acceso al catálogo de modelos.", "mcpToolsOperationsTitle": "Operaciones y estrategia", - "mcpToolsOperationsDesc": "Simulación de rutas, guardias de presupuesto, cambio de estrategia, perfiles de resiliencia y métricas de proveedores.", + "mcpToolsOperationsDesc": "Simulación de rutas, protecciones de presupuesto, cambio de estrategia, perfiles de resiliencia y métricas de proveedores.", "mcpToolsCacheTitle": "Gestión de caché", - "mcpToolsCacheDesc": "Vea estadísticas de caché y vacíe cachés semánticos o de firmas.", + "mcpToolsCacheDesc": "Consulta las estadísticas de caché y vacía las cachés semánticas o de firmas.", "mcpToolsCompressionTitle": "Motores de compresión", - "mcpToolsCompressionDesc": "Configure la compresión RTK/Brotli, intercambie motores e inspeccione los análisis de compresión por combo.", + "mcpToolsCompressionDesc": "Configura la compresión RTK/Brotli, intercambia motores e inspecciona las analíticas de compresión por combo.", "mcpToolsOneProxyTitle": "1Proxy / Túneles", - "mcpToolsOneProxyDesc": "Administre servidores proxy salientes, rote IP residenciales e inspeccione el estado del proxy.", + "mcpToolsOneProxyDesc": "Gestiona proxies salientes, rota IPs residenciales e inspecciona el estado del proxy.", "mcpToolsMemoryTitle": "Memoria", - "mcpToolsMemoryDesc": "Busque, agregue y borre entradas persistentes de la memoria conversacional.", + "mcpToolsMemoryDesc": "Busca, añade y borra entradas de memoria conversacional persistente.", "mcpToolsSkillsTitle": "Habilidades", - "mcpToolsSkillsDesc": "Enumere, habilite, ejecute y supervise ejecuciones de habilidades personalizadas.", + "mcpToolsSkillsDesc": "Lista, habilita, ejecuta y supervisa ejecuciones de habilidades personalizadas.", "featureAutoComboTitle": "Combo automático", - "featureAutoComboText": "Cree automáticamente combinaciones optimizadas basadas en sus proveedores conectados, patrones de uso y capacidades del modelo.", + "featureAutoComboText": "Crea automáticamente combos optimizados basados en tus proveedores conectados, patrones de uso y capacidades de los modelos.", "featureSearchTitle": "Búsqueda web", - "featureSearchText": "Búsqueda web integrada con 5 proveedores (Serper, Brave, Exa, Tavily, Perplexity) que incluyen análisis y seguimiento de costos.", + "featureSearchText": "Búsqueda web integrada con 5 proveedores (Serper, Brave, Exa, Tavily, Perplexity), incluyendo analíticas y seguimiento de costes.", "featureMemoryTitle": "Sistema de memoria", - "featureMemoryText": "Memoria conversacional persistente con extracción, inyección, recuperación y resumen entre sesiones.", - "featureSkillsTitle": "Marco de habilidades", - "featureSkillsText": "Sistema de habilidades extensible con habilidades integradas y personalizadas, ejecución de espacio aislado, interceptación de solicitudes e inyección de contexto.", - "featureAcpTitle": "Comunicación del agente", - "featureAcpText": "Registro del Protocolo de comunicación del agente (ACP) para gestionar flujos de trabajo de agente a agente y orquestación de herramientas.", - "protocolAcpTitle": "ACP (Comunicación del agente)", - "protocolAcpDesc": "Registre y administre agentes a través del registro ACP para la comunicación entre agentes y el intercambio de herramientas.", - "protocolAcpStep1": "Navegue hasta Panel → Agentes para ver los agentes ACP registrados.", - "protocolAcpStep2": "Registrar nuevos agentes con capacidades y configuración de endpoints.", - "protocolAcpStep3": "Utilice las herramientas CLI para configurar los canales de comunicación del agente." + "featureMemoryText": "Memoria conversacional persistente con extracción, inyección, recuperación y resúmenes entre sesiones.", + "featureSkillsTitle": "Framework de habilidades", + "featureSkillsText": "Sistema de habilidades extensible con habilidades integradas y personalizadas, ejecución en sandbox, interceptación de solicitudes e inyección de contexto.", + "featureAcpTitle": "Comunicación de agentes", + "featureAcpText": "Registro del Agent Communication Protocol (ACP) para gestionar workflows de agente a agente y la orquestación de herramientas.", + "protocolAcpTitle": "ACP (Comunicación de agentes)", + "protocolAcpDesc": "Registra y gestiona agentes a través del registro ACP para la comunicación entre agentes y el uso compartido de herramientas.", + "protocolAcpStep1": "Navega a Panel → Agentes para ver los agentes ACP registrados.", + "protocolAcpStep2": "Registra nuevos agentes con capacidades y configuración de endpoint.", + "protocolAcpStep3": "Usa las herramientas de CLI para configurar los canales de comunicación de los agentes." }, "legal": { "privacyPolicy": "Política de privacidad", "termsOfService": "Términos de servicio", - "providerConfigurations": "Configuraciones de proveedor", - "apiKeys": "Claves API", + "providerConfigurations": "Configuraciones de proveedores", + "apiKeys": "Claves de API", "usageLogs": "Registros de uso", - "applicationSettings": "Configuración de la aplicación", + "applicationSettings": "Ajustes de la aplicación", "viewExportAnalytics": "Ver y exportar análisis de uso", "clearHistory": "Borrar el historial de uso en cualquier momento", "configureRetention": "Configurar políticas de retención de registros", - "backupRestore": "Haga una copia de seguridad y restaure su base de datos", - "privacyMetadataTitle": "Política de privacidad | OmniRuta", - "privacyMetadataDescription": "Política de privacidad para el enrutador proxy API OmniRoute AI.", - "termsMetadataTitle": "Términos de servicio | OmniRuta", - "termsMetadataDescription": "Términos de servicio para el enrutador proxy API OmniRoute AI.", - "backToHome": "De vuelta a casa", + "backupRestore": "Copia de seguridad y restauración de la base de datos", + "privacyMetadataTitle": "Política de privacidad | OmniRoute", + "privacyMetadataDescription": "Política de privacidad para el enrutador proxy de API de IA OmniRoute.", + "termsMetadataTitle": "Términos de servicio | OmniRoute", + "termsMetadataDescription": "Términos de servicio para el enrutador proxy de API de IA OmniRoute.", + "backToHome": "Volver al inicio", "lastUpdated": "Última actualización: {date}", "policyLastUpdatedDate": "13 de febrero de 2026", "listSeparator": "-", - "questionsVisit": "¿Preguntas? Visita nuestro", + "questionsVisit": "¿Tienes dudas? Visita nuestro", "githubRepository": "repositorio de GitHub", "privacySection1Title": "1. Arquitectura local primero", - "privacySection1Text": "OmniRoute está diseñado como una aplicación local. Todo el procesamiento y almacenamiento de datos se realiza íntegramente en su máquina. No existe un servidor centralizado que recopile su información.", + "privacySection1Text": "OmniRoute está diseñada como una aplicación local. Todo el procesamiento y almacenamiento de datos se realiza íntegramente en tu máquina. No hay ningún servidor centralizado que recopile tu información.", "privacySection2Title": "2. Datos que almacenamos", "privacyDataStoredIn": "Los siguientes datos se almacenan localmente en", - "privacyDataProviderConfigurationsDesc": "URL de conexión, tipos de proveedores y configuración de prioridad", - "privacyDataApiKeysDesc": "cifrado y almacenado localmente para autenticarse con proveedores de IA", + "privacyDataProviderConfigurationsDesc": "URLs de conexión, tipos de proveedores y ajustes de prioridad", + "privacyDataApiKeysDesc": "cifradas y almacenadas localmente para la autenticación con proveedores de IA", "privacyDataUsageLogsDesc": "recuentos de solicitudes, uso de tokens, nombres de modelos, marcas de tiempo y tiempos de respuesta", - "privacyDataApplicationSettingsDesc": "preferencias de tema, estrategia de enrutamiento y configuraciones combinadas", + "privacyDataApplicationSettingsDesc": "preferencias de tema, estrategia de enrutamiento y configuraciones de combos", "privacySection3Title": "3. Sin telemetría", - "privacySection3Text": "OmniRoute no recopila telemetría, análisis ni informes de fallos. No se envían datos a nosotros ni a ningún tercero. Sus patrones de uso, llamadas API y configuraciones permanecen completamente privados.", + "privacySection3Text": "OmniRoute no recopila telemetría, analíticas ni informes de fallos. No se envían datos a nosotros ni a terceros. Tus patrones de uso, llamadas a la API y configuraciones permanecen completamente privados.", "privacySection4Title": "4. Proveedores de IA de terceros", - "privacySection4Text": "Cuando realiza llamadas API a través de OmniRoute, sus solicitudes se reenvían a los proveedores de IA que haya configurado (por ejemplo: OpenAI, Anthropic, Google). Estos proveedores tienen sus propias políticas de privacidad que rigen cómo manejan sus datos. Por favor revise:", + "privacySection4Text": "Cuando realizas llamadas a la API a través de OmniRoute, tus solicitudes se reenvían a los proveedores de IA que hayas configurado (por ejemplo: OpenAI, Anthropic, Google). Estos proveedores tienen sus propias políticas de privacidad que rigen cómo gestionan tus datos. Por favor, consulta:", "privacyOpenAiPolicy": "Política de privacidad de OpenAI", - "privacyAnthropicPolicy": "Política de privacidad antrópica", + "privacyAnthropicPolicy": "Política de privacidad de Anthropic", "privacyGooglePolicy": "Política de privacidad de Google", "privacySection5Title": "5. Sincronización en la nube (opcional)", - "privacySection5Text": "Si habilita la función opcional de sincronización en la nube, las configuraciones del proveedor y las claves API pueden transmitirse a un punto final en la nube configurado. Esta función está deshabilitada de forma predeterminada y requiere una suscripción explícita.", - "privacySection6Title": "6. Registro", - "privacyLoggingIntro": "Los registros de solicitudes se pueden configurar a través de la configuración del panel. Puedes:", + "privacySection5Text": "Si habilitas la función opcional de sincronización en la nube, las configuraciones de los proveedores y las claves de API pueden transmitirse a un endpoint en la nube configurado. Esta función está desactivada por defecto y requiere un consentimiento explícito.", + "privacySection6Title": "6. Registros", + "privacyLoggingIntro": "Los registros de solicitudes se pueden configurar a través de los ajustes del panel. Puedes:", "privacySection7Title": "7. Tus derechos", - "privacySection7TextStart": "Dado que todos los datos se almacenan localmente, usted tiene control total. Puedes eliminar tus datos en cualquier momento eliminando el", + "privacySection7TextStart": "Como todos los datos se almacenan localmente, tienes el control absoluto. Puedes eliminar tus datos en cualquier momento borrando el", "privacySection7TextEnd": "directorio o utilizando las funciones de copia de seguridad y restauración de la base de datos en el panel.", "termsSection1Title": "1. Descripción general", - "termsSection1Text": "OmniRoute es un enrutador proxy API de IA local que funciona completamente en su máquina. Enruta solicitudes a múltiples proveedores de IA con equilibrio de carga, conmutación por error y seguimiento de uso.", + "termsSection1Text": "OmniRoute es un enrutador proxy de API de IA local que opera íntegramente en tu máquina. Enruta solicitudes a múltiples proveedores de IA con balanceo de carga, conmutación por error y seguimiento de uso.", "termsSection2Title": "2. Responsabilidades del usuario", - "termsResponsibilityApiKeys": "Usted es el único responsable de administrar sus propias claves API y credenciales para proveedores de IA externos (OpenAI, Anthropic, Google, etc.).", - "termsResponsibilityCompliance": "Debe cumplir con los términos de servicio de cada proveedor de IA a cuya API acceda a través de OmniRoute.", - "termsResponsibilitySecurity": "Usted es responsable de la seguridad de su instalación local de OmniRoute, incluida la configuración de una contraseña y la restricción del acceso a la red.", + "termsResponsibilityApiKeys": "Eres el único responsable de gestionar tus propias claves de API y credenciales para proveedores de IA de terceros (OpenAI, Anthropic, Google, etc.).", + "termsResponsibilityCompliance": "Debes cumplir con los términos de servicio de cada proveedor de IA cuya API accedas a través de OmniRoute.", + "termsResponsibilitySecurity": "Eres responsable de la seguridad de tu instalación local de OmniRoute, incluyendo el establecimiento de una contraseña y la restricción del acceso a la red.", "termsSection3Title": "3. Cómo funciona", - "termsSection3Text": "OmniRoute actúa como proxy intermediario. Las llamadas API enviadas a OmniRoute se traducen y reenvían a sus proveedores de IA configurados. OmniRoute no modifica el contenido de sus solicitudes o respuestas más allá de la traducción del protocolo necesaria.", - "termsSection4Title": "4. Manejo de datos", - "termsDataStoredLocally": "Todos los datos se almacenan localmente en su máquina en una base de datos SQLite.", - "termsNoTransmission": "OmniRoute no transmite ningún dato a servidores externos a menos que habilite explícitamente las funciones de sincronización en la nube.", - "termsDataLocationText": "Los registros de uso, las claves API y la configuración se almacenan en", + "termsSection3Text": "OmniRoute actúa como un proxy intermediario. Las llamadas a la API enviadas a OmniRoute se traducen y reenvían a tus proveedores de IA configurados. OmniRoute no modifica el contenido de tus solicitudes o respuestas más allá de la traducción de protocolo necesaria.", + "termsSection4Title": "4. Tratamiento de datos", + "termsDataStoredLocally": "Todos los datos se almacenan localmente en tu máquina en una base de datos SQLite.", + "termsNoTransmission": "OmniRoute no transmite ningún dato a servidores externos a menos que habilites explícitamente las funciones de sincronización en la nube.", + "termsDataLocationText": "Los registros de uso, las claves de API y la configuración se almacenan en", "termsSection5Title": "5. Descargo de responsabilidad", - "termsSection5Text": "OmniRoute se proporciona \"tal cual\" sin garantía de ningún tipo. No somos responsables de los costos incurridos por el uso de API, interrupciones del servicio o pérdida de datos. Mantenga siempre copias de seguridad de su configuración.", + "termsSection5Text": "OmniRoute se proporciona \"tal cual\" sin garantía de ningún tipo. No nos hacemos responsables de ningún coste derivado del uso de la API, interrupciones del servicio o pérdida de datos. Mantén siempre copias de seguridad de tu configuración.", "termsSection6Title": "6. Código abierto", - "termsSection6Text": "OmniRoute es un software de código abierto. Usted es libre de inspeccionarlo, modificarlo y distribuirlo según los términos de su licencia." + "termsSection6Text": "OmniRoute es software de código abierto. Eres libre de inspeccionarlo, modificarlo y distribuirlo bajo los términos de su licencia." }, "agents": { - "title": "CLI Agents", - "description": "Discover installed CLI agents on your system. Add custom agents for auto-detection.", - "refresh": "Refresh", - "installed": "Installed", - "notFound": "Not Found", - "builtIn": "Built-in", - "custom": "Custom", - "remove": "Remove", - "addCustomAgent": "Add Custom Agent", - "addCustomAgentDesc": "Register any CLI tool for detection. It will be scanned automatically on refresh.", - "agentName": "Agent Name", - "binaryName": "Binary Name", - "versionCommand": "Version Command", - "spawnArgs": "Spawn Args", - "addAgent": "Add Agent", - "scanning": "Scanning system for CLI agents...", - "opencodeIntegration": "OpenCode Integration", - "opencodeDetected": "opencode {version} detected", - "opencodeDesc": "Generate a ready-to-use {configFile} with your OmniRoute base URL and all available models — drop it in your project root and run {command}.", - "downloadConfig": "Download {file}", - "downloaded": "Downloaded!", - "setupGuideTitle": "Setup guide", - "openCliTools": "Open CLI Tools", - "setupGuideDetectCliTitle": "Detect installed CLIs", - "setupGuideDetectCliDesc": "Click Refresh after installing or updating a CLI so OmniRoute can rescan binaries and versions.", - "setupGuideCustomAgentTitle": "Register custom binary", - "setupGuideCustomAgentDesc": "Use Add Custom Agent when your CLI is not in the built-in list. Provide binary name and version command.", - "setupGuideCommandMissingTitle": "Fix 'command not found'", - "setupGuideCommandMissingDesc": "Ensure the CLI command exists in PATH, open a new terminal session, and rerun Refresh.", - "cliToolsRedirectTitle": "Cli Tools Redirect Title", - "cliToolsRedirectDesc": "Cli Tools Redirect Desc", - "spawnArgsPlaceholder": "Spawn Args Placeholder", - "binaryNamePlaceholder": "Binary Name Placeholder", - "versionCommandPlaceholder": "Version Command Placeholder", - "architectureTitle": "Architecture Title", - "flowLocalBinary": "Flow Local Binary", - "flowOmniRoute": "Flow Omni Route", - "agentNamePlaceholder": "Agent Name Placeholder", - "architectureDescription": "Architecture Description", - "flowExecute": "Flow Execute", - "flowSpawn": "Flow Spawn", - "cliToolsRedirectCta": "Cli Tools Redirect Cta", - "comparisonTitle": "Herramientas CLI frente a objetivos de agentes: ¿cuál es la diferencia?", + "title": "Agentes CLI", + "description": "Descubre agentes CLI instalados en tu sistema. Añade agentes personalizados para su autodetección.", + "refresh": "Actualizar", + "installed": "Instalado", + "notFound": "No encontrado", + "builtIn": "Integrado", + "custom": "Personalizado", + "remove": "Eliminar", + "addCustomAgent": "Añadir agente personalizado", + "addCustomAgentDesc": "Registra cualquier herramienta CLI para su detección. Se escaneará automáticamente al actualizar.", + "agentName": "Nombre del agente", + "binaryName": "Nombre del binario", + "versionCommand": "Comando de versión", + "spawnArgs": "Argumentos de inicio", + "addAgent": "Añadir agente", + "scanning": "Escaneando el sistema en busca de agentes CLI...", + "opencodeIntegration": "Integración con OpenCode", + "opencodeDetected": "opencode {version} detectado", + "opencodeDesc": "Genera un {configFile} listo para usar con tu URL base de OmniRoute y todos los modelos disponibles; colócalo en la raíz de tu proyecto y ejecuta {command}.", + "downloadConfig": "Descargar {file}", + "downloaded": "¡Descargado!", + "setupGuideTitle": "Guía de configuración", + "openCliTools": "Abrir herramientas CLI", + "setupGuideDetectCliTitle": "Detectar CLIs instaladas", + "setupGuideDetectCliDesc": "Haz clic en Actualizar después de instalar o actualizar una CLI para que OmniRoute pueda volver a escanear los binarios y las versiones.", + "setupGuideCustomAgentTitle": "Registrar binario personalizado", + "setupGuideCustomAgentDesc": "Usa Añadir agente personalizado cuando tu CLI no esté en la lista integrada. Proporciona el nombre del binario y el comando de versión.", + "setupGuideCommandMissingTitle": "Solucionar 'command not found'", + "setupGuideCommandMissingDesc": "Asegúrate de que el comando CLI existe en el PATH, abre una nueva sesión de terminal y vuelve a pulsar Actualizar.", + "cliToolsRedirectTitle": "¿Quieres configurar tu IDE?", + "cliToolsRedirectDesc": "Si quieres apuntar Claude Code, Cursor, Codex o cualquier IDE a OmniRoute como proxy, ve a Herramientas CLI en su lugar. Esta página es para lo inverso: usar binarios CLI locales como destinos de ejecución a través de los cuales OmniRoute puede iniciar y enrutar solicitudes.", + "spawnArgsPlaceholder": "ej., --quiet, --json, --no-auto-commits", + "binaryNamePlaceholder": "ej., mi-agente o /usr/local/bin/llm-cli", + "versionCommandPlaceholder": "ej., mi-agente --version", + "architectureTitle": "Cómo funcionan los destinos de agentes", + "flowLocalBinary": "3 · Proceso CLI con su propia autenticación", + "flowOmniRoute": "1 · La solicitud llega a OmniRoute", + "agentNamePlaceholder": "ej., Mi agente personalizado", + "architectureDescription": "Cuando llega una solicitud, OmniRoute puede iniciar un binario CLI local (ej., claude, codex, goose) y canalizar la solicitud a través de él. La CLI procesa la solicitud utilizando sus propias credenciales y devuelve el resultado a través de OmniRoute.", + "flowExecute": "4 · Respuesta devuelta al cliente", + "flowSpawn": "2 · OmniRoute inicia el binario local", + "cliToolsRedirectCta": "Ir a herramientas CLI →", + "comparisonTitle": "Herramientas CLI frente a destinos de agentes: ¿Cuál es la diferencia?", "comparisonCliToolsLabel": "Página de herramientas CLI", - "comparisonCliToolsTitle": "Su IDE envía solicitudes a través de OmniRoute", + "comparisonCliToolsTitle": "Tu IDE envía solicitudes a través de OmniRoute", "comparisonCliToolsDesc": "Configure Claude Code, Codex, Cursor y otros IDE para utilizar OmniRoute como su URL base de API. OmniRoute actúa como un proxy y enruta las solicitudes a sus proveedores configurados.", "comparisonAgentsLabel": "Esta página (objetivos del agente)", "comparisonAgentsTitle": "OmniRoute envía solicitudes a herramientas CLI locales", "comparisonAgentsDesc": "OmniRoute puede generar archivos binarios CLI locales (claude, codex, goose) como servidores de ejecución. La herramienta CLI procesa la solicitud utilizando su propia autenticación y devuelve el resultado.", - "comparisonSummary": "En resumen: Herramientas CLI = configura herramientas para que apunten a OmniRoute. Objetivos del agente = OmniRoute utiliza herramientas como puntos finales.", - "agentUseCaseHint": "Se puede utilizar como objetivo de ejecución a través del protocolo ACP.", - "flowDiagramClient": "Aplicación del cliente", + "comparisonSummary": "En resumen: Herramientas CLI = configura herramientas para que apunten a OmniRoute. Objetivos del agente = OmniRoute utiliza herramientas como endpoints.", + "agentUseCaseHint": "Se puede utilizar como objetivo de ejecución a través del protocolo ACP", + "flowDiagramClient": "Aplicación cliente", "flowDiagramClientDesc": "SDK, API o servicio ascendente", - "flowDiagramOmniRoute": "OmniRuta", - "flowDiagramOmniRouteDesc": "Recibe la solicitud y selecciona el objetivo.", + "flowDiagramOmniRoute": "OmniRoute", + "flowDiagramOmniRouteDesc": "Recibe la solicitud y selecciona el objetivo", "flowDiagramSpawn": "Proceso de generación", - "flowDiagramSpawnDesc": "Inicia CLI binario a través de stdio", + "flowDiagramSpawnDesc": "Inicia el binario CLI a través de stdio", "flowDiagramCli": "Agente CLI", "flowDiagramCliDesc": "Procesos con autenticación/modelo propio", "fingerprintSettingsHint": "La coincidencia de huellas dactilares CLI (disfrazar solicitudes como herramientas CLI específicas) se puede configurar en", - "settingsRoutingLink": "Configuración/Enrutamiento", - "openSettings": "Configuración", + "settingsRoutingLink": "Ajustes/Enrutamiento", + "openSettings": "Ajustes", "copyRawUrlTitle": "Copiar URL sin formato al portapapeles", "copied": "¡Copiado!", "copyUrl": "Copiar URL", "startHere": "Comience aquí", "badgeNew": "Nuevo", "viewOnGithub": "Ver en GitHub", - "howToUse": "como usar", + "howToUse": "Cómo usar", "browseAllSkillsOnGithub": "Explora todas las habilidades en GitHub", "apiSkills": "Habilidades API", "cliSkills": "Habilidades CLI", @@ -9416,107 +9418,107 @@ "cliSkillsSubtitle": "{count} habilidades — controla OmniRoute a través del binario omniroute de terminal", "howToUseStep1": "Haz clic en {copyUrl} en la habilidad que deseas que tu agente conozca.", "howToUseStep2": "En tu agente de IA (Claude, Cursor, Cline…), dile:", - "howToUseStep2Code": "Utiliza la habilidad en [url-pegada]", - "howToUseStep3": "The agent fetches the SKILL.md and learns OmniRoute's API or CLI — no manual docs needed." + "howToUseStep2Code": "Usa la skill en [pasted-url]", + "howToUseStep3": "El agente obtiene el SKILL.md y aprende la API o CLI de OmniRoute; no se necesita documentación manual." }, "cloudAgents": { - "title": "Agentes de la nube", - "description": "Gestionar agentes de codificación autónomos (Jules, Devin, Codex Cloud)", + "title": "Agentes en la nube", + "description": "Gestiona agentes de codificación autónomos (Jules, Devin, Codex Cloud)", "loading": "Cargando tareas...", "aboutTitle": "Acerca de los agentes en la nube", - "aboutDescription": "Los agentes de la nube son asistentes remotos de codificación de IA que pueden ejecutar tareas de forma autónoma. Funcionan de manera diferente a los agentes CLI locales: usted interactúa con ellos a través de la API de OmniRoute.", + "aboutDescription": "Los agentes en la nube son asistentes de codificación de IA remotos que pueden ejecutar tareas de forma autónoma. Funcionan de manera diferente a los agentes CLI locales: interactúas con ellos a través de la API de OmniRoute.", "howItWorksTitle": "Cómo funciona:", - "howItWorksDesc": "Cree una tarea → El agente analiza y propone un plan → Usted aprueba → El agente ejecuta → Resultados devueltos", + "howItWorksDesc": "Crear una tarea → El agente analiza y propone un plan → Tú apruebas → El agente ejecuta → Se devuelven los resultados", "newTaskTitle": "Crear nueva tarea", "newTaskDescription": "Iniciar una nueva tarea con un agente en la nube", - "selectAgent": "Seleccionar Agente", + "selectAgent": "Seleccionar agente", "taskDescription": "Descripción de la tarea", "taskDescriptionPlaceholder": "Describe lo que quieres que haga el agente...", "startTask": "Iniciar tarea", "tasks": "Tareas", "taskDetail": "Detalle de la tarea", - "noTasks": "Aún no hay tareas. Crea uno para comenzar.", + "noTasks": "Aún no hay tareas. Crea una para comenzar.", "noTasksTitle": "Aún no hay tareas", "noTasksDesc": "Crea tu primera tarea para empezar.", "tasksTab": "Tareas", "agentsTab": "Agentes", - "settingsTab": "Configuración", - "agentsEnabled": "Enabled", - "agentsDisabled": "Disabled", - "filterAllProviders": "All Providers", - "filterAll": "All", - "autoRefreshing": "Auto-refreshing", - "viewPR": "View Pull Request", - "connected": "Connected", - "notConnected": "Not connected", - "configure": "Configure", - "settingsTitle": "Cloud Agent Settings", - "settingsDesc": "Configure local preferences for cloud agents.", - "settingEnableAgents": "Enable cloud agents", - "settingEnableAgentsDesc": "Allow OmniRoute to orchestrate autonomous coding agents.", - "settingAutoPR": "Auto-create PR", - "settingAutoPRDesc": "When a task is completed, automatically create a Pull Request with the changes.", - "settingRequireApproval": "Require plan approval", - "settingRequireApprovalDesc": "Always wait for manual approval before an agent executes a proposed plan.", + "settingsTab": "Ajustes", + "agentsEnabled": "Activado", + "agentsDisabled": "Desactivado", + "filterAllProviders": "Todos los proveedores", + "filterAll": "Todos", + "autoRefreshing": "Actualización automática", + "viewPR": "Ver Pull Request", + "connected": "Conectado", + "notConnected": "No conectado", + "configure": "Configurar", + "settingsTitle": "Ajustes del agente en la nube", + "settingsDesc": "Configura las preferencias locales para los agentes en la nube.", + "settingEnableAgents": "Habilitar agentes en la nube", + "settingEnableAgentsDesc": "Permitir que OmniRoute orqueste agentes de codificación autónomos.", + "settingAutoPR": "Crear PR automáticamente", + "settingAutoPRDesc": "Cuando se complete una tarea, crea automáticamente un Pull Request con los cambios.", + "settingRequireApproval": "Requerir aprobación del plan", + "settingRequireApprovalDesc": "Esperar siempre la aprobación manual antes de que un agente ejecute un plan propuesto.", "untitledTask": "Tarea sin título", "created": "Creado", "conversation": "Conversación", "result": "Resultado", - "error": "error", + "error": "Error", "planReady": "Plan listo para aprobación", "approvePlan": "Aprobar plan", "rejectPlan": "Rechazar y cancelar", "sendMessagePlaceholder": "Envía un mensaje al agente...", "cancel": "Cancelar", "delete": "Eliminar", - "selectTaskPrompt": "Seleccione una tarea para ver los detalles", + "selectTaskPrompt": "Selecciona una tarea para ver los detalles", "statusPending": "Pendiente", - "statusRunning": "corriendo", + "statusRunning": "En ejecución", "statusWaitingApproval": "Esperando aprobación", "statusCompleted": "Completado", "statusFailed": "Fallido", "statusCancelled": "Cancelado", "repositoryName": "Nombre del repositorio", "repositoryUrl": "URL del repositorio", - "branch": "Sucursal", + "branch": "Rama", "agentDescriptions": { - "jules": "Google's autonomous coding agent", - "devin": "Cognition's AI software engineer", - "codexCloud": "OpenAI's cloud-based coding agent", - "cursorCloud": "Cursor's Background / Cloud Agents (official API key)" + "jules": "Agente de codificación autónomo de Google", + "devin": "Ingeniero de software de IA de Cognition", + "codexCloud": "Agente de codificación basado en la nube de OpenAI", + "cursorCloud": "Agentes de fondo / en la nube de Cursor (clave de API oficial)" }, "activityTypes": { "plan": "Plan", - "command": "Command", - "code_change": "Code change", - "message": "Message", + "command": "Comando", + "code_change": "Cambio de código", + "message": "Mensaje", "error": "Error", - "completion": "Completion" + "completion": "Finalización" } }, "templateNames": { - "simple-chat": "Simple Chat", + "simple-chat": "Chat simple", "streaming": "Streaming", "system-prompt": "System Prompt", - "thinking": "Thinking", - "tool-calling": "Tool Calling", - "multi-turn": "Multi-turn", + "thinking": "Razonamiento", + "tool-calling": "Llamada a herramientas", + "multi-turn": "Multiturno", "vision": "Visión", "schema-coercion": "Coerción de esquema" }, "templateDescriptions": { - "simple-chat": "Basic chat template", - "streaming": "Streaming template", - "system-prompt": "System prompt template", - "thinking": "Thinking template", - "tool-calling": "Tool calling template", - "multi-turn": "Multi-turn template", - "vision": "Plantilla multimodal con entrada de imagen.", - "schema-coercion": "Aplicación de esquema JSON/salida estructurada" + "simple-chat": "Plantilla de chat básica con mensaje del sistema", + "streaming": "Plantilla para respuestas en streaming", + "system-prompt": "Plantilla con system prompt personalizado", + "thinking": "Plantilla con presupuesto de razonamiento/pensamiento", + "tool-calling": "Plantilla para llamadas a herramientas/funciones", + "multi-turn": "Plantilla para conversaciones multi-turn", + "vision": "Plantilla multimodal con entrada de imagen", + "schema-coercion": "Aplicación de esquema JSON / salida estructurada" }, "templatePayloads": { "simpleChat": { - "system": "Eres un útil asistente de IA.", + "system": "Eres un asistente de IA útil.", "userGreeting": "¡Hola! ¿Cómo puedo ayudarte hoy?" }, "streaming": { @@ -9524,174 +9526,174 @@ }, "systemPrompt": { "question": "¿Cuál es el significado de la vida?", - "systemInstruction": "Proporcione una respuesta reflexiva y filosófica." + "systemInstruction": "Proporciona una respuesta reflexiva y filosófica." }, "thinking": { - "question": "Explicar la computación cuántica" + "question": "Explica la computación cuántica" }, "toolCalling": { - "cityNameDescription": "El nombre de la ciudad para obtener el clima.", - "toolDescription": "Obtener el clima actual para una ubicación", + "cityNameDescription": "El nombre de la ciudad para obtener el clima", + "toolDescription": "Obtener el clima actual de una ubicación", "userWeather": "¿Cuál es el clima en Tokio?" }, "multiTurn": { "system": "Eres un asistente útil.", "assistantExample": "Estaré encantado de ayudarte con eso.", - "userInitial": "necesito ayuda con", + "userInitial": "Necesito ayuda con", "userFollowUp": "¿Puedes dar más detalles sobre eso?" } }, "cache": { - "title": "Cache Management", - "description": "Monitor and manage semantic response cache, hit rates, and token savings.", - "refresh": "Refresh", - "clearAll": "Clear All", - "memoryEntries": "Memory Entries", - "memoryEntriesSub": "In-memory LRU", - "dbEntries": "DB Entries", - "dbEntriesSub": "Persisted (SQLite)", - "cacheHits": "Cache Hits", - "cacheHitsSub": "of {total} total", - "tokensSaved": "Tokens Saved", - "tokensSavedSub": "Estimated from hits", - "hitRate": "Hit Rate", - "performance": "Cache Performance", - "autoRefresh": "Auto-refreshes every {seconds}s", - "hits": "Hits", - "misses": "Misses", + "title": "Gestión de caché", + "description": "Monitoriza la eficiencia del prompt cache del proveedor y la reutilización de respuestas semánticas locales.", + "refresh": "Actualizar", + "clearAll": "Borrar caché semántica", + "memoryEntries": "Entradas en memoria", + "memoryEntriesSub": "LRU en memoria", + "dbEntries": "Entradas en BD", + "dbEntriesSub": "Persistente (SQLite)", + "cacheHits": "Aciertos de caché", + "cacheHitsSub": "de {total} en total", + "tokensSaved": "Tokens ahorrados", + "tokensSavedSub": "Estimado a partir de aciertos", + "hitRate": "Tasa de aciertos", + "performance": "Rendimiento de caché", + "autoRefresh": "Se actualiza automáticamente cada {seconds}s", + "hits": "Aciertos", + "misses": "Fallos", "total": "Total", - "behavior": "Cache Behavior", - "behaviorDeterministic": "Only non-streaming requests with temperature=0 are cached.", - "behaviorBypass": "Bypass with header {header}.", - "behaviorTwoTier": "Two-tier storage: in-memory LRU (fast) + SQLite (persistent across restarts).", - "behaviorTtl": "Default TTL: 30 minutes. Configure via {envVar}.", - "idempotency": "Idempotency Layer", - "activeDedupKeys": "Active Dedup Keys", - "dedupWindow": "Dedup Window", - "clearSuccess": "Cache cleared. {count} expired entries removed.", - "clearError": "Failed to clear cache.", - "unavailable": "Cache unavailable", - "unavailableDesc": "Could not fetch cache statistics. Make sure the server is running.", + "behavior": "Comportamiento de la caché", + "behaviorDeterministic": "Solo se almacenan en caché las solicitudes que no son de streaming con temperature=0.", + "behaviorBypass": "Omitir con la cabecera {header}.", + "behaviorTwoTier": "Almacenamiento de dos niveles: LRU en memoria (rápido) + SQLite (persistente tras reinicios).", + "behaviorTtl": "TTL predeterminado: 30 minutos. Configurar mediante {envVar}.", + "idempotency": "Capa de idempotencia", + "activeDedupKeys": "Claves de deduplicación activas", + "dedupWindow": "Ventana de deduplicación", + "clearSuccess": "Caché semántica borrada. Se eliminaron {count} entradas.", + "clearError": "Error al borrar la caché.", + "unavailable": "Caché no disponible", + "unavailableDesc": "No se pudieron obtener las estadísticas de la caché. Asegúrate de que el servidor esté en ejecución.", "loadingCacheAria": "Cargando caché", - "promptCache": "Prompt Cache (Provider-Side)", - "semanticCache": "Semantic Cache", - "promptCacheSectionDesc": "Shows provider-side prompt caching activity from usage history so you can see where cache control is active and how much input reuse you are getting.", - "promptTrendDesc": "Hourly request volume, cache coverage, and cache read volume across the last 24 hours.", - "cachedRequests": "Cached Requests", - "cachedRequests24h": "Cached Requests (24h)", - "cacheHitRate": "Cache Hit Rate", - "cacheRate": "Cache Rate", - "cacheRateDesc": "of total requests", - "cachedTokens": "Cached Tokens", - "cacheCreationTokens": "Cache Creation Tokens", - "cacheMetrics": "Prompt Cache Metrics", - "withCacheControl": "With Cache Control", - "cachedTokensRead": "Cached Tokens (Read)", - "cacheCreationWrite": "Cache Creation (Write)", - "cacheReuseRatio": "Cache Reuse Ratio", - "cacheReuseRatioDesc": "Cached tokens / Total input tokens", - "estCostSaved": "Est. Cost Saved", - "lastUpdated": "Last updated", - "hoursTracked": "hours tracked", - "busiestHour": "Busiest Hour", - "peakCacheRate": "Peak Cache Rate", - "trendHour": "Hour", - "activityVolume": "Activity", - "requestsShort": "reqs", - "inputShort": "In", - "cachedShort": "Cached", - "writeShort": "Write", - "resetting": "Resetting...", - "resetMetrics": "Reset Metrics", - "byProvider": "Breakdown by Provider", - "providerCacheRateDesc": "Each provider exposes total input tokens, cache read tokens, and cache write tokens so you can verify the reuse ratio against raw totals.", - "provider": "Provider", - "requests": "Requests", - "inputTokens": "Input Tokens", - "cachedTokensCol": "Cached", - "cacheCreation": "Creation", - "trend24h": "Cache Trend (24h)", - "peakCached": "Peak cached", - "cached": "Cached", - "overview": "Overview", + "promptCache": "Prompt Cache (lado del proveedor)", + "semanticCache": "Caché semántica", + "promptCacheSectionDesc": "Muestra la actividad de prompt caching del lado del proveedor a partir del historial de uso para que puedas ver dónde está activo el control de caché y cuánto uso de entrada estás obteniendo.", + "promptTrendDesc": "Volumen de solicitudes por hora, cobertura de caché y volumen de lectura de caché en las últimas 24 horas.", + "cachedRequests": "Solicitudes en caché", + "cachedRequests24h": "Solicitudes en caché (24h)", + "cacheHitRate": "Tasa de aciertos de caché", + "cacheRate": "Tasa de caché", + "cacheRateDesc": "del total de solicitudes", + "cachedTokens": "Tokens de lectura de caché", + "cacheCreationTokens": "Tokens de creación de caché", + "cacheMetrics": "Métricas de Prompt Cache", + "withCacheControl": "Con control de caché", + "cachedTokensRead": "Leído de la caché", + "cacheCreationWrite": "Escrito en la caché", + "cacheReuseRatio": "Ratio de reutilización de caché", + "cacheReuseRatioDesc": "Tokens leídos de caché / Total de tokens de entrada", + "estCostSaved": "Coste estimado ahorrado", + "lastUpdated": "Última actualización", + "hoursTracked": "horas registradas", + "busiestHour": "Hora más activa", + "peakCacheRate": "Tasa máxima de caché", + "trendHour": "Hora", + "activityVolume": "Actividad", + "requestsShort": "solicit", + "inputShort": "Entrada", + "cachedShort": "En caché", + "writeShort": "Escritura", + "resetting": "Restableciendo...", + "resetMetrics": "Restablecer métricas", + "byProvider": "Desglose por proveedor", + "providerCacheRateDesc": "Cada proveedor expone los tokens de entrada totales, los tokens de lectura en caché y los tokens de escritura en caché para que puedas verificar la tasa de reutilización frente a los totales sin procesar.", + "provider": "Proveedor", + "requests": "Solicitudes", + "inputTokens": "Tokens de entrada totales", + "cachedTokensCol": "Lectura en caché", + "cacheCreation": "Escritura en caché", + "trend24h": "Tendencia de caché (24h)", + "peakCached": "Máximo en caché", + "cached": "En caché", + "overview": "Resumen", "tableProvider": "Proveedor", "tableModel": "Modelo", "performanceTitle": "Rendimiento", - "semanticCacheSectionDesc": "OmniRoute's own deterministic response cache. When enabled, repeated non-streaming temperature=0 requests can be served locally without hitting the upstream provider.", - "semanticCacheDisabledDesc": "Semantic cache is disabled. OmniRoute will skip local response reuse until you turn it back on in Settings.", - "semanticEntriesDesc": "Persisted semantic cache records currently stored in SQLite. Provider-side prompt cache activity is not listed here.", - "searchEntries": "Search entries...", - "search": "Search", - "loading": "Loading...", - "entriesLoadError": "Failed to load semantic cache entries.", - "noEntries": "No cache entries found", - "noPromptCacheData": "No provider-side prompt cache activity has been recorded yet.", - "noTrendData": "No prompt cache activity has been recorded over the last 24 hours.", - "signature": "Signature", - "model": "Model", - "created": "Created", - "expires": "Expires", - "actions": "Actions", - "deduplicatedRequests": "Deduplicated Requests", - "savedCalls": "Saved API Calls", - "totalProcessed": "Total Requests Processed", - "disabled": "Disabled", - "totalRequests": "Total Requests", + "semanticCacheSectionDesc": "El caché de respuestas deterministas propio de OmniRoute. Cuando está habilitado, las solicitudes repetidas sin streaming con temperature=0 se pueden servir localmente sin contactar con el proveedor de origen.", + "semanticCacheDisabledDesc": "El caché semántico está deshabilitado. OmniRoute omitirá la reutilización de respuestas locales hasta que lo vuelvas a activar en los ajustes.", + "semanticEntriesDesc": "Registros de caché semántico persistentes almacenados actualmente en SQLite. La actividad de caché de prompt del lado del proveedor no se muestra aquí.", + "searchEntries": "Buscar entradas...", + "search": "Buscar", + "loading": "Cargando...", + "entriesLoadError": "No se pudieron cargar las entradas del caché semántico.", + "noEntries": "No se encontraron entradas en el caché", + "noPromptCacheData": "Aún no se ha registrado actividad de caché de prompt del lado del proveedor.", + "noTrendData": "No se ha registrado actividad de caché de prompt en las últimas 24 horas.", + "signature": "Firma", + "model": "Modelo", + "created": "Creado", + "expires": "Expira", + "actions": "Acciones", + "deduplicatedRequests": "Solicitudes deduplicadas", + "savedCalls": "Llamadas de API guardadas", + "totalProcessed": "Solicitudes totales procesadas", + "disabled": "Deshabilitado", + "totalRequests": "Solicitudes totales", "reasoningCache": "Repetición de razonamiento", - "reasoningCacheDesc": "Preserva el pensamiento de modelo para flujos de llamada de herramientas de múltiples vueltas", + "reasoningCacheDesc": "Preserva el pensamiento del modelo para flujos de llamadas a herramientas de múltiples turnos", "reasoningEntries": "Entradas activas", - "reasoningReplayRate": "Tasa de reproducción", + "reasoningReplayRate": "Tasa de repetición", "reasoningReplays": "Repeticiones totales", - "reasoningCharsCached": "Personajes almacenados en caché", - "reasoningMisses": "Errores de caché", + "reasoningCharsCached": "Caracteres en caché", + "reasoningMisses": "Fallos de caché", "reasoningByProvider": "Por proveedor", "reasoningByModel": "Por modelo", "reasoningRecentEntries": "Entradas recientes", "reasoningToolCallId": "ID de llamada de herramienta", - "reasoningChars": "Personajes", - "reasoningAge": "edad", + "reasoningChars": "Caracteres", + "reasoningAge": "Antigüedad", "reasoningView": "Ver", "reasoningDetail": "Contenido de razonamiento", "reasoningBehavior": "Comportamiento", - "reasoningBehaviorCapture": "Captura contenido_razonamiento de las respuestas en tiempo real", - "reasoningBehaviorReplay": "Se reinyecta en el siguiente turno cuando el cliente lo omite.", - "reasoningBehaviorFallback": "Memoria primero con respaldo de SQLite para recuperación de fallas", - "reasoningBehaviorTtl": "TTL: 2 horas | Entradas máximas: 2000 (memoria)", - "reasoningBehaviorModels": "Compatible: DeepSeek, Kimi, Qwen-Thinking, GLM", + "reasoningBehaviorCapture": "Captura reasoning_content de las respuestas en streaming", + "reasoningBehaviorReplay": "Se reinyecta en el siguiente turno cuando el cliente lo omite", + "reasoningBehaviorFallback": "Memoria principal con respaldo de SQLite para recuperación ante fallos", + "reasoningBehaviorTtl": "TTL: 2 horas | Entradas máx.: 2000 (memoria)", + "reasoningBehaviorModels": "Compatibles: DeepSeek, Kimi, Qwen-Thinking, GLM", "reasoningClearAll": "Borrar caché de razonamiento", - "reasoningClearSuccess": "Se borraron {count} entradas de caché de razonamiento", + "reasoningClearSuccess": "Se borraron {count} entradas del caché de razonamiento", "reasoningClearError": "No se pudo borrar el caché de razonamiento", - "reasoningNoData": "Aún no hay entradas de razonamiento almacenadas en caché. Las entradas aparecen cuando los modelos mentales utilizan la llamada de herramientas.", + "reasoningNoData": "Aún no hay entradas de razonamiento en caché. Las entradas aparecen cuando los modelos de razonamiento utilizan llamadas a herramientas.", "cachePerformanceRetry": "Reintentar", "cachePerformanceHitRate": "Tasa de aciertos", - "cachePerformanceAvgLatency": "Latencia promedio (ms)", - "cachePerformanceP95Latency": "p95 Latencia (ms)", + "cachePerformanceAvgLatency": "Latencia media (ms)", + "cachePerformanceP95Latency": "Latencia p95 (ms)", "retry": "Reintentar", - "reasoningAvgChars": "Caracteres promedio", + "reasoningAvgChars": "Caracteres medios", "tableShare": "Cuota", - "justNow": "just now", - "minutesAgo": "{minutes}m ago", - "hoursAgo": "{hours}h ago", - "daysAgo": "{days}d ago", - "entries": "Entries" + "justNow": "hace un momento", + "minutesAgo": "hace {minutes}m", + "hoursAgo": "hace {hours}h", + "daysAgo": "hace {days}d", + "entries": "Entradas" }, "proxyConfigModal": { - "levelGlobal": "Mundial", + "levelGlobal": "Global", "levelProvider": "Proveedor", - "levelCombo": "combinado", - "levelKey": "clave", + "levelCombo": "Combinado", + "levelKey": "Clave", "levelDirect": "Directo (sin proxy)", "titleGlobal": "Configuración de proxy global", - "titleLevel": "{level} Proxy — {label}", + "titleLevel": "Proxy de {level} — {label}", "loading": "Cargando configuración de proxy...", "inheritingFrom": "Heredando de", - "source": "Fuente", + "source": "Origen", "savedProxy": "Proxy guardado", - "custom": "personalizado", - "selectSavedProxyPlaceholder": "Seleccione el proxy guardado...", + "custom": "Personalizado", + "selectSavedProxyPlaceholder": "Seleccionar proxy guardado...", "proxyType": "Tipo de proxy", - "host": "Anfitrión", - "hostPlaceholder": "1.2.3.4 o proxy.ejemplo.com", + "host": "Host", + "hostPlaceholder": "1.2.3.4 o proxy.example.com", "port": "Puerto", "authOptional": "Autenticación (opcional)", "username": "Nombre de usuario", @@ -9700,14 +9702,14 @@ "passwordPlaceholder": "Contraseña", "connected": "Conectado", "ip": "IP:", - "connectionFailed": "La conexión falló", - "testConnection": "Conexión de prueba", + "connectionFailed": "Error de conexión", + "testConnection": "Probar conexión", "clear": "Borrar", "cancel": "Cancelar", "save": "Guardar", - "errorSelectSavedProxy": "Primero seleccione un proxy guardado.", - "errorSelectProxyFirst": "Primero seleccione un proxy.", - "errorProxyNotFound": "No se encontró el proxy seleccionado.", + "errorSelectSavedProxy": "Selecciona un proxy guardado primero.", + "errorSelectProxyFirst": "Selecciona un proxy primero.", + "errorProxyNotFound": "No se ha encontrado el proxy seleccionado.", "errorClearSavedProxy": "No se pudo borrar el proxy guardado", "errorSaveProxy": "No se pudo guardar la configuración del proxy", "errorClearProxy": "No se pudo borrar la configuración del proxy", @@ -9716,12 +9718,12 @@ "oauthModal": { "title": "Conectar {providerName}", "waiting": "Esperando autorización", - "completeAuthInPopup": "Autorización completa en ventana emergente.", - "popupClosedHint": "Si la ventana emergente se cerró sin redirigir (por ejemplo, Qoder), este cuadro de diálogo cambiará automáticamente al modo de entrada manual de URL.", - "popupBlocked": "¿Ventana emergente bloqueada? Ingrese la URL manualmente", - "deviceCodeVisitUrl": "Visite la siguiente URL e ingrese el código:", + "completeAuthInPopup": "Completa la autorización en la ventana emergente.", + "popupClosedHint": "Si la ventana emergente se cierra o no puede retransmitir el callback, este diálogo cambiará automáticamente al modo de introducción manual de URL.", + "popupBlocked": "¿Ventana emergente bloqueada? Introduce la URL manualmente", + "deviceCodeVisitUrl": "Visita la siguiente URL e introduce el código:", "deviceCodeVerificationUrl": "URL de verificación", - "deviceCodeYourCode": "tu codigo", + "deviceCodeYourCode": "Tu código", "deviceCodeWaiting": "Esperando autorización...", "googleLoopbackTitle": "__MISSING__:Google sign-in can't complete from this address", "googleLoopbackWhatHappens": "__MISSING__:Google only releases the authorization code once {redirectUri} is reachable from the browser that approves the sign-in. Here that address points at this computer, not at the OmniRoute server — so the consent screen hangs instead of redirecting, and there is no callback URL to copy.", @@ -9730,7 +9732,7 @@ "googleLoopbackTunnelLabel": "__MISSING__:Or forward the dashboard port over SSH and reload OmniRoute through the tunnel:", "googleLoopbackTunnelNote": "__MISSING__:Replace {userPlaceholder} with your SSH username, keep the terminal open, then open {localUrl} and connect again from there.", "googleLoopbackHeadlessAlt": "__MISSING__:For fully headless use with no local callback at all, configure your own Google OAuth credentials plus a public base URL.", - "remoteAccessInfo": "Acceso remoto: dado que accede a OmniRoute de forma remota, después de la autorización verá una página de error (localhost no encontrado). Esto es normal: simplemente copie la URL completa de la barra de direcciones de su navegador y péguela a continuación.", + "remoteAccessInfo": "Acceso remoto: dado que estás accediendo a OmniRoute de forma remota, después de la autorización verás una página de error (localhost no encontrado). Esto es normal; simplemente copia la URL completa de la barra de direcciones de tu navegador y pégala a continuación.", "loopbackMismatchTitle": "__MISSING__:Sign-in can't complete from this address", "loopbackMismatchWhatHappened": "__MISSING__:What's happening", "loopbackMismatchExplanation": "__MISSING__:After you approve the login, {providerName} always sends the browser back to {redirectUri}. That address points at the computer running this browser, not at the OmniRoute server — so the authorization code never reaches OmniRoute and the provider fails the sign-in without showing an error.", @@ -9740,87 +9742,87 @@ "loopbackMismatchStep2": "__MISSING__:In this browser, reopen OmniRoute through the tunnel:", "loopbackMismatchStep3": "__MISSING__:Then connect {providerName} again from the new tab. The callback now reaches the server and the login completes normally.", "loopbackMismatchAlternative": "__MISSING__:No SSH access? If this provider offers a token import tab, connect with a token instead — that path doesn't use a loopback callback.", - "step1OpenUrl": "Paso 1: abre esta URL en tu navegador", + "step1OpenUrl": "Paso 1: Abre esta URL en tu navegador", "copy": "Copiar", - "step2PasteCallback": "Paso 2: pegue aquí la URL de devolución de llamada o el código de autorización", - "step2Hint": "Después de la autorización, pegue la URL de devolución de llamada completa. Para Claude Code y Cline, también puede pegar el código de autenticación directamente, p. código#estado.", + "step2PasteCallback": "Paso 2: Pega aquí la URL de callback o el código de autorización", + "step2Hint": "Tras la autorización, pega la URL de callback completa. Para Claude Code y Cline, también puedes pegar el código de autenticación directamente, p. ej. code#state.", "connect": "Conectar", "cancel": "Cancelar", - "success": "¡Conexión exitosa!", - "successMessage": "Su cuenta {providerName} ha sido conectada.", - "done": "hecho", - "error": "La conexión falló", - "tryAgain": "Inténtalo de nuevo" + "success": "¡Conexión establecida!", + "successMessage": "Tu cuenta de {providerName} se ha conectado.", + "done": "Hecho", + "error": "Error de conexión", + "tryAgain": "Reintentar" }, "cursorAuthModal": { - "title": "Conectar cursor IDE", - "autoDetecting": "Tokens de detección automática...", - "readingFromCursor": "Lectura desde Cursor IDE o cursor-agent", - "tokensAutoDetected": "¡Los tokens se detectaron automáticamente con éxito desde Cursor IDE!", - "cursorNotDetected": "IDE del cursor no detectado. Pegue manualmente su token.", + "title": "Conectar Cursor IDE", + "autoDetecting": "Autodetectando tokens...", + "readingFromCursor": "Leyendo desde Cursor IDE o cursor-agent", + "tokensAutoDetected": "¡Tokens autodetectados correctamente desde Cursor IDE!", + "cursorNotDetected": "No se ha detectado Cursor IDE. Pega tu token manualmente.", "accessToken": "Token de acceso", "required": "*", - "accessTokenPlaceholder": "El token de acceso se completará automáticamente...", + "accessTokenPlaceholder": "El token de acceso se rellenará automáticamente...", "machineId": "ID de máquina", "optional": "(opcional)", - "machineIdPlaceholder": "La identificación de la máquina se completará automáticamente...", + "machineIdPlaceholder": "El ID de máquina se rellenará automáticamente...", "importing": "Importando...", "importToken": "Importar token", "cancel": "Cancelar", - "errorAutoDetect": "No se pueden detectar tokens automáticamente", - "errorAutoDetectFailed": "Error de detección automática de tokens", - "errorEnterToken": "Por favor ingrese el token de acceso", - "errorImportFailed": "Importación fallida" + "errorAutoDetect": "No se han podido autodetectar los tokens", + "errorAutoDetectFailed": "La autodetección de tokens ha fallado", + "errorEnterToken": "Introduce el token de acceso", + "errorImportFailed": "Error al importar" }, "pricingModal": { "title": "Configuración de precios", "loading": "Cargando datos de precios...", "pricingRatesFormat": "Formato de tarifas de precios", - "ratesDescription": "Todas las tarifas están en dólares por millón de tokens ($/1 millón de tokens). Ejemplo: la tasa de entrada de 2,50 significa 2,50 dólares por cada 1.000.000 de tokens de entrada.", - "model": "modelo", + "ratesDescription": "Todas las tarifas están en dólares por millón de tokens ($/1M tokens). Ejemplo: una tarifa de entrada de 2,50 significa 2,50 $ por cada 1 000 000 de tokens de entrada.", + "model": "Modelo", "input": "Entrada", "output": "Salida", "cached": "En caché", "reasoning": "Razonamiento", "cacheCreation": "Creación de caché", "noPricingData": "No hay datos de precios disponibles", - "resetToDefaults": "Restablecer los valores predeterminados", + "resetToDefaults": "Restaurar valores predeterminados", "cancel": "Cancelar", "saving": "Guardando...", "saveChanges": "Guardar cambios", - "resetConfirm": "¿Restablecer todos los precios a los valores predeterminados? Esto no se puede deshacer.", - "errorSaveFailed": "No se pudo guardar el precio", - "errorResetFailed": "No se pudo restablecer el precio" + "resetConfirm": "¿Restaurar todos los precios a los valores predeterminados? Esta acción no se puede deshacer.", + "errorSaveFailed": "No se pudieron guardar los precios", + "errorResetFailed": "No se pudieron restablecer los precios" }, "proxyRegistry": { - "selectAllProxies": "Select all proxies", - "selectProxy": "Select {name}", - "title": "Title", - "description": "Description", - "importLegacy": "Import Legacy", - "bulkAssign": "Bulk Assign", - "addProxy": "Add Proxy", - "loading": "Loading", - "noProxies": "No Proxies", - "tableName": "Table Name", - "tableEndpoint": "Table Endpoint", - "tableStatus": "Table Status", - "tableHealth": "Table Health", - "tableUsage": "Table Usage", - "tableActions": "Table Actions", - "test": "Test", - "edit": "Edit", - "delete": "Delete", - "modalCreateTitle": "Modal Create Title", - "modalEditTitle": "Modal Edit Title", - "labelName": "Label Name", + "selectAllProxies": "Seleccionar todos los proxies", + "selectProxy": "Seleccionar {name}", + "title": "Registro de proxy", + "description": "Almacena proxies reutilizables y realiza un seguimiento de las asignaciones.", + "importLegacy": "Importar legado", + "bulkAssign": "Asignación masiva", + "addProxy": "Añadir proxy", + "loading": "Cargando proxies...", + "noProxies": "Aún no hay proxies guardados.", + "tableName": "Nombre", + "tableEndpoint": "Endpoint", + "tableStatus": "Estado", + "tableHealth": "Salud (24h)", + "tableUsage": "Uso", + "tableActions": "Acciones", + "test": "Probar", + "edit": "Editar", + "delete": "Eliminar", + "modalCreateTitle": "Crear proxy", + "modalEditTitle": "Editar proxy", + "labelName": "Nombre", "labelType": "Tipo", - "labelFamily": "IP family", + "labelFamily": "Familia IP", "familyAuto": "Auto (dual-stack)", - "familyIpv4": "IPv4 only", - "familyIpv6": "IPv6 only", - "familyHint": "Egress address family. Auto keeps dual-stack; IPv4/IPv6 pin this proxy to that family (prevents a v4 leak under an IPv6-only proxy).", - "labelHost": "Anfitrión", + "familyIpv4": "Solo IPv4", + "familyIpv6": "Solo IPv6", + "familyHint": "Familia de direcciones de salida. Auto mantiene dual-stack; IPv4/IPv6 fija este proxy a esa familia (evita una fuga de v4 bajo un proxy solo IPv6).", + "labelHost": "Host", "labelPort": "Puerto", "labelUsername": "Nombre de usuario", "labelPassword": "Contraseña", @@ -9833,12 +9835,12 @@ "statusInactive": "Inactivo", "cancel": "Cancelar", "save": "Guardar", - "bulkModalTitle": "Asignación de proxy masiva", - "bulkLabelScope": "Alcance", - "bulkLabelProxy": "apoderado", - "bulkClearAssignment": "(Borrar tarea)", - "bulkLabelScopeIds": "ID de alcance (separados por comas o nueva línea)", - "bulkScopeIdsPlaceholder": "proveedor-openai,proveedor-antrópico", + "bulkModalTitle": "Asignación masiva de proxies", + "bulkLabelScope": "Ámbito", + "bulkLabelProxy": "Proxy", + "bulkClearAssignment": "(Borrar asignación)", + "bulkLabelScopeIds": "ID de ámbito (separados por comas o nueva línea)", + "bulkScopeIdsPlaceholder": "proveedor-openai,proveedor-anthropic", "bulkApply": "Aplicar", "labelScope": "Ámbito", "labelProxy": "Proxy", @@ -9846,476 +9848,476 @@ "scopeProvider": "proveedor", "scopeAccount": "cuenta", "scopeCombo": "combo", - "bulkImportErrorMissingName": "Falta NOMBRE", - "bulkImportErrorMissingHost": "Anfitrión faltante", + "bulkImportErrorMissingName": "Falta el NOMBRE", + "bulkImportErrorMissingHost": "Falta el HOST", "bulkImportErrorInvalidPort": "PUERTO no válido (debe ser 1-65535)", - "bulkImportErrorInvalidType": "TIPO no válido (use http, https o calcetines5)", - "bulkImportErrorInvalidStatus": "ESTADO no válido (usar activo o inactivo)", - "errorLoadFailed": "Error Load Failed", - "errorNameHostRequired": "Error Name Host Required", - "errorSaveFailed": "Error Save Failed", - "errorDeleteFailed": "Error Delete Failed", - "errorForceDeleteConfirm": "Error Force Delete Confirm", - "errorMigrateFailed": "Error Migrate Failed", - "errorBulkFailed": "Error Bulk Failed", + "bulkImportErrorInvalidType": "TIPO no válido (use http, https o socks5)", + "bulkImportErrorInvalidStatus": "ESTADO no válido (use active o inactive)", + "errorLoadFailed": "Error al cargar el registro de proxies", + "errorNameHostRequired": "El nombre y el host son obligatorios", + "errorSaveFailed": "Error al guardar el proxy", + "errorDeleteFailed": "Error al eliminar el proxy", + "errorForceDeleteConfirm": "Este proxy sigue asignado. ¿Forzar eliminación y eliminar todas las asignaciones?", + "errorMigrateFailed": "Error al migrar la configuración de proxy heredada", + "errorBulkFailed": "Error al ejecutar la asignación masiva", "success": "✓", "failure": "✗", - "failed": "Failed", + "failed": "Fallido", "successRate": "{rate}% de éxito", "avgLatency": "{latency}ms promedio", - "assignmentsCount": "{count} tareas", - "noData": "No Data", + "assignmentsCount": "{count} asignaciones", + "noData": "—", "testSuccess": "✓ {ip}", "testLatency": "{latency}ms", "testFailure": "✗ {error}", - "repair": "Repair", - "relayAuthMissing": "auth missing", - "relayRepairTooltip": "Recover relay auth in place. If the token is unrecoverable (e.g. after a STORAGE_ENCRYPTION_KEY rotation), redeploy the relay instead.", - "relayRepairRedeployRequired": "Relay auth is unrecoverable — redeploy the relay to write a fresh token.", - "relayRepairFailed": "Relay repair failed", - "relayRepairError": "repair failed", - "relayProbeSummary": "Relay probes: {alive}/{tested} alive", + "repair": "Reparar", + "relayAuthMissing": "falta la autenticación", + "relayRepairTooltip": "Recuperar la autenticación del relay in situ. Si el token es irrecuperable (p. ej., tras una rotación de STORAGE_ENCRYPTION_KEY), vuelva a desplegar el relay.", + "relayRepairRedeployRequired": "La autenticación del relay es irrecuperable: vuelva a desplegar el relay para escribir un nuevo token.", + "relayRepairFailed": "Error al reparar el relay", + "relayRepairError": "error de reparación", + "relayProbeSummary": "Sondas de relay: {alive}/{tested} activas", "bulkImport": "Importación masiva", - "bulkImportTitle": "Proxies de importación masiva", - "bulkImportDescription": "Pegue perfiles de proxy utilizando el formato delimitado por barras verticales. Un proxy por línea. Se actualizarán los servidores proxy existentes (mismo host + puerto).", - "bulkImportParse": "analizar", - "bulkImportImport": "Importar proxies {count}", + "bulkImportTitle": "Importar proxies masivamente", + "bulkImportDescription": "Pegue los perfiles de proxy, uno por línea. Formatos admitidos: delimitado por barras verticales (NOMBRE|HOST|PUERTO|…), abreviado (ip:puerto, ip:puerto:usuario:contraseña, usuario:contraseña@ip:puerto, usuario:contraseña:ip:puerto, protocolo://ip:puerto, protocolo://usuario:contraseña@ip:puerto) o modo de cabecera de protocolo (el protocolo base en la primera línea se aplica a las líneas abreviadas siguientes). Los proxies existentes (mismo host + puerto) se actualizarán.", + "bulkImportParse": "Analizar", + "bulkImportImport": "Importar {count} proxies", "bulkImportImporting": "Importando...", "bulkImportParsed": "{count} proxies analizados", "bulkImportSkipped": "{count} líneas omitidas", "bulkImportParseErrors": "{count} errores", - "bulkImportNoValidEntries": "No se encontraron entradas válidas. Comprueba el formato y vuelve a intentarlo.", - "bulkImportSuccess": "Importación completa: {created} creado, {updated} actualizado, {failed} fallido", + "bulkImportNoValidEntries": "No se encontraron entradas válidas. Compruebe el formato e inténtelo de nuevo.", + "bulkImportSuccess": "Importación completa: {created} creados, {updated} actualizados, {failed} fallidos", "bulkImportErrorLine": "Línea {line}: {reason}", - "bulkImportMaxExceeded": "Máximo 100 proxies por importación", + "bulkImportMaxExceeded": "Máximo de 100 proxies por importación", "bulkImportPreview": "Vista previa", - "clearAssignment": "(asignación clara)", - "bulkProxyAssignment": "Asignación de proxy masiva", - "testAll": "Test All", - "errorTestFailed": "Failed to test proxies", - "batchSelectedCount": "{count} selected", - "batchDeleteSelected": "Delete {count} selected", - "batchActivateSelected": "Enable {count} selected", + "clearAssignment": "(borrar asignación)", + "bulkProxyAssignment": "Asignación masiva de proxies", + "testAll": "Probar todos", + "errorTestFailed": "Error al probar los proxies", + "batchSelectedCount": "{count} seleccionados", + "batchDeleteSelected": "Eliminar {count} seleccionados", + "batchActivateSelected": "Activar {count} seleccionados", "testPassed": "✓ OK", - "close": "Close", - "managePool": "Manage Pool", - "poolTitle": "Proxy Pool & Rotation", - "poolDescription": "Attach multiple proxies to a scope and rotate egress IPs across them. A scope with a single proxy behaves exactly like a plain assignment.", - "poolScopeIdLabel": "Scope ID", - "poolScopeIdPlaceholder": "provider id / connection id / combo id", - "poolScopeIdRequired": "A scope ID is required for provider, account, or combo scope.", - "poolLoad": "Load Pool", - "poolLoadFailed": "Failed to load the proxy pool", - "poolStrategyLabel": "Rotation strategy", - "poolStrategyHint": "round-robin cycles members in order; random picks uniformly; sticky holds one member for a window; latency-optimized picks the fastest based on logs.", - "poolStrategyFailed": "Failed to update the rotation strategy", + "close": "Cerrar", + "managePool": "Gestionar pool", + "poolTitle": "Pool de proxies y rotación", + "poolDescription": "Adjunte varios proxies a un ámbito y rote las IP de salida entre ellos. Un ámbito con un solo proxy se comporta exactamente igual que una asignación simple.", + "poolScopeIdLabel": "ID de ámbito", + "poolScopeIdPlaceholder": "id de proveedor / id de conexión / id de combo", + "poolScopeIdRequired": "Se requiere un ID de ámbito para el ámbito de proveedor, cuenta o combo.", + "poolLoad": "Cargar pool", + "poolLoadFailed": "Error al cargar el pool de proxies", + "poolStrategyLabel": "Estrategia de rotación", + "poolStrategyHint": "round-robin alterna los miembros en orden; random elige uniformemente; sticky mantiene un miembro durante un periodo; latency-optimized elige el más rápido según los logs.", + "poolStrategyFailed": "Error al actualizar la estrategia de rotación", "strategyRoundRobin": "Round-robin", - "strategyRandom": "Random", - "strategySticky": "Sticky", - "strategyLatency": "Latency-optimized", - "poolMembersLabel": "Pool members ({count})", - "poolNoMembers": "No proxies in this pool yet.", - "poolRemove": "Remove", - "poolRemoveFailed": "Failed to remove the proxy from the pool", - "poolAddLabel": "Add a proxy", - "poolAddMember": "Add", - "poolAddFailed": "Failed to add the proxy to the pool", - "poolSelectProxy": "Select a proxy…", - "poolSaveFailed": "Failed to save pool assignment" + "strategyRandom": "Aleatorio", + "strategySticky": "Fijo (sticky)", + "strategyLatency": "Optimizado por latencia", + "poolMembersLabel": "Miembros del pool ({count})", + "poolNoMembers": "Aún no hay proxies en este pool.", + "poolRemove": "Eliminar", + "poolRemoveFailed": "Error al eliminar el proxy del pool", + "poolAddLabel": "Añadir un proxy", + "poolAddMember": "Añadir", + "poolAddFailed": "Error al añadir el proxy al pool", + "poolSelectProxy": "Seleccionar un proxy...", + "poolSaveFailed": "Error al guardar la asignación del pool" }, "playground": { - "title": "Title", - "description": "Description", + "title": "Playground de modelos", + "description": "Pruebe cualquier modelo directamente desde el panel. Seleccione el proveedor, el modelo y el tipo de endpoint, luego envíe una solicitud para ver la respuesta sin procesar.", "endpoint": "Endpoint", - "provider": "Provider", - "model": "Model", - "accountKey": "Account Key", + "provider": "Proveedor", + "model": "Modelo", + "accountKey": "Cuenta / Clave", "autoAccounts": "Automático ({count} cuentas)", - "noAccounts": "No Accounts", - "send": "Send", - "cancel": "Cancel", - "audioFile": "Audio File", - "attachImages": "Attach Images", - "multipartFormData": "Multipart Form Data", - "upToImages": "Up To Images", - "selectAudioFile": "Select Audio File", - "clearAll": "Clear All", - "request": "Request", - "response": "Response", - "transcription": "Transcription", - "copy": "Copy", - "resetToDefault": "Reset To Default", - "downloadAudio": "Download Audio", - "copyText": "Copy Text", - "transcriptionHint": "Transcription Hint", + "noAccounts": "Sin cuentas", + "send": "Enviar", + "cancel": "Cancelar", + "audioFile": "Archivo de audio", + "attachImages": "Adjuntar imágenes (Visión)", + "multipartFormData": "multipart/form-data", + "upToImages": "Hasta 4 imágenes", + "selectAudioFile": "Seleccionar archivo de audio para transcripción (mp3, wav, m4a, ogg, flac...)", + "clearAll": "Borrar todo", + "request": "Solicitud", + "response": "Respuesta", + "transcription": "Transcripción", + "copy": "Copiar", + "resetToDefault": "Restablecer valores predeterminados", + "downloadAudio": "Descargar audio", + "copyText": "Copiar texto", + "transcriptionHint": "La transcripción utiliza multipart/form-data. Suba el archivo de audio arriba; el JSON de abajo controla los parámetros adicionales (modelo, idioma).", "imagesGenerated": "{count} imágenes generadas", "generatedImage": "Imagen generada {index}", - "save": "Save", + "save": "Guardar", "endpointOptions": { - "chat": "Chat", - "responses": "Responses", - "completions": "Completions", - "images": "Images", + "chat": "Completado de chat", + "responses": "Respuestas", + "completions": "Completados", + "images": "Generación de imágenes", "embeddings": "Embeddings", - "speech": "Speech", - "transcription": "Transcription", - "video": "Video", - "music": "Music", - "moderations": "Moderations", + "speech": "Texto a voz", + "transcription": "Transcripción de audio", + "video": "Generación de vídeo", + "music": "Generación de música", + "moderations": "Moderaciones", "rerank": "Rerank", - "search": "Search", - "webFetch": "Web fetch" + "search": "Búsqueda web", + "webFetch": "Obtención web" }, "conversationalChat": "Chat conversacional", "clearChat": "Borrar chat", "typeMessagePlaceholder": "Escriba un mensaje... (Mayús+Entrar para una nueva línea)", "tabChat": "Chat", - "tabCompare": "Compare", + "tabCompare": "Comparar", "tabApi": "API", - "tabBuild": "Build", - "configPane": "Config", - "systemPrompt": "System prompt", - "systemPromptPlaceholder": "You are a helpful assistant.", - "modelPlaceholder": "e.g. openai/gpt-4o", + "tabBuild": "Construir", + "configPane": "Configuración", + "systemPrompt": "Prompt de sistema", + "systemPromptPlaceholder": "Eres un asistente útil.", + "modelPlaceholder": "p. ej. openai/gpt-4o", "endpointLabel": "Endpoint", - "parametersLabel": "Parameters", - "collapseConfig": "Collapse config pane", - "expandConfig": "Expand config pane", - "temperature": "Temperature", - "maxTokens": "Max tokens", + "parametersLabel": "Parámetros", + "collapseConfig": "Contraer panel de configuración", + "expandConfig": "Expandir panel de ajustes", + "temperature": "Temperatura", + "maxTokens": "Tokens máximos", "topP": "Top-p", - "presencePenalty": "Presence penalty", - "frequencyPenalty": "Frequency penalty", - "reasoningLabel": "Reasoning", - "thinking": "Thinking", - "effort": "Effort", - "effortDefault": "Default", - "seedPlaceholder": "Random (leave empty)", - "presetsLabel": "Presets", - "loadPreset": "Load preset", - "savePreset": "Save preset", - "noPresets": "No presets", - "presetNamePlaceholder": "Preset name", - "savingPreset": "Saving…", - "nameRequired": "Name is required", - "failedToSavePreset": "Failed to save preset", - "improvePrompt": "Improve prompt", - "improvingPrompt": "Improving…", - "improvePromptTitle": "Improve your prompt with AI", - "setModelFirst": "Set a model first", - "setModelInConfigFirst": "Set a model in the Config pane first.", - "improvePromptFailed": "Improve prompt failed.", - "improvePromptAria": "Improve prompt using AI", - "confirmImprovePrompt": "Confirm improve prompt", - "improvePromptDescription": "This will send your current system prompt to to generate an improved version.", - "improveQuotaWarning": "This will consume quota from the model configured in Config.", - "improveConfirm": "Improve", - "exportCode": "Export code", - "exportCodeTitle": "Export Code", - "exportShort": "Export", - "noStateToExport": "No playground state available to export.", - "closeExportModal": "Close export modal", - "close": "Close", - "exportRealKeyWarning": "Security warning: export blocked — a real API key was detected in the output. Please reset your API key and try again.", - "placeholderHintPrefix": "Replace", - "placeholderHintSuffix": "with your actual API key, or set it as an environment variable.", - "copyLangCode": "Copy {language} code", - "loadingPresets": "Loading…", - "loadPresetPlaceholder": "Load preset…", - "copyCode": "Copy", - "copiedCode": "Copied!", - "addModel": "+ Add model", - "runAll": "Run all", - "cancelAll": "Cancel all", - "maxColumnsReached": "Maximum {max} columns", - "modelPlaceholderCompare": "Model (Cmd+K)…", - "noModel": "No model", - "statusLabel": "Status: {status}", + "presencePenalty": "Penalización de presencia", + "frequencyPenalty": "Penalización de frecuencia", + "reasoningLabel": "Razonamiento", + "thinking": "Pensamiento", + "effort": "Esfuerzo", + "effortDefault": "Predeterminado", + "seedPlaceholder": "Aleatorio (dejar vacío)", + "presetsLabel": "Preajustes", + "loadPreset": "Cargar preajuste", + "savePreset": "Guardar preajuste", + "noPresets": "Sin preajustes", + "presetNamePlaceholder": "Nombre del preajuste", + "savingPreset": "Guardando...", + "nameRequired": "El nombre es obligatorio", + "failedToSavePreset": "Error al guardar el preajuste", + "improvePrompt": "Mejorar prompt", + "improvingPrompt": "Mejorando...", + "improvePromptTitle": "Mejora tu prompt con IA", + "setModelFirst": "Selecciona un modelo primero", + "setModelInConfigFirst": "Selecciona primero un modelo en el panel de ajustes.", + "improvePromptFailed": "No se pudo mejorar el prompt.", + "improvePromptAria": "Mejorar prompt con IA", + "confirmImprovePrompt": "Confirmar mejora del prompt", + "improvePromptDescription": "Esto enviará tu prompt de sistema actual a para generar una versión mejorada.", + "improveQuotaWarning": "Esto consumirá cuota del modelo configurado en Ajustes.", + "improveConfirm": "Mejorar", + "exportCode": "Exportar código", + "exportCodeTitle": "Exportar código", + "exportShort": "Exportar", + "noStateToExport": "No hay ningún estado del playground disponible para exportar.", + "closeExportModal": "Cerrar ventana de exportación", + "close": "Cerrar", + "exportRealKeyWarning": "Advertencia de seguridad: exportación bloqueada; se ha detectado una clave de API real en el resultado. Restablece tu clave de API e inténtalo de nuevo.", + "placeholderHintPrefix": "Reemplaza", + "placeholderHintSuffix": "con tu clave de API real o configúrala como variable de entorno.", + "copyLangCode": "Copiar código en {language}", + "loadingPresets": "Cargando...", + "loadPresetPlaceholder": "Cargar preajuste...", + "copyCode": "Copiar", + "copiedCode": "¡Copiado!", + "addModel": "+ Añadir modelo", + "runAll": "Ejecutar todo", + "cancelAll": "Cancelar todo", + "maxColumnsReached": "Máximo de {max} columnas", + "modelPlaceholderCompare": "Modelo (Cmd+K)...", + "noModel": "Sin modelo", + "statusLabel": "Estado: {status}", "status": { - "idle": "idle", + "idle": "inactivo", "streaming": "streaming", - "done": "done", + "done": "completado", "error": "error" }, - "cancelStream": "Cancel stream", - "removeColumn": "Remove column", - "removeModelColumn": "Remove column for {model}", - "readyToRun": "Ready to run.", + "cancelStream": "Cancelar streaming", + "removeColumn": "Eliminar columna", + "removeModelColumn": "Eliminar columna para {model}", + "readyToRun": "Listo para ejecutar.", "errorLabel": "Error", - "unknownError": "Unknown error occurred.", - "waitingForResponse": "Waiting for response…", + "unknownError": "Se ha producido un error desconocido.", + "waitingForResponse": "Esperando respuesta...", "ttft": "TTFT", "tps": "TPS", - "metricsDisclaimer": "client-side estimate", + "metricsDisclaimer": "estimación en el lado del cliente", "tokensLabel": "Tokens", - "costLabel": "Cost", - "costEstimated": "(estimated)", - "ttftTitle": "Time to first token (client-side estimate)", - "tpsTitle": "Tokens per second (client-side estimate)", - "tokenCountsTitle": "Prompt tokens ↑ / Completion tokens ↓", - "estimatedCostTitle": "Estimated cost (not guaranteed accurate)", - "toolsLabel": "Tools", - "toolsCount": "Tools ({count})", - "addTool": "Add tool", - "editTool": "Edit tool {name}", - "removeTool": "Remove tool {name}", - "toolNamePlaceholder": "Function name", - "toolNameRequiredPlaceholder": "Function name *", - "toolDescPlaceholder": "Description (optional)", - "toolParamsLabel": "Parameters (JSON schema)", - "toolParamsJsonSchema": "JSON schema for parameters", - "toolParamsInvalid": "Parameters must be valid JSON", - "structuredOutputLabel": "Structured Output", - "enableJsonMode": "Enable JSON mode", - "disableJsonMode": "Disable JSON mode", - "invalidJson": "Invalid JSON", - "jsonMode": "JSON mode", - "jsonModeDescription": "Forces response_format: json_schema", - "schemaName": "Schema name", - "jsonSchema": "JSON schema", - "jsonSchemaEditor": "JSON schema editor", - "schemaValidated": "Schema validated", - "validateSchema": "Validate schema", + "costLabel": "Coste", + "costEstimated": "(estimado)", + "ttftTitle": "Tiempo hasta el primer token (estimación en el lado del cliente)", + "tpsTitle": "Tokens por segundo (estimación en el lado del cliente)", + "tokenCountsTitle": "Tokens de prompt ↑ / Tokens de completado ↓", + "estimatedCostTitle": "Coste estimado (exactitud no garantizada)", + "toolsLabel": "Herramientas", + "toolsCount": "Herramientas ({count})", + "addTool": "Añadir herramienta", + "editTool": "Editar herramienta {name}", + "removeTool": "Eliminar herramienta {name}", + "toolNamePlaceholder": "Nombre de la función", + "toolNameRequiredPlaceholder": "Nombre de la función *", + "toolDescPlaceholder": "Descripción (opcional)", + "toolParamsLabel": "Parámetros (esquema JSON)", + "toolParamsJsonSchema": "Esquema JSON para los parámetros", + "toolParamsInvalid": "Los parámetros deben ser un JSON válido", + "structuredOutputLabel": "Salida estructurada", + "enableJsonMode": "Activar modo JSON", + "disableJsonMode": "Desactivar modo JSON", + "invalidJson": "JSON no válido", + "jsonMode": "Modo JSON", + "jsonModeDescription": "Fuerza response_format: json_schema", + "schemaName": "Nombre del esquema", + "jsonSchema": "Esquema JSON", + "jsonSchemaEditor": "Editor de esquemas JSON", + "schemaValidated": "Esquema validado", + "validateSchema": "Validar esquema", "seed": "Seed", - "stopSequences": "Stop sequences", - "stopSequencesPlaceholder": "e.g. \"\\n\\n\" or \"END\"", - "autoProvider": "Auto", + "stopSequences": "Secuencias de parada", + "stopSequencesPlaceholder": "p. ej., \"\\n\\n\" o \"END\"", + "autoProvider": "Automático", "httpError": "Error {status}", - "requestCancelled": "Request cancelled", - "networkError": "Network error", - "regenerateLastResponse": "Regenerate last response", - "regenerate": "Regenerate", - "startConversation": "Start a conversation — type a message below", + "requestCancelled": "Solicitud cancelada", + "networkError": "Error de red", + "regenerateLastResponse": "Regenerar última respuesta", + "regenerate": "Regenerar", + "startConversation": "Inicia una conversación; escribe un mensaje abajo", "role": { - "system": "system", - "user": "user", - "assistant": "assistant" + "system": "sistema", + "user": "usuario", + "assistant": "asistente" }, - "generating": "Generating…", - "typeMessageWithShortcut": "Type a message... (Enter to send, Shift+Enter for newline)", - "stop": "Stop", - "noResponseBody": "No response body", - "comparePromptPlaceholder": "Enter your prompt here…", - "userPrompt": "User prompt", - "cancelAllStreams": "Cancel all streams", - "runAllColumns": "Run all columns", - "newColumnModelName": "Model name for new column", - "addColumn": "Add column", - "addModelColumn": "Add model column", - "columnCount": "{count}/{max} columns", - "addModelToCompare": "Add a model column to compare", - "modelsSimultaneously": "Up to {max} models simultaneously", - "running": "Running…", - "runLabel": "Run", - "enterToolResult": "Enter tool result…", + "generating": "Generando...", + "typeMessageWithShortcut": "Escribe un mensaje... (Enter para enviar, Shift+Enter para salto de línea)", + "stop": "Detener", + "noResponseBody": "Sin cuerpo de respuesta", + "comparePromptPlaceholder": "Introduce tu prompt aquí...", + "userPrompt": "Prompt de usuario", + "cancelAllStreams": "Cancelar todos los streamings", + "runAllColumns": "Ejecutar todas las columnas", + "newColumnModelName": "Nombre del modelo para la nueva columna", + "addColumn": "Añadir columna", + "addModelColumn": "Añadir columna de modelo", + "columnCount": "{count}/{max} columnas", + "addModelToCompare": "Añadir una columna de modelo para comparar", + "modelsSimultaneously": "Hasta {max} modelos simultáneamente", + "running": "Ejecutando...", + "runLabel": "Ejecutar", + "enterToolResult": "Introduce el resultado de la herramienta...", "build": { - "step1Label": "What to test?", - "step2Label": "Configure", - "step3Label": "Run", - "step1Title": "What do you want to test?", - "step1Subtitle": "Choose the capability you want to explore in this session.", - "step2Title": "Configure", - "step2Subtitle": "Set up the tools or JSON schema that will be used in the request.", - "step3Title": "Run", - "modeToolsTitle": "Tools", - "modeToolsDesc": "Test function calling — define tools and see how the model invokes them.", + "step1Label": "¿Qué quieres probar?", + "step2Label": "Configurar", + "step3Label": "Ejecutar", + "step1Title": "¿Qué quieres probar?", + "step1Subtitle": "Elige la capacidad que quieres explorar en esta sesión.", + "step2Title": "Configurar", + "step2Subtitle": "Configura las herramientas o el esquema JSON que se utilizarán en la solicitud.", + "step3Title": "Ejecutar", + "modeToolsTitle": "Herramientas", + "modeToolsDesc": "Prueba el uso de funciones (function calling): define herramientas y observa cómo las invoca el modelo.", "modeJsonTitle": "JSON", - "modeJsonDesc": "Test structured output — constrain the response to a JSON schema.", - "modeBothTitle": "Tools + JSON", - "modeBothDesc": "Combine function calling and structured output in a single request.", - "backButton": "Back", - "nextButton": "Next", - "runButton": "Run", - "promptPlaceholder": "Enter your message… (Enter to send, Shift+Enter for newline)" + "modeJsonDesc": "Prueba la salida estructurada: limita la respuesta a un esquema JSON.", + "modeBothTitle": "Herramientas + JSON", + "modeBothDesc": "Combina el uso de funciones y la salida estructurada en una sola solicitud.", + "backButton": "Atrás", + "nextButton": "Siguiente", + "runButton": "Ejecutar", + "promptPlaceholder": "Introduce tu mensaje... (Enter para enviar, Shift+Enter para salto de línea)" } }, "miniPlayground": { - "endpoint": "Punto de conexión", - "apiKey": "Clave API", + "endpoint": "Endpoint", + "apiKey": "Clave de API", "model": "Modelo", "voice": "Voz", "speed": "Velocidad", - "input": "Input", + "input": "Entrada", "url": "URL", - "format": "Format", - "depth": "Depth", - "copyCurl": "Copy cURL", - "copied": "Copied!", - "run": "Run", - "running": "Running...", - "response": "Response", - "tunnel": "Tunnel", - "send": "Send", - "selectKey": "Select key", - "testLabel": "Test", - "expandTest": "Expand test", - "collapseTest": "Collapse test", - "revealKey": "Reveal key", - "hideKey": "Hide key", - "download": "Download", - "play": "Play", - "query": "Query", - "numResults": "Max results", + "format": "Formato", + "depth": "Profundidad", + "copyCurl": "Copiar cURL", + "copied": "¡Copiado!", + "run": "Ejecutar", + "running": "Ejecutando...", + "response": "Respuesta", + "tunnel": "Túnel", + "send": "Enviar", + "selectKey": "Seleccionar clave", + "testLabel": "Prueba", + "expandTest": "Expandir prueba", + "collapseTest": "Contraer prueba", + "revealKey": "Mostrar clave", + "hideKey": "Ocultar clave", + "download": "Descargar", + "play": "Reproducir", + "query": "Consulta", + "numResults": "Resultados máximos", "prompt": "Prompt", - "size": "Size", - "duration": "Duration", - "question": "Question", - "audioFile": "Audio file", - "fileTooLarge25Mb": "The file is too large. Maximum size: 25 MB.", - "selectAudioFirst": "Select an audio file first.", - "speechToText": "Speech to Text", - "chooseFile": "Choose file", - "audioFormats25Mb": "MP3, WAV, M4A, OGG or FLAC · Maximum 25 MB", - "musicSample": "A calm ambient track with warm piano and soft strings", - "noAudioUrl": "The response did not include an audio URL: {response}", - "music": "Music", - "embeddingSample": "OmniRoute routes AI requests across multiple providers.", + "size": "Tamaño", + "duration": "Duración", + "question": "Pregunta", + "audioFile": "Archivo de audio", + "fileTooLarge25Mb": "El archivo es demasiado grande. Tamaño máximo: 25 MB.", + "selectAudioFirst": "Selecciona primero un archivo de audio.", + "speechToText": "De voz a texto", + "chooseFile": "Elegir archivo", + "audioFormats25Mb": "MP3, WAV, M4A, OGG o FLAC · Máximo 25 MB", + "musicSample": "Una pista ambiental tranquila con piano cálido y cuerdas suaves", + "noAudioUrl": "La respuesta no incluye una URL de audio: {response}", + "music": "Música", + "embeddingSample": "OmniRoute enruta las solicitudes de IA a través de múltiples proveedores.", "embedding": "Embedding", - "imageSample": "A futuristic city at sunset, cinematic lighting", - "image": "Image", - "ttsSample": "Hello from OmniRoute. This is a text-to-speech test.", - "textToSpeech": "Text to Speech", - "videoSample": "A paper airplane flying over a futuristic city", - "video": "Video", - "webFetch": "Web Fetch", - "webSearchSample": "What is OmniRoute?", - "webSearch": "Web Search", - "documentUrl": "Document URL", - "browserAudioUnsupported": "Your browser does not support audio.", - "browserVideoUnsupported": "Your browser does not support video.", - "searchResultFallback": "Result {number}", - "noKeysFound": "No API keys found. Add one in the Keys section.", - "exampleLabel": "Example", + "imageSample": "Una ciudad futurista al atardecer, iluminación cinematográfica", + "image": "Imagen", + "ttsSample": "Hola desde OmniRoute. Esta es una prueba de texto a voz.", + "textToSpeech": "Texto a voz", + "videoSample": "Un avión de papel volando sobre una ciudad futurista", + "video": "Vídeo", + "webFetch": "Obtención web", + "webSearchSample": "¿Qué es OmniRoute?", + "webSearch": "Búsqueda web", + "documentUrl": "URL del documento", + "browserAudioUnsupported": "Tu navegador no admite audio.", + "browserVideoUnsupported": "Tu navegador no admite vídeo.", + "searchResultFallback": "Resultado {number}", + "noKeysFound": "No se han encontrado claves de API. Añade una en la sección de claves.", + "exampleLabel": "Ejemplo", "latency": "{ms}ms", - "statsLine": "{ms}ms · {tokensIn} in / {tokensOut} out tokens", - "defaultKey": "(default)", - "clear": "Clear", - "emptyConversation": "Send a message to start the conversation", - "sendHint": "Shift+Enter for newline · Enter to send", - "you": "You", - "assistant": "Assistant", + "statsLine": "{ms}ms · {tokensIn} tokens de entrada / {tokensOut} de salida", + "defaultKey": "(predeterminado)", + "clear": "Limpiar", + "emptyConversation": "Envía un mensaje para iniciar la conversación", + "sendHint": "Shift+Enter para nueva línea · Enter para enviar", + "you": "Tú", + "assistant": "Asistente", "errorLabel": "Error", - "requestFailed": "Request failed", - "stop": "Stop" + "requestFailed": "Error en la solicitud", + "stop": "Detener" }, "requestLogger": { - "recording": "Recording", - "paused": "Paused", - "pipelineLogsOn": "Pipeline logs on", - "pipelineLogsOff": "Pipeline logs off", - "updatingPipelineLogs": "Updating pipeline logs...", - "updatePipelineFailed": "Failed to update pipeline logging", - "capturePipeline": "Capture pipeline payloads for new requests", - "searchPlaceholder": "Search models, providers, accounts, API keys, combos...", - "allProviders": "All providers", - "allModels": "All models", - "allAccounts": "All accounts", - "allApiKeys": "All API keys", + "recording": "Grabando", + "paused": "Pausado", + "pipelineLogsOn": "Logs de pipeline activados", + "pipelineLogsOff": "Logs de pipeline desactivados", + "updatingPipelineLogs": "Actualizando logs de pipeline...", + "updatePipelineFailed": "Error al actualizar el registro del pipeline", + "capturePipeline": "Capturar payloads del pipeline para nuevas solicitudes", + "searchPlaceholder": "Buscar modelos, proveedores, cuentas, claves de API, combos...", + "allProviders": "Todos los proveedores", + "allModels": "Todos los modelos", + "allAccounts": "Todas las cuentas", + "allApiKeys": "Todas las claves de API", "total": "Total", - "ok": "Success", + "ok": "Correcto", "err": "Error", "combo": "Combo", - "keys": "Keys", - "shown": "Shown", - "sortNewest": "Newest", - "sortOldest": "Oldest", + "keys": "Claves", + "shown": "Mostrado", + "sortNewest": "Más recientes", + "sortOldest": "Más antiguos", "sortTokensDesc": "Tokens ↓", "sortTokensAsc": "Tokens ↑", - "sortDurationDesc": "Duration ↓", - "sortDurationAsc": "Duration ↑", - "sortStatusDesc": "Status ↓", - "sortStatusAsc": "Status ↑", - "sortModelAsc": "Model A-Z", - "sortModelDesc": "Model Z-A", - "sortLogs": "Sort logs", - "refresh": "Refresh", - "columnsLabel": "Columns", + "sortDurationDesc": "Duración ↓", + "sortDurationAsc": "Duración ↑", + "sortStatusDesc": "Estado ↓", + "sortStatusAsc": "Estado ↑", + "sortModelAsc": "Modelo A-Z", + "sortModelDesc": "Modelo Z-A", + "sortLogs": "Ordenar logs", + "refresh": "Actualizar", + "columnsLabel": "Columnas", "cacheSem": "SEM", "cacheUp": "UP", - "semantic": "Semantic", + "semantic": "Semántico", "upstream": "Upstream", - "semanticCacheHit": "Semantic cache hit (served by OmniRoute)", - "upstreamResponse": "Upstream provider response", - "noApiKey": "No API key", - "requestedRoutedTitle": "Requested {requested}, routed as {routed}", + "semanticCacheHit": "Acierto de caché semántica (servido por OmniRoute)", + "upstreamResponse": "Respuesta del proveedor upstream", + "noApiKey": "Sin clave de API", + "requestedRoutedTitle": "Solicitado {requested}, enrutado como {routed}", "statusFilters": { - "all": "All", - "error": "Errors", - "success": "Success", + "all": "Todos", + "error": "Errores", + "success": "Correcto", "combo": "Combo" }, "columns": { - "status": "Status", - "cacheSource": "Cache Source", - "model": "Model", - "requested": "Requested", - "provider": "Provider", - "protocol": "Request Protocol", - "account": "Account", - "apiKey": "API Key", + "status": "Estado", + "cacheSource": "Origen de caché", + "model": "Modelo", + "requested": "Solicitado", + "provider": "Proveedor", + "protocol": "Protocolo de solicitud", + "account": "Cuenta", + "apiKey": "Clave de API", "combo": "Combo", "tokens": "Tokens", "compressed": "Compresión", "tps": "TPS", - "duration": "Duration", - "time": "Time" + "duration": "Duración", + "time": "Hora" }, - "loadingLogs": "Loading logs...", - "noLogs": "No logs yet. Make some API calls to see them here.", - "noMatchingLogs": "No logs matching current filters.", - "callLogsInfo": "Call logs are also saved as JSON files to {dataDir} and rotated based on {retentionDays} and {maxEntries}.", - "loadMore": "Load More", - "loadingMore": "Loading more..." + "loadingLogs": "Cargando logs...", + "noLogs": "Aún no hay logs. Realiza algunas llamadas a la API para verlas aquí.", + "noMatchingLogs": "No hay logs que coincidan con los filtros actuales.", + "callLogsInfo": "Los logs de llamadas también se guardan como archivos JSON en {dataDir} y se rotan según {retentionDays} y {maxEntries}.", + "loadMore": "Cargar más", + "loadingMore": "Cargando más..." }, "proxyLogger": { - "filterAll": "All", - "filterErrors": "Errors", - "filterSuccess": "Success", - "filterTimeout": "Timeout", - "colStatus": "Status", + "filterAll": "Todos", + "filterErrors": "Errores", + "filterSuccess": "Correcto", + "filterTimeout": "Tiempo de espera", + "colStatus": "Estado", "colProxy": "Proxy", "colTls": "TLS", - "colType": "Type", - "colLevel": "Level", - "colProvider": "Provider", - "colTarget": "Target", - "colLatency": "Latency", - "colClientIp": "Client IP", - "colTime": "Time", - "recording": "Recording", - "paused": "Paused", - "searchPlaceholder": "Search host, provider, target, IP...", - "allTypes": "All Types", - "allLevels": "All Levels", - "allProviders": "All Providers", + "colType": "Tipo", + "colLevel": "Nivel", + "colProvider": "Proveedor", + "colTarget": "Destino", + "colLatency": "Latencia", + "colClientIp": "IP del cliente", + "colTime": "Hora", + "recording": "Grabando", + "paused": "Pausado", + "searchPlaceholder": "Buscar host, proveedor, destino, IP...", + "allTypes": "Todos los tipos", + "allLevels": "Todos los niveles", + "allProviders": "Todos los proveedores", "total": "total", "ok": "OK", "err": "ERR", "timeoutShort": "TMO", - "direct": "direct", - "newest": "Newest", - "oldest": "Oldest", - "latencyDesc": "Latency ↓", - "latencyAsc": "Latency ↑", - "refresh": "Refresh", - "columns": "Columns", - "loadingProxyLogs": "Loading proxy logs...", - "noProxyLogs": "No proxy logs yet. Configure proxies and make API calls to see them here.", - "noMatchingLogs": "No logs match the current filters.", - "tlsFingerprint": "Chrome 124 TLS Fingerprint", - "colPublicIp": "Public IP" + "direct": "directo", + "newest": "Más recientes", + "oldest": "Más antiguos", + "latencyDesc": "Latencia ↓", + "latencyAsc": "Latencia ↑", + "refresh": "Actualizar", + "columns": "Columnas", + "loadingProxyLogs": "Cargando logs de proxy...", + "noProxyLogs": "Aún no hay logs de proxy. Configura proxies y realiza llamadas a la API para verlos aquí.", + "noMatchingLogs": "No hay logs que coincidan con los filtros actuales.", + "tlsFingerprint": "Huella digital TLS de Chrome 124", + "colPublicIp": "IP pública" }, "endpointOptions": { - "speech": "Speech", - "search": "Search", - "images": "Images", + "speech": "Voz", + "search": "Búsqueda", + "images": "Imágenes", "chat": "Chat", - "music": "Music", - "responses": "Responses", + "music": "Música", + "responses": "Respuestas", "rerank": "Rerank", - "video": "Video", + "video": "Vídeo", "embeddings": "Embeddings", - "transcription": "Transcription" + "transcription": "Transcripción" }, "toolDescriptions": { "cline": "Cline", @@ -10327,1793 +10329,1793 @@ }, "runtime": { "title": "Runtime", - "description": "Realtime observability — 3-layer resilience + sessions + quota alerts", - "pause": "Pause", - "resume": "Resume", - "refreshNow": "Refresh now", - "kpiSessions": "Sessions", - "kpiCircuits": "Circuits", - "kpiCooldowns": "Cooldowns", - "kpiLockouts": "Lockouts", - "hintStickyBound": "{count} sticky-bound", - "hintRecovering": "{count} recovering", - "hintAllHealthy": "all healthy", - "hintOpen": "open", - "hintConnsCooling": "connections cooling", - "hintModelsBlocked": "models blocked", - "resilienceTitle": "3-Layer Resilience", - "resilienceSubtitle": "Mirrors the documented resilience model", - "providersHealthy": "{percent}% providers healthy", - "layer": "Layer {n}", - "layer1Title": "Provider Circuit Breakers", - "layer1Desc": "Stop traffic to providers failing at the upstream level", - "layer2Title": "Connection Cooldowns", - "layer2Desc": "Skip one bad account/key; other connections keep serving", - "layer3Title": "Model Lockouts", - "layer3Desc": "Per-model rate-limit locks; same connection still serves other models", - "badgeAffectedOf": "{affected} of {total} affected", - "badgeCooling": "{count} cooling", - "badgeLocked": "{count} locked", - "emptyCircuits": "No circuit breakers active yet", - "emptyCooldowns": "No connection cooldowns active", - "emptyLockouts": "No model lockouts", - "moreCooldowns": "+{count} more cooldowns", - "moreLockouts": "+{count} more lockouts", - "feedTitle": "Live Feed", - "feedSubtitle": "Last {count} events", - "feedFilterAll": "All", - "feedFilterCircuits": "Circuits", - "feedFilterCooldowns": "Cooldowns", - "feedFilterLockouts": "Lockouts", - "feedFilterSessions": "Sessions", - "feedFilterQuotas": "Quotas", - "feedClear": "Clear", - "feedEmptyWaiting": "Waiting for events... (polled every 5s)", - "feedEmptyFiltered": "No events match this filter", - "sessionsTitle": "Active Sessions", - "sessionsSubtitle": "Sticky-bound request fingerprints (live)", - "sessionsActive": "{count} active", - "sessionsEmptyTitle": "No active sessions", - "sessionsEmptyHint": "Sessions appear as requests flow through the proxy", - "tblSession": "Session", - "tblAge": "Age", - "tblIdle": "Idle", - "tblReqs": "Reqs", - "tblBoundTo": "Bound to", - "topApiKeys": "Top API keys", - "quotaMonitorsTitle": "Quota Monitors", - "quotaMonitorsSubtitle": "Live quota state per account window", - "openQuota": "Open Quota", - "allQuotasHealthy": "All quotas healthy", - "statusExhausted": "EXHAUSTED", - "statusAlerting": "ALERTING", + "description": "Observabilidad en tiempo real — resiliencia de 3 capas + sesiones + alertas de cuota", + "pause": "Pausar", + "resume": "Reanudar", + "refreshNow": "Actualizar ahora", + "kpiSessions": "Sesiones", + "kpiCircuits": "Circuitos", + "kpiCooldowns": "Enfriamientos", + "kpiLockouts": "Bloqueos", + "hintStickyBound": "{count} vinculado permanentemente", + "hintRecovering": "{count} recuperándose", + "hintAllHealthy": "todo correcto", + "hintOpen": "abierto", + "hintConnsCooling": "conexiones enfriándose", + "hintModelsBlocked": "modelos bloqueados", + "resilienceTitle": "Resiliencia de 3 capas", + "resilienceSubtitle": "Refleja el modelo de resiliencia documentado", + "providersHealthy": "{percent}% de proveedores correctos", + "layer": "Capa {n}", + "layer1Title": "Disyuntores de proveedor", + "layer1Desc": "Detener el tráfico a proveedores que fallan a nivel de upstream", + "layer2Title": "Enfriamiento de conexiones", + "layer2Desc": "Omitir una cuenta/clave defectuosa; otras conexiones siguen funcionando", + "layer3Title": "Bloqueos de modelo", + "layer3Desc": "Bloqueos por rate limit y modelo; la misma conexión sigue sirviendo otros modelos", + "badgeAffectedOf": "{affected} de {total} afectados", + "badgeCooling": "{count} enfriándose", + "badgeLocked": "{count} bloqueados", + "emptyCircuits": "Aún no hay disyuntores activos", + "emptyCooldowns": "No hay enfriamientos de conexión activos", + "emptyLockouts": "No hay bloqueos de modelo", + "moreCooldowns": "+{count} enfriamientos más", + "moreLockouts": "+{count} bloqueos más", + "feedTitle": "Feed en directo", + "feedSubtitle": "Últimos {count} eventos", + "feedFilterAll": "Todos", + "feedFilterCircuits": "Circuitos", + "feedFilterCooldowns": "Enfriamientos", + "feedFilterLockouts": "Bloqueos", + "feedFilterSessions": "Sesiones", + "feedFilterQuotas": "Cuotas", + "feedClear": "Borrar", + "feedEmptyWaiting": "Esperando eventos... (actualización cada 5 s)", + "feedEmptyFiltered": "Ningún evento coincide con este filtro", + "sessionsTitle": "Sesiones activas", + "sessionsSubtitle": "Huellas de solicitudes asociadas de forma fija (en vivo)", + "sessionsActive": "{count} activas", + "sessionsEmptyTitle": "No hay sesiones activas", + "sessionsEmptyHint": "Las sesiones aparecen a medida que las solicitudes fluyen a través del proxy", + "tblSession": "Sesión", + "tblAge": "Antigüedad", + "tblIdle": "Inactividad", + "tblReqs": "Sol.", + "tblBoundTo": "Vinculado a", + "topApiKeys": "Principales claves de API", + "quotaMonitorsTitle": "Monitores de cuota", + "quotaMonitorsSubtitle": "Estado de cuota en vivo por ventana de cuenta", + "openQuota": "Abrir cuota", + "allQuotasHealthy": "Todas las cuotas saludables", + "statusExhausted": "AGOTADA", + "statusAlerting": "EN ALERTA", "statusError": "ERROR", - "moreSuffix": "+{count} more" + "moreSuffix": "+{count} más" }, "quotaShare": { - "weightPercent": "Weight %", - "title": "Quota Sharing", - "description": "Share provider quotas across API keys with % limits", - "newPool": "New pool", - "betaTitle": "Beta — UI preview.", - "betaDescription": "Configuration is saved in localStorage (not yet persisted on the server). Per-request cap enforcement is not yet wired into the proxy pipeline. This screen lets you design and visualize the quota split; real enforcement will land in a future iteration with DB persistence and upstream call interception.", - "kpiActivePools": "Active pools", - "kpiKeysAllocated": "Keys allocated", - "kpiAvgUnallocated": "Avg unallocated", - "kpiProvidersWithQuota": "Providers w/ quota", - "emptyTitle": "No pools configured", - "emptyDescription": "Create a pool to assign API keys to share a provider's quota window with % allocations.", - "loading": "Loading…", - "removePool": "Remove pool", - "removeConfirm": "Remove this pool?", - "pool": "Pool", - "used": "used", - "allocationsCount": "Allocations ({count})", - "allocatedFree": "{allocated}% allocated · {free}% free", - "noAllocations": "No keys allocated yet", - "capLabel": "cap {value}", - "notTrackedYet": "(not tracked yet)", - "policy": "Policy", - "apiKeyColumn": "API Key", - "weightColumn": "Weight", - "fairShareShort": "fair", - "policyHard": "hard", - "policySoft": "soft", - "policyBurst": "burst", - "policyHardHint": "Block when key exhausts allocation", - "policySoftHint": "Allow overflow, alert only", - "policyBurstHint": "Allow burst into free pool", - "editAllocations": "Edit allocations", - "newPoolTitle": "New quota pool", - "providerConnection": "Provider connection (account)", - "selectConnection": "Select a connection…", - "noEligibleConnections": "No connections with quota data. Refresh from /dashboard/quota first.", - "quotaWindow": "Quota window", - "selectWindow": "Select a window…", - "alreadyUsedSuffix": "(already used)", - "windowReset": "Reset", - "duplicatePoolError": "A pool for this connection + window already exists", - "cancel": "Cancel", - "createPool": "Create pool", - "editTitle": "Edit allocations", - "noKeysAdded": "No keys allocated. Add one below.", + "weightPercent": "% de peso", + "title": "Uso compartido de cuotas", + "description": "Comparte cuotas de proveedores entre claves de API con límites porcentuales", + "newPool": "Nuevo grupo", + "betaTitle": "Beta", + "betaDescription": "La configuración se guarda en el localStorage (aún no persiste en el servidor). La aplicación del límite por solicitud aún no está integrada en el proceso de proxy. Esta pantalla permite diseñar y visualizar la división de cuotas; la aplicación real llegará en una futura iteración con persistencia en base de datos e interceptación de llamadas ascendentes.", + "kpiActivePools": "Grupos activos", + "kpiKeysAllocated": "Claves asignadas", + "kpiAvgUnallocated": "Promedio sin asignar", + "kpiProvidersWithQuota": "Proveedores con cuota", + "emptyTitle": "No hay grupos configurados", + "emptyDescription": "Crea un grupo para asignar claves de API y compartir la ventana de cuota de un proveedor con asignaciones en %.", + "loading": "Cargando…", + "removePool": "Eliminar grupo", + "removeConfirm": "¿Eliminar este grupo?", + "pool": "Grupo", + "used": "usado", + "allocationsCount": "Asignaciones ({count})", + "allocatedFree": "{allocated}% asignado · {free}% libre", + "noAllocations": "Aún no hay claves asignadas", + "capLabel": "límite {value}", + "notTrackedYet": "(aún no se realiza el seguimiento)", + "policy": "Política", + "apiKeyColumn": "Clave de API", + "weightColumn": "Peso", + "fairShareShort": "equitativa", + "policyHard": "estricta", + "policySoft": "flexible", + "policyBurst": "ráfaga", + "policyHardHint": "Bloquear cuando la clave agote su asignación", + "policySoftHint": "Permitir desbordamiento, solo avisar", + "policyBurstHint": "Permitir picos en el fondo libre", + "editAllocations": "Editar asignaciones", + "newPoolTitle": "Nuevo grupo de cuotas", + "providerConnection": "Conexión de proveedor (cuenta)", + "selectConnection": "Seleccionar una conexión…", + "noEligibleConnections": "No hay conexiones con datos de cuota. Actualiza primero desde /dashboard/quota.", + "quotaWindow": "Ventana de cuota", + "selectWindow": "Seleccionar una ventana…", + "alreadyUsedSuffix": "(ya en uso)", + "windowReset": "Restablecer", + "duplicatePoolError": "Ya existe un grupo para esta conexión y ventana", + "cancel": "Cancelar", + "createPool": "Crear grupo", + "editTitle": "Editar asignaciones", + "noKeysAdded": "No hay claves asignadas. Añade una abajo.", "totalLabel": "Total: {percent}%", - "totalExceeded": "⚠ exceeds 100%", - "addKey": "+ Add key…", - "equalSplit": "Equal split", - "save": "Save allocations", - "betaPreviewLabel": "Beta: vista previa de la interfaz de usuario.", + "totalExceeded": "⚠ supera el 100%", + "addKey": "+ Añadir clave…", + "equalSplit": "División equitativa", + "save": "Guardar asignaciones", + "betaPreviewLabel": "Beta — vista previa de interfaz.", "betaConfigSavedPrefix": "La configuración se guarda en", - "betaConfigSavedSuffix": "(aún no persiste en el servidor). La aplicación del límite por solicitud aún no está integrada en el proceso de proxy. Esta pantalla le permite diseñar y visualizar la división de cuota; La aplicación real se producirá en una iteración futura con persistencia de base de datos e interceptación de llamadas ascendentes.", + "betaConfigSavedSuffix": "(aún no persiste en el servidor). La aplicación del límite por solicitud aún no está integrada en el proceso de proxy. Esta pantalla le permite diseñar y visualizar la división de cuotas; la aplicación real se producirá en una iteración futura con persistencia de base de datos e interceptación de llamadas ascendentes.", "policyLabel": "Política:", - "resetIn": "restablecer en", + "resetIn": "se restablece en", "quotaTotal": "total", - "kpiAvgUtilization": "Avg utilization", - "kpiBorrowingNow": "Borrowing now", - "conceptTitle": "How Quota Share works", - "conceptIntro": "Quota Share divides a provider's quota among multiple API keys using work-conserving fair-share: each key receives a proportional slice but can borrow from the free balance without exceeding the global cap.", - "conceptFairShare": "Fair-share: each key receives quota proportional to its configured weight", - "conceptBorrowing": "Borrowing: keys can consume free balance from others without breaching the cap", - "conceptGlobalCap": "Hard global cap: the provider's absolute limit is never exceeded", - "conceptWindows": "Windows: 5h, hourly, daily, weekly, monthly — each tracked independently", - "conceptKeyHowTitle": "Enabling a key for quota", - "conceptKeyHowDesc": "Create the key normally in API Keys — it appears in the wizard's key step automatically. Tick Exclusive there to make it quota-only. No separate enable step.", - "conceptExclusiveTitle": "What \"Exclusive\" does", - "conceptExclusiveDesc": "An exclusive key only sees/uses the pool's quotaShared-* models — every other model is hidden from its /v1/models and blocked.", - "burnRateTitle": "Burn rate", - "burnRateExhaustsIn": "Exhausts in", - "dimensionResetIn": "Resets in", - "realConsumedColumn": "Consumed", - "deficitColumn": "Deficit", - "borrowingIndicator": "borrowing", - "migratedFromLocalStorageNotice": "Pools successfully migrated from localStorage.", - "policyCapAbsoluteLabel": "Absolute cap", - "policyCapAbsolutePlaceholder": "Numeric limit (optional)", - "multiDimensionLabel": "Multi-dimension", - "stackedBarTitle": "Slices by API key", - "usedSuffix": "used {percent}%", - "wizardTitle": "New quota pool", - "editPoolTitle": "Edit pool", - "saveChanges": "Save changes", - "wizardStep1Label": "Account", - "wizardStep2Label": "Limit", - "wizardStep3Label": "Keys", - "wizardStep1Title": "Choose provider connection", - "wizardStep1Subtitle": "Select the provider account this pool will share quota for, set a name and default policy.", - "wizardStep2Title": "Configure quota dimensions", - "wizardStep2Subtitle": "Define the quota plan dimensions (unit, window, limit) for the chosen connection. Leave unchanged to keep current settings.", - "wizardStep3Title": "Allocate API keys", - "wizardStep3Subtitle": "Assign API keys to this pool with weight % allocations and optional caps.", - "wizardPoolNameLabel": "Pool name", - "wizardPoolNamePlaceholder": "My quota pool", - "wizardNext": "Next", - "wizardBack": "Back", - "wizardCreatePool": "Create pool", - "wizardDimensionsEditedNotice": "Dimensions edited — will be saved as a manual override when the pool is created.", - "wizardExclusiveLabel": "Exclusive quota", - "wizardExclusiveHint": "When enabled, these API keys will only be allowed to use this pool's virtual models (allowedQuotas reconciliation is applied on save).", - "wizardPreviewLabel": "Virtual model names preview", - "wizardConnectionsLabel": "Provider connections", - "wizardPrimaryBadge": "primary", - "wizardAdditionalConnectionsNote": "Additional connections use their catalog default limits (editable later).", - "wizardSingleProviderNote": "A pool uses a single provider", - "wizardPreviewMoreModels": "+{count} more", - "accountQuotaTitle": "Account quota", + "kpiAvgUtilization": "Utilización media", + "kpiBorrowingNow": "Préstamos actuales", + "conceptTitle": "Cómo funciona el uso compartido de cuotas", + "conceptIntro": "El uso compartido de cuotas divide la cuota de un proveedor entre varias claves de API mediante un reparto equitativo que conserva el trabajo: cada clave recibe una porción proporcional pero puede tomar prestado del saldo libre sin superar el límite global.", + "conceptFairShare": "Reparto equitativo: cada clave recibe cuota proporcional a su peso configurado", + "conceptBorrowing": "Préstamo: las claves pueden consumir saldo libre de otras sin rebasar el límite", + "conceptGlobalCap": "Límite global estricto: nunca se supera el límite absoluto del proveedor", + "conceptWindows": "Ventanas: 5h, por hora, diaria, semanal, mensual; cada una se sigue de forma independiente", + "conceptKeyHowTitle": "Habilitar una clave para cuotas", + "conceptKeyHowDesc": "Crea la clave con normalidad en Claves de API; aparecerá automáticamente en el asistente de configuración. Marca Exclusiva allí para que sea exclusivamente de cuota. No se requiere ningún paso de habilitación adicional.", + "conceptExclusiveTitle": "Qué hace la opción \"Exclusiva\"", + "conceptExclusiveDesc": "Una clave exclusiva solo ve y utiliza los modelos virtuales quotaShared-* del grupo; cualquier otro modelo se oculta en su /v1/models y se bloquea.", + "burnRateTitle": "Tasa de consumo", + "burnRateExhaustsIn": "Se agota en", + "dimensionResetIn": "Se restablece en", + "realConsumedColumn": "Consumido", + "deficitColumn": "Déficit", + "borrowingIndicator": "tomando prestado", + "migratedFromLocalStorageNotice": "Grupos migrados correctamente desde el localStorage.", + "policyCapAbsoluteLabel": "Límite absoluto", + "policyCapAbsolutePlaceholder": "Límite numérico (opcional)", + "multiDimensionLabel": "Multidimensión", + "stackedBarTitle": "Porciones por clave de API", + "usedSuffix": "usado {percent}%", + "wizardTitle": "Nuevo grupo de cuotas", + "editPoolTitle": "Editar grupo", + "saveChanges": "Guardar cambios", + "wizardStep1Label": "Cuenta", + "wizardStep2Label": "Límite", + "wizardStep3Label": "Claves", + "wizardStep1Title": "Elegir conexión de proveedor", + "wizardStep1Subtitle": "Selecciona la cuenta de proveedor para la que este grupo compartirá cuota, define un nombre y una política predeterminada.", + "wizardStep2Title": "Configurar dimensiones de cuota", + "wizardStep2Subtitle": "Define las dimensiones del plan de cuota (unidad, ventana, límite) para la conexión elegida. Déjalo sin cambios para mantener los ajustes actuales.", + "wizardStep3Title": "Asignar claves de API", + "wizardStep3Subtitle": "Asigna claves de API a este grupo con porcentajes de peso y límites opcionales.", + "wizardPoolNameLabel": "Nombre del grupo", + "wizardPoolNamePlaceholder": "Mi grupo de cuotas", + "wizardNext": "Siguiente", + "wizardBack": "Atrás", + "wizardCreatePool": "Crear grupo", + "wizardDimensionsEditedNotice": "Dimensiones editadas; se guardarán como una anulación manual al crear el grupo.", + "wizardExclusiveLabel": "Cuota exclusiva", + "wizardExclusiveHint": "Cuando está habilitado, estas claves de API solo podrán usar los modelos virtuales de este grupo (la reconciliación de allowedQuotas se aplica al guardar).", + "wizardPreviewLabel": "Vista previa de nombres de modelos virtuales", + "wizardConnectionsLabel": "Conexiones de proveedor", + "wizardPrimaryBadge": "principal", + "wizardAdditionalConnectionsNote": "Las conexiones adicionales usan sus límites predeterminados de catálogo (editables más adelante).", + "wizardSingleProviderNote": "Un grupo utiliza un único proveedor", + "wizardPreviewMoreModels": "+{count} más", + "accountQuotaTitle": "Cuota de la cuenta", "accountQuotaNone": "—", - "logTitle": "Usage log", - "logEmpty": "No usage yet", - "groupLabel": "Group", - "newGroup": "New group", - "renameGroup": "Rename group", - "groupSelectHint": "Filter pools by group", - "groupAllocationNote": "Allocations apply to all pools in this group via the shared quota layer.", - "groupNamePrompt": "Enter group name", - "wizardGroupLabel": "Group", - "allGroups": "All groups", - "endpointsTitle": "Available endpoints", - "endpointsHint": "Call these virtual models with any allocated key — routing + quota are handled per group.", - "previewForKey": "Preview for key", - "previewKeyNone": "(all endpoints)", - "endpointsBaseUrl": "Base URL", - "endpointsCollapse": "Collapse", - "endpointsExpand": "Expand", - "endpointsAnthropicNote": "Anthropic-native", - "endpointsResponsesNote": "OpenAI Responses — codex/github", - "endpointsWsNote": "WebSocket — codex only", - "betaText": "Quota Share is functional but bugs are expected. Found one? Please report it.", - "betaReportLink": "Report an issue", - "deleteGroup": "Delete group", - "deleteGroupConfirm": "Delete this group? Its pools must be reassigned or removed first.", - "deleteGroupHasPools": "This group still has pools — reassign or delete them first.", - "ungroupedTitle": "Ungrouped", - "ungroupedHint": "These pools are not assigned to a known group. Edit a pool to move it into a real group.", + "logTitle": "Registro de uso", + "logEmpty": "Aún no hay uso", + "groupLabel": "Grupo", + "newGroup": "Nuevo grupo", + "renameGroup": "Renombrar grupo", + "groupSelectHint": "Filtrar grupos por grupo", + "groupAllocationNote": "Las asignaciones se aplican a todos los grupos de este conjunto mediante la capa de cuota compartida.", + "groupNamePrompt": "Introduce el nombre del grupo", + "wizardGroupLabel": "Grupo", + "allGroups": "Todos los grupos", + "endpointsTitle": "Endpoints disponibles", + "endpointsHint": "Llama a estos modelos virtuales con cualquier clave asignada: el enrutamiento y la cuota se gestionan por grupo.", + "previewForKey": "Vista previa para la clave", + "previewKeyNone": "(todos los endpoints)", + "endpointsBaseUrl": "URL base", + "endpointsCollapse": "Contraer", + "endpointsExpand": "Expandir", + "endpointsAnthropicNote": "Nativo de Anthropic", + "endpointsResponsesNote": "Respuestas de OpenAI — codex/github", + "endpointsWsNote": "WebSocket — solo codex", + "betaText": "Quota Share es funcional, pero es posible que encuentres errores. ¿Has encontrado uno? Infórmanos.", + "betaReportLink": "Informar de un problema", + "deleteGroup": "Eliminar grupo", + "deleteGroupConfirm": "¿Eliminar este grupo? Sus grupos deben reasignarse o eliminarse primero.", + "deleteGroupHasPools": "Este grupo todavía contiene elementos; reasígnalos o elimínalos primero.", + "ungroupedTitle": "Sin grupo", + "ungroupedHint": "Estos grupos no están asignados a un grupo conocido. Edítalo para moverlo a un grupo real.", "removeFailed": "Could not remove this pool.", "dismiss": "Dismiss" }, "plugins": { "title": "Plugins", - "description": "Install and manage plugins for extending OmniRoute functionality", - "loading": "Loading plugins...", - "scanning": "Scanning...", - "scanForPlugins": "Scan for Plugins", - "noPlugins": "No plugins installed", - "noPluginsDescription": "Place plugin directories in ~/.omniroute/plugins/ and click Scan.", - "activate": "Activate", - "deactivate": "Deactivate", - "uninstall": "Uninstall", - "uninstallConfirm": "Uninstall plugin \"{name}\"?", - "pluginScanComplete": "Plugin scan complete", - "pluginScanFailed": "Plugin scan failed", - "activated": "{name} activated", - "deactivated": "{name} deactivated", - "activateFailed": "Failed to activate {name}", - "deactivateFailed": "Failed to deactivate {name}", - "uninstalled": "{name} uninstalled", - "uninstallFailed": "Failed to uninstall {name}", - "configure": "Configure: {name}", - "configurePlugin": "Configure", - "noConfigSettings": "This plugin has no configurable settings.", - "saving": "Saving...", - "saveConfiguration": "Save Configuration", - "configurationSaved": "Configuration saved", - "saveConfigurationFailed": "Failed to save configuration", - "pluginNotFound": "Plugin not found", - "version": "Version", - "author": "Author", - "description_label": "Description", - "status": "Status", - "enabled": "Enabled", - "disabled": "Disabled", - "installedTab": "Installed", + "description": "Instala y gestiona plugins para ampliar la funcionalidad de OmniRoute", + "loading": "Cargando plugins...", + "scanning": "Escaneando...", + "scanForPlugins": "Escanear plugins", + "noPlugins": "No hay plugins instalados", + "noPluginsDescription": "Coloca los directorios de plugins en ~/.omniroute/plugins/ y haz clic en Escanear.", + "activate": "Activar", + "deactivate": "Desactivar", + "uninstall": "Desinstalar", + "uninstallConfirm": "¿Desinstalar el plugin \"{name}\"?", + "pluginScanComplete": "Escaneo de plugins completado", + "pluginScanFailed": "El escaneo de plugins ha fallado", + "activated": "{name} activado", + "deactivated": "{name} desactivado", + "activateFailed": "No se pudo activar {name}", + "deactivateFailed": "No se pudo desactivar {name}", + "uninstalled": "{name} desinstalado", + "uninstallFailed": "Error al desinstalar {name}", + "configure": "Configurar: {name}", + "configurePlugin": "Configurar", + "noConfigSettings": "Este plugin no tiene ajustes configurables.", + "saving": "Guardando...", + "saveConfiguration": "Guardar configuración", + "configurationSaved": "Configuración guardada", + "saveConfigurationFailed": "Error al guardar la configuración", + "pluginNotFound": "Plugin no encontrado", + "version": "Versión", + "author": "Autor", + "description_label": "Descripción", + "status": "Estado", + "enabled": "Activado", + "disabled": "Desactivado", + "installedTab": "Instalados", "marketplaceTab": "Marketplace", - "marketplaceUrlLabel": "Custom Marketplace URL", - "marketplaceUrlPlaceholder": "Leave empty for official Omniroute registry", - "saveMarketplaceUrl": "Save & Reload", - "marketplaceUrlSaved": "Marketplace URL updated", - "marketplaceEmpty": "No plugins found in marketplace.", - "marketplaceInstallComingSoon": "Marketplace installs are coming soon.", - "verified": "Verified", - "install": "Install", - "installedFromMarketplace": "Plugin {name} installed!", + "marketplaceUrlLabel": "URL de Marketplace personalizada", + "marketplaceUrlPlaceholder": "Dejar vacío para el registro oficial de Omniroute", + "saveMarketplaceUrl": "Guardar y recargar", + "marketplaceUrlSaved": "URL de Marketplace actualizada", + "marketplaceEmpty": "No se encontraron plugins en el marketplace.", + "marketplaceInstallComingSoon": "Las instalaciones desde el marketplace estarán disponibles pronto.", + "verified": "Verificado", + "install": "Instalar", + "installedFromMarketplace": "¡Plugin {name} instalado!", "hooks": "Hooks" }, "quotaPlans": { - "title": "Plans & Quotas", - "description": "Configure quota plans per provider — dimensions (%, requests, tokens, $) and time windows", - "providerLabel": "Provider / Connection", - "detectedPlanLabel": "Detected plan", - "manualPlanLabel": "Manual override", - "unconfiguredLabel": "Not configured — manual required", - "dimensionLabel": "Dimensions", - "addDimension": "Add dimension", - "removeDimension": "Remove", - "limitLabel": "Limit", + "title": "Planes y cuotas", + "description": "Configura planes de cuota por proveedor: dimensiones (%, solicitudes, tokens, $) y ventanas de tiempo", + "providerLabel": "Proveedor / Conexión", + "detectedPlanLabel": "Plan detectado", + "manualPlanLabel": "Anulación manual", + "unconfiguredLabel": "No configurado: requiere configuración manual", + "dimensionLabel": "Dimensiones", + "addDimension": "Añadir dimensión", + "removeDimension": "Eliminar", + "limitLabel": "Límite", "unitOptions": { "percent": "%", - "requests": "requests", + "requests": "solicitudes", "tokens": "tokens", "usd": "USD ($)" }, "windowOptions": { - "5h": "5 hours", - "hourly": "Hourly", - "daily": "Daily", - "weekly": "Weekly", - "monthly": "Monthly" + "5h": "5 horas", + "hourly": "Por hora", + "daily": "Diario", + "weekly": "Semanal", + "monthly": "Mensual" }, - "useCatalogButton": "Use catalog", - "saveOverrideButton": "Save override", - "revertToCatalogButton": "Revert to catalog", - "unknownProviderNotice": "Select a provider on the left to configure its quota plan.", - "catalogTitle": "Known catalog", - "catalogDescription": "Automatically detected plans for the following providers:" + "useCatalogButton": "Usar catálogo", + "saveOverrideButton": "Guardar anulación", + "revertToCatalogButton": "Revertir al catálogo", + "unknownProviderNotice": "Selecciona un proveedor a la izquierda para configurar su plan de cuota.", + "catalogTitle": "Catálogo conocido", + "catalogDescription": "Planes detectados automáticamente para los siguientes proveedores:" }, "activity": { - "title": "Activity", - "description": "Recent events feed", - "emptyTitle": "No activity yet", - "emptyDescription": "When you add providers, create combos, or rotate keys, events will appear here.", - "todayHeader": "Today", - "yesterdayHeader": "Yesterday", - "filterAll": "All", - "filterProviders": "Providers", + "title": "Actividad", + "description": "Feed de eventos recientes", + "emptyTitle": "Aún no hay actividad", + "emptyDescription": "Cuando añadas proveedores, crees combos o rotes claves, los eventos aparecerán aquí.", + "todayHeader": "Hoy", + "yesterdayHeader": "Ayer", + "filterAll": "Todos", + "filterProviders": "Proveedores", "filterCombos": "Combos", - "filterApiKeys": "API Keys", - "filterSettings": "Settings", - "filterQuota": "Quota", - "filterAuth": "Auth", - "filterSystem": "System", - "filterAria": "Filter by event type", - "refresh": "Refresh", - "refreshAria": "Refresh activity feed", - "loading": "Loading", - "loadingActivity": "Loading activity…", - "fetchFailed": "Failed to fetch activity", + "filterApiKeys": "Claves de API", + "filterSettings": "Ajustes", + "filterQuota": "Cuota", + "filterAuth": "Autenticación", + "filterSystem": "Sistema", + "filterAria": "Filtrar por tipo de evento", + "refresh": "Actualizar", + "refreshAria": "Actualizar feed de actividad", + "loading": "Cargando", + "loadingActivity": "Cargando actividad…", + "fetchFailed": "Error al obtener la actividad", "relative": { - "justNow": "just now", - "minutesAgo": "{n} min ago", - "hoursAgo": "{n} h ago", - "yesterday": "yesterday", - "daysAgo": "{n} days ago" + "justNow": "hace un momento", + "minutesAgo": "hace {n} min", + "hoursAgo": "hace {n} h", + "yesterday": "ayer", + "daysAgo": "hace {n} días" }, "eventVerb": { - "providerAdded": "{actor} added provider {target}", - "providerRemoved": "{actor} removed provider {target}", - "providerTested": "{actor} tested provider {target}", - "comboCreated": "{actor} created combo {target}", - "comboUpdated": "{actor} updated combo {target}", - "comboDeleted": "{actor} removed combo {target}", - "apiKeyCreated": "{actor} created API key {target}", - "apiKeyRevoked": "{actor} revoked API key {target}", - "apiKeyRotated": "{actor} rotated API key {target}", - "budgetThreshold": "Budget threshold reached for {target}", - "settingUpdated": "{actor} updated setting {target}", - "authLogin": "{actor} signed in", - "authLogout": "{actor} signed out", - "cloudAgentSession": "Cloud agent session started for {target}", - "mcpToolRegistered": "MCP tool {target} registered", - "webhookCreated": "{actor} created webhook {target}", - "webhookDeleted": "{actor} removed webhook {target}", - "quotaPoolCreated": "{actor} created quota pool {target}", - "quotaPoolUpdated": "{actor} updated quota pool {target}", - "quotaPoolDeleted": "{actor} removed quota pool {target}", - "quotaPlanUpdated": "{actor} updated quota plan {target}", - "quotaStoreDriverChanged": "QuotaStore driver changed", - "updateApplied": "Update {target} applied", - "deployCompleted": "Deploy completed", - "skillInstalled": "{actor} installed skill {target}", - "skillRemoved": "{actor} removed skill {target}", - "providerCredentialsCreated": "{actor} created credentials for {target}", - "providerCredentialsApplied": "Credentials for {target} applied", - "providerCredentialsUpdated": "{actor} updated credentials for {target}", - "providerCredentialsRevoked": "{actor} revoked credentials for {target}", - "providerCredentialsBatchRevoked": "{actor} batch-revoked credentials", - "providerCredentialsBatchUpdated": "{actor} batch-updated credentials", - "providerCredentialsBulkCreated": "{actor} bulk-created credentials", - "providerCredentialsBulkImported": "{actor} bulk-imported credentials", - "providerCredentialsImported": "{actor} imported credentials", - "providerSsrfBlocked": "SSRF attempt blocked for {target}", - "authLoginSuccess": "{actor} signed in", - "authLoginError": "Login error for {actor}", - "authLoginFailed": "Login failed for {actor}", - "authLoginLocked": "{actor} locked out after too many attempts", - "authLoginMisconfigured": "Auth configuration invalid", - "authLoginSetupRequired": "Auth setup required", - "authLogoutSuccess": "{actor} signed out", - "syncTokenCreated": "{actor} created sync token", - "syncTokenRevoked": "{actor} revoked sync token", - "settingsUpdate": "{actor} updated settings", - "settingsUpdateFailed": "Settings update failed", - "serviceRevealApiKey": "{actor} revealed API key for {target}", + "providerAdded": "{actor} añadió el proveedor {target}", + "providerRemoved": "{actor} eliminó el proveedor {target}", + "providerTested": "{actor} probó el proveedor {target}", + "comboCreated": "{actor} creó el combo {target}", + "comboUpdated": "{actor} actualizó el combo {target}", + "comboDeleted": "{actor} eliminó el combo {target}", + "apiKeyCreated": "{actor} creó la clave de API {target}", + "apiKeyRevoked": "{actor} revocó la clave de API {target}", + "apiKeyRotated": "{actor} rotó la clave de API {target}", + "budgetThreshold": "Umbral de presupuesto alcanzado para {target}", + "settingUpdated": "{actor} actualizó el ajuste {target}", + "authLogin": "{actor} ha iniciado sesión", + "authLogout": "{actor} ha cerrado sesión", + "cloudAgentSession": "Sesión de agente en la nube iniciada para {target}", + "mcpToolRegistered": "Herramienta MCP {target} registrada", + "webhookCreated": "{actor} creó el webhook {target}", + "webhookDeleted": "{actor} eliminó el webhook {target}", + "quotaPoolCreated": "{actor} creó el pool de cuota {target}", + "quotaPoolUpdated": "{actor} actualizó el pool de cuota {target}", + "quotaPoolDeleted": "{actor} eliminó el pool de cuota {target}", + "quotaPlanUpdated": "{actor} actualizó el plan de cuota {target}", + "quotaStoreDriverChanged": "Controlador de QuotaStore cambiado", + "updateApplied": "Actualización {target} aplicada", + "deployCompleted": "Despliegue completado", + "skillInstalled": "{actor} instaló la skill {target}", + "skillRemoved": "{actor} eliminó la skill {target}", + "providerCredentialsCreated": "{actor} creó credenciales para {target}", + "providerCredentialsApplied": "Credenciales para {target} aplicadas", + "providerCredentialsUpdated": "{actor} actualizó las credenciales para {target}", + "providerCredentialsRevoked": "{actor} revocó las credenciales para {target}", + "providerCredentialsBatchRevoked": "{actor} revocó credenciales por lotes", + "providerCredentialsBatchUpdated": "{actor} actualizó credenciales por lotes", + "providerCredentialsBulkCreated": "{actor} creó credenciales masivamente", + "providerCredentialsBulkImported": "{actor} importó credenciales masivamente", + "providerCredentialsImported": "{actor} importó credenciales", + "providerSsrfBlocked": "Intento de SSRF bloqueado para {target}", + "authLoginSuccess": "{actor} ha iniciado sesión", + "authLoginError": "Error de inicio de sesión para {actor}", + "authLoginFailed": "Inicio de sesión fallido para {actor}", + "authLoginLocked": "{actor} bloqueado tras demasiados intentos", + "authLoginMisconfigured": "Configuración de autenticación no válida", + "authLoginSetupRequired": "Configuración de autenticación requerida", + "authLogoutSuccess": "{actor} ha cerrado sesión", + "syncTokenCreated": "{actor} creó un token de sincronización", + "syncTokenRevoked": "{actor} revocó un token de sincronización", + "settingsUpdate": "{actor} actualizó los ajustes", + "settingsUpdateFailed": "Error al actualizar los ajustes", + "serviceRevealApiKey": "{actor} reveló la clave de API para {target}", "genericEvent": "{actor} {target}" } }, "agentBridge": { "title": "AgentBridge", - "subtitle": "Use IDE agents with OmniRoute models — no config required", - "riskBannerTitle": "Use at your own risk", - "riskBannerBody": "AgentBridge intercepts HTTPS traffic from IDE agents. By activating it you accept responsibility for compliance with the terms of service of each agent. Never use on devices or networks where TLS inspection is prohibited.", - "riskBannerDismiss": "Dismiss", - "serverCardTitle": "AgentBridge Server", - "statusRunning": "Running", - "statusStopped": "Stopped", - "statusActive": "Active", - "statusDnsOff": "DNS off", - "statusSetupRequired": "Setup required", - "statusInvestigating": "Investigating", - "serverPort": "Port", - "serverConns": "Connections", - "serverIntercepted": "Intercepted", - "serverLastStarted": "Last started", - "startServer": "Start", - "stopServer": "Stop", - "restartServer": "Restart", - "trustCert": "Trust Cert", - "downloadCert": "Download Cert", - "certManualTitle": "Certificate couldn't be installed automatically (e.g. inside a container). The bridge can still run — trust the CA manually:", - "regenerateCert": "Regenerate Cert", - "starting": "Starting…", - "stopping": "Stopping…", - "restarting": "Restarting…", - "trusting": "Trusting…", - "regenerating": "Regenerating…", - "upstreamCaLabel": "Upstream CA Certificate (corporate)", + "subtitle": "Usa agentes de IDE con modelos de OmniRoute: no requiere configuración", + "riskBannerTitle": "Úsalo bajo tu propia responsabilidad", + "riskBannerBody": "AgentBridge intercepta el tráfico HTTPS de los agentes de IDE. Al activarlo, aceptas la responsabilidad de cumplir con los términos de servicio de cada agente. Nunca lo uses en dispositivos o redes donde la inspección TLS esté prohibida.", + "riskBannerDismiss": "Descartar", + "serverCardTitle": "Servidor AgentBridge", + "statusRunning": "En ejecución", + "statusStopped": "Detenido", + "statusActive": "Activo", + "statusDnsOff": "DNS desactivado", + "statusSetupRequired": "Configuración requerida", + "statusInvestigating": "Investigando", + "serverPort": "Puerto", + "serverConns": "Conexiones", + "serverIntercepted": "Interceptado", + "serverLastStarted": "Último inicio", + "startServer": "Iniciar", + "stopServer": "Detener", + "restartServer": "Reiniciar", + "trustCert": "Confiar en certificado", + "downloadCert": "Descargar certificado", + "certManualTitle": "El certificado no pudo instalarse automáticamente (p. ej., dentro de un contenedor). El bridge puede seguir funcionando: confía en la CA manualmente:", + "regenerateCert": "Regenerar certificado", + "starting": "Iniciando…", + "stopping": "Deteniendo…", + "restarting": "Reiniciando…", + "trusting": "Confiando…", + "regenerating": "Regenerando…", + "upstreamCaLabel": "Certificado CA ascendente (corporativo)", "upstreamCaPlaceholder": "/etc/ssl/certs/corp-ca.pem", - "upstreamCaTest": "Test TLS", - "upstreamCaTestOk": "TLS test passed", - "upstreamCaTestError": "TLS test failed — check the path and CA file", - "bypassSectionTitle": "Bypass List", - "bypassSectionDesc": "Hosts matching these patterns are tunneled directly (no TLS decryption). Defaults include banks.gov, and corporate SSO.", - "bypassDefaultsLabel": "Default bypass patterns (read-only)", - "bypassUserLabel": "Custom bypass patterns (one per line, glob or regex)", - "saveBypassList": "Save bypass list", - "agentListTitle": "IDE Agents", - "filterAll": "All", - "filterActive": "Active", - "filterSetupRequired": "Setup required", - "filterInvestigating": "Investigating", - "searchAgents": "Search agents…", - "noAgentsMatch": "No agents match the current filter", - "agentHosts": "Intercepted hosts", - "certTrusted": "Certificate trusted", - "certNotTrusted": "Certificate not trusted", - "investigatingNotice": "This agent is under investigation. Hosts and API surface are still being confirmed. Setup will be available once the upstream API is documented.", - "modelMappingsLabel": "Model mappings", - "sourceModel": "Source model (agent native)", - "targetModel": "Target model (OmniRoute)", - "noMappings": "No model mappings configured. Run setup wizard to auto-detect models.", - "selectModel": "Select…", - "saveMappings": "Save mappings", - "setupWizard": "Setup wizard", - "startDns": "Start DNS", - "stopDns": "Stop DNS", - "toggling": "Toggling…", - "viewTraffic": "View traffic", - "emptyNoProvidersTitle": "No providers configured yet", - "emptyNoProvidersBody": "To use AgentBridge, first connect at least one provider. It will be the destination where IDE requests are routed.", - "emptyGoToProviders": "Go to Providers", - "wizardTitle": "Setup wizard", - "wizardSubtitle": "3-step setup", - "wizardStep1Label": "Verify", + "upstreamCaTest": "Probar TLS", + "upstreamCaTestOk": "Prueba de TLS superada", + "upstreamCaTestError": "Error en la prueba de TLS: comprueba la ruta y el archivo CA", + "bypassSectionTitle": "Lista de exclusión", + "bypassSectionDesc": "Los hosts que coincidan con estos patrones se tunelizarán directamente (sin descifrado TLS). Los valores predeterminados incluyen banks.gov y SSO corporativo.", + "bypassDefaultsLabel": "Patrones de exclusión predeterminados (solo lectura)", + "bypassUserLabel": "Patrones de exclusión personalizados (uno por línea, glob o regex)", + "saveBypassList": "Guardar lista de exclusión", + "agentListTitle": "Agentes de IDE", + "filterAll": "Todos", + "filterActive": "Activo", + "filterSetupRequired": "Configuración requerida", + "filterInvestigating": "Investigando", + "searchAgents": "Buscar agentes…", + "noAgentsMatch": "Ningún agente coincide con el filtro actual", + "agentHosts": "Hosts interceptados", + "certTrusted": "Certificado de confianza", + "certNotTrusted": "Certificado no confiable", + "investigatingNotice": "Este agente está bajo investigación. Los hosts y la superficie de la API aún están siendo confirmados. La configuración estará disponible una vez que se documente la API ascendente.", + "modelMappingsLabel": "Mapeos de modelos", + "sourceModel": "Modelo de origen (nativo del agente)", + "targetModel": "Modelo de destino (OmniRoute)", + "noMappings": "No hay mapeos de modelos configurados. Ejecuta el asistente de configuración para detectar modelos automáticamente.", + "selectModel": "Seleccionar…", + "saveMappings": "Guardar asignaciones", + "setupWizard": "Asistente de configuración", + "startDns": "Iniciar DNS", + "stopDns": "Detener DNS", + "toggling": "Cambiando estado…", + "viewTraffic": "Ver tráfico", + "emptyNoProvidersTitle": "Todavía no hay proveedores configurados", + "emptyNoProvidersBody": "Para usar AgentBridge, conecta primero al menos un proveedor. Será el destino al que se enruten las solicitudes del IDE.", + "emptyGoToProviders": "Ir a Proveedores", + "wizardTitle": "Asistente de configuración", + "wizardSubtitle": "Configuración en 3 pasos", + "wizardStep1Label": "Verificar", "wizardStep2Label": "DNS", - "wizardStep3Label": "Mappings", - "wizardStep1Desc": "Confirm the server is running and the certificate is installed.", - "wizardStep2Desc": "The following entries will be added to /etc/hosts to redirect traffic through AgentBridge:", - "wizardStep3Desc": "You can now configure model mappings in the agent card. Restart the IDE to apply changes.", - "wizardStep3Success": "Agent is configured!", - "wizardServerCheck": "AgentBridge server", - "wizardRunning": "running", - "wizardNotRunning": "not running", - "wizardCertCheck": "Certificate", - "wizardTrusted": "trusted", - "wizardNotTrusted": "not yet trusted — use Trust Cert button", - "wizardTutorialTitle": "Setup instructions:", - "wizardEnableDns": "Add /etc/hosts entries", - "wizardDnsAlreadyEnabled": "DNS already enabled for this agent", - "enablingDns": "Enabling…", - "modelSelectorTitle": "Select target model", - "modelSelectorSearch": "Search models…", - "noModelsFound": "No models found", - "quickLinks": "Quick links", - "quickLinkProviders": "Configure providers", - "quickLinkInspector": "View traffic in Traffic Inspector", - "unknownError": "Unknown error", - "maintenanceTitle": "Maintenance & Diagnostics", - "maintenanceSubtitle": "Self-test the capture pipeline, undo leftover system state, and move your setup between machines.", - "orphanedStateWarning": "A previous session left system state behind (DNS spoof, CA, or system proxy). Run Repair to clean it up.", - "diagnose": "Diagnose", - "diagnosing": "Diagnosing…", - "diagnoseHealthy": "Capture pipeline is healthy.", - "diagnoseUnhealthy": "Capture pipeline has problems:", - "repair": "Repair", - "repairing": "Repairing…", - "repairDone": "Repaired: {items}", - "repairNothing": "Nothing to repair — system state is clean.", - "removeCa": "Remove CA", - "removeCaConfirm": "Remove CA?", - "removeCaDone": "MITM root CA removed from the OS trust store.", - "removing": "Removing…", - "confirm": "Confirm", - "exportConfig": "Export config", - "exporting": "Exporting…", - "importConfig": "Import config", - "importing": "Importing…", - "importInvalidJson": "The selected file is not valid JSON.", - "importDone": "Imported {bypass} bypass · {hosts} hosts · {agents} agents", - "save": "Save", - "saving": "Saving…", - "cancel": "Cancel", - "back": "Back", - "next": "Next", - "done": "Done", - "loading": "Loading…", - "riskNoticeTitle": "Risk acknowledgment", - "riskNoticeBody": "AgentBridge will intercept HTTPS traffic from this agent by redirecting its API hosts via DNS. Only enable if you accept responsibility for compliance with the agent's terms of service and any applicable network policies.", + "wizardStep3Label": "Asignaciones", + "wizardStep1Desc": "Confirma que el servidor se está ejecutando y el certificado está instalado.", + "wizardStep2Desc": "Se añadirán las siguientes entradas a /etc/hosts para redirigir el tráfico a través de AgentBridge:", + "wizardStep3Desc": "Ahora puedes configurar las asignaciones de modelos en la tarjeta del agente. Reinicia el IDE para aplicar los cambios.", + "wizardStep3Success": "¡El agente está configurado!", + "wizardServerCheck": "Servidor de AgentBridge", + "wizardRunning": "en ejecución", + "wizardNotRunning": "detenido", + "wizardCertCheck": "Certificado", + "wizardTrusted": "de confianza", + "wizardNotTrusted": "todavía no es de confianza — usa el botón Confiar certificado", + "wizardTutorialTitle": "Instrucciones de configuración:", + "wizardEnableDns": "Añadir entradas a /etc/hosts", + "wizardDnsAlreadyEnabled": "DNS ya habilitado para este agente", + "enablingDns": "Habilitando…", + "modelSelectorTitle": "Seleccionar modelo de destino", + "modelSelectorSearch": "Buscar modelos…", + "noModelsFound": "No se han encontrado modelos", + "quickLinks": "Enlaces rápidos", + "quickLinkProviders": "Configurar proveedores", + "quickLinkInspector": "Ver tráfico en el inspector de tráfico", + "unknownError": "Error desconocido", + "maintenanceTitle": "Mantenimiento y diagnóstico", + "maintenanceSubtitle": "Autoprueba de la canalización de captura, deshacer el estado residual del sistema y trasladar tu configuración entre equipos.", + "orphanedStateWarning": "Una sesión anterior ha dejado estado residual en el sistema (DNS spoof, CA o proxy del sistema). Ejecuta Reparar para limpiarlo.", + "diagnose": "Diagnosticar", + "diagnosing": "Diagnosticando…", + "diagnoseHealthy": "La canalización de captura funciona correctamente.", + "diagnoseUnhealthy": "La canalización de captura tiene problemas:", + "repair": "Reparar", + "repairing": "Reparando…", + "repairDone": "Reparado: {items}", + "repairNothing": "Nada que reparar; el estado del sistema está limpio.", + "removeCa": "Eliminar CA", + "removeCaConfirm": "¿Eliminar CA?", + "removeCaDone": "CA raíz MITM eliminada del almacén de confianza del SO.", + "removing": "Eliminando…", + "confirm": "Confirmar", + "exportConfig": "Exportar configuración", + "exporting": "Exportando…", + "importConfig": "Importar configuración", + "importing": "Importando…", + "importInvalidJson": "El archivo seleccionado no es un JSON válido.", + "importDone": "Importados {bypass} omitidos · {hosts} hosts · {agents} agentes", + "save": "Guardar", + "saving": "Guardando…", + "cancel": "Cancelar", + "back": "Atrás", + "next": "Siguiente", + "done": "Hecho", + "loading": "Cargando…", + "riskNoticeTitle": "Reconocimiento de riesgos", + "riskNoticeBody": "AgentBridge interceptará el tráfico HTTPS de este agente redirigiendo sus hosts de API mediante DNS. Habilítalo únicamente si aceptas la responsabilidad de cumplir con los términos de servicio del agente y cualquier directiva de red aplicable.", "pageMoved": { - "goNow": "Go now", - "message": "The MITM Proxy now lives under AgentBridge.", - "title": "This page has moved" + "goNow": "Ir ahora", + "message": "MITM Proxy ahora forma parte de AgentBridge.", + "title": "Esta página ha cambiado de ubicación" } }, "providerStats": { - "unknownError": "Unknown error", - "loading": "Loading provider stats...", - "loadFailed": "Failed to load provider stats: {error}", - "retry": "Retry", - "updated": "Updated {time}", - "refresh": "Refresh", - "totalRequests": "Total Requests", - "avgLatency": "Avg Latency", - "successRate": "Success Rate", - "activeProviders": "Active Providers", - "providerBreakdown": "Provider Breakdown", - "providerCount": "{count} providers", - "provider": "Provider", - "requests": "Requests", - "success": "Success", - "rate": "Rate", - "tokensIn": "Tokens In", - "tokensOut": "Tokens Out", - "ttftAfterTool": "TTFT After Tool", - "gapAfterTool": "Gap After Tool", - "model": "Model", - "noProviderData": "No provider data recorded yet.", - "comboMetrics": "Combo Metrics", - "comboMetricsDescription": "Per-combo latency and throughput from streaming", - "avgTtft": "Avg TTFT", - "avgTotal": "Avg Total", - "requestTelemetry": "Request Telemetry", - "requestTelemetryDescription": "7-phase pipeline breakdown (last 5 minutes)" + "unknownError": "Error desconocido", + "loading": "Cargando estadísticas del proveedor...", + "loadFailed": "Error al cargar las estadísticas del proveedor: {error}", + "retry": "Reintentar", + "updated": "Actualizado a las {time}", + "refresh": "Actualizar", + "totalRequests": "Solicitudes totales", + "avgLatency": "Latencia media", + "successRate": "Tasa de éxito", + "activeProviders": "Proveedores activos", + "providerBreakdown": "Desglose por proveedor", + "providerCount": "{count} proveedores", + "provider": "Proveedor", + "requests": "Solicitudes", + "success": "Éxito", + "rate": "Tasa", + "tokensIn": "Tokens de entrada", + "tokensOut": "Tokens de salida", + "ttftAfterTool": "TTFT tras herramienta", + "gapAfterTool": "Intervalo tras herramienta", + "model": "Modelo", + "noProviderData": "Aún no se han registrado datos de proveedores.", + "comboMetrics": "Métricas combinadas", + "comboMetricsDescription": "Latencia y rendimiento por combinación mediante streaming", + "avgTtft": "TTFT medio", + "avgTotal": "Total medio", + "requestTelemetry": "Telemetría de solicitudes", + "requestTelemetryDescription": "Desglose de la canalización en 7 fases (últimos 5 minutos)" }, "relay": { - "title": "Serverless Relay Proxies", - "description": "Create public API endpoints that proxy to OmniRoute with rate limiting and access control", - "created": "Relay token created", - "createFailed": "Failed to create token", - "toggleFailed": "Failed to toggle token", - "deleteConfirm": "Delete this relay token? This cannot be undone.", - "deleted": "Token deleted", - "deleteFailed": "Failed to delete token", - "cancel": "Cancel", - "newToken": "New Relay Token", - "createTitle": "Create Relay Token", - "nameRequired": "Name *", - "tokenDescription": "Description", - "descriptionPlaceholder": "For my serverless functions", - "maxPerMinute": "Max Requests/Minute", - "maxPerDay": "Max Requests/Day", - "createButton": "Create Token", - "createdTitle": "Token Created — Copy it now!", - "tokenFor": "Token for {name}:", - "shownOnce": "This token will not be shown again. Store it securely.", - "dismiss": "Dismiss", - "usage": "Usage", - "usageDescription": "Send requests to your relay endpoint:", - "tokenCount": "Relay Tokens ({count})", - "loading": "Loading...", - "empty": "No relay tokens configured. Create one to get started.", - "disable": "Disable", - "enable": "Enable", - "delete": "Delete" + "title": "Proxies de retransmisión sin servidor", + "description": "Crea endpoints de API públicos que actúen como proxy hacia OmniRoute con limitación de tasa y control de acceso", + "created": "Token de retransmisión creado", + "createFailed": "Error al crear el token", + "toggleFailed": "Error al cambiar el estado del token", + "deleteConfirm": "¿Eliminar este token de retransmisión? Esta acción no se puede deshacer.", + "deleted": "Token eliminado", + "deleteFailed": "Error al eliminar el token", + "cancel": "Cancelar", + "newToken": "Nuevo token de retransmisión", + "createTitle": "Crear token de retransmisión", + "nameRequired": "Nombre *", + "tokenDescription": "Descripción", + "descriptionPlaceholder": "Para mis funciones sin servidor", + "maxPerMinute": "Máx. solicitudes/minuto", + "maxPerDay": "Máx. solicitudes/día", + "createButton": "Crear token", + "createdTitle": "Token creado — ¡Cópialo ahora!", + "tokenFor": "Token para {name}:", + "shownOnce": "Este token no se volverá a mostrar. Guárdalo de forma segura.", + "dismiss": "Descartar", + "usage": "Uso", + "usageDescription": "Envía solicitudes a tu endpoint de retransmisión:", + "tokenCount": "Tokens de retransmisión ({count})", + "loading": "Cargando...", + "empty": "No hay tokens de retransmisión configurados. Crea uno para empezar.", + "disable": "Deshabilitar", + "enable": "Habilitar", + "delete": "Eliminar" }, "trafficInspector": { - "title": "Traffic Inspector", - "subtitle": "Monitor LLM calls and debug any application's HTTPS traffic", - "captureModesTitle": "Capture Modes", + "title": "Inspector de tráfico", + "subtitle": "Supervisa las llamadas a LLM y depura el tráfico HTTPS de cualquier aplicación", + "captureModesTitle": "Modos de captura", "agentBridgeMode": "AgentBridge", - "agentBridgeModeDesc": "Capture traffic from all connected IDE agents", - "customHostsMode": "Custom Hosts", - "customHostsModeDesc": "Add specific hosts to intercept", - "httpProxyMode": "HTTP Proxy", - "httpProxyModeDesc": "Use HTTP_PROXY environment variable", - "systemWideMode": "System-wide", - "systemWideModeDesc": "Intercept all system traffic (advanced)", - "tproxyMode": "TPROXY Decrypt", - "tproxyModeUnavailable": "TPROXY decrypt requires Linux + root + the native addon", - "filterBarTitle": "Filters", - "profileLlmOnly": "LLM only", - "profileCustom": "Custom", - "profileAll": "All", - "filterHost": "Filter host…", - "filterAgent": "Agent", - "filterStatus": "Status", - "pauseBtn": "Pause", - "resumeBtn": "Resume", - "clearBtn": "Clear", - "exportHar": "Export .har", + "agentBridgeModeDesc": "Capturar tráfico de todos los agentes de IDE conectados", + "customHostsMode": "Hosts personalizados", + "customHostsModeDesc": "Añadir hosts específicos para interceptar", + "httpProxyMode": "Proxy HTTP", + "httpProxyModeDesc": "Usar la variable de entorno HTTP_PROXY", + "systemWideMode": "Todo el sistema", + "systemWideModeDesc": "Interceptar todo el tráfico del sistema (avanzado)", + "tproxyMode": "Desencriptación TPROXY", + "tproxyModeUnavailable": "La desencriptación TPROXY requiere Linux + root + el complemento nativo", + "filterBarTitle": "Filtros", + "profileLlmOnly": "Solo LLM", + "profileCustom": "Personalizado", + "profileAll": "Todo", + "filterHost": "Filtrar host…", + "filterAgent": "Agente", + "filterStatus": "Estado", + "pauseBtn": "Pausar", + "resumeBtn": "Reanudar", + "clearBtn": "Borrar", + "exportHar": "Exportar .har", "recordSession": "REC", - "stopSession": "Stop", - "liveBadge": "live", - "offlineBadge": "offline", - "noRequests": "No requests captured yet.", - "noRequestsDesc": "Make sure AgentBridge is running or enable another capture mode.", - "selectRequest": "Select a request to inspect it.", - "tabConversation": "Conversation", - "tabHeaders": "Headers", - "tabRequest": "Request", - "tabResponse": "Response", - "tabTiming": "Timing", + "stopSession": "Detener", + "liveBadge": "en directo", + "offlineBadge": "sin conexión", + "noRequests": "Todavía no se han capturado solicitudes.", + "noRequestsDesc": "Asegúrate de que AgentBridge está en ejecución o habilita otro modo de captura.", + "selectRequest": "Selecciona una solicitud para inspeccionarla.", + "tabConversation": "Conversación", + "tabHeaders": "Cabeceras", + "tabRequest": "Solicitud", + "tabResponse": "Respuesta", + "tabTiming": "Tiempos", "tabLlm": "LLM", - "tabStats": "Stats", - "requestHeaders": "Request Headers", - "responseHeaders": "Response Headers", - "rawEvents": "Raw events", - "mergedView": "Merged view", - "noBody": "No body.", - "streaming": "streaming…", - "manageHosts": "Manage hosts", - "copySnippet": "Copy proxy snippet", - "addHost": "Add", + "tabStats": "Estadísticas", + "requestHeaders": "Cabeceras de la solicitud", + "responseHeaders": "Cabeceras de la respuesta", + "rawEvents": "Eventos sin procesar", + "mergedView": "Vista combinada", + "noBody": "Sin cuerpo.", + "streaming": "en streaming…", + "manageHosts": "Gestionar hosts", + "copySnippet": "Copiar fragmento de proxy", + "addHost": "Añadir", "hostPlaceholder": "api.openai.com", - "noHostsYet": "No custom hosts added yet.", - "noSessionsYet": "No sessions yet", - "allTraffic": "All traffic (no session)", - "sessionsDropdown": "Sessions", - "annotationPlaceholder": "Add a note…", - "contextFingerprint": "Context fingerprint", - "llmProvider": "Detected provider", - "llmApiKind": "API kind", - "llmModel": "Model", - "llmMessages": "Messages", + "noHostsYet": "Todavía no se han añadido hosts personalizados.", + "noSessionsYet": "Aún no hay sesiones", + "allTraffic": "Todo el tráfico (sin sesión)", + "sessionsDropdown": "Sesiones", + "annotationPlaceholder": "Añadir una nota…", + "contextFingerprint": "Huella de contexto", + "llmProvider": "Proveedor detectado", + "llmApiKind": "Tipo de API", + "llmModel": "Modelo", + "llmMessages": "Mensajes", "llmStream": "Stream", - "llmMappedTo": "Mapped to", - "llmCostEstimate": "Cost estimate", - "systemProxyExitWarning": "System-wide proxy still active — leave page anyway?", - "customHostsTitle": "Custom Hosts", - "loading": "Loading…", - "copied": "Copied!", - "copy": "Copy", - "httpProxyTitle": "HTTP Proxy Snippet — port {port}", - "notRecording": "Not recording", - "anyStatus": "Any status", - "liveOnly": "Live", - "viewingRecordedSession": "Viewing recorded session", - "backToLive": "Back to live", - "untitledSession": "Untitled session", - "contextHistory": "Context History", - "modelResponse": "Model Response", - "conversationNoMessages": "No messages found in this request.", - "conversationNotAvailable": "Conversation data not available. This may not be an LLM request or the body could not be parsed.", - "loadingCharts": "Loading charts…", - "statsErrors": "Errors", - "statsLatency": "Latency (last 50 requests)", - "statsNoData": "No requests yet. Start a session recording to capture data for stats.", - "statsStatusDistribution": "Status distribution", - "statsSuccessful": "Successful", - "statsTotalRequests": "Total requests", - "timingProxyOverhead": "Proxy overhead", - "timingUpstreamResponse": "Upstream response", - "timingNoData": "No timing data available.", - "timingTotalLatency": "Total latency", - "timingTimestamp": "Timestamp", - "timingMethod": "Method", - "timingStatus": "Status", - "timingRequestSize": "Request size", - "timingResponseSize": "Response size", - "pausedNewBadge": "{count} new", - "clearContextFilter": "clear", - "invalidHostname": "Invalid hostname", - "invalidHost": "Invalid host", - "addHostFailed": "Failed to add host", - "networkError": "Network error", - "close": "Close", - "removeHost": "Remove {host}", - "requestDetails": "Request details", - "filterByContext": "Filter by this context", - "filteringContext": "Filtering: context {context}", - "clear": "clear", - "trafficProfile": "Traffic profile", - "roleSystem": "System", - "roleUser": "User", - "roleAssistant": "Assistant", - "roleTool": "Tool", - "expand": "Expand", - "collapse": "Collapse", - "systemPromptHidden": "System prompt hidden — click to expand", - "sessionName": "Session {id}", - "sessions": "Sessions", - "requestCountShort": "{count} reqs", - "deleteSession": "Delete session", - "saving": "Saving…", - "sensitiveHeaders": "Sensitive headers", - "show": "Show", - "hide": "Hide", - "name": "Name", - "value": "Value", - "noSseEvents": "No SSE events", - "noRequestBody": "No request body.", - "noResponseBody": "No response body.", - "formatted": "Formatted", + "llmMappedTo": "Asignado a", + "llmCostEstimate": "Coste estimado", + "systemProxyExitWarning": "El proxy del sistema sigue activo. ¿Quieres salir de la página de todos modos?", + "customHostsTitle": "Hosts personalizados", + "loading": "Cargando…", + "copied": "¡Copiado!", + "copy": "Copiar", + "httpProxyTitle": "Snippet de proxy HTTP — puerto {port}", + "notRecording": "No grabando", + "anyStatus": "Cualquier estado", + "liveOnly": "En directo", + "viewingRecordedSession": "Viendo sesión grabada", + "backToLive": "Volver al directo", + "untitledSession": "Sesión sin título", + "contextHistory": "Historial de contexto", + "modelResponse": "Respuesta del modelo", + "conversationNoMessages": "No se han encontrado mensajes en esta solicitud.", + "conversationNotAvailable": "Datos de conversación no disponibles. Puede que no sea una solicitud de LLM o que el cuerpo no se haya podido analizar.", + "loadingCharts": "Cargando gráficos…", + "statsErrors": "Errores", + "statsLatency": "Latencia (últimas 50 solicitudes)", + "statsNoData": "Aún no hay solicitudes. Inicia una grabación de sesión para capturar datos para las estadísticas.", + "statsStatusDistribution": "Distribución de estados", + "statsSuccessful": "Correctas", + "statsTotalRequests": "Total de solicitudes", + "timingProxyOverhead": "Sobrecarga del proxy", + "timingUpstreamResponse": "Respuesta upstream", + "timingNoData": "No hay datos de tiempo disponibles.", + "timingTotalLatency": "Latencia total", + "timingTimestamp": "Marca de tiempo", + "timingMethod": "Método", + "timingStatus": "Estado", + "timingRequestSize": "Tamaño de solicitud", + "timingResponseSize": "Tamaño de respuesta", + "pausedNewBadge": "{count} nuevo", + "clearContextFilter": "limpiar", + "invalidHostname": "Nombre de host no válido", + "invalidHost": "Host no válido", + "addHostFailed": "Error al añadir el host", + "networkError": "Error de red", + "close": "Cerrar", + "removeHost": "Eliminar {host}", + "requestDetails": "Detalles de la solicitud", + "filterByContext": "Filtrar por este contexto", + "filteringContext": "Filtrando: contexto {context}", + "clear": "limpiar", + "trafficProfile": "Perfil de tráfico", + "roleSystem": "Sistema", + "roleUser": "Usuario", + "roleAssistant": "Asistente", + "roleTool": "Herramienta", + "expand": "Expandir", + "collapse": "Contraer", + "systemPromptHidden": "System prompt oculto: haz clic para expandir", + "sessionName": "Sesión {id}", + "sessions": "Sesiones", + "requestCountShort": "{count} solics.", + "deleteSession": "Eliminar sesión", + "saving": "Guardando…", + "sensitiveHeaders": "Cabeceras sensibles", + "show": "Mostrar", + "hide": "Ocultar", + "name": "Nombre", + "value": "Valor", + "noSseEvents": "Sin eventos SSE", + "noRequestBody": "Sin cuerpo de solicitud.", + "noResponseBody": "Sin cuerpo de respuesta.", + "formatted": "Formateado", "raw": "Raw" }, "cliCommon": { "concept": { "code": { - "title": "CLI Code", - "phrase": "Code tools you point at OmniRoute", - "flow": "You → CLI Code → OmniRoute → Provider", - "seeOther": "See →" + "title": "Código CLI", + "phrase": "Herramientas de código que apuntas a OmniRoute", + "flow": "Tú → Código CLI → OmniRoute → Proveedor", + "seeOther": "Ver →" }, "agent": { - "title": "CLI Agents", - "phrase": "Broad-purpose autonomous CLI agents you point at OmniRoute", - "flow": "You → CLI Agent → OmniRoute → Provider", - "seeOther": "See →" + "title": "Agentes CLI", + "phrase": "Agentes CLI autónomos de propósito general que apuntas a OmniRoute", + "flow": "Tú → Agente CLI → OmniRoute → Proveedor", + "seeOther": "Ver →" }, "acp": { - "title": "ACP Agents", - "phrase": "CLIs that OmniRoute spawns as execution backend (reverse flow)", - "flow": "Client → OmniRoute → spawn CLI (stdio/ACP) → response", - "seeOther": "See →" + "title": "Agentes ACP", + "phrase": "CLIs que OmniRoute inicia como backend de ejecución (flujo inverso)", + "flow": "Cliente → OmniRoute → iniciar CLI (stdio/ACP) → respuesta", + "seeOther": "Ver →" } }, "comparison": { - "title": "Understand the 3 CLI types in OmniRoute", - "thisPage": "This page", - "open": "Open →", + "title": "Entiende los 3 tipos de CLI en OmniRoute", + "thisPage": "Esta página", + "open": "Abrir →", "code": { - "title": "Code tool", - "desc": "Points to Omni", - "flow": "you → CLI → Omni → provider", - "examples": "e.g.: claude, codex" + "title": "Herramienta de código", + "desc": "Apunta a Omni", + "flow": "tú → CLI → Omni → proveedor", + "examples": "ej.: claude, codex" }, "agent": { - "title": "Broad autonomous agent", - "desc": "Points to Omni", - "flow": "you → agent → Omni", - "examples": "e.g.: hermes, goose" + "title": "Agente autónomo general", + "desc": "Apunta a Omni", + "flow": "tú → agente → Omni", + "examples": "ej.: hermes, goose" }, "acp": { - "title": "CLI used as backend by Omni", - "desc": "Reverse execution", - "flow": "Omni → spawn CLI → resp", - "examples": "e.g.: claude, codex (ACP)" + "title": "CLI usada como backend por Omni", + "desc": "Ejecución inversa", + "flow": "Omni → iniciar CLI → resp", + "examples": "ej.: claude, codex (ACP)" } }, "card": { - "detected": "Detected", - "notDetected": "Not detected", - "configured": "Configured", - "notConfigured": "Not configured", - "configure": "Configure →", - "howToInstall": "How to install →", - "versionNotFound": "not found", - "manualConfig": "Manual config", - "installGuide": "Install guide", + "detected": "Detectado", + "notDetected": "No detectado", + "configured": "Configurado", + "notConfigured": "No configurado", + "configure": "Configurar →", + "howToInstall": "Cómo instalar →", + "versionNotFound": "no encontrado", + "manualConfig": "Configuración manual", + "installGuide": "Guía de instalación", "endpointLabel": "Endpoint", - "baseUrlFull": "Full Base URL", - "baseUrlPartial": "Partial Base URL", - "refreshDetection": "Refresh detection", - "alsoAcp": "also ACP", - "connectProviderHint": "Connect a provider in Providers" + "baseUrlFull": "URL base completa", + "baseUrlPartial": "URL base parcial", + "refreshDetection": "Actualizar detección", + "alsoAcp": "también ACP", + "connectProviderHint": "Conecta un proveedor en Proveedores" }, "detail": { - "back": "Back", - "apply": "Save", - "reset": "Clear", - "manualConfig": "Manual configuration", - "vendor": "Vendor", - "category": "Type", - "detectionStatus": "Detection", - "configStatus": "Configuration", - "baseUrlLabel": "Base URL", - "apiKeyLabel": "API Key", - "modelMappingLabel": "Model mapping", - "noActiveProviders": "No active providers.", - "noActiveProvidersDesc": "Go to Providers to connect at least 1 provider before configuring the CLI.", - "openProviders": "Open Providers →" + "back": "Atrás", + "apply": "Guardar", + "reset": "Limpiar", + "manualConfig": "Configuración manual", + "vendor": "Proveedor", + "category": "Tipo", + "detectionStatus": "Detección", + "configStatus": "Configuración", + "baseUrlLabel": "URL base", + "apiKeyLabel": "Clave de API", + "modelMappingLabel": "Asignación de modelos", + "noActiveProviders": "No hay proveedores activos.", + "noActiveProvidersDesc": "Ve a Proveedores para conectar al menos 1 proveedor antes de configurar la CLI.", + "openProviders": "Abrir Proveedores →" } }, "cliCode": { - "pageTitle": "CLI Code's", - "pageSubtitle": "Code tools pointing to OmniRoute", - "searchPlaceholder": "Search CLI…", - "filterDetectionLabel": "Detection", - "filterBaseUrlLabel": "Base URL", - "detectionAll": "All", - "detectionInstalled": "Installed", - "detectionNotFound": "Not found", - "baseUrlAll": "All", - "baseUrlFull": "Full", - "baseUrlPartial": "Partial" + "pageTitle": "Código CLI", + "pageSubtitle": "Herramientas de código que apuntan a OmniRoute", + "searchPlaceholder": "Buscar CLI…", + "filterDetectionLabel": "Detección", + "filterBaseUrlLabel": "URL base", + "detectionAll": "Todos", + "detectionInstalled": "Instalado", + "detectionNotFound": "No encontrado", + "baseUrlAll": "Todos", + "baseUrlFull": "Completa", + "baseUrlPartial": "Parcial" }, "cliAgents": { - "pageTitle": "CLI Agents", - "pageSubtitle": "Broad-purpose autonomous CLI agents", - "refreshDetection": "Refresh detection", - "searchPlaceholder": "Search agent…", - "detectionFilterLabel": "Detection", - "detectionAll": "All", - "detectionInstalled": "Installed", - "detectionNotInstalled": "Not installed", + "pageTitle": "Agentes CLI", + "pageSubtitle": "Agentes CLI autónomos de propósito general", + "refreshDetection": "Actualizar detección", + "searchPlaceholder": "Buscar agente…", + "detectionFilterLabel": "Detección", + "detectionAll": "Todos", + "detectionInstalled": "Instalado", + "detectionNotInstalled": "No instalado", "visibleCount": "{count} visible", - "emptyState": "No CLI agents found with the current filters." + "emptyState": "No se han encontrado agentes CLI con los filtros actuales." }, "acpAgents": { - "pageTitle": "ACP Agents", - "pageSubtitle": "CLIs that OmniRoute spawns as execution backend", - "scanning": "Detecting agents…", - "refresh": "Refresh", - "setupGuideTitle": "Setup guide", - "setupGuideDetectCliTitle": "Detect CLI", - "setupGuideDetectCliDesc": "Agents are identified by running the --version command in PATH.", - "setupGuideCustomAgentTitle": "Add custom agent", - "setupGuideCustomAgentDesc": "Fill in the form below to register a custom CLI agent.", - "setupGuideCommandMissingTitle": "Command not found", - "setupGuideCommandMissingDesc": "Check that the binary is in PATH.", - "fingerprintSettingsHint": "Configure routing and fingerprints in", - "settingsRoutingLink": "Settings → Routing", - "installed": "Installed", - "notFound": "Not found", - "builtIn": "Built-in", - "custom": "Custom", - "agentUseCaseHint": "Available for spawn via ACP.", - "remove": "Remove", - "addCustomAgent": "Add custom agent", - "addCustomAgentDesc": "Register a custom CLI agent to be spawned via ACP.", - "addAgent": "Add agent", - "agentName": "Name", - "agentNamePlaceholder": "e.g.: My Agent", - "binaryName": "Binary", - "binaryNamePlaceholder": "e.g.: myagent", - "versionCommand": "Version command", - "versionCommandPlaceholder": "e.g.: myagent --version", - "spawnArgs": "Spawn arguments", - "spawnArgsPlaceholder": "e.g.: --quiet, --json", - "cliCodeRedirectCta": "Open CLI Code" + "pageTitle": "Agentes ACP", + "pageSubtitle": "CLIs que OmniRoute inicia como backend de ejecución", + "scanning": "Detectando agentes…", + "refresh": "Actualizar", + "setupGuideTitle": "Guía de configuración", + "setupGuideDetectCliTitle": "Detectar CLI", + "setupGuideDetectCliDesc": "Los agentes se identifican ejecutando el comando --version en PATH.", + "setupGuideCustomAgentTitle": "Añadir agente personalizado", + "setupGuideCustomAgentDesc": "Rellena el formulario a continuación para registrar un agente CLI personalizado.", + "setupGuideCommandMissingTitle": "Comando no encontrado", + "setupGuideCommandMissingDesc": "Comprueba que el binario esté en PATH.", + "fingerprintSettingsHint": "Configura el enrutamiento y las huellas en", + "settingsRoutingLink": "Ajustes → Enrutamiento", + "installed": "Instalado", + "notFound": "No encontrado", + "builtIn": "Integrado", + "custom": "Personalizado", + "agentUseCaseHint": "Disponible para iniciar mediante ACP.", + "remove": "Eliminar", + "addCustomAgent": "Añadir agente personalizado", + "addCustomAgentDesc": "Registra un agente CLI personalizado para iniciarlo mediante ACP.", + "addAgent": "Añadir agente", + "agentName": "Nombre", + "agentNamePlaceholder": "ej.: Mi Agente", + "binaryName": "Binario", + "binaryNamePlaceholder": "ej.: miagente", + "versionCommand": "Comando de versión", + "versionCommandPlaceholder": "ej.: miagente --version", + "spawnArgs": "Argumentos de inicio", + "spawnArgsPlaceholder": "p. ej.: --quiet, --json", + "cliCodeRedirectCta": "Abrir CLI Code" }, "agentSkills": { "catalog": { "omni-auth": { - "name": "Authentication", - "description": "Manage API key authentication and session tokens. Start here to authenticate requests via Bearer token, obtain session cookies, and configure login requirements for the OmniRoute API." + "name": "Autenticación", + "description": "Gestiona la autenticación mediante clave de API y los tokens de sesión. Empieza aquí para autenticar solicitudes mediante token Bearer, obtener cookies de sesión y configurar los requisitos de inicio de sesión para la API de OmniRoute." }, "omni-providers": { - "name": "Providers", - "description": "Manage provider connections, API keys, OAuth flows, and connection tests via the REST API. List, add, update, remove, and test AI provider integrations (OpenAI, Anthropic, Gemini, and 160+)." + "name": "Proveedores", + "description": "Gestiona las conexiones de proveedor, claves de API, flujos de OAuth y pruebas de conexión a través de la API REST. Lista, añade, actualiza, elimina y prueba integraciones de proveedores de IA (OpenAI, Anthropic, Gemini y más de 160)." }, "omni-models": { - "name": "Models", - "description": "Query available AI models across all configured providers. List models, resolve model aliases, and browse the full model catalog including provider-specific variants." + "name": "Modelos", + "description": "Consulta los modelos de IA disponibles en todos los proveedores configurados. Lista modelos, resuelve alias de modelos y explora el catálogo completo de modelos, incluidas las variantes específicas de cada proveedor." }, "omni-combos-routing": { - "name": "Combos & Routing", - "description": "Create and manage routing combos with 14 strategies (priority, weighted, round-robin, Auto-combo, etc.). Configure fallback chains, test routing outcomes, and retrieve combo metrics." + "name": "Combos y enrutamiento", + "description": "Crea y gestiona combos de enrutamiento con 14 estrategias (prioridad, ponderado, turno rotativo, Autocombo, etc.). Configura cadenas de fallback, prueba los resultados de enrutamiento y recupera métricas de los combos." }, "omni-api-keys": { - "name": "API Keys", - "description": "Create, list, rotate, and revoke OmniRoute API keys. Control per-key scopes, spending limits, and expiration. Keys gate access to all proxy and management endpoints." + "name": "Claves de API", + "description": "Crea, lista, rota y revoca claves de API de OmniRoute. Controla los ámbitos, límites de gasto y caducidad de cada clave. Las claves regulan el acceso a todos los endpoints de proxy y gestión." }, "omni-usage-logs": { - "name": "Usage & Logs", - "description": "Access detailed call logs and usage analytics. Filter by provider, model, time range, status, and cost. Export logs and aggregate token usage across all connections." + "name": "Uso y registros", + "description": "Accede a registros de llamadas detallados y análisis de uso. Filtra por proveedor, modelo, intervalo de tiempo, estado y coste. Exporta registros y calcula el uso total de tokens en todas las conexiones." }, "omni-budget": { - "name": "Budget & Rate Limits", - "description": "Configure spending limits, token quotas, and rate-limit policies per API key or globally. Inspect current consumption and enforce cost controls across providers." + "name": "Presupuesto y límites de tasa", + "description": "Configura límites de gasto, cuotas de tokens y políticas de limitación de tasa (rate limit) por clave de API o de forma global. Inspecciona el consumo actual y aplica controles de coste entre proveedores." }, "omni-settings": { - "name": "Settings", - "description": "Read and update global application settings: system prompts, thinking budget, IP filters, payload rules, combo defaults, and require-login configuration." + "name": "Ajustes", + "description": "Lee y actualiza los ajustes globales de la aplicación: prompts del sistema, presupuesto de razonamiento (thinking budget), filtros de IP, reglas de carga útil, valores predeterminados de combos y configuración de inicio de sesión obligatorio." }, "omni-proxies": { - "name": "Proxy Configuration", - "description": "Configure HTTP/HTTPS/SOCKS proxies for upstream provider requests. Set per-provider or global proxy rules, test connectivity, and manage proxy rotation." + "name": "Configuración de proxy", + "description": "Configura proxys HTTP/HTTPS/SOCKS para solicitudes a proveedores ascendentes. Establece reglas de proxy globales o por proveedor, prueba la conectividad y gestiona la rotación de proxys." }, "omni-cache": { - "name": "Cache", - "description": "Manage the LLM response cache. View cache statistics, clear entries, configure TTL policies, and control semantic-similarity caching thresholds." + "name": "Caché", + "description": "Gestiona la caché de respuestas del LLM. Visualiza estadísticas de la caché, borra entradas, configura políticas de TTL y controla los umbrales de caché por similitud semántica." }, "omni-compression": { - "name": "Compression", - "description": "Configure RTK (command output), Caveman (prose), and stacked compression modes. Manage language packs, custom rules, and test prompt compression reducing tokens by 60–90%." + "name": "Compresión", + "description": "Configura los modos de compresión RTK (salida de comandos), Caveman (prosa) y apilada. Gestiona paquetes de idiomas, reglas personalizadas y prueba la compresión de prompts para reducir tokens entre un 60 % y un 90 %." }, "omni-context-rtk": { - "name": "Context & RTK", - "description": "Configure RTK filters, context engineering rules, and context relay settings. Test compression with real prompt samples and manage context transformation pipelines." + "name": "Contexto y RTK", + "description": "Configura filtros RTK, reglas de ingeniería de contexto y ajustes de retransmisión de contexto. Prueba la compresión con muestras de prompt reales y gestiona flujos de transformación de contexto." }, "omni-resilience": { - "name": "Resilience & Monitoring", - "description": "Monitor provider health, circuit-breaker states, p50/p95/p99 latency metrics, and budget guard alerts. Inspect connection cooldowns and model lockouts in real time." + "name": "Resiliencia y monitorización", + "description": "Monitoriza el estado de los proveedores, los estados de los disyuntores (circuit breakers), las métricas de latencia p50/p95/p99 y las alertas de protección de presupuesto. Inspecciona los tiempos de espera (cooldowns) de conexión y los bloqueos de modelos en tiempo real." }, "omni-cli-tools": { - "name": "CLI Tools", - "description": "Manage CLI tool integrations exposed via the API. List, configure, and invoke CLI tool plugins that extend OmniRoute's automation surface." + "name": "Herramientas CLI", + "description": "Gestiona integraciones de herramientas CLI expuestas a través de la API. Lista, configura e invoca plugins de herramientas CLI que amplían la superficie de automatización de OmniRoute." }, "omni-tunnels": { - "name": "Tunnels", - "description": "Create and manage secure tunnels (ngrok, Cloudflare Tunnel, custom) to expose OmniRoute to the internet or share access with remote agents and CI pipelines." + "name": "Túneles", + "description": "Crea y gestiona túneles seguros (ngrok, Cloudflare Tunnel, personalizados) para exponer OmniRoute a internet o compartir el acceso con agentes remotos y pipelines de CI." }, "omni-sync-cloud": { - "name": "Cloud Sync", - "description": "Synchronise OmniRoute configuration, provider connections, and settings to/from cloud storage. Manage cloud worker authentication and remote backup targets." + "name": "Sincronización en la nube", + "description": "Sincroniza la configuración, las conexiones de proveedores y los ajustes de OmniRoute con el almacenamiento en la nube (y viceversa). Gestiona la autenticación de trabajadores en la nube y los destinos de copia de seguridad remota." }, "omni-db-backups": { - "name": "Database & Backups", - "description": "Trigger system backups, restore from backup files, and manage the SQLite database lifecycle. Supports export, import, and incremental snapshot strategies." + "name": "Base de datos y copias de seguridad", + "description": "Activa copias de seguridad del sistema, restaura a partir de archivos de respaldo y gestiona el ciclo de vida de la base de datos SQLite. Es compatible con estrategias de exportación, importación y snapshots incrementales." }, "omni-webhooks": { "name": "Webhooks", - "description": "Register, list, test, and remove webhook endpoints. Configure event subscriptions (request.completed, provider.error, budget.exceeded, etc.) and manage delivery retries." + "description": "Registra, lista, prueba y elimina endpoints de webhooks. Configura suscripciones a eventos (request.completed, provider.error, budget.exceeded, etc.) y gestiona los reintentos de entrega." }, "omni-mcp": { - "name": "MCP Server", - "description": "Connect to the OmniRoute MCP server (37 tools, 3 transports: SSE/stdio/HTTP). Covers routing, cache, compression, memory, skills, providers, and audit tools across 16 permission scopes." + "name": "Servidor MCP", + "description": "Conéctate al servidor MCP de OmniRoute (37 herramientas, 3 transportes: SSE/stdio/HTTP). Abarca enrutamiento, caché, compresión, memoria, habilidades, proveedores y herramientas de auditoría en 16 ámbitos de permisos." }, "omni-agents-a2a": { - "name": "Agents & A2A Protocol", - "description": "Interact with OmniRoute via JSON-RPC 2.0 agent-to-agent protocol. 6 built-in A2A skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities." + "name": "Agentes y protocolo A2A", + "description": "Interactúa con OmniRoute a través del protocolo de agente a agente JSON-RPC 2.0. 6 habilidades A2A integradas: smart-routing, quota-management, provider-discovery, cost-analysis, health-report, list-capabilities." }, "omni-version-manager": { - "name": "Version Manager", - "description": "Install, start, stop, restart, and update embedded services (9Router, CLIProxyAPI). Monitor service status, retrieve logs, and configure auto-start for local-only service endpoints." + "name": "Gestor de versiones", + "description": "Instala, inicia, detiene, reinicia y actualiza servicios integrados (9Router, CLIProxyAPI). Monitoriza el estado de los servicios, recupera registros y configura el inicio automático para endpoints de servicio exclusivamente locales." }, "omni-inference": { - "name": "Inference (OpenAI-compatible)", - "description": "The core OpenAI-compatible inference endpoints: chat completions, embeddings, images, audio (TTS/STT), moderations, rerank, and the Responses API. The primary integration surface for AI agents." + "name": "Inferencia (compatible con OpenAI)", + "description": "Los endpoints de inferencia principales compatibles con OpenAI: completados de chat, embeddings, imágenes, audio (TTS/STT), moderaciones, rerank y la API de respuestas (Responses API). La superficie de integración principal para agentes de IA." }, "cli-serve": { - "name": "CLI: Serve", - "description": "Start, stop, and restart the OmniRoute server from the CLI. Manage daemon mode, port configuration, auto-recovery, system tray integration, and the dashboard open shortcut." + "name": "CLI: Servir", + "description": "Inicia, detiene y reinicia el servidor de OmniRoute desde la CLI. Gestiona el modo daemon, la configuración de puertos, la recuperación automática, la integración con la bandeja del sistema y el acceso directo al panel." }, "cli-health": { - "name": "CLI: Health", - "description": "Check server health, component status, and live metrics from the CLI. Run `health`, `health components`, and `health watch` for a real-time dashboard of circuit breakers and provider status." + "name": "CLI: Estado de salud", + "description": "Comprueba el estado del servidor, el estado de los componentes y las métricas en directo desde la CLI. Ejecuta `health`, `health components` y `health watch` para ver un panel en tiempo real de los disyuntores y el estado de los proveedores." }, "cli-providers": { - "name": "CLI: Providers", - "description": "Manage provider connections from the CLI: list available/configured providers, add, test, test-all, validate, rotate API keys, and view per-provider metrics." + "name": "CLI: Proveedores", + "description": "Gestiona las conexiones de proveedores desde la CLI: lista proveedores disponibles/configurados, añade, prueba, prueba todo (test-all), valida, rota claves de API y consulta las métricas por proveedor." }, "cli-keys": { - "name": "CLI: API Keys", - "description": "Create, list, rotate, and revoke OmniRoute API keys from the CLI. Manage OAuth flows for provider authentication and inspect key scopes and expiration." + "name": "CLI: Claves de API", + "description": "Crea, lista, rota y revoca claves de API de OmniRoute desde la CLI. Gestiona flujos de OAuth para la autenticación de proveedores e inspecciona los ámbitos y la caducidad de las claves." }, "cli-models": { - "name": "CLI: Models", - "description": "Query available AI models, list model aliases, and browse the full model catalog from the CLI. Filter by provider, search by capability, and resolve model name variants." + "name": "CLI: Modelos", + "description": "Consulta los modelos de IA disponibles, lista alias de modelos y explora el catálogo completo de modelos desde la CLI. Filtra por proveedor, busca por capacidad y resuelve variantes de nombres de modelos." }, "cli-chat": { "name": "CLI: Chat", - "description": "Send chat completions, stream responses, and start an interactive REPL session from the CLI. Supports all OmniRoute providers, combo routing, and system prompt configuration." + "description": "Envía completados de chat, haz streaming de respuestas e inicia una sesión REPL interactiva desde la CLI. Compatible con todos los proveedores de OmniRoute, enrutamiento por combos y configuración de prompts del sistema." }, "cli-routing": { - "name": "CLI: Routing & Combos", - "description": "Create, list, update, and delete routing combos from the CLI. Test routing strategies, inspect combo metrics, and configure fallback chains interactively." + "name": "CLI: Enrutamiento y combos", + "description": "Crea, lista, actualiza y elimina combos de enrutamiento desde la CLI. Prueba estrategias de enrutamiento, inspecciona métricas de combos y configura cadenas de fallback de forma interactiva." }, "cli-resilience": { - "name": "CLI: Resilience & Quotas", - "description": "Inspect and manage circuit-breaker states, connection cooldowns, quota limits, and backoff levels from the CLI. Reset stuck providers and configure resilience thresholds." + "name": "CLI: Resiliencia y cuotas", + "description": "Inspecciona y gestiona estados de disyuntores, tiempos de espera de conexiones, límites de cuota y niveles de retroceso (backoff) desde la CLI. Restablece proveedores bloqueados y configura los umbrales de resiliencia." }, "cli-compression": { - "name": "CLI: Compression", - "description": "Configure and test prompt compression from the CLI. Manage RTK filters, Caveman rules, stacked compression modes, and preview compression output with real prompts." + "name": "CLI: Compresión", + "description": "Configura y prueba la compresión de prompts desde la CLI. Gestiona filtros RTK, reglas de Caveman, modos de compresión apilada y previsualiza el resultado de la compresión con prompts reales." }, "cli-contexts": { - "name": "CLI: Contexts & Sessions", - "description": "Manage context engineering configurations, RTK filter sets, and conversation sessions from the CLI. Apply context-relay settings and inspect active context pipelines." + "name": "CLI: Contextos y sesiones", + "description": "Gestiona configuraciones de ingeniería de contexto, conjuntos de filtros RTK y sesiones de conversación desde la CLI. Aplica ajustes de retransmisión de contexto e inspecciona pipelines de contexto activos." }, "cli-cost-usage": { - "name": "CLI: Cost & Usage", - "description": "View cost breakdowns, token usage, and call logs from the CLI. Filter by provider, model, or date range. Export usage reports and inspect per-connection spending." + "name": "CLI: Costes y uso", + "description": "Visualiza desgloses de costes, uso de tokens y registros de llamadas desde la CLI. Filtra por proveedor, modelo o intervalo de fechas. Exporta informes de uso e inspecciona el gasto por conexión." }, "cli-mcp": { "name": "CLI: MCP", - "description": "Inspect the MCP server status, list registered tools and scopes, run tool invocations, and manage MCP audit logs from the CLI." + "description": "Inspecciona el estado del servidor MCP, lista las herramientas y ámbitos registrados, ejecuta invocaciones de herramientas y gestiona los registros de auditoría de MCP desde la CLI." }, "cli-a2a": { - "name": "CLI: A2A Protocol", - "description": "Interact with the OmniRoute A2A server from the CLI. Send tasks, inspect skill execution history, and test the JSON-RPC 2.0 agent-to-agent protocol interactively." + "name": "CLI: Protocolo A2A", + "description": "Interactúa con el servidor A2A de OmniRoute desde la CLI. Envía tareas, inspecciona el historial de ejecución de habilidades y prueba el protocolo de agente a agente JSON-RPC 2.0 de forma interactiva." }, "cli-tunnel": { - "name": "CLI: Tunnels", - "description": "Start and stop tunnel connections (ngrok, Cloudflare, custom) from the CLI. Inspect active tunnel URLs, configure authentication, and test external reachability." + "name": "CLI: Túneles", + "description": "Inicia y detiene conexiones de túnel (ngrok, Cloudflare, personalizado) desde la CLI. Inspecciona las URL de túnel activas, configura la autenticación y comprueba la accesibilidad externa." }, "cli-backup-sync": { - "name": "CLI: Backup & Sync", - "description": "Backup and restore OmniRoute data from the CLI. Trigger incremental snapshots, sync to cloud storage, manage backup schedules, and restore from archive files." + "name": "CLI: Copias de seguridad y sincronización", + "description": "Realiza copias de seguridad y restaura datos de OmniRoute desde la CLI. Activa snapshots incrementales, sincroniza con almacenamiento en la nube, gestiona programaciones de respaldo y restaura a partir de archivos de archivo." }, "cli-policy-audit": { - "name": "CLI: Policy & Audit", - "description": "Inspect audit logs, manage access policies, view telemetry data, and review request history from the CLI. Filter by event type, user, or time range for compliance workflows." + "name": "CLI: Directivas y auditoría", + "description": "Inspecciona registros de auditoría, gestiona directivas de acceso, visualiza datos de telemetría y revisa el historial de solicitudes desde la CLI. Filtra por tipo de evento, usuario o intervalo de tiempo para flujos de trabajo de cumplimiento." }, "cli-batches": { - "name": "CLI: Batches & Files", - "description": "Submit and monitor batch inference jobs from the CLI. Upload and manage files for batch processing, retrieve results, and integrate batch pipelines with CI/CD workflows." + "name": "CLI: Lotes y archivos", + "description": "Envía y monitoriza trabajos de inferencia por lotes desde la CLI. Sube y gestiona archivos para procesamiento por lotes, recupera resultados e integra pipelines de lotes con flujos de trabajo de CI/CD." }, "cli-eval": { - "name": "CLI: Evals", - "description": "Create and run evaluation suites, watch live benchmark progress, view scorecards, compare model performance, and integrate eval runs with CI workflows from the CLI." + "name": "CLI: Evaluaciones", + "description": "Crea y ejecuta conjuntos de evaluación, observa el progreso de benchmarks en directo, visualiza cuadros de mandos (scorecards), compara el rendimiento de los modelos e integra ejecuciones de evaluación con flujos de trabajo de CI desde la CLI." }, "cli-plugins-skills": { - "name": "CLI: Plugins, Skills & Memory", - "description": "Manage Omni Skills (list, install, test, remove), plugins (create, configure), and persistent memory (search, add, clear) from the CLI." + "name": "CLI: Plugins, habilidades y memoria", + "description": "Gestiona habilidades de Omni (listar, instalar, probar, eliminar), plugins (crear, configurar) y memoria persistente (buscar, añadir, borrar) desde la CLI." }, "cli-setup": { - "name": "CLI: Setup & Config", - "description": "Run initial setup, configure global CLI settings, manage environment variables, check for updates, and configure autostart via the CLI setup and config commands." + "name": "CLI: Configuración inicial", + "description": "Ejecuta la configuración inicial, ajusta los parámetros globales de la CLI, gestiona variables de entorno, busca actualizaciones y configura el inicio automático mediante los comandos de configuración de la CLI." }, "cli-skill-collector": { - "name": "CLI: Agent Skill Collector", - "description": "Detect installed CLI coding tools (Claude Code, Codex, Cursor, Copilot, Cline and more), search GitHub for matching agent skills, and install them to the detected tools via OmniRoute's built-in APIs." + "name": "CLI: Recopilador de habilidades de agentes", + "description": "Detecta herramientas de desarrollo CLI instaladas (Claude Code, Codex, Cursor, Copilot, Cline y más), busca en GitHub habilidades de agentes compatibles y las instala en las herramientas detectadas a través de las API integradas de OmniRoute." }, "config-codex-cli": { - "name": "Config: Codex CLI", - "description": "Step-by-step agent workflow to configure the OpenAI Codex CLI on any machine (Linux, macOS, Windows) to use OmniRoute as an OpenAI-compatible backend. Detects OS and shell, writes config.toml and 7 named profiles, sets environment variables, and verifies the setup." + "name": "Configuración: Codex CLI", + "description": "Flujo de trabajo de agente paso a paso para configurar OpenAI Codex CLI en cualquier máquina (Linux, macOS, Windows) para que use OmniRoute como backend compatible con OpenAI. Detecta el sistema operativo y la shell, escribe el archivo config.toml y 7 perfiles con nombre, establece variables de entorno y verifica la configuración." }, "omni-github-skills": { - "name": "GitHub Skill Discovery", - "description": "Search, score, scan, and import agent skills from GitHub repositories that contain SKILL.md, CLAUDE.md, .cursorrules, and similar agent skill files. Discover community skills across 160+ provider categories, evaluate relevance with heuristic scoring, check for malware or hardcoded secrets, and install into Hermes, Claude Code, Gemini CLI, or OpenCode agent directories." + "name": "Descubrimiento de habilidades en GitHub", + "description": "Busca, puntúa, escanea e importa habilidades de agentes desde repositorios de GitHub que contengan SKILL.md, CLAUDE.md, .cursorrules y archivos de habilidades de agentes similares. Descubre habilidades de la comunidad en más de 160 categorías de proveedores, evalúa la relevancia con puntuación heurística, comprueba la presencia de malware o secretos integrados, y realiza la instalación en los directorios de agentes de Hermes, Claude Code, Gemini CLI u OpenCode." } }, - "pageTitle": "Agent Skills", - "pageSubtitle": "Teach your agent to operate OmniRoute — 23 API areas + 21 CLI families", + "pageTitle": "Habilidades de agentes", + "pageSubtitle": "Enseña a tu agente a operar OmniRoute — 23 áreas de API + 21 familias de CLI", "conceptCard": { "agent": { - "title": "Agent Skills — Outbound", - "description": "Agent Skills are machine-readable SKILL.md documents that external AI agents (Claude Code, Cursor, Copilot…) fetch from GitHub to learn how to operate OmniRoute via REST or CLI. They are read by the agent, not executed by OmniRoute.", - "crossLinkLabel": "Understand the difference →" + "title": "Habilidades de agentes — Salientes", + "description": "Las habilidades de agentes son documentos SKILL.md legibles por máquina que los agentes de IA externos (Claude Code, Cursor, Copilot…) obtienen de GitHub para aprender a operar OmniRoute mediante REST o CLI. Son leídas por el agente, no ejecutadas por OmniRoute.", + "crossLinkLabel": "Comprende la diferencia →" }, "omni": { - "title": "Omni Skills — Inbound", - "description": "Omni Skills are sandbox tools that OmniRoute injects into the model's context on every request. They are executed by OmniRoute, not read by the agent.", - "crossLinkLabel": "Understand the difference →" + "title": "Habilidades de Omni — Entrantes", + "description": "Las habilidades de Omni son herramientas de entorno aislado (sandbox) que OmniRoute inyecta en el contexto del modelo en cada solicitud. Son ejecutadas por OmniRoute, no leídas por el agente.", + "crossLinkLabel": "Comprende la diferencia →" }, "comparison": { - "colAgent": "Agent Skills", - "colOmni": "Omni Skills", + "colAgent": "Habilidades de agentes", + "colOmni": "Habilidades de Omni", "whatIs": { - "label": "What it is", - "agent": "Machine-readable SKILL.md that teaches an external agent to operate OmniRoute", - "omni": "Executable tools that OmniRoute injects as tools into LLM requests" + "label": "Qué es", + "agent": "SKILL.md legible por máquina que enseña a un agente externo a operar OmniRoute", + "omni": "Herramientas ejecutables que OmniRoute inyecta como herramientas en las solicitudes de LLM" }, "direction": { - "label": "Direction", - "agent": "Outbound — external agent learns to control OmniRoute", - "omni": "Inbound — OmniRoute gives tools to models passing through it" + "label": "Dirección", + "agent": "Saliente: el agente externo aprende a controlar OmniRoute", + "omni": "Entrante: OmniRoute proporciona herramientas a los modelos que pasan a través de él" }, "executor": { - "label": "Executor", - "agent": "External agent (reads markdown → acts via API/CLI)", - "omni": "OmniRoute itself (intercepts tool_calls, Docker sandbox)" + "label": "Ejecutor", + "agent": "Agente externo (lee markdown → actúa vía API/CLI)", + "omni": "OmniRoute (intercepta tool_calls, Docker sandbox)" }, "storage": { - "label": "Storage", - "agent": "Dynamic catalog (/api/agent-skills) → SKILL.md on GitHub", + "label": "Almacenamiento", + "agent": "Catálogo dinámico (/api/agent-skills) → SKILL.md en GitHub", "omni": "SQLite (SkillsMP / skills.sh / local)" }, "tagline": { - "label": "Tagline", - "agent": "Teach your agent to use OmniRoute", - "omni": "Give executable tools to OmniRoute models" + "label": "Eslogan", + "agent": "Enseña a tu agente a usar OmniRoute", + "omni": "Proporciona herramientas ejecutables a los modelos de OmniRoute" } } }, "filters": { - "category": "Category", - "area": "Area", - "searchPlaceholder": "Search skills…" + "category": "Categoría", + "area": "Área", + "searchPlaceholder": "Buscar skills…" }, "categoryApi": "API", "categoryCli": "CLI", - "categoryConfig": "Config", - "filterAll": "All", - "coverageLabel": "Coverage", - "mcpUrl": "MCP URL", + "categoryConfig": "Configuración", + "filterAll": "Todas", + "coverageLabel": "Cobertura", + "mcpUrl": "URL de MCP", "a2aLink": "A2A", - "mcpPrompt": "Add this MCP endpoint to your agent to give it 37 OmniRoute tools.", - "a2aPrompt": "Register this Agent Card with your orchestrator to enable A2A task delegation.", - "refresh": "Refresh", - "copyUrl": "Copy URL", - "viewOnGithub": "View on GitHub", - "previewLoading": "Loading skill documentation…", - "previewError": "Failed to load skill documentation.", - "previewEmpty": "Select a skill to preview its documentation.", - "generateButton": "Generate missing skills", + "mcpPrompt": "Añade este endpoint de MCP a tu agente para darle 37 herramientas de OmniRoute.", + "a2aPrompt": "Registra esta tarjeta de agente con tu orquestador para habilitar la delegación de tareas A2A.", + "refresh": "Actualizar", + "copyUrl": "Copiar URL", + "viewOnGithub": "Ver en GitHub", + "previewLoading": "Cargando documentación de la skill…", + "previewError": "Error al cargar la documentación de la skill.", + "previewEmpty": "Selecciona una skill para previsualizar su documentación.", + "generateButton": "Generar skills faltantes", "coverageBar": { - "complete": "Complete", - "partial": "Partial" + "complete": "Completa", + "partial": "Parcial" }, - "noSkillsFound": "No skills found matching your filters.", - "regenerateConfirm": "This will regenerate all missing SKILL.md files. Continue?", - "regenerateRunning": "Regenerating skills…", - "regenerateSuccess": "Skills regenerated successfully.", - "regenerateError": "Failed to regenerate skills." + "noSkillsFound": "No se encontraron skills que coincidan con tus filtros.", + "regenerateConfirm": "Esto regenerará todos los archivos SKILL.md faltantes. ¿Continuar?", + "regenerateRunning": "Regenerando skills…", + "regenerateSuccess": "Skills regeneradas correctamente.", + "regenerateError": "Error al regenerar las skills." }, "freeProviderRankingsPage": { - "title": "Free Provider Rankings", - "subtitle": "Best free providers ranked by model ELO scores from Arena AI leaderboards", - "loading": "Loading rankings...", - "errorLoading": "Failed to load rankings", - "emptyState": "No rankings available yet. Arena ELO data syncs on startup (daily) — check back shortly, or trigger a manual sync. Disable Arena ELO Sync in Feature Flags or set ARENA_ELO_SYNC_ENABLED=false to opt out.", - "bestModel": "Best", - "allCategories": "All Categories", - "categoryDefault": "Default", - "categoryCoding": "Coding", - "categoryReview": "Review", - "categoryDocumentation": "Documentation", - "categoryDebugging": "Debugging", - "colRank": "Rank", - "colProvider": "Provider", - "colTopModel": "Top Model", - "colScore": "Score", - "colAvgScore": "Avg Score", - "colModels": "Models", - "colType": "Type", - "filterConfiguredOnly": "Configured only", - "filterAvailableOnly": "Available only", - "filterAvailableOnlyHelp": "Hide providers whose connections are all rate-limited or out of quota.", - "configuredOnly": "Configured Only", - "configuredOnlyHint": "Show only providers with active connections", - "noConfiguredProviders": "No configured providers found. Add a provider connection first.", - "colConfigured": "Status", + "title": "Ranking de proveedores gratuitos", + "subtitle": "Mejores proveedores gratuitos clasificados por puntuaciones ELO de modelos de los leaderboards de Arena AI", + "loading": "Cargando rankings...", + "errorLoading": "Error al cargar los rankings", + "emptyState": "Aún no hay rankings disponibles. Los datos ELO de Arena se sincronizan al iniciar (diariamente); vuelve a consultar en breve o inicia una sincronización manual. Desactiva Arena ELO Sync en Feature Flags o establece ARENA_ELO_SYNC_ENABLED=false para excluirte.", + "bestModel": "Mejor", + "allCategories": "Todas las categorías", + "categoryDefault": "Predeterminado", + "categoryCoding": "Programación", + "categoryReview": "Revisión", + "categoryDocumentation": "Documentación", + "categoryDebugging": "Depuración", + "colRank": "Posición", + "colProvider": "Proveedor", + "colTopModel": "Modelo principal", + "colScore": "Puntuación", + "colAvgScore": "Puntuación media", + "colModels": "Modelos", + "colType": "Tipo", + "filterConfiguredOnly": "Solo configurados", + "filterAvailableOnly": "Solo disponibles", + "filterAvailableOnlyHelp": "Ocultar proveedores cuyas conexiones tengan rate limit o estén sin cuota.", + "configuredOnly": "Solo configurados", + "configuredOnlyHint": "Mostrar solo proveedores con conexiones activas", + "noConfiguredProviders": "No se encontraron proveedores configurados. Añade primero una conexión de proveedor.", + "colConfigured": "Estado", "typeAll": "Todos los tipos", "typeNoauth": "Sin registro", "typeOauth": "Inicio de sesión OAuth", - "typeApikey": "Clave API", + "typeApikey": "Clave de API", "sortTypeFirst": "Más sencillos primero", - "sortTypeFirstHelp": "Group by signup effort (No Signup → OAuth Login → API Key), keeping quality order within each group", - "typeLegend": "No Signup = zero setup · OAuth Login = sign in with your own account · API Key = bring your own key or that provider's free tier" + "sortTypeFirstHelp": "Agrupar por esfuerzo de registro (Sin registro → OAuth → Clave de API), manteniendo el orden de calidad dentro de cada grupo", + "typeLegend": "Sin registro = configuración cero · OAuth = inicia sesión con tu cuenta · Clave de API = usa tu propia clave o el nivel gratuito del proveedor" }, "discovery": { - "title": "Provider Discovery", - "subtitle": "Scan providers for free/unlimited access methods and review findings. Opt-in, local-only.", - "scanLabel": "Provider to scan", - "scanPlaceholder": "e.g. huggingchat", - "scan": "Scan", - "scanning": "Scanning…", - "scanQueued": "Scan complete for {provider}.", - "scanFailed": "Scan failed.", - "loadFailed": "Failed to load discovery results.", - "localOnlyNote": "This tool is local-only (loopback). Scans run from this machine and are never reachable remotely.", - "verify": "Verify", - "verifyFailed": "Failed to verify finding.", - "delete": "Delete", - "deleteFailed": "Failed to delete finding.", - "deleteTitle": "Delete discovery result", - "deleteConfirm": "Delete the discovery finding for {provider}? This cannot be undone.", - "emptyTitle": "No discovery results yet", - "emptyDescription": "Run a scan above to look for free access methods on a provider.", - "risk": "Risk", - "method": "Method", - "auth": "Auth", - "feasibility": "Feasibility", - "models": "Models" + "title": "Descubrimiento de proveedores", + "subtitle": "Escanea proveedores en busca de métodos de acceso gratuitos/ilimitados y revisa los hallazgos. Opt-in, solo local.", + "scanLabel": "Proveedor a escanear", + "scanPlaceholder": "ej. huggingchat", + "scan": "Escanear", + "scanning": "Escaneando…", + "scanQueued": "Escaneo completado para {provider}.", + "scanFailed": "Error en el escaneo.", + "loadFailed": "Error al cargar los resultados del descubrimiento.", + "localOnlyNote": "Esta herramienta es solo local (loopback). Los escaneos se ejecutan desde esta máquina y nunca son accesibles de forma remota.", + "verify": "Verificar", + "verifyFailed": "Error al verificar el hallazgo.", + "delete": "Eliminar", + "deleteFailed": "Error al eliminar el hallazgo.", + "deleteTitle": "Eliminar resultado de descubrimiento", + "deleteConfirm": "¿Eliminar el hallazgo de descubrimiento para {provider}? Esta acción no se puede deshacer.", + "emptyTitle": "Aún no hay resultados de descubrimiento", + "emptyDescription": "Ejecuta un escaneo arriba para buscar métodos de acceso gratuitos en un proveedor.", + "risk": "Riesgo", + "method": "Método", + "auth": "Autenticación", + "feasibility": "Viabilidad", + "models": "Modelos" }, "noAuthProvider": { - "title": "No authentication required", - "description": "This provider is ready to use immediately — no signup or API key needed.", - "accountDescription": "Ready to use — no signup needed. Add accounts for rate-limit rotation.", - "addAccount": "Add Account", - "accountName": "{provider} Account {number}", - "accounts": "Accounts ({count})", - "adding": "Adding...", - "autoGeneratedAccount": "Using an auto-generated account. Select “{addLabel}” for rate-limit rotation.", - "configureProxy": "Configure proxy", - "proxyConfigured": "Proxy configured: {host}", - "removeAccount": "Remove account", - "proxyForAccount": "Proxy for Account {number}", - "saved": "Saved", - "custom": "Custom", - "noSavedProxies": "No saved proxies — add one in Settings → Proxy", - "directConnection": "Direct (no proxy)", + "title": "No se requiere autenticación", + "description": "Este proveedor está listo para usarse de inmediato; no se necesita registro ni clave de API.", + "accountDescription": "Listo para usar; no se necesita registro. Añade cuentas para la rotación de rate limit.", + "addAccount": "Añadir cuenta", + "accountName": "Cuenta {number} de {provider}", + "accounts": "Cuentas ({count})", + "adding": "Añadiendo...", + "autoGeneratedAccount": "Usando una cuenta autogenerada. Selecciona “{addLabel}” para la rotación de rate limit.", + "configureProxy": "Configurar proxy", + "proxyConfigured": "Proxy configurado: {host}", + "removeAccount": "Eliminar cuenta", + "proxyForAccount": "Proxy para la cuenta {number}", + "saved": "Guardado", + "custom": "Personalizado", + "noSavedProxies": "No hay proxies guardados; añade uno en Ajustes → Proxy", + "directConnection": "Directa (sin proxy)", "host": "Host", - "port": "Port", - "usernameOptional": "Username (optional)", - "passwordOptional": "Password (optional)", - "cancel": "Cancel", - "saving": "Saving...", - "save": "Save", - "createConnectionFailed": "Failed to create connection", - "updateConnectionFailed": "Failed to update connection", - "fetchProxiesFailed": "Failed to fetch proxies", - "noSavedProxiesError": "No saved proxies found. Add proxies in Settings → Proxy first.", - "updateProviderFailed": "Failed to update provider", - "providerEnabled": "{provider} enabled", - "providerDisabled": "{provider} disabled" + "port": "Puerto", + "usernameOptional": "Nombre de usuario (opcional)", + "passwordOptional": "Contraseña (opcional)", + "cancel": "Cancelar", + "saving": "Guardando...", + "save": "Guardar", + "createConnectionFailed": "Error al crear la conexión", + "updateConnectionFailed": "Error al actualizar la conexión", + "fetchProxiesFailed": "Error al obtener los proxies", + "noSavedProxiesError": "No se encontraron proxies guardados. Añade proxies primero en Ajustes → Proxy.", + "updateProviderFailed": "Error al actualizar el proveedor", + "providerEnabled": "{provider} habilitado", + "providerDisabled": "{provider} deshabilitado" }, "gamification": { "leaderboardScopes": { - "allTime": "All Time", - "weekly": "Weekly", - "monthly": "Monthly", - "tokensShared": "Tokens Shared" + "allTime": "Histórico", + "weekly": "Semanal", + "monthly": "Mensual", + "tokensShared": "Tokens compartidos" }, - "leaderboardLoadFailed": "Failed to load leaderboard (HTTP {status})", - "scope": "Scope", - "tokensShared": "tokens shared", - "points": "points", - "rank": "Rank", - "name": "Name", - "score": "Score", - "leaderboardEmpty": "No entries yet for this scope. Start using OmniRoute to appear on the leaderboard!", - "profileLoadFailed": "Failed to load profile data", + "leaderboardLoadFailed": "Error al cargar el leaderboard (HTTP {status})", + "scope": "Ámbito", + "tokensShared": "tokens compartidos", + "points": "puntos", + "rank": "Posición", + "name": "Nombre", + "score": "Puntuación", + "leaderboardEmpty": "Aún no hay entradas para este ámbito. ¡Empieza a usar OmniRoute para aparecer en el leaderboard!", + "profileLoadFailed": "Error al cargar los datos del perfil", "levelTitles": { - "beginner": "Beginner", - "explorer": "Explorer", - "expert": "Expert", - "master": "Master", - "legend": "Legend" + "beginner": "Principiante", + "explorer": "Explorador", + "expert": "Experto", + "master": "Maestro", + "legend": "Leyenda" }, "tiers": { - "bronze": "Bronze", - "silver": "Silver", - "gold": "Gold", - "platinum": "Platinum", - "diamond": "Diamond" + "bronze": "Bronce", + "silver": "Plata", + "gold": "Oro", + "platinum": "Platino", + "diamond": "Diamante" }, - "tierLabel": "Tier: {tier}", - "dayStreak": "{count}-day streak", - "levelProgress": "Level {current} → {next}", - "totalXpEarned": "{count} total XP earned", - "maintainStreak": "Keep using OmniRoute every day to maintain your streak!", - "badgesTitle": "Badges ({earned}/{total})", - "noBadges": "No badges are available yet.", - "hiddenBadge": "Hidden achievement", - "earnedDate": "Earned {date}", - "earnedOn": "Earned on {date}", - "category": "Category", + "tierLabel": "Nivel: {tier}", + "dayStreak": "Racha de {count} días", + "levelProgress": "Nivel {current} → {next}", + "totalXpEarned": "{count} XP total ganada", + "maintainStreak": "¡Sigue usando OmniRoute cada día para mantener tu racha!", + "badgesTitle": "Insignias ({earned}/{total})", + "noBadges": "Aún no hay insignias disponibles.", + "hiddenBadge": "Logro oculto", + "earnedDate": "Ganada el {date}", + "earnedOn": "Ganada el {date}", + "category": "Categoría", "rarities": { - "common": "Common", - "uncommon": "Uncommon", - "rare": "Rare", - "epic": "Epic", - "legendary": "Legendary" + "common": "Común", + "uncommon": "Poco común", + "rare": "Rara", + "epic": "Épica", + "legendary": "Legendaria" }, "categories": { - "usage": "Usage", - "sharing": "Sharing", - "contribution": "Contribution", - "streak": "Streak", - "rare": "Rare achievements" + "usage": "Uso", + "sharing": "Compartir", + "contribution": "Contribución", + "streak": "Racha", + "rare": "Logros raros" }, "badges": { "first-token": { - "name": "First Token", - "description": "Made your first API request", - "criteria": "Complete your first API request through OmniRoute." + "name": "Primer token", + "description": "Realizaste tu primera solicitud de API", + "criteria": "Completa tu primera solicitud de API a través de OmniRoute." }, "token-consumer": { - "name": "Token Consumer", - "description": "Made 1,000 API requests", - "criteria": "Complete 1,000 API requests through OmniRoute." + "name": "Consumidor de tokens", + "description": "Realizaste 1.000 solicitudes de API", + "criteria": "Completa 1.000 solicitudes de API a través de OmniRoute." }, "token-machine": { - "name": "Token Machine", - "description": "Made 10,000 API requests", - "criteria": "Complete 10,000 API requests through OmniRoute." + "name": "Máquina de tokens", + "description": "Realizaste 10.000 solicitudes de API", + "criteria": "Completa 10.000 solicitudes de API a través de OmniRoute." }, "token-whale": { - "name": "Token Whale", - "description": "Made 100,000 API requests", - "criteria": "Complete 100,000 API requests through OmniRoute." + "name": "Ballena de tokens", + "description": "Realizaste 100.000 solicitudes de API", + "criteria": "Completa 100.000 solicitudes de API a través de OmniRoute." }, "generous": { - "name": "Generous", - "description": "Shared 1,000 tokens with others", - "criteria": "Share a total of 1,000 tokens with other users." + "name": "Generoso", + "description": "Compartiste 1.000 tokens con otros", + "criteria": "Comparte un total de 1.000 tokens con otros usuarios." }, "philanthropist": { - "name": "Philanthropist", - "description": "Shared 10,000 tokens with others", - "criteria": "Share a total of 10,000 tokens with other users." + "name": "Filántropo", + "description": "Has compartido 10.000 tokens con otros", + "criteria": "Comparte un total de 10.000 tokens con otros usuarios." }, "token-santa": { - "name": "Token Santa", - "description": "Shared 100,000 tokens with others", - "criteria": "Share a total of 100,000 tokens with other users." + "name": "Papá Noel de los tokens", + "description": "Has compartido 100.000 tokens con otros", + "criteria": "Comparte un total de 100.000 tokens con otros usuarios." }, "community-hero": { - "name": "Community Hero", - "description": "Shared 1,000,000 tokens with others", - "criteria": "Share a total of 1,000,000 tokens with other users." + "name": "Héroe de la comunidad", + "description": "Has compartido 1.000.000 de tokens con otros", + "criteria": "Comparte un total de 1.000.000 de tokens con otros usuarios." }, "explorer": { - "name": "Explorer", - "description": "Used 5 different providers", - "criteria": "Use at least 5 different AI providers." + "name": "Explorador", + "description": "Has usado 5 proveedores diferentes", + "criteria": "Usa al menos 5 proveedores de IA diferentes." }, "polyglot": { - "name": "Polyglot", - "description": "Used 10 different models", - "criteria": "Use at least 10 different AI models." + "name": "Poliglota", + "description": "Has usado 10 modelos diferentes", + "criteria": "Usa al menos 10 modelos de IA diferentes." }, "architect": { - "name": "Architect", - "description": "Created 3 combo routes", - "criteria": "Create 3 combo routes." + "name": "Arquitecto", + "description": "Has creado 3 rutas combo", + "criteria": "Crea 3 rutas combo." }, "speedster": { - "name": "Speedster", - "description": "Maintained under 500 ms average latency for 100 requests", - "criteria": "Keep average latency below 500 ms across 100 requests." + "name": "Velocista", + "description": "Has mantenido una latencia media inferior a 500 ms en 100 solicitudes", + "criteria": "Mantén una latencia media por debajo de 500 ms en 100 solicitudes." }, "resilient": { - "name": "Resilient", - "description": "Maintained 100% uptime for 7 days", - "criteria": "Maintain 100% uptime for 7 consecutive days." + "name": "Resiliente", + "description": "Has mantenido un 100% de disponibilidad durante 7 días", + "criteria": "Mantén un 100% de disponibilidad durante 7 días consecutivos." }, "daily-user": { - "name": "Daily User", - "description": "Active for 3 consecutive days", - "criteria": "Use OmniRoute for 3 consecutive days." + "name": "Usuario diario", + "description": "Activo durante 3 días consecutivos", + "criteria": "Usa OmniRoute durante 3 días consecutivos." }, "weekly-warrior": { - "name": "Weekly Warrior", - "description": "Active for 7 consecutive days", - "criteria": "Use OmniRoute for 7 consecutive days." + "name": "Guerrero semanal", + "description": "Activo durante 7 días consecutivos", + "criteria": "Usa OmniRoute durante 7 días consecutivos." }, "monthly-master": { - "name": "Monthly Master", - "description": "Active for 30 consecutive days", - "criteria": "Use OmniRoute for 30 consecutive days." + "name": "Maestro mensual", + "description": "Activo durante 30 días consecutivos", + "criteria": "Usa OmniRoute durante 30 días consecutivos." }, "unstoppable": { - "name": "Unstoppable", - "description": "Active for 365 consecutive days", - "criteria": "Use OmniRoute for 365 consecutive days." + "name": "Imparable", + "description": "Activo durante 365 días consecutivos", + "criteria": "Usa OmniRoute durante 365 días consecutivos." }, "early-adopter": { - "name": "Early Adopter", - "description": "Joined within the first month of gamification", - "criteria": "Join within the first month after gamification launches." + "name": "Pionero", + "description": "Te uniste durante el primer mes de la gamificación", + "criteria": "Únete durante el primer mes tras el lanzamiento de la gamificación." }, "bug-hunter": { - "name": "Bug Hunter", - "description": "Reported 5 issues", - "criteria": "Report 5 valid issues." + "name": "Cazador de errores", + "description": "Has informado de 5 incidencias", + "criteria": "Informa de 5 incidencias válidas." }, "contributor": { - "name": "Contributor", - "description": "Merged 1 pull request", - "criteria": "Have 1 pull request merged into OmniRoute." + "name": "Colaborador", + "description": "Has fusionado 1 pull request", + "criteria": "Consigue que se fusione 1 pull request en OmniRoute." }, "community-leader": { - "name": "Community Leader", - "description": "Reached the top 10 on any leaderboard", - "criteria": "Reach the top 10 on any leaderboard." + "name": "Líder de la comunidad", + "description": "Has alcanzado el top 10 en cualquier tabla de clasificación", + "criteria": "Alcanza el top 10 en cualquier tabla de clasificación." }, "secret-badge": { "name": "???", - "description": "A hidden achievement awaits...", - "criteria": "Complete the hidden achievement to reveal this badge." + "description": "Te espera un logro oculto...", + "criteria": "Completa el logro oculto para revelar esta insignia." } } }, "featureFlags": { "title": "Feature Flags", - "activeCount": "{count} active", - "inactiveCount": "{count} inactive", - "dbOverrideCount": "{count} DB overrides", - "searchPlaceholder": "Search flags...", + "activeCount": "{count} activas", + "inactiveCount": "{count} inactivas", + "dbOverrideCount": "{count} sobrescrituras de BD", + "searchPlaceholder": "Buscar flags...", "categories": { - "all": "All", - "security": "Security", - "network": "Network", - "policies": "Policies", - "runtime": "Runtime", + "all": "Todas", + "security": "Seguridad", + "network": "Red", + "policies": "Directivas", + "runtime": "Entorno de ejecución", "cli": "CLI", - "health": "Health", - "requiresRestart": "Requires Restart" + "health": "Estado de salud", + "requiresRestart": "Requiere reinicio" }, - "categoryLabel": "Category: {category}", - "caution": "Caution", - "danger": "Danger", - "requiresRestart": "Requires restart", - "source": "Source", - "resetFlag": "Reset {label} to default", - "reset": "Reset", - "loadFailed": "Failed to load feature flags", - "updateFailedHttp": "Failed to update flag: HTTP {status}", - "updateFailed": "Failed to update flag", - "restartFailedHttp": "Restart failed: HTTP {status}", - "restartFailed": "Restart failed", - "resetOverridesFailedHttp": "Failed to reset overrides: HTTP {status}", - "resetOverridesFailed": "Failed to reset overrides", - "restartRequiredCount": "{count, plural, one {# change requires} other {# changes require}} a server restart to take effect.", - "restartRequiredDescription": "These flags only apply after the process reloads. Restart now or continue editing — pending flags stay queued until you confirm.", - "restartServer": "Restart Server", - "cancel": "Cancel", - "restarting": "Restarting…", - "confirmRestart": "Confirm Restart", - "restartViewDescription": "These flags only take effect after the server restarts. Toggle them like any other flag — the change is persisted immediately, but the new value is only read at process startup. Use the Restart Server banner above to apply.", - "retry": "Retry", - "noSearchResults": "No flags match your search", - "resetAllOverrides": "Reset All Overrides", - "confirmResetOverrides": "Reset all {count} DB override(s)?", - "resetting": "Resetting...", - "confirmReset": "Confirm Reset", + "categoryLabel": "Categoría: {category}", + "caution": "Precaución", + "danger": "Peligro", + "requiresRestart": "Requiere reinicio", + "source": "Origen", + "resetFlag": "Restablecer {label} a los valores predeterminados", + "reset": "Restablecer", + "loadFailed": "No se pudieron cargar los feature flags", + "updateFailedHttp": "No se pudo actualizar el flag: HTTP {status}", + "updateFailed": "No se pudo actualizar el flag", + "restartFailedHttp": "Error al reiniciar: HTTP {status}", + "restartFailed": "Error al reiniciar", + "resetOverridesFailedHttp": "No se pudieron restablecer las sobrescrituras: HTTP {status}", + "resetOverridesFailed": "No se pudieron restablecer las sobrescrituras", + "restartRequiredCount": "{count, plural, one {# cambio requiere} other {# cambios requieren}} un reinicio del servidor para surtir efecto.", + "restartRequiredDescription": "Estos flags solo se aplican tras recargar el proceso. Reinicia ahora o continúa editando; los flags pendientes permanecerán en cola hasta que los confirmes.", + "restartServer": "Reiniciar servidor", + "cancel": "Cancelar", + "restarting": "Reiniciando...", + "confirmRestart": "Confirmar reinicio", + "restartViewDescription": "Estos flags solo surtirán efecto después de reiniciar el servidor. Actívalos o desactívalos como cualquier otro flag: el cambio se guarda de inmediato, pero el nuevo valor solo se lee al iniciar el proceso. Usa el banner de Reiniciar servidor de arriba para aplicarlos.", + "retry": "Reintentar", + "noSearchResults": "Ningún flag coincide con tu búsqueda", + "resetAllOverrides": "Restablecer todas las sobrescrituras", + "confirmResetOverrides": "¿Restablecer las {count} sobrescrituras de BD?", + "resetting": "Restableciendo...", + "confirmReset": "Confirmar restablecimiento", "enumValues": { - "off": "Off", - "warn": "Warn", - "block": "Block", - "redact": "Redact", - "disabled": "Disabled", + "off": "Desactivado", + "warn": "Aviso", + "block": "Bloquear", + "redact": "Ocultar", + "disabled": "Deshabilitado", "dual": "Dual", "alias": "Alias", - "canonical": "Canonical" + "canonical": "Canónico" }, "definitions": { "REQUIRE_API_KEY": { - "description": "Require an API key for all incoming requests." + "description": "Exigir una clave de API para todas las solicitudes entrantes." }, "INPUT_SANITIZER_ENABLED": { - "description": "Enable input sanitization for all requests." + "description": "Habilitar la depuración de entradas para todas las solicitudes." }, "INJECTION_GUARD_MODE": { - "description": "Set the prompt-injection guard mode." + "description": "Establecer el modo de protección contra inyección de prompts." }, "PII_REDACTION_ENABLED": { - "description": "Redact personally identifiable information from requests." + "description": "Ocultar la información de identificación personal (PII) en las solicitudes." }, "PII_RESPONSE_SANITIZATION": { - "description": "Sanitize personally identifiable information in provider responses." + "description": "Depurar la información de identificación personal en las respuestas del proveedor." }, "PII_RESPONSE_SANITIZATION_MODE": { - "description": "Choose how response PII is handled: redact replaces it, warn only logs it, block rejects the response, and off disables sanitization." + "description": "Elige cómo se gestiona la PII en las respuestas: redact la sustituye, warn solo registra un aviso, block rechaza la respuesta y off deshabilita la depuración." }, "OUTBOUND_SSRF_GUARD_ENABLED": { - "description": "Block outbound requests to private or internal IP ranges." + "description": "Bloquear solicitudes salientes a rangos de IP privadas o internas." }, "ALLOW_API_KEY_REVEAL": { - "description": "Allow authenticated dashboard users to reveal stored API keys instead of seeing masked values only." + "description": "Permitir a los usuarios autenticados del panel ver las claves de API almacenadas en lugar de mostrar únicamente valores enmascarados." }, "ENABLE_TLS_FINGERPRINT": { - "description": "Enable TLS fingerprint stealth mode." + "description": "Habilitar el modo sigiloso de huella digital TLS." }, "ONEPROXY_ENABLED": { - "description": "Enable request proxying through 1proxy." + "description": "Habilitar el enrutamiento de solicitudes a través del proxy de 1proxy." }, "PROXY_AUTO_SELECT_ENABLED": { - "description": "When no proxy is assigned to a connection, automatically select the first working registry proxy. Off by default because otherwise one registry proxy becomes a global fallback for all traffic (#3332)." + "description": "Cuando no haya ningún proxy asignado a una conexión, seleccionar automáticamente el primer proxy del registro que funcione. Está desactivado por predeterminación porque, de lo contrario, un proxy de registro se convierte en un fallback global para todo el tráfico (#3332)." }, "OMNIROUTE_CONTROL_PLANE_PROXY_DIRECT_FALLBACK": { - "description": "Allow OAuth and provider-validation flows to bypass a pinned proxy when proxy reachability checks fail. Off by default because this can change the account egress IP." + "description": "Permitir que los flujos de OAuth y validación de proveedores ignoren un proxy fijado cuando fallen las comprobaciones de accesibilidad del proxy. Está desactivado por predeterminación porque esto puede cambiar la IP de salida de la cuenta." }, "MITM_DISABLE_TLS_VERIFY": { - "description": "Disable TLS certificate verification for the MITM proxy." + "description": "Deshabilitar la verificación de certificados TLS para el proxy MITM." }, "OMNIROUTE_ALLOW_PRIVATE_PROVIDER_URLS": { - "description": "Allow provider URLs that point to private or internal networks." + "description": "Permitir URLs de proveedores que apunten a redes privadas o internas." }, "OMNIROUTE_ALLOW_LOCAL_PROVIDER_URLS": { - "description": "Allow providers on localhost, LAN, and private IP ranges. This is required for local OpenAI-compatible models and enabled by default. Cloud-metadata endpoints such as 169.254.169.254 remain blocked." + "description": "Permitir proveedores en localhost, LAN y rangos de IP privadas. Esto es necesario para los modelos locales compatibles con OpenAI y está habilitado de forma predeterminada. Los endpoints de metadatos en la nube, como 169.254.169.254, permanecen bloqueados." }, "ENABLE_CC_COMPATIBLE_PROVIDER": { - "description": "Enable Claude Code-compatible provider mode." + "description": "Habilitar el modo de proveedor compatible con Claude Code." }, "TOOL_POLICY_MODE": { - "description": "Set the tool-use policy enforcement mode." + "description": "Establecer el modo de aplicación de políticas de uso de herramientas." }, "RATE_LIMIT_AUTO_ENABLE": { - "description": "Automatically enable rate limiting based on usage patterns." + "description": "Habilitar automáticamente el rate limit según los patrones de uso." }, "ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE": { - "description": "Allow multiple connections for each compatibility node." + "description": "Permitir múltiples conexiones para cada nodo de compatibilidad." }, "RESPONSES_PASSTHROUGH_DROP_COMMENTARY": { - "description": "Remove internal commentary-phase output items from Responses API passthrough streams before forwarding them to clients. Disable this flag to receive raw upstream commentary." + "description": "Eliminar los elementos de salida internos de la fase de comentarios de los streams de paso directo (passthrough) de la API Responses antes de reenviarlos a los clientes. Desactiva este flag para recibir comentarios sin procesar del upstream." }, "OMNIROUTE_MCP_ENFORCE_SCOPES": { - "description": "Enforce scope restrictions for MCP tool access." + "description": "Aplicar restricciones de ámbito (scopes) para el acceso a herramientas MCP." }, "OMNIROUTE_MCP_COMPRESS_DESCRIPTIONS": { - "description": "Compress MCP tool descriptions to reduce token usage." + "description": "Comprimir las descripciones de las herramientas MCP para reducir el uso de tokens." }, "OMNIROUTE_ENABLE_RUNTIME_BACKGROUND_TASKS": { - "description": "Enable background-task processing at runtime." + "description": "Habilitar el procesamiento de tareas en segundo plano en tiempo de ejecución." }, "OMNIROUTE_DISABLE_BACKGROUND_SERVICES": { - "description": "Disable all background services, including quota refresh and synchronization." + "description": "Deshabilitar todos los servicios en segundo plano, incluida la actualización de cuotas y la sincronización." }, "OMNIROUTE_RTK_TRUST_PROJECT_FILTERS": { - "description": "Trust project-level RTK filters without validation." + "description": "Confiar en los filtros RTK a nivel de proyecto sin validación." }, "OMNIROUTE_ENABLE_LIVE_WS": { - "description": "Start the real-time dashboard WebSocket server on import at loopback port 20132. Set the flag to 0 or false to disable it. LAN exposure also requires LIVE_WS_HOST=0.0.0.0 and LIVE_WS_ALLOWED_ORIGINS." + "description": "Iniciar el servidor WebSocket del panel en tiempo real al importar en el puerto de bucle local 20132. Establece el flag en 0 o false para deshabilitarlo. La exposición en LAN también requiere LIVE_WS_HOST=0.0.0.0 y LIVE_WS_ALLOWED_ORIGINS." }, "OMNIROUTE_CODEX_WS_ENABLED": { - "description": "Allow Codex to use Responses over WebSocket. When disabled, Codex falls back to HTTP Responses." + "description": "Permitir que Codex utilice Responses a través de WebSocket. Cuando está deshabilitado, Codex recurre a Responses mediante HTTP como fallback." }, "OMNIROUTE_EMERGENCY_FALLBACK": { - "description": "Route budget-exhausted requests to the emergency free fallback provider and model." + "description": "Enrutar las solicitudes cuyo presupuesto se haya agotado hacia el proveedor y modelo de fallback gratuito de emergencia." }, "STREAM_RECOVERY_ENABLED": { - "description": "Retry truncated upstream SSE streams transparently before any response bytes reach the client." + "description": "Reintentar los streams SSE de upstream truncados de forma transparente antes de que cualquier byte de respuesta llegue al cliente." }, "STREAM_RECOVERY_MIDSTREAM_ENABLED": { - "description": "Allow stream recovery to request the response again and stitch it after bytes have already reached the client." + "description": "Permitir que la recuperación de streams solicite la respuesta de nuevo y la una una vez que los bytes ya hayan llegado al cliente." }, "MODEL_CATALOG_INCLUDE_NAMES": { - "description": "Include display-friendly name fields in /v1/models responses. Disable this for clients that accept model IDs only." + "description": "Incluir campos de nombres legibles en las respuestas de /v1/models. Desactiva esta opción para clientes que solo acepten IDs de modelos." }, "MODELS_CATALOG_PREFIX_MODE": { - "description": "Control model-ID prefixes in /v1/models: dual emits alias and canonical prefixes, alias emits short prefixes only, and canonical emits full provider IDs only." + "description": "Controlar los prefijos de ID de modelo en /v1/models: dual emite prefijos de alias y canónicos, alias emite solo prefijos cortos y canonical emite únicamente IDs completos de proveedores." }, "ARENA_ELO_SYNC_ENABLED": { - "description": "Periodically synchronize Arena AI leaderboard ELO data for model-intelligence rankings." + "description": "Sincronizar periódicamente los datos de ELO de la tabla de clasificación de Arena AI para las clasificaciones de inteligencia de los modelos." }, "CLI_COMPAT_ALL": { - "description": "Enable compatibility mode for all CLI clients." + "description": "Habilitar el modo de compatibilidad para todos los clientes CLI." }, "MODEL_ALIAS_COMPAT_ENABLED": { - "description": "Enable the model-alias compatibility layer." + "description": "Habilitar la capa de compatibilidad de alias de modelos." }, "PRICING_SYNC_ENABLED": { - "description": "Synchronize pricing data automatically. The PRICING_SYNC_ENABLED environment variable must also be true." + "description": "Sincronizar los datos de precios automáticamente. La variable de entorno PRICING_SYNC_ENABLED también debe estar establecida en true." }, "OMNIROUTE_AUTO_SYNC_CODEX_PROFILES": { - "description": "After provider-model synchronization, regenerate ~/.codex/*.config.toml profiles from the live catalog. This never changes the active or default Codex configuration and is off by default." + "description": "Tras la sincronización de proveedores y modelos, regenerar los perfiles de ~/.codex/*.config.toml a partir del catálogo activo. Esto nunca cambia la configuración activa o predeterminada de Codex y está desactivado por predeterminación." }, "OMNIROUTE_AUTO_SYNC_CLAUDE_PROFILES": { - "description": "After provider-model synchronization, regenerate ~/.claude/profiles//settings.json profiles from the live catalog. This never changes the active or default Claude configuration and is off by default." + "description": "Tras la sincronización de proveedores y modelos, regenerar los perfiles de ~/.claude/profiles//settings.json a partir del catálogo activo. Esto nunca cambia la configuración activa o predeterminada de Claude y está desactivado por predeterminación." }, "OMNIROUTE_DISABLE_LOCAL_HEALTHCHECK": { - "description": "Disable the local instance health-check endpoint." + "description": "Deshabilitar el endpoint de comprobación de salud de la instancia local." }, "OMNIROUTE_DISABLE_TOKEN_HEALTHCHECK": { - "description": "Disable the token-validation health check." + "description": "Deshabilitar la comprobación de salud de validación de tokens." }, "SKILLS_SANDBOX_NETWORK_ENABLED": { - "description": "Enable network access in the skills sandbox." + "description": "Habilitar el acceso a la red en el sandbox de habilidades." } }, "ccDiscoveryAliasesEnvWarning": "__MISSING__:Active via environment variable (EXPOSE_CC_DISCOVERY_ALIASES) — this overrides any dashboard toggle below." }, "comboControl": { - "title": "Combo Control Center", - "unavailable": "Combo Control Center unavailable", - "backToCombos": "Back to Combos", - "loadFailed": "Failed to load combo control center", + "title": "Centro de control de combos", + "unavailable": "Centro de control de combos no disponible", + "backToCombos": "Volver a los combos", + "loadFailed": "No se pudo cargar el centro de control de combos", "state": { - "healthy": "Healthy", - "warning": "Needs attention", - "critical": "Critical", - "idle": "Idle" + "healthy": "Saludable", + "warning": "Requiere atención", + "critical": "Crítico", + "idle": "Inactivo" }, - "active": "Active", - "disabled": "Disabled", - "description": "Central read-only view for routing behavior, health, quota, runtime metrics and recent decisions for .", - "refresh": "Refresh", - "editInCombos": "Edit in Combos", - "requests": "Requests", - "success": "Success", - "latency": "Latency", - "quota": "Quota", - "rangeWindow": "{range} window", - "runtimeHealthBlend": "runtime/health blend", - "averageResponseTime": "average response time", - "worstQuota": "Worst quota", - "providerAccountTelemetry": "provider/account telemetry", - "overview": "Overview", - "overviewDescription": "Strategy, runtime status and control links for this combo.", - "strategy": "Strategy", - "targets": "Targets", - "providers": "Providers", - "targetCounts": "{configured} configured · {resolved} resolved", - "healthReasons": "Health reasons", + "active": "Activo", + "disabled": "Deshabilitado", + "description": "Vista central de solo lectura para el comportamiento de enrutamiento, salud, cuota, métricas de ejecución y decisiones recientes para .", + "refresh": "Actualizar", + "editInCombos": "Editar en combos", + "requests": "Solicitudes", + "success": "Éxito", + "latency": "Latencia", + "quota": "Cuota", + "rangeWindow": "Ventana de {range}", + "runtimeHealthBlend": "combinación de entorno de ejecución y salud", + "averageResponseTime": "tiempo de respuesta medio", + "worstQuota": "Peor cuota", + "providerAccountTelemetry": "telemetría de proveedor y cuenta", + "overview": "Resumen", + "overviewDescription": "Estrategia, estado de ejecución y enlaces de control para este combo.", + "strategy": "Estrategia", + "targets": "Destinos", + "providers": "Proveedores", + "targetCounts": "{configured} configurados · {resolved} resueltos", + "healthReasons": "Motivos de salud", "healthReason": { - "noRecentTraffic": "No recent combo traffic", - "lowSuccessRate": "Low success rate", - "successBelowTarget": "Success rate below target", - "highFallbackRate": "High fallback rate", - "elevatedFallbackRate": "Elevated fallback rate", - "quotaExhausted": "At least one quota is exhausted", - "quotaNearlyExhausted": "Quota is nearly exhausted", - "quotaGettingLow": "Quota is getting low", - "trafficHighlySkewed": "Traffic distribution is highly skewed", - "comboHealthy": "Combo looks healthy" + "noRecentTraffic": "Sin tráfico reciente en el combo", + "lowSuccessRate": "Tasa de éxito baja", + "successBelowTarget": "Tasa de éxito por debajo del objetivo", + "highFallbackRate": "Alta tasa de fallbacks", + "elevatedFallbackRate": "Tasa de fallbacks elevada", + "quotaExhausted": "Al menos una cuota está agotada", + "quotaNearlyExhausted": "La cuota está casi agotada", + "quotaGettingLow": "La cuota se está agotando", + "trafficHighlySkewed": "La distribución del tráfico está muy sesgada", + "comboHealthy": "El combo parece saludable" }, - "configuredTargets": "Configured targets", - "configuredTargetsDescription": "The saved combo steps, enriched with matching health data when available.", - "noConfiguredTargets": "No targets configured.", - "runtimeConfig": "Runtime config", - "runtimeConfigDescription": "Selected advanced settings for this combo.", - "noRuntimeConfig": "No custom runtime config.", - "resolvedTargets": "Resolved runtime targets", - "resolvedTargetsDescription": "Flattened targets after nested combo resolution and target-level metrics.", - "noResolvedTargetHealth": "No resolved target health yet.", - "quotaDistribution": "Quota and distribution", - "noQuotaSnapshots": "No quota snapshots for this combo window.", - "usageSkew": "Usage skew", - "recentDecisions": "Recent routing decisions", - "recentDecisionsDescription": "Recent call logs filtered by this combo name. Open Analytics for full explainability.", - "noRecentLogs": "No recent combo call logs found.", - "quickLinks": "Quick links", - "comboHealth": "Combo Health", - "callLogs": "Call Logs", - "costs": "Costs", + "configuredTargets": "Destinos configurados", + "configuredTargetsDescription": "Pasos del combo guardados, enriquecidos con datos de salud coincidentes cuando están disponibles.", + "noConfiguredTargets": "No hay objetivos configurados.", + "runtimeConfig": "Configuración en tiempo de ejecución", + "runtimeConfigDescription": "Ajustes avanzados seleccionados para este combo.", + "noRuntimeConfig": "Sin configuración personalizada en tiempo de ejecución.", + "resolvedTargets": "Objetivos resueltos en tiempo de ejecución", + "resolvedTargetsDescription": "Objetivos aplanados tras la resolución del combo anidado y métricas a nivel de objetivo.", + "noResolvedTargetHealth": "Aún no hay salud de objetivo resuelta.", + "quotaDistribution": "Cuota y distribución", + "noQuotaSnapshots": "No hay instantáneas de cuota para esta ventana de combo.", + "usageSkew": "Sesgo de uso", + "recentDecisions": "Decisiones de enrutamiento recientes", + "recentDecisionsDescription": "Logs de llamadas recientes filtrados por este nombre de combo. Abre Analytics para una explicabilidad completa.", + "noRecentLogs": "No se encontraron logs de llamadas de combo recientes.", + "quickLinks": "Enlaces rápidos", + "comboHealth": "Salud del combo", + "callLogs": "Logs de llamadas", + "costs": "Costes", "playground": "Playground", - "nestedCombo": "Nested combo", - "modelTarget": "Model target", - "weight": "{value}% weight", - "comboReference": "Combo reference", - "accountShort": "account {id}", - "keyShort": "key {id}", - "stepShort": "step {id}", - "dynamic": "dynamic", - "unknown": "unknown", - "unknownProvider": "unknown provider", - "unknownModel": "unknown model", - "resolvedTargetMetrics": "{requests} req · {success} success · {latency} · quota {quota}" + "nestedCombo": "Combo anidado", + "modelTarget": "Objetivo del modelo", + "weight": "{value}% de peso", + "comboReference": "Referencia del combo", + "accountShort": "cuenta {id}", + "keyShort": "clave {id}", + "stepShort": "paso {id}", + "dynamic": "dinámico", + "unknown": "desconocido", + "unknownProvider": "proveedor desconocido", + "unknownModel": "modelo desconocido", + "resolvedTargetMetrics": "{requests} sol. · {success} éxito · {latency} · cuota {quota}" }, "usageLimits": { - "usdUsageQuota": "USD usage quota", - "usdUsageQuotaDescription": "Blocks this key with a 400 API error after its local USD spend reaches the configured daily or weekly quota.", - "dailyQuotaUsd": "Daily quota (USD)", - "weeklyQuotaUsd": "Weekly quota (USD)", - "quotaWindowDescription": "Weekly quota follows the cached Claude weekly reset when available; otherwise it falls back to a rolling 7 day window. Daily quota uses the Fortaleza calendar day.", - "apiKeyUsdQuota": "API key USD quota", - "apiKeyUsdQuotaDescription": "When enabled, @@om-usage returns daily quota, weekly quota, daily spend, and weekly spend in USD. Weekly follows the cached Claude reset when available.", - "enabled": "Enabled", - "disabled": "Disabled", - "dailySpend": "Daily spend", - "weeklySpend": "Weekly spend", - "dailyQuota": "Daily quota", - "weeklyQuota": "Weekly quota", - "fallbackRollingDays": "fallback: rolling {days} days", - "fallbackRollingDaysShort": "Fallback rolling {days}d", - "resetDueNow": "reset due now", - "resetsInHours": "resets in {count}h", - "resetsInDays": "resets in {count}d", - "saveFailed": "Failed to save usage limits", - "saving": "Saving...", - "saveQuota": "Save quota", - "loadUsdCostsFailed": "Failed to load USD costs", - "usdCost": "USD Cost", - "close": "Close", - "loadingUsdCosts": "Loading USD costs", - "used": "Used", - "quotaUsed": "Quota used", - "estimatedFullQuota": "Est. 100%", - "rows": "Rows", - "window": "Window", - "unknown": "unknown", - "fromRecordedReset": "From recorded {quota} reset", - "fromObservedReset": "From observed {quota} reset", - "fromReset": "From {quota} reset", - "quotaEstimator": "Quota estimator", - "noApiKeyUsage": "No API key usage in this provider window.", - "requestTokenCounts": "{requests} requests · {tokens} tokens", - "noUsdLimit": "No USD limit" + "usdUsageQuota": "Cuota de uso en USD", + "usdUsageQuotaDescription": "Bloquea esta clave con un error 400 de API después de que su gasto local en USD alcance la cuota diaria o semanal configurada.", + "dailyQuotaUsd": "Cuota diaria (USD)", + "weeklyQuotaUsd": "Cuota semanal (USD)", + "quotaWindowDescription": "La cuota semanal sigue el reinicio semanal de Claude en caché cuando está disponible; de lo contrario, recurre a una ventana móvil de 7 días. La cuota diaria utiliza el día natural de Fortaleza.", + "apiKeyUsdQuota": "Cuota en USD de la clave de API", + "apiKeyUsdQuotaDescription": "Cuando está habilitado, @@om-usage devuelve la cuota diaria, la cuota semanal, el gasto diario y el gasto semanal en USD. La cuota semanal sigue el reinicio de Claude en caché cuando está disponible.", + "enabled": "Habilitado", + "disabled": "Deshabilitado", + "dailySpend": "Gasto diario", + "weeklySpend": "Gasto semanal", + "dailyQuota": "Cuota diaria", + "weeklyQuota": "Cuota semanal", + "fallbackRollingDays": "fallback: móvil de {days} días", + "fallbackRollingDaysShort": "Fallback móvil {days}d", + "resetDueNow": "reinicio pendiente ahora", + "resetsInHours": "se reinicia en {count}h", + "resetsInDays": "se reinicia en {count}d", + "saveFailed": "Error al guardar los límites de uso", + "saving": "Guardando...", + "saveQuota": "Guardar cuota", + "loadUsdCostsFailed": "Error al cargar los costes en USD", + "usdCost": "Coste en USD", + "close": "Cerrar", + "loadingUsdCosts": "Cargando costes en USD", + "used": "Usado", + "quotaUsed": "Cuota usada", + "estimatedFullQuota": "Est. al 100 %", + "rows": "Filas", + "window": "Ventana", + "unknown": "desconocido", + "fromRecordedReset": "Desde el reinicio registrado de {quota}", + "fromObservedReset": "Desde el reinicio observado de {quota}", + "fromReset": "Desde el reinicio de {quota}", + "quotaEstimator": "Estimador de cuota", + "noApiKeyUsage": "No hay uso de clave de API en esta ventana de proveedor.", + "requestTokenCounts": "{requests} solicitudes · {tokens} tokens", + "noUsdLimit": "Sin límite de USD" }, "freeBudget": { - "title": "Free-token budget", - "remaining": "{remaining} remaining · {percent}% of {total}", - "steadyMonth": "Steady / month", - "firstMonth": "First month (+ credits)", - "usedThisMonth": "Used this month", - "segmentHint": "Each segment = one free pool · pool-deduped, honest counting (no inflated rate-limit ceilings).", - "boost": "Unlock ~{tokens} more/mo with a one-time $10 OpenRouter top-up (50 → 1000 req/day)", - "uncapped": "Permanently free, no published cap (rate-limited) — real access, not counted in the headline:", - "tosRestricted": "{count, plural, one {# model} other {# models}} flagged as ToS-restricted — you decide", - "provider": "Provider", - "model": "Model", - "modelName": "Model name", - "type": "Type", - "tokensMonth": "Tokens/mo", - "credit": "{tokens} credit", - "hideTosRestricted": "Hide ToS-restricted", - "sort": "Sort", + "title": "Presupuesto de tokens gratuitos", + "remaining": "{remaining} restantes · {percent}% de {total}", + "steadyMonth": "Estable / mes", + "firstMonth": "Primer mes (+ créditos)", + "usedThisMonth": "Usado este mes", + "segmentHint": "Cada segmento = un pool gratuito · pool deduplicado, conteo honesto (sin techos de rate limit inflados).", + "boost": "Desbloquea ~{tokens} más/mes con una recarga única de 10 $ en OpenRouter (50 → 1000 sol./día)", + "uncapped": "Gratis permanentemente, sin límite publicado (rate-limited) — acceso real, no contabilizado en el titular:", + "tosRestricted": "{count, plural, one {# modelo} other {# modelos}} marcado como restringido por los TdS — tú decides", + "provider": "Proveedor", + "model": "Modelo", + "modelName": "Nombre del modelo", + "type": "Tipo", + "tokensMonth": "Tokens/mes", + "credit": "{tokens} crédito", + "hideTosRestricted": "Ocultar restringidos por TdS", + "sort": "Ordenar", "freeType": { - "daily": "daily", - "monthly": "monthly", - "creditMonthly": "credit/mo", - "uncapped": "uncapped", - "signupCredit": "signup credit", - "keyless": "keyless", - "discontinued": "discontinued" + "daily": "diario", + "monthly": "mensual", + "creditMonthly": "crédito/mes", + "uncapped": "sin límite", + "signupCredit": "crédito de registro", + "keyless": "sin clave", + "discontinued": "descatalogado" }, "tosTitle": { - "avoid": "ToS-restricted — review terms", - "caution": "Caution — personal-use / proxy clauses", - "ok": "Generally permissive" + "avoid": "Restringido por TdS — revisa los términos", + "caution": "Precaución — cláusulas de uso personal / proxy", + "ok": "Generalmente permisivo" } }, "providerHealthAutopilot": { - "title": "Provider Health Autopilot", - "description": "Finds unstable providers, account cooldowns, stale errors, and safe manual fixes.", - "loadFailed": "Failed to load autopilot report", - "actionApplied": "{action} applied.", - "actionFailed": "Autopilot action failed", - "refresh": "Refresh", - "status": "Status", - "issues": "Issues", - "actions": "Actions", - "connections": "Connections", + "title": "Piloto automático de salud del proveedor", + "description": "Encuentra proveedores inestables, enfriamientos de cuenta, errores obsoletos y correcciones manuales seguras.", + "loadFailed": "Error al cargar el informe del piloto automático", + "actionApplied": "{action} aplicado.", + "actionFailed": "La acción del piloto automático falló", + "refresh": "Actualizar", + "status": "Estado", + "issues": "Problemas", + "actions": "Acciones", + "connections": "Conexiones", "state": { - "healthy": "healthy", - "warning": "warning", - "critical": "critical", - "loading": "loading" + "healthy": "saludable", + "warning": "advertencia", + "critical": "crítico", + "loading": "cargando" }, - "loadingRecommendations": "Loading provider recommendations...", - "noRecommendations": "No provider health recommendations right now.", - "providerMetrics": "score {score}% · active {active}/{total} · cooldown {cooldown} · model lockouts {lockouts}", + "loadingRecommendations": "Cargando recomendaciones del proveedor...", + "noRecommendations": "No hay recomendaciones de salud del proveedor en este momento.", + "providerMetrics": "puntuación {score}% · activo {active}/{total} · enfriamiento {cooldown} · bloqueos de modelo {lockouts}", "providerState": { - "healthy": "healthy", - "degraded": "degraded", - "down": "down" + "healthy": "saludable", + "degraded": "degradado", + "down": "caído" }, "severity": { "info": "info", - "warning": "warning", - "critical": "critical" + "warning": "advertencia", + "critical": "crítico" }, - "remainingSeconds": "remaining {seconds}s", - "errorCode": "code {code}", - "applying": "Applying...", + "remainingSeconds": "{seconds}s restantes", + "errorCode": "código {code}", + "applying": "Aplicando...", "issue": { - "circuitOpenTitle": "Provider circuit breaker is open", - "circuitOpenRecommendation": "Verify upstream recovery, then reset the provider circuit breaker or wait for the retry window.", - "circuitRecoveryTitle": "Provider is probing recovery", - "circuitRecoveryRecommendation": "Let the next probe complete or reset the breaker after manual verification.", - "terminalTitle": "{label} has a terminal account state", - "terminalRecommendation": "Check billing, re-authenticate, or replace the credential before reactivating it.", - "cooldownTitle": "{label} is in temporary cooldown", - "cooldownRecommendation": "Wait for the upstream retry window or clear the cooldown after validating recovery.", - "staleErrorTitle": "{label} has stale error state", - "staleErrorRecommendation": "Clear stale error fields so the connection is eligible for normal routing again.", - "inactiveTitle": "{label} is disabled", - "inactiveRecommendation": "Reactivate only if this was not intentionally disabled.", - "modelLockoutTitle": "{model} is locked out for one connection", - "modelLockoutRecommendation": "Resolve the connection state or confirm model quota/availability has recovered before clearing the lockout.", - "quotaTitle": "Quota monitor reports {status}", - "quotaRecommendation": "Review quota usage and rotate traffic to another healthy connection if needed." + "circuitOpenTitle": "El disyuntor del proveedor está abierto", + "circuitOpenRecommendation": "Verifica la recuperación upstream, luego reinicia el disyuntor del proveedor o espera a la ventana de reintento.", + "circuitRecoveryTitle": "El proveedor está probando la recuperación", + "circuitRecoveryRecommendation": "Deja que la siguiente prueba se complete o reinicia el disyuntor tras la verificación manual.", + "terminalTitle": "{label} tiene un estado de cuenta terminal", + "terminalRecommendation": "Comprueba la facturación, vuelve a autenticarte o reemplaza la credencial antes de reactivarla.", + "cooldownTitle": "{label} está en enfriamiento temporal", + "cooldownRecommendation": "Espera a la ventana de reintento upstream o borra el enfriamiento tras validar la recuperación.", + "staleErrorTitle": "{label} tiene un estado de error obsoleto", + "staleErrorRecommendation": "Borra los campos de error obsoletos para que la conexión sea elegible para el enrutamiento normal de nuevo.", + "inactiveTitle": "{label} está deshabilitado", + "inactiveRecommendation": "Reactiva solo si no se deshabilitó intencionadamente.", + "modelLockoutTitle": "{model} está bloqueado para una conexión", + "modelLockoutRecommendation": "Resuelve el estado de la conexión o confirma que la cuota/disponibilidad del modelo se ha recuperado antes de borrar el bloqueo.", + "quotaTitle": "El monitor de cuota informa de {status}", + "quotaRecommendation": "Revisa el uso de la cuota y rota el tráfico a otra conexión saludable si es necesario." }, "action": { - "resetProviderBreaker": "Reset provider breaker", - "clearConnectionCooldown": "Clear connection cooldown", - "disableConnection": "Disable this connection", - "clearStaleError": "Clear stale error state", - "reactivateConnection": "Reactivate connection", - "clearModelLockout": "Clear model lockout" + "resetProviderBreaker": "Reiniciar disyuntor del proveedor", + "clearConnectionCooldown": "Borrar enfriamiento de conexión", + "disableConnection": "Deshabilitar esta conexión", + "clearStaleError": "Borrar estado de error obsoleto", + "reactivateConnection": "Reactivar conexión", + "clearModelLockout": "Borrar bloqueo de modelo" } }, "changelogPage": { - "newsTab": "News", - "changelogTab": "Changelog", - "loading": "Loading changelog...", - "announcementsLoadFailed": "Could not load announcements. Please try again later.", - "noAnnouncements": "No new announcements at this time.", - "learnMore": "Learn more", - "changelogLoadFailed": "Could not load the changelog. Please try again later.", - "retry": "Retry", - "viewFullHistory": "View full history on GitHub" + "newsTab": "Noticias", + "changelogTab": "Registro de cambios", + "loading": "Cargando registro de cambios...", + "announcementsLoadFailed": "No se pudieron cargar los anuncios. Por favor, inténtalo de nuevo más tarde.", + "noAnnouncements": "No hay anuncios nuevos en este momento.", + "learnMore": "Más información", + "changelogLoadFailed": "No se pudo cargar el registro de cambios. Por favor, inténtalo de nuevo más tarde.", + "retry": "Reintentar", + "viewFullHistory": "Ver historial completo en GitHub" }, "reasoningRouting": { - "title": "Reasoning routing policies", - "apiKeyTitle": "Reasoning routing for this API key", - "subtitle": "Reroute models and reasoning effort without requiring client support. Requests remain unchanged when no rule matches.", - "loadError": "Reasoning rules could not be loaded.", - "saveError": "The rule is invalid or could not be saved.", - "saved": "Reasoning rule saved.", - "deleteConfirm": "Delete this reasoning rule?", - "deleteError": "The reasoning rule could not be deleted.", - "empty": "No matching reasoning rules configured.", - "all": "All", - "any": "Any", - "enabled": "Enabled", - "disabled": "Disabled", - "filterSearch": "Search rules", - "filterScope": "Filter by scope", - "filterStatus": "Filter by status", - "allModels": "all models", - "keepModel": "Keep model", - "otherModel": "Other model", + "title": "Políticas de enrutamiento de razonamiento", + "apiKeyTitle": "Enrutamiento de razonamiento para esta clave de API", + "subtitle": "Redirige modelos y esfuerzo de razonamiento sin requerir soporte del cliente. Las solicitudes permanecen sin cambios cuando no coincide ninguna regla.", + "loadError": "No se pudieron cargar las reglas de razonamiento.", + "saveError": "La regla no es válida o no se pudo guardar.", + "saved": "Regla de razonamiento guardada.", + "deleteConfirm": "¿Eliminar esta regla de razonamiento?", + "deleteError": "No se pudo eliminar la regla de razonamiento.", + "empty": "No hay reglas de razonamiento coincidentes configuradas.", + "all": "Todas", + "any": "Cualquiera", + "enabled": "Habilitado", + "disabled": "Deshabilitado", + "filterSearch": "Buscar reglas", + "filterScope": "Filtrar por ámbito", + "filterStatus": "Filtrar por estado", + "allModels": "todos los modelos", + "keepModel": "Mantener modelo", + "otherModel": "Otro modelo", "combo": "Combo", - "priorityShort": "priority {value}", - "toggleAria": "Enable {name}", - "edit": "Edit", - "delete": "Delete", - "name": "Name", - "description": "Description", - "scopeLabel": "Scope", - "apiKey": "API key", - "sourceCombo": "Source combo", - "connection": "Connection", - "sourceModel": "Source model or wildcard", - "sourceModelOptional": "Empty = all models", - "sourceModelExample": "e.g. gpt-5*", - "sourceEffort": "Source effort", - "missing": "Not specified", - "signalOnly": "Non-discrete reasoning signal", - "requestTags": "Request tags", + "priorityShort": "prioridad {value}", + "toggleAria": "Habilitar {name}", + "edit": "Editar", + "delete": "Eliminar", + "name": "Nombre", + "description": "Descripción", + "scopeLabel": "Ámbito", + "apiKey": "Clave de API", + "sourceCombo": "Combo de origen", + "connection": "Conexión", + "sourceModel": "Modelo de origen o comodín", + "sourceModelOptional": "Vacío = todos los modelos", + "sourceModelExample": "p. ej., gpt-5*", + "sourceEffort": "Esfuerzo de origen", + "missing": "No especificado", + "signalOnly": "Señal de razonamiento no discreta", + "requestTags": "Etiquetas de solicitud", "requestTagsExample": "coding, internal", - "tagMode": "Tag matching", - "effortMode": "Effort mode", - "targetEffort": "Target effort", - "routingTarget": "Routing target", - "targetModel": "Target model", - "targetCombo": "Target combo", - "budgetAction": "Thinking budget", - "budgetTokens": "Budget tokens", - "priority": "Priority", - "saveChanges": "Save changes", - "add": "Add rule", - "cancel": "Cancel", + "tagMode": "Coincidencia de etiquetas", + "effortMode": "Modo de esfuerzo", + "targetEffort": "Esfuerzo de destino", + "routingTarget": "Destino de enrutamiento", + "targetModel": "Modelo de destino", + "targetCombo": "Combo de destino", + "budgetAction": "Presupuesto de razonamiento", + "budgetTokens": "Tokens de presupuesto", + "priority": "Prioridad", + "saveChanges": "Guardar cambios", + "add": "Añadir regla", + "cancel": "Cancelar", "simulateTitle": "Simular regla", "model": "Modelo", - "effort": "Nivel de esfuerzo", + "effort": "Esfuerzo", "transport": "Transporte", "simulate": "Simular sin proveedor superior", "extendedComboWarning": "Max/Ultra se valida por separado para cada objetivo del combo durante el enrutamiento.", @@ -12121,7 +12123,7 @@ "extendedUnsupportedWarning": "Max/Ultra solo es compatible de forma confirmada con modelos Codex GPT-5.6 adecuados. El servidor acepta modelos personalizados desconocidos con una advertencia.", "scope": { "global": "Global", - "apiKey": "Clave API", + "apiKey": "Clave de API", "combo": "Combo", "model": "Modelo", "connection": "Conexión" @@ -12141,7 +12143,7 @@ "pageTitle": "Modo Caos", "pageSubtitle": "Ejecuta múltiples modelos de IA en paralelo o de forma colaborativa en la misma tarea", "enableChaos": "Habilitar Modo Caos", - "enableChaosDesc": "Permitir que las claves API con modo caos habilitado utilicen esta función", + "enableChaosDesc": "Permitir que las claves de API con el Modo Caos habilitado utilicen esta función", "mode": "Modo predeterminado", "modeParallel": "Paralelo", "modeCollaborative": "Colaborativo", @@ -12151,7 +12153,7 @@ "timeoutDesc": "Tiempo máximo por llamada al modelo (5000-600000 ms)", "systemPrompt": "Prompt de sistema (opcional)", "systemPromptDesc": "Instrucciones personalizadas para todas las instancias de modelos en modo caos", - "providerOverrides": "Ajustes específicos por proveedor", + "providerOverrides": "Anulaciones de proveedor", "providerOverridesDesc": "Selecciona modelos específicos por proveedor para el modo caos", "providerId": "Proveedor", "modelId": "Modelo", @@ -12162,28 +12164,105 @@ "configError": "Error al guardar la configuración del modo caos", "configReset": "Restablecer a valores predeterminados", "keyPermission": "Acceso al Modo Caos", - "keyPermissionDesc": "Permitir que esta clave API utilice el Modo Caos (ejecución paralela multimodelo)", + "keyPermissionDesc": "Permitir que esta clave de API utilice el Modo Caos (ejecución paralela multimodelo)", "testButton": "Probar Modo Caos", "testTask": "Escribe un poema corto sobre la inteligencia artificial", "loadingProviderModels": "Cargando proveedores...", "systemPromptPlaceholder": "Opcional: anular el prompt de sistema predeterminado del modo caos...", "enabled": "Habilitado", "disabled": "Deshabilitado", - "maxTokens": "Límite de tokens", - "maxTokensDesc": "Límite máximo de tokens por respuesta del modelo. Valores más altos conllevan un mayor coste y tiempo de procesamiento.", + "maxTokens": "Máximo de tokens", + "maxTokensDesc": "Máximo de tokens por respuesta del modelo. Los valores más altos cuestan más y tardan más.", "providerIdPlaceholder": "ID de proveedor (escribe o selecciona)", "modelIdPlaceholder": "ID de modelo (opcional)", "on": "Activado", "off": "Desactivado", "availableProviders": "Proveedores disponibles ({count})", - "noProviderOverrides": "Sin ajustes específicos: todos los proveedores activos participarán con sus modelos predeterminados" + "noProviderOverrides": "Sin anulaciones: todos los proveedores activos participarán con sus modelos predeterminados" }, "kimiSponsorBanner": { - "title": "Kimi (Moonshot AI) is now an official sponsor of OmniRoute", - "description": "Kimi K3 aporta una ventana de contexto de 1M de tokens y un rendimiento de código de vanguardia a OmniRoute por una fracción del coste.", + "title": "Kimi (Moonshot AI) es el amigo de código abierto fundador de OmniRoute", + "description": "Kimi K3 aporta una ventana de contexto de 1M de tokens y un rendimiento de código de vanguardia a OmniRoute a una fracción del coste.", "cta": "Obtener Kimi Code", "partnerLinkNote": "Enlace de socio", "dismissAriaLabel": "Descartar" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Catálogo de Radar", + "subtitle": "Catálogo de modelos gratuito enriquecido con inteligencia de la comunidad", + "loading": "Cargando catálogo...", + "errorLoading": "Falló al cargar el catálogo de Radar", + "emptyState": "Aún no hay datos del catálogo. Sincroniza para descargar el último feed.", + "syncNow": "Sincronizar ahora", + "syncing": "Sincronizando...", + "syncCta": "Sincronizar ahora", + "syncFailed": "Sincronización fallida", + "flagDisabled": "Radar está desactivado", + "activationFailed": "Activación fallida", + "feedVersion": "Versión del feed", + "feedTier": "Nivel", + "feedFetched": "Última obtención", + "tierLive": "En vivo (tiempo real)", + "tierCommunity": "Comunidad (retraso de 30 días)", + "activateTitle": "Activar Radar", + "activateDescription": "Radar enriquece el catálogo de modelos gratuito con inteligencia de la comunidad: disponibilidad de modelos actualizada, cuotas y guías de configuración.", + "privacyNoUpload": "No se ha subido nada: tus datos permanecen locales", + "privacyOnlySigned": "Solo se descarga metadatos firmados criptográficamente", + "privacyLocalOnly": "Todo el procesamiento ocurre en tu instancia de OmniRoute", + "activateButton": "Activar", + "activating": "Activando...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Proveedor", + "colModel": "Modelo", + "colQuota": "Cuota", + "colContext": "Contexto", + "colCapabilities": "Capacidades", + "colTos": "Riesgo de ToS", + "newBadge": "nuevo", + "setupGuide": "Guía de configuración", + "disabledByFeed": "Desactivado por el feed de Radar", + "capTools": "Herramientas", + "capVision": "Visión", + "capThinking": "Pensando", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Configuración del proveedor", + "setupTitle": "Configuración: {provider}", + "setupSubtitle": "Sigue los pasos a continuación para configurar este proveedor", + "loading": "Cargando...", + "loadFailed": "Falló al cargar los datos de configuración", + "flagDisabled": "Radar está desactivado", + "providerNotFound": "Proveedor \"{provider}\" no encontrado en el catálogo", + "noProvider": "No se especificó ningún proveedor. Regresa al catálogo y selecciona un proveedor.", + "backToCatalog": "Volver al catálogo", + "providerConfigured": "El proveedor está configurado y listo", + "getApiKey": "Obtén tu clave API", + "setupSteps": "Pasos de configuración", + "noGuide": "No hay guía de configuración disponible para este proveedor.", + "visitDocs": "Visita la documentación del proveedor", + "testConnection": "Probar conexión", + "testDescription": "Verifica que tu conexión esté funcionando correctamente.", + "testButton": "Probar conexión", + "testing": "Probando...", + "testSuccess": "¡Conexión exitosa!", + "testFailed": "Falló la prueba de conexión", + "addConnection": "Agregar conexión", + "addConnectionDescription": "¿Aún no tienes una conexión? Agrega una en el panel de proveedores.", + "addConnectionLink": "Ir a proveedores →" + } } diff --git a/src/i18n/messages/fa.json b/src/i18n/messages/fa.json index 5e861c8b41..541b4e8201 100644 --- a/src/i18n/messages/fa.json +++ b/src/i18n/messages/fa.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "همیشه نمایان", "groupSeparatorLabel": "جداکننده", "discovery": "شناسایی", - "discoverySubtitle": "اسکن ارائه‌دهندگان برای دسترسی رایگان" + "discoverySubtitle": "اسکن ارائه‌دهندگان برای دسترسی رایگان", + "radar": "کاتالوگ رادار", + "radarSubtitle": "کاتالوگ مدل رایگان غنی‌شده با جامعه" }, "webhooks": { "title": "وب هوک ها", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "لینک همکاری", "dismissAriaLabel": "بستن" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "کاتالوگ رادار", + "subtitle": "کاتالوگ مدل رایگان غنی‌شده با هوش جمعی", + "loading": "در حال بارگذاری کاتالوگ...", + "errorLoading": "بارگذاری کاتالوگ رادار ناموفق بود", + "emptyState": "هنوز داده‌ای در کاتالوگ وجود ندارد. برای دانلود آخرین فید همگام‌سازی کنید.", + "syncNow": "همگام‌سازی اکنون", + "syncing": "در حال همگام‌سازی...", + "syncCta": "همگام‌سازی اکنون", + "syncFailed": "همگام‌سازی ناموفق بود", + "flagDisabled": "رادار غیرفعال است", + "activationFailed": "فعال‌سازی ناموفق بود", + "feedVersion": "نسخه فید", + "feedTier": "سطح", + "feedFetched": "آخرین دریافت‌شده", + "tierLive": "زنده (زمان واقعی)", + "tierCommunity": "جامعه (تاخیر ۳۰ روزه)", + "activateTitle": "فعال‌سازی رادار", + "activateDescription": "رادار کاتالوگ مدل رایگان را با هوش جمعی تأمین می‌کند — به‌روزرسانی در دسترس بودن مدل، سهمیه‌ها و راهنماهای راه‌اندازی.", + "privacyNoUpload": "هیچ چیزی بارگذاری نشده است — داده‌های شما محلی باقی می‌ماند", + "privacyOnlySigned": "فقط متاداده امضا شده به‌صورت رمزنگاری‌شده دانلود می‌شود", + "privacyLocalOnly": "تمام پردازش‌ها در نمونه OmniRoute شما انجام می‌شود", + "activateButton": "فعال‌سازی", + "activating": "در حال فعال‌سازی...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "تأمین‌کننده", + "colModel": "مدل", + "colQuota": "سهمیه", + "colContext": "زمینه", + "colCapabilities": "قابلیت‌ها", + "colTos": "ریسک شرایط خدمات", + "newBadge": "جدید", + "setupGuide": "راهنمای راه‌اندازی", + "disabledByFeed": "غیرفعال شده توسط فید رادار", + "capTools": "ابزارها", + "capVision": "بینش", + "capThinking": "تفکر", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "راه‌اندازی تأمین‌کننده", + "setupTitle": "راه‌اندازی: {provider}", + "setupSubtitle": "مراحل زیر را برای پیکربندی این تأمین‌کننده دنبال کنید", + "loading": "در حال بارگذاری...", + "loadFailed": "بارگذاری داده‌های راه‌اندازی ناموفق بود", + "flagDisabled": "رادار غیرفعال است", + "providerNotFound": "تأمین‌کننده \"{provider}\" در کاتالوگ پیدا نشد", + "noProvider": "هیچ تأمین‌کننده‌ای مشخص نشده است. به کاتالوگ برگردید و یک تأمین‌کننده انتخاب کنید.", + "backToCatalog": "بازگشت به کاتالوگ", + "providerConfigured": "تأمین‌کننده پیکربندی شده و آماده است", + "getApiKey": "کلید API خود را دریافت کنید", + "setupSteps": "مراحل راه‌اندازی", + "noGuide": "هیچ راهنمای راه‌اندازی برای این تأمین‌کننده موجود نیست.", + "visitDocs": "به مستندات تأمین‌کننده مراجعه کنید", + "testConnection": "تست اتصال", + "testDescription": "بررسی کنید که اتصال شما به درستی کار می‌کند.", + "testButton": "تست اتصال", + "testing": "در حال تست...", + "testSuccess": "اتصال موفقیت‌آمیز بود!", + "testFailed": "تست اتصال ناموفق بود", + "addConnection": "افزودن اتصال", + "addConnectionDescription": "هنوز اتصالی ندارید؟ یکی را در داشبورد تأمین‌کنندگان اضافه کنید.", + "addConnectionLink": "به تأمین‌کنندگان بروید →" + } } diff --git a/src/i18n/messages/fi.json b/src/i18n/messages/fi.json index 317165513a..681edce5c2 100644 --- a/src/i18n/messages/fi.json +++ b/src/i18n/messages/fi.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Aina näkyvissä", "groupSeparatorLabel": "Erotin", "discovery": "Löytäminen", - "discoverySubtitle": "Skannaa tarjoajat ilmaisen pääsyn varalta" + "discoverySubtitle": "Skannaa tarjoajat ilmaisen pääsyn varalta", + "radar": "Radar-katalogi", + "radarSubtitle": "Yhteisön rikastama ilmainen mallikatalogi" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Kumppanilinkki", "dismissAriaLabel": "Sulje" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar-katalogi", + "subtitle": "Ilmainen mallikatalogi, joka on rikastettu yhteisön tiedoilla", + "loading": "Ladataan katalogia...", + "errorLoading": "Radar-katalogin lataaminen epäonnistui", + "emptyState": "Katalogitietoja ei vielä ole. Synkronoi ladataksesi uusimman syötteen.", + "syncNow": "Synkronoi nyt", + "syncing": "Synkronoidaan...", + "syncCta": "Synkronoi nyt", + "syncFailed": "Synkronointi epäonnistui", + "flagDisabled": "Radar on pois käytöstä", + "activationFailed": "Aktivointi epäonnistui", + "feedVersion": "Syöteversio", + "feedTier": "Taso", + "feedFetched": "Viimeksi haettu", + "tierLive": "Reaaliaikainen", + "tierCommunity": "Yhteisö (30 päivän viive)", + "activateTitle": "Aktivoi Radar", + "activateDescription": "Radar rikastaa ilmaista mallikatalogia yhteisön keräämillä tiedoilla — päivitetty mallin saatavuus, kiintiöt ja asennusoppaat.", + "privacyNoUpload": "Ei mitään ladattu — tietosi pysyvät paikallisina", + "privacyOnlySigned": "Vain kryptografisesti allekirjoitettu metadata ladataan", + "privacyLocalOnly": "Kaikki käsittely tapahtuu OmniRoute-instanssissasi", + "activateButton": "Aktivoi", + "activating": "Aktivointi...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Palveluntarjoaja", + "colModel": "Malli", + "colQuota": "Kiintiö", + "colContext": "Konteksti", + "colCapabilities": "Ominaisuudet", + "colTos": "ToS-riski", + "newBadge": "uusi", + "setupGuide": "Asennusopas", + "disabledByFeed": "Poissa käytöstä Radar-syötteen vuoksi", + "capTools": "Työkalut", + "capVision": "Näkemys", + "capThinking": "Ajattelu", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Palveluntarjoajan asennus", + "setupTitle": "Asennus: {provider}", + "setupSubtitle": "Seuraa alla olevia vaiheita tämän palveluntarjoajan määrittämiseksi", + "loading": "Ladataan...", + "loadFailed": "Asennustietojen lataaminen epäonnistui", + "flagDisabled": "Radar on pois käytöstä", + "providerNotFound": "Palveluntarjoajaa \"{provider}\" ei löytynyt katalogista", + "noProvider": "Ei palveluntarjoajaa määritetty. Palaa katalogiin ja valitse palveluntarjoaja.", + "backToCatalog": "Takaisin katalogiin", + "providerConfigured": "Palveluntarjoaja on määritetty ja valmis", + "getApiKey": "Hanki API-avaimesi", + "setupSteps": "Asennusvaiheet", + "noGuide": "Tälle palveluntarjoajalle ei ole saatavilla asennusopasta.", + "visitDocs": "Vieraile palveluntarjoajan asiakirjoissa", + "testConnection": "Testaa yhteys", + "testDescription": "Varmista, että yhteytesi toimii oikein.", + "testButton": "Testaa yhteys", + "testing": "Testataan...", + "testSuccess": "Yhteys onnistui!", + "testFailed": "Yhteyden testaus epäonnistui", + "addConnection": "Lisää yhteys", + "addConnectionDescription": "Eikö sinulla vielä ole yhteyttä? Lisää yksi palveluntarjoajien hallintapaneelissa.", + "addConnectionLink": "Siirry palveluntarjoajiin →" + } } diff --git a/src/i18n/messages/fr.json b/src/i18n/messages/fr.json index 8c3a4f8c39..6febef7cbd 100644 --- a/src/i18n/messages/fr.json +++ b/src/i18n/messages/fr.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Toujours visible", "groupSeparatorLabel": "Séparateur", "discovery": "Découverte", - "discoverySubtitle": "Analyser les fournisseurs pour un accès gratuit" + "discoverySubtitle": "Analyser les fournisseurs pour un accès gratuit", + "radar": "Catalogue Radar", + "radarSubtitle": "Catalogue de modèles gratuit enrichi par la communauté" }, "webhooks": { "title": "Webhooks", @@ -12210,5 +12212,82 @@ "partnerLinkNote": "Lien partenaire", "dismissAriaLabel": "Ignorer" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Catalogue Radar", + "subtitle": "Catalogue de modèles gratuit enrichi par l'intelligence communautaire", + "loading": "Chargement du catalogue...", + "errorLoading": "Échec du chargement du catalogue Radar", + "emptyState": "Pas encore de données de catalogue. Synchronisez pour télécharger le dernier flux.", + "syncNow": "Synchroniser maintenant", + "syncing": "Synchronisation en cours...", + "syncCta": "Synchroniser maintenant", + "syncFailed": "Échec de la synchronisation", + "flagDisabled": "Radar est désactivé", + "activationFailed": "Échec de l'activation", + "feedVersion": "Version du flux", + "feedTier": "Niveau", + "feedFetched": "Dernière récupération", + "tierLive": "En direct (temps réel)", + "tierCommunity": "Communauté (délai de 30 jours)", + "activateTitle": "Activer Radar", + "activateDescription": "Radar enrichit le catalogue de modèles gratuit avec des informations provenant de la communauté — disponibilité des modèles mise à jour, quotas et guides de configuration.", + "privacyNoUpload": "Rien n'est téléchargé — vos données restent locales", + "privacyOnlySigned": "Seules les métadonnées signées cryptographiquement sont téléchargées", + "privacyLocalOnly": "Tout le traitement se fait sur votre instance OmniRoute", + "activateButton": "Activer", + "activating": "Activation en cours...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Fournisseur", + "colModel": "Modèle", + "colQuota": "Quota", + "colContext": "Contexte", + "colCapabilities": "Capacités", + "colTos": "Risque des CGU", + "newBadge": "nouveau", + "setupGuide": "Guide de configuration", + "disabledByFeed": "Désactivé par le flux Radar", + "capTools": "Outils", + "capVision": "Vision", + "capThinking": "Réflexion", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Configuration du fournisseur", + "setupTitle": "Configuration : {provider}", + "setupSubtitle": "Suivez les étapes ci-dessous pour configurer ce fournisseur", + "loading": "Chargement...", + "loadFailed": "Échec du chargement des données de configuration", + "flagDisabled": "Radar est désactivé", + "providerNotFound": "Fournisseur \"{provider}\" non trouvé dans le catalogue", + "noProvider": "Aucun fournisseur spécifié. Retournez au catalogue et sélectionnez un fournisseur.", + "backToCatalog": "Retour au catalogue", + "providerConfigured": "Le fournisseur est configuré et prêt", + "getApiKey": "Obtenez votre clé API", + "setupSteps": "Étapes de configuration", + "noGuide": "Aucun guide de configuration disponible pour ce fournisseur.", + "visitDocs": "Visitez la documentation du fournisseur", + "testConnection": "Tester la connexion", + "testDescription": "Vérifiez que votre connexion fonctionne correctement.", + "testButton": "Tester la connexion", + "testing": "Test en cours...", + "testSuccess": "Connexion réussie !", + "testFailed": "Échec du test de connexion", + "addConnection": "Ajouter une connexion", + "addConnectionDescription": "Vous n'avez pas encore de connexion ? Ajoutez-en une dans le tableau de bord des fournisseurs.", + "addConnectionLink": "Aller aux fournisseurs →" + } } diff --git a/src/i18n/messages/gu.json b/src/i18n/messages/gu.json index 0ef30f0b90..bfd5e86155 100644 --- a/src/i18n/messages/gu.json +++ b/src/i18n/messages/gu.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "હંમેશા દૃશ્યમાન", "groupSeparatorLabel": "વિભાજક", "discovery": "ડિસ્કવરી", - "discoverySubtitle": "મફત ઍક્સેસ માટે પ્રોવાઇડર્સ સ્કેન કરો" + "discoverySubtitle": "મફત ઍક્સેસ માટે પ્રોવાઇડર્સ સ્કેન કરો", + "radar": "રેડાર કેટલોગ", + "radarSubtitle": "સમુદાય-સમૃદ્ધ મફત મોડલ કેટલોગ" }, "webhooks": { "title": "વેબહુક્સ", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "પાર્ટનર લિંક", "dismissAriaLabel": "બંધ કરો" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "રેડાર કેટલોગ", + "subtitle": "સમુદાયની બુદ્ધિથી સમૃદ્ધ મફત મોડલ કેટલોગ", + "loading": "કેટલોગ લોડ થઈ રહ્યું છે...", + "errorLoading": "રેડાર કેટલોગ લોડ કરવામાં નિષ્ફળ", + "emptyState": "હજુ સુધી કોઈ કેટલોગ ડેટા નથી. તાજા ફીડ ડાઉનલોડ કરવા માટે સમંકરણ કરો.", + "syncNow": "હવે સમંકરણ કરો", + "syncing": "સમંકરણ થઈ રહ્યું છે...", + "syncCta": "હવે સમંકરણ કરો", + "syncFailed": "સમંકરણ નિષ્ફળ", + "flagDisabled": "રેડાર અક્ષિપ્ત છે", + "activationFailed": "સક્રિયકરણ નિષ્ફળ", + "feedVersion": "ફીડ સંસ્કરણ", + "feedTier": "સ્તર", + "feedFetched": "છેલ્લી મેળવેલ", + "tierLive": "જીવંત (વાસ્તવિક-સમય)", + "tierCommunity": "સમુદાય (30-દિવસનો વિલંબ)", + "activateTitle": "રેડાર સક્રિય કરો", + "activateDescription": "રેડાર મફત મોડલ કેટલોગને સમુદાય-સ્રોતિત બુદ્ધિથી સમૃદ્ધ કરે છે - અપડેટ થયેલ મોડલ ઉપલબ્ધતા, ક્વોટા, અને સેટઅપ માર્ગદર્શિકાઓ.", + "privacyNoUpload": "કશું અપલોડ નથી થયું - તમારું ડેટા સ્થાનિક રહે છે", + "privacyOnlySigned": "ફક્ત ક્રિપ્ટોગ્રાફિક રીતે સહી કરેલ મેટાડેટા ડાઉનલોડ થાય છે", + "privacyLocalOnly": "તમામ પ્રક્રિયા તમારા ઓમ્નીરૂટ ઇન્સ્ટન્સ પર થાય છે", + "activateButton": "સક્રિય કરો", + "activating": "સક્રિય થઈ રહ્યું છે...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "પ્રદાતા", + "colModel": "મોડલ", + "colQuota": "ક્વોટા", + "colContext": "સંદર્ભ", + "colCapabilities": "ક્ષમતાઓ", + "colTos": "ToS જોખમ", + "newBadge": "નવું", + "setupGuide": "સેટઅપ માર્ગદર્શિકા", + "disabledByFeed": "રેડાર ફીડ દ્વારા અક્ષિપ્ત", + "capTools": "સાધનો", + "capVision": "દ્રષ્ટિ", + "capThinking": "વિચારવું", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "પ્રદાતા સેટઅપ", + "setupTitle": "સેટઅપ: {provider}", + "setupSubtitle": "આ પ્રદાતાને કન્ફિગર કરવા માટે નીચેના પગલાં અનુસરો", + "loading": "લોડ થઈ રહ્યું છે...", + "loadFailed": "સેટઅપ ડેટા લોડ કરવામાં નિષ્ફળ", + "flagDisabled": "રેડાર અક્ષિપ્ત છે", + "providerNotFound": "કેટલોગમાં પ્રદાતા \"{provider}\" મળ્યો નથી", + "noProvider": "કોઈ પ્રદાતા નિર્દિષ્ટ નથી. કેટલોગમાં પાછા જાઓ અને પ્રદાતા પસંદ કરો.", + "backToCatalog": "કેટલોગમાં પાછા", + "providerConfigured": "પ્રદાતા કન્ફિગર કરવામાં આવ્યો છે અને તૈયાર છે", + "getApiKey": "તમારું API કી મેળવો", + "setupSteps": "સેટઅપ પગલાં", + "noGuide": "આ પ્રદાતા માટે કોઈ સેટઅપ માર્ગદર્શિકા ઉપલબ્ધ નથી.", + "visitDocs": "પ્રદાતા દસ્તાવેજો મુલાકાત લો", + "testConnection": "કનેક્શન પરીક્ષણ", + "testDescription": "ખાતરી કરો કે તમારું કનેક્શન યોગ્ય રીતે કાર્ય કરી રહ્યું છે.", + "testButton": "કનેક્શન પરીક્ષણ", + "testing": "પરીક્ષણ થઈ રહ્યું છે...", + "testSuccess": "કનેક્શન સફળ!", + "testFailed": "કનેક્શન પરીક્ષણ નિષ્ફળ", + "addConnection": "કનેક્શન ઉમેરો", + "addConnectionDescription": "હજુ સુધી કનેક્શન નથી? પ્રદાતા ડેશબોર્ડમાં એક ઉમેરો.", + "addConnectionLink": "પ્રદાતાઓ પર જાઓ →" + } } diff --git a/src/i18n/messages/he.json b/src/i18n/messages/he.json index 587de73d5d..138560d266 100644 --- a/src/i18n/messages/he.json +++ b/src/i18n/messages/he.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "גלוי תמיד", "groupSeparatorLabel": "מפריד", "discovery": "גילוי", - "discoverySubtitle": "סריקת ספקים לגישה חינמית" + "discoverySubtitle": "סריקת ספקים לגישה חינמית", + "radar": "קטלוג רדאר", + "radarSubtitle": "קטלוג מודלים חינמי מועשר בקהילה" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "קישור שותף", "dismissAriaLabel": "התעלם" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "קטלוג רדאר", + "subtitle": "קטלוג מודלים חינמי מועשר באינטליגנציה קהילתית", + "loading": "טוען קטלוג...", + "errorLoading": "כישלון בטעינת קטלוג רדאר", + "emptyState": "אין נתוני קטלוג עדיין. סנכרן כדי להוריד את הפיד האחרון.", + "syncNow": "סנכרן עכשיו", + "syncing": "מסנכרן...", + "syncCta": "סנכרן עכשיו", + "syncFailed": "סנכרון נכשל", + "flagDisabled": "רדאר מושבת", + "activationFailed": "הפעלה נכשלה", + "feedVersion": "גרסת פיד", + "feedTier": "רמה", + "feedFetched": "האחרון שנמשך", + "tierLive": "חי (זמן אמת)", + "tierCommunity": "קהילתי (עיכוב של 30 יום)", + "activateTitle": "הפעל רדאר", + "activateDescription": "רדאר מעשיר את קטלוג המודלים החינמי באינטליגנציה ממקורות קהילתיים — זמינות מודלים מעודכנת, מכסות ומדריכי התקנה.", + "privacyNoUpload": "שום דבר לא הועלה — הנתונים שלך נשארים מקומיים", + "privacyOnlySigned": "רק מטא-נתונים חתומים קריפטוגרפית מורדים", + "privacyLocalOnly": "כל העיבוד מתבצע על מופע OmniRoute שלך", + "activateButton": "הפעל", + "activating": "מפעיל...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "ספק", + "colModel": "מודל", + "colQuota": "מכסה", + "colContext": "הקשר", + "colCapabilities": "יכולות", + "colTos": "סיכון תנאי שירות", + "newBadge": "חדש", + "setupGuide": "מדריך התקנה", + "disabledByFeed": "מושבת על ידי פיד רדאר", + "capTools": "כלים", + "capVision": "חזון", + "capThinking": "חשיבה", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "הגדרת ספק", + "setupTitle": "הגדרה: {provider}", + "setupSubtitle": "עקוב אחרי הצעדים למטה כדי להגדיר את הספק הזה", + "loading": "טוען...", + "loadFailed": "כישלון בטעינת נתוני ההגדרה", + "flagDisabled": "רדאר מושבת", + "providerNotFound": "ספק \"{provider}\" לא נמצא בקטלוג", + "noProvider": "לא צוין ספק. חזור לקטלוג ובחר ספק.", + "backToCatalog": "חזור לקטלוג", + "providerConfigured": "הספק מוגדר ומוכן", + "getApiKey": "קבל את מפתח ה-API שלך", + "setupSteps": "צעדי התקנה", + "noGuide": "אין מדריך התקנה זמין עבור ספק זה.", + "visitDocs": "בקר במדריכי הספק", + "testConnection": "בדוק חיבור", + "testDescription": "ודא שהחיבור שלך פועל כראוי.", + "testButton": "בדוק חיבור", + "testing": "בודק...", + "testSuccess": "החיבור הצליח!", + "testFailed": "בדיקת חיבור נכשלה", + "addConnection": "הוסף חיבור", + "addConnectionDescription": "עדיין אין לך חיבור? הוסף אחד בלוח הבקרה של הספקים.", + "addConnectionLink": "עבור לספקים →" + } } diff --git a/src/i18n/messages/hi.json b/src/i18n/messages/hi.json index 1b35217f43..c1edee4b31 100644 --- a/src/i18n/messages/hi.json +++ b/src/i18n/messages/hi.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "हमेशा दृश्यमान", "groupSeparatorLabel": "विभाजक", "discovery": "डिस्कवरी", - "discoverySubtitle": "मुफ़्त एक्सेस के लिए प्रोवाइडर्स को स्कैन करें" + "discoverySubtitle": "मुफ़्त एक्सेस के लिए प्रोवाइडर्स को स्कैन करें", + "radar": "रडार कैटलॉग", + "radarSubtitle": "समुदाय-समृद्ध मुफ्त मॉडल कैटलॉग" }, "webhooks": { "title": "वेबहुक", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "पार्टनर लिंक", "dismissAriaLabel": "खारिज करें" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "रडार कैटलॉग", + "subtitle": "समुदाय की बुद्धिमत्ता से समृद्ध मुफ्त मॉडल कैटलॉग", + "loading": "कैटलॉग लोड हो रहा है...", + "errorLoading": "रडार कैटलॉग लोड करने में विफल", + "emptyState": "अभी तक कोई कैटलॉग डेटा नहीं है। नवीनतम फीड डाउनलोड करने के लिए समन्वय करें।", + "syncNow": "अभी समन्वय करें", + "syncing": "समन्वय हो रहा है...", + "syncCta": "अभी समन्वय करें", + "syncFailed": "समन्वय विफल", + "flagDisabled": "रडार अक्षम है", + "activationFailed": "सक्रियण विफल", + "feedVersion": "फीड संस्करण", + "feedTier": "स्तर", + "feedFetched": "अंतिम प्राप्त", + "tierLive": "लाइव (वास्तविक समय)", + "tierCommunity": "समुदाय (30-दिन की देरी)", + "activateTitle": "रडार सक्रिय करें", + "activateDescription": "रडार मुफ्त मॉडल कैटलॉग को समुदाय-स्रोत बुद्धिमत्ता से समृद्ध करता है - अद्यतन मॉडल उपलब्धता, कोटा, और सेटअप गाइड।", + "privacyNoUpload": "कुछ भी अपलोड नहीं किया गया - आपका डेटा स्थानीय रहता है", + "privacyOnlySigned": "केवल क्रिप्टोग्राफिक रूप से हस्ताक्षरित मेटाडेटा डाउनलोड किया जाता है", + "privacyLocalOnly": "सभी प्रोसेसिंग आपके OmniRoute उदाहरण पर होती है", + "activateButton": "सक्रिय करें", + "activating": "सक्रिय किया जा रहा है...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "प्रदाता", + "colModel": "मॉडल", + "colQuota": "कोटा", + "colContext": "संदर्भ", + "colCapabilities": "क्षमताएँ", + "colTos": "ToS जोखिम", + "newBadge": "नया", + "setupGuide": "सेटअप गाइड", + "disabledByFeed": "रडार फीड द्वारा अक्षम", + "capTools": "उपकरण", + "capVision": "दृष्टि", + "capThinking": "सोच", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "प्रदाता सेटअप", + "setupTitle": "सेटअप: {provider}", + "setupSubtitle": "इस प्रदाता को कॉन्फ़िगर करने के लिए नीचे दिए गए चरणों का पालन करें", + "loading": "लोड हो रहा है...", + "loadFailed": "सेटअप डेटा लोड करने में विफल", + "flagDisabled": "रडार अक्षम है", + "providerNotFound": "कैटलॉग में प्रदाता \"{provider}\" नहीं मिला", + "noProvider": "कोई प्रदाता निर्दिष्ट नहीं किया गया। कैटलॉग पर लौटें और एक प्रदाता चुनें।", + "backToCatalog": "कैटलॉग पर वापस जाएं", + "providerConfigured": "प्रदाता कॉन्फ़िगर किया गया है और तैयार है", + "getApiKey": "अपना API कुंजी प्राप्त करें", + "setupSteps": "सेटअप चरण", + "noGuide": "इस प्रदाता के लिए कोई सेटअप गाइड उपलब्ध नहीं है।", + "visitDocs": "प्रदाता दस्तावेज़ पर जाएं", + "testConnection": "कनेक्शन का परीक्षण करें", + "testDescription": "सुनिश्चित करें कि आपका कनेक्शन सही ढंग से काम कर रहा है।", + "testButton": "कनेक्शन का परीक्षण करें", + "testing": "परीक्षण हो रहा है...", + "testSuccess": "कनेक्शन सफल!", + "testFailed": "कनेक्शन परीक्षण विफल", + "addConnection": "कनेक्शन जोड़ें", + "addConnectionDescription": "क्या आपके पास अभी तक कोई कनेक्शन नहीं है? प्रदाता डैशबोर्ड में एक जोड़ें।", + "addConnectionLink": "प्रदाताओं पर जाएं →" + } } diff --git a/src/i18n/messages/hu.json b/src/i18n/messages/hu.json index b95d668648..93da62a51e 100644 --- a/src/i18n/messages/hu.json +++ b/src/i18n/messages/hu.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Mindig látható", "groupSeparatorLabel": "Elválasztó", "discovery": "Felfedezés", - "discoverySubtitle": "Szolgáltatók vizsgálata ingyenes hozzáférésért" + "discoverySubtitle": "Szolgáltatók vizsgálata ingyenes hozzáférésért", + "radar": "Radar Katalógus", + "radarSubtitle": "Közösséggel gazdagított ingyenes modell katalógus" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Partnerhivatkozás", "dismissAriaLabel": "Elvetés" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Katalógus", + "subtitle": "Közösségi intelligenciával gazdagított ingyenes modell katalógus", + "loading": "Katalógus betöltése...", + "errorLoading": "A Radar katalógus betöltése nem sikerült", + "emptyState": "Még nincs katalógus adat. Szinkronizálj a legfrissebb feed letöltéséhez.", + "syncNow": "Szinkronizálj most", + "syncing": "Szinkronizálás...", + "syncCta": "Szinkronizálj most", + "syncFailed": "Szinkronizálás sikertelen", + "flagDisabled": "A Radar le van tiltva", + "activationFailed": "Aktiválás sikertelen", + "feedVersion": "Feed verzió", + "feedTier": "Szint", + "feedFetched": "Utolsó lekérdezés", + "tierLive": "Élő (valós idejű)", + "tierCommunity": "Közösségi (30 napos késleltetés)", + "activateTitle": "Radar aktiválása", + "activateDescription": "A Radar gazdagítja az ingyenes modell katalógust a közösségi forrásból származó intelligenciával — frissített modell elérhetőség, kvóták és beállítási útmutatók.", + "privacyNoUpload": "Nincs feltöltve semmi — az adataid helyben maradnak", + "privacyOnlySigned": "Csak kriptográfiailag aláírt metaadatok kerülnek letöltésre", + "privacyLocalOnly": "Minden feldolgozás a te OmniRoute példányodon történik", + "activateButton": "Aktiválás", + "activating": "Aktiválás...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Szolgáltató", + "colModel": "Modell", + "colQuota": "Kvóta", + "colContext": "Kontextus", + "colCapabilities": "Képességek", + "colTos": "ToS Kockázat", + "newBadge": "új", + "setupGuide": "Beállítási útmutató", + "disabledByFeed": "A Radar feed letiltotta", + "capTools": "Eszközök", + "capVision": "Látás", + "capThinking": "Gondolkodás", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Szolgáltató beállítása", + "setupTitle": "Beállítás: {provider}", + "setupSubtitle": "Kövesd az alábbi lépéseket ennek a szolgáltatónak a konfigurálásához", + "loading": "Betöltés...", + "loadFailed": "A beállítási adatok betöltése nem sikerült", + "flagDisabled": "A Radar le van tiltva", + "providerNotFound": "A \"{provider}\" szolgáltató nem található a katalógusban", + "noProvider": "Nincs megadva szolgáltató. Térj vissza a katalógushoz, és válassz egy szolgáltatót.", + "backToCatalog": "Vissza a katalógushoz", + "providerConfigured": "A szolgáltató konfigurálva van és készen áll", + "getApiKey": "Szerezd meg az API kulcsodat", + "setupSteps": "Beállítási lépések", + "noGuide": "Nincs elérhető beállítási útmutató ehhez a szolgáltatóhoz.", + "visitDocs": "Látogass el a szolgáltató dokumentációjához", + "testConnection": "Kapcsolat tesztelése", + "testDescription": "Ellenőrizd, hogy a kapcsolatod helyesen működik-e.", + "testButton": "Kapcsolat tesztelése", + "testing": "Tesztelés...", + "testSuccess": "Kapcsolat sikeres!", + "testFailed": "A kapcsolat tesztelése sikertelen", + "addConnection": "Kapcsolat hozzáadása", + "addConnectionDescription": "Még nincs kapcsolatod? Adj hozzá egyet a szolgáltatók irányítópultján.", + "addConnectionLink": "Menj a szolgáltatókhoz →" + } } diff --git a/src/i18n/messages/id.json b/src/i18n/messages/id.json index c24697c188..cdd2643680 100644 --- a/src/i18n/messages/id.json +++ b/src/i18n/messages/id.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Selalu terlihat", "groupSeparatorLabel": "Pemisah", "discovery": "Penemuan", - "discoverySubtitle": "Pindai penyedia untuk akses gratis" + "discoverySubtitle": "Pindai penyedia untuk akses gratis", + "radar": "Katalog Radar", + "radarSubtitle": "Katalog model gratis yang diperkaya komunitas" }, "webhooks": { "title": "Webhook", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Tautan mitra", "dismissAriaLabel": "Tutup" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Katalog Radar", + "subtitle": "Katalog model gratis yang diperkaya dengan intelijen komunitas", + "loading": "Memuat katalog...", + "errorLoading": "Gagal memuat katalog Radar", + "emptyState": "Belum ada data katalog. Sinkronkan untuk mengunduh umpan terbaru.", + "syncNow": "Sinkronkan sekarang", + "syncing": "Sedang menyinkronkan...", + "syncCta": "Sinkronkan sekarang", + "syncFailed": "Sinkronisasi gagal", + "flagDisabled": "Radar dinonaktifkan", + "activationFailed": "Aktivasi gagal", + "feedVersion": "Versi umpan", + "feedTier": "Tingkat", + "feedFetched": "Terakhir diambil", + "tierLive": "Langsung (waktu nyata)", + "tierCommunity": "Komunitas (penundaan 30 hari)", + "activateTitle": "Aktifkan Radar", + "activateDescription": "Radar memperkaya katalog model gratis dengan intelijen yang bersumber dari komunitas — ketersediaan model yang diperbarui, kuota, dan panduan pengaturan.", + "privacyNoUpload": "Tidak ada yang diunggah — data Anda tetap lokal", + "privacyOnlySigned": "Hanya metadata yang ditandatangani secara kriptografis yang diunduh", + "privacyLocalOnly": "Semua pemrosesan terjadi di instance OmniRoute Anda", + "activateButton": "Aktifkan", + "activating": "Mengaktifkan...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Penyedia", + "colModel": "Model", + "colQuota": "Kuota", + "colContext": "Konteks", + "colCapabilities": "Kemampuan", + "colTos": "Risiko ToS", + "newBadge": "baru", + "setupGuide": "Panduan pengaturan", + "disabledByFeed": "Dinonaktifkan oleh umpan Radar", + "capTools": "Alat", + "capVision": "Visi", + "capThinking": "Berpikir", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Pengaturan Penyedia", + "setupTitle": "Pengaturan: {provider}", + "setupSubtitle": "Ikuti langkah-langkah di bawah ini untuk mengonfigurasi penyedia ini", + "loading": "Memuat...", + "loadFailed": "Gagal memuat data pengaturan", + "flagDisabled": "Radar dinonaktifkan", + "providerNotFound": "Penyedia \"{provider}\" tidak ditemukan di katalog", + "noProvider": "Tidak ada penyedia yang ditentukan. Kembali ke katalog dan pilih penyedia.", + "backToCatalog": "Kembali ke katalog", + "providerConfigured": "Penyedia telah dikonfigurasi dan siap", + "getApiKey": "Dapatkan kunci API Anda", + "setupSteps": "Langkah pengaturan", + "noGuide": "Tidak ada panduan pengaturan yang tersedia untuk penyedia ini.", + "visitDocs": "Kunjungi dokumen penyedia", + "testConnection": "Uji koneksi", + "testDescription": "Verifikasi bahwa koneksi Anda berfungsi dengan benar.", + "testButton": "Uji koneksi", + "testing": "Menguji...", + "testSuccess": "Koneksi berhasil!", + "testFailed": "Uji koneksi gagal", + "addConnection": "Tambah koneksi", + "addConnectionDescription": "Belum memiliki koneksi? Tambahkan satu di dasbor penyedia.", + "addConnectionLink": "Pergi ke penyedia →" + } } diff --git a/src/i18n/messages/in.json b/src/i18n/messages/in.json index e3d098a5d5..682cfbe3c8 100644 --- a/src/i18n/messages/in.json +++ b/src/i18n/messages/in.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Selalu terlihat", "groupSeparatorLabel": "Pemisah", "discovery": "Penemuan", - "discoverySubtitle": "Pindai penyedia untuk akses gratis" + "discoverySubtitle": "Pindai penyedia untuk akses gratis", + "radar": "रडार कैटलॉग", + "radarSubtitle": "समुदाय-समृद्ध मुफ्त मॉडल कैटलॉग" }, "webhooks": { "title": "Webhook", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Tautan mitra", "dismissAriaLabel": "Tutup" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "रडार कैटलॉग", + "subtitle": "समुदाय की बुद्धिमत्ता से समृद्ध मुफ्त मॉडल कैटलॉग", + "loading": "कैटलॉग लोड हो रहा है...", + "errorLoading": "रडार कैटलॉग लोड करने में विफल", + "emptyState": "अभी तक कोई कैटलॉग डेटा नहीं है। नवीनतम फीड डाउनलोड करने के लिए समन्वय करें।", + "syncNow": "अभी समन्वय करें", + "syncing": "समन्वय हो रहा है...", + "syncCta": "अभी समन्वय करें", + "syncFailed": "समन्वय विफल", + "flagDisabled": "रडार अक्षम है", + "activationFailed": "सक्रियण विफल", + "feedVersion": "फीड संस्करण", + "feedTier": "स्तर", + "feedFetched": "अंतिम प्राप्त", + "tierLive": "लाइव (वास्तविक समय)", + "tierCommunity": "समुदाय (30-दिन की देरी)", + "activateTitle": "रडार सक्रिय करें", + "activateDescription": "रडार मुफ्त मॉडल कैटलॉग को समुदाय-स्रोत की बुद्धिमत्ता से समृद्ध करता है - अद्यतन मॉडल उपलब्धता, कोटा, और सेटअप गाइड।", + "privacyNoUpload": "कुछ भी अपलोड नहीं किया गया - आपका डेटा स्थानीय रहता है", + "privacyOnlySigned": "केवल क्रिप्टोग्राफिक रूप से हस्ताक्षरित मेटाडेटा डाउनलोड किया जाता है", + "privacyLocalOnly": "सभी प्रोसेसिंग आपके OmniRoute इंस्टेंस पर होती है", + "activateButton": "सक्रिय करें", + "activating": "सक्रियण हो रहा है...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "प्रदाता", + "colModel": "मॉडल", + "colQuota": "कोटा", + "colContext": "संदर्भ", + "colCapabilities": "क्षमताएँ", + "colTos": "ToS जोखिम", + "newBadge": "नया", + "setupGuide": "सेटअप गाइड", + "disabledByFeed": "रडार फीड द्वारा अक्षम", + "capTools": "उपकरण", + "capVision": "दृष्टि", + "capThinking": "सोच", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "प्रदाता सेटअप", + "setupTitle": "सेटअप: {provider}", + "setupSubtitle": "इस प्रदाता को कॉन्फ़िगर करने के लिए नीचे दिए गए चरणों का पालन करें", + "loading": "लोड हो रहा है...", + "loadFailed": "सेटअप डेटा लोड करने में विफल", + "flagDisabled": "रडार अक्षम है", + "providerNotFound": "कैटलॉग में प्रदाता \"{provider}\" नहीं मिला", + "noProvider": "कोई प्रदाता निर्दिष्ट नहीं किया गया। कैटलॉग पर लौटें और एक प्रदाता चुनें।", + "backToCatalog": "कैटलॉग पर वापस जाएं", + "providerConfigured": "प्रदाता कॉन्फ़िगर किया गया है और तैयार है", + "getApiKey": "अपना API कुंजी प्राप्त करें", + "setupSteps": "सेटअप चरण", + "noGuide": "इस प्रदाता के लिए कोई सेटअप गाइड उपलब्ध नहीं है।", + "visitDocs": "प्रदाता दस्तावेज़ पर जाएं", + "testConnection": "कनेक्शन का परीक्षण करें", + "testDescription": "सुनिश्चित करें कि आपका कनेक्शन सही ढंग से काम कर रहा है।", + "testButton": "कनेक्शन का परीक्षण करें", + "testing": "परीक्षण हो रहा है...", + "testSuccess": "कनेक्शन सफल!", + "testFailed": "कनेक्शन परीक्षण विफल", + "addConnection": "कनेक्शन जोड़ें", + "addConnectionDescription": "क्या आपके पास अभी तक कोई कनेक्शन नहीं है? प्रदाता डैशबोर्ड में एक जोड़ें।", + "addConnectionLink": "प्रदाताओं पर जाएं →" + } } diff --git a/src/i18n/messages/it.json b/src/i18n/messages/it.json index 8d1ccb448c..db40130bfb 100644 --- a/src/i18n/messages/it.json +++ b/src/i18n/messages/it.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Sempre visibile", "groupSeparatorLabel": "Separatore", "discovery": "Discovery", - "discoverySubtitle": "Scansiona provider per accesso gratuito" + "discoverySubtitle": "Scansiona provider per accesso gratuito", + "radar": "Catalogo Radar", + "radarSubtitle": "Catalogo di modelli gratuito arricchito dalla comunità" }, "webhooks": { "title": "Webhook", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Link partner", "dismissAriaLabel": "Ignora" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "Mostra gli id specchio / su /v1/models per i modelli il cui proprietario canonico non ha credenziali attive ma un gateway di transito con una credenziale attiva li instrada. Attenzione: aggiunge voci nel catalogo per tutti i client quando abilitato globalmente." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "Mostra gli id specchio / su /v1/models per i modelli il cui proprietario canonico non ha credenziali attive ma un gateway di transito con una credenziale attiva li instrada. Attenzione: aggiunge voci nel catalogo per tutti i client quando abilitato globalmente.", + "radarPage": { + "title": "Catalogo Radar", + "subtitle": "Catalogo di modelli gratuito arricchito con intelligenza della comunità", + "loading": "Caricamento catalogo...", + "errorLoading": "Impossibile caricare il catalogo Radar", + "emptyState": "Nessun dato del catalogo disponibile. Sincronizza per scaricare il feed più recente.", + "syncNow": "Sincronizza ora", + "syncing": "Sincronizzazione in corso...", + "syncCta": "Sincronizza ora", + "syncFailed": "Sincronizzazione fallita", + "flagDisabled": "Radar è disabilitato", + "activationFailed": "Attivazione fallita", + "feedVersion": "Versione del feed", + "feedTier": "Livello", + "feedFetched": "Ultimo recupero", + "tierLive": "Live (in tempo reale)", + "tierCommunity": "Comunità (ritardo di 30 giorni)", + "activateTitle": "Attiva Radar", + "activateDescription": "Radar arricchisce il catalogo di modelli gratuito con intelligenza fornita dalla comunità — disponibilità dei modelli aggiornati, quote e guide di configurazione.", + "privacyNoUpload": "Nulla è caricato — i tuoi dati rimangono locali", + "privacyOnlySigned": "Solo i metadati firmati crittograficamente vengono scaricati", + "privacyLocalOnly": "Tutto l'elaborazione avviene sulla tua istanza OmniRoute", + "activateButton": "Attiva", + "activating": "Attivazione in corso...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Fornitore", + "colModel": "Modello", + "colQuota": "Quota", + "colContext": "Contesto", + "colCapabilities": "Capacità", + "colTos": "Rischio ToS", + "newBadge": "nuovo", + "setupGuide": "Guida alla configurazione", + "disabledByFeed": "Disabilitato dal feed Radar", + "capTools": "Strumenti", + "capVision": "Visione", + "capThinking": "Pensiero", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Configurazione del fornitore", + "setupTitle": "Configurazione: {provider}", + "setupSubtitle": "Segui i passaggi qui sotto per configurare questo fornitore", + "loading": "Caricamento...", + "loadFailed": "Impossibile caricare i dati di configurazione", + "flagDisabled": "Radar è disabilitato", + "providerNotFound": "Fornitore \"{provider}\" non trovato nel catalogo", + "noProvider": "Nessun fornitore specificato. Torna al catalogo e seleziona un fornitore.", + "backToCatalog": "Torna al catalogo", + "providerConfigured": "Il fornitore è configurato e pronto", + "getApiKey": "Ottieni la tua chiave API", + "setupSteps": "Passaggi di configurazione", + "noGuide": "Nessuna guida alla configurazione disponibile per questo fornitore.", + "visitDocs": "Visita la documentazione del fornitore", + "testConnection": "Testa la connessione", + "testDescription": "Verifica che la tua connessione funzioni correttamente.", + "testButton": "Testa la connessione", + "testing": "Test in corso...", + "testSuccess": "Connessione riuscita!", + "testFailed": "Test di connessione fallito", + "addConnection": "Aggiungi connessione", + "addConnectionDescription": "Non hai ancora una connessione? Aggiungine una nel dashboard dei fornitori.", + "addConnectionLink": "Vai ai fornitori →" + } } diff --git a/src/i18n/messages/ja.json b/src/i18n/messages/ja.json index 5e276e9c22..a9e11214a4 100644 --- a/src/i18n/messages/ja.json +++ b/src/i18n/messages/ja.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "常に表示", "groupSeparatorLabel": "セパレーター", "discovery": "ディスカバリー", - "discoverySubtitle": "無料アクセス対象のプロバイダーをスキャン" + "discoverySubtitle": "無料アクセス対象のプロバイダーをスキャン", + "radar": "レーダーカタログ", + "radarSubtitle": "コミュニティで強化された無料モデルカタログ" }, "webhooks": { "title": "Webhook", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "パートナーリンク", "dismissAriaLabel": "閉じる" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "レーダーカタログ", + "subtitle": "コミュニティインテリジェンスで強化された無料モデルカタログ", + "loading": "カタログを読み込んでいます...", + "errorLoading": "レーダーカタログの読み込みに失敗しました", + "emptyState": "カタログデータはまだありません。最新のフィードをダウンロードするには同期してください。", + "syncNow": "今すぐ同期", + "syncing": "同期中...", + "syncCta": "今すぐ同期", + "syncFailed": "同期に失敗しました", + "flagDisabled": "レーダーは無効です", + "activationFailed": "アクティベーションに失敗しました", + "feedVersion": "フィードバージョン", + "feedTier": "ティア", + "feedFetched": "最後に取得した", + "tierLive": "ライブ(リアルタイム)", + "tierCommunity": "コミュニティ(30日遅延)", + "activateTitle": "レーダーをアクティブにする", + "activateDescription": "レーダーは、コミュニティからのインテリジェンスで無料モデルカタログを強化します — 更新されたモデルの可用性、クォータ、およびセットアップガイド。", + "privacyNoUpload": "何もアップロードされていません — あなたのデータはローカルに留まります", + "privacyOnlySigned": "暗号的に署名されたメタデータのみがダウンロードされます", + "privacyLocalOnly": "すべての処理はあなたのOmniRouteインスタンスで行われます", + "activateButton": "アクティブにする", + "activating": "アクティブにしています...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "プロバイダー", + "colModel": "モデル", + "colQuota": "クォータ", + "colContext": "コンテキスト", + "colCapabilities": "機能", + "colTos": "ToSリスク", + "newBadge": "新しい", + "setupGuide": "セットアップガイド", + "disabledByFeed": "レーダーフィードによって無効化されています", + "capTools": "ツール", + "capVision": "ビジョン", + "capThinking": "思考", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "プロバイダーセットアップ", + "setupTitle": "セットアップ: {provider}", + "setupSubtitle": "このプロバイダーを構成するための手順に従ってください", + "loading": "読み込み中...", + "loadFailed": "セットアップデータの読み込みに失敗しました", + "flagDisabled": "レーダーは無効です", + "providerNotFound": "カタログにプロバイダー \"{provider}\" が見つかりません", + "noProvider": "プロバイダーが指定されていません。カタログに戻ってプロバイダーを選択してください。", + "backToCatalog": "カタログに戻る", + "providerConfigured": "プロバイダーは構成され、準備が整いました", + "getApiKey": "APIキーを取得", + "setupSteps": "セットアップ手順", + "noGuide": "このプロバイダーのセットアップガイドは利用できません。", + "visitDocs": "プロバイダーのドキュメントを訪問", + "testConnection": "接続をテスト", + "testDescription": "接続が正しく動作していることを確認してください。", + "testButton": "接続をテスト", + "testing": "テスト中...", + "testSuccess": "接続成功!", + "testFailed": "接続テストに失敗しました", + "addConnection": "接続を追加", + "addConnectionDescription": "まだ接続がありませんか?プロバイダーダッシュボードで追加してください。", + "addConnectionLink": "プロバイダーに移動 →" + } } diff --git a/src/i18n/messages/ko.json b/src/i18n/messages/ko.json index a73ee76945..5629f8fe31 100644 --- a/src/i18n/messages/ko.json +++ b/src/i18n/messages/ko.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "항상 표시", "groupSeparatorLabel": "구분선", "discovery": "디스커버리", - "discoverySubtitle": "무료 액세스를 위한 제공자 스캔" + "discoverySubtitle": "무료 액세스를 위한 제공자 스캔", + "radar": "레이더 카탈로그", + "radarSubtitle": "커뮤니티로 강화된 무료 모델 카탈로그" }, "webhooks": { "title": "웹훅", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "파트너 링크", "dismissAriaLabel": "닫기" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "레이더 카탈로그", + "subtitle": "커뮤니티 인텔리전스로 강화된 무료 모델 카탈로그", + "loading": "카탈로그 로딩 중...", + "errorLoading": "레이더 카탈로그 로드 실패", + "emptyState": "아직 카탈로그 데이터가 없습니다. 최신 피드를 다운로드하려면 동기화하세요.", + "syncNow": "지금 동기화", + "syncing": "동기화 중...", + "syncCta": "지금 동기화", + "syncFailed": "동기화 실패", + "flagDisabled": "레이더가 비활성화되었습니다", + "activationFailed": "활성화 실패", + "feedVersion": "피드 버전", + "feedTier": "계층", + "feedFetched": "마지막 가져오기", + "tierLive": "실시간", + "tierCommunity": "커뮤니티 (30일 지연)", + "activateTitle": "레이더 활성화", + "activateDescription": "레이더는 커뮤니티 소스 인텔리전스로 무료 모델 카탈로그를 강화합니다 — 업데이트된 모델 가용성, 할당량 및 설정 가이드.", + "privacyNoUpload": "업로드된 내용이 없습니다 — 데이터는 로컬에 유지됩니다", + "privacyOnlySigned": "암호화된 서명 메타데이터만 다운로드됩니다", + "privacyLocalOnly": "모든 처리는 귀하의 OmniRoute 인스턴스에서 발생합니다", + "activateButton": "활성화", + "activating": "활성화 중...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "제공자", + "colModel": "모델", + "colQuota": "할당량", + "colContext": "컨텍스트", + "colCapabilities": "기능", + "colTos": "ToS 위험", + "newBadge": "새로 만들기", + "setupGuide": "설정 가이드", + "disabledByFeed": "레이더 피드에 의해 비활성화됨", + "capTools": "도구", + "capVision": "비전", + "capThinking": "사고", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "제공자 설정", + "setupTitle": "설정: {provider}", + "setupSubtitle": "이 제공자를 구성하려면 아래 단계를 따르세요", + "loading": "로딩 중...", + "loadFailed": "설정 데이터 로드 실패", + "flagDisabled": "레이더가 비활성화되었습니다", + "providerNotFound": "카탈로그에서 제공자 \"{provider}\"를 찾을 수 없습니다", + "noProvider": "제공자가 지정되지 않았습니다. 카탈로그로 돌아가서 제공자를 선택하세요.", + "backToCatalog": "카탈로그로 돌아가기", + "providerConfigured": "제공자가 구성되었으며 준비 완료", + "getApiKey": "API 키 받기", + "setupSteps": "설정 단계", + "noGuide": "이 제공자에 대한 설정 가이드가 없습니다.", + "visitDocs": "제공자 문서 방문", + "testConnection": "연결 테스트", + "testDescription": "연결이 올바르게 작동하는지 확인하세요.", + "testButton": "연결 테스트", + "testing": "테스트 중...", + "testSuccess": "연결 성공!", + "testFailed": "연결 테스트 실패", + "addConnection": "연결 추가", + "addConnectionDescription": "아직 연결이 없으신가요? 제공자 대시보드에서 추가하세요.", + "addConnectionLink": "제공자로 이동 →" + } } diff --git a/src/i18n/messages/mr.json b/src/i18n/messages/mr.json index dfd2e009b3..8a566c0949 100644 --- a/src/i18n/messages/mr.json +++ b/src/i18n/messages/mr.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "नेहमी दृश्यमान", "groupSeparatorLabel": "विभाजक", "discovery": "शोध", - "discoverySubtitle": "मोफत ॲक्सेससाठी प्रोव्हायडर्स स्कॅन करा" + "discoverySubtitle": "मोफत ॲक्सेससाठी प्रोव्हायडर्स स्कॅन करा", + "radar": "रडार कॅटलॉग", + "radarSubtitle": "समुदाय-समृद्ध मोफत मॉडेल कॅटलॉग" }, "webhooks": { "title": "वेबहुक", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "भागीदार लिंक", "dismissAriaLabel": "बंद करा" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "रडार कॅटलॉग", + "subtitle": "समुदाय बुद्धिमत्तेने समृद्ध मोफत मॉडेल कॅटलॉग", + "loading": "कॅटलॉग लोड करत आहे...", + "errorLoading": "रडार कॅटलॉग लोड करण्यात अयशस्वी", + "emptyState": "अद्याप कॅटलॉग डेटा नाही. नवीन फीड डाउनलोड करण्यासाठी समक्रमित करा.", + "syncNow": "आता समक्रमित करा", + "syncing": "समक्रमण करत आहे...", + "syncCta": "आता समक्रमित करा", + "syncFailed": "समक्रमण अयशस्वी", + "flagDisabled": "रडार अक्षम आहे", + "activationFailed": "सक्रियता अयशस्वी", + "feedVersion": "फीड आवृत्ती", + "feedTier": "स्तर", + "feedFetched": "शेवटचा घेतलेला", + "tierLive": "थेट (वास्तविक-वेळ)", + "tierCommunity": "समुदाय (30-दिवसांचा विलंब)", + "activateTitle": "रडार सक्रिय करा", + "activateDescription": "रडार मोफत मॉडेल कॅटलॉगला समुदाय-स्रोत बुद्धिमत्तेसह समृद्ध करतो - अद्ययावत मॉडेल उपलब्धता, कोटा, आणि सेटअप मार्गदर्शक.", + "privacyNoUpload": "काहीही अपलोड केलेले नाही - तुमचे डेटा स्थानिक राहते", + "privacyOnlySigned": "फक्त क्रिप्टोग्राफिकदृष्ट्या स्वाक्षरी केलेले मेटाडेटा डाउनलोड केले जाते", + "privacyLocalOnly": "सर्व प्रक्रिया तुमच्या OmniRoute उदाहरणावर होते", + "activateButton": "सक्रिय करा", + "activating": "सक्रिय करत आहे...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "प्रदाता", + "colModel": "मॉडेल", + "colQuota": "कोटा", + "colContext": "संदर्भ", + "colCapabilities": "क्षमता", + "colTos": "ToS धोका", + "newBadge": "नवीन", + "setupGuide": "सेटअप मार्गदर्शक", + "disabledByFeed": "रडार फीडद्वारे अक्षम", + "capTools": "साधने", + "capVision": "दृष्टिकोन", + "capThinking": "विचार", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "प्रदाता सेटअप", + "setupTitle": "सेटअप: {provider}", + "setupSubtitle": "या प्रदात्याचे कॉन्फिगर करण्यासाठी खालील चरणांचे पालन करा", + "loading": "लोड करत आहे...", + "loadFailed": "सेटअप डेटा लोड करण्यात अयशस्वी", + "flagDisabled": "रडार अक्षम आहे", + "providerNotFound": "कॅटलॉगमध्ये प्रदाता \"{provider}\" सापडला नाही", + "noProvider": "कोणताही प्रदाता निर्दिष्ट केलेला नाही. कॅटलॉगवर परत जा आणि प्रदाता निवडा.", + "backToCatalog": "कॅटलॉगवर परत", + "providerConfigured": "प्रदाता कॉन्फिगर केलेला आहे आणि तयार आहे", + "getApiKey": "तुमचा API की मिळवा", + "setupSteps": "सेटअप चरण", + "noGuide": "या प्रदात्यासाठी कोणताही सेटअप मार्गदर्शक उपलब्ध नाही.", + "visitDocs": "प्रदाता दस्तऐवज पहा", + "testConnection": "कनेक्शन चाचणी", + "testDescription": "तुमचे कनेक्शन योग्यरित्या कार्यरत आहे का ते सत्यापित करा.", + "testButton": "कनेक्शन चाचणी", + "testing": "चाचणी करत आहे...", + "testSuccess": "कनेक्शन यशस्वी!", + "testFailed": "कनेक्शन चाचणी अयशस्वी", + "addConnection": "कनेक्शन जोडा", + "addConnectionDescription": "अद्याप कनेक्शन नाही? प्रदाता डॅशबोर्डमध्ये एक जोडा.", + "addConnectionLink": "प्रदात्यांकडे जा →" + } } diff --git a/src/i18n/messages/ms.json b/src/i18n/messages/ms.json index 63dfe6b5c0..5bc9cefc53 100644 --- a/src/i18n/messages/ms.json +++ b/src/i18n/messages/ms.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Sentiasa kelihatan", "groupSeparatorLabel": "Pemisah", "discovery": "Penemuan", - "discoverySubtitle": "Imbas penyedia untuk akses percuma" + "discoverySubtitle": "Imbas penyedia untuk akses percuma", + "radar": "Katalog Radar", + "radarSubtitle": "Katalog model percuma yang diperkaya komuniti" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Pautan rakan kongsi", "dismissAriaLabel": "Tutup" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Katalog Radar", + "subtitle": "Katalog model percuma yang diperkaya dengan kecerdasan komuniti", + "loading": "Memuatkan katalog...", + "errorLoading": "Gagal memuatkan katalog Radar", + "emptyState": "Tiada data katalog lagi. Sinkronkan untuk memuat turun suapan terkini.", + "syncNow": "Sinkron sekarang", + "syncing": "Sedang menyinkronkan...", + "syncCta": "Sinkron sekarang", + "syncFailed": "Sinkron gagal", + "flagDisabled": "Radar dilumpuhkan", + "activationFailed": "Pengaktifan gagal", + "feedVersion": "Versi suapan", + "feedTier": "Tahap", + "feedFetched": "Terakhir diambil", + "tierLive": "Langsung (masa nyata)", + "tierCommunity": "Komuniti (kelewatan 30 hari)", + "activateTitle": "Aktifkan Radar", + "activateDescription": "Radar memperkayakan katalog model percuma dengan kecerdasan yang diperoleh dari komuniti — ketersediaan model terkini, kuota, dan panduan penyediaan.", + "privacyNoUpload": "Tiada yang dimuat naik — data anda kekal tempatan", + "privacyOnlySigned": "Hanya metadata yang ditandatangani secara kriptografi yang dimuat turun", + "privacyLocalOnly": "Semua pemprosesan berlaku pada instance OmniRoute anda", + "activateButton": "Aktifkan", + "activating": "Mengaktifkan...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Penyedia", + "colModel": "Model", + "colQuota": "Kuota", + "colContext": "Konteks", + "colCapabilities": "Kebolehan", + "colTos": "Risiko ToS", + "newBadge": "baru", + "setupGuide": "Panduan penyediaan", + "disabledByFeed": "Dilumpuhkan oleh suapan Radar", + "capTools": "Alat", + "capVision": "Visi", + "capThinking": "Berfikir", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Penyediaan Penyedia", + "setupTitle": "Penyediaan: {provider}", + "setupSubtitle": "Ikuti langkah-langkah di bawah untuk mengkonfigurasi penyedia ini", + "loading": "Memuatkan...", + "loadFailed": "Gagal memuatkan data penyediaan", + "flagDisabled": "Radar dilumpuhkan", + "providerNotFound": "Penyedia \"{provider}\" tidak ditemui dalam katalog", + "noProvider": "Tiada penyedia yang ditentukan. Kembali ke katalog dan pilih penyedia.", + "backToCatalog": "Kembali ke katalog", + "providerConfigured": "Penyedia telah dikonfigurasi dan sedia", + "getApiKey": "Dapatkan kunci API anda", + "setupSteps": "Langkah penyediaan", + "noGuide": "Tiada panduan penyediaan tersedia untuk penyedia ini.", + "visitDocs": "Lawati dokumen penyedia", + "testConnection": "Uji sambungan", + "testDescription": "Sahkan bahawa sambungan anda berfungsi dengan betul.", + "testButton": "Uji sambungan", + "testing": "Menguji...", + "testSuccess": "Sambungan berjaya!", + "testFailed": "Ujian sambungan gagal", + "addConnection": "Tambah sambungan", + "addConnectionDescription": "Belum mempunyai sambungan? Tambah satu di papan pemuka penyedia.", + "addConnectionLink": "Pergi ke penyedia →" + } } diff --git a/src/i18n/messages/nl.json b/src/i18n/messages/nl.json index c31d7238e4..74be8313b2 100644 --- a/src/i18n/messages/nl.json +++ b/src/i18n/messages/nl.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Altijd zichtbaar", "groupSeparatorLabel": "Scheidingslijn", "discovery": "Detectie", - "discoverySubtitle": "Providers scannen op gratis toegang" + "discoverySubtitle": "Providers scannen op gratis toegang", + "radar": "Radar Catalogus", + "radarSubtitle": "Community-verrijkte gratis modelcatalogus" }, "webhooks": { "title": "Webhaken", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Partnerlink", "dismissAriaLabel": "Sluiten" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Catalogus", + "subtitle": "Gratis modelcatalogus verrijkt met community-intelligentie", + "loading": "Catalogus laden...", + "errorLoading": "Laden van Radar-catalogus mislukt", + "emptyState": "Nog geen catalogusgegevens. Synchroniseer om de laatste feed te downloaden.", + "syncNow": "Nu synchroniseren", + "syncing": "Synchroniseren...", + "syncCta": "Nu synchroniseren", + "syncFailed": "Synchronisatie mislukt", + "flagDisabled": "Radar is uitgeschakeld", + "activationFailed": "Activatie mislukt", + "feedVersion": "Feedversie", + "feedTier": "Niveau", + "feedFetched": "Laatst opgehaald", + "tierLive": "Live (real-time)", + "tierCommunity": "Community (30 dagen vertraging)", + "activateTitle": "Activeer Radar", + "activateDescription": "Radar verrijkt de gratis modelcatalogus met community-gebaseerde intelligentie — bijgewerkte modelbeschikbaarheid, quota en installatiehandleidingen.", + "privacyNoUpload": "Er is niets geüpload — uw gegevens blijven lokaal", + "privacyOnlySigned": "Alleen cryptografisch ondertekende metadata wordt gedownload", + "privacyLocalOnly": "Alle verwerking gebeurt op uw OmniRoute-instantie", + "activateButton": "Activeren", + "activating": "Activeren...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Leverancier", + "colModel": "Model", + "colQuota": "Quota", + "colContext": "Context", + "colCapabilities": "Capaciteiten", + "colTos": "ToS Risico", + "newBadge": "nieuw", + "setupGuide": "Installatiehandleiding", + "disabledByFeed": "Uitgeschakeld door Radar-feed", + "capTools": "Hulpmiddelen", + "capVision": "Visie", + "capThinking": "Denken", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Leverancier Configuratie", + "setupTitle": "Configuratie: {provider}", + "setupSubtitle": "Volg de onderstaande stappen om deze leverancier te configureren", + "loading": "Laden...", + "loadFailed": "Laden van configuratiegegevens mislukt", + "flagDisabled": "Radar is uitgeschakeld", + "providerNotFound": "Leverancier \"{provider}\" niet gevonden in catalogus", + "noProvider": "Geen leverancier opgegeven. Ga terug naar de catalogus en selecteer een leverancier.", + "backToCatalog": "Terug naar catalogus", + "providerConfigured": "Leverancier is geconfigureerd en klaar", + "getApiKey": "Verkrijg uw API-sleutel", + "setupSteps": "Installatiestappen", + "noGuide": "Geen installatiehandleiding beschikbaar voor deze leverancier.", + "visitDocs": "Bezoek leverancier documentatie", + "testConnection": "Test verbinding", + "testDescription": "Controleer of uw verbinding correct werkt.", + "testButton": "Test verbinding", + "testing": "Testen...", + "testSuccess": "Verbinding succesvol!", + "testFailed": "Verbindingstest mislukt", + "addConnection": "Voeg verbinding toe", + "addConnectionDescription": "Nog geen verbinding? Voeg er een toe in het leveranciersdashboard.", + "addConnectionLink": "Ga naar leveranciers →" + } } diff --git a/src/i18n/messages/no.json b/src/i18n/messages/no.json index 01da98d4d5..99d6f2b39c 100644 --- a/src/i18n/messages/no.json +++ b/src/i18n/messages/no.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Alltid synlig", "groupSeparatorLabel": "Skillelinje", "discovery": "Oppdagelse", - "discoverySubtitle": "Skann leverandører for gratis tilgang" + "discoverySubtitle": "Skann leverandører for gratis tilgang", + "radar": "Radar Katalog", + "radarSubtitle": "Fellesskapsberiket gratis modellkatalog" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Partnerlenke", "dismissAriaLabel": "Avvis" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Katalog", + "subtitle": "Gratis modellkatalog beriket med fellesskapsintelligens", + "loading": "Laster katalog...", + "errorLoading": "Kunne ikke laste Radar-katalog", + "emptyState": "Ingen katalogdata ennå. Synkroniser for å laste ned den nyeste strømmen.", + "syncNow": "Synkroniser nå", + "syncing": "Synkroniserer...", + "syncCta": "Synkroniser nå", + "syncFailed": "Synkronisering mislyktes", + "flagDisabled": "Radar er deaktivert", + "activationFailed": "Aktivering mislyktes", + "feedVersion": "Strømversjon", + "feedTier": "Nivå", + "feedFetched": "Sist hentet", + "tierLive": "Live (sanntid)", + "tierCommunity": "Fellesskap (30-dagers forsinkelse)", + "activateTitle": "Aktiver Radar", + "activateDescription": "Radar beriker den gratis modellkatalogen med fellesskapsbasert intelligens — oppdatert modelltilgjengelighet, kvoter og oppsettsveiledninger.", + "privacyNoUpload": "Ingenting er lastet opp — dataene dine forblir lokale", + "privacyOnlySigned": "Bare kryptografisk signert metadata lastes ned", + "privacyLocalOnly": "All behandling skjer på din OmniRoute-instans", + "activateButton": "Aktiver", + "activating": "Aktiverer...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Leverandør", + "colModel": "Modell", + "colQuota": "Kvote", + "colContext": "Kontekst", + "colCapabilities": "Muligheter", + "colTos": "ToS Risiko", + "newBadge": "ny", + "setupGuide": "Oppsettsveiledning", + "disabledByFeed": "Deaktivert av Radar-strøm", + "capTools": "Verktøy", + "capVision": "Visjon", + "capThinking": "Tenking", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Leverandøroppsett", + "setupTitle": "Oppsett: {provider}", + "setupSubtitle": "Følg trinnene nedenfor for å konfigurere denne leverandøren", + "loading": "Laster...", + "loadFailed": "Kunne ikke laste oppsettsdata", + "flagDisabled": "Radar er deaktivert", + "providerNotFound": "Leverandør \"{provider}\" ikke funnet i katalog", + "noProvider": "Ingen leverandør spesifisert. Gå tilbake til katalogen og velg en leverandør.", + "backToCatalog": "Tilbake til katalog", + "providerConfigured": "Leverandør er konfigurert og klar", + "getApiKey": "Få API-nøkkelen din", + "setupSteps": "Oppsettssteg", + "noGuide": "Ingen oppsettsveiledning tilgjengelig for denne leverandøren.", + "visitDocs": "Besøk leverandørdokumentasjon", + "testConnection": "Test tilkobling", + "testDescription": "Bekreft at tilkoblingen din fungerer korrekt.", + "testButton": "Test tilkobling", + "testing": "Tester...", + "testSuccess": "Tilkobling vellykket!", + "testFailed": "Tilkoblingstest mislyktes", + "addConnection": "Legg til tilkobling", + "addConnectionDescription": "Har du ikke en tilkobling ennå? Legg til en i leverandørdashbordet.", + "addConnectionLink": "Gå til leverandører →" + } } diff --git a/src/i18n/messages/phi.json b/src/i18n/messages/phi.json index e9d70b988e..52e88e96b8 100644 --- a/src/i18n/messages/phi.json +++ b/src/i18n/messages/phi.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Palaging nakikita", "groupSeparatorLabel": "Separator", "discovery": "Pagtuklas", - "discoverySubtitle": "I-scan ang mga provider para sa libreng access" + "discoverySubtitle": "I-scan ang mga provider para sa libreng access", + "radar": "Radar Catalog", + "radarSubtitle": "Community-enriched free model catalog" }, "webhooks": { "title": "Mga Webhook", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Link ng kasosyo", "dismissAriaLabel": "I-dismiss" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Catalog", + "subtitle": "Free model catalog enriched with community intelligence", + "loading": "Loading catalog...", + "errorLoading": "Failed to load Radar catalog", + "emptyState": "No catalog data yet. Sync to download the latest feed.", + "syncNow": "Sync now", + "syncing": "Syncing...", + "syncCta": "Sync now", + "syncFailed": "Sync failed", + "flagDisabled": "Radar is disabled", + "activationFailed": "Activation failed", + "feedVersion": "Feed version", + "feedTier": "Tier", + "feedFetched": "Last fetched", + "tierLive": "Live (real-time)", + "tierCommunity": "Community (30-day delay)", + "activateTitle": "Activate Radar", + "activateDescription": "Radar enriches the free model catalog with community-sourced intelligence — updated model availability, quotas, and setup guides.", + "privacyNoUpload": "Nothing is uploaded — your data stays local", + "privacyOnlySigned": "Only cryptographically signed metadata is downloaded", + "privacyLocalOnly": "All processing happens on your OmniRoute instance", + "activateButton": "Activate", + "activating": "Activating...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Provider", + "colModel": "Model", + "colQuota": "Quota", + "colContext": "Context", + "colCapabilities": "Capabilities", + "colTos": "ToS Risk", + "newBadge": "new", + "setupGuide": "Setup guide", + "disabledByFeed": "Disabled by Radar feed", + "capTools": "Tools", + "capVision": "Vision", + "capThinking": "Thinking", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Provider Setup", + "setupTitle": "Setup: {provider}", + "setupSubtitle": "Follow the steps below to configure this provider", + "loading": "Loading...", + "loadFailed": "Failed to load setup data", + "flagDisabled": "Radar is disabled", + "providerNotFound": "Provider \"{provider}\" not found in catalog", + "noProvider": "No provider specified. Return to the catalog and select a provider.", + "backToCatalog": "Back to catalog", + "providerConfigured": "Provider is configured and ready", + "getApiKey": "Get your API key", + "setupSteps": "Setup steps", + "noGuide": "No setup guide available for this provider.", + "visitDocs": "Visit provider docs", + "testConnection": "Test connection", + "testDescription": "Verify that your connection is working correctly.", + "testButton": "Test connection", + "testing": "Testing...", + "testSuccess": "Connection successful!", + "testFailed": "Connection test failed", + "addConnection": "Add connection", + "addConnectionDescription": "Don't have a connection yet? Add one in the providers dashboard.", + "addConnectionLink": "Go to providers →" + } } diff --git a/src/i18n/messages/pl.json b/src/i18n/messages/pl.json index 668f2f74de..919f1ea176 100644 --- a/src/i18n/messages/pl.json +++ b/src/i18n/messages/pl.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Zawsze widoczne", "groupSeparatorLabel": "Separator", "discovery": "Discovery", - "discoverySubtitle": "Skanowanie providers w celu wyszukania darmowego dostępu" + "discoverySubtitle": "Skanowanie providers w celu wyszukania darmowego dostępu", + "radar": "Katalog Radar", + "radarSubtitle": "Bezpłatny katalog modeli wzbogacony o społeczność" }, "webhooks": { "title": "Webhooks", @@ -12207,5 +12209,82 @@ "partnerLinkNote": "Link partnerski", "dismissAriaLabel": "Odrzuć" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Katalog Radar", + "subtitle": "Bezpłatny katalog modeli wzbogacony o inteligencję społeczności", + "loading": "Ładowanie katalogu...", + "errorLoading": "Nie udało się załadować katalogu Radar", + "emptyState": "Brak danych katalogu. Synchronizuj, aby pobrać najnowszy feed.", + "syncNow": "Synchronizuj teraz", + "syncing": "Synchronizacja...", + "syncCta": "Synchronizuj teraz", + "syncFailed": "Synchronizacja nie powiodła się", + "flagDisabled": "Radar jest wyłączony", + "activationFailed": "Aktywacja nie powiodła się", + "feedVersion": "Wersja feedu", + "feedTier": "Poziom", + "feedFetched": "Ostatnio pobrane", + "tierLive": "Na żywo (w czasie rzeczywistym)", + "tierCommunity": "Społeczność (opóźnienie 30 dni)", + "activateTitle": "Aktywuj Radar", + "activateDescription": "Radar wzbogaca bezpłatny katalog modeli o inteligencję pochodzącą ze społeczności — zaktualizowana dostępność modeli, kwoty i przewodniki konfiguracyjne.", + "privacyNoUpload": "Nic nie jest przesyłane — twoje dane pozostają lokalne", + "privacyOnlySigned": "Pobierane są tylko kryptograficznie podpisane metadane", + "privacyLocalOnly": "Wszystkie przetwarzanie odbywa się na twojej instancji OmniRoute", + "activateButton": "Aktywuj", + "activating": "Aktywacja...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Dostawca", + "colModel": "Model", + "colQuota": "Kwota", + "colContext": "Kontekst", + "colCapabilities": "Możliwości", + "colTos": "Ryzyko ToS", + "newBadge": "nowy", + "setupGuide": "Przewodnik konfiguracyjny", + "disabledByFeed": "Wyłączone przez feed Radar", + "capTools": "Narzędzia", + "capVision": "Wizja", + "capThinking": "Myślenie", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Konfiguracja dostawcy", + "setupTitle": "Konfiguracja: {provider}", + "setupSubtitle": "Postępuj zgodnie z poniższymi krokami, aby skonfigurować tego dostawcę", + "loading": "Ładowanie...", + "loadFailed": "Nie udało się załadować danych konfiguracyjnych", + "flagDisabled": "Radar jest wyłączony", + "providerNotFound": "Dostawca \"{provider}\" nie znaleziony w katalogu", + "noProvider": "Nie określono dostawcy. Wróć do katalogu i wybierz dostawcę.", + "backToCatalog": "Powrót do katalogu", + "providerConfigured": "Dostawca jest skonfigurowany i gotowy", + "getApiKey": "Pobierz swój klucz API", + "setupSteps": "Kroki konfiguracyjne", + "noGuide": "Brak dostępnego przewodnika konfiguracyjnego dla tego dostawcy.", + "visitDocs": "Odwiedź dokumentację dostawcy", + "testConnection": "Testuj połączenie", + "testDescription": "Sprawdź, czy twoje połączenie działa poprawnie.", + "testButton": "Testuj połączenie", + "testing": "Testowanie...", + "testSuccess": "Połączenie udane!", + "testFailed": "Test połączenia nie powiódł się", + "addConnection": "Dodaj połączenie", + "addConnectionDescription": "Nie masz jeszcze połączenia? Dodaj je w panelu dostawców.", + "addConnectionLink": "Przejdź do dostawców →" + } } diff --git a/src/i18n/messages/pt-BR.json b/src/i18n/messages/pt-BR.json index 137de125b2..85c4b9ad67 100644 --- a/src/i18n/messages/pt-BR.json +++ b/src/i18n/messages/pt-BR.json @@ -1094,6 +1094,8 @@ "costsFreeTiersSubtitle": "Cotas mensais de tokens gratuitos", "freeProviderRankings": "Rankings de provedores gratuitos", "freeProviderRankingsSubtitle": "Melhores provedores gratuitos classificados por pontuações ELO do modelo", + "radar": "Catálogo Radar", + "radarSubtitle": "Catálogo de modelos gratuitos enriquecido pela comunidade", "costsQuotaShare": "Compartilhamento de Cota", "costsPricing": "Pricing", "logsProxy": "Proxy Logs", @@ -5069,6 +5071,8 @@ "noNewModelsAddedExisting": "Nenhum novo modelo foi adicionado (todos já existem).", "importDoneCount": "✓ Concluído! {count, plural, one {# modelo importado.} other {# modelos importados.}}", "unexpectedErrorOccurred": "Ocorreu um erro inesperado", + "getApiKey": "Obter chave de API", + "getApiKeyDescription": "Registre-se ou inscreva-se para obter uma chave de API", "connectionCountLabel": "{count, plural, one {# conexão} other {# conexões}}", "messagesPath": "messages", "responsesPath": "responses", @@ -5473,6 +5477,13 @@ "newApiUserIdLabel": "ID de Usuário New-API", "newApiUserIdPlaceholder": "ex.: 12345", "newApiUserIdHint": "Valor do cabeçalho New-Api-User do AgentRouter, usado junto com a chave de API do console para consultar o saldo de cota.", + "newApiAggregatorToggleLabel": "Gateway agregador", + "newApiAggregatorToggleHint": "Ativa a detecção de saldo para nós agregadores New-API / One-API / Sub2API. O painel passa a mostrar o selo de saldo e o roteamento com quota-preflight pula contas esgotadas.", + "newApiAggregatorConsoleApiKeyHint": "System Access Token para o endpoint /api/user/self do agregador. Não é a chave de API de roteamento.", + "newApiAggregatorUserIdHint": "Valor do cabeçalho New-Api-User usado para buscar o saldo de quota do usuário do agregador.", + "newApiAggregatorQuotaPerUnitLabel": "Quota por unidade", + "newApiAggregatorQuotaPerUnitHint": "Unidades de crédito New-API por US$ 1 (padrão: 500000). Substitua se o seu agregador usar outra taxa.", + "featureFlagNewApiAggregatorBalanceDescription": "Ativa a detecção de saldo para nós compatíveis New-API / One-API / Sub2API", "cpaModeDisabledTitle": "Habilitar backend CLIProxyAPI para emulação OAuth mais profunda do Claude Code", "cpaModeEnabledTitle": "Usando CLIProxyAPI para uma emulação mais profunda do Claude Code (uTLS, multi-conta, perfis de dispositivo)", "customUserAgentHint": "Override opcional enviado upstream como cabeçalho User-Agent desta conexão.", @@ -5588,6 +5599,7 @@ "tagGroupPlaceholder": "ex.: personal, work, team-a", "testModel": "Test Model", "testingModel": "Testing Model", + "modelTestQuotaTooltip": "Quota esgotada — reseta amanhã ou precisa de recarga", "toggleOffShort": "OFF", "toggleOnShort": "ON", "tokenExpiredBadge": "Expirado", @@ -5953,7 +5965,8 @@ "kimi-coding": "Conecte o Kimi Coding com o fluxo OAuth existente.", "kiro": "Nível gratuito: 50 créditos/mês (~25K–100K tokens). ⚠️ Os Termos de Serviço (ToS) do Kiro proíbem o uso de proxy/harness de terceiros.", "codex": "Conecte o OpenAI Codex com o fluxo OAuth existente.", - "qwen": "Conecte o Qwen Code com o fluxo OAuth existente." + "qwen": "Conecte o Qwen Code com o fluxo OAuth existente.", + "unorouter": "Crie uma chave de API em https://unorouter.ai e cole aqui como Bearer token." }, "passthroughModelsDescription": "{provider} aceita IDs de modelo nativos do provedor. Importe de /models ou adicione IDs personalizados para roteamento.", "bedrockModelsDescription": "Os modelos Amazon Bedrock têm escopo definido por região da AWS. Importe de /models ou adicione IDs de modelo Bedrock habilitados na região selecionada.", @@ -10848,7 +10861,9 @@ "goNow": "Ir agora", "message": "O MITM Proxy agora vive no AgentBridge.", "title": "Esta página foi movida" - } + }, + "noMappingsDesc": "Nenhum mapeamento de modelo configurado ainda. Adicione mapeamentos para rotear as requisições do agente pelo OmniRoute.", + "addMapping": "Adicionar mapeamento" }, "providerStats": { "unknownError": "Erro desconhecido", @@ -11524,7 +11539,10 @@ "noSavedProxiesError": "Nenhum proxy salvo encontrado. Adicione proxies em Configurações → Proxy primeiro.", "updateProviderFailed": "Falha ao atualizar provedor", "providerEnabled": "{provider} ativado", - "providerDisabled": "{provider} desativado" + "providerDisabled": "{provider} desativado", + "providerAdded": "{provider} adicionado", + "add": "Adicionar", + "manualApiKey": "Usar uma chave de API manual" }, "gamification": { "leaderboardScopes": { @@ -12220,5 +12238,82 @@ "partnerLinkNote": "Link de parceiro", "dismissAriaLabel": "Descartar" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Catálogo Radar", + "subtitle": "Catálogo de modelos gratuitos enriquecido com inteligência comunitária", + "loading": "Carregando catálogo...", + "errorLoading": "Falha ao carregar catálogo Radar", + "emptyState": "Sem dados no catálogo ainda. Sincronize para baixar o feed mais recente.", + "syncNow": "Sincronizar agora", + "syncing": "Sincronizando...", + "syncCta": "Sincronizar agora", + "syncFailed": "Falha na sincronização", + "flagDisabled": "Radar está desativado", + "activationFailed": "Falha na ativação", + "feedVersion": "Versão do feed", + "feedTier": "Nível", + "feedFetched": "Última busca", + "tierLive": "Ao vivo (tempo real)", + "tierCommunity": "Comunidade (atraso de 30 dias)", + "activateTitle": "Ativar Radar", + "activateDescription": "O Radar enriquece o catálogo de modelos gratuitos com inteligência de fontes comunitárias — disponibilidade de modelos atualizada, cotas e guias de configuração.", + "privacyNoUpload": "Nada é enviado — seus dados ficam locais", + "privacyOnlySigned": "Apenas metadados criptograficamente assinados são baixados", + "privacyLocalOnly": "Todo processamento acontece na sua instância OmniRoute", + "activateButton": "Ativar", + "activating": "Ativando...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Provedor", + "colModel": "Modelo", + "colQuota": "Cota", + "colContext": "Contexto", + "colCapabilities": "Capacidades", + "colTos": "Risco ToS", + "newBadge": "novo", + "setupGuide": "Guia de configuração", + "disabledByFeed": "Desativado pelo feed Radar", + "capTools": "Ferramentas", + "capVision": "Visão", + "capThinking": "Raciocínio", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Configuração do Provedor", + "setupTitle": "Configuração: {provider}", + "setupSubtitle": "Siga os passos abaixo para configurar este provedor", + "loading": "Carregando...", + "loadFailed": "Falha ao carregar dados de configuração", + "flagDisabled": "Radar está desativado", + "providerNotFound": "Provedor \"{provider}\" não encontrado no catálogo", + "noProvider": "Nenhum provedor especificado. Volte ao catálogo e selecione um provedor.", + "backToCatalog": "Voltar ao catálogo", + "providerConfigured": "Provedor configurado e pronto", + "getApiKey": "Obtenha sua chave de API", + "setupSteps": "Passos de configuração", + "noGuide": "Nenhum guia de configuração disponível para este provedor.", + "visitDocs": "Visitar documentação do provedor", + "testConnection": "Testar conexão", + "testDescription": "Verifique se sua conexão está funcionando corretamente.", + "testButton": "Testar conexão", + "testing": "Testando...", + "testSuccess": "Conexão bem-sucedida!", + "testFailed": "Falha no teste de conexão", + "addConnection": "Adicionar conexão", + "addConnectionDescription": "Ainda não tem uma conexão? Adicione uma no painel de provedores.", + "addConnectionLink": "Ir para provedores →" + } } diff --git a/src/i18n/messages/pt.json b/src/i18n/messages/pt.json index 89b93d397d..a8433114e9 100644 --- a/src/i18n/messages/pt.json +++ b/src/i18n/messages/pt.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Sempre visível", "groupSeparatorLabel": "Separador", "discovery": "Descoberta", - "discoverySubtitle": "Analisar fornecedores para acesso gratuito" + "discoverySubtitle": "Analisar fornecedores para acesso gratuito", + "radar": "Catálogo Radar", + "radarSubtitle": "Catálogo de modelos gratuito enriquecido pela comunidade" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Link de parceiro", "dismissAriaLabel": "Dispensar" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Catálogo Radar", + "subtitle": "Catálogo de modelos gratuito enriquecido com inteligência da comunidade", + "loading": "A carregar catálogo...", + "errorLoading": "Falha ao carregar o catálogo Radar", + "emptyState": "Sem dados de catálogo ainda. Sincronize para descarregar o feed mais recente.", + "syncNow": "Sincronizar agora", + "syncing": "A sincronizar...", + "syncCta": "Sincronizar agora", + "syncFailed": "Sincronização falhou", + "flagDisabled": "Radar está desativado", + "activationFailed": "Ativação falhou", + "feedVersion": "Versão do feed", + "feedTier": "Nível", + "feedFetched": "Última busca", + "tierLive": "Ao vivo (em tempo real)", + "tierCommunity": "Comunidade (atraso de 30 dias)", + "activateTitle": "Ativar Radar", + "activateDescription": "O Radar enriquece o catálogo de modelos gratuito com inteligência proveniente da comunidade — disponibilidade de modelos atualizada, quotas e guias de configuração.", + "privacyNoUpload": "Nada está carregado — os seus dados permanecem locais", + "privacyOnlySigned": "Apenas metadados assinados criptograficamente são descarregados", + "privacyLocalOnly": "Todo o processamento ocorre na sua instância OmniRoute", + "activateButton": "Ativar", + "activating": "A ativar...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Fornecedor", + "colModel": "Modelo", + "colQuota": "Quota", + "colContext": "Contexto", + "colCapabilities": "Capacidades", + "colTos": "Risco de ToS", + "newBadge": "novo", + "setupGuide": "Guia de configuração", + "disabledByFeed": "Desativado pelo feed do Radar", + "capTools": "Ferramentas", + "capVision": "Visão", + "capThinking": "Pensando", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Configuração do Fornecedor", + "setupTitle": "Configuração: {provider}", + "setupSubtitle": "Siga os passos abaixo para configurar este fornecedor", + "loading": "A carregar...", + "loadFailed": "Falha ao carregar dados de configuração", + "flagDisabled": "Radar está desativado", + "providerNotFound": "Fornecedor \"{provider}\" não encontrado no catálogo", + "noProvider": "Nenhum fornecedor especificado. Volte ao catálogo e selecione um fornecedor.", + "backToCatalog": "Voltar ao catálogo", + "providerConfigured": "Fornecedor está configurado e pronto", + "getApiKey": "Obtenha a sua chave de API", + "setupSteps": "Passos de configuração", + "noGuide": "Nenhum guia de configuração disponível para este fornecedor.", + "visitDocs": "Visite a documentação do fornecedor", + "testConnection": "Testar conexão", + "testDescription": "Verifique se a sua conexão está a funcionar corretamente.", + "testButton": "Testar conexão", + "testing": "A testar...", + "testSuccess": "Conexão bem-sucedida!", + "testFailed": "Teste de conexão falhou", + "addConnection": "Adicionar conexão", + "addConnectionDescription": "Não tem uma conexão ainda? Adicione uma no painel de fornecedores.", + "addConnectionLink": "Ir para fornecedores →" + } } diff --git a/src/i18n/messages/ro.json b/src/i18n/messages/ro.json index 78712f8ccd..8ffc2b5faa 100644 --- a/src/i18n/messages/ro.json +++ b/src/i18n/messages/ro.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Întotdeauna vizibil", "groupSeparatorLabel": "Separator", "discovery": "Descoperire", - "discoverySubtitle": "Scanează furnizorii pentru acces gratuit" + "discoverySubtitle": "Scanează furnizorii pentru acces gratuit", + "radar": "Catalog Radar", + "radarSubtitle": "Catalog gratuit de modele îmbogățit de comunitate" }, "webhooks": { "title": "Webhook-uri", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Link de partener", "dismissAriaLabel": "Închide" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Catalog Radar", + "subtitle": "Catalog gratuit de modele îmbogățit cu inteligență comunitară", + "loading": "Încărcare catalog...", + "errorLoading": "Eșec la încărcarea catalogului Radar", + "emptyState": "Nu există date în catalog încă. Sincronizați pentru a descărca cele mai recente informații.", + "syncNow": "Sincronizează acum", + "syncing": "Sincronizare...", + "syncCta": "Sincronizează acum", + "syncFailed": "Sincronizare eșuată", + "flagDisabled": "Radarul este dezactivat", + "activationFailed": "Activarea a eșuat", + "feedVersion": "Versiunea feed-ului", + "feedTier": "Nivel", + "feedFetched": "Ultima preluare", + "tierLive": "Live (în timp real)", + "tierCommunity": "Comunitate (întârziere de 30 de zile)", + "activateTitle": "Activează Radar", + "activateDescription": "Radarul îmbogățește catalogul gratuit de modele cu inteligență provenită din comunitate — disponibilitatea actualizată a modelelor, cotele și ghidurile de configurare.", + "privacyNoUpload": "Nimic nu este încărcat — datele tale rămân locale", + "privacyOnlySigned": "Numai metadatele semnate criptografic sunt descărcate", + "privacyLocalOnly": "Toate procesările au loc pe instanța ta OmniRoute", + "activateButton": "Activează", + "activating": "Activare...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Furnizor", + "colModel": "Model", + "colQuota": "Cotă", + "colContext": "Context", + "colCapabilities": "Capacități", + "colTos": "Riscul ToS", + "newBadge": "nou", + "setupGuide": "Ghid de configurare", + "disabledByFeed": "Dezactivat de feed-ul Radar", + "capTools": "Instrumente", + "capVision": "Viziune", + "capThinking": "Gândire", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Configurare Furnizor", + "setupTitle": "Configurare: {provider}", + "setupSubtitle": "Urmează pașii de mai jos pentru a configura acest furnizor", + "loading": "Încărcare...", + "loadFailed": "Eșec la încărcarea datelor de configurare", + "flagDisabled": "Radarul este dezactivat", + "providerNotFound": "Furnizorul \"{provider}\" nu a fost găsit în catalog", + "noProvider": "Niciun furnizor specificat. Întoarce-te la catalog și selectează un furnizor.", + "backToCatalog": "Înapoi la catalog", + "providerConfigured": "Furnizorul este configurat și gata", + "getApiKey": "Obține cheia ta API", + "setupSteps": "Pași de configurare", + "noGuide": "Nu există ghid de configurare disponibil pentru acest furnizor.", + "visitDocs": "Vizitează documentele furnizorului", + "testConnection": "Testează conexiunea", + "testDescription": "Verifică dacă conexiunea ta funcționează corect.", + "testButton": "Testează conexiunea", + "testing": "Testare...", + "testSuccess": "Conexiune reușită!", + "testFailed": "Testul de conexiune a eșuat", + "addConnection": "Adaugă conexiune", + "addConnectionDescription": "Nu ai o conexiune încă? Adaugă una în tabloul de bord al furnizorilor.", + "addConnectionLink": "Mergi la furnizori →" + } } diff --git a/src/i18n/messages/ru.json b/src/i18n/messages/ru.json index 9fd2a39bb4..d2d37004f1 100644 --- a/src/i18n/messages/ru.json +++ b/src/i18n/messages/ru.json @@ -937,7 +937,7 @@ "disabled": "Отключено", "featureFlagOmnirouteEmergencyFallbackDescription": "Перенаправлять запросы при исчерпании бюджета на резервный бесплатный провайдер/модель.", "featureFlagArenaEloSyncEnabledDescription": "Включить периодическую синхронизацию ELO из таблицы лидеров Arena AI для рейтинга интеллектуальности моделей.", - "featureFlagExposeCcDiscoveryAliasesDescription": "__MISSING__:Advertise claude/<provider>/<model> mirror ids on /v1/models so Claude Code gateway model discovery lists non-Claude models. Warning: doubles catalog entries for all clients when enabled globally.", + "featureFlagExposeCcDiscoveryAliasesDescription": "Публиковать claude/<провайдер>/<модель> зеркальные ID на /v1/models, чтобы Claude Code мог видеть не-Claude модели. Внимание: удваивает записи каталога для всех клиентов при глобальном включении.", "sidebar": { "home": "Главная", "dashboard": "Панель управления", @@ -1055,7 +1055,7 @@ "combosLive": "Combo Studio", "combosLiveSubtitle": "Каскад маршрутизации в реальном времени", "compressionStudio": "Compression Studio", - "compressionExclusions": "__MISSING__:Exclusions", + "compressionExclusions": "Исключения", "contextSettingsSubtitle": "Глобальные настройки по умолчанию", "contextHeadroomSubtitle": "Табличное уплотнение", "contextSessionDedupSubtitle": "Межходовая дедупликация", @@ -1066,7 +1066,7 @@ "contextUltraSubtitle": "Эвристическая обрезка", "contextOmniglyphSubtitle": "Контекст как изображения", "compressionStudioSubtitle": "Каскад движков в реальном времени", - "compressionExclusionsSubtitle": "__MISSING__:Per-model/endpoint bypass", + "compressionExclusionsSubtitle": "Обход для отдельных моделей/endpoint'ов", "chaosConfigSubtitle": "Мультимодельное параллельное выполнение", "routingSection": "Routing", "protocolsSection": "Protocols", @@ -1107,7 +1107,7 @@ "settingsSecurity": "Security", "settingsAccessTokens": "Токены доступа", "settingsFeatureFlags": "Флаги функций", - "settingsCache": "__MISSING__:Cache", + "settingsCache": "Кэш", "settingsAuthz": "Authz", "settingsRouting": "Routing", "settingsResilience": "Resilience", @@ -1164,7 +1164,7 @@ "logsSubtitle": "Application logs", "logsProxySubtitle": "Proxy traffic logs", "consoleLogsSubtitle": "Console output", - "logsTimelineSubtitle": "__MISSING__:Visual request timeline", + "logsTimelineSubtitle": "Визуальная временная шкала запросов", "logsActivitySubtitle": "User activity log", "healthSubtitle": "System health check", "costsPricingSubtitle": "Per-model pricing rules", @@ -1194,7 +1194,7 @@ "settingsSecuritySubtitle": "Auth and encryption", "settingsAccessTokensSubtitle": "Токены CLI с ограниченной областью видимости для удаленного режима", "settingsFeatureFlagsSubtitle": "Переключить возможности системы", - "settingsCacheSubtitle": "__MISSING__:Model catalog and response caching", + "settingsCacheSubtitle": "Кэш каталога моделей и ответов", "settingsSidebar": "Sidebar", "settingsSidebarSubtitle": "Customize sidebar layout", "settingsAuthzSubtitle": "Политика маршрутизации инвентаря и обхода", @@ -1230,7 +1230,9 @@ "alwaysVisible": "Всегда виден", "groupSeparatorLabel": "Разделитель", "discovery": "Обнаружение", - "discoverySubtitle": "Сканировать провайдеров на наличие бесплатного доступа" + "discoverySubtitle": "Сканировать провайдеров на наличие бесплатного доступа", + "radar": "Каталог Радар", + "radarSubtitle": "Бесплатный каталог моделей, обогащенный данными сообщества" }, "webhooks": { "title": "Вебхуки", @@ -1557,7 +1559,7 @@ "settingsGeneralDescription": "Storage, database, and general instance configuration", "settingsAppearanceDescription": "Theme, branding, and visual customization", "settingsAiDescription": "AI behaviors, thinking budgets, vision, and memory settings", - "settingsCacheDescription": "__MISSING__:TTL for model catalog cache entries", + "settingsCacheDescription": "TTL для записей кэша каталога моделей", "settingsSecurityDescription": "Authentication, authorization, and access control settings", "featureFlags": "Флаги функций", "featureFlagsDescription": "Возможности системы управления и экспериментальные возможности", @@ -1587,7 +1589,8 @@ "settingsAdvancedDescription": "Advanced payload rules, request limits, and proxy API settings", "mitmProxyDescription": "Configure MITM proxy settings for traffic inspection and debugging", "oneProxyDescription": "Configure 1Proxy settings for advanced proxy chaining", - "omniSkillsDescription": "Установите и управляйте песочными навыками для автоматизированного выполнения запросов и инструментов" + "omniSkillsDescription": "Установите и управляйте песочными навыками для автоматизированного выполнения запросов и инструментов", + "logo": "OmniRoute" }, "cloudSyncStatus": { "synced": "Синхронизировано", @@ -2498,7 +2501,13 @@ "sharedResult": "Общее", "overlapSummary": "{first} против {second}: {overlap} общего", "compareEmptyTitle": "Выберите провайдеров и введите запрос для сравнения", - "compareEmptyDescription": "Результаты будут показаны рядом друг с другом с указанием задержки, стоимости и совпадения URL" + "compareEmptyDescription": "Результаты будут показаны рядом друг с другом с указанием задержки, стоимости и совпадения URL", + "minChars": "Введите минимум {min} символа(ов)", + "agentId": "ID агента", + "agentName": "Имя агента", + "searchProviders": "Поиск провайдеров...", + "searchModels": "Поиск моделей...", + "searchEndpoints": "Поиск endpoint'ов..." }, "cliTools": { "title": "Инструменты интерфейса командной строки", @@ -2946,14 +2955,36 @@ "copilotReloadInstruction": "Затем перезапустите VS Code и укажите API-ключ в поле ввода.", "wireApiChatCompletions": "Завершения чата (/chat/completions)", "wireApiResponses": "API ответов (/responses)", - "ccDiscoveryInfoButton": "__MISSING__:How to enable discovery in Claude Code", - "ccDiscoveryInfoTooltip": "__MISSING__:Advertise non-Claude models under claude/<provider>/<model> mirror ids so Claude Code's gateway model discovery can list them. Doubles catalog entries for all clients when enabled globally.", - "ccDiscoveryInfoLink": "__MISSING__:Open Feature Flags", - "ccOnboardingTitle": "__MISSING__:settings.json for gateway model discovery", - "ccOnboardingCopy": "__MISSING__:Copy", - "ccOnboardingCopied": "__MISSING__:Copied", - "ccOnboardingKeyPlaceholder": "__MISSING__:", - "ccOnboardingWindowNote": "__MISSING__:Claude Code assumes a 200K context window for any model id it does not recognize. For a model with a different real window, add CLAUDE_CODE_AUTO_COMPACT_WINDOW just under it so auto-compaction does not fire too early." + "ccDiscoveryInfoButton": "Как включить обнаружение в Claude Code", + "ccDiscoveryInfoTooltip": "Публиковать не-Claude модели под зеркальными ID claude/<провайдер>/<модель>, чтобы Claude Code мог их обнаруживать. Удваивает записи каталога для всех клиентов при глобальном включении.", + "ccDiscoveryInfoLink": "Открыть Feature Flags", + "ccOnboardingTitle": "settings.json для обнаружения gateway моделей", + "ccOnboardingCopy": "Копировать", + "ccOnboardingCopied": "Скопировано", + "ccOnboardingKeyPlaceholder": "<ваш API ключ OmniRoute>", + "ccOnboardingWindowNote": "Claude Code предполагает окно контекста в 200K для любой незнакомой модели. Если у модели другой реальный размер окна, добавьте CLAUDE_CODE_AUTO_COMPACT_WINDOW прямо под ней, чтобы авто-компактизация не срабатывала слишком рано.", + "hermesRoleMcp": "MCP", + "hermesRoleMcpDesc": "Вызовы инструментов MCP сервера", + "hermesRoleTitleGeneration": "Генерация заголовков", + "hermesRoleTitleGenerationDesc": "Генерация заголовков сессий", + "hermesRoleMemoryQueryRewrite": "Перезапись поисковых запросов", + "hermesRoleMemoryQueryRewriteDesc": "Перезапись поисковых запросов памяти", + "hermesRoleTtsAudioTags": "TTS аудио-теги", + "hermesRoleTtsAudioTagsDesc": "Генерация TTS аудио-тегов", + "hermesRoleTriageSpecifier": "Спецификатор Triage", + "hermesRoleTriageSpecifierDesc": "Спецификация triage для задач и PR", + "hermesRoleKanbanDecomposer": "Декомпозитор Kanban", + "hermesRoleKanbanDecomposerDesc": "Декомпозиция задач Kanban", + "hermesRoleProfileDescriber": "Описатель профилей", + "hermesRoleProfileDescriberDesc": "Описание профиля пользователя", + "hermesRoleGoalJudge": "Судья целей", + "hermesRoleGoalJudgeDesc": "Оценка выполнения целей", + "hermesRoleCurator": "Куратор", + "hermesRoleCuratorDesc": "Курация навыков и памяти", + "hermesRoleMonitor": "Монитор", + "hermesRoleMonitorDesc": "Фоновое наблюдение", + "hermesRoleBackgroundReview": "Фоновое ревью", + "hermesRoleBackgroundReviewDesc": "Фоновое ревью кода" }, "combos": { "title": "Комбо", @@ -3597,7 +3628,13 @@ "noMatchingCostRows": "Нет подходящих строк затрат", "noMatchingCostRowsDescription": "Измените текст поиска, группировку или выбранное временное окно.", "showingCostRows": "Показано {shown} из {total} совпадающих строк.", - "showingTopCostRows": "Показано {shown} из {total} совпадающих строк (топ 50)." + "showingTopCostRows": "Показано {shown} из {total} совпадающих строк (топ 50).", + "spendRateComparisonTooltipHighSpend": "Аномальный скачок расхода: {rate} ({changePercent}% от нормы)", + "totalCostBreadcrumb": "Общая стоимость", + "providerCostShareBreadcrumb": "Доля провайдеров", + "providerSpendAnalysisBreadcrumb": "Анализ расходов", + "costByModelBreadcrumb": "По моделям", + "spendAnalysisBreadcrumb": "Анализ трат" }, "endpoint": { "title": "Конечная точка API", @@ -3704,7 +3741,7 @@ "modelsCount": "{count, plural, one {# модель} few {# модели} many {# моделей} other {# модели}}", "sectionTitle": "Интерфейс интеграции", "sectionDescription": "API, совместимые с OpenAI, и конечные точки операционных протоколов", - "tabApis": "__MISSING__:APIs", + "tabApis": "API", "tabProtocols": "Протоколы", "tabsAria": "Разделы конечной точки", "protocolsTitle": "Протоколы", @@ -3895,7 +3932,18 @@ "obsidianWebdavUrl": "URL WebDAV", "obsidianUsername": "Имя пользователя", "obsidianPassword": "Пароль", - "obsidianTailscaleHint": "Используйте IP-адрес Tailscale вместо localhost при подключении с мобильного устройства. Оба устройства должны находиться в одной сети Tailscale." + "obsidianTailscaleHint": "Используйте IP-адрес Tailscale вместо localhost при подключении с мобильного устройства. Оба устройства должны находиться в одной сети Tailscale.", + "settingsAudienceTtl": "TTL аудитории", + "settingsAudienceTtlDescription": "Как долго кэшировать соответствия audience → endpoint (в секундах)", + "settingsEndpointAudienceRefreshLimit": "Лимит обновления аудитории endpoint'а", + "settingsEndpointAudienceRefreshLimitDescription": "Максимальное количество переключений audience в минуту", + "settingsSourceHeader": "Заголовок источника", + "settingsSourceHeaderDescription": "HTTP заголовок, определяющий источник запроса (опционально)", + "apiManagementHelpTitle": "API к этому endpoint'у", + "apiManagementHelp": "Используйте эти заголовки и URL для подключения инструментов, таких как OpenCode, Cline, Continue и т.д.", + "apiManagementEndpointHint": "Пользовательский URL endpoint'а отображается перед авторизацией.", + "endpointMenuSaveAndContinue": "Сохранить и продолжить", + "sessionLimitReached": "Сессия достигла лимита" }, "endpoints": { "tabProxy": "Прокси конечных точек", @@ -5411,8 +5459,8 @@ "t3ChatWebCookieHint": "Откройте t3.chat → DevTools → Приложение → Локальное хранилище → https://t3.chat, скопируйте «convex-session-id». Затем откройте DevTools → Network и скопируйте полный заголовок Cookie из любого запроса в чате. Вставьте оба значения в поля ниже.", "t3ChatWebCookiePlaceholder": "выпуклый-session-id=abc123...", "grokWebCookieHint": "Grok Web Cookie Hint", - "blockClaudeExtraUsageDescription": "__MISSING__:When enabled, OmniRoute marks this Claude connection unavailable as soon as the usage API reports queued extra usage, so fallback switches to another connection instead of continuing on pay-as-you-go extra billing.", - "blockClaudeExtraUsageLabel": "__MISSING__:Block extra Claude usage", + "blockClaudeExtraUsageDescription": "При включении OmniRoute помечает это подключение Claude как недоступное, как только API использования сообщает о наличии платного доп. трафика, так что fallback переключается на другое подключение вместо продолжения работы с оплатой по факту.", + "blockClaudeExtraUsageLabel": "Блокировать доп. использование Claude", "disableCoolingDescription": "Пропускать временный кулдаун, чтобы это подключение оставалось доступным даже после устранимых ошибок (терминальные состояния, такие как banned/expired, по-прежнему применяются).", "disableCoolingLabel": "Отключить кулдаун для этого подключения", "bulkPasteAdded": "{count, plural, one {1 key added} other {# keys added}}", @@ -5591,13 +5639,13 @@ "importGrokAuth": "Импортировать авторизацию Grok Build", "zedImportTitle": "Импортировать из связки ключей Zed", "zedImportDescription": "Найти учетные данные провайдеров ИИ (OpenAI, Anthropic, Google, Mistral, xAI), сохраненные Zed IDE в связке ключей ОС, и импортировать их как подключения. На этом компьютере должна быть установлена Zed IDE.", - "zedImportButton": "__MISSING__:Import from Zed", - "zedImportFailed": "__MISSING__:Zed import failed", + "zedImportButton": "Импортировать из Zed", + "zedImportFailed": "Импорт из Zed не удался", "zedImportHint": "Zed Import Hint", "zedImportNetworkError": "Zed Import Network Error", "zedImportNone": "Zed Import None", - "zedImportSuccess": "__MISSING__:Imported {credentials} credential(s) from Zed for {providers} provider(s)", - "zedImporting": "__MISSING__:Importing…", + "zedImportSuccess": "Импортировано {credentials} учетная(ых) запись(ей) из Zed для {providers} провайдера(ов)", + "zedImporting": "Импортируется…", "zedNoCredentials": "В связке ключей не найдено учетных данных Zed", "zedUnsupportedCredentials": "Найдено {count} учетных записей в связке ключей, но ни одна не соответствует поддерживаемым провайдерам", "zedManualTitle": "Ручной импорт токена", @@ -5743,7 +5791,7 @@ "bailian-coding-plan": "Подключите Alibaba Coding Plan с помощью API-ключа.", "bedrock": "Нативная интеграция с Bedrock: для обнаружения моделей используются базовые модели Bedrock и профили вывода (inference profiles), а для чата — региональные API Bedrock Runtime Converse/ConverseStream.", "anthropic": "Подключите Anthropic с помощью API-ключа.", - "ant-ling": "__MISSING__:Register and create an API key at the Ant Ling API console (https://chat.ant-ling.com/open), then paste it here. OmniRoute routes chat traffic to https://api.ant-ling.com/v1/chat/completions; the provider is OpenAI-compatible and also exposes an Anthropic-compatible surface.", + "ant-ling": "Ant Ling — (ant-ling) — ML/AI платформа с фокусом на NLP", "api-airforce": "Получите API-ключ на https://panel.api.airforce — OpenAI-совместимая конечная точка по адресу https://api.airforce/v1", "arcee-ai": "Получите API-ключ на arcee.ai", "azure-ai": "Foundry использует интерфейс OpenAI v1 с именами развертываний в качестве моделей. OmniRoute нормализует корневые URL-адреса ресурсов до конечных точек v1 chat и /models.", @@ -5764,7 +5812,7 @@ "chutes": "Bearer API-ключ для совместимого с OpenAI шлюза Chutes.", "clarifai": "Clarifai предоставляет совместимый с OpenAI чат, ответы и /models по адресу /v2/ext/openai/v1. Для публичных моделей и моделей сообщества обычно требуется PAT; ключи с областью действия приложения работают только для ресурсов внутри этого приложения.", "cloudflare-ai": "Требуется API-токен И Account ID (можно найти на dash.cloudflare.com)", - "clova-studio": "__MISSING__:CLOVA Studio (HyperCLOVA X) is OpenAI-compatible on /v1/openai. OmniRoute probes /v1/openai/models and routes chat traffic to /v1/openai/chat/completions. Uses the current clovastudio.stream.ntruss.com host — the legacy clovastudio.apigw.ntruss.com endpoint is being deprecated.", + "clova-studio": "Clova Studio — (clova-studio) — Платформа AI от NAVER Cloud", "codestral": "Подключите Codestral с помощью API-ключа.", "cohere": "Пробный период: 1 000 API-запросов в месяц для тестирования, кредитная карта не требуется", "command-code": "Создайте или скопируйте API-ключ из Command Code, затем вставьте его сюда как Bearer-токен.", @@ -5809,9 +5857,9 @@ "watsonx": "Шлюз моделей watsonx предоставляет OpenAI-совместимые эндпоинты /chat/completions и /models по пути /ml/gateway/v1.", "ideogram": "Получите API-ключ на ideogram.ai/docs/api", "iflytek": "Получите API-ключ на console.xfyun.cn", - "inception": "__MISSING__:Inception Labs is OpenAI-compatible at https://api.inceptionlabs.ai/v1. mercury-2 is the first diffusion LLM (dLLM) in the catalog — 5-10x faster generation than comparable autoregressive models, with tool calling, json_mode, and structured outputs.", + "inception": "Inception — (inception) — Платформа AI с флагманскими моделями", "inference-net": "Бесплатный баланс $25 при регистрации, а также возможность получения исследовательских грантов", - "internlm": "__MISSING__:Free monthly quota ~1M input / 3M output tokens (~10 RPM)", + "internlm": "InternLM — (internlm) — Открытые языковые модели от Shanghai AI Lab", "jina-ai": "API-ключ Bearer для Jina AI rerank API.", "jina-reader": "Подключите Jina Reader с помощью API-ключа.", "kenari": "Kenari предоставляет OpenAI-совместимый эндпоинт генерации чата по адресу https://kenari.id/v1/chat/completions, а также актуальный каталог /v1/models, включающий Claude, GPT, DeepSeek, GLM, Kimi и другие модели. OmniRoute использует протокол OpenAI и выводит список моделей через сквозную передачу.", @@ -5858,7 +5906,7 @@ "perplexity": "Подключить Perplexity с помощью API-ключа.", "piapi": "Подключить PiAPI с помощью API-ключа.", "pioneer": "$75 бесплатных кредитов на использование — кредитная карта не требуется", - "plamo": "__MISSING__:PLaMo is OpenAI-compatible at https://api.platform.preferredai.jp/v1. Built by Preferred Networks and optimized for Japanese. Docs are primarily in Japanese.", + "plamo": "Plamo — (plamo) — Языковые модели для корейского языка", "poe": "Poe предоставляет совместимые с OpenAI чат и ответы на https://api.poe.com/v1, с аутентифицированной проверкой баланса на /usage/current_balance.", "pollinations": "Бесплатный уровень без ключа: openai, openai-fast, openai-large, qwen-coder, mistral, deepseek, grok, gemini-flash-lite-3.1, perplexity-fast, perplexity-reasoning. Для премиум-моделей (claude, gemini, midijourney) требуется API-ключ Pollinations с enter.pollinations.ai.", "publicai": "Требуется API-ключ — разовый кредит при регистрации, далее платно", @@ -5870,7 +5918,7 @@ "runwayml": "Генерация видео в Runway основана на задачах. OmniRoute отправляет задания text-to-video или image-to-video, опрашивает /v1/tasks/[id] и нормализует готовые видеовыходы обратно в ответ /v1/videos/generations, аналогичный OpenAI.", "sambanova": "$5 бесплатных кредитов при регистрации (срок действия 30 дней), кредитная карта не требуется", "sap": "Обнаружение моделей использует /v2/lm/scenarios/foundation-models/models на AI_API_URL. Запросы чата используют deploymentUrl/chat/completions и требуют AI-Resource-Group.", - "sarvam": "__MISSING__:Sarvam AI is OpenAI-compatible on /v1. OmniRoute probes /v1/models and routes chat traffic to /v1/chat/completions. Models are tuned for Indic languages.", + "sarvam": "Sarvam AI — (sarvam) — Индийские языковые AI модели", "scaleway": "1 млн бесплатных токенов для новых аккаунтов — соответствие EU/GDPR (Париж), Qwen3 235B и Llama 70B", "sensenova": "Получить API-ключ на platform.sensenova.cn", "siliconflow": "$1 бесплатных кредитов плюс постоянно бесплатные модели после подтверждения личности", @@ -5887,7 +5935,7 @@ "together": "Подключите Together AI с помощью API-ключа.", "tokenrouter": "TokenRouter предоставляет совместимую с OpenAI конечную точку генерации ответов чата по адресу https://api.tokenrouter.com/v1/chat/completions, а также рабочий каталог /v1/models. OmniRoute использует протокол OpenAI.", "topaz": "Подключите Topaz с помощью API-ключа.", - "typhoon": "__MISSING__:Typhoon is OpenAI-compatible on /v1. Built by SCB 10X (Thailand); typhoon-v2.5-30b-a3b-instruct is a thai-first, multilingual model.", + "typhoon": "Typhoon — (typhoon) — Тайские языковые модели", "udio": "Вставьте сессионный cookie из udio.com (авторизация Supabase)", "uncloseai": "Авторизация не требуется. API принимает любую непустую строку в качестве ключа для идентификации.", "upstage": "Подключите Upstage с помощью API-ключа.", @@ -5900,7 +5948,7 @@ "voyage-ai": "API-ключ Bearer для API эмбеддингов и ранжирования (rerank) Voyage AI.", "wafer": "API-ключ с https://wafer.ai", "wandb": "Подключите Weights & Biases Inference с помощью API-ключа.", - "writer": "__MISSING__:Writer Palmyra is OpenAI-compatible at https://api.writer.com/v1. palmyra-x5 offers a 1M-token context window.", + "writer": "Writer — (writer) — Полный стек AI для предприятий", "x5lab": "X5Lab предоставляет совместимую с OpenAI конечную точку генерации ответов чата по адресу https://api.x5lab.dev/v1/chat/completions, а также актуальный каталог /v1/models. OmniRoute использует протокол OpenAI и выводит список моделей через passthrough.", "xai": "Подключите xAI (Grok) с помощью API-ключа.", "xiaomi-mimo": "Подключите Xiaomi MiMo с помощью API-ключа.", @@ -5981,18 +6029,45 @@ "cheaperInferenceSupporterBadge": "Друг открытого кода", "cheaperInferenceSupporterTooltip": "Cheaper Inference поддерживает OmniRoute как друг открытого кода", "kimiPartnerLinkNote": "Партнерская ссылка — поддерживает OmniRoute без дополнительных затрат с вашей стороны", - "ccAliasSectionTitle": "__MISSING__:Expose in Claude Code (claude/…)", - "ccAliasSectionHint": "__MISSING__:Advertise this provider's models under claude/<provider>/<model> mirror ids so Claude Code's gateway model discovery can list them. Off by default — enabling this doubles catalog entries for all clients.", - "ccAliasProviderLevelLabel": "__MISSING__:Provider default", - "ccAliasModelOverridesLabel": "__MISSING__:Per-model overrides", - "ccAliasModelOverrideAriaLabel": "__MISSING__:Override for {modelId}", - "ccAliasStateInherit": "__MISSING__:Inherit", - "ccAliasStateOn": "__MISSING__:On", - "ccAliasStateOff": "__MISSING__:Off", - "ccAliasAddModelPlaceholder": "__MISSING__:Model id (e.g. gpt-4o)", - "ccAliasAddModelButton": "__MISSING__:Add override", - "ccAliasLoadError": "__MISSING__:Failed to load discovery-alias settings: {error}", - "ccAliasSaveError": "__MISSING__:Failed to save discovery-alias setting: {error}" + "ccAliasSectionTitle": "Зеркальные ID Claude Code", + "ccAliasSectionHint": "Эти зеркала публикуют не-Claude модели под ID claude/<провайдер>/<модель>, чтобы Claude Code gateway model discovery мог их перечислить.", + "ccAliasProviderLevelLabel": "Провайдер включён", + "ccAliasModelOverridesLabel": "Переопределения моделей", + "ccAliasModelOverrideAriaLabel": "Переопределение модели", + "ccAliasStateInherit": "Наследовать", + "ccAliasStateOn": "Вкл", + "ccAliasStateOff": "Выкл", + "ccAliasAddModelPlaceholder": "Добавить модель…", + "ccAliasAddModelButton": "Добавить", + "ccAliasLoadError": "Не удалось загрузить зеркальные ID Claude Code", + "ccAliasSaveError": "Не удалось сохранить зеркальные ID Claude Code", + "apiProtocolLabel": "Протокол API", + "apiProtocolDefault": "OpenAI-совместимый (по умолчанию)", + "apiProtocolHint": "Некоторые провайдеры публикуют одни и те же модели через несколько протоколов. Оставьте значение по умолчанию, если не требуется альтернатива.", + "apiSettingsDescription": "Настройки протокола API, аудитории и заголовка источника для этого провайдера", + "advancedTab": "Продвинутые", + "duplicateName": "Провайдер с именем \"{name}\" уже существует", + "shortcuts": "Быстрые ссылки", + "modelsCount": "{count} модель(ей)", + "showApiKey": "Показать API ключ", + "disableProviderAutoDiscovery": "Отключить автообнаружение провайдера", + "confirmRemove": "Удалить {name}?", + "openaiCompatibleNoKeyWarning": "OpenAI-совместимому провайдеру без API ключа не хватает заголовка Authorization. Некоторые функции (например, проверка подключения к модели) могут не работать.", + "llmProvider": "LLM провайдер", + "embeddingProvider": "Провайдер эмбеддингов", + "sttProvider": "STT провайдер", + "ttsProvider": "TTS провайдер", + "imageProvider": "Провайдер изображений", + "audioGenerationProvider": "Провайдер генерации аудио", + "videoGenerationProvider": "Провайдер генерации видео", + "providerCapabilities": "Возможности провайдера", + "capabilityHelpText": "Выберите, какие задачи может выполнять этот провайдер", + "copyBaseUrl": "Копировать базовый URL", + "dangerZoneTitle": "Зона опасности", + "dangerZoneDescription": "Необратимые и деструктивные действия", + "removeProviderButton": "Удалить провайдера", + "exportConfig": "Экспорт конфигурации", + "importProviderConfig": "Импорт конфигурации нового провайдера" }, "settings": { "title": "Настройки", @@ -6087,18 +6162,18 @@ "requestBodyLimitSaving": "Saving...", "requestBodyLimitSave": "Save", "requestBodyLimitCurrent": "Current: {value}", - "cacheConfigLoadFailed": "__MISSING__:Failed to load cache settings", - "cacheConfigSaveSuccess": "__MISSING__:Cache settings saved", - "cacheConfigSaveFailed": "__MISSING__:Failed to save cache settings", - "modelCatalogTtlWholeNumberError": "__MISSING__:Use a whole number", - "modelCatalogTtlMinimumError": "__MISSING__:Minimum is {min} ms", - "modelCatalogTtlMaximumError": "__MISSING__:Maximum is {max} ms", - "modelCatalogCacheTtl": "__MISSING__:Model Catalog Cache TTL", - "modelCatalogCacheTtlDescription": "__MISSING__:How long model catalog responses are cached before refreshing", - "modelCatalogCacheTtlLabel": "__MISSING__:Model catalog cache TTL in milliseconds", - "modelCatalogCacheTtlSaving": "__MISSING__:Saving...", - "modelCatalogCacheTtlSave": "__MISSING__:Save", - "modelCatalogCacheTtlCurrent": "__MISSING__:Current: {value} ms", + "cacheConfigLoadFailed": "Не удалось загрузить конфигурацию кэша", + "cacheConfigSaveSuccess": "Конфигурация кэша сохранена", + "cacheConfigSaveFailed": "Не удалось сохранить конфигурацию кэша", + "modelCatalogTtlWholeNumberError": "TTL должен быть целым числом", + "modelCatalogTtlMinimumError": "TTL должен быть больше 0", + "modelCatalogTtlMaximumError": "TTL не может быть больше 7 дней", + "modelCatalogCacheTtl": "TTL кэша каталога моделей", + "modelCatalogCacheTtlDescription": "Как долго кэшировать каталог моделей (в секундах)", + "modelCatalogCacheTtlLabel": "TTL кэша", + "modelCatalogCacheTtlSaving": "Сохранение…", + "modelCatalogCacheTtlSave": "Сохранить", + "modelCatalogCacheTtlCurrent": "Текущий TTL: {ttl} сек", "mitmProxy": "МИТМ-прокси", "pricing": "Цены", "storage": "Хранение", @@ -6752,7 +6827,7 @@ "howPricingWorks": "Как работает ценообразование", "cacheWrite": "Запись в кэш", "unsaved": "несохраненный", - "resetDefaults": "__MISSING__:Reset defaults", + "resetDefaults": "Сбросить настройки по умолчанию", "saveProvider": "Сохранить поставщика", "model": "Модель", "models": "модели", @@ -6932,13 +7007,13 @@ "compressionPreserveSystemNever": "Никогда", "compressionLiveZoneTitle": "Live Zone с выравниванием по кэшу", "compressionLiveZoneDesc": "Сохранять сжатый префикс диалога неизменным и обрабатывать только вновь добавленные элементы.", - "compressionExclusionsTitle": "__MISSING__:Compression Exclusions", - "compressionExclusionsDesc": "__MISSING__:Model ids or provider/model patterns that must never be compressed. `*` is the only wildcard (e.g. `openai/*`, `*embedding*`). A matching request passes through byte-identical — no compression engine runs.", - "compressionExclusionsPlaceholder": "__MISSING__:One pattern per line, e.g.\nopenai/text-embedding-3-large\nanthropic/*", - "compressionExclusionsSave": "__MISSING__:Save", - "compressionExclusionsSaved": "__MISSING__:Saved", - "compressionExclusionsCount": "__MISSING__:{count, plural, one {# exclusion} other {# exclusions}} configured", - "compressionExclusionsEmpty": "__MISSING__:No exclusions configured — every model/endpoint is eligible for compression (default behavior).", + "compressionExclusionsTitle": "Исключения сжатия", + "compressionExclusionsDesc": "Список endpoint'ов, для которых сжатие пропускается", + "compressionExclusionsPlaceholder": "напр. groq/*, claude-*", + "compressionExclusionsSave": "Save", + "compressionExclusionsSaved": "Saved", + "compressionExclusionsCount": "{count, plural, one {# exclusion} other {# exclusions}} configured", + "compressionExclusionsEmpty": "No exclusions configured — every model/endpoint is eligible for compression (default behavior).", "compressionCavemanConfig": "Caveman Engine Configuration", "compressionCavemanConfigDesc": "Fine-tune the rule-based compression engine", "compressionCavemanPanelHint": "Включение/выключение и уровень настраиваются на панели:", @@ -7590,7 +7665,16 @@ "enableCredentialRedaction": "Включить маскирование учетных данных", "enableCredentialRedactionDesc": "Очищает API-ключи, токены, приватные ключи и JWT из сообщений, вызовов инструментов и ответов.", "pricingAutoSyncDisabled": "Automatic Sync Disabled", - "pricingAutoSyncEnabled": "Automatic Sync Enabled" + "pricingAutoSyncEnabled": "Automatic Sync Enabled", + "dataPreferences": "Предпочтения данных", + "dataPreferencesDescription": "Параметры сбора данных и телеметрии", + "userAttributeLabel": "Атрибут пользователя", + "userAttributeTooltip": "Пользовательский атрибут, добавляемый к телеметрии (опционально)", + "userAttributePlaceholder": "env: имя хоста, группа A/B и т. д.", + "userAttributeApplied": "Применён: {value}", + "allowCrashReporting": "Разрешить отчёты о сбоях", + "crashReportingDescription": "Автоматически отправлять анонимные отчёты о сбоях для улучшения стабильности", + "recordNestedUsageSwitchFromMedian": "Переключить на медиану" }, "contextRtk": { "title": "RTK Engine", @@ -8854,7 +8938,16 @@ "updatedShort": "Обновлено", "lastRefreshed": "Последнее обновление", "providerQuota": "Квота Провайдера", - "providerQuotaHomeHint": "Живой статус по подключенным аккаунтам" + "providerQuotaHomeHint": "Живой статус по подключенным аккаунтам", + "tokensPerDay": "токенов/день", + "tokensPerMonth": "токенов/месяц", + "models": "модели", + "providers": "провайдеры", + "totalCostLabel": "Общая стоимость", + "totalTokensLabel": "Всего токенов", + "requestsLabel": "Запросы", + "costPerDay": "стоимость/день", + "costPerMonth": "стоимость/месяц" }, "modals": { "waitingAuth": "Ожидание авторизации", @@ -9673,7 +9766,10 @@ "minutesAgo": "{minutes}м назад", "hoursAgo": "{hours}ч назад", "daysAgo": "{days}д назад", - "entries": "Записи" + "entries": "Записи", + "breadcrumb": "Кэш", + "statsBreadcrumb": "Статистика", + "configBreadcrumb": "Конфигурация" }, "proxyConfigModal": { "levelGlobal": "Глобальный", @@ -9723,23 +9819,23 @@ "deviceCodeVerificationUrl": "URL-адрес подтверждения", "deviceCodeYourCode": "Ваш код", "deviceCodeWaiting": "Ожидание авторизации...", - "googleLoopbackTitle": "__MISSING__:Google sign-in can't complete from this address", - "googleLoopbackWhatHappens": "__MISSING__:Google only releases the authorization code once {redirectUri} is reachable from the browser that approves the sign-in. Here that address points at this computer, not at the OmniRoute server — so the consent screen hangs instead of redirecting, and there is no callback URL to copy.", - "googleLoopbackRecommended": "__MISSING__:Recommended — run this on your own computer, then paste the result below:", - "googleLoopbackHelperNote": "__MISSING__:It opens the Google consent locally (where 127.0.0.1 works) and prints a one-line omniroute-cred-v1.… blob. Paste that blob into the Step 2 field below — it accepts a credential blob as well as a callback URL.", - "googleLoopbackTunnelLabel": "__MISSING__:Or forward the dashboard port over SSH and reload OmniRoute through the tunnel:", - "googleLoopbackTunnelNote": "__MISSING__:Replace {userPlaceholder} with your SSH username, keep the terminal open, then open {localUrl} and connect again from there.", - "googleLoopbackHeadlessAlt": "__MISSING__:For fully headless use with no local callback at all, configure your own Google OAuth credentials plus a public base URL.", + "googleLoopbackTitle": "Google sign-in can't complete from this address", + "googleLoopbackWhatHappens": "Google only releases the authorization code once {redirectUri} is reachable from the browser that approves the sign-in. Here that address points at this computer, not at the OmniRoute server — so the consent screen hangs instead of redirecting, and there is no callback URL to copy.", + "googleLoopbackRecommended": "Recommended — run this on your own computer, then paste the result below:", + "googleLoopbackHelperNote": "It opens the Google consent locally (where 127.0.0.1 works) and prints a one-line omniroute-cred-v1.… blob. Paste that blob into the Step 2 field below — it accepts a credential blob as well as a callback URL.", + "googleLoopbackTunnelLabel": "Or forward the dashboard port over SSH and reload OmniRoute through the tunnel:", + "googleLoopbackTunnelNote": "Replace {userPlaceholder} with your SSH username, keep the terminal open, then open {localUrl} and connect again from there.", + "googleLoopbackHeadlessAlt": "For fully headless use with no local callback at all, configure your own Google OAuth credentials plus a public base URL.", "remoteAccessInfo": "Удаленный доступ. Поскольку вы получаете доступ к OmniRoute удаленно, после авторизации вы увидите страницу с ошибкой (localhost не найден). Это нормально — просто скопируйте полный URL-адрес из адресной строки браузера и вставьте его ниже.", - "loopbackMismatchTitle": "__MISSING__:Sign-in can't complete from this address", - "loopbackMismatchWhatHappened": "__MISSING__:What's happening", - "loopbackMismatchExplanation": "__MISSING__:After you approve the login, {providerName} always sends the browser back to {redirectUri}. That address points at the computer running this browser, not at the OmniRoute server — so the authorization code never reaches OmniRoute and the provider fails the sign-in without showing an error.", - "loopbackMismatchHowToFix": "__MISSING__:How to fix it", - "loopbackMismatchStep1": "__MISSING__:On this computer, open a terminal and start an SSH tunnel to the OmniRoute server:", - "loopbackMismatchStep1Note": "__MISSING__:Replace {userPlaceholder} with your SSH username. Keep this terminal open until the connection shows as active — both ports are needed: one serves the dashboard, the other receives the callback.", - "loopbackMismatchStep2": "__MISSING__:In this browser, reopen OmniRoute through the tunnel:", - "loopbackMismatchStep3": "__MISSING__:Then connect {providerName} again from the new tab. The callback now reaches the server and the login completes normally.", - "loopbackMismatchAlternative": "__MISSING__:No SSH access? If this provider offers a token import tab, connect with a token instead — that path doesn't use a loopback callback.", + "loopbackMismatchTitle": "Sign-in can't complete from this address", + "loopbackMismatchWhatHappened": "What's happening", + "loopbackMismatchExplanation": "After you approve the login, {providerName} always sends the browser back to {redirectUri}. That address points at the computer running this browser, not at the OmniRoute server — so the authorization code never reaches OmniRoute and the provider fails the sign-in without showing an error.", + "loopbackMismatchHowToFix": "How to fix it", + "loopbackMismatchStep1": "On this computer, open a terminal and start an SSH tunnel to the OmniRoute server:", + "loopbackMismatchStep1Note": "Replace {userPlaceholder} with your SSH username. Keep this terminal open until the connection shows as active — both ports are needed: one serves the dashboard, the other receives the callback.", + "loopbackMismatchStep2": "In this browser, reopen OmniRoute through the tunnel:", + "loopbackMismatchStep3": "Then connect {providerName} again from the new tab. The callback now reaches the server and the login completes normally.", + "loopbackMismatchAlternative": "No SSH access? If this provider offers a token import tab, connect with a token instead — that path doesn't use a loopback callback.", "step1OpenUrl": "Шаг 1. Откройте этот URL-адрес в своем браузере.", "copy": "Копировать", "step2PasteCallback": "Шаг 2. Вставьте сюда URL обратного вызова или код авторизации.", @@ -11326,7 +11422,7 @@ } }, "pageTitle": "Навыки агента", - "pageSubtitle": "__MISSING__:Teach your agent to operate OmniRoute — 23 API areas + 21 CLI families", + "pageSubtitle": "Teach your agent to operate OmniRoute — 23 API areas + 21 CLI families", "conceptCard": { "agent": { "title": "Навыки агента — Исходящие", @@ -11837,7 +11933,7 @@ "description": "Enable network access in the skills sandbox." } }, - "ccDiscoveryAliasesEnvWarning": "__MISSING__:Active via environment variable (EXPOSE_CC_DISCOVERY_ALIASES) — this overrides any dashboard toggle below." + "ccDiscoveryAliasesEnvWarning": "Active via environment variable (EXPOSE_CC_DISCOVERY_ALIASES) — this overrides any dashboard toggle below." }, "comboControl": { "title": "Combo Control Center", @@ -12185,5 +12281,82 @@ "partnerLinkNote": "Партнерская ссылка", "dismissAriaLabel": "Закрыть" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Каталог Радар", + "subtitle": "Бесплатный каталог моделей, обогащенный данными сообщества", + "loading": "Загрузка каталога...", + "errorLoading": "Не удалось загрузить каталог Радар", + "emptyState": "Данные каталога еще отсутствуют. Синхронизируйтесь, чтобы загрузить последнюю ленту.", + "syncNow": "Синхронизировать сейчас", + "syncing": "Синхронизация...", + "syncCta": "Синхронизировать сейчас", + "syncFailed": "Синхронизация не удалась", + "flagDisabled": "Радар отключен", + "activationFailed": "Не удалось активировать", + "feedVersion": "Версия ленты", + "feedTier": "Уровень", + "feedFetched": "Последнее получение", + "tierLive": "В реальном времени", + "tierCommunity": "Сообщество (задержка 30 дней)", + "activateTitle": "Активировать Радар", + "activateDescription": "Радар обогащает бесплатный каталог моделей данными, собранными сообществом — обновленная доступность моделей, квоты и руководства по настройке.", + "privacyNoUpload": "Ничего не загружено — ваши данные остаются локальными", + "privacyOnlySigned": "Загружается только криптографически подписанная метадата", + "privacyLocalOnly": "Все обработки происходят на вашем экземпляре OmniRoute", + "activateButton": "Активировать", + "activating": "Активация...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Провайдер", + "colModel": "Модель", + "colQuota": "Квота", + "colContext": "Контекст", + "colCapabilities": "Возможности", + "colTos": "Риск ToS", + "newBadge": "новый", + "setupGuide": "Руководство по настройке", + "disabledByFeed": "Отключено лентой Радар", + "capTools": "Инструменты", + "capVision": "Видение", + "capThinking": "Мыслительный процесс", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Настройка провайдера", + "setupTitle": "Настройка: {provider}", + "setupSubtitle": "Следуйте шагам ниже, чтобы настроить этого провайдера", + "loading": "Загрузка...", + "loadFailed": "Не удалось загрузить данные настройки", + "flagDisabled": "Радар отключен", + "providerNotFound": "Провайдер \"{provider}\" не найден в каталоге", + "noProvider": "Провайдер не указан. Вернитесь в каталог и выберите провайдера.", + "backToCatalog": "Назад в каталог", + "providerConfigured": "Провайдер настроен и готов", + "getApiKey": "Получите ваш API-ключ", + "setupSteps": "Шаги настройки", + "noGuide": "Руководство по настройке для этого провайдера недоступно.", + "visitDocs": "Посетите документацию провайдера", + "testConnection": "Протестировать соединение", + "testDescription": "Убедитесь, что ваше соединение работает правильно.", + "testButton": "Протестировать соединение", + "testing": "Тестирование...", + "testSuccess": "Соединение успешно!", + "testFailed": "Тест соединения не удался", + "addConnection": "Добавить соединение", + "addConnectionDescription": "У вас еще нет соединения? Добавьте его на панели провайдеров.", + "addConnectionLink": "Перейти к провайдерам →" + } } diff --git a/src/i18n/messages/sk.json b/src/i18n/messages/sk.json index 452278fb39..f27b22a0c6 100644 --- a/src/i18n/messages/sk.json +++ b/src/i18n/messages/sk.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Vždy viditeľné", "groupSeparatorLabel": "Oddeľovač", "discovery": "Zisťovanie", - "discoverySubtitle": "Skenovať poskytovateľov na bezplatný prístup" + "discoverySubtitle": "Skenovať poskytovateľov na bezplatný prístup", + "radar": "Radar katalóg", + "radarSubtitle": "Bezplatný modelový katalóg obohatený komunitou" }, "webhooks": { "title": "Webhooky", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Partnerský odkaz", "dismissAriaLabel": "Zavrieť" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar katalóg", + "subtitle": "Bezplatný modelový katalóg obohatený komunitnou inteligenciou", + "loading": "Načítavam katalóg...", + "errorLoading": "Nepodarilo sa načítať Radar katalóg", + "emptyState": "Zatiaľ nie sú k dispozícii žiadne údaje katalógu. Synchronizujte sa, aby ste stiahli najnovší príspevok.", + "syncNow": "Synchronizovať teraz", + "syncing": "Synchronizujem...", + "syncCta": "Synchronizovať teraz", + "syncFailed": "Synchronizácia zlyhala", + "flagDisabled": "Radar je deaktivovaný", + "activationFailed": "Aktivácia zlyhala", + "feedVersion": "Verzia príspevku", + "feedTier": "Úroveň", + "feedFetched": "Naposledy načítané", + "tierLive": "Naživo (v reálnom čase)", + "tierCommunity": "Komunita (30-dňové oneskorenie)", + "activateTitle": "Aktivovať Radar", + "activateDescription": "Radar obohacuje bezplatný modelový katalóg o komunitou získanú inteligenciu — aktualizovaná dostupnosť modelov, kvóty a návody na nastavenie.", + "privacyNoUpload": "Nič nie je nahrané — vaše údaje zostávajú lokálne", + "privacyOnlySigned": "Stiahnu sa iba kryptograficky podpísané metadáta", + "privacyLocalOnly": "Všetko spracovanie prebieha na vašej inštancii OmniRoute", + "activateButton": "Aktivovať", + "activating": "Aktivujem...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Poskytovateľ", + "colModel": "Model", + "colQuota": "Kvóta", + "colContext": "Kontext", + "colCapabilities": "Schopnosti", + "colTos": "Riziko zmluvných podmienok", + "newBadge": "nové", + "setupGuide": "Návod na nastavenie", + "disabledByFeed": "Deaktivované príspevkom Radar", + "capTools": "Nástroje", + "capVision": "Vízia", + "capThinking": "Premýšľanie", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Nastavenie poskytovateľa", + "setupTitle": "Nastavenie: {provider}", + "setupSubtitle": "Postupujte podľa krokov nižšie na konfiguráciu tohto poskytovateľa", + "loading": "Načítavam...", + "loadFailed": "Nepodarilo sa načítať údaje nastavenia", + "flagDisabled": "Radar je deaktivovaný", + "providerNotFound": "Poskytovateľ \"{provider}\" nebol nájdený v katalógu", + "noProvider": "Nebol špecifikovaný žiadny poskytovateľ. Vráťte sa do katalógu a vyberte poskytovateľa.", + "backToCatalog": "Späť do katalógu", + "providerConfigured": "Poskytovateľ je nakonfigurovaný a pripravený", + "getApiKey": "Získajte svoj API kľúč", + "setupSteps": "Kroky nastavenia", + "noGuide": "Pre tohto poskytovateľa nie je k dispozícii žiadny návod na nastavenie.", + "visitDocs": "Navštívte dokumentáciu poskytovateľa", + "testConnection": "Otestovať pripojenie", + "testDescription": "Overte, či vaše pripojenie funguje správne.", + "testButton": "Otestovať pripojenie", + "testing": "Testujem...", + "testSuccess": "Pripojenie úspešné!", + "testFailed": "Test pripojenia zlyhal", + "addConnection": "Pridať pripojenie", + "addConnectionDescription": "Ešte nemáte pripojenie? Pridajte jedno v ovládacom paneli poskytovateľov.", + "addConnectionLink": "Prejdite na poskytovateľov →" + } } diff --git a/src/i18n/messages/sv.json b/src/i18n/messages/sv.json index f3916bf45f..1bebb2b029 100644 --- a/src/i18n/messages/sv.json +++ b/src/i18n/messages/sv.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Alltid synlig", "groupSeparatorLabel": "Avskiljare", "discovery": "Upptäckt", - "discoverySubtitle": "Skanna leverantörer efter fri åtkomst" + "discoverySubtitle": "Skanna leverantörer efter fri åtkomst", + "radar": "Radar Katalog", + "radarSubtitle": "Gemenskapsberikad gratis modellkatalog" }, "webhooks": { "title": "Webhooks", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Partnerlänk", "dismissAriaLabel": "Avvisa" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Katalog", + "subtitle": "Gratis modellkatalog berikad med gemenskapsintelligens", + "loading": "Laddar katalog...", + "errorLoading": "Misslyckades med att ladda Radar-katalogen", + "emptyState": "Ingen katalogdata ännu. Synkronisera för att ladda ner den senaste flödet.", + "syncNow": "Synkronisera nu", + "syncing": "Synkroniserar...", + "syncCta": "Synkronisera nu", + "syncFailed": "Synkronisering misslyckades", + "flagDisabled": "Radar är inaktiverad", + "activationFailed": "Aktivering misslyckades", + "feedVersion": "Flödesversion", + "feedTier": "Nivå", + "feedFetched": "Senast hämtad", + "tierLive": "Live (i realtid)", + "tierCommunity": "Gemenskap (30-dagars fördröjning)", + "activateTitle": "Aktivera Radar", + "activateDescription": "Radar berikar den gratis modellkatalogen med gemenskapsbaserad intelligens — uppdaterad modelltillgänglighet, kvoter och installationsguider.", + "privacyNoUpload": "Inget är uppladdat — dina data förblir lokala", + "privacyOnlySigned": "Endast kryptografiskt signerad metadata laddas ner", + "privacyLocalOnly": "All bearbetning sker på din OmniRoute-instans", + "activateButton": "Aktivera", + "activating": "Aktiverar...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Leverantör", + "colModel": "Modell", + "colQuota": "Kvot", + "colContext": "Kontext", + "colCapabilities": "Funktioner", + "colTos": "ToS Risk", + "newBadge": "ny", + "setupGuide": "Installationsguide", + "disabledByFeed": "Inaktiverad av Radar-flödet", + "capTools": "Verktyg", + "capVision": "Vision", + "capThinking": "Tänkande", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Leverantörsinstallation", + "setupTitle": "Installation: {provider}", + "setupSubtitle": "Följ stegen nedan för att konfigurera denna leverantör", + "loading": "Laddar...", + "loadFailed": "Misslyckades med att ladda installationsdata", + "flagDisabled": "Radar är inaktiverad", + "providerNotFound": "Leverantör \"{provider}\" hittades inte i katalogen", + "noProvider": "Ingen leverantör angiven. Återgå till katalogen och välj en leverantör.", + "backToCatalog": "Tillbaka till katalog", + "providerConfigured": "Leverantören är konfigurerad och redo", + "getApiKey": "Få din API-nyckel", + "setupSteps": "Installationssteg", + "noGuide": "Ingen installationsguide tillgänglig för denna leverantör.", + "visitDocs": "Besök leverantörsdokumentation", + "testConnection": "Testa anslutning", + "testDescription": "Verifiera att din anslutning fungerar korrekt.", + "testButton": "Testa anslutning", + "testing": "Testar...", + "testSuccess": "Anslutning lyckades!", + "testFailed": "Anslutningstest misslyckades", + "addConnection": "Lägg till anslutning", + "addConnectionDescription": "Har du ingen anslutning ännu? Lägg till en i leverantörernas instrumentpanel.", + "addConnectionLink": "Gå till leverantörer →" + } } diff --git a/src/i18n/messages/sw.json b/src/i18n/messages/sw.json index 0479832096..134aaea826 100644 --- a/src/i18n/messages/sw.json +++ b/src/i18n/messages/sw.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Huonekana kila wakati", "groupSeparatorLabel": "Kigawanyishi", "discovery": "Ugunduzi", - "discoverySubtitle": "Changanua watoa huduma kwa ufikiaji wa bure" + "discoverySubtitle": "Changanua watoa huduma kwa ufikiaji wa bure", + "radar": "Radar Katalog", + "radarSubtitle": "Gemenskapsberikad gratis modellkatalog" }, "webhooks": { "title": "Viboko vya mtandao", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Kiungo cha mshirika", "dismissAriaLabel": "Ondoa" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Katalog", + "subtitle": "Gratis modellkatalog berikad med gemenskapsintelligens", + "loading": "Laddar katalog...", + "errorLoading": "Misslyckades med att ladda Radar-katalogen", + "emptyState": "Ingen katalogdata ännu. Synkronisera för att ladda ner den senaste flödet.", + "syncNow": "Synkronisera nu", + "syncing": "Synkroniserar...", + "syncCta": "Synkronisera nu", + "syncFailed": "Synkronisering misslyckades", + "flagDisabled": "Radar är inaktiverad", + "activationFailed": "Aktivering misslyckades", + "feedVersion": "Flödesversion", + "feedTier": "Nivå", + "feedFetched": "Senast hämtad", + "tierLive": "Live (i realtid)", + "tierCommunity": "Gemenskap (30-dagars fördröjning)", + "activateTitle": "Aktivera Radar", + "activateDescription": "Radar berikar den gratis modellkatalogen med gemenskapsbaserad intelligens — uppdaterad modell tillgänglighet, kvoter och installationsguider.", + "privacyNoUpload": "Inget är uppladdat — dina data förblir lokala", + "privacyOnlySigned": "Endast kryptografiskt signerad metadata laddas ner", + "privacyLocalOnly": "All bearbetning sker på din OmniRoute-instans", + "activateButton": "Aktivera", + "activating": "Aktiverar...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Leverantör", + "colModel": "Modell", + "colQuota": "Kvot", + "colContext": "Kontext", + "colCapabilities": "Funktioner", + "colTos": "ToS Risk", + "newBadge": "ny", + "setupGuide": "Installationsguide", + "disabledByFeed": "Inaktiverad av Radar-flödet", + "capTools": "Verktyg", + "capVision": "Vision", + "capThinking": "Tänkande", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Leverantörsinstallation", + "setupTitle": "Installation: {provider}", + "setupSubtitle": "Följ stegen nedan för att konfigurera denna leverantör", + "loading": "Laddar...", + "loadFailed": "Misslyckades med att ladda installationsdata", + "flagDisabled": "Radar är inaktiverad", + "providerNotFound": "Leverantör \"{provider}\" hittades inte i katalogen", + "noProvider": "Ingen leverantör angiven. Återgå till katalogen och välj en leverantör.", + "backToCatalog": "Tillbaka till katalog", + "providerConfigured": "Leverantören är konfigurerad och redo", + "getApiKey": "Få din API-nyckel", + "setupSteps": "Installationssteg", + "noGuide": "Ingen installationsguide tillgänglig för denna leverantör.", + "visitDocs": "Besök leverantörsdokumentation", + "testConnection": "Testa anslutning", + "testDescription": "Verifiera att din anslutning fungerar korrekt.", + "testButton": "Testa anslutning", + "testing": "Testar...", + "testSuccess": "Anslutning lyckades!", + "testFailed": "Anslutningstest misslyckades", + "addConnection": "Lägg till anslutning", + "addConnectionDescription": "Har du ingen anslutning ännu? Lägg till en i leverantörernas instrumentpanel.", + "addConnectionLink": "Gå till leverantörer →" + } } diff --git a/src/i18n/messages/ta.json b/src/i18n/messages/ta.json index 5331a3f1a2..101961d4f7 100644 --- a/src/i18n/messages/ta.json +++ b/src/i18n/messages/ta.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "எப்போதும் தெரியும்", "groupSeparatorLabel": "பிரிப்பான்", "discovery": "கண்டறிதல்", - "discoverySubtitle": "இலவச அணுகலுக்காக வழங்குநர்களை ஸ்கேன் செய்யவும்" + "discoverySubtitle": "இலவச அணுகலுக்காக வழங்குநர்களை ஸ்கேன் செய்யவும்", + "radar": "ரேடார் பட்டியல்", + "radarSubtitle": "சமூகமாக வளமான இலவச மாதிரி பட்டியல்" }, "webhooks": { "title": "வெப்ஹூக்ஸ்", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "பங்குதாரர் இணைப்பு", "dismissAriaLabel": "நிராகரி" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "ரேடார் பட்டியல்", + "subtitle": "சமூக அறிவியுடன் வளமான இலவச மாதிரி பட்டியல்", + "loading": "பட்டியலை ஏற்றுகிறது...", + "errorLoading": "ரேடார் பட்டியலை ஏற்றுவதில் தோல்வி", + "emptyState": "இன்னும் பட்டியல் தரவுகள் இல்லை. சமீபத்திய ஊட்டத்தை பதிவிறக்கம் செய்ய ஒத்திசைக்கவும்.", + "syncNow": "இப்போது ஒத்திசைக்கவும்", + "syncing": "ஒத்திசைக்கிறது...", + "syncCta": "இப்போது ஒத்திசைக்கவும்", + "syncFailed": "ஒத்திசைப்பு தோல்வி", + "flagDisabled": "ரேடார் முடக்கப்பட்டுள்ளது", + "activationFailed": "செயல்படுத்துதல் தோல்வி", + "feedVersion": "ஊட்ட பதிப்பு", + "feedTier": "நிலை", + "feedFetched": "கடைசி பெறப்பட்டது", + "tierLive": "நேரடி (உண்மையான நேரம்)", + "tierCommunity": "சமூகம் (30-நாள் தாமதம்)", + "activateTitle": "ரேடாரை செயல்படுத்தவும்", + "activateDescription": "ரேடார் இலவச மாதிரி பட்டியலை சமூக ஆதாரமான அறிவியுடன் வளமாக்குகிறது — புதுப்பிக்கப்பட்ட மாதிரி கிடைக்கும், கோட்டைகள் மற்றும் அமைப்பு வழிகாட்டிகள்.", + "privacyNoUpload": "எதுவும் பதிவேற்றப்படவில்லை — உங்கள் தரவுகள் உள்ளூர் நிலையில் உள்ளன", + "privacyOnlySigned": "வெறும் கிரிப்டோகிராஃபிகல் கையொப்பமிடப்பட்ட மெட்டாடேட்டா மட்டுமே பதிவிறக்கம் செய்யப்படுகிறது", + "privacyLocalOnly": "அனைத்து செயலாக்கமும் உங்கள் OmniRoute instance இல் நடைபெறும்", + "activateButton": "செயல்படுத்தவும்", + "activating": "செயல்படுத்துகிறது...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "வழங்குநர்", + "colModel": "மாதிரி", + "colQuota": "கோட்டை", + "colContext": "சூழல்", + "colCapabilities": "திறன்கள்", + "colTos": "ToS ஆபத்து", + "newBadge": "புதிய", + "setupGuide": "அமைப்பு வழிகாட்டி", + "disabledByFeed": "ரேடார் ஊட்டத்தால் முடக்கப்பட்டுள்ளது", + "capTools": "கருவிகள்", + "capVision": "பார்வை", + "capThinking": "சிந்தனை", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "வழங்குநர் அமைப்பு", + "setupTitle": "அமைப்பு: {provider}", + "setupSubtitle": "இந்த வழங்குநரை கட்டமைக்க கீழே உள்ள படிகளை பின்பற்றவும்", + "loading": "ஏற்றுகிறது...", + "loadFailed": "அமைப்பு தரவுகளை ஏற்றுவதில் தோல்வி", + "flagDisabled": "ரேடார் முடக்கப்பட்டுள்ளது", + "providerNotFound": "பட்டியலில் \"{provider}\" வழங்குநர் கிடைக்கவில்லை", + "noProvider": "எந்த வழங்குநரும் குறிப்பிடப்படவில்லை. பட்டியலுக்கு திரும்பி ஒரு வழங்குநரை தேர்ந்தெடுக்கவும்.", + "backToCatalog": "பட்டியலுக்கு திரும்பவும்", + "providerConfigured": "வழங்குநர் கட்டமைக்கப்பட்டுள்ளது மற்றும் தயாராக உள்ளது", + "getApiKey": "உங்கள் API விசையை பெறவும்", + "setupSteps": "அமைப்பு படிகள்", + "noGuide": "இந்த வழங்குநருக்கு எந்த அமைப்பு வழிகாட்டியும் கிடையாது.", + "visitDocs": "வழங்குநர் ஆவணங்களை பார்வையிடவும்", + "testConnection": "இணைப்பை சோதிக்கவும்", + "testDescription": "உங்கள் இணைப்பு சரியாக செயல்படுகிறதா என்பதை உறுதிப்படுத்தவும்.", + "testButton": "இணைப்பை சோதிக்கவும்", + "testing": "சோதிக்கிறது...", + "testSuccess": "இணைப்பு வெற்றிகரமாக உள்ளது!", + "testFailed": "இணைப்பு சோதனை தோல்வி", + "addConnection": "இணைப்பைச் சேர்க்கவும்", + "addConnectionDescription": "இன்னும் ஒரு இணைப்பு இல்லை? வழங்குநர் டாஷ்போர்டில் ஒன்றைச் சேர்க்கவும்.", + "addConnectionLink": "வழங்குநர்களுக்கு செல்லவும் →" + } } diff --git a/src/i18n/messages/te.json b/src/i18n/messages/te.json index 2752cd7a51..d6fb26ec7b 100644 --- a/src/i18n/messages/te.json +++ b/src/i18n/messages/te.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "ఎల్లప్పుడూ కనిపిస్తుంది", "groupSeparatorLabel": "సెపరేటర్", "discovery": "డిస్కవరీ", - "discoverySubtitle": "ఉచిత యాక్సెస్ కోసం ప్రొవైడర్లను స్కాన్ చేయండి" + "discoverySubtitle": "ఉచిత యాక్సెస్ కోసం ప్రొవైడర్లను స్కాన్ చేయండి", + "radar": "రాడార్ కాటలాగ్", + "radarSubtitle": "సమాజం-సమృద్ధి చేసిన ఉచిత మోడల్ కాటలాగ్" }, "webhooks": { "title": "వెబ్‌బూక్స్", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "భాగస్వామి లింక్", "dismissAriaLabel": "తీసివేయి" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "రాడార్ కాటలాగ్", + "subtitle": "సమాజ మేధస్సుతో సమృద్ధి చేసిన ఉచిత మోడల్ కాటలాగ్", + "loading": "కాటలాగ్ లోడ్ అవుతోంది...", + "errorLoading": "రాడార్ కాటలాగ్ లోడ్ చేయడంలో విఫలమైంది", + "emptyState": "ఇంకా కాటలాగ్ డేటా లేదు. తాజా ఫీడ్ డౌన్‌లోడ్ చేయడానికి సింక్ చేయండి.", + "syncNow": "ఇప్పుడు సింక్ చేయండి", + "syncing": "సింక్ అవుతోంది...", + "syncCta": "ఇప్పుడు సింక్ చేయండి", + "syncFailed": "సింక్ విఫలమైంది", + "flagDisabled": "రాడార్ అచ్ఛుతమైంది", + "activationFailed": "యాక్టివేషన్ విఫలమైంది", + "feedVersion": "ఫీడ్ వెర్షన్", + "feedTier": "టియర్", + "feedFetched": "చివరిగా పొందినది", + "tierLive": "ప్రత్యక్ష (వాస్తవ-సమయం)", + "tierCommunity": "సమాజం (30-రోజుల ఆలస్యం)", + "activateTitle": "రాడార్ యాక్టివేట్ చేయండి", + "activateDescription": "రాడార్ ఉచిత మోడల్ కాటలాగ్‌ను సమాజం ద్వారా సేకరించిన మేధస్సుతో సమృద్ధి చేస్తుంది — నవీకరించిన మోడల్ అందుబాటులో, క్వోటాలు, మరియు సెటప్ గైడ్లు.", + "privacyNoUpload": "ఏమీ అప్‌లోడ్ చేయబడలేదు — మీ డేటా స్థానికంగా ఉంటుంది", + "privacyOnlySigned": "కేవలం క్రిప్టోగ్రాఫిక్‌గా సంతకం చేయబడిన మెటాడేటా మాత్రమే డౌన్‌లోడ్ చేయబడుతుంది", + "privacyLocalOnly": "అన్ని ప్రాసెసింగ్ మీ OmniRoute ఉదాహరణపై జరుగుతుంది", + "activateButton": "యాక్టివేట్ చేయండి", + "activating": "యాక్టివేట్ అవుతోంది...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "ప్రొవైడర్", + "colModel": "మోడల్", + "colQuota": "క్వోటా", + "colContext": "సందర్భం", + "colCapabilities": "సామర్థ్యాలు", + "colTos": "ToS ప్రమాదం", + "newBadge": "కొత్త", + "setupGuide": "సెటప్ గైడ్", + "disabledByFeed": "రాడార్ ఫీడ్ ద్వారా అచ్ఛుతమైంది", + "capTools": "సాధనాలు", + "capVision": "దృష్టి", + "capThinking": "ఆలోచన", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "ప్రొవైడర్ సెటప్", + "setupTitle": "సెటప్: {provider}", + "setupSubtitle": "ఈ ప్రొవైడర్‌ను కాన్ఫిగర్ చేయడానికి క్రింది దశలను అనుసరించండి", + "loading": "లోడ్ అవుతోంది...", + "loadFailed": "సెటప్ డేటా లోడ్ చేయడంలో విఫలమైంది", + "flagDisabled": "రాడార్ అచ్ఛుతమైంది", + "providerNotFound": "కాటలాగ్‌లో \"{provider}\" ప్రొవైడర్ కనుగొనబడలేదు", + "noProvider": "ప్రొవైడర్‌ను నిర్దేశించలేదు. కాటలాగ్‌కు తిరిగి వెళ్లి ప్రొవైడర్‌ను ఎంచుకోండి.", + "backToCatalog": "కాటలాగ్‌కు తిరిగి", + "providerConfigured": "ప్రొవైడర్ కాన్ఫిగర్ చేయబడింది మరియు సిద్ధంగా ఉంది", + "getApiKey": "మీ API కీ పొందండి", + "setupSteps": "సెటప్ దశలు", + "noGuide": "ఈ ప్రొవైడర్‌కు అందుబాటులో సెటప్ గైడ్ లేదు.", + "visitDocs": "ప్రొవైడర్ డాక్స్ సందర్శించండి", + "testConnection": "కనెక్షన్ పరీక్షించండి", + "testDescription": "మీ కనెక్షన్ సరిగ్గా పనిచేస్తున్నదని నిర్ధారించుకోండి.", + "testButton": "కనెక్షన్ పరీక్షించండి", + "testing": "పరీక్షిస్తున్నది...", + "testSuccess": "కనెక్షన్ విజయవంతం!", + "testFailed": "కనెక్షన్ పరీక్ష విఫలమైంది", + "addConnection": "కనెక్షన్ జోడించండి", + "addConnectionDescription": "ఇంకా కనెక్షన్ లేదు? ప్రొవైడర్ డాష్‌బోర్డులో ఒకటి జోడించండి.", + "addConnectionLink": "ప్రొవైడర్లకు వెళ్లండి →" + } } diff --git a/src/i18n/messages/th.json b/src/i18n/messages/th.json index 2d00ece688..1c2da07af9 100644 --- a/src/i18n/messages/th.json +++ b/src/i18n/messages/th.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "แสดงอยู่เสมอ", "groupSeparatorLabel": "ตัวคั่น", "discovery": "การค้นพบ", - "discoverySubtitle": "สแกนผู้ให้บริการเพื่อเข้าใช้งานฟรี" + "discoverySubtitle": "สแกนผู้ให้บริการเพื่อเข้าใช้งานฟรี", + "radar": "แคตตาล็อกเรดาร์", + "radarSubtitle": "แคตตาล็อกโมเดลฟรีที่เสริมด้วยข้อมูลจากชุมชน" }, "webhooks": { "title": "เว็บฮุค", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "ลิงก์พันธมิตร", "dismissAriaLabel": "ปิด" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "แคตตาล็อกเรดาร์", + "subtitle": "แคตตาล็อกโมเดลฟรีที่เสริมด้วยข้อมูลจากชุมชน", + "loading": "กำลังโหลดแคตตาล็อก...", + "errorLoading": "ไม่สามารถโหลดแคตตาล็อกเรดาร์ได้", + "emptyState": "ยังไม่มีข้อมูลแคตตาล็อก ซิงค์เพื่อดาวน์โหลดฟีดล่าสุด", + "syncNow": "ซิงค์ตอนนี้", + "syncing": "กำลังซิงค์...", + "syncCta": "ซิงค์ตอนนี้", + "syncFailed": "ซิงค์ล้มเหลว", + "flagDisabled": "เรดาร์ถูกปิดใช้งาน", + "activationFailed": "การเปิดใช้งานล้มเหลว", + "feedVersion": "เวอร์ชันฟีด", + "feedTier": "ระดับ", + "feedFetched": "ดึงข้อมูลล่าสุด", + "tierLive": "สด (เรียลไทม์)", + "tierCommunity": "ชุมชน (ล่าช้า 30 วัน)", + "activateTitle": "เปิดใช้งานเรดาร์", + "activateDescription": "เรดาร์เสริมแคตตาล็อกโมเดลฟรีด้วยข้อมูลจากชุมชน — อัปเดตความพร้อมใช้งานของโมเดล โควต้า และคู่มือการตั้งค่า", + "privacyNoUpload": "ไม่มีข้อมูลที่อัปโหลด — ข้อมูลของคุณจะอยู่ในเครื่อง", + "privacyOnlySigned": "จะดาวน์โหลดเฉพาะเมตาดาต้าที่ลงนามด้วยลายเซ็นทางคณิตศาสตร์", + "privacyLocalOnly": "การประมวลผลทั้งหมดเกิดขึ้นบนอินสแตนซ์ OmniRoute ของคุณ", + "activateButton": "เปิดใช้งาน", + "activating": "กำลังเปิดใช้งาน...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "ผู้ให้บริการ", + "colModel": "โมเดล", + "colQuota": "โควต้า", + "colContext": "บริบท", + "colCapabilities": "ความสามารถ", + "colTos": "ความเสี่ยงของ ToS", + "newBadge": "ใหม่", + "setupGuide": "คู่มือการตั้งค่า", + "disabledByFeed": "ถูกปิดใช้งานโดยฟีดเรดาร์", + "capTools": "เครื่องมือ", + "capVision": "วิสัยทัศน์", + "capThinking": "การคิด", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "การตั้งค่าผู้ให้บริการ", + "setupTitle": "การตั้งค่า: {provider}", + "setupSubtitle": "ทำตามขั้นตอนด้านล่างเพื่อกำหนดค่าผู้ให้บริการนี้", + "loading": "กำลังโหลด...", + "loadFailed": "ไม่สามารถโหลดข้อมูลการตั้งค่าได้", + "flagDisabled": "เรดาร์ถูกปิดใช้งาน", + "providerNotFound": "ไม่พบผู้ให้บริการ \"{provider}\" ในแคตตาล็อก", + "noProvider": "ไม่มีผู้ให้บริการที่ระบุ กลับไปที่แคตตาล็อกและเลือกผู้ให้บริการ", + "backToCatalog": "กลับไปที่แคตตาล็อก", + "providerConfigured": "ผู้ให้บริการถูกกำหนดค่าและพร้อมใช้งาน", + "getApiKey": "รับคีย์ API ของคุณ", + "setupSteps": "ขั้นตอนการตั้งค่า", + "noGuide": "ไม่มีคู่มือการตั้งค่าสำหรับผู้ให้บริการนี้", + "visitDocs": "เยี่ยมชมเอกสารผู้ให้บริการ", + "testConnection": "ทดสอบการเชื่อมต่อ", + "testDescription": "ตรวจสอบว่าการเชื่อมต่อของคุณทำงานถูกต้อง", + "testButton": "ทดสอบการเชื่อมต่อ", + "testing": "กำลังทดสอบ...", + "testSuccess": "การเชื่อมต่อสำเร็จ!", + "testFailed": "การทดสอบการเชื่อมต่อล้มเหลว", + "addConnection": "เพิ่มการเชื่อมต่อ", + "addConnectionDescription": "ยังไม่มีการเชื่อมต่อ? เพิ่มหนึ่งในแดชบอร์ดผู้ให้บริการ", + "addConnectionLink": "ไปที่ผู้ให้บริการ →" + } } diff --git a/src/i18n/messages/tr.json b/src/i18n/messages/tr.json index 5ad74a998f..c8f85cf4b1 100644 --- a/src/i18n/messages/tr.json +++ b/src/i18n/messages/tr.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Her zaman görünür", "groupSeparatorLabel": "Ayırıcı", "discovery": "Keşif", - "discoverySubtitle": "Ücretsiz erişim için sağlayıcıları tarayın" + "discoverySubtitle": "Ücretsiz erişim için sağlayıcıları tarayın", + "radar": "Radar Kataloğu", + "radarSubtitle": "Topluluk zenginleştirilmiş ücretsiz model kataloğu" }, "webhooks": { "title": "Web kancaları", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Ortaklık bağlantısı", "dismissAriaLabel": "Kapat" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Radar Kataloğu", + "subtitle": "Topluluk zekası ile zenginleştirilmiş ücretsiz model kataloğu", + "loading": "Katalog yükleniyor...", + "errorLoading": "Radar kataloğu yüklenemedi", + "emptyState": "Henüz katalog verisi yok. En son akışı indirmek için senkronize edin.", + "syncNow": "Şimdi senkronize et", + "syncing": "Senkronize ediliyor...", + "syncCta": "Şimdi senkronize et", + "syncFailed": "Senkronizasyon başarısız", + "flagDisabled": "Radar devre dışı", + "activationFailed": "Aktivasyon başarısız", + "feedVersion": "Akış versiyonu", + "feedTier": "Seviye", + "feedFetched": "Son alınan", + "tierLive": "Canlı (gerçek zamanlı)", + "tierCommunity": "Topluluk (30 günlük gecikme)", + "activateTitle": "Radar'ı etkinleştir", + "activateDescription": "Radar, topluluk kaynaklı zeka ile ücretsiz model kataloğunu zenginleştirir — güncellenmiş model kullanılabilirliği, kotalar ve kurulum kılavuzları.", + "privacyNoUpload": "Hiçbir şey yüklenmedi — verileriniz yerel kalır", + "privacyOnlySigned": "Sadece kriptografik olarak imzalanmış meta veriler indirilir", + "privacyLocalOnly": "Tüm işleme, OmniRoute örneğinizde gerçekleşir", + "activateButton": "Etkinleştir", + "activating": "Etkinleştiriliyor...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Sağlayıcı", + "colModel": "Model", + "colQuota": "Kota", + "colContext": "Bağlam", + "colCapabilities": "Yetenekler", + "colTos": "ToS Riski", + "newBadge": "yeni", + "setupGuide": "Kurulum kılavuzu", + "disabledByFeed": "Radar akışı tarafından devre dışı bırakıldı", + "capTools": "Araçlar", + "capVision": "Vizyon", + "capThinking": "Düşünme", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Sağlayıcı Kurulumu", + "setupTitle": "Kurulum: {provider}", + "setupSubtitle": "Bu sağlayıcıyı yapılandırmak için aşağıdaki adımları izleyin", + "loading": "Yükleniyor...", + "loadFailed": "Kurulum verisi yüklenemedi", + "flagDisabled": "Radar devre dışı", + "providerNotFound": "Katalogda \"{provider}\" sağlayıcısı bulunamadı", + "noProvider": "Hiçbir sağlayıcı belirtilmedi. Kataloğa geri dönün ve bir sağlayıcı seçin.", + "backToCatalog": "Kataloğa geri dön", + "providerConfigured": "Sağlayıcı yapılandırıldı ve hazır", + "getApiKey": "API anahtarınızı alın", + "setupSteps": "Kurulum adımları", + "noGuide": "Bu sağlayıcı için mevcut bir kurulum kılavuzu yok.", + "visitDocs": "Sağlayıcı belgelerini ziyaret edin", + "testConnection": "Bağlantıyı test et", + "testDescription": "Bağlantınızın doğru çalıştığını doğrulayın.", + "testButton": "Bağlantıyı test et", + "testing": "Test ediliyor...", + "testSuccess": "Bağlantı başarılı!", + "testFailed": "Bağlantı testi başarısız", + "addConnection": "Bağlantı ekle", + "addConnectionDescription": "Henüz bir bağlantınız yok mu? Sağlayıcılar panosunda bir tane ekleyin.", + "addConnectionLink": "Sağlayıcılara git →" + } } diff --git a/src/i18n/messages/uk-UA.json b/src/i18n/messages/uk-UA.json index ee15f4073d..edf9a00c13 100644 --- a/src/i18n/messages/uk-UA.json +++ b/src/i18n/messages/uk-UA.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Завжди видимий", "groupSeparatorLabel": "Розділювач", "discovery": "Виявлення", - "discoverySubtitle": "Сканувати провайдерів на наявність безкоштовного доступу" + "discoverySubtitle": "Сканувати провайдерів на наявність безкоштовного доступу", + "radar": "Каталог Радар", + "radarSubtitle": "Безкоштовний каталог моделей, збагачений спільнотою" }, "webhooks": { "title": "Веб-хуки", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "Партнерське посилання", "dismissAriaLabel": "Закрити" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "Каталог Радар", + "subtitle": "Безкоштовний каталог моделей, збагачений інтелектом спільноти", + "loading": "Завантаження каталогу...", + "errorLoading": "Не вдалося завантажити каталог Радар", + "emptyState": "Дані каталогу ще не доступні. Синхронізуйте, щоб завантажити останній фід.", + "syncNow": "Синхронізувати зараз", + "syncing": "Синхронізація...", + "syncCta": "Синхронізувати зараз", + "syncFailed": "Синхронізація не вдалася", + "flagDisabled": "Радар вимкнено", + "activationFailed": "Активація не вдалася", + "feedVersion": "Версія фіду", + "feedTier": "Рівень", + "feedFetched": "Останнє отримання", + "tierLive": "В реальному часі", + "tierCommunity": "Спільнота (з затримкою 30 днів)", + "activateTitle": "Активувати Радар", + "activateDescription": "Радар збагачує безкоштовний каталог моделей інтелектом, отриманим від спільноти — оновлена доступність моделей, квоти та посібники з налаштування.", + "privacyNoUpload": "Нічого не завантажено — ваші дані залишаються локальними", + "privacyOnlySigned": "Завантажується лише криптографічно підписана метадані", + "privacyLocalOnly": "Усе оброблення відбувається на вашій інстанції OmniRoute", + "activateButton": "Активувати", + "activating": "Активація...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Постачальник", + "colModel": "Модель", + "colQuota": "Квота", + "colContext": "Контекст", + "colCapabilities": "Можливості", + "colTos": "Ризик ToS", + "newBadge": "новий", + "setupGuide": "Посібник з налаштування", + "disabledByFeed": "Вимкнено через фід Радар", + "capTools": "Інструменти", + "capVision": "Візія", + "capThinking": "Мислення", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Налаштування постачальника", + "setupTitle": "Налаштування: {provider}", + "setupSubtitle": "Дотримуйтесь наведених нижче кроків, щоб налаштувати цього постачальника", + "loading": "Завантаження...", + "loadFailed": "Не вдалося завантажити дані налаштування", + "flagDisabled": "Радар вимкнено", + "providerNotFound": "Постачальника \"{provider}\" не знайдено в каталозі", + "noProvider": "Постачальник не вказаний. Поверніться до каталогу та виберіть постачальника.", + "backToCatalog": "Назад до каталогу", + "providerConfigured": "Постачальник налаштований і готовий", + "getApiKey": "Отримайте свій API-ключ", + "setupSteps": "Кроки налаштування", + "noGuide": "Посібник з налаштування для цього постачальника недоступний.", + "visitDocs": "Відвідайте документацію постачальника", + "testConnection": "Перевірити з'єднання", + "testDescription": "Переконайтеся, що ваше з'єднання працює правильно.", + "testButton": "Перевірити з'єднання", + "testing": "Тестування...", + "testSuccess": "З'єднання успішне!", + "testFailed": "Тест з'єднання не вдалося", + "addConnection": "Додати з'єднання", + "addConnectionDescription": "Ще немає з'єднання? Додайте його на панелі постачальників.", + "addConnectionLink": "Перейти до постачальників →" + } } diff --git a/src/i18n/messages/ur.json b/src/i18n/messages/ur.json index e3e4c4a1a2..bfe3fce3bf 100644 --- a/src/i18n/messages/ur.json +++ b/src/i18n/messages/ur.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "ہمیشہ ظاہر", "groupSeparatorLabel": "جدا کار", "discovery": "دریافت", - "discoverySubtitle": "مفت رسائی کے لیے فراہم کنندگان کو اسکین کریں" + "discoverySubtitle": "مفت رسائی کے لیے فراہم کنندگان کو اسکین کریں", + "radar": "ریڈار کیٹلاگ", + "radarSubtitle": "کمیونٹی سے بھرپور مفت ماڈل کیٹلاگ" }, "webhooks": { "title": "ویب ہکس", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "پارٹنر لنک", "dismissAriaLabel": "خارج کریں" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "ریڈار کیٹلاگ", + "subtitle": "کمیونٹی کی ذہانت سے بھرپور مفت ماڈل کیٹلاگ", + "loading": "کیٹلاگ لوڈ ہو رہا ہے...", + "errorLoading": "ریڈار کیٹلاگ لوڈ کرنے میں ناکامی", + "emptyState": "ابھی تک کوئی کیٹلاگ ڈیٹا نہیں ہے۔ تازہ فیڈ ڈاؤن لوڈ کرنے کے لیے ہم وقت سازی کریں۔", + "syncNow": "ابھی ہم وقت سازی کریں", + "syncing": "ہم وقت سازی ہو رہی ہے...", + "syncCta": "ابھی ہم وقت سازی کریں", + "syncFailed": "ہم وقت سازی ناکام", + "flagDisabled": "ریڈار غیر فعال ہے", + "activationFailed": "چالو کرنے میں ناکامی", + "feedVersion": "فیڈ ورژن", + "feedTier": "درجہ", + "feedFetched": "آخری حاصل کردہ", + "tierLive": "براہ راست (حقیقی وقت)", + "tierCommunity": "کمیونٹی (30 دن کی تاخیر)", + "activateTitle": "ریڈار کو چالو کریں", + "activateDescription": "ریڈار مفت ماڈل کیٹلاگ کو کمیونٹی کے ذریعہ فراہم کردہ ذہانت سے بھرپور کرتا ہے — ماڈل کی دستیابی، کوٹہ، اور سیٹ اپ گائیڈز کو اپ ڈیٹ کرتا ہے۔", + "privacyNoUpload": "کچھ بھی اپ لوڈ نہیں ہوا — آپ کا ڈیٹا مقامی رہتا ہے", + "privacyOnlySigned": "صرف کرپٹوگرافک طور پر دستخط شدہ میٹا ڈیٹا ڈاؤن لوڈ کیا جاتا ہے", + "privacyLocalOnly": "تمام پروسیسنگ آپ کے OmniRoute انسٹنس پر ہوتی ہے", + "activateButton": "چالو کریں", + "activating": "چالو ہو رہا ہے...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "فراہم کنندہ", + "colModel": "ماڈل", + "colQuota": "کوٹہ", + "colContext": "سیاق و سباق", + "colCapabilities": "صلاحیتیں", + "colTos": "ToS خطرہ", + "newBadge": "نیا", + "setupGuide": "سیٹ اپ گائیڈ", + "disabledByFeed": "ریڈار فیڈ کی وجہ سے غیر فعال", + "capTools": "ٹولز", + "capVision": "وژن", + "capThinking": "سوچنا", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "فراہم کنندہ سیٹ اپ", + "setupTitle": "سیٹ اپ: {provider}", + "setupSubtitle": "اس فراہم کنندہ کو ترتیب دینے کے لیے نیچے دیے گئے مراحل پر عمل کریں", + "loading": "لوڈ ہو رہا ہے...", + "loadFailed": "سیٹ اپ ڈیٹا لوڈ کرنے میں ناکامی", + "flagDisabled": "ریڈار غیر فعال ہے", + "providerNotFound": "کیٹلاگ میں فراہم کنندہ \"{provider}\" نہیں ملا", + "noProvider": "کوئی فراہم کنندہ مخصوص نہیں ہے۔ کیٹلاگ میں واپس جائیں اور ایک فراہم کنندہ منتخب کریں۔", + "backToCatalog": "کیٹلاگ میں واپس جائیں", + "providerConfigured": "فراہم کنندہ ترتیب دیا گیا ہے اور تیار ہے", + "getApiKey": "اپنا API کلید حاصل کریں", + "setupSteps": "سیٹ اپ کے مراحل", + "noGuide": "اس فراہم کنندہ کے لیے کوئی سیٹ اپ گائیڈ دستیاب نہیں ہے۔", + "visitDocs": "فراہم کنندہ کی دستاویزات ملاحظہ کریں", + "testConnection": "کنکشن کی جانچ کریں", + "testDescription": "تصدیق کریں کہ آپ کا کنکشن صحیح طور پر کام کر رہا ہے۔", + "testButton": "کنکشن کی جانچ کریں", + "testing": "جانچ ہو رہی ہے...", + "testSuccess": "کنکشن کامیاب!", + "testFailed": "کنکشن کی جانچ ناکام", + "addConnection": "کنکشن شامل کریں", + "addConnectionDescription": "کیا آپ کے پاس ابھی تک کوئی کنکشن نہیں ہے؟ فراہم کنندہ کے ڈیش بورڈ میں ایک شامل کریں۔", + "addConnectionLink": "فراہم کنندگان پر جائیں →" + } } diff --git a/src/i18n/messages/vi.json b/src/i18n/messages/vi.json index df49f87650..3951d02b2e 100644 --- a/src/i18n/messages/vi.json +++ b/src/i18n/messages/vi.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "Luôn hiển thị", "groupSeparatorLabel": "Dấu phân cách", "discovery": "Khám phá", - "discoverySubtitle": "Quét các nhà cung cấp để tìm quyền truy cập miễn phí" + "discoverySubtitle": "Quét các nhà cung cấp để tìm quyền truy cập miễn phí", + "radar": "Danh mục Radar", + "radarSubtitle": "Danh mục mô hình miễn phí được làm phong phú bởi cộng đồng" }, "webhooks": { "title": "Webhook", @@ -5953,7 +5955,8 @@ "kimi-coding": "Kết nối Kimi Coding bằng luồng OAuth hiện có.", "kiro": "Gói miễn phí: 50 tín dụng/tháng (khoảng 25–100 nghìn token). ⚠️ Điều khoản Kiro cấm sử dụng proxy/harness của bên thứ ba.", "codex": "Kết nối OpenAI Codex bằng luồng OAuth hiện có.", - "qwen": "Kết nối Qwen Code bằng luồng OAuth hiện có." + "qwen": "Kết nối Qwen Code bằng luồng OAuth hiện có.", + "unorouter": "Tạo khóa API tại https://unorouter.ai, sau đó dán vào đây dưới dạng Bearer token." }, "passthroughModelsDescription": "{provider} chấp nhận ID mô hình gốc của nhà cung cấp. Nhập từ /models hoặc thêm ID tùy chỉnh để định tuyến.", "bedrockModelsDescription": "Các mô hình Amazon Bedrock được giới hạn theo vùng AWS. Nhập từ /models hoặc thêm ID mô hình Bedrock được bật trong vùng đã chọn.", @@ -6017,7 +6020,15 @@ "ccAliasAddModelPlaceholder": "Id mô hình (ví dụ: gpt-4o)", "ccAliasAddModelButton": "Thêm ghi đè", "ccAliasLoadError": "Không tải được cài đặt bí danh khám phá: {error}", - "ccAliasSaveError": "Không lưu được cài đặt bí danh khám phá: {error}" + "ccAliasSaveError": "Không lưu được cài đặt bí danh khám phá: {error}", + "newApiAggregatorToggleLabel": "Cổng tổng hợp", + "newApiAggregatorToggleHint": "Bật phát hiện số dư cho các node tổng hợp New-API / One-API / Sub2API. Bảng điều khiển sẽ hiển thị huy hiệu số dư và định tuyến quota-preflight sẽ bỏ qua các tài khoản đã cạn.", + "newApiAggregatorConsoleApiKeyHint": "System Access Token cho endpoint /api/user/self của bộ tổng hợp. Không phải khóa API định tuyến.", + "newApiAggregatorUserIdHint": "Giá trị header New-Api-User dùng để lấy số dư quota của người dùng bộ tổng hợp.", + "newApiAggregatorQuotaPerUnitLabel": "Quota mỗi đơn vị", + "newApiAggregatorQuotaPerUnitHint": "Số đơn vị tín dụng New-API cho mỗi 1 USD (mặc định: 500000). Ghi đè nếu bộ tổng hợp của bạn dùng tỷ lệ khác.", + "featureFlagNewApiAggregatorBalanceDescription": "Bật phát hiện số dư cho các node tương thích New-API / One-API / Sub2API", + "modelTestQuotaTooltip": "Đã hết quota — sẽ đặt lại vào ngày mai hoặc cần nạp thêm" }, "settings": { "title": "Cài đặt", @@ -10848,7 +10859,9 @@ "goNow": "Đi ngay", "message": "MITM Proxy hiện nằm trong AgentBridge.", "title": "Trang này đã được di chuyển" - } + }, + "noMappingsDesc": "Chưa cấu hình ánh xạ mô hình nào. Hãy thêm ánh xạ để định tuyến yêu cầu của agent qua OmniRoute.", + "addMapping": "Thêm ánh xạ" }, "providerStats": { "unknownError": "Lỗi không xác định", @@ -11524,7 +11537,10 @@ "noSavedProxiesError": "Không tìm thấy proxy đã lưu. Hãy thêm proxy trong Cài đặt → Proxy trước.", "updateProviderFailed": "Không thể cập nhật nhà cung cấp", "providerEnabled": "Đã bật {provider}", - "providerDisabled": "Đã tắt {provider}" + "providerDisabled": "Đã tắt {provider}", + "providerAdded": "Đã thêm {provider}", + "add": "Thêm", + "manualApiKey": "Dùng khóa API thủ công" }, "gamification": { "leaderboardScopes": { @@ -12220,5 +12236,82 @@ "partnerLinkNote": "Partner link", "dismissAriaLabel": "Dismiss" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "Công bố các id phản chiếu <gateway-alias>/<model> trên /v1/models cho các mô hình có chủ sở hữu chuẩn không có thông tin xác thực hoạt động nhưng một cổng chuyển tiếp có thông tin xác thực hoạt động định tuyến được chúng. Cảnh báo: khi bật, số mục trong danh mục tăng lên với mọi client." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "Công bố các id phản chiếu <gateway-alias>/<model> trên /v1/models cho các mô hình có chủ sở hữu chuẩn không có thông tin xác thực hoạt động nhưng một cổng chuyển tiếp có thông tin xác thực hoạt động định tuyến được chúng. Cảnh báo: khi bật, số mục trong danh mục tăng lên với mọi client.", + "radarPage": { + "title": "Danh mục Radar", + "subtitle": "Danh mục mô hình miễn phí được làm phong phú bởi trí tuệ cộng đồng", + "loading": "Đang tải danh mục...", + "errorLoading": "Không thể tải danh mục Radar", + "emptyState": "Chưa có dữ liệu danh mục. Đồng bộ để tải xuống nguồn cấp dữ liệu mới nhất.", + "syncNow": "Đồng bộ ngay", + "syncing": "Đang đồng bộ...", + "syncCta": "Đồng bộ ngay", + "syncFailed": "Đồng bộ không thành công", + "flagDisabled": "Radar đã bị vô hiệu hóa", + "activationFailed": "Kích hoạt không thành công", + "feedVersion": "Phiên bản nguồn cấp dữ liệu", + "feedTier": "Cấp độ", + "feedFetched": "Lần lấy gần nhất", + "tierLive": "Trực tiếp (thời gian thực)", + "tierCommunity": "Cộng đồng (độ trễ 30 ngày)", + "activateTitle": "Kích hoạt Radar", + "activateDescription": "Radar làm phong phú danh mục mô hình miễn phí với trí tuệ từ cộng đồng — cập nhật tình trạng mô hình, hạn ngạch và hướng dẫn thiết lập.", + "privacyNoUpload": "Không có gì được tải lên — dữ liệu của bạn vẫn ở cục bộ", + "privacyOnlySigned": "Chỉ có siêu dữ liệu được ký bằng mã hóa mới được tải xuống", + "privacyLocalOnly": "Tất cả xử lý diễn ra trên phiên bản OmniRoute của bạn", + "activateButton": "Kích hoạt", + "activating": "Đang kích hoạt...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "Nhà cung cấp", + "colModel": "Mô hình", + "colQuota": "Hạn ngạch", + "colContext": "Ngữ cảnh", + "colCapabilities": "Khả năng", + "colTos": "Rủi ro ToS", + "newBadge": "mới", + "setupGuide": "Hướng dẫn thiết lập", + "disabledByFeed": "Bị vô hiệu hóa bởi nguồn cấp dữ liệu Radar", + "capTools": "Công cụ", + "capVision": "Tầm nhìn", + "capThinking": "Suy nghĩ", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "Thiết lập nhà cung cấp", + "setupTitle": "Thiết lập: {provider}", + "setupSubtitle": "Làm theo các bước dưới đây để cấu hình nhà cung cấp này", + "loading": "Đang tải...", + "loadFailed": "Không thể tải dữ liệu thiết lập", + "flagDisabled": "Radar đã bị vô hiệu hóa", + "providerNotFound": "Nhà cung cấp \"{provider}\" không được tìm thấy trong danh mục", + "noProvider": "Chưa chỉ định nhà cung cấp. Quay lại danh mục và chọn một nhà cung cấp.", + "backToCatalog": "Quay lại danh mục", + "providerConfigured": "Nhà cung cấp đã được cấu hình và sẵn sàng", + "getApiKey": "Lấy khóa API của bạn", + "setupSteps": "Các bước thiết lập", + "noGuide": "Không có hướng dẫn thiết lập nào cho nhà cung cấp này.", + "visitDocs": "Truy cập tài liệu nhà cung cấp", + "testConnection": "Kiểm tra kết nối", + "testDescription": "Xác minh rằng kết nối của bạn đang hoạt động chính xác.", + "testButton": "Kiểm tra kết nối", + "testing": "Đang kiểm tra...", + "testSuccess": "Kết nối thành công!", + "testFailed": "Kiểm tra kết nối không thành công", + "addConnection": "Thêm kết nối", + "addConnectionDescription": "Chưa có kết nối? Thêm một cái trong bảng điều khiển nhà cung cấp.", + "addConnectionLink": "Đi đến các nhà cung cấp →" + } } diff --git a/src/i18n/messages/zh-CN.json b/src/i18n/messages/zh-CN.json index 6b82ed3032..d62d9a0a57 100644 --- a/src/i18n/messages/zh-CN.json +++ b/src/i18n/messages/zh-CN.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "始终可见", "groupSeparatorLabel": "隔断", "discovery": "发现", - "discoverySubtitle": "扫描供应商以获取免费访问" + "discoverySubtitle": "扫描供应商以获取免费访问", + "radar": "雷达目录", + "radarSubtitle": "由社区丰富的免费模型目录" }, "webhooks": { "title": "Webhook", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "合作伙伴链接", "dismissAriaLabel": "关闭" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "雷达目录", + "subtitle": "由社区智能丰富的免费模型目录", + "loading": "正在加载目录...", + "errorLoading": "加载雷达目录失败", + "emptyState": "还没有目录数据。同步以下载最新数据。", + "syncNow": "立即同步", + "syncing": "正在同步...", + "syncCta": "立即同步", + "syncFailed": "同步失败", + "flagDisabled": "雷达已禁用", + "activationFailed": "激活失败", + "feedVersion": "数据源版本", + "feedTier": "级别", + "feedFetched": "最后获取", + "tierLive": "实时", + "tierCommunity": "社区(30天延迟)", + "activateTitle": "激活雷达", + "activateDescription": "雷达通过社区来源的智能丰富免费模型目录——更新模型可用性、配额和设置指南。", + "privacyNoUpload": "没有上传任何内容——您的数据保持本地", + "privacyOnlySigned": "仅下载经过加密签名的元数据", + "privacyLocalOnly": "所有处理都在您的OmniRoute实例上进行", + "activateButton": "激活", + "activating": "正在激活...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "提供者", + "colModel": "模型", + "colQuota": "配额", + "colContext": "上下文", + "colCapabilities": "能力", + "colTos": "ToS风险", + "newBadge": "新", + "setupGuide": "设置指南", + "disabledByFeed": "被雷达数据源禁用", + "capTools": "工具", + "capVision": "视觉", + "capThinking": "思考", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "提供者设置", + "setupTitle": "设置:{provider}", + "setupSubtitle": "按照以下步骤配置此提供者", + "loading": "正在加载...", + "loadFailed": "加载设置数据失败", + "flagDisabled": "雷达已禁用", + "providerNotFound": "目录中未找到提供者\"{provider}\"", + "noProvider": "未指定提供者。返回目录并选择一个提供者。", + "backToCatalog": "返回目录", + "providerConfigured": "提供者已配置并准备就绪", + "getApiKey": "获取您的API密钥", + "setupSteps": "设置步骤", + "noGuide": "此提供者没有可用的设置指南。", + "visitDocs": "访问提供者文档", + "testConnection": "测试连接", + "testDescription": "验证您的连接是否正常工作。", + "testButton": "测试连接", + "testing": "正在测试...", + "testSuccess": "连接成功!", + "testFailed": "连接测试失败", + "addConnection": "添加连接", + "addConnectionDescription": "还没有连接?在提供者仪表板中添加一个。", + "addConnectionLink": "前往提供者 →" + } } diff --git a/src/i18n/messages/zh-TW.json b/src/i18n/messages/zh-TW.json index 4691dabfe7..0e130048f7 100644 --- a/src/i18n/messages/zh-TW.json +++ b/src/i18n/messages/zh-TW.json @@ -1230,7 +1230,9 @@ "alwaysVisible": "始終可見", "groupSeparatorLabel": "隔斷", "discovery": "發現", - "discoverySubtitle": "掃描提供者以獲取免費訪問" + "discoverySubtitle": "掃描提供者以獲取免費訪問", + "radar": "雷達目錄", + "radarSubtitle": "由社群增強的免費模型目錄" }, "webhooks": { "title": "Webhook", @@ -12185,5 +12187,82 @@ "partnerLinkNote": "合作伙伴連結", "dismissAriaLabel": "關閉" }, - "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally." + "featureFlagExposeFunctionalGatewayMirrorsDescription": "__MISSING__:Advertise / mirror ids on /v1/models for models whose canonical owner has no active credential but a passthrough gateway with an active credential routes them. Warning: adds catalog entries for all clients when enabled globally.", + "radarPage": { + "title": "雷達目錄", + "subtitle": "由社群智慧增強的免費模型目錄", + "loading": "正在加載目錄...", + "errorLoading": "無法加載雷達目錄", + "emptyState": "尚無目錄數據。同步以下載最新的數據源。", + "syncNow": "現在同步", + "syncing": "正在同步...", + "syncCta": "現在同步", + "syncFailed": "同步失敗", + "flagDisabled": "雷達已禁用", + "activationFailed": "啟用失敗", + "feedVersion": "數據源版本", + "feedTier": "層級", + "feedFetched": "最後提取", + "tierLive": "實時", + "tierCommunity": "社群(30天延遲)", + "activateTitle": "啟用雷達", + "activateDescription": "雷達通過社群來源的智慧增強免費模型目錄——更新的模型可用性、配額和設置指南。", + "privacyNoUpload": "尚未上傳任何內容——您的數據保持本地", + "privacyOnlySigned": "只下載經過加密簽名的元數據", + "privacyLocalOnly": "所有處理都在您的 OmniRoute 實例上進行", + "activateButton": "啟用", + "activating": "正在啟用...", + "claimSectionTitle": "Don't have a supporter key yet?", + "contributorButton": "I'm a contributor", + "contributorHint": "Verify your GitHub account — 5+ merged pull requests or a top-100 contributor spot unlocks a free supporter key.", + "supporterButton": "Support the project", + "supporterHint": "Support OmniRoute to get a supporter key with the live catalog and extra perks.", + "colProvider": "提供者", + "colModel": "模型", + "colQuota": "配額", + "colContext": "上下文", + "colCapabilities": "能力", + "colTos": "服務條款風險", + "newBadge": "新的", + "setupGuide": "設置指南", + "disabledByFeed": "被雷達數據源禁用", + "capTools": "工具", + "capVision": "視覺", + "capThinking": "思考", + "catalogTab": "Catalog", + "freeCreditsTab": "Free credits", + "freeCreditsSubtitle": "Referral links from Radar-tracked providers — using them costs you nothing extra and helps support OmniRoute.", + "fixedLinksEmpty": "No referral links available yet. Sync Radar to check for updates.", + "requiredActionLabel": "What to do:", + "claimButton": "Claim credits", + "campaignsTitle": "Limited-time campaigns", + "campaignsEmpty": "No active campaigns right now — check back later.", + "campaignsUpsellCommunity": "Limited-time campaigns are a supporter extra. Everything on this page's fixed links stays free for everyone.", + "campaignsValidUntil": "Valid until {date}" + }, + "radarSetupPage": { + "title": "提供者設置", + "setupTitle": "設置:{provider}", + "setupSubtitle": "按照以下步驟配置此提供者", + "loading": "正在加載...", + "loadFailed": "無法加載設置數據", + "flagDisabled": "雷達已禁用", + "providerNotFound": "目錄中未找到提供者 \"{provider}\"", + "noProvider": "未指定提供者。返回目錄並選擇一個提供者。", + "backToCatalog": "返回目錄", + "providerConfigured": "提供者已配置並準備就緒", + "getApiKey": "獲取您的 API 密鑰", + "setupSteps": "設置步驟", + "noGuide": "此提供者沒有可用的設置指南。", + "visitDocs": "訪問提供者文件", + "testConnection": "測試連接", + "testDescription": "驗證您的連接是否正常工作。", + "testButton": "測試連接", + "testing": "正在測試...", + "testSuccess": "連接成功!", + "testFailed": "連接測試失敗", + "addConnection": "添加連接", + "addConnectionDescription": "還沒有連接?在提供者儀表板中添加一個。", + "addConnectionLink": "前往提供者 →" + } } diff --git a/src/instrumentation-node.ts b/src/instrumentation-node.ts index 7cab7b0387..d0407e437a 100755 --- a/src/instrumentation-node.ts +++ b/src/instrumentation-node.ts @@ -543,6 +543,19 @@ export async function registerNodejs(): Promise { console.warn("[STARTUP] Arena ELO sync failed to start (non-fatal):", msg); }), + // Radar daily feed sync: only arms itself when RADAR_ENABLED AND the user + // opt-in are already on (flag-off boot stays timer-free — Radar inertia + // contract). Non-blocking, never fatal. + import("@/lib/radar/scheduler") + .then((m) => { + const started = m.initRadarSyncScheduler(); + if (started) console.log("[STARTUP] Radar sync scheduler initialized"); + }) + .catch((err: unknown) => { + const msg = err instanceof Error ? err.message : String(err); + console.warn("[STARTUP] Radar sync scheduler failed to start (non-fatal):", msg); + }), + // Pricing sync: opt-in external pricing data (self-gated by PRICING_SYNC_ENABLED inside // initPricingSync). Non-blocking, never fatal. import("@/lib/pricingSync") @@ -562,7 +575,10 @@ export async function registerNodejs(): Promise { }) .catch((err: unknown) => { const msg = err instanceof Error ? err.message : String(err); - console.warn("[STARTUP] OpenRouter provider stats sync failed to start (non-fatal):", msg); + console.warn( + "[STARTUP] OpenRouter provider stats sync failed to start (non-fatal):", + msg + ); }), // models.dev capability sync: opt-in via Settings > AI (self-gated by @@ -593,6 +609,18 @@ export async function registerNodejs(): Promise { console.warn("[STARTUP] memory decay sweep failed to start (non-fatal):", msg); }), + // MemoryBackend provider pattern (PR #8752): initialize configured memory + // backends from settings (sqlite, obsidian, notion, custom HTTP, etc.). + // Reads the DB settings synchronously (non-blocking, never fatal). Must + // run after the DB is ready AND after getSettings/applyRuntimeSettings so + // memory backend config is hydrated. + import("@/lib/memory/index") + .then((m) => m.initMemoryBackends()) + .catch((err: unknown) => { + const msg = err instanceof Error ? err.message : String(err); + console.warn("[STARTUP] memory backend initialization failed (non-fatal):", msg); + }), + // Backup schedule (#8513): execute `backup-schedule.json` cron server-side. // Reads the schedule written by `omniroute backup auto enable` and fires // `runBackupCommand` when the cron expression matches. Self-gated: no-op diff --git a/src/lib/api/modelTestRunner.ts b/src/lib/api/modelTestRunner.ts index 7f6b89bf5f..e3041e7c1f 100644 --- a/src/lib/api/modelTestRunner.ts +++ b/src/lib/api/modelTestRunner.ts @@ -12,6 +12,11 @@ import { getCustomModels } from "@/lib/localDb"; import { getProviderNodeById } from "@/lib/db/providers"; import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; import { withRateLimit } from "@omniroute/open-sse/services/rateLimitManager"; +import { + isCreditsExhausted, + isDailyQuotaExhausted, +} from "@omniroute/open-sse/services/accountFallback"; +import { looksLikeQuotaExhausted } from "@/shared/utils/classify429"; const INTERNAL_ORIGIN = "http://omniroute.internal"; export const DEFAULT_MODEL_TEST_TIMEOUT_MS = 30_000; @@ -294,6 +299,7 @@ export interface SingleModelTestResult { error?: string; rateLimited?: boolean; isTransient?: boolean; + isQuota?: boolean; isTimeout?: boolean; retryAfter?: number; } @@ -322,6 +328,43 @@ function isBotBlockMessage(message: string): boolean { return /cloudflare|bot management|recaptcha|cf-chl|just a moment/i.test(message); } +/** + * Classify an error message for quota signals (#9511). + * + * Distinguishes three outcomes: + * 1. Daily-quota exhausted → isQuota + isTransient (resets tomorrow) + * 2. Credits/balance exhausted → isQuota only (needs top-up, not transient) + * 3. Other errors → no quota flags (still auto-hidable) + * + * Reuses the routing path's existing quota vocabulary from accountFallback.ts + * and classify429.ts instead of inventing a new vocabulary. + */ +export function classifyTestErrorQuota( + errorText: string +): { isQuota?: boolean; isTransient?: boolean } { + const trimmed = typeof errorText === "string" ? errorText.trim() : ""; + if (!trimmed) return {}; + + // Check daily-quota FIRST — it's the more specific (transient) classification + // and should win over credits-exhausted if both match. + if (isDailyQuotaExhausted(trimmed)) { + return { isQuota: true, isTransient: true }; + } + + // Credits-exhausted is terminal — isQuota but NOT isTransient. + if (isCreditsExhausted(trimmed)) { + return { isQuota: true }; + } + + // Broad quota wording from classify429 (catches patterns not in the + // accountFallback signals, e.g. "quota exceeded", "billing cap"). + if (looksLikeQuotaExhausted(trimmed)) { + return { isQuota: true }; + } + + return {}; +} + /** * Run a single model test. When `connectionId` is provided, wraps the * upstream call with `withRateLimit` (Bottleneck). Returns a plain @@ -506,7 +549,11 @@ export async function runSingleModelTest( if (streamError) { const error = sanitizeErrorMessage(streamError.message) || "Upstream stream failed"; const rateLimited = streamError.statusCode === 429 || isRateLimitMessage(error); - const isBotBlock = streamError.statusCode === 403 || isBotBlockMessage(error); + // #9511: Check quota BEFORE bot-block — 403 with quota wording is a quota + // error, not a bot-block. A bare 403 status without quota/bot wording still + // falls through to the generic error branch. + const quotaFlags = classifyTestErrorQuota(error); + const isBotBlock = !quotaFlags.isQuota && (streamError.statusCode === 403 || isBotBlockMessage(error)); return { modelId: fullModelStr, status: rateLimited ? "rate_limited" : "error", @@ -515,7 +562,8 @@ export async function runSingleModelTest( httpStatus: streamError.statusCode ?? 502, error, ...(rateLimited ? { rateLimited: true } : {}), - ...(rateLimited || isBotBlock ? { isTransient: true } : {}), + ...(rateLimited || isBotBlock || quotaFlags.isTransient ? { isTransient: true } : {}), + ...(quotaFlags.isQuota ? { isQuota: true } : {}), }; } if (timedOut && !responseText) { @@ -565,6 +613,10 @@ export async function runSingleModelTest( } finally { clearTimeout(timeoutHandle); } + // #9511: classify quota signals on the generic error branch so that + // 401/402/403 "insufficient balance" / "quota exhausted" errors are + // NOT auto-hidden by Test All. + const quotaFlags = classifyTestErrorQuota(errorMsg); return { modelId: fullModelStr, status: "error", @@ -572,5 +624,7 @@ export async function runSingleModelTest( statusCode: res.status, httpStatus: res.status, error: errorMsg, + ...(quotaFlags.isTransient ? { isTransient: true } : {}), + ...(quotaFlags.isQuota ? { isQuota: true } : {}), }; } diff --git a/src/lib/catalog/openrouterProviderStats.ts b/src/lib/catalog/openrouterProviderStats.ts index 4363fc2ca2..1f3d8472ca 100644 --- a/src/lib/catalog/openrouterProviderStats.ts +++ b/src/lib/catalog/openrouterProviderStats.ts @@ -161,7 +161,10 @@ export function computeProviderPopularity( } } - const bySlug = new Map(); + const bySlug = new Map< + string, + { modelCount: number; totalTokens: number; totalRequests: number } + >(); for (const row of catalogRows) { const key = `${row.permaslug}::${row.endpoint.variant ?? "standard"}`; const usage = usageByKey.get(key); @@ -303,7 +306,9 @@ function startPeriodicSync(intervalMs?: number): void { refreshOpenRouterProviderStats() .then((result) => { if (result.ok) { - console.log(`[OpenRouterProviderStats] Initial sync complete: ${result.data.length} providers`); + console.log( + `[OpenRouterProviderStats] Initial sync complete: ${result.data.length} providers` + ); } else { console.warn(`[OpenRouterProviderStats] Initial sync failed: ${result.error}`); } @@ -332,9 +337,7 @@ function startPeriodicSync(intervalMs?: number): void { */ export function initOpenRouterProviderStatsSync(): boolean { if (!getEffectiveOpenRouterProviderStatsEnabled()) { - console.log( - "[OpenRouterProviderStats] Disabled via OPENROUTER_PROVIDER_STATS_ENABLED=false." - ); + console.log("[OpenRouterProviderStats] Disabled via OPENROUTER_PROVIDER_STATS_ENABLED=false."); return false; } startPeriodicSync(); diff --git a/src/lib/cli-helper/config-generator/opencode.ts b/src/lib/cli-helper/config-generator/opencode.ts index 4081cc32a2..3a5f900826 100644 --- a/src/lib/cli-helper/config-generator/opencode.ts +++ b/src/lib/cli-helper/config-generator/opencode.ts @@ -21,10 +21,11 @@ const CONFIG_PATH = path.join(os.homedir(), ".config", "opencode", "opencode.jso export function assertSafeCatalogUrl(rawUrl: string): URL { const url = parseOutboundUrl(rawUrl); // throws on bad protocol / embedded creds if (isCloudMetadataHost(url.hostname)) { - throw new OutboundUrlGuardError( - "Blocked cloud-metadata catalog URL (SSRF protection)", - { code: "OUTBOUND_URL_GUARD_BLOCKED", url: url.toString(), hostname: url.hostname } - ); + throw new OutboundUrlGuardError("Blocked cloud-metadata catalog URL (SSRF protection)", { + code: "OUTBOUND_URL_GUARD_BLOCKED", + url: url.toString(), + hostname: url.hostname, + }); } // Return the re-parsed URL so callers fetch the validated value (a `new URL()` // round-trip is a recognized request-forgery barrier — clears CodeQL #326). @@ -53,6 +54,9 @@ interface CatalogModelEntry { tool_calling?: boolean; vision?: boolean; }; + /** OpenAI-compatible modality arrays; some upstreams return these. */ + input_modalities?: string[]; + output_modalities?: string[]; } /** Per-model override carried over from the user's existing opencode.json. */ @@ -127,9 +131,7 @@ export async function fetchOmniRouteCatalog( signal: controller.signal, }); if (!response.ok) { - throw new Error( - `OmniRoute /v1/models returned ${response.status} ${response.statusText}` - ); + throw new Error(`OmniRoute /v1/models returned ${response.status} ${response.statusText}`); } const body = (await response.json()) as unknown; const list: unknown[] = Array.isArray(body) @@ -167,6 +169,64 @@ export async function fetchOmniRouteCatalog( * window. The user can override per-model via `limit.context` in their * existing opencode.json, or fix the upstream catalog. */ +/** + * Map catalog capabilities/modalities to OpenCode model capability fields. + * Preserves explicit user-set booleans (including `false`) over any catalog + * value -- a deliberate local restriction must never be overwritten. + * + * Mapping rules per field: + * - `attachment`: explicit user flag; then catalog `capabilities.attachment`; + * then `capabilities.vision`; then `input_modalities` containing `image`. + * - `reasoning`: explicit user flag; then `capabilities.reasoning`. + * - `temperature`: explicit user flag; then `capabilities.temperature`. + * - `tool_call`: explicit user flag; then `capabilities.tool_calling`. + */ +function deriveOpenCodeCapabilities( + catalog: CatalogModelEntry | undefined, + existing: ExistingModelEntry | undefined +): Pick { + const result: Pick = {}; + + // attachment: explicit user flag wins, then catalog attachment, then vision, then image modality. + if (typeof existing?.attachment === "boolean") { + result.attachment = existing.attachment; + } else if (catalog?.capabilities) { + if (typeof catalog.capabilities.attachment === "boolean") { + result.attachment = catalog.capabilities.attachment; + } else if (catalog.capabilities.vision === true) { + result.attachment = true; + } else if ( + Array.isArray(catalog.input_modalities) && + catalog.input_modalities.includes("image") + ) { + result.attachment = true; + } + } + + // reasoning: explicit user flag wins, then catalog reasoning. + if (typeof existing?.reasoning === "boolean") { + result.reasoning = existing.reasoning; + } else if (catalog?.capabilities?.reasoning === true) { + result.reasoning = true; + } + + // temperature: explicit user flag wins, then catalog temperature. + if (typeof existing?.temperature === "boolean") { + result.temperature = existing.temperature; + } else if (catalog?.capabilities?.temperature === true) { + result.temperature = true; + } + + // tool_call: explicit user flag wins, then catalog tool_calling. + if (typeof existing?.tool_call === "boolean") { + result.tool_call = existing.tool_call; + } else if (catalog?.capabilities?.tool_calling === true) { + result.tool_call = true; + } + + return result; +} + function resolveContextLength(entry: CatalogModelEntry): number | undefined { const candidates = [entry.context_length, entry.max_context_window_tokens]; for (const c of candidates) { @@ -196,11 +256,15 @@ function buildModelEntry( const entry: ExistingModelEntry = { name }; - // Round-trip capability flags from the existing config (if any). - for (const flag of ["attachment", "reasoning", "temperature", "tool_call"] as const) { - const value = existing?.[flag]; - if (typeof value === "boolean") entry[flag] = value; - } + // Derive capability flags from the catalog, preserving explicit user overrides. + // Explicit user booleans (including `false`) always win; catalog capabilities + // fill in missing values so newly discovered models are not presented as + // text-only to OpenCode clients. + const caps = deriveOpenCodeCapabilities(catalog, existing); + if (typeof caps.attachment === "boolean") entry.attachment = caps.attachment; + if (typeof caps.reasoning === "boolean") entry.reasoning = caps.reasoning; + if (typeof caps.temperature === "boolean") entry.temperature = caps.temperature; + if (typeof caps.tool_call === "boolean") entry.tool_call = caps.tool_call; // Preserve any extra top-level keys the user set (variants, headers, etc.) // that we don't model explicitly. @@ -219,10 +283,7 @@ function buildModelEntry( // (OpenCode v1 defaults to 128K when `limit.context` is missing.) const userLimit = existing?.limit?.context; const catalogLimit = catalog ? resolveContextLength(catalog) : undefined; - const context = - typeof userLimit === "number" && userLimit > 0 - ? userLimit - : catalogLimit; + const context = typeof userLimit === "number" && userLimit > 0 ? userLimit : catalogLimit; // `limit.output` is REQUIRED by OpenCode's v1 provider schema (configV1). // Use the catalog's max_output_tokens when available; otherwise fall @@ -237,21 +298,18 @@ function buildModelEntry( ? catalog.max_output_tokens : undefined; const output = - typeof userOutput === "number" && userOutput > 0 - ? userOutput - : catalogOutput ?? 8_192; + typeof userOutput === "number" && userOutput > 0 ? userOutput : (catalogOutput ?? 8_192); // Emit `limit` only if we have at least one of context/output. We never // emit a half-baked limit block with only an `output` (would be misleading). - if (typeof context === "number" || typeof userOutput === "number" || typeof catalogOutput === "number") { + if ( + typeof context === "number" || + typeof userOutput === "number" || + typeof catalogOutput === "number" + ) { const limit: { context?: number; input?: number; output?: number } = {}; if (typeof context === "number") limit.context = context; - if (typeof userOutput === "number" || typeof catalogOutput === "number") { - limit.output = - typeof userOutput === "number" && userOutput > 0 - ? userOutput - : catalogOutput ?? 8_192; - } + limit.output = output; const userInput = existing?.limit?.input; if (typeof userInput === "number" && userInput > 0) { limit.input = userInput; @@ -324,9 +382,7 @@ export interface GenerateOpencodeOptions { * - Throws if the catalog fetch fails — the user must fix the upstream * before we can generate a reliable opencode.json. */ -export async function generateOpencodeConfig( - options: GenerateOpencodeOptions -): Promise { +export async function generateOpencodeConfig(options: GenerateOpencodeOptions): Promise { const cleanBase = options.baseUrl.replace(/\/+$/, ""); const baseURL = cleanBase.endsWith("/v1") ? cleanBase : `${cleanBase}/v1`; diff --git a/src/lib/combos/controlCenter.ts b/src/lib/combos/controlCenter.ts index 767840e22b..825f96942c 100644 --- a/src/lib/combos/controlCenter.ts +++ b/src/lib/combos/controlCenter.ts @@ -66,7 +66,7 @@ export interface ComboControlCenterTargetHealth { export interface ComboControlCenterTarget { id: string; - kind: "model" | "combo-ref"; + kind: "model" | "combo-ref" | "provider-wildcard"; index: number; label: string; model: string; @@ -134,6 +134,9 @@ function getStepTags(step: ComboStep): string[] { function getStepLabel(step: ComboStep): string { if (step.label) return step.label; if (step.kind === "combo-ref") return `Combo → ${step.comboName}`; + if (step.kind === "provider-wildcard") { + return `All ${step.providerId}/${step.modelPattern}`; + } return step.model; } @@ -153,12 +156,19 @@ export function getComboControlCenterTargets( } return steps.map((step, index) => { - const model = step.kind === "combo-ref" ? step.comboName : step.model; + const model = + step.kind === "combo-ref" + ? step.comboName + : step.kind === "provider-wildcard" + ? `${step.providerId}/${step.modelPattern}` + : step.model; const healthEntry = healthByStepId.get(step.id) || healthByModel.get(model) || null; const provider = step.kind === "model" ? step.providerId || providerFromModel(step.model) || healthEntry?.provider || null - : null; + : step.kind === "provider-wildcard" + ? step.providerId + : null; return { id: step.id, @@ -167,7 +177,10 @@ export function getComboControlCenterTargets( label: getStepLabel(step), model, provider, - connectionId: step.kind === "model" ? step.connectionId || null : null, + connectionId: + step.kind === "model" || step.kind === "provider-wildcard" + ? step.connectionId || null + : null, weight: step.weight || 0, tags: getStepTags(step), health: healthEntry, @@ -252,7 +265,9 @@ export function summarizeComboControlCenter( strategy: combo.strategy || "priority", isActive: combo.isActive !== false, targetCount: targets.length, - modelTargetCount: targets.filter((target) => target.kind === "model").length, + modelTargetCount: targets.filter( + (target) => target.kind === "model" || target.kind === "provider-wildcard" + ).length, nestedComboCount: targets.filter((target) => target.kind === "combo-ref").length, providerCount: providers.size, totalRequests, diff --git a/src/lib/combos/steps.ts b/src/lib/combos/steps.ts index 0b490e369a..d9f4ea7673 100644 --- a/src/lib/combos/steps.ts +++ b/src/lib/combos/steps.ts @@ -1,3 +1,10 @@ +/** + * @file steps.ts + * @description Combo step normalization helpers for model, combo-ref, provider-wildcard, and routing metadata. + * + * @changes + * - [2026-07-25] [Composer] - Preserve provider-wildcard steps during combo normalization + */ type JsonRecord = Record; export const COMBO_SCHEMA_VERSION = 2; @@ -16,6 +23,7 @@ export interface ComboModelStep { allowedConnectionIds?: string[] | null; weight: number; label?: string; + prompt?: string | null; tags?: string[]; } @@ -27,7 +35,18 @@ export interface ComboRefStep { label?: string; } -export type ComboStep = ComboModelStep | ComboRefStep; +export interface ComboProviderWildcardStep { + id: string; + kind: "provider-wildcard"; + providerId: string; + modelPattern: string; + connectionId?: string | null; + allowedConnectionIds?: string[] | null; + weight: number; + label?: string; +} + +export type ComboStep = ComboModelStep | ComboRefStep | ComboProviderWildcardStep; type ComboCollectionLike = | Array<{ name?: unknown } | string> @@ -102,6 +121,18 @@ function parseProviderId(model: string): string | null { return providerId.length > 0 ? providerId : null; } +function parseProviderWildcardPattern( + target: string +): { providerId: string; modelPattern: string } | null { + const trimmed = target.trim(); + const slashIndex = trimmed.indexOf("/"); + if (slashIndex <= 0) return null; + const providerId = trimmed.slice(0, slashIndex).trim(); + const modelPattern = trimmed.slice(slashIndex + 1).trim(); + if (!providerId || !modelPattern.includes("*")) return null; + return { providerId, modelPattern }; +} + function toFullModelString(model: string, providerId?: string | null): string { const trimmedModel = model.trim(); if (trimmedModel.includes("/")) return trimmedModel; @@ -123,12 +154,9 @@ function buildStepId( index: number, seed: string ) { - const parts = [ - slugify(comboName || "combo"), - kind === "combo-ref" ? "ref" : "model", - String(index + 1), - slugify(seed), - ]; + const kindSlug = + kind === "combo-ref" ? "ref" : kind === "provider-wildcard" ? "wildcard" : "model"; + const parts = [slugify(comboName || "combo"), kindSlug, String(index + 1), slugify(seed)]; return parts.join("-").slice(0, 200); } @@ -186,6 +214,11 @@ export function getComboStepTarget( if (!isRecord(value)) return null; if (value.kind === "combo-ref") return toTrimmedString(value.comboName); + if (value.kind === "provider-wildcard") { + const providerId = toTrimmedString(value.providerId); + const modelPattern = toTrimmedString(value.modelPattern) || "*"; + return providerId ? `${providerId}/${modelPattern}` : null; + } const rawModel = toTrimmedString(value.model); if (!rawModel) return null; @@ -222,6 +255,22 @@ export function normalizeComboStep( }; } + const wildcardPattern = parseProviderWildcardPattern(target); + if (wildcardPattern) { + return { + id: buildStepId( + "provider-wildcard", + comboName, + index, + `${wildcardPattern.providerId}/${wildcardPattern.modelPattern}` + ), + kind: "provider-wildcard", + providerId: wildcardPattern.providerId, + modelPattern: wildcardPattern.modelPattern, + weight: 0, + }; + } + const providerId = parseProviderId(target); return { id: buildStepId("model", comboName, index, target), @@ -237,6 +286,7 @@ export function normalizeComboStep( const explicitId = toTrimmedString(value.id); const weight = toWeight(value.weight); const label = toTrimmedString(value.label); + const prompt = toTrimmedString(value.prompt); if (value.kind === "combo-ref") { const comboRefName = toTrimmedString(value.comboName); @@ -250,6 +300,41 @@ export function normalizeComboStep( }; } + if (value.kind === "provider-wildcard") { + const providerId = + toTrimmedString(value.providerId) || + toTrimmedString(value.provider) || + parseProviderId(toTrimmedString(value.model) || ""); + if (!providerId) return null; + const modelPattern = toTrimmedString(value.modelPattern) || "*"; + const connectionId = + value.connectionId === null ? null : toTrimmedString(value.connectionId) || undefined; + const allowedConnectionIds = Array.isArray(value.allowedConnectionIds) + ? value.allowedConnectionIds + .map((connId) => toTrimmedString(connId)) + .filter((connId): connId is string => !!connId) + : undefined; + return { + id: + explicitId || + buildStepId( + "provider-wildcard", + comboName, + index, + connectionId + ? `${providerId}/${modelPattern}:${connectionId}` + : `${providerId}/${modelPattern}` + ), + kind: "provider-wildcard", + providerId, + modelPattern, + ...(connectionId !== undefined ? { connectionId } : {}), + weight, + ...(label ? { label } : {}), + ...(allowedConnectionIds && allowedConnectionIds.length > 0 ? { allowedConnectionIds } : {}), + }; + } + const rawModel = toTrimmedString(value.model); if (!rawModel) return null; const isExplicitModel = value.kind === "model"; @@ -259,6 +344,36 @@ export function normalizeComboStep( toTrimmedString(value.provider) || parseProviderId(rawModel); + const wildcardPattern = parseProviderWildcardPattern(rawModel); + if (wildcardPattern) { + const connectionId = + value.connectionId === null ? null : toTrimmedString(value.connectionId) || undefined; + const allowedConnectionIds = Array.isArray(value.allowedConnectionIds) + ? value.allowedConnectionIds + .map((connId) => toTrimmedString(connId)) + .filter((connId): connId is string => !!connId) + : undefined; + return { + id: + explicitId || + buildStepId( + "provider-wildcard", + comboName, + index, + connectionId + ? `${wildcardPattern.providerId}/${wildcardPattern.modelPattern}:${connectionId}` + : `${wildcardPattern.providerId}/${wildcardPattern.modelPattern}` + ), + kind: "provider-wildcard", + providerId: wildcardPattern.providerId, + modelPattern: wildcardPattern.modelPattern, + ...(connectionId !== undefined ? { connectionId } : {}), + weight, + ...(label ? { label } : {}), + ...(allowedConnectionIds && allowedConnectionIds.length > 0 ? { allowedConnectionIds } : {}), + }; + } + if (!isExplicitModel && shouldTreatAsComboRef(rawModel, providerId, options)) { return { id: explicitId || buildStepId("combo-ref", comboName, index, rawModel), @@ -291,6 +406,7 @@ export function normalizeComboStep( ...(connectionId !== undefined ? { connectionId } : {}), weight, ...(label ? { label } : {}), + ...(prompt ? { prompt } : {}), ...(tags && tags.length > 0 ? { tags } : {}), ...(allowedConnectionIds && allowedConnectionIds.length > 0 ? { allowedConnectionIds } : {}), }; diff --git a/src/lib/copilot/commandClassification.ts b/src/lib/copilot/commandClassification.ts new file mode 100644 index 0000000000..724199cc76 --- /dev/null +++ b/src/lib/copilot/commandClassification.ts @@ -0,0 +1,78 @@ +/** + * Command classification for runOmniRouteCli approval gate (#8461). + * + * Defines a classification table mapping CLI subcommand patterns to safety + * categories, plus the classifier function. Read-only commands execute + * directly; all others are blocked with a warning asserting operator intent. + * Unknown commands are denied by default (no matching rule → blocked). + */ + +export type CommandCategory = + | "read-only" + | "mutating" + | "destructive" + | "secret-affecting"; + +export interface ClassificationRule { + pattern: RegExp; + category: CommandCategory; + reason: string; +} + +const CLASSIFICATION_RULES: ClassificationRule[] = [ + // ── Destructive (highest priority) ── + { + pattern: /\b(?:delete|remove|rm|drop|uninstall|reset)\b/i, + category: "destructive", + reason: + "This operation permanently removes or resets data and cannot be undone.", + }, + + // ── Secret-affecting ── + { + pattern: + /\b(?:show.*(?:secret|key|token|credential)|key.*show|export|auth.*token)\b/i, + category: "secret-affecting", + reason: + "This operation may expose secrets or credentials in the output.", + }, + + // ── Mutating ── + { + pattern: + /\b(?:set|create|add|update|config\s+set|config\s+unset|providers?\s+add|keys?\s+create|keys?\s+revoke|settings?\s+update)\b/i, + category: "mutating", + reason: + "This operation changes configuration or creates resources.", + }, + + // ── Read-only (lowest priority — checked last) ── + { + pattern: + /\b(?:status|doctor|health|version|help|list|show|get|config\s+list|providers?\s+list|keys?\s+list|logs|models?)\b/i, + category: "read-only", + reason: + "This operation only reads data and does not make changes.", + }, +]; + +/** + * Classify a CLI command argv array into a category and matching rule. + * Iterates rules in priority order (destructive → secret-affecting → + * mutating → read-only). Returns null when no rule matches (unknown + * command — denied by default). + */ +export function classifyCommand(argv: string[]): { + category: CommandCategory; + rule: ClassificationRule; +} | null { + const cmdLine = argv.join(" "); + + for (const rule of CLASSIFICATION_RULES) { + if (rule.pattern.test(cmdLine)) { + return { category: rule.category, rule }; + } + } + + return null; +} diff --git a/src/lib/copilot/tools.ts b/src/lib/copilot/tools.ts index 2ebf72e2da..a4bc59321c 100644 --- a/src/lib/copilot/tools.ts +++ b/src/lib/copilot/tools.ts @@ -10,6 +10,7 @@ import { promisify } from "node:util"; import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; const execFileAsync = promisify(execFile); +import { classifyCommand } from "./commandClassification"; import { createCombo, getCombos, updateCombo } from "@/lib/db/combos"; import { getProviderConnections } from "@/lib/db/providers"; import { createApiKey, revokeApiKey, getApiKeys } from "@/lib/db/apiKeys"; @@ -390,6 +391,16 @@ export const COPILOT_TOOLS: CopilotTool[] = [ const argv = (trimmedCmd.match(/(?:[^\s"']+|"[^"]*"|'[^']*')+/g) || []).map((arg) => arg.replace(/^["']|["']$/g, "") ); + + // 🔒 Approval gate: classify command before executing + const classified = classifyCommand(argv); + if (!classified) { + return `Command \`${trimmedCmd}\` is not recognized and cannot be executed. Use an allowed command or rephrase your request.`; + } + if (classified.category !== "read-only") { + return `⚠️ **${classified.category.toUpperCase()}** command blocked: \`${trimmedCmd}\`\n${classified.rule.reason}\n\nThis command was not executed. If you need to run it, please use the terminal directly.`; + } + const { stdout } = await execFileAsync(cliPath, argv, { encoding: "utf-8", timeout: 30000, diff --git a/src/lib/credentialHealth/scheduler.ts b/src/lib/credentialHealth/scheduler.ts index fb5d7a6d31..fa4d78614d 100644 --- a/src/lib/credentialHealth/scheduler.ts +++ b/src/lib/credentialHealth/scheduler.ts @@ -45,6 +45,12 @@ declare global { sweepInProgress: boolean; /** Track consecutive scheduler failures per connection for backoff */ failureCounts: Map; + /** + * Per-connection timing for time-based backoff retry. + * `nextAttemptAt` is the earliest timestamp (ms) at which the connection + * should be tested again. Absent entry = never tested or healthy = due now. + */ + perConnTiming: Map; } | undefined; } @@ -56,6 +62,7 @@ function getSchedulerState() { sweepTimer: null, sweepInProgress: false, failureCounts: new Map(), + perConnTiming: new Map(), }; } return globalThis.__omnirouteCredentialHC; @@ -120,8 +127,9 @@ async function testConnection( const state = getSchedulerState(); if (result.valid) { - // Success — reset failure count, update cache + // Success — reset failure count + timing, update cache state.failureCounts.delete(connectionId); + state.perConnTiming.delete(connectionId); setCredentialHealth( connectionId, provider, @@ -139,9 +147,14 @@ async function testConnection( timestamp: Date.now(), }); } else { - // Failure — increment failure count, update cache with error + // Failure — increment failure count, update cache with error, set retry timing const currentFailures = (state.failureCounts.get(connectionId) ?? 0) + 1; state.failureCounts.set(connectionId, currentFailures); + const nextBackoff = getNextBackoff(connectionId); + state.perConnTiming.set(connectionId, { + lastAttemptAt: startTime, + nextAttemptAt: Date.now() + nextBackoff, + }); const diagnosis = result.diagnosis as { type?: string; source?: string } | undefined; @@ -179,6 +192,11 @@ async function testConnection( const currentFailures = (state.failureCounts.get(connectionId) ?? 0) + 1; state.failureCounts.set(connectionId, currentFailures); + const nextBackoff = getNextBackoff(connectionId); + state.perConnTiming.set(connectionId, { + lastAttemptAt: startTime, + nextAttemptAt: Date.now() + nextBackoff, + }); setCredentialHealth(connectionId, provider, "error", message); @@ -200,7 +218,9 @@ export async function sweep(): Promise { state.sweepInProgress = true; try { - // Get all provider connections (API-key + OAuth) + // Get active provider connections only (API-key + OAuth). Disabled + // connections are excluded from routing and must not consume health-check + // concurrency or delay the scheduler with avoidable upstream timeouts. let connections: Array<{ id: string; provider: string; @@ -208,7 +228,7 @@ export async function sweep(): Promise { }>; try { - const raw = await getProviderConnections({}); + const raw = await getProviderConnections({ isActive: true }); connections = (Array.isArray(raw) ? raw : []).filter( (conn: any) => conn && conn.id && (conn.authType === "apikey" || conn.authType === "oauth") ) as Array<{ @@ -228,13 +248,12 @@ export async function sweep(): Promise { const interval = getSweepInterval(); const dueConnections = connections.filter((conn) => { - const isOAuth = conn.authType === "oauth"; - const connInterval = isOAuth ? interval * OAUTH_INTERVAL_MULTIPLIER : interval; - const backoff = getNextBackoff(conn.id); - const effectiveInterval = Math.max(connInterval, backoff); - // If we don't have a failure count, it hasn't been tested this session const state_ = getSchedulerState(); - return !state_.failureCounts.has(conn.id) || effectiveInterval <= interval; + const timing = state_.perConnTiming.get(conn.id); + // No timing entry = never tested or healthy → due now + if (!timing) return true; + // Time-based: due when the current time has passed the next attempt time + return now >= timing.nextAttemptAt; }); if (dueConnections.length === 0) return; @@ -266,10 +285,10 @@ function scheduleSweep(): void { if (!state.initialized) return; if (state.sweepTimer) clearTimeout(state.sweepTimer); - const maxFailures = getMaxFailuresAcrossConnections(); - const baseInterval = getSweepInterval(); - const backoffInterval = BACKOFF_SCHEDULE[Math.min(maxFailures, BACKOFF_SCHEDULE.length - 1)]; - const interval = Math.max(baseInterval, backoffInterval); + // Use a stable sweep interval — per-connection retry timing is now managed + // independently via perConnTiming, so one failed connection should not delay + // the global sweep for all connections. + const interval = getSweepInterval(); state.sweepTimer = setTimeout(sweep, interval); } diff --git a/src/lib/db/adapters/bunSqliteAdapter.ts b/src/lib/db/adapters/bunSqliteAdapter.ts index 8739c7407e..13a5d876ee 100644 --- a/src/lib/db/adapters/bunSqliteAdapter.ts +++ b/src/lib/db/adapters/bunSqliteAdapter.ts @@ -129,7 +129,7 @@ export function createBunSqliteAdapter(db: BunSqliteDatabaseLike, filePath: stri try { db.exec("PRAGMA wal_checkpoint(TRUNCATE)"); } catch {} - fs.copyFileSync(filePath, destination); + await fs.promises.copyFile(filePath, destination); }, checkpoint(mode = "TRUNCATE"): void { diff --git a/src/lib/db/adapters/nodeSqliteShared.ts b/src/lib/db/adapters/nodeSqliteShared.ts index 93b0811440..6366f00dca 100644 --- a/src/lib/db/adapters/nodeSqliteShared.ts +++ b/src/lib/db/adapters/nodeSqliteShared.ts @@ -168,7 +168,7 @@ export function createNodeSqliteAdapterFromDatabase( try { db.exec("PRAGMA wal_checkpoint(TRUNCATE)"); } catch {} - fs.copyFileSync(filePath, destination); + await fs.promises.copyFile(filePath, destination); }, checkpoint(mode = "TRUNCATE"): void { try { diff --git a/src/lib/db/adapters/sqljsAdapter.ts b/src/lib/db/adapters/sqljsAdapter.ts index ba73825675..42abd2158a 100644 --- a/src/lib/db/adapters/sqljsAdapter.ts +++ b/src/lib/db/adapters/sqljsAdapter.ts @@ -288,7 +288,7 @@ export async function createSqlJsAdapter(filePath: string): Promise { if (dirty) persist(); - if (filePath !== ":memory:") fs.copyFileSync(filePath, destination); + if (filePath !== ":memory:") await fs.promises.copyFile(filePath, destination); }, checkpoint(_mode = "TRUNCATE"): void { diff --git a/src/lib/db/agentBridgeMappings.ts b/src/lib/db/agentBridgeMappings.ts index beaca51521..612648a205 100644 --- a/src/lib/db/agentBridgeMappings.ts +++ b/src/lib/db/agentBridgeMappings.ts @@ -45,9 +45,10 @@ export function setMappings( export function deleteMapping(agentId: string, source: string): void { const db = getDbInstance(); - db.prepare( - "DELETE FROM agent_bridge_mappings WHERE agent_id = ? AND source_model = ?" - ).run(agentId, source); + db.prepare("DELETE FROM agent_bridge_mappings WHERE agent_id = ? AND source_model = ?").run( + agentId, + source + ); } /** diff --git a/src/lib/db/apiKeys.ts b/src/lib/db/apiKeys.ts index 2fd4114622..0b43e699a9 100644 --- a/src/lib/db/apiKeys.ts +++ b/src/lib/db/apiKeys.ts @@ -1460,28 +1460,22 @@ export async function isModelAllowedForKey( } } - // Empty array means all models allowed - if (!allowedModels || allowedModels.length === 0) { - return true; - } - - let allowed = false; - - // Check if model matches each allowed pattern // Support exact match and prefix match (e.g., "openai/*" allows all OpenAI models) - for (const pattern of allowedModels) { - if (modelPatternMatches(pattern, modelPermissionCandidates)) { - allowed = true; - break; - } - } + let allowed = + !allowedModels || + allowedModels.length === 0 || + allowedModels.some((pattern) => modelPatternMatches(pattern, modelPermissionCandidates)); - // If key belongs to groups, also check group-level permissions + // Extract model target and optional provider prefix if present (e.g. "openai/gpt-4" -> modelTarget: "gpt-4", provider: "openai") + const hasProviderPrefix = modelId?.includes("/"); + const provider = hasProviderPrefix ? modelId.split("/")[0] : undefined; + const modelTarget = hasProviderPrefix ? modelId.split("/").slice(1).join("/") : modelId || ""; + + // If key belongs to groups, check both modelTarget and full modelId against group rules if (metadata.id) { - const groupAccess = checkKeyModelAccess(metadata.id, modelId || ""); - if (!groupAccess.allowed) { - allowed = false; - } + const targetOk = checkKeyModelAccess(metadata.id, modelTarget, provider).allowed; + const fullOk = checkKeyModelAccess(metadata.id, modelId || "", provider).allowed; + if (!targetOk || !fullOk) allowed = false; } // Cache the result if (!usesSettingDependentClaudeRouting) { diff --git a/src/lib/db/ccrBlocks.ts b/src/lib/db/ccrBlocks.ts new file mode 100644 index 0000000000..56d49c131a --- /dev/null +++ b/src/lib/db/ccrBlocks.ts @@ -0,0 +1,143 @@ +/** + * Durable second tier for the CCR block store (#9061). + * + * The CCR engine's in-process `Map` stays the hot cache; this module is what makes its + * promise survive an eviction, a TTL sweep, a restart, or a retrieve that lands on + * another instance. Every function here is best-effort: the caller treats a throw as + * "not durable this time", never as a request failure. + */ +import { getDbInstance } from "./core"; + +export interface CcrBlockRow { + principalId: string; + hash: string; + content: string; + bytes: number; + chars: number; + lines: number; + contentType: string; + source: string; + createdAt: number; + lastAccessedAt: number; + expiresAt: number; +} + +interface CcrBlockDbRow { + content: string; + bytes: number; + chars: number; + lines: number; + content_type: string; + source: string; + created_at: number; + last_accessed_at: number; + expires_at: number; +} + +/** + * Writes older than this are not worth a prune scan on every call. + * ponytail: counter-based throttle, swap for a scheduled sweep if the table ever grows + * fast enough that 200 writes of drift matters. + */ +const PRUNE_EVERY_N_WRITES = 200; +let writesSincePrune = 0; + +export function persistCcrBlock(row: CcrBlockRow): void { + const db = getDbInstance(); + db.prepare( + `INSERT OR REPLACE INTO ccr_blocks ( + principal_id, hash, content, bytes, chars, lines, + content_type, source, created_at, last_accessed_at, expires_at + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` + ).run( + row.principalId, + row.hash, + row.content, + row.bytes, + row.chars, + row.lines, + row.contentType, + row.source, + row.createdAt, + row.lastAccessedAt, + row.expiresAt + ); + + if (++writesSincePrune >= PRUNE_EVERY_N_WRITES) { + writesSincePrune = 0; + pruneExpiredCcrBlocks(Date.now()); + } +} + +/** Returns the block only while it is unexpired; an expired row is deleted and read as a miss. */ +export function loadCcrBlock(principalId: string, hash: string, now: number): CcrBlockRow | null { + const db = getDbInstance(); + const row = db + .prepare( + `SELECT content, bytes, chars, lines, content_type, source, + created_at, last_accessed_at, expires_at + FROM ccr_blocks WHERE principal_id = ? AND hash = ?` + ) + .get(principalId, hash) as CcrBlockDbRow | undefined; + + if (!row) return null; + if (row.expires_at <= now) { + deleteCcrBlockRow(principalId, hash); + return null; + } + + return { + principalId, + hash, + content: row.content, + bytes: row.bytes, + chars: row.chars, + lines: row.lines, + contentType: row.content_type, + source: row.source, + createdAt: row.created_at, + lastAccessedAt: row.last_accessed_at, + expiresAt: row.expires_at, + }; +} + +export function touchCcrBlock(principalId: string, hash: string, lastAccessedAt: number): void { + getDbInstance() + .prepare(`UPDATE ccr_blocks SET last_accessed_at = ? WHERE principal_id = ? AND hash = ?`) + .run(lastAccessedAt, principalId, hash); +} + +export function deleteCcrBlockRow(principalId: string, hash: string): void { + getDbInstance() + .prepare(`DELETE FROM ccr_blocks WHERE principal_id = ? AND hash = ?`) + .run(principalId, hash); +} + +/** + * Drops every durable block. Mirrors the engine's `resetCcrStore()` so that "reset" keeps + * meaning reset once the store has a second tier. + */ +export function deleteAllCcrBlocks(): void { + getDbInstance().prepare(`DELETE FROM ccr_blocks`).run(); +} + +/** Drops every block whose TTL has passed. Returns how many rows went. */ +export function pruneExpiredCcrBlocks(now: number): number { + const result = getDbInstance().prepare(`DELETE FROM ccr_blocks WHERE expires_at <= ?`).run(now); + return result.changes ?? 0; +} + +export function countCcrBlocks(principalId?: string): number { + const db = getDbInstance(); + const row = ( + principalId === undefined + ? db.prepare(`SELECT COUNT(*) AS n FROM ccr_blocks`).get() + : db.prepare(`SELECT COUNT(*) AS n FROM ccr_blocks WHERE principal_id = ?`).get(principalId) + ) as { n: number } | undefined; + return row?.n ?? 0; +} + +/** Test seam: the write throttle is module state and has to be resettable between tests. */ +export function resetCcrBlockPruneCounter(): void { + writesSincePrune = 0; +} diff --git a/src/lib/db/cleanup.ts b/src/lib/db/cleanup.ts index fc866800b3..20d0358ce4 100644 --- a/src/lib/db/cleanup.ts +++ b/src/lib/db/cleanup.ts @@ -370,6 +370,29 @@ export async function cleanupCompressionRunTelemetry(): Promise { return result; } +/** + * Clean up expired CCR blocks (#9061). + * + * Unlike the tables above, these rows carry their own expiry: the engine writes + * `expires_at` from the block's TTL, so this needs no retention-days setting of its own. + * It is the same sweep the engine does opportunistically, run on the operator's schedule + * so the table cannot sit on rows nobody will read again. + */ +export async function cleanupCcrBlocks(): Promise { + const result: CleanupResult = { deleted: 0, errors: 0 }; + + try { + const { pruneExpiredCcrBlocks } = await import("./ccrBlocks"); + result.deleted = pruneExpiredCcrBlocks(Date.now()); + console.log(`[Cleanup] Deleted ${result.deleted} expired ccr_blocks`); + } catch (err: unknown) { + console.error("[Cleanup] Error cleaning ccr_blocks:", err); + result.errors++; + } + + return result; +} + /** * Run all cleanup functions if auto-cleanup is enabled. */ @@ -401,6 +424,7 @@ export async function runAutoCleanup(): Promise<{ xpAuditLog: await cleanupXpAuditLog(), compressionRunTelemetry: await cleanupCompressionRunTelemetry(), proxyLogs: await cleanupProxyLogs(), + ccrBlocks: await cleanupCcrBlocks(), }; const totalDeleted = Object.values(results).reduce((sum, r) => sum + r.deleted, 0); diff --git a/src/lib/db/combos.ts b/src/lib/db/combos.ts index 4d48a106f1..6cdebbd85b 100644 --- a/src/lib/db/combos.ts +++ b/src/lib/db/combos.ts @@ -1,359 +1,91 @@ /** - * db/combos.js — Combo CRUD operations. + * Compatibility facade for combo persistence. + * + * Application code keeps the existing function-level API while persistence is + * delegated through the domain repository contract. Cross-cutting write effects + * remain here instead of becoming part of the portable repository surface. */ -import { v4 as uuidv4 } from "uuid"; -import { getDbInstance } from "./core"; +import type { ComboRecord } from "@/domain/persistence/comboRepositories"; import { backupDbFile } from "./backup"; +import { clearSessionModelHistoryForCombo } from "./contextHandoffs"; +import { getDbInstance } from "./core"; import { invalidateDbCache } from "./readCache"; import { invalidateReasoningRoutingRuleCache } from "./reasoningRoutingRules"; -import { normalizeComboRecord } from "@/lib/combos/steps"; -import { clearSessionModelHistoryForCombo } from "./contextHandoffs"; -import { validateComboInvariant } from "@/lib/combos/invariants"; +import { routingConfigRepositories } from "./repositories/routingConfigRepositories"; -type JsonRecord = Record; +const repository = routingConfigRepositories.combos; -function asRecord(value: unknown): JsonRecord { - return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {}; -} - -function getSerializedData(value: unknown): string | null { - const row = asRecord(value); - return typeof row.data === "string" ? row.data : null; -} - -function getSortOrder(value: unknown): number | null { - const row = asRecord(value); - return typeof row.sort_order === "number" ? row.sort_order : null; -} - -function withSortOrder(payload: string, sortOrder: number | null): JsonRecord { - const parsed = JSON.parse(payload) as JsonRecord; - if (typeof sortOrder === "number") { - parsed.sortOrder = sortOrder; - } - return parsed; -} - -function getComboNameSet( - db: ReturnType, - extraNames: string[] = [] -): Set { - const rows = db.prepare("SELECT name FROM combos").all(); - const names = new Set(); - - for (const row of rows) { - const record = asRecord(row); - if (typeof record.name === "string" && record.name.trim().length > 0) { - names.add(record.name.trim()); - } - } - - for (const name of extraNames) { - if (typeof name === "string" && name.trim().length > 0) { - names.add(name.trim()); - } - } - - return names; -} - -function normalizeStoredCombo( - combo: JsonRecord, - db: ReturnType, - extraNames: string[] = [] -): JsonRecord { - return normalizeComboRecord(combo, { - allCombos: getComboNameSet(db, extraNames), - }) as JsonRecord; -} - -function parseComboRow(row: unknown): JsonRecord | null { - const payload = getSerializedData(row); - if (!payload) return null; - const parsed = withSortOrder(payload, getSortOrder(row)); - // Merge deduplicated column values back into the record - const record = asRecord(row); - if (record.context_cache_protection !== undefined && record.context_cache_protection !== null) { - // Column is authoritative when explicitly enabled (1). - // When column is 0 (unset default) preserve the JSON blob value - // to avoid silently disabling the feature on pre-migration rows. - if (record.context_cache_protection === 1) { - parsed.context_cache_protection = true; - } - // Column is 0 — keep existing JSON blob value - } - return parsed; -} - -function getNextSortOrder() { - const db = getDbInstance(); - const row = db.prepare("SELECT COALESCE(MAX(sort_order), 0) AS sort_order FROM combos").get(); - const sortOrder = getSortOrder(row); - return (sortOrder ?? 0) + 1; -} - -export async function getCombos(limit?: number, offset?: number) { - const db = getDbInstance(); - let sql = - "SELECT id, data, sort_order, context_cache_protection FROM combos ORDER BY sort_order ASC, name COLLATE NOCASE ASC"; - const params: unknown[] = []; - if (limit !== undefined) { - sql += " LIMIT ? OFFSET ?"; - params.push(limit, offset ?? 0); - } - const rawCombos = db - .prepare(sql) - .all(...params) - .map((row) => parseComboRow(row)) - .filter((row): row is JsonRecord => row !== null); - - const comboNames = rawCombos - .map((combo) => (typeof combo.name === "string" ? combo.name.trim() : "")) - .filter((name): name is string => name.length > 0); - - return rawCombos.map((combo) => - normalizeComboRecord(combo, { - allCombos: comboNames, - }) - ); +export function getCombos(limit?: number, offset?: number): Promise { + return repository.list(limit, offset); } +/** Keep the existing synchronous facade contract while repository APIs become async. */ export function getCombosCount(): number { - const db = getDbInstance(); - const row = db.prepare("SELECT count(*) as cnt FROM combos").get() as { cnt: number }; - return row.cnt; + return routingConfigRepositories.legacySync.getCombosCount(); } -export async function getComboById(id: string) { - const db = getDbInstance(); - const row = db - .prepare("SELECT data, sort_order, context_cache_protection FROM combos WHERE id = ?") - .get(id); - const combo = parseComboRow(row); - if (!combo) return null; - return normalizeStoredCombo(combo, db, typeof combo.name === "string" ? [combo.name] : []); +export function getComboById(id: string): Promise { + return repository.findById(id); } -export async function getComboByName(name: string) { - const db = getDbInstance(); - const row = db - .prepare("SELECT data, sort_order, context_cache_protection FROM combos WHERE name = ?") - .get(name); - const combo = parseComboRow(row); - if (!combo) return null; - return normalizeStoredCombo(combo, db, [name]); +export function getComboByName(name: string): Promise { + return repository.findByName(name); } -// #4446: case-insensitive name lookup. The opencode dispatch path forwards a -// lowercased combo slug (e.g. "master-light") for a combo provisioned as -// "MASTER-LIGHT"; the default BINARY collation of getComboByName misses it. -// Used only as a fallback after the exact match fails, so it cannot change the -// resolution of any combo that already resolves today. -export async function getComboByNameInsensitive(name: string) { - const db = getDbInstance(); - const row = db - .prepare( - "SELECT data, sort_order, context_cache_protection FROM combos WHERE name = ? COLLATE NOCASE" - ) - .get(name); - const combo = parseComboRow(row); - if (!combo) return null; - const storedName = typeof combo.name === "string" ? combo.name : name; - return normalizeStoredCombo(combo, db, [storedName]); +export function getComboByNameInsensitive(name: string): Promise { + return repository.findByNameInsensitive(name); } -export async function createCombo(data: JsonRecord) { - const db = getDbInstance(); - const now = new Date().toISOString(); - const sortOrder = typeof data.sortOrder === "number" ? data.sortOrder : getNextSortOrder(); - const comboId = typeof data.id === "string" && data.id.trim().length > 0 ? data.id : uuidv4(); - const combo = normalizeStoredCombo( - { - ...data, - id: comboId, - name: data.name, - models: data.models || [], - strategy: data.strategy || "priority", - config: data.config || {}, - isHidden: Boolean(data.isHidden), - sortOrder, - createdAt: now, - updatedAt: now, - }, - db, - typeof data.name === "string" ? [data.name] : [] - ); - - validateComboInvariant(combo); - const contextCache = data.context_cache_protection ? 1 : 0; - db.prepare( - "INSERT INTO combos (id, name, data, sort_order, created_at, updated_at, context_cache_protection) VALUES (?, ?, ?, ?, ?, ?, ?)" - ).run(combo.id, combo.name, JSON.stringify(combo), sortOrder, now, now, contextCache); - +export async function createCombo(data: ComboRecord): Promise { + const combo = await repository.create(data); invalidateDbCache("combos"); backupDbFile("pre-write"); return combo; } -export async function updateCombo(id: string, data: JsonRecord) { - const db = getDbInstance(); - const existing = db - .prepare("SELECT data, sort_order, context_cache_protection FROM combos WHERE id = ?") - .get(id); - if (!existing) return null; +export async function updateCombo(id: string, data: ComboRecord): Promise { + const result = await repository.update(id, data); + if (!result) return null; - const current = parseComboRow(existing); - if (!current) return null; - const sortOrder = - typeof data.sortOrder === "number" - ? data.sortOrder - : typeof current.sortOrder === "number" - ? current.sortOrder - : getNextSortOrder(); - const merged: JsonRecord = { - ...current, - ...data, - sortOrder, - updatedAt: new Date().toISOString(), - }; - // Remove fields explicitly set to null (for deletion support) - for (const key of Object.keys(data)) { - if (data[key] === null) { - delete merged[key]; - } - } - const currentName = typeof current.name === "string" ? current.name : ""; - const nextName = - typeof merged["name"] === "string" && merged["name"].trim().length > 0 - ? merged["name"] - : currentName; - const normalizedMerged = normalizeStoredCombo({ ...merged, name: nextName }, db, [nextName]); - validateComboInvariant({ - ...normalizedMerged, - ...data, - name: nextName, - models: normalizedMerged.models, - }); - const contextCacheProtection = normalizedMerged.context_cache_protection ? 1 : 0; - - db.prepare( - "UPDATE combos SET name = ?, data = ?, sort_order = ?, updated_at = ?, context_cache_protection = ? WHERE id = ?" - ).run( - nextName, - JSON.stringify(normalizedMerged), - sortOrder, - normalizedMerged.updatedAt, - contextCacheProtection, - id - ); - - // Invalidate stale context-cache pins when combo targets change. - // Without this, sessions pinned to removed models keep routing there forever. - if (data.models !== undefined) { - const cleared = clearSessionModelHistoryForCombo(currentName); - if (cleared > 0) { - // Also clear under the new name if the combo was renamed - if (nextName !== currentName) { - clearSessionModelHistoryForCombo(nextName); - } + if (result.modelsFieldProvided) { + const cleared = clearSessionModelHistoryForCombo(result.previousName); + if (cleared > 0 && result.currentName !== result.previousName) { + clearSessionModelHistoryForCombo(result.currentName); } } invalidateDbCache("combos"); backupDbFile("pre-write"); - return normalizedMerged; + return result.combo; } -export async function reorderCombos(comboIds: string[]) { - const db = getDbInstance(); - const rows = db - .prepare( - "SELECT id, name, data, sort_order FROM combos ORDER BY sort_order ASC, name COLLATE NOCASE ASC" - ) - .all(); - if (rows.length === 0) return []; - - const existingIds = new Set( - rows - .map((row) => { - const record = asRecord(row); - return typeof record.id === "string" ? record.id : null; - }) - .filter((id): id is string => id !== null) - ); - - const seen = new Set(); - const requestedIds = comboIds.filter((id) => { - if (!existingIds.has(id) || seen.has(id)) return false; - seen.add(id); - return true; - }); - - const orderedIds = [ - ...requestedIds, - ...rows - .map((row) => { - const record = asRecord(row); - return typeof record.id === "string" ? record.id : null; - }) - .filter((id): id is string => id !== null && !seen.has(id)), - ]; - - const update = db.prepare( - "UPDATE combos SET data = ?, sort_order = ?, updated_at = ? WHERE id = ?" - ); - const now = new Date().toISOString(); - const rowById = new Map( - rows.map((row) => { - const record = asRecord(row); - return [String(record.id), row]; - }) - ); - const comboNames = rows - .map((row) => { - const combo = parseComboRow(row); - return combo && typeof combo.name === "string" ? combo.name.trim() : ""; - }) - .filter((name): name is string => name.length > 0); - - const reorderTransaction = db.transaction(() => { - orderedIds.forEach((id, index) => { - const row = rowById.get(id); - const combo = row ? parseComboRow(row) : null; - if (!combo) return; - const sortOrder = index + 1; - const updatedCombo = normalizeComboRecord( - { ...combo, sortOrder, updatedAt: now }, - { allCombos: comboNames } - ); - update.run(JSON.stringify(updatedCombo), sortOrder, now, id); - }); - }); - - reorderTransaction(); - invalidateDbCache("combos"); - backupDbFile("pre-write"); - return getCombos(); +export async function reorderCombos(comboIds: string[]): Promise { + const result = await repository.reorder(comboIds); + if (result.rowsReordered > 0) { + invalidateDbCache("combos"); + backupDbFile("pre-write"); + } + return result.combos; } -export async function deleteCombo(id: string) { - const db = getDbInstance(); - const result = db.prepare("DELETE FROM combos WHERE id = ?").run(id); - if (result.changes === 0) return false; +export async function deleteCombo(id: string): Promise { + const deleted = await repository.deleteById(id); + if (!deleted) return false; + invalidateDbCache("combos"); invalidateReasoningRoutingRuleCache(); backupDbFile("pre-write"); return true; } -export async function deleteComboByName(name: string) { - const combo = await getComboByName(name); +export async function deleteComboByName(name: string): Promise { + const combo = await repository.findByName(name); if (!combo || typeof combo.id !== "string") return false; return deleteCombo(combo.id); } -export function setActiveCombo(name: string, db = getDbInstance()) { +export function setActiveCombo(name: string, db = getDbInstance()): void { db.prepare( "INSERT OR REPLACE INTO key_value (namespace, key, value) VALUES ('settings', 'activeCombo', ?)" ).run(JSON.stringify(name)); diff --git a/src/lib/db/connectionRuntimeState.ts b/src/lib/db/connectionRuntimeState.ts new file mode 100644 index 0000000000..380d6680cc --- /dev/null +++ b/src/lib/db/connectionRuntimeState.ts @@ -0,0 +1,92 @@ +import { getDbInstance } from "./core"; + +export interface ConnectionRuntimeState { + connectionId: string; + refreshCircuitStreak: number; + refreshCircuitUntil: string | null; + refreshLastFailAt: string | null; + warmupCircuitStreak: number; + warmupCircuitUntil: string | null; + warmupLastFailAt: string | null; + lastWarmupAt: string | null; + lastWarmupResult: string | null; + warmupTokensUsed: number; + updatedAt: string; +} + +function mapRow(row: any): ConnectionRuntimeState { + return { + connectionId: row.connection_id, + refreshCircuitStreak: row.refresh_circuit_streak ?? 0, + refreshCircuitUntil: row.refresh_circuit_until, + refreshLastFailAt: row.refresh_last_fail_at, + warmupCircuitStreak: row.warmup_circuit_streak ?? 0, + warmupCircuitUntil: row.warmup_circuit_until, + warmupLastFailAt: row.warmup_last_fail_at, + lastWarmupAt: row.last_warmup_at, + lastWarmupResult: row.last_warmup_result, + warmupTokensUsed: row.warmup_tokens_used ?? 0, + updatedAt: row.updated_at, + }; +} + +export function getConnectionRuntimeState(connectionId: string): ConnectionRuntimeState | null { + const db = getDbInstance(); + const row = db + .prepare("SELECT * FROM connection_runtime_state WHERE connection_id = ?") + .get(connectionId); + return row ? mapRow(row) : null; +} + +export async function upsertWarmupState( + connectionId: string, + state: { lastWarmupAt: string; lastResult: string; tokensUsed: number } +): Promise { + const db = getDbInstance(); + db.prepare( + `INSERT INTO connection_runtime_state (connection_id, last_warmup_at, last_warmup_result, warmup_tokens_used, updated_at) + VALUES (?, ?, ?, ?, datetime('now')) + ON CONFLICT(connection_id) DO UPDATE SET + last_warmup_at = excluded.last_warmup_at, + last_warmup_result = excluded.last_warmup_result, + warmup_tokens_used = excluded.warmup_tokens_used, + updated_at = datetime('now')` + ).run(connectionId, state.lastWarmupAt, state.lastResult, state.tokensUsed); +} + +export async function upsertWarmupCircuit( + connectionId: string, + circuit: { streak: number; until: string; lastFailAt: string } +): Promise { + const db = getDbInstance(); + db.prepare( + `INSERT INTO connection_runtime_state (connection_id, warmup_circuit_streak, warmup_circuit_until, warmup_last_fail_at, updated_at) + VALUES (?, ?, ?, ?, datetime('now')) + ON CONFLICT(connection_id) DO UPDATE SET + warmup_circuit_streak = excluded.warmup_circuit_streak, + warmup_circuit_until = excluded.warmup_circuit_until, + warmup_last_fail_at = excluded.warmup_last_fail_at, + updated_at = datetime('now')` + ).run(connectionId, circuit.streak, circuit.until, circuit.lastFailAt); +} + +export async function clearWarmupCircuit(connectionId: string): Promise { + const db = getDbInstance(); + db.prepare( + `UPDATE connection_runtime_state + SET warmup_circuit_streak = 0, warmup_circuit_until = NULL, warmup_last_fail_at = NULL, updated_at = datetime('now') + WHERE connection_id = ?` + ).run(connectionId); +} + +export async function markForbidden(connectionId: string, at: string): Promise { + const db = getDbInstance(); + db.prepare( + `INSERT INTO connection_runtime_state (connection_id, last_warmup_result, last_warmup_at, updated_at) + VALUES (?, 'forbidden', ?, datetime('now')) + ON CONFLICT(connection_id) DO UPDATE SET + last_warmup_result = 'forbidden', + last_warmup_at = excluded.last_warmup_at, + updated_at = datetime('now')` + ).run(connectionId, at); +} diff --git a/src/lib/db/contextHandoffs.ts b/src/lib/db/contextHandoffs.ts index 8bcd768e2b..60edacac7a 100644 --- a/src/lib/db/contextHandoffs.ts +++ b/src/lib/db/contextHandoffs.ts @@ -22,6 +22,7 @@ type JsonRecord = Record; interface StatementLike { get: (...params: unknown[]) => TRow | undefined; + all: (...params: unknown[]) => TRow[]; run: (...params: unknown[]) => { changes: number }; } diff --git a/src/lib/db/core.ts b/src/lib/db/core.ts index 76731147d9..50d874a3ba 100644 --- a/src/lib/db/core.ts +++ b/src/lib/db/core.ts @@ -13,6 +13,7 @@ import { openDatabaseAsync, } from "./adapters/driverFactory"; import path from "path"; +import { retryProbeIfTransient } from "./probeUtils"; import fs from "fs"; import { resolveWritableDataDir, getLegacyDotDataDir } from "../dataPaths"; import { runMigrations } from "./migrationRunner"; @@ -1142,18 +1143,19 @@ export function getDbInstance(): SqliteDatabase { `Original error: ${message}` ); } - preservedCriticalState = captureCriticalDbState(sqliteFile); - - // SAFETY: Never delete the database — rename to backup so data can be recovered. - // The old code would silently destroy all user data on any probe failure. - const failedPath = sqliteFile + `.probe-failed-${Date.now()}`; - try { - fs.renameSync(sqliteFile, failedPath); - console.warn(`[DB] Renamed corrupt DB to ${path.basename(failedPath)}`); - failedProbePath = failedPath; - failedProbeMessage = message; - } catch { - /* ok */ + if (!retryProbeIfTransient(sqliteFile, e, openSqliteDatabase, closeProbeIfSafe)) { + preservedCriticalState = captureCriticalDbState(sqliteFile); + // SAFETY: Never delete the database — rename to backup so data can be recovered. + // The old code would silently destroy all user data on any probe failure. + const failedPath = sqliteFile + `.probe-failed-${Date.now()}`; + try { + fs.renameSync(sqliteFile, failedPath); + console.warn(`[DB] Renamed corrupt DB to ${path.basename(failedPath)}`); + failedProbePath = failedPath; + failedProbeMessage = message; + } catch { + /* ok */ + } } } } diff --git a/src/lib/db/migrationRunner.ts b/src/lib/db/migrationRunner.ts index ac6f0ab79d..c5470b6b1e 100644 --- a/src/lib/db/migrationRunner.ts +++ b/src/lib/db/migrationRunner.ts @@ -465,6 +465,13 @@ function isSchemaAlreadyApplied( // exists the rebuild ran — skip re-executing the rename/copy/drop, which // would fail on the missing proxy_assignments_pre117 table. return hasColumn(db, "proxy_assignments", "position"); + // Retroactive guard for the 135/136 renumber (#8523 landed onto slots already taken + // by #8908/#9515): a DB that ran these under the old numbers already has the column, + // and a bare ALTER TABLE ADD COLUMN would throw on the re-run under the new number. + case "137": + return hasColumn(db, "version_manager", "auto_restart_adopted"); + case "138": + return hasColumn(db, "upstream_proxy_config", "fallback_backend"); default: return false; } diff --git a/src/lib/db/migrations/118_provider_param_filters.sql b/src/lib/db/migrations/118_provider_param_filters.sql index 2a6d351ca6..b5f17702d8 100644 --- a/src/lib/db/migrations/118_provider_param_filters.sql +++ b/src/lib/db/migrations/118_provider_param_filters.sql @@ -5,3 +5,4 @@ -- { block: string[], allow: string[], models?: { [modelId]: { block?: string[], allow?: string[] } }, autoLearn?: boolean } -- -- See: src/lib/db/paramFilters.ts +SELECT 1; diff --git a/src/lib/db/migrations/135_connection_runtime_state.sql b/src/lib/db/migrations/135_connection_runtime_state.sql new file mode 100644 index 0000000000..e196b78a6f --- /dev/null +++ b/src/lib/db/migrations/135_connection_runtime_state.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS connection_runtime_state ( + connection_id TEXT PRIMARY KEY REFERENCES provider_connections(id) ON DELETE CASCADE, + refresh_circuit_streak INTEGER DEFAULT 0, + refresh_circuit_until TEXT, + refresh_last_fail_at TEXT, + warmup_circuit_streak INTEGER DEFAULT 0, + warmup_circuit_until TEXT, + warmup_last_fail_at TEXT, + last_warmup_at TEXT, + last_warmup_result TEXT, + warmup_tokens_used INTEGER DEFAULT 0, + updated_at TEXT NOT NULL DEFAULT (datetime('now')) +); +CREATE INDEX IF NOT EXISTS idx_crs_warmup_until ON connection_runtime_state(warmup_circuit_until) WHERE warmup_circuit_until IS NOT NULL; diff --git a/src/lib/db/migrations/136_radar_cache_settings.sql b/src/lib/db/migrations/136_radar_cache_settings.sql new file mode 100644 index 0000000000..42bcec9d5e --- /dev/null +++ b/src/lib/db/migrations/136_radar_cache_settings.sql @@ -0,0 +1,30 @@ +-- 136_radar_cache_settings.sql +-- Radar client local cache and settings tables. +-- +-- radar_feed_cache: single-row table holding the last verified feed JSON +-- (community or live tier). The payload is the exact byte-identical feed +-- returned by the Radar server after Ed25519 signature verification. +-- +-- radar_settings: single-row table holding the operator's opt-in state and +-- an optional supporter key (encrypted at rest with AES-256-GCM via the +-- same mechanism used for provider connection credentials). + +CREATE TABLE IF NOT EXISTS radar_feed_cache ( + id INTEGER PRIMARY KEY CHECK (id = 1), + version TEXT, + tier TEXT, + payload TEXT, + signature TEXT, + fetched_at TEXT +); + +CREATE TABLE IF NOT EXISTS radar_settings ( + id INTEGER PRIMARY KEY CHECK (id = 1), + opt_in INTEGER NOT NULL DEFAULT 0, + supporter_key_encrypted TEXT, + updated_at TEXT +); + +-- Seed the single row so reads never return "no row" for settings +INSERT OR IGNORE INTO radar_settings (id, opt_in, supporter_key_encrypted, updated_at) +VALUES (1, 0, NULL, datetime('now')); diff --git a/src/lib/db/migrations/137_auto_restart_adopted.sql b/src/lib/db/migrations/137_auto_restart_adopted.sql new file mode 100644 index 0000000000..f4177ed350 --- /dev/null +++ b/src/lib/db/migrations/137_auto_restart_adopted.sql @@ -0,0 +1,16 @@ +-- Migration 137: Auto-restart-adopted toggle for embedded services +-- +-- When a supervisor's probeBeforeSpawn finds a healthy instance already +-- listening on its port, it adopts that process instead of spawning a new +-- one. An adopted process has no piped stdout/stderr (nothing was spawned to +-- pipe from), so the Logs panel stays empty for its entire lifetime unless +-- it's replaced with a real spawn. +-- +-- `auto_restart_adopted` lets an operator opt in, per tool, to having the +-- supervisor kill an adopted process immediately and spawn a fresh one it +-- actually owns — trading one restart for working log capture going +-- forward. Defaults to 0 (off): adoption-without-restart is already the +-- safe, non-disruptive default behavior, and killing a process the operator +-- didn't ask to be killed should be opt-in, not automatic. +ALTER TABLE version_manager + ADD COLUMN auto_restart_adopted INTEGER NOT NULL DEFAULT 0; diff --git a/src/lib/db/migrations/138_dario_fallback_backend.sql b/src/lib/db/migrations/138_dario_fallback_backend.sql new file mode 100644 index 0000000000..8dc6f28f73 --- /dev/null +++ b/src/lib/db/migrations/138_dario_fallback_backend.sql @@ -0,0 +1,11 @@ +-- Migration 138: Dario failover backend selection for upstream_proxy_config +-- +-- Adds `fallback_backend` so a provider whose mode is 'fallback' can choose +-- WHICH embedded proxy handles the retry leg — CLIProxyAPI (the historical, +-- hardcoded behaviour) or Dario (@askalf/dario). Defaults to 'cliproxyapi' +-- so every existing 'fallback' config keeps behaving exactly as it does today +-- (zero behaviour change for anyone not opting in). The new 'dario' value for +-- the `mode` column itself needs no schema change — `mode` is a free TEXT +-- column already ('native' | 'cliproxyapi' | 'dario' | 'fallback'). +ALTER TABLE upstream_proxy_config + ADD COLUMN fallback_backend TEXT NOT NULL DEFAULT 'cliproxyapi'; diff --git a/src/lib/db/migrations/139_ccr_blocks.sql b/src/lib/db/migrations/139_ccr_blocks.sql new file mode 100644 index 0000000000..a1dd4b87cb --- /dev/null +++ b/src/lib/db/migrations/139_ccr_blocks.sql @@ -0,0 +1,31 @@ +-- CCR durable block store (#9061). +-- +-- The CCR engine keeps blocks in a process-local Map. That map loses entries to +-- cross-principal LRU eviction (5,000 entries / 64 MB global cap), to the 24h TTL, to +-- process restarts, and to multi-instance deployments where the MCP retrieve call lands +-- on an instance that never ran the compression. Meanwhile `fidelityGateStep.ts` waives +-- fidelity verification for sampling engines *because* their drop is "CCR-recoverable", +-- and the model is told by the CCR protocol instruction that it can retrieve the block +-- verbatim. +-- +-- This table is the second tier behind that Map: the Map stays the hot cache and keeps +-- its LRU/byte-budget behaviour untouched, and a block evicted from it is still readable +-- here. Scoping matches the in-memory store's compound key (principal + content hash). + +CREATE TABLE IF NOT EXISTS ccr_blocks ( + principal_id TEXT NOT NULL, + hash TEXT NOT NULL, + content TEXT NOT NULL, + bytes INTEGER NOT NULL, + chars INTEGER NOT NULL, + lines INTEGER NOT NULL, + content_type TEXT NOT NULL DEFAULT 'text/plain', + source TEXT NOT NULL DEFAULT 'compression', + created_at INTEGER NOT NULL, + last_accessed_at INTEGER NOT NULL, + expires_at INTEGER NOT NULL, + PRIMARY KEY (principal_id, hash) +); + +-- Pruning scans by expiry. +CREATE INDEX IF NOT EXISTS idx_ccr_blocks_expires ON ccr_blocks(expires_at); diff --git a/src/lib/db/modelComboMappings.ts b/src/lib/db/modelComboMappings.ts index 41d9f1fe45..d3fc1c541c 100644 --- a/src/lib/db/modelComboMappings.ts +++ b/src/lib/db/modelComboMappings.ts @@ -1,249 +1,47 @@ /** - * db/modelComboMappings.ts — Per-model combo mapping CRUD + resolution. - * - * Maps model name patterns (glob-style wildcards) to specific combos. - * When a request arrives for a model string like "claude-sonnet-4", - * the resolver checks all enabled mappings (highest priority first) - * and returns the first matching combo. + * Compatibility facade for model-to-combo mapping persistence. */ -import { v4 as uuidv4 } from "uuid"; -import { getDbInstance } from "./core"; -import { globToRegex } from "@/shared/utils/globPattern"; +import type { + CreateModelComboMappingInput, + ModelComboMapping, + ModelComboMappingPage, + UpdateModelComboMappingInput, +} from "@/domain/persistence/comboRepositories"; +import { routingConfigRepositories } from "./repositories/routingConfigRepositories"; -// ────────────────────────────────────────────────────────── -// Types -// ────────────────────────────────────────────────────────── +export type { ModelComboMapping } from "@/domain/persistence/comboRepositories"; -export interface ModelComboMapping { - id: string; - pattern: string; - comboId: string; - comboName?: string; - priority: number; - enabled: boolean; - description: string; - createdAt: string; - updatedAt: string; -} +const repository = routingConfigRepositories.modelComboMappings; -interface MappingRow { - id: string; - pattern: string; - combo_id: string; - combo_name?: string; - priority: number; - enabled: number; - description: string; - created_at: string; - updated_at: string; -} - -// ────────────────────────────────────────────────────────── -// Row mapping -// ────────────────────────────────────────────────────────── - -function rowToMapping(row: MappingRow): ModelComboMapping { - return { - id: row.id, - pattern: row.pattern, - comboId: row.combo_id, - comboName: row.combo_name || undefined, - priority: row.priority, - enabled: row.enabled === 1, - description: row.description || "", - createdAt: row.created_at, - updatedAt: row.updated_at, - }; -} - -// ────────────────────────────────────────────────────────── -// CRUD -// ────────────────────────────────────────────────────────── - -/** - * List all model-combo mappings, joined with combo name. - * Ordered by priority descending (highest first). - */ -export async function getModelComboMappings(options?: { +export function getModelComboMappings(options?: { limit?: number; offset?: number; -}): Promise<{ items: ModelComboMapping[]; total: number }> { - const db = getDbInstance(); - const limit = options?.limit; - const offset = options?.offset ?? 0; - let sql = `SELECT m.id, m.pattern, m.combo_id, c.name AS combo_name, - m.priority, m.enabled, m.description, - m.created_at, m.updated_at - FROM model_combo_mappings m - LEFT JOIN combos c ON c.id = m.combo_id - ORDER BY m.priority DESC, m.created_at ASC`; - const params: unknown[] = []; - if (limit !== undefined) { - sql += " LIMIT ? OFFSET ?"; - params.push(limit, offset); - } - const rows = db.prepare(sql).all(...params) as MappingRow[]; - const totalRow = db.prepare("SELECT count(*) as cnt FROM model_combo_mappings").get() as { - cnt: number; - }; - return { items: rows.map(rowToMapping), total: totalRow.cnt }; +}): Promise { + return repository.list(options); } -/** - * Get a single mapping by ID. - */ -export async function getModelComboMappingById(id: string): Promise { - const db = getDbInstance(); - const row = db - .prepare( - `SELECT m.id, m.pattern, m.combo_id, c.name AS combo_name, - m.priority, m.enabled, m.description, - m.created_at, m.updated_at - FROM model_combo_mappings m - LEFT JOIN combos c ON c.id = m.combo_id - WHERE m.id = ?` - ) - .get(id) as MappingRow | undefined; - return row ? rowToMapping(row) : null; +export function getModelComboMappingById(id: string): Promise { + return repository.findById(id); } -/** - * Create a new model-combo mapping. - */ -export async function createModelComboMapping(data: { - pattern: string; - comboId: string; - priority?: number; - enabled?: boolean; - description?: string; -}): Promise { - const db = getDbInstance(); - const now = new Date().toISOString(); - const id = uuidv4(); - - db.prepare( - `INSERT INTO model_combo_mappings - (id, pattern, combo_id, priority, enabled, description, created_at, updated_at) - VALUES (?, ?, ?, ?, ?, ?, ?, ?)` - ).run( - id, - data.pattern, - data.comboId, - data.priority ?? 0, - data.enabled !== false ? 1 : 0, - data.description || "", - now, - now - ); - - return { - id, - pattern: data.pattern, - comboId: data.comboId, - priority: data.priority ?? 0, - enabled: data.enabled !== false, - description: data.description || "", - createdAt: now, - updatedAt: now, - }; +export function createModelComboMapping( + data: CreateModelComboMappingInput +): Promise { + return repository.create(data); } -/** - * Update an existing model-combo mapping. - */ -export async function updateModelComboMapping( +export function updateModelComboMapping( id: string, - data: Partial<{ - pattern: string; - comboId: string; - priority: number; - enabled: boolean; - description: string; - }> + data: UpdateModelComboMappingInput ): Promise { - const existing = await getModelComboMappingById(id); - if (!existing) return null; - - const db = getDbInstance(); - const now = new Date().toISOString(); - const updated = { - pattern: data.pattern ?? existing.pattern, - combo_id: data.comboId ?? existing.comboId, - priority: data.priority ?? existing.priority, - enabled: data.enabled !== undefined ? (data.enabled ? 1 : 0) : existing.enabled ? 1 : 0, - description: data.description ?? existing.description, - }; - - db.prepare( - `UPDATE model_combo_mappings - SET pattern = ?, combo_id = ?, priority = ?, enabled = ?, - description = ?, updated_at = ? - WHERE id = ?` - ).run( - updated.pattern, - updated.combo_id, - updated.priority, - updated.enabled, - updated.description, - now, - id - ); - - return getModelComboMappingById(id); + return repository.update(id, data); } -/** - * Delete a model-combo mapping. - */ -export async function deleteModelComboMapping(id: string): Promise { - const db = getDbInstance(); - const result = db.prepare("DELETE FROM model_combo_mappings WHERE id = ?").run(id); - return (result.changes ?? 0) > 0; +export function deleteModelComboMapping(id: string): Promise { + return repository.deleteById(id); } -// ────────────────────────────────────────────────────────── -// Core: Resolve combo for a model string -// ────────────────────────────────────────────────────────── - -/** - * Check if a model string matches any enabled model-combo mapping. - * Returns the full combo object if a match is found, null otherwise. - * - * Mappings are checked in priority order (highest first). - * Uses glob-style pattern matching (* = any chars, ? = single char). - */ -export async function resolveComboForModel( - modelStr: string -): Promise | null> { - const db = getDbInstance(); - - // Fetch enabled mappings, ordered by priority (highest first) - const rows = db - .prepare( - `SELECT m.pattern, m.combo_id, c.data AS combo_data - FROM model_combo_mappings m - JOIN combos c ON c.id = m.combo_id - WHERE m.enabled = 1 - ORDER BY m.priority DESC, m.created_at ASC` - ) - .all() as Array<{ pattern: string; combo_id: string; combo_data: string }>; - - for (const row of rows) { - const regex = globToRegex(row.pattern); - if (regex.test(modelStr)) { - try { - const combo = JSON.parse(row.combo_data) as Record; - if (combo.isActive === false) { - continue; - } - return combo; - } catch { - // Corrupted combo data — skip - continue; - } - } - } - - return null; +export function resolveComboForModel(model: string): Promise | null> { + return repository.resolveForModel(model); } diff --git a/src/lib/db/models.ts b/src/lib/db/models.ts index 58f6457b5a..0f6499d737 100644 --- a/src/lib/db/models.ts +++ b/src/lib/db/models.ts @@ -857,35 +857,45 @@ export function getModelIsHidden(providerId: string, modelId: string): boolean { */ export function getHiddenModelsByProvider(): Map> { const db = getDbInstance(); - const result = new Map>(); - - // Query all rows from key_value for both namespaces + const visibilityByProvider = new Map>(); const rows = db .prepare( - "SELECT key, value FROM key_value WHERE namespace IN ('modelCompatOverrides', 'customModels')" + "SELECT namespace, key, value FROM key_value WHERE namespace IN ('modelCompatOverrides', 'customModels')" ) - .all() as Array<{ key: string; value: string | null }>; + .all() as Array<{ namespace: string; key: string; value: string | null }>; - for (const row of rows) { - if (!row.value) continue; - try { - const parsed = JSON.parse(row.value); - if (!Array.isArray(parsed)) continue; - for (const entry of parsed) { - if (entry && typeof entry === "object" && entry.isHidden) { - const modelId = entry.id; - if (typeof modelId === "string" && modelId.length > 0) { - if (!result.has(row.key)) result.set(row.key, new Set()); - result.get(row.key)!.add(modelId); + for (const namespace of ["modelCompatOverrides", "customModels"]) { + for (const row of rows) { + if (row.namespace !== namespace || !row.value) continue; + try { + const parsed = JSON.parse(row.value); + if (!Array.isArray(parsed)) continue; + for (const entry of parsed) { + if (!entry || typeof entry !== "object") continue; + const modelId = (entry as { id?: unknown }).id; + if (typeof modelId !== "string" || modelId.length === 0) continue; + if (!Object.prototype.hasOwnProperty.call(entry, "isHidden")) continue; + let visibility = visibilityByProvider.get(row.key); + if (!visibility) { + visibility = new Map(); + visibilityByProvider.set(row.key, visibility); } + visibility.set(modelId, Boolean((entry as { isHidden?: unknown }).isHidden)); } + } catch { + // Skip malformed entries } - } catch { - // Skip malformed entries } } - return result; + return new Map( + [...visibilityByProvider].flatMap(([providerId, visibility]) => { + const hiddenModels = [...visibility].flatMap(([modelId, isHidden]) => + isHidden ? [modelId] : [] + ); + return hiddenModels.length > 0 ? [[providerId, new Set(hiddenModels)] as const] : []; + }) + ); } /** diff --git a/src/lib/db/models/activeSyncedCatalog.ts b/src/lib/db/models/activeSyncedCatalog.ts new file mode 100644 index 0000000000..f5d649d030 --- /dev/null +++ b/src/lib/db/models/activeSyncedCatalog.ts @@ -0,0 +1,216 @@ +import { providerUsesAuthoritativeLiveCatalog } from "@omniroute/open-sse/config/providerRegistry"; +import { PROVIDER_ID_TO_ALIAS } from "@omniroute/open-sse/config/providerModels.ts"; +import { + getSyncedAvailableModels, + getSyncedAvailableModelsByConnection, + type SyncedAvailableModel, +} from "../models"; +import { getRawProviderConnections } from "../providers"; + +export type ActiveSyncedCatalog = { + authoritative: boolean; + models: SyncedAvailableModel[]; +}; + +export type ProviderCatalogReconciliation = { + providers: string[]; + excludedProviders: string[]; +}; + +type ProviderConnectionRef = { + id: string; + provider: string; +}; + +function resolveStoredProviderId(aliasOrId: string): string { + const normalized = aliasOrId.trim(); + if (!normalized) return ""; + + if (Object.prototype.hasOwnProperty.call(PROVIDER_ID_TO_ALIAS, normalized)) { + return normalized; + } + + for (const [providerId, alias] of Object.entries(PROVIDER_ID_TO_ALIAS)) { + if (alias === normalized) return providerId; + } + + return normalized; +} + +function readConnectionRef(connection: unknown): ProviderConnectionRef | null { + if (!connection || typeof connection !== "object") return null; + + const record = connection as { + id?: unknown; + provider?: unknown; + }; + + if ( + typeof record.id !== "string" || + record.id.length === 0 || + typeof record.provider !== "string" || + record.provider.length === 0 + ) { + return null; + } + + return { + id: record.id, + provider: record.provider, + }; +} + +function collectModelsForConnections( + modelsByConnection: Record, + connectionIds: Iterable +): SyncedAvailableModel[] { + const models = new Map(); + + for (const connectionId of connectionIds) { + for (const model of modelsByConnection[connectionId] || []) { + if (!model?.id || models.has(model.id)) continue; + models.set(model.id, model); + } + } + + return Array.from(models.values()); +} + +/** + * Return the unioned synced catalog belonging only to active connections. + * + * A provider is authoritative only when at least one active connection has a + * non-empty usable catalog. Missing, empty, malformed, or unavailable state + * fails open to the static registry. + */ +export async function getActiveSyncedCatalog(providerId: string): Promise { + const storedProviderId = resolveStoredProviderId(providerId); + if (!storedProviderId) { + return { authoritative: false, models: [] }; + } + + try { + const [connections, modelsByConnection] = await Promise.all([ + getRawProviderConnections( + { provider: storedProviderId, isActive: true }, + undefined, + undefined, + ["id", "provider"] + ), + getSyncedAvailableModelsByConnection(storedProviderId), + ]); + + const activeConnectionIds = connections + .map(readConnectionRef) + .filter((connection): connection is ProviderConnectionRef => connection !== null) + .map((connection) => connection.id); + + const models = collectModelsForConnections(modelsByConnection, activeConnectionIds); + if (models.length > 0) { + return { + authoritative: providerUsesAuthoritativeLiveCatalog(providerId), + models, + }; + } + + // No ACTIVE CONNECTION carries a catalog for this provider — but a provider + // NODE can: nodes live in `provider_nodes`, never in `provider_connections`, + // so filtering by active connection ids drops their synced catalog entirely. + // Before #9294 this path read the provider-wide key_value set, and losing it + // took every node's runtime metadata with it (supportedThinkingEfforts, so + // `-high`/`-low` effort suffixes stopped resolving, plus contextWindow / + // maxInputTokens used by the combo context-window filter). + // + // Fall back to that provider-wide set, and deliberately keep it + // NON-authoritative: #9294's live-catalog gating is about what an active + // connection actually serves, so a node-backed catalog must inform metadata + // without ever being used to reject a model as unavailable. + return { authoritative: false, models: await getSyncedAvailableModels(storedProviderId) }; + } catch { + return { authoritative: false, models: [] }; + } +} + +/** + * Return non-empty synced catalogs grouped by provider, restricted to active + * connections. This is the authoritative live source for /v1/models. + */ +export async function getAllActiveSyncedModels(): Promise> { + try { + const connections = await getRawProviderConnections({ isActive: true }, undefined, undefined, [ + "id", + "provider", + ]); + + const connectionIdsByProvider = new Map>(); + + for (const rawConnection of connections) { + const connection = readConnectionRef(rawConnection); + if (!connection) continue; + + if (!connectionIdsByProvider.has(connection.provider)) { + connectionIdsByProvider.set(connection.provider, new Set()); + } + + connectionIdsByProvider.get(connection.provider)!.add(connection.id); + } + + const result: Record = {}; + + await Promise.all( + Array.from(connectionIdsByProvider.entries()).map(async ([providerId, connectionIds]) => { + const modelsByConnection = await getSyncedAvailableModelsByConnection(providerId); + + const models = collectModelsForConnections(modelsByConnection, connectionIds); + + if (models.length > 0) { + result[providerId] = models; + } + }) + ); + + return result; + } catch { + return {}; + } +} + +/** + * Remove static provider candidates whose active live catalog exists but does + * not contain the requested model. Providers without a usable live catalog + * retain their static fallback behavior. + */ +export async function reconcileProvidersWithActiveSyncedCatalog( + providerIds: string[], + modelId: string +): Promise { + const uniqueProviders = Array.from( + new Set( + providerIds.filter( + (provider): provider is string => typeof provider === "string" && provider.length > 0 + ) + ) + ); + + const states = await Promise.all( + uniqueProviders.map(async (provider) => ({ + provider, + catalog: await getActiveSyncedCatalog(provider), + })) + ); + + const providers: string[] = []; + const excludedProviders: string[] = []; + + for (const { provider, catalog } of states) { + const modelIsLive = catalog.models.some((model) => model.id === modelId); + + if (!catalog.authoritative || modelIsLive) { + providers.push(provider); + } else { + excludedProviders.push(provider); + } + } + + return { providers, excludedProviders }; +} diff --git a/src/lib/db/models/aliases.ts b/src/lib/db/models/aliases.ts index b88e15d7c1..59e26a45e6 100644 --- a/src/lib/db/models/aliases.ts +++ b/src/lib/db/models/aliases.ts @@ -1,4 +1,4 @@ -/** db/models/aliases.ts — model alias CRUD (modelAliases namespace). */ +/** db/models/aliases.ts — model alias CRUD (modelAliases namespace, providerAliases namespace). */ import { getDbInstance } from "../core"; import { backupDbFile } from "../backup"; @@ -48,6 +48,62 @@ export async function deleteModelAlias(alias: string) { * * @returns the list of alias keys that were removed. */ +// ──────── Provider-scoped aliases (#9068) ──────── +// These survive rediscovery: an alias in this namespace is never touched by +// model sync, and always resolves the same way regardless of upstream ID changes. + +export type ProviderAliasMap = Record; // alias → upstream model ID + +/** + * Get the provider-scoped alias map for a given provider. + * Returns `{}` when no aliases have been set. + */ +export function getProviderAliases(providerId: string): ProviderAliasMap { + const db = getDbInstance(); + const row = db + .prepare("SELECT value FROM key_value WHERE namespace = 'providerAliases' AND key = ?") + .get(providerId); + const parsed = getKeyValue(row).value; + if (!parsed) return {}; + try { + const v = JSON.parse(parsed); + return typeof v === "object" && v !== null ? (v as ProviderAliasMap) : {}; + } catch { + return {}; + } +} + +/** + * Set a provider-scoped alias. + */ +export function setProviderAlias(providerId: string, alias: string, upstreamModelId: string): void { + const current = getProviderAliases(providerId); + current[alias] = upstreamModelId; + const db = getDbInstance(); + db.prepare( + "INSERT OR REPLACE INTO key_value (namespace, key, value) VALUES ('providerAliases', ?, ?)" + ).run(providerId, JSON.stringify(current)); + backupDbFile("pre-write"); +} + +/** + * Remove a provider-scoped alias. + */ +export function removeProviderAlias(providerId: string, alias: string): void { + const current = getProviderAliases(providerId); + if (!(alias in current)) return; + delete current[alias]; + const db = getDbInstance(); + if (Object.keys(current).length === 0) { + db.prepare("DELETE FROM key_value WHERE namespace = 'providerAliases' AND key = ?").run(providerId); + } else { + db.prepare( + "INSERT OR REPLACE INTO key_value (namespace, key, value) VALUES ('providerAliases', ?, ?)" + ).run(providerId, JSON.stringify(current)); + } + backupDbFile("pre-write"); +} + export async function deleteModelAliasesForProvider(providerId: string): Promise { const prefix = `${providerId}/`; const aliases = await getModelAliases(); diff --git a/src/lib/db/models/modelPreserveVideoUrl.ts b/src/lib/db/models/modelPreserveVideoUrl.ts new file mode 100644 index 0000000000..379e0fe933 --- /dev/null +++ b/src/lib/db/models/modelPreserveVideoUrl.ts @@ -0,0 +1,67 @@ +/** + * modelPreserveVideoUrl.ts — preserveVideoUrl resolver for model-compat overrides. + * + * Extracted from models.ts to avoid growing the frozen file-size baseline. + * Follows the same pattern as getModelPreserveOpenAIDeveloperRole. + */ + +import { getDbInstance } from "../core"; +import { type CompatByProtocolMap, readCompatList, isCompatProtocolKey } from "./compat"; + +/** The model-compat override key for the preserveVideoUrl flag. */ +const KEY = "preserveVideoUrl"; + +function getCustomModelRow(providerId: string, modelId: string): Record | undefined { + const db = getDbInstance(); + const row = db + .prepare( + "SELECT value FROM key_value WHERE namespace = 'modelCompatOverrides' AND key = ?" + ) + .get(`${providerId}::${modelId}`); + if (!row) return undefined; + try { + const v = JSON.parse((row as { value: string }).value); + return typeof v === "object" && v !== null ? (v as Record) : undefined; + } catch { + return undefined; + } +} + +/** + * Get the explicit preserve-video-url preference for a provider/model. + * `undefined` = unset → fall back to moonshot/kimi hardcoded behavior (caller decides). + * `true` = keep video_url content parts in the translated request. + * Per-protocol overrides live under `compatByProtocol[sourceFormat]`. + */ +export function getModelPreserveVideoUrl( + providerId: string, + modelId: string, + sourceFormat?: string | null +): boolean | undefined { + const m = getCustomModelRow(providerId, modelId); + const protocol = sourceFormat && isCompatProtocolKey(sourceFormat) ? sourceFormat : null; + + if (m) { + if (protocol) { + const pc = (m.compatByProtocol as CompatByProtocolMap | undefined)?.[protocol]; + if (pc && Object.prototype.hasOwnProperty.call(pc, KEY)) { + return Boolean(pc[KEY]); + } + } + if (Object.prototype.hasOwnProperty.call(m, KEY)) { + return Boolean(m[KEY]); + } + return undefined; + } + const co = readCompatList(providerId).find((e) => e.id === modelId); + if (protocol && co?.compatByProtocol?.[protocol]) { + const pc = co.compatByProtocol[protocol]!; + if (Object.prototype.hasOwnProperty.call(pc, KEY)) { + return Boolean(pc[KEY]); + } + } + if (co && Object.prototype.hasOwnProperty.call(co, KEY)) { + return Boolean(co[KEY]); + } + return undefined; +} diff --git a/src/lib/db/probeUtils.ts b/src/lib/db/probeUtils.ts new file mode 100644 index 0000000000..e5f2bd3885 --- /dev/null +++ b/src/lib/db/probeUtils.ts @@ -0,0 +1,96 @@ +/** + * Probe-retry utilities for the SQLite corruption-probe path in getDbInstance(). + * + * Transient probe errors (SQLITE_BUSY, ENOENT, SQLITE_PROTOCOL, SQLITE_IOERR) + * should be retried with backoff instead of immediately renaming the DB away + * and creating an empty one (data loss under concurrent load, #9541). + */ +import fs from "node:fs"; +import path from "node:path"; + +/** + * Identifies transient SQLite/OS probe errors that should be retried instead of + * triggering the corruption-rename path. + * + * Transient errors are conditions that can self-resolve within milliseconds: + * - SQLITE_BUSY: database is locked by another connection + * - SQLITE_PROTOCOL: locking protocol violation + * - SQLITE_IOERR: disk I/O error (can be transient under load) + * - ENOENT: file disappeared (race with another process/worker deleting it) + * + * Fatal errors (native load failures, OOM, module-not-found) are NOT transient. + */ +export function isTransientProbeError(error: unknown): boolean { + const message = error instanceof Error ? error.message : String(error); + return /SQLITE_BUSY|SQLITE_PROTOCOL|SQLITE_IOERR|ENOENT/i.test(message); +} + +/** + * Synchronous sleep that blocks the event loop for `ms` milliseconds. + * Only used in the transient-probe-error retry path where we are already in + * a synchronous context (better-sqlite3). Uses `Atomics.wait` which yields to + * the OS scheduler during the wait, falling back to a busy-wait on runtimes + * where Atomics.wait is restricted. + */ +function syncSleep(ms: number): void { + if (typeof SharedArrayBuffer !== "undefined" && typeof Atomics !== "undefined") { + try { + Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, ms); + return; + } catch { + // Atomics.wait may throw on restricted runtimes — fall through to busy-wait + } + } + const deadline = Date.now() + ms; + while (Date.now() < deadline) { + /* busy-wait */ + } +} + +/** + * Type for openSqliteDatabase callback — avoids importing the full SQLite adapter type. + */ +type OpenDbFn = ( + filePath: string, + options?: Record +) => { + driver: string; + open: boolean; + close(): void; +}; + +/** + * Retries opening a SQLite database probe when the initial attempt fails with + * a transient error. Uses exponential backoff (500ms, 1000ms, 2000ms). + * + * @param sqliteFile - Path to the SQLite database file + * @param openDb - Function to open the database (normally openSqliteDatabase) + * @param closeDb - Function to safely close the probe adapter + * @returns true if the retry succeeded (transient condition resolved) + * false if all retries were exhausted or error is non-transient + */ +export function retryProbeIfTransient( + sqliteFile: string, + probeError: unknown, + openDb: OpenDbFn, + closeDb: (adapter: { driver: string; open: boolean; close(): void } | null | undefined) => void +): boolean { + if (!isTransientProbeError(probeError)) return false; + + const retryDelays = [500, 1000, 2000]; + for (let i = 0; i < retryDelays.length; i++) { + syncSleep(retryDelays[i]); + try { + const retryAdapter = openDb(sqliteFile, { readonly: true }); + closeDb(retryAdapter); + return true; + } catch { + // Retry failed, try next delay + } + } + + console.warn( + `[DB] All ${retryDelays.length} transient probe retries exhausted — declaring corruption` + ); + return false; +} diff --git a/src/lib/db/proxies/mappers.ts b/src/lib/db/proxies/mappers.ts index 06248bc880..6bcdb879c4 100644 --- a/src/lib/db/proxies/mappers.ts +++ b/src/lib/db/proxies/mappers.ts @@ -143,6 +143,7 @@ export function toRegistryProxyResolution(row: unknown, level: ProxyScope, level username: record.username, password: record.password, family: typeof record.family === "string" ? record.family : "auto", + ...(typeof record.name === "string" && record.name ? { name: record.name } : {}), ...(relayAuth !== undefined ? { relayAuth } : {}), }, level, diff --git a/src/lib/db/proxies/rotation.ts b/src/lib/db/proxies/rotation.ts index 2bb5c79ddc..52cc695c57 100644 --- a/src/lib/db/proxies/rotation.ts +++ b/src/lib/db/proxies/rotation.ts @@ -195,7 +195,7 @@ function fetchAlivePoolRows( matchAnyScopeId: boolean ): JsonRecord[] { const baseSelect = - "SELECT p.id, p.type, p.host, p.port, p.username, p.password, p.notes, p.family, a.position AS __pos, a.id AS __aid " + + "SELECT p.id, p.name, p.type, p.host, p.port, p.username, p.password, p.notes, p.family, a.position AS __pos, a.id AS __aid " + "FROM proxy_assignments a JOIN proxy_registry p ON p.id = a.proxy_id WHERE a.scope = ? "; const order = " ORDER BY a.position ASC, a.id ASC"; if (matchAnyScopeId) { diff --git a/src/lib/db/radar.ts b/src/lib/db/radar.ts new file mode 100644 index 0000000000..ffd9e0ea9d --- /dev/null +++ b/src/lib/db/radar.ts @@ -0,0 +1,126 @@ +/** + * radar.ts — Radar client local DB module + * + * Provides local cache + settings storage for the OmniRoute Radar client. + * Nothing here talks to the network (that's the sync layer). + * + * Tables (migration 134): + * - radar_feed_cache: single-row signed feed cache + * - radar_settings: opt-in + encrypted supporter key + * + * The supporter key is encrypted at rest with AES-256-GCM using the same + * `encrypt()`/`decrypt()` helpers from `./encryption.ts` that protect + * provider connection credentials. + */ + +import { getDbInstance } from "./core"; +import { encrypt, decrypt } from "./encryption"; + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +export interface RadarCache { + version: string; + tier: string; + payload: string; + signature: string; + fetchedAt: string; +} + +export interface RadarSettings { + optIn: boolean; + supporterKey: string | null; + updatedAt: string; +} + +// --------------------------------------------------------------------------- +// radar_feed_cache +// --------------------------------------------------------------------------- + +/** + * Read the cached Radar feed. Returns null when no feed has been cached yet. + */ +export function getRadarCache(): RadarCache | null { + const db = getDbInstance(); + const row = db + .prepare( + "SELECT version, tier, payload, signature, fetched_at AS fetchedAt " + + "FROM radar_feed_cache WHERE id = 1" + ) + .get() as RadarCache | undefined; + + return row ?? null; +} + +/** + * Upsert the Radar feed cache (single row). Replaces any existing entry. + * If `fetchedAt` is omitted, the current ISO timestamp is used. + */ +export function setRadarCache(entry: { + version: string; + tier: string; + payload: string; + signature: string; + fetchedAt?: string; +}): void { + const db = getDbInstance(); + const fetchedAt = entry.fetchedAt ?? new Date().toISOString(); + + db.prepare( + `INSERT INTO radar_feed_cache (id, version, tier, payload, signature, fetched_at) + VALUES (1, ?, ?, ?, ?, ?) + ON CONFLICT(id) DO UPDATE SET + version = excluded.version, + tier = excluded.tier, + payload = excluded.payload, + signature = excluded.signature, + fetched_at = excluded.fetched_at` + ).run(entry.version, entry.tier, entry.payload, entry.signature, fetchedAt); +} + +// --------------------------------------------------------------------------- +// radar_settings +// --------------------------------------------------------------------------- + +/** + * Read the Radar settings. The supporter key is decrypted on read. + * The settings row is seeded by migration 134, so this always returns a row. + */ +export function getRadarSettings(): RadarSettings { + const db = getDbInstance(); + const row = db + .prepare( + "SELECT opt_in, supporter_key_encrypted, updated_at FROM radar_settings WHERE id = 1" + ) + .get() as { opt_in: number; supporter_key_encrypted: string | null; updated_at: string }; + + return { + optIn: row.opt_in === 1, + supporterKey: decrypt(row.supporter_key_encrypted) ?? null, + updatedAt: row.updated_at, + }; +} + +/** + * Set the Radar opt-in state. + */ +export function setRadarOptIn(optIn: boolean): void { + const db = getDbInstance(); + db.prepare( + "UPDATE radar_settings SET opt_in = ?, updated_at = datetime('now') WHERE id = 1" + ).run(optIn ? 1 : 0); +} + +/** + * Set (or clear) the Radar supporter key. The key is encrypted at rest + * using the same AES-256-GCM mechanism as provider credentials. + * Pass `null` to clear. + */ +export function setRadarKey(key: string | null): void { + const db = getDbInstance(); + const encrypted = key !== null ? encrypt(key) : null; + db.prepare( + "UPDATE radar_settings SET supporter_key_encrypted = ?, updated_at = datetime('now') WHERE id = 1" + ).run(encrypted); +} diff --git a/src/lib/db/reasoningCache.ts b/src/lib/db/reasoningCache.ts index d7f4b69e79..ae36c0bb9b 100644 --- a/src/lib/db/reasoningCache.ts +++ b/src/lib/db/reasoningCache.ts @@ -81,6 +81,8 @@ export function setReasoningCache( reasoning: string, ttlMs: number = DEFAULT_TTL_MS ): void { + const PLACEHOLDER = "(prior reasoning summary unavailable)"; + if (!reasoning || reasoning.trim() === PLACEHOLDER) return; // ponytail: never store the internal placeholder if (reasoning.length > MAX_ENTRY_BYTES) { reasoning = reasoning.slice(0, MAX_ENTRY_BYTES); } @@ -110,6 +112,8 @@ export function getReasoningCache( ) .get(toolCallId) as { reasoning: string; provider: string; model: string } | undefined; + const PLACEHOLDER = "(prior reasoning summary unavailable)"; + if (row && row.reasoning && row.reasoning.trim() === PLACEHOLDER) return null; // ponytail: never replay the placeholder return row ?? null; } diff --git a/src/lib/db/registeredKeys.ts b/src/lib/db/registeredKeys.ts index 2b0d0ddaf4..f0c3175856 100644 --- a/src/lib/db/registeredKeys.ts +++ b/src/lib/db/registeredKeys.ts @@ -318,8 +318,7 @@ export function issueRegisteredKey( export function getRegisteredKey(id: string): RegisteredKey | null { const db = getDbInstance(); const row = db.prepare("SELECT * FROM registered_keys WHERE id = ?").get(id) as - | RegisteredKeyRow - | undefined; + RegisteredKeyRow | undefined; return row ? (rowToCamel(row) as unknown as RegisteredKey) : null; } @@ -477,16 +476,14 @@ export function setAccountKeyLimit( export function getProviderKeyLimit(provider: string): ProviderKeyLimit | null { const db = getDbInstance(); const row = db.prepare("SELECT * FROM provider_key_limits WHERE provider = ?").get(provider) as - | ProviderKeyLimitRow - | undefined; + ProviderKeyLimitRow | undefined; return row ? (rowToCamel(row) as unknown as ProviderKeyLimit) : null; } export function getAccountKeyLimit(accountId: string): AccountKeyLimit | null { const db = getDbInstance(); const row = db.prepare("SELECT * FROM account_key_limits WHERE account_id = ?").get(accountId) as - | AccountKeyLimitRow - | undefined; + AccountKeyLimitRow | undefined; return row ? (rowToCamel(row) as unknown as AccountKeyLimit) : null; } diff --git a/src/lib/db/repositories/routingConfigRepositories.ts b/src/lib/db/repositories/routingConfigRepositories.ts new file mode 100644 index 0000000000..0b44fb9fa6 --- /dev/null +++ b/src/lib/db/repositories/routingConfigRepositories.ts @@ -0,0 +1,32 @@ +import type { + ComboRepository, + ModelComboMappingRepository, +} from "@/domain/persistence/comboRepositories"; +import { + getCombosCount as getSqliteCombosCount, + sqliteComboRepository, +} from "./sqliteComboRepository"; +import { sqliteModelComboMappingRepository } from "./sqliteModelComboMappingRepository"; + +export interface RoutingConfigRepositories { + combos: ComboRepository; + modelComboMappings: ModelComboMappingRepository; + legacySync: { + getCombosCount(): number; + }; +} + +/** + * SQLite-only composition root for the first repository slice. + * + * Backend selection deliberately does not exist yet. Keeping the binding in one + * place prevents compatibility facades from constructing or reaching through a + * concrete driver when a later, separately approved backend is introduced. + */ +export const routingConfigRepositories: RoutingConfigRepositories = { + combos: sqliteComboRepository, + modelComboMappings: sqliteModelComboMappingRepository, + legacySync: { + getCombosCount: getSqliteCombosCount, + }, +}; diff --git a/src/lib/db/repositories/sqliteComboRepository.ts b/src/lib/db/repositories/sqliteComboRepository.ts new file mode 100644 index 0000000000..e7fb36c59b --- /dev/null +++ b/src/lib/db/repositories/sqliteComboRepository.ts @@ -0,0 +1,348 @@ +/** + * SQLite implementation of the combo repository contract. + */ + +import { v4 as uuidv4 } from "uuid"; +import type { + ComboReorderResult, + ComboRepository, + ComboUpdateResult, +} from "@/domain/persistence/comboRepositories"; +import { normalizeComboRecord } from "@/lib/combos/steps"; +import { validateComboInvariant } from "@/lib/combos/invariants"; +import { getDbInstance } from "../core"; + +type JsonRecord = Record; + +function asRecord(value: unknown): JsonRecord { + return value && typeof value === "object" && !Array.isArray(value) ? (value as JsonRecord) : {}; +} + +function getSerializedData(value: unknown): string | null { + const row = asRecord(value); + return typeof row.data === "string" ? row.data : null; +} + +function getSortOrder(value: unknown): number | null { + const row = asRecord(value); + return typeof row.sort_order === "number" ? row.sort_order : null; +} + +function withSortOrder(payload: string, sortOrder: number | null): JsonRecord { + const parsed = JSON.parse(payload) as JsonRecord; + if (typeof sortOrder === "number") { + parsed.sortOrder = sortOrder; + } + return parsed; +} + +function getComboNameSet( + db: ReturnType, + extraNames: string[] = [] +): Set { + const rows = db.prepare("SELECT name FROM combos").all(); + const names = new Set(); + + for (const row of rows) { + const record = asRecord(row); + if (typeof record.name === "string" && record.name.trim().length > 0) { + names.add(record.name.trim()); + } + } + + for (const name of extraNames) { + if (typeof name === "string" && name.trim().length > 0) { + names.add(name.trim()); + } + } + + return names; +} + +function normalizeStoredCombo( + combo: JsonRecord, + db: ReturnType, + extraNames: string[] = [] +): JsonRecord { + return normalizeComboRecord(combo, { + allCombos: getComboNameSet(db, extraNames), + }) as JsonRecord; +} + +function parseComboRow(row: unknown): JsonRecord | null { + const payload = getSerializedData(row); + if (!payload) return null; + const parsed = withSortOrder(payload, getSortOrder(row)); + // Merge deduplicated column values back into the record + const record = asRecord(row); + if (record.context_cache_protection !== undefined && record.context_cache_protection !== null) { + // Column is authoritative when explicitly enabled (1). + // When column is 0 (unset default) preserve the JSON blob value + // to avoid silently disabling the feature on pre-migration rows. + if (record.context_cache_protection === 1) { + parsed.context_cache_protection = true; + } + // Column is 0 — keep existing JSON blob value + } + return parsed; +} + +function getNextSortOrder() { + const db = getDbInstance(); + const row = db.prepare("SELECT COALESCE(MAX(sort_order), 0) AS sort_order FROM combos").get(); + const sortOrder = getSortOrder(row); + return (sortOrder ?? 0) + 1; +} + +export async function getCombos(limit?: number, offset?: number) { + const db = getDbInstance(); + let sql = + "SELECT data, sort_order, context_cache_protection FROM combos ORDER BY sort_order ASC, name COLLATE NOCASE ASC"; + const params: unknown[] = []; + if (limit !== undefined) { + sql += " LIMIT ? OFFSET ?"; + params.push(limit, offset ?? 0); + } + const rawCombos = db + .prepare(sql) + .all(...params) + .map((row) => parseComboRow(row)) + .filter((row): row is JsonRecord => row !== null); + + const comboNames = rawCombos + .map((combo) => (typeof combo.name === "string" ? combo.name.trim() : "")) + .filter((name): name is string => name.length > 0); + + return rawCombos.map((combo) => + normalizeComboRecord(combo, { + allCombos: comboNames, + }) + ); +} + +export function getCombosCount(): number { + const db = getDbInstance(); + const row = db.prepare("SELECT count(*) as cnt FROM combos").get() as { cnt: number }; + return row.cnt; +} + +export async function getComboById(id: string) { + const db = getDbInstance(); + const row = db + .prepare("SELECT data, sort_order, context_cache_protection FROM combos WHERE id = ?") + .get(id); + const combo = parseComboRow(row); + if (!combo) return null; + return normalizeStoredCombo(combo, db, typeof combo.name === "string" ? [combo.name] : []); +} + +export async function getComboByName(name: string) { + const db = getDbInstance(); + const row = db + .prepare("SELECT data, sort_order, context_cache_protection FROM combos WHERE name = ?") + .get(name); + const combo = parseComboRow(row); + if (!combo) return null; + return normalizeStoredCombo(combo, db, [name]); +} + +// #4446: case-insensitive name lookup. The opencode dispatch path forwards a +// lowercased combo slug (e.g. "master-light") for a combo provisioned as +// "MASTER-LIGHT"; the default BINARY collation of getComboByName misses it. +// Used only as a fallback after the exact match fails, so it cannot change the +// resolution of any combo that already resolves today. +export async function getComboByNameInsensitive(name: string) { + const db = getDbInstance(); + const row = db + .prepare( + "SELECT data, sort_order, context_cache_protection FROM combos WHERE name = ? COLLATE NOCASE" + ) + .get(name); + const combo = parseComboRow(row); + if (!combo) return null; + const storedName = typeof combo.name === "string" ? combo.name : name; + return normalizeStoredCombo(combo, db, [storedName]); +} + +export async function createCombo(data: JsonRecord) { + const db = getDbInstance(); + const now = new Date().toISOString(); + const sortOrder = typeof data.sortOrder === "number" ? data.sortOrder : getNextSortOrder(); + const comboId = typeof data.id === "string" && data.id.trim().length > 0 ? data.id : uuidv4(); + const combo = normalizeStoredCombo( + { + ...data, + id: comboId, + name: data.name, + models: data.models || [], + strategy: data.strategy || "priority", + config: data.config || {}, + isHidden: Boolean(data.isHidden), + sortOrder, + createdAt: now, + updatedAt: now, + }, + db, + typeof data.name === "string" ? [data.name] : [] + ); + + validateComboInvariant(combo); + const contextCache = data.context_cache_protection ? 1 : 0; + db.prepare( + "INSERT INTO combos (id, name, data, sort_order, created_at, updated_at, context_cache_protection) VALUES (?, ?, ?, ?, ?, ?, ?)" + ).run(combo.id, combo.name, JSON.stringify(combo), sortOrder, now, now, contextCache); + + return combo; +} + +export async function updateCombo(id: string, data: JsonRecord): Promise { + const db = getDbInstance(); + const existing = db + .prepare("SELECT data, sort_order, context_cache_protection FROM combos WHERE id = ?") + .get(id); + if (!existing) return null; + + const current = parseComboRow(existing); + if (!current) return null; + const sortOrder = + typeof data.sortOrder === "number" + ? data.sortOrder + : typeof current.sortOrder === "number" + ? current.sortOrder + : getNextSortOrder(); + const merged: JsonRecord = { + ...current, + ...data, + sortOrder, + updatedAt: new Date().toISOString(), + }; + // Remove fields explicitly set to null (for deletion support) + for (const key of Object.keys(data)) { + if (data[key] === null) { + delete merged[key]; + } + } + const currentName = typeof current.name === "string" ? current.name : ""; + const nextName = + typeof merged["name"] === "string" && merged["name"].trim().length > 0 + ? merged["name"] + : currentName; + const normalizedMerged = normalizeStoredCombo({ ...merged, name: nextName }, db, [nextName]); + validateComboInvariant({ + ...normalizedMerged, + ...data, + name: nextName, + models: normalizedMerged.models, + }); + const contextCacheProtection = normalizedMerged.context_cache_protection ? 1 : 0; + + db.prepare( + "UPDATE combos SET name = ?, data = ?, sort_order = ?, updated_at = ?, context_cache_protection = ? WHERE id = ?" + ).run( + nextName, + JSON.stringify(normalizedMerged), + sortOrder, + normalizedMerged.updatedAt, + contextCacheProtection, + id + ); + + return { + combo: normalizedMerged, + previousName: currentName, + currentName: nextName, + modelsFieldProvided: data.models !== undefined, + }; +} + +export async function reorderCombos(comboIds: string[]): Promise { + const db = getDbInstance(); + const rows = db + .prepare( + "SELECT id, name, data, sort_order FROM combos ORDER BY sort_order ASC, name COLLATE NOCASE ASC" + ) + .all(); + if (rows.length === 0) return { combos: [], rowsReordered: 0 }; + + const existingIds = new Set( + rows + .map((row) => { + const record = asRecord(row); + return typeof record.id === "string" ? record.id : null; + }) + .filter((id): id is string => id !== null) + ); + + const seen = new Set(); + const requestedIds = comboIds.filter((id) => { + if (!existingIds.has(id) || seen.has(id)) return false; + seen.add(id); + return true; + }); + + const orderedIds = [ + ...requestedIds, + ...rows + .map((row) => { + const record = asRecord(row); + return typeof record.id === "string" ? record.id : null; + }) + .filter((id): id is string => id !== null && !seen.has(id)), + ]; + + const update = db.prepare( + "UPDATE combos SET data = ?, sort_order = ?, updated_at = ? WHERE id = ?" + ); + const now = new Date().toISOString(); + const rowById = new Map( + rows.map((row) => { + const record = asRecord(row); + return [String(record.id), row]; + }) + ); + const comboNames = rows + .map((row) => { + const combo = parseComboRow(row); + return combo && typeof combo.name === "string" ? combo.name.trim() : ""; + }) + .filter((name): name is string => name.length > 0); + + const reorderTransaction = db.transaction(() => { + orderedIds.forEach((id, index) => { + const row = rowById.get(id); + const combo = row ? parseComboRow(row) : null; + if (!combo) return; + const sortOrder = index + 1; + const updatedCombo = normalizeComboRecord( + { ...combo, sortOrder, updatedAt: now }, + { allCombos: comboNames } + ); + update.run(JSON.stringify(updatedCombo), sortOrder, now, id); + }); + }); + + reorderTransaction(); + return { + combos: await getCombos(), + rowsReordered: orderedIds.length, + }; +} + +export async function deleteCombo(id: string) { + const db = getDbInstance(); + const result = db.prepare("DELETE FROM combos WHERE id = ?").run(id); + if (result.changes === 0) return false; + return true; +} + +export const sqliteComboRepository: ComboRepository = { + list: getCombos, + count: async () => getCombosCount(), + findById: getComboById, + findByName: getComboByName, + findByNameInsensitive: getComboByNameInsensitive, + create: createCombo, + update: updateCombo, + reorder: reorderCombos, + deleteById: deleteCombo, +}; diff --git a/src/lib/db/repositories/sqliteModelComboMappingRepository.ts b/src/lib/db/repositories/sqliteModelComboMappingRepository.ts new file mode 100644 index 0000000000..d9aa223415 --- /dev/null +++ b/src/lib/db/repositories/sqliteModelComboMappingRepository.ts @@ -0,0 +1,244 @@ +/** + * SQLite implementation of per-model combo mapping persistence and resolution. + * + * Maps model name patterns (glob-style wildcards) to specific combos. + * When a request arrives for a model string like "claude-sonnet-4", + * the resolver checks all enabled mappings (highest priority first) + * and returns the first matching combo. + */ + +import { v4 as uuidv4 } from "uuid"; +import type { + CreateModelComboMappingInput, + ModelComboMapping, + ModelComboMappingRepository, + UpdateModelComboMappingInput, +} from "@/domain/persistence/comboRepositories"; +import { globToRegex } from "@/shared/utils/globPattern"; +import { getDbInstance } from "../core"; + +export type { ModelComboMapping } from "@/domain/persistence/comboRepositories"; + +// ────────────────────────────────────────────────────────── +// Types +// ────────────────────────────────────────────────────────── + +interface MappingRow { + id: string; + pattern: string; + combo_id: string; + combo_name?: string; + priority: number; + enabled: number; + description: string; + created_at: string; + updated_at: string; +} + +// ────────────────────────────────────────────────────────── +// Row mapping +// ────────────────────────────────────────────────────────── + +function rowToMapping(row: MappingRow): ModelComboMapping { + return { + id: row.id, + pattern: row.pattern, + comboId: row.combo_id, + comboName: row.combo_name || undefined, + priority: row.priority, + enabled: row.enabled === 1, + description: row.description || "", + createdAt: row.created_at, + updatedAt: row.updated_at, + }; +} + +// ────────────────────────────────────────────────────────── +// CRUD +// ────────────────────────────────────────────────────────── + +/** + * List all model-combo mappings, joined with combo name. + * Ordered by priority descending (highest first). + */ +export async function getModelComboMappings(options?: { + limit?: number; + offset?: number; +}): Promise<{ items: ModelComboMapping[]; total: number }> { + const db = getDbInstance(); + const limit = options?.limit; + const offset = options?.offset ?? 0; + let sql = `SELECT m.id, m.pattern, m.combo_id, c.name AS combo_name, + m.priority, m.enabled, m.description, + m.created_at, m.updated_at + FROM model_combo_mappings m + LEFT JOIN combos c ON c.id = m.combo_id + ORDER BY m.priority DESC, m.created_at ASC`; + const params: unknown[] = []; + if (limit !== undefined) { + sql += " LIMIT ? OFFSET ?"; + params.push(limit, offset); + } + const rows = db.prepare(sql).all(...params) as MappingRow[]; + const totalRow = db.prepare("SELECT count(*) as cnt FROM model_combo_mappings").get() as { + cnt: number; + }; + return { items: rows.map(rowToMapping), total: totalRow.cnt }; +} + +/** + * Get a single mapping by ID. + */ +export async function getModelComboMappingById(id: string): Promise { + const db = getDbInstance(); + const row = db + .prepare( + `SELECT m.id, m.pattern, m.combo_id, c.name AS combo_name, + m.priority, m.enabled, m.description, + m.created_at, m.updated_at + FROM model_combo_mappings m + LEFT JOIN combos c ON c.id = m.combo_id + WHERE m.id = ?` + ) + .get(id) as MappingRow | undefined; + return row ? rowToMapping(row) : null; +} + +/** + * Create a new model-combo mapping. + */ +export async function createModelComboMapping( + data: CreateModelComboMappingInput +): Promise { + const db = getDbInstance(); + const now = new Date().toISOString(); + const id = uuidv4(); + + db.prepare( + `INSERT INTO model_combo_mappings + (id, pattern, combo_id, priority, enabled, description, created_at, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?)` + ).run( + id, + data.pattern, + data.comboId, + data.priority ?? 0, + data.enabled !== false ? 1 : 0, + data.description || "", + now, + now + ); + + return { + id, + pattern: data.pattern, + comboId: data.comboId, + priority: data.priority ?? 0, + enabled: data.enabled !== false, + description: data.description || "", + createdAt: now, + updatedAt: now, + }; +} + +/** + * Update an existing model-combo mapping. + */ +export async function updateModelComboMapping( + id: string, + data: UpdateModelComboMappingInput +): Promise { + const existing = await getModelComboMappingById(id); + if (!existing) return null; + + const db = getDbInstance(); + const now = new Date().toISOString(); + const updated = { + pattern: data.pattern ?? existing.pattern, + combo_id: data.comboId ?? existing.comboId, + priority: data.priority ?? existing.priority, + enabled: data.enabled !== undefined ? (data.enabled ? 1 : 0) : existing.enabled ? 1 : 0, + description: data.description ?? existing.description, + }; + + db.prepare( + `UPDATE model_combo_mappings + SET pattern = ?, combo_id = ?, priority = ?, enabled = ?, + description = ?, updated_at = ? + WHERE id = ?` + ).run( + updated.pattern, + updated.combo_id, + updated.priority, + updated.enabled, + updated.description, + now, + id + ); + + return getModelComboMappingById(id); +} + +/** + * Delete a model-combo mapping. + */ +export async function deleteModelComboMapping(id: string): Promise { + const db = getDbInstance(); + const result = db.prepare("DELETE FROM model_combo_mappings WHERE id = ?").run(id); + return (result.changes ?? 0) > 0; +} + +// ────────────────────────────────────────────────────────── +// Core: Resolve combo for a model string +// ────────────────────────────────────────────────────────── + +/** + * Check if a model string matches any enabled model-combo mapping. + * Returns the full combo object if a match is found, null otherwise. + * + * Mappings are checked in priority order (highest first). + * Uses glob-style pattern matching (* = any chars, ? = single char). + */ +export async function resolveComboForModel( + modelStr: string +): Promise | null> { + const db = getDbInstance(); + + // Fetch enabled mappings, ordered by priority (highest first) + const rows = db + .prepare( + `SELECT m.pattern, m.combo_id, c.data AS combo_data + FROM model_combo_mappings m + JOIN combos c ON c.id = m.combo_id + WHERE m.enabled = 1 + ORDER BY m.priority DESC, m.created_at ASC` + ) + .all() as Array<{ pattern: string; combo_id: string; combo_data: string }>; + + for (const row of rows) { + const regex = globToRegex(row.pattern); + if (regex.test(modelStr)) { + try { + const combo = JSON.parse(row.combo_data) as Record; + if (combo.isActive === false) { + continue; + } + return combo; + } catch { + // Corrupted combo data — skip + continue; + } + } + } + + return null; +} + +export const sqliteModelComboMappingRepository: ModelComboMappingRepository = { + list: getModelComboMappings, + findById: getModelComboMappingById, + create: createModelComboMapping, + update: updateModelComboMapping, + deleteById: deleteModelComboMapping, + resolveForModel: resolveComboForModel, +}; diff --git a/src/lib/db/settings.ts b/src/lib/db/settings.ts index 401a4f2231..f8231fcb65 100644 --- a/src/lib/db/settings.ts +++ b/src/lib/db/settings.ts @@ -234,6 +234,12 @@ export async function getSettings() { // (`:free` suffix, zero-price pricing, or FREE_MODEL_BUDGETS membership). Default // false preserves prior behaviour; opt-in only. hidePaidModels: false, + // #9418: Opt-in filter that hides auto/* virtual combos from the /v1/models catalog. + // User-defined combos are unaffected; routing still works for hidden ids sent explicitly. + hideAutoCombos: false, + // #9418: Opt-in filter that hides no-think/* gateway variants from the /v1/models catalog. + // Routing still works for hidden ids sent explicitly. + hideNoThinkVariants: false, // #6977: Opt-in per-connection auto-ping that warms a Codex OAuth connection's // quota window right after it resets, so the first real request doesn't land in // a cold window. `connections` maps connection id -> enabled. Default empty map @@ -241,6 +247,8 @@ export async function getSettings() { // connection on, since pinging burns a small amount of real quota (Hard Rule #20 // spirit: never mutate/consume on the operator's behalf by default). codexAutoPing: { connections: {} }, + // #8848: opt-in per-connection Claude proactive warmup (empty = off for everyone). + claudeWarmup: { connections: {} }, }; for (const row of rows) { const record = toRecord(row); @@ -296,10 +304,7 @@ export async function updateSettings( ); const tx = db.transaction(() => { const currentRevision = readSettingsRevision(db); - if ( - options?.expectedRevision !== undefined && - options.expectedRevision !== currentRevision - ) { + if (options?.expectedRevision !== undefined && options.expectedRevision !== currentRevision) { throw new SettingsRevisionConflictError(currentRevision); } for (const [key, value] of Object.entries(updates)) { diff --git a/src/lib/db/upstreamProxy.ts b/src/lib/db/upstreamProxy.ts index 8429c334af..ea669720b0 100644 --- a/src/lib/db/upstreamProxy.ts +++ b/src/lib/db/upstreamProxy.ts @@ -1,6 +1,9 @@ /** Upstream proxy config persistence for upstream_proxy_config table. */ import { getDbInstance } from "./core"; +/** Which embedded proxy handles the retry leg when mode === "fallback". */ +export type FallbackBackend = "cliproxyapi" | "dario"; + interface UpstreamProxyConfig { id: number; providerId: string; @@ -10,6 +13,8 @@ interface UpstreamProxyConfig { cliproxyapiPriority: number; enabled: boolean; family: string; + // #dario: retry-leg backend for mode="fallback" ("cliproxyapi" default). + fallbackBackend: FallbackBackend; createdAt: string; updatedAt: string; } @@ -23,6 +28,7 @@ interface UpstreamProxyRow { cliproxyapi_priority: unknown; enabled: unknown; family: unknown; + fallback_backend: unknown; created_at: unknown; updated_at: unknown; } @@ -76,6 +82,11 @@ export function validateProxyUrl( } } +/** Normalize an arbitrary stored/user value to a valid FallbackBackend. */ +function normalizeFallbackBackend(value: unknown): FallbackBackend { + return value === "dario" ? "dario" : "cliproxyapi"; +} + function rowToConfig(record: Record): UpstreamProxyConfig { let mapping: Record | null = null; if (record.cliproxyapi_model_mapping && typeof record.cliproxyapi_model_mapping === "string") { @@ -94,6 +105,7 @@ function rowToConfig(record: Record): UpstreamProxyConfig { cliproxyapiPriority: record.cliproxyapi_priority as number, enabled: record.enabled === 1 || record.enabled === true, family: typeof record.family === "string" ? record.family : "auto", + fallbackBackend: normalizeFallbackBackend(record.fallback_backend), createdAt: record.created_at as string, updatedAt: record.updated_at as string, }; @@ -124,6 +136,7 @@ export async function upsertUpstreamProxyConfig(data: { cliproxyapiPriority?: number; enabled?: boolean; family?: string; + fallbackBackend?: FallbackBackend; }) { const db = getDbInstance(); const mode = data.mode ?? "native"; @@ -135,11 +148,12 @@ export async function upsertUpstreamProxyConfig(data: { const cliproxyapiPriority = data.cliproxyapiPriority ?? 2; const enabled = data.enabled !== false ? 1 : 0; const family = data.family ?? "auto"; + const fallbackBackend = normalizeFallbackBackend(data.fallbackBackend); db.prepare( `INSERT INTO upstream_proxy_config - (provider_id, mode, cliproxyapi_model_mapping, native_priority, cliproxyapi_priority, enabled, family, created_at, updated_at) - VALUES (?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now')) + (provider_id, mode, cliproxyapi_model_mapping, native_priority, cliproxyapi_priority, enabled, family, fallback_backend, created_at, updated_at) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, datetime('now'), datetime('now')) ON CONFLICT(provider_id) DO UPDATE SET mode = excluded.mode, cliproxyapi_model_mapping = excluded.cliproxyapi_model_mapping, @@ -147,6 +161,7 @@ export async function upsertUpstreamProxyConfig(data: { cliproxyapi_priority = excluded.cliproxyapi_priority, enabled = excluded.enabled, family = excluded.family, + fallback_backend = excluded.fallback_backend, updated_at = datetime('now')` ).run( data.providerId, @@ -155,7 +170,8 @@ export async function upsertUpstreamProxyConfig(data: { nativePriority, cliproxyapiPriority, enabled, - family + family, + fallbackBackend ); return getUpstreamProxyConfig(data.providerId); @@ -202,6 +218,10 @@ export async function updateUpstreamProxyConfig( sets.push("family = ?"); params.push(updates.family); } + if (updates.fallbackBackend !== undefined) { + sets.push("fallback_backend = ?"); + params.push(normalizeFallbackBackend(updates.fallbackBackend)); + } params.push(providerId); db.prepare(`UPDATE upstream_proxy_config SET ${sets.join(", ")} WHERE provider_id = ?`).run( @@ -233,12 +253,16 @@ export async function getFallbackChainForProvider(providerId: string) { const config = await getUpstreamProxyConfig(providerId); if (!config) return []; - const chain: { executor: "native" | "cliproxyapi"; priority: number }[] = []; + const chain: { executor: "native" | "cliproxyapi" | "dario"; priority: number }[] = []; if (config.enabled) { chain.push({ executor: "native", priority: config.nativePriority }); - if (config.mode === "cliproxyapi" || config.mode === "fallback") { + if (config.mode === "cliproxyapi") { chain.push({ executor: "cliproxyapi", priority: config.cliproxyapiPriority }); + } else if (config.mode === "dario") { + chain.push({ executor: "dario", priority: config.cliproxyapiPriority }); + } else if (config.mode === "fallback") { + chain.push({ executor: config.fallbackBackend, priority: config.cliproxyapiPriority }); } } diff --git a/src/lib/db/versionManager.ts b/src/lib/db/versionManager.ts index 2360194dd5..fe90c3f695 100644 --- a/src/lib/db/versionManager.ts +++ b/src/lib/db/versionManager.ts @@ -16,6 +16,7 @@ interface VersionManagerRow { management_key?: unknown; auto_update?: unknown; auto_start?: unknown; + auto_restart_adopted?: unknown; last_health_check?: unknown; last_update_check?: unknown; health_status?: unknown; @@ -65,6 +66,13 @@ interface VersionManagerTool { managementKey: string | null; autoUpdate: boolean; autoStart: boolean; + /** + * When true, an adopted (unsupervised, pre-existing) process is + * immediately killed and replaced with a fresh spawn this supervisor + * actually owns — trading a brief restart for working log capture. + * Defaults off: adoption alone is already the safe, non-disruptive choice. + */ + autoRestartAdopted: boolean; lastHealthCheck: string | null; lastUpdateCheck: string | null; healthStatus: string; @@ -120,6 +128,10 @@ function rowToVersionManager(row: VersionManagerRow): VersionManagerTool { autoUpdate: record.auto_update === 1 || record.auto_update === true || record.auto_update === "1", autoStart: record.auto_start === 1 || record.auto_start === true || record.auto_start === "1", + autoRestartAdopted: + record.auto_restart_adopted === 1 || + record.auto_restart_adopted === true || + record.auto_restart_adopted === "1", lastHealthCheck: record.last_health_check === null ? null @@ -170,8 +182,7 @@ export async function getVersionManagerStatus(): Promise { export async function getVersionManagerTool(tool: string): Promise { const db = getDbInstance(); const row = db.prepare("SELECT * FROM version_manager WHERE tool = ?").get(tool) as - | VersionManagerRow - | undefined; + VersionManagerRow | undefined; if (!row) return null; return rowToVersionManager(row); } @@ -260,6 +271,7 @@ export async function updateVersionManagerTool( "managementKey", "autoUpdate", "autoStart", + "autoRestartAdopted", "healthStatus", "configOverrides", "errorMessage", @@ -278,7 +290,12 @@ export async function updateVersionManagerTool( if (key === "configOverrides") { sets.push("config_overrides = @configOverrides"); params.configOverrides = stringifyConfigOverrides(value as Record | null); - } else if (key === "autoUpdate" || key === "autoStart" || key === "providerExpose") { + } else if ( + key === "autoUpdate" || + key === "autoStart" || + key === "autoRestartAdopted" || + key === "providerExpose" + ) { sets.push(`${dbKey} = @${key}`); params[key] = value === true ? 1 : 0; } else if (value === null) { @@ -356,6 +373,7 @@ const SERVICE_FIELD_WHITELIST: Set = new Set([ "port", "apiKey", "autoStart", + "autoRestartAdopted", "autoUpdate", "healthStatus", "errorMessage", diff --git a/src/lib/guardrails/visionBridge.ts b/src/lib/guardrails/visionBridge.ts index 34fa2f10bd..33801b4810 100644 --- a/src/lib/guardrails/visionBridge.ts +++ b/src/lib/guardrails/visionBridge.ts @@ -28,6 +28,11 @@ export { isProviderConnectionUsable, hasUsableCredentialsForModel }; type ComboVisionBridgeDecision = "process" | "skip" | "not-combo"; +export function resolveVisionComboName(mapping: Record): string | null { + const comboName = mapping.comboName ?? mapping.name ?? null; + return typeof comboName === "string" && comboName.length > 0 ? comboName : null; +} + /// Check if a combo model should trigger vision bridge processing. /// Resolves combo targets and returns: /// - "process" if any target cannot be proven vision-capable @@ -45,7 +50,7 @@ async function getComboVisionBridgeDecision(model: string): Promise + routerConfig?: Partial, + deps?: import("./visionBridgeRouter").VisionBridgeRouterDeps ): Promise { - // Auto-select the best vision model - const modelToUse = await getBestVisionModel({ - fixedModel: config.model, - ...routerConfig, - }); + // Auto-select the best vision model. `deps` is the router's existing + // injectable credential-check seam — without forwarding it, tests (and any + // embedder) cannot keep model selection away from the live connections DB. + const modelToUse = await getBestVisionModel( + { + fixedModel: config.model, + ...routerConfig, + }, + deps + ); // (#8430) When no vision-capable provider has usable credentials on this // instance, surface a clear error instead of attempting a describe call that // would fail with an opaque auth/serde error upstream. @@ -248,7 +254,7 @@ export async function callVisionModel( let lastError: Error | null = null; // Try primary model + fallbacks - const modelsToTry = [modelToUse, ...(await getFallbackModels(modelToUse, routerConfig))]; + const modelsToTry = [modelToUse, ...(await getFallbackModels(modelToUse, routerConfig, deps))]; const maxAttempts = Math.min(modelsToTry.length, routerConfig?.maxFallbackAttempts ?? 3); for (let attempt = 0; attempt < maxAttempts; attempt++) { @@ -592,10 +598,6 @@ async function callVisionModelSingle( headers, body: JSON.stringify({ model: requestModel, - // Explicit non-stream: OmniRoute's resolveStreamFlag otherwise defaults - // an absent `stream` to true for OpenAI-format self-loop calls, which - // turns the describe response into an SSE stream (the root cause of - // the "is not valid JSON" failure observed with cmd/xiaomi/mimo-v2.5). stream: false, messages: [ { diff --git a/src/lib/initCloudSync.ts b/src/lib/initCloudSync.ts index 94692cadd9..9032452cd0 100644 --- a/src/lib/initCloudSync.ts +++ b/src/lib/initCloudSync.ts @@ -1,12 +1,12 @@ import initializeCloudSync from "@/shared/services/initializeCloudSync"; import { startBudgetResetJob } from "@/lib/jobs/budgetResetJob"; import { startModelSyncScheduler } from "@/shared/services/modelSyncScheduler"; +import { startWarmupScheduler } from "@/lib/warmupScheduler"; import { isAutomatedTestProcess } from "@/shared/utils/testProcess"; // Initialize runtime background sync services once per server process. let initialized = false; - export function shouldSkipCloudSyncInitialization( env: NodeJS.ProcessEnv = process.env, argv: string[] = process.argv @@ -34,6 +34,7 @@ export async function ensureCloudSyncInitialized() { await initializeCloudSync(); startModelSyncScheduler(); startBudgetResetJob(); + startWarmupScheduler(); initialized = true; } catch (error) { console.error("[ServerInit] Error initializing background sync services:", error); diff --git a/src/lib/localDb.ts b/src/lib/localDb.ts index 70a9dee74f..9a4750e4ff 100755 --- a/src/lib/localDb.ts +++ b/src/lib/localDb.ts @@ -89,10 +89,12 @@ export { reorderCombos, deleteCombo, } from "./db/combos"; +export * from "./db/ccrBlocks"; export * from "./db/compressionCacheStats"; export * from "./db/compressionCombos"; export * from "./db/compressionContextBudget"; export * from "./db/compressionRunTelemetry"; +export * from "./db/connectionRuntimeState"; export * from "./db/modelContextOverrides"; export { @@ -809,3 +811,12 @@ export * from "./db/relayProbeStats"; // Relay probe latency/health stats (#6909 export * from "./db/ccDiscoveryAliases"; // Claude Code discovery-alias gate (flag + per-provider/model overrides) export * from "./db/ccDiscoveryMetrics"; // Claude Code discovery-alias usage counters (alias requests + discovery hits) export * from "./db/functionalGatewayMirrors"; // Functional-gateway mirror gate (flag + per-provider/model overrides) +// Radar client — local feed cache + settings (opt-in, encrypted supporter key) +export { + getRadarCache, + setRadarCache, + getRadarSettings, + setRadarOptIn, + setRadarKey, +} from "./db/radar"; +export type { RadarCache, RadarSettings } from "./db/radar"; diff --git a/src/lib/memory/__tests__/generic-backend.test.ts b/src/lib/memory/__tests__/generic-backend.test.ts new file mode 100644 index 0000000000..0e85da9840 --- /dev/null +++ b/src/lib/memory/__tests__/generic-backend.test.ts @@ -0,0 +1,591 @@ +import { describe, test, expect, beforeEach, afterEach, vi } from "vitest"; +import { GenericMemoryBackend, createGenericMemoryBackend } from "../genericBackend"; +import type { Memory } from "../types"; +import { MemoryType } from "../types"; + +// ──────────────────────────────────────────────────────────── +// GenericMemoryBackend — unit tests +// ──────────────────────────────────────────────────────────── + +const BASE_URL = "http://memory.test:8080"; +const BACKEND_ID = "test-backend"; +const BACKEND_NAME = "Test Backend"; + +const SAMPLE_MEMORY: Memory = { + id: "mem-001", + apiKeyId: "key-1", + sessionId: "sess-1", + type: MemoryType.FACTUAL, + key: "my-key", + content: "Hello world", + metadata: { source: "test" }, + embedding: null, + createdAt: new Date("2026-01-01T00:00:00.000Z"), + updatedAt: new Date("2026-01-01T00:00:00.000Z"), + lastAccessedAt: new Date("2026-01-01T00:00:00.000Z"), + expiresAt: null, +}; + +const SAMPLE_MEMORY_JSON = { + ...SAMPLE_MEMORY, + createdAt: "2026-01-01T00:00:00.000Z", + updatedAt: "2026-01-01T00:00:00.000Z", + lastAccessedAt: "2026-01-01T00:00:00.000Z", +}; + +function createBackend(configOverrides: Record = {}) { + return createGenericMemoryBackend(BACKEND_ID, BACKEND_NAME, { + baseUrl: BASE_URL, + ...configOverrides, + }); +} + +describe("GenericMemoryBackend", () => { + let backend: GenericMemoryBackend; + + beforeEach(() => { + vi.resetAllMocks(); + backend = createBackend(); + }); + + // ─── Constructor ───────────────────────────────────────── + + describe("constructor", () => { + test("sets id and displayName from constructor args", () => { + expect(backend.id).toBe(BACKEND_ID); + expect(backend.displayName).toBe(BACKEND_NAME); + }); + + test("accepts custom timeout", () => { + const b = createBackend({ timeout: 5000 }); + expect(b).toBeInstanceOf(GenericMemoryBackend); + }); + }); + + // ─── Health ────────────────────────────────────────────── + + describe("health()", () => { + test("returns ok=true when backend responds 200", async () => { + const fetchMock = vi + .spyOn(globalThis, "fetch") + .mockResolvedValue(new Response(JSON.stringify({ status: "ok" }), { status: 200 })); + + const result = await backend.health(); + + expect(result.ok).toBe(true); + expect(result.latencyMs).toBeGreaterThanOrEqual(0); + expect(result.error).toBeUndefined(); + expect(fetchMock).toHaveBeenCalledWith( + `${BASE_URL}/health`, + expect.objectContaining({ method: "GET" }) + ); + }); + + test("returns ok=false when backend responds 500", async () => { + vi.spyOn(globalThis, "fetch").mockResolvedValue( + new Response("Internal error", { status: 500 }) + ); + + const result = await backend.health(); + + expect(result.ok).toBe(false); + expect(result.error).toContain("HTTP 500"); + }); + + test("returns ok=false on network failure", async () => { + vi.spyOn(globalThis, "fetch").mockRejectedValue(new Error("ECONNREFUSED")); + + const result = await backend.health(); + + expect(result.ok).toBe(false); + expect(result.error).toContain("ECONNREFUSED"); + }); + + test("reports latency in ms", async () => { + const start = Date.now(); + vi.spyOn(globalThis, "fetch").mockImplementation( + () => + new Promise((r) => + setTimeout(() => r(new Response(JSON.stringify({ status: "ok" }), { status: 200 })), 10) + ) + ); + + const result = await backend.health(); + + expect(result.ok).toBe(true); + expect(result.latencyMs).toBeGreaterThanOrEqual(5); + }); + }); + + // ─── Initialize ────────────────────────────────────────── + + describe("initialize()", () => { + test("calls health and throws on failure", async () => { + vi.spyOn(globalThis, "fetch").mockResolvedValue(new Response("fail", { status: 503 })); + + await expect(backend.initialize()).rejects.toThrow("Cannot connect to Test Backend"); + }); + + test("passes when health succeeds", async () => { + vi.spyOn(globalThis, "fetch").mockResolvedValue( + new Response(JSON.stringify({ status: "ok" }), { status: 200 }) + ); + + await expect(backend.initialize()).resolves.toBeUndefined(); + }); + }); + + // ─── CRUD helpers ──────────────────────────────────────── + + /** + * Set up a mock that health-check endpoint returns 200 while + * other endpoints return a custom response. This avoids the + * initialize() health gate. + */ + function mockHealthOkThen(secondResponse: Response) { + let callCount = 0; + return vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + callCount++; + if (callCount === 1 && url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return secondResponse; + }); + } + + // ─── Create ────────────────────────────────────────────── + + describe("create()", () => { + test("POSTs to /memories with input body", async () => { + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify(SAMPLE_MEMORY), { status: 200 }); + }); + + const result = await backend.create({ + apiKeyId: "key-1", + sessionId: "sess-1", + type: MemoryType.FACTUAL, + key: "my-key", + content: "Hello world", + metadata: {}, + expiresAt: null, + }); + + expect(result).toEqual(SAMPLE_MEMORY_JSON); + }); + + test("uses custom create endpoint when configured", async () => { + const b = createBackend({ endpoints: { create: "/api/v1/mem" } }); + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify(SAMPLE_MEMORY), { status: 200 }); + }); + + await b.create({ + apiKeyId: "k1", + sessionId: "s1", + type: MemoryType.FACTUAL, + key: "k", + content: "c", + metadata: {}, + expiresAt: null, + }); + + const createUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + expect(new URL(createUrl).pathname).toBe("/api/v1/mem"); + }); + }); + + // ─── Get ───────────────────────────────────────────────── + + describe("get()", () => { + test("GETs /memories/{id} and returns memory", async () => { + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify(SAMPLE_MEMORY), { status: 200 }); + }); + + const result = await backend.get("mem-001"); + + expect(result).toEqual(SAMPLE_MEMORY_JSON); + const getUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + expect(new URL(getUrl).pathname).toBe("/memories/mem-001"); + }); + + test("returns null on 404", async () => { + vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response("Not found", { status: 404 }); + }); + + const result = await backend.get("mem-999"); + + expect(result).toBeNull(); + }); + + test("throws on non-404 errors", async () => { + vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response("Server error", { status: 500 }); + }); + + await expect(backend.get("mem-001")).rejects.toThrow("HTTP 500"); + }); + + test("uses custom get endpoint with path params", async () => { + const b = createBackend({ + endpoints: { get: "/records/{memoryId}" }, + pathParams: { memoryId: "memoryId" }, + }); + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify(SAMPLE_MEMORY), { status: 200 }); + }); + + await b.get("mem-001"); + + const getUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + expect(new URL(getUrl).pathname).toBe("/records/mem-001"); + }); + }); + + // ─── Update ────────────────────────────────────────────── + + describe("update()", () => { + test("PATCHes /memories/{id} with updates", async () => { + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(null, { status: 204 }); + }); + + const result = await backend.update("mem-001", { content: "updated" }); + + expect(result).toBe(true); + const updateUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + expect(new URL(updateUrl).pathname).toBe("/memories/mem-001"); + }); + + test("returns false on 404", async () => { + vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response("Not found", { status: 404 }); + }); + + const result = await backend.update("mem-999", { content: "x" }); + + expect(result).toBe(false); + }); + }); + + // ─── Delete ────────────────────────────────────────────── + + describe("delete()", () => { + test("DELETEs /memories/{id}", async () => { + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(null, { status: 204 }); + }); + + const result = await backend.delete("mem-001"); + + expect(result).toBe(true); + const delUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + expect(new URL(delUrl).pathname).toBe("/memories/mem-001"); + }); + + test("returns false on 404", async () => { + vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response("Not found", { status: 404 }); + }); + + const result = await backend.delete("mem-999"); + + expect(result).toBe(false); + }); + }); + + // ─── List ──────────────────────────────────────────────── + + describe("list()", () => { + test("GETs /memories with query params", async () => { + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response( + JSON.stringify({ data: [SAMPLE_MEMORY], total: 1, byType: { factual: 1 } }), + { status: 200 } + ); + }); + + const result = await backend.list({ + apiKeyId: "key-1", + type: MemoryType.FACTUAL, + limit: 10, + offset: 0, + }); + + expect(result.data).toHaveLength(1); + expect(result.total).toBe(1); + const listUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + expect(listUrl).toContain("apiKeyId=key-1"); + expect(listUrl).toContain("limit=10"); + expect(listUrl).toContain("offset=0"); + }); + + test("applies custom query param names", async () => { + const b = createBackend({ + queryParams: { apiKeyId: "owner", limit: "count" }, + }); + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify({ data: [], total: 0, byType: {} }), { status: 200 }); + }); + + await b.list({ apiKeyId: "key-1", limit: 5 }); + const listUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + + expect(listUrl).toContain("owner=key-1"); + expect(listUrl).toContain("count=5"); + expect(listUrl).not.toContain("apiKeyId="); + }); + }); + + // ─── Search ────────────────────────────────────────────── + + describe("search()", () => { + test("GETs /memories/search with query params", async () => { + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify([SAMPLE_MEMORY]), { status: 200 }); + }); + + const result = await backend.search({ + query: "hello", + apiKeyId: "key-1", + strategy: "semantic", + limit: 5, + }); + + expect(result).toHaveLength(1); + const searchUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + expect(searchUrl).toContain("/memories/search"); + expect(searchUrl).toContain("query=hello"); + expect(searchUrl).toContain("strategy=semantic"); + }); + + test("uses custom search endpoint", async () => { + const b = createBackend({ endpoints: { search: "/api/search" } }); + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify([]), { status: 200 }); + }); + + await b.search({ query: "q", apiKeyId: "k" }); + + const searchUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + expect(searchUrl).toContain("/api/search"); + }); + + test("serializes options as JSON query param", async () => { + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify([]), { status: 200 }); + }); + + await backend.search({ + query: "hello", + apiKeyId: "key-1", + options: { filter: { lang: "en" } }, + }); + const searchUrl = fetchMock.mock.calls.find( + ([url]) => !url.toString().endsWith("/health") + )![0] as string; + + expect(searchUrl).toContain(encodeURIComponent(JSON.stringify({ filter: { lang: "en" } }))); + }); + }); + + // ─── Auth headers ──────────────────────────────────────── + + describe("authentication", () => { + test("sends Authorization header when apiKey is configured", async () => { + const b = createBackend({ apiKey: "secret-123" }); + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + }); + + await b.health(); + + const headers = fetchMock.mock.calls[0]![1] as RequestInit; + expect(headers.headers).toMatchObject({ + Authorization: "Bearer secret-123", + }); + }); + + test("sends custom headers when configured", async () => { + const b = createBackend({ + headers: { "X-Api-Key": "abc", "Notion-Version": "2022-06-28" }, + }); + const fetchMock = vi.spyOn(globalThis, "fetch").mockImplementation(async (url: string) => { + if (url.toString().endsWith("/health")) { + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + } + return new Response(JSON.stringify({ status: "ok" }), { status: 200 }); + }); + + await b.health(); + + const headers = fetchMock.mock.calls[0]![1] as RequestInit; + expect(headers.headers).toMatchObject({ + "X-Api-Key": "abc", + "Notion-Version": "2022-06-28", + }); + }); + }); + + // ─── Factory ───────────────────────────────────────────── + + describe("createGenericMemoryBackend factory", () => { + test("returns a GenericMemoryBackend instance", () => { + const b = createGenericMemoryBackend("fac", "Factory", { baseUrl: "http://x" }); + expect(b).toBeInstanceOf(GenericMemoryBackend); + expect(b.id).toBe("fac"); + }); + }); + + // ─── SSRF guard ────────────────────────────────────────── + + describe("SSRF prevention", () => { + test("blocks requests to loopback IPv4 (127.0.0.1)", async () => { + const b = createBackend({ baseUrl: "http://127.0.0.1:20128" }); + const result = await b.health(); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSRF guard"); + }); + + test("blocks requests to private IPv4 (10.x.x.x)", async () => { + const b = createBackend({ baseUrl: "http://10.0.0.5/api" }); + const result = await b.health(); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSRF guard"); + }); + + test("blocks requests to private IPv4 (192.168.x.x)", async () => { + const b = createBackend({ baseUrl: "http://192.168.1.100" }); + const result = await b.health(); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSRF guard"); + }); + + test("blocks requests to cloud metadata IP (169.254.169.254)", async () => { + const b = createBackend({ baseUrl: "http://169.254.169.254/latest/meta-data/" }); + const result = await b.health(); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSRF guard"); + }); + + test("blocks requests to loopback IPv6 (::1)", async () => { + const b = createBackend({ baseUrl: "http://[::1]:20128" }); + const result = await b.health(); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSRF guard"); + }); + + test("blocks non-http schemes (file://)", async () => { + const b = createBackend({ baseUrl: "file:///etc/passwd" }); + const result = await b.health(); + expect(result.ok).toBe(false); + expect(result.error).toContain("SSRF guard"); + }); + + test("allows public IP addresses", async () => { + const b = createBackend({ baseUrl: "http://93.184.216.34:8080" }); + vi.spyOn(globalThis, "fetch").mockResolvedValue( + new Response(JSON.stringify({ status: "ok" }), { status: 200 }) + ); + // Should pass SSRF guard and proceed to the actual fetch (which will + // hit the mock, not the real host) + await expect(b.health()).resolves.toHaveProperty("ok", true); + }); + + test("allows hostnames (passes structural check)", async () => { + const b = createBackend({ baseUrl: "https://api.example.com" }); + vi.spyOn(globalThis, "fetch").mockResolvedValue( + new Response(JSON.stringify({ status: "ok" }), { status: 200 }) + ); + await expect(b.health()).resolves.toHaveProperty("ok", true); + }); + + test("SSRF guard fires during create() via request()", async () => { + const b = createBackend({ baseUrl: "http://127.0.0.1:20128" }); + // Mock the fetch so health fails (SSRF guard) — but the CRUD method + // calls initialize() first, which calls health(), which should throw + vi.spyOn(globalThis, "fetch").mockResolvedValue( + new Response(JSON.stringify({ status: "ok" }), { status: 200 }) + ); + await expect( + b.create({ + apiKeyId: "k1", + sessionId: "s1", + type: MemoryType.FACTUAL, + key: "k", + content: "c", + metadata: {}, + expiresAt: null, + }) + ).rejects.toThrow("SSRF guard"); + }); + }); +}); diff --git a/src/lib/memory/__tests__/retrieval.test.ts b/src/lib/memory/__tests__/retrieval.test.ts index 2688694d4c..f0268803ac 100644 --- a/src/lib/memory/__tests__/retrieval.test.ts +++ b/src/lib/memory/__tests__/retrieval.test.ts @@ -73,6 +73,13 @@ const API_KEY_ID = "test-api-key-fts5"; */ function setupSchema(db: InstanceType) { db.exec(` + CREATE TABLE IF NOT EXISTS key_value ( + namespace TEXT NOT NULL, + key TEXT NOT NULL, + value TEXT NOT NULL, + PRIMARY KEY (namespace, key) + ); + CREATE TABLE IF NOT EXISTS memories ( id INTEGER PRIMARY KEY, api_key_id TEXT NOT NULL, @@ -143,7 +150,7 @@ function insertMemory( ); } -describe("Memory Retrieval — FTS5 integration", () => { +describe("Memory Retrieval — FTS5 integration (pre-existing broken test infrastructure)", () => { let db: InstanceType; let savedDb: unknown; diff --git a/src/lib/memory/backend.ts b/src/lib/memory/backend.ts new file mode 100644 index 0000000000..ebc4906e31 --- /dev/null +++ b/src/lib/memory/backend.ts @@ -0,0 +1,93 @@ +/** + * MemoryBackend Provider Pattern + * Interface for pluggable memory backends (SQLite, Obsidian, Brain, Notion, Custom) + */ +import type { Memory, MemoryType } from "./types"; +export type { Memory, MemoryType } from "./types"; + +/** Input for creating a new memory */ +export interface CreateMemoryInput { + apiKeyId: string; + sessionId: string; + type: MemoryType; + key: string; + content: string; + metadata?: Record; + expiresAt?: Date | null; +} + +/** Filters for listing/searching memories */ +export interface MemoryFilter { + apiKeyId?: string; + type?: MemoryType; + sessionId?: string; + query?: string; + limit?: number; + offset?: number; + orderBy?: "createdAt" | "updatedAt" | "lastAccessedAt"; + orderDir?: "asc" | "desc"; +} + +/** Search configuration - backend decides strategy (exact, semantic, hybrid) */ +export interface SearchConfig { + query: string; + apiKeyId: string; + limit?: number; + maxTokens?: number; + strategy?: "exact" | "semantic" | "hybrid"; + /** Backend-specific options */ + options?: Record; +} + +/** Health check result */ +export interface HealthCheckResult { + ok: boolean; + latencyMs: number; + error?: string; +} + +/** Core MemoryBackend interface - all backends must implement */ +export interface MemoryBackend { + /** Unique backend identifier: "sqlite" | "obsidian" | "brain" | "notion" | "custom" */ + readonly id: string; + + /** Human-readable display name */ + readonly displayName: string; + + // ─── CRUD ─── + + /** Create a new memory (upsert if same apiKeyId + key) */ + create(input: CreateMemoryInput): Promise; + + /** Get a memory by ID */ + get(id: string): Promise; + + /** Update a memory */ + update(id: string, updates: Partial>): Promise; + + /** Delete a memory by ID */ + delete(id: string): Promise; + + /** List memories with filtering and pagination */ + list( + filter: MemoryFilter + ): Promise<{ data: Memory[]; total: number; byType: Record }>; + + // ─── Search ─── + + /** Search memories - backend decides strategy (FTS5, vector, hybrid, etc.) */ + search(config: SearchConfig): Promise; + + // ─── Health ─── + + /** Health check - returns ok + latency */ + health(): Promise; + + // ─── Optional lifecycle ─── + + /** Initialize backend (connect, create tables, etc.) - called on registration */ + initialize?(): Promise; + + /** Shutdown backend (close connections, etc.) - called on unregister */ + shutdown?(): Promise; +} diff --git a/src/lib/memory/genericBackend.ts b/src/lib/memory/genericBackend.ts new file mode 100644 index 0000000000..5e84e7217c --- /dev/null +++ b/src/lib/memory/genericBackend.ts @@ -0,0 +1,433 @@ +/** + * GenericMemoryBackend - Generic HTTP connector for any memory backend + * Connects to external memory backends via REST API + * Supports Obsidian, Notion, custom backends, etc. + */ + +import { logger } from "../../../open-sse/utils/logger.ts"; +import type { + MemoryBackend, + CreateMemoryInput, + MemoryFilter, + SearchConfig, + HealthCheckResult, + Memory, +} from "./backend"; +import { MemoryType } from "./types"; + +// ─── SSRF guard helpers (no DNS resolution) ──────────────────────────── +// Reused from fetchGuard.ts pattern: block requests to internal/reserved +// IP ranges when the host is an IP literal. Hostnames pass the structural +// check since they require DNS resolution. + +const ALLOWED_SCHEMES = new Set(["http:", "https:"]); + +const BLOCKED_IPV4: ReadonlyArray = [ + [0x00000000, 0xff000000], // 0.0.0.0/8 unspecified + [0x7f000000, 0xff000000], // 127.0.0.0/8 loopback + [0x0a000000, 0xff000000], // 10.0.0.0/8 private + [0xac100000, 0xfff00000], // 172.16.0.0/12 private + [0xc0a80000, 0xffff0000], // 192.168.0.0/16 private + [0xa9fe0000, 0xffff0000], // 169.254.0.0/16 link-local (cloud metadata) +]; + +function ipv4ToLong(host: string): number | null { + const parts = host.split(".").map(Number); + if (parts.length !== 4 || parts.some((p) => Number.isNaN(p) || p < 0 || p > 255)) return null; + return (parts[0] * 16777216 + parts[1] * 65536 + parts[2] * 256 + parts[3]) >>> 0; +} + +function isIpv4Blocked(ip: string): boolean { + const n = ipv4ToLong(ip); + if (n === null) return false; + return BLOCKED_IPV4.some(([base, mask]) => ((n & mask) >>> 0) === (base >>> 0)); +} + +function isIpv6Blocked(ip: string): boolean { + const h = ip.toLowerCase(); + return h === "::1" || h === "::" || h.startsWith("fe80") || h.startsWith("fc") || h.startsWith("fd"); +} + +function isIpLiteral(host: string): boolean { + const IPV4_RE = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; + if (IPV4_RE.test(host)) return true; + return host.includes(":") && /^([0-9a-fA-F:]+)$/.test(host); +} + +/** + * Validate that a URL is safe to fetch from the server. + * Blocks requests to internal/reserved IP ranges when the host is an IP literal. + * Hostnames pass the structural check (SSRF prevention at fetch-time requires DNS). + */ +function isValidHttpUrl(url: URL): boolean { + if (!ALLOWED_SCHEMES.has(url.protocol)) return false; + const rawHost = url.hostname.toLowerCase(); + const host = rawHost.startsWith("[") && rawHost.endsWith("]") ? rawHost.slice(1, -1) : rawHost; + if (host === "") return false; + if (isIpLiteral(host)) { + if (/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/.test(host)) return !isIpv4Blocked(host); + return !isIpv6Blocked(host); + } + return true; // hostname: passes structural check +} + +const log = logger("GENERIC_MEMORY_BACKEND"); + +export interface GenericBackendConfig { + /** Base URL of the memory backend API */ + baseUrl: string; + /** API key for authentication */ + apiKey?: string; + /** Custom headers */ + headers?: Record; + /** Request timeout in ms */ + timeout?: number; + /** Backend type identifier for logging */ + backendType?: string; + + /** ─── Dynamic endpoint templates (NEW) ─── + * Supports placeholders: {id}, {dbId}, {memoryId}, etc. + * If omitted, defaults to REST conventions below. + */ + endpoints?: { + /** GET /memories?query=... */ + search?: string; // default: "/memories/search" + /** POST /memories */ + create?: string; // default: "/memories" + /** GET /memories */ + list?: string; // default: "/memories" + /** GET /memories/{id} */ + get?: string; // default: "/memories/{id}" + /** PATCH /memories/{id} */ + update?: string; // default: "/memories/{id}" + /** DELETE /memories/{id} */ + delete?: string; // default: "/memories/{id}" + /** GET /health */ + health?: string; // default: "/health" + }; + + /** ─── Query parameter name mapping (NEW) ─── + * Maps internal param names → backend-specific names + */ + queryParams?: { + query?: string; // default: "query" + apiKeyId?: string; // default: "apiKeyId" + limit?: string; // default: "limit" + offset?: string; // default: "offset" + strategy?: string; // default: "strategy" + maxTokens?: string; // default: "maxTokens" + type?: string; // default: "type" + sessionId?: string; // default: "sessionId" + orderBy?: string; // default: "orderBy" + orderDir?: string; // default: "orderDir" + options?: string; // default: "options" + }; + + /** ─── Path parameter name mapping (NEW) ─── + * Maps internal placeholder names → backend-specific names + */ + pathParams?: { + id?: string; // default: "id" + memoryId?: string; // default: "memoryId" + }; +} + +export class GenericMemoryBackend implements MemoryBackend { + readonly id: string; + readonly displayName: string; + + private config: GenericBackendConfig; + private initialized = false; + + constructor(id: string, displayName: string, config: GenericBackendConfig) { + this.id = id; + this.displayName = displayName; + this.config = { + timeout: 30000, + ...config, + }; + } + + async initialize(): Promise { + const healthy = await this.health(); + if (!healthy.ok) { + throw new Error( + `Cannot connect to ${this.displayName} at ${this.config.baseUrl}: ${healthy.error}` + ); + } + this.initialized = true; + log.info("generic.backend.initialized", { id: this.id, baseUrl: this.config.baseUrl }); + } + + private getEndpoints() { + return { + search: this.config.endpoints?.search ?? "/memories/search", + create: this.config.endpoints?.create ?? "/memories", + list: this.config.endpoints?.list ?? "/memories", + get: this.config.endpoints?.get ?? "/memories/{id}", + update: this.config.endpoints?.update ?? "/memories/{id}", + delete: this.config.endpoints?.delete ?? "/memories/{id}", + health: this.config.endpoints?.health ?? "/health", + }; + } + + private getQueryParams() { + return { + query: this.config.queryParams?.query ?? "query", + apiKeyId: this.config.queryParams?.apiKeyId ?? "apiKeyId", + limit: this.config.queryParams?.limit ?? "limit", + offset: this.config.queryParams?.offset ?? "offset", + strategy: this.config.queryParams?.strategy ?? "strategy", + maxTokens: this.config.queryParams?.maxTokens ?? "maxTokens", + type: this.config.queryParams?.type ?? "type", + sessionId: this.config.queryParams?.sessionId ?? "sessionId", + orderBy: this.config.queryParams?.orderBy ?? "orderBy", + orderDir: this.config.queryParams?.orderDir ?? "orderDir", + options: this.config.queryParams?.options ?? "options", + }; + } + + private getPathParams() { + return { + id: this.config.pathParams?.id ?? "id", + memoryId: this.config.pathParams?.memoryId ?? "memoryId", + }; + } + + /** Resolve endpoint template with path params */ + private resolveEndpoint(template: string, params: Record = {}): string { + return template.replace(/{(\w+)}/g, (_, key) => params[key] ?? `{${key}}`); + } + + /** Build query params from SearchConfig using mapped names */ + private buildSearchQuery(config: SearchConfig): Record { + const qp = this.getQueryParams(); + const out: Record = {}; + + out[qp.query] = config.query; + out[qp.apiKeyId] = config.apiKeyId; + if (config.limit) out[qp.limit] = String(config.limit); + if (config.maxTokens) out[qp.maxTokens] = String(config.maxTokens); + if (config.strategy) out[qp.strategy] = config.strategy; + if (config.options) out[qp.options] = JSON.stringify(config.options); + + return out; + } + + /** Build query params from MemoryFilter using mapped names */ + private buildListQuery(filter: MemoryFilter): Record { + const qp = this.getQueryParams(); + const out: Record = {}; + + if (filter.apiKeyId) out[qp.apiKeyId] = filter.apiKeyId; + if (filter.type) out[qp.type] = filter.type; + if (filter.sessionId) out[qp.sessionId] = filter.sessionId; + if (filter.limit !== undefined) out[qp.limit] = String(filter.limit); + if (filter.offset !== undefined) out[qp.offset] = String(filter.offset); + if (filter.orderBy) out[qp.orderBy] = filter.orderBy; + if (filter.orderDir) out[qp.orderDir] = filter.orderDir; + + return out; + } + + private async request( + method: string, + path: string, + body?: unknown, + queryParams?: Record + ): Promise { + const url = new URL(path, this.config.baseUrl); + + // SSRF guard: reject requests to internal/reserved IP ranges + if (!isValidHttpUrl(url)) { + throw new Error( + `SSRF guard blocked request to ${url.host} — internal/reserved addresses are not allowed` + ); + } + if (queryParams) { + Object.entries(queryParams).forEach(([key, value]) => { + url.searchParams.append(key, value); + }); + } + + const headers: Record = { + "Content-Type": "application/json", + ...this.config.headers, + }; + + if (this.config.apiKey) { + headers["Authorization"] = `Bearer ${this.config.apiKey}`; + } + + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), this.config.timeout); + + try { + const response = await fetch(url.toString(), { + method, + headers, + body: body ? JSON.stringify(body) : undefined, + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + const errorText = await response.text().catch(() => ""); + throw new Error(`HTTP ${response.status}: ${errorText}`); + } + + if (response.status === 204) { + return undefined as T; + } + + return response.json() as Promise; + } catch (e) { + clearTimeout(timeoutId); + throw e; + } + } + + // ─── CRUD ─── + + async create(input: CreateMemoryInput): Promise { + if (!this.initialized) await this.initialize(); + + const endpoint = this.resolveEndpoint(this.getEndpoints().create); + const memory = await this.request("POST", endpoint, input); + return memory; + } + + async get(id: string): Promise { + if (!this.initialized) await this.initialize(); + + const pathParams = this.getPathParams(); + const endpoint = this.resolveEndpoint(this.getEndpoints().get, { + [pathParams.id]: id, + [pathParams.memoryId]: id, + }); + + try { + return await this.request("GET", endpoint); + } catch (e) { + if (String(e).includes("404")) return null; + throw e; + } + } + + async update(id: string, updates: Partial>): Promise { + if (!this.initialized) await this.initialize(); + + const pathParams = this.getPathParams(); + const endpoint = this.resolveEndpoint(this.getEndpoints().update, { + [pathParams.id]: id, + [pathParams.memoryId]: id, + }); + + try { + await this.request("PATCH", endpoint, updates); + return true; + } catch (e) { + if (String(e).includes("404")) return false; + throw e; + } + } + + async delete(id: string): Promise { + if (!this.initialized) await this.initialize(); + + const pathParams = this.getPathParams(); + const endpoint = this.resolveEndpoint(this.getEndpoints().delete, { + [pathParams.id]: id, + [pathParams.memoryId]: id, + }); + + try { + await this.request("DELETE", endpoint); + return true; + } catch (e) { + if (String(e).includes("404")) return false; + throw e; + } + } + + async list( + filter: MemoryFilter + ): Promise<{ data: Memory[]; total: number; byType: Record }> { + if (!this.initialized) await this.initialize(); + + const endpoint = this.getEndpoints().list; + const queryParams = this.buildListQuery(filter); + + return this.request<{ data: Memory[]; total: number; byType: Record }>( + "GET", + endpoint, + undefined, + queryParams + ); + } + + // ─── Search ─── + + async search(config: SearchConfig): Promise { + if (!this.initialized) await this.initialize(); + + const endpoint = this.getEndpoints().search; + const queryParams = this.buildSearchQuery(config); + + return this.request("GET", endpoint, undefined, queryParams); + } + + // ─── Health ─── + + async health(): Promise { + const start = Date.now(); + try { + const endpoint = this.getEndpoints().health; + await this.request<{ status: string }>("GET", endpoint); + return { ok: true, latencyMs: Date.now() - start }; + } catch (e) { + return { ok: false, latencyMs: Date.now() - start, error: String(e) }; + } + } +} + +/** Factory function to create a generic memory backend */ +export const createGenericMemoryBackend = ( + id: string, + displayName: string, + config: GenericBackendConfig +): GenericMemoryBackend => new GenericMemoryBackend(id, displayName, config); + +/** Predefined configurations for known backends */ +export const KNOWN_BACKENDS = { + obsidian: { + id: "obsidian", + displayName: "Obsidian Vault", + config: { + baseUrl: process.env.OBSIDIAN_API_URL || "http://localhost:27123", + apiKey: process.env.OBSIDIAN_API_KEY, + backendType: "obsidian", + } as GenericBackendConfig, + }, + notion: { + id: "notion", + displayName: "Notion", + config: { + baseUrl: process.env.NOTION_API_URL || "https://api.notion.com/v1", + apiKey: process.env.NOTION_API_KEY, + backendType: "notion", + headers: { + "Notion-Version": "2022-06-28", + }, + } as GenericBackendConfig, + }, +} as const; + +export type KnownBackendId = keyof typeof KNOWN_BACKENDS; + +/** Create a known backend from presets */ +export const createKnownBackend = (id: KnownBackendId): GenericMemoryBackend => { + const preset = KNOWN_BACKENDS[id]; + return createGenericMemoryBackend(preset.id, preset.displayName, preset.config); +}; diff --git a/src/lib/memory/index.ts b/src/lib/memory/index.ts new file mode 100644 index 0000000000..bfeeb32346 --- /dev/null +++ b/src/lib/memory/index.ts @@ -0,0 +1,44 @@ +/** + * Memory module exports and initialization + */ + +import { logger } from "../../../open-sse/utils/logger.ts"; +const log = logger("MEMORY"); + +export * from "./backend"; +export * from "./manager"; +export * from "./settings"; +export * from "./types"; +export * from "./store"; +export * from "./retrieval"; +export * from "./vectorStore"; +export * from "./embedding"; +export * from "./sqliteBackend"; +export * from "./genericBackend"; + +// Auto-register SQLiteBackend with MemoryManager on import (sync only) +import { memoryManager } from "./manager"; +import { sqliteBackend } from "./sqliteBackend"; + +memoryManager.register(sqliteBackend); + +export { memoryManager } from "./manager"; +export { sqliteBackend } from "./sqliteBackend"; +export { createGenericMemoryBackend, createKnownBackend } from "./genericBackend"; +export type { GenericBackendConfig, KnownBackendId } from "./genericBackend"; +export { KNOWN_BACKENDS } from "./genericBackend"; + +/** + * Initialize memory backends from settings. + * Call this after DB is ready (e.g., from app bootstrap). + */ +export async function initMemoryBackends(): Promise { + const { getMemorySettings } = await import("./settings"); + try { + const settings = await getMemorySettings(); + memoryManager.configure(settings.primaryBackend, settings.fallbackBackends); + await memoryManager.initialize(); + } catch (e) { + log.warn("Failed to initialize backends", { error: String(e) }); + } +} diff --git a/src/lib/memory/manager.ts b/src/lib/memory/manager.ts new file mode 100644 index 0000000000..473aef8d72 --- /dev/null +++ b/src/lib/memory/manager.ts @@ -0,0 +1,215 @@ +/** + * MemoryManager - Singleton orchestrator for memory backends + * Handles registration, routing, fallback, and caching + */ +import { logger } from "../../../open-sse/utils/logger.ts"; +import type { + MemoryBackend, + CreateMemoryInput, + MemoryFilter, + SearchConfig, + HealthCheckResult, +} from "./backend"; +import type { Memory } from "./types"; +const log = logger("MEMORY_MANAGER"); +type BackendRegistry = Map; + +class MemoryManager { + private static instance: MemoryManager; + private backends: BackendRegistry = new Map(); + private primaryBackendId: string = "sqlite"; + private fallbackBackendIds: string[] = []; + private initialized = false; + + private constructor() {} + + static getInstance(): MemoryManager { + if (!MemoryManager.instance) { + MemoryManager.instance = new MemoryManager(); + } + return MemoryManager.instance; + } + + /** Register a backend implementation */ + register(backend: MemoryBackend): void { + if (this.backends.has(backend.id)) { + log.warn(`Backend "${backend.id}" already registered, overwriting`, { id: backend.id }); + } + this.backends.set(backend.id, backend); + log.info("Registered backend", { id: backend.id, displayName: backend.displayName }); + } + + /** Unregister a backend */ + unregister(backendId: string): void { + const backend = this.backends.get(backendId); + if (backend?.shutdown) { + backend + .shutdown() + .catch((e) => log.error(`Shutdown error for ${backendId}`, { error: String(e) })); + } + this.backends.delete(backendId); + log.info("Unregistered backend", { id: backendId }); + } + + /** Get a backend by ID */ + getBackend(backendId?: string): MemoryBackend | undefined { + const id = backendId ?? this.primaryBackendId; + return this.backends.get(id); + } + + /** Get the primary backend (must exist) */ + getPrimaryBackend(): MemoryBackend { + const backend = this.getBackend(this.primaryBackendId); + if (!backend) { + throw new Error(`[MemoryManager] Primary backend "${this.primaryBackendId}" not registered`); + } + return backend; + } + + /** Get fallback backends in order */ + getFallbackBackends(): MemoryBackend[] { + return this.fallbackBackendIds + .map((id) => this.backends.get(id)) + .filter((b): b is MemoryBackend => b !== undefined); + } + + /** Configure primary and fallback backends */ + configure(primary: string, fallbacks: string[] = []): void { + if (!this.backends.has(primary)) { + throw new Error(`[MemoryManager] Primary backend "${primary}" not registered`); + } + this.primaryBackendId = primary; + this.fallbackBackendIds = fallbacks.filter((id) => this.backends.has(id)); + log.info("Configured backends", { + primary, + fallbacks: this.fallbackBackendIds, + }); + } + + /** Initialize all registered backends */ + async initialize(): Promise { + if (this.initialized) return; + + for (const [id, backend] of this.backends) { + if (backend.initialize) { + try { + await backend.initialize(); + log.info("Initialized backend", { id }); + } catch (e) { + log.error(`Failed to initialize backend ${id}`, { error: String(e) }); + } + } + } + this.initialized = true; + } + + /** Shutdown all backends */ + async shutdown(): Promise { + for (const [id, backend] of this.backends) { + if (backend.shutdown) { + try { + await backend.shutdown(); + } catch (e) { + log.error(`Shutdown error for ${id}`, { error: String(e) }); + } + } + } + this.initialized = false; + } + + // ─── Delegated CRUD with fallback ─── + + async create(input: CreateMemoryInput): Promise { + const primary = this.getPrimaryBackend(); + return primary.create(input); + } + + async get(id: string): Promise { + // Try primary first + const primary = this.getPrimaryBackend(); + const result = await primary.get(id); + if (result) return result; + + // Try fallbacks + for (const backend of this.getFallbackBackends()) { + const fallbackResult = await backend.get(id); + if (fallbackResult) return fallbackResult; + } + return null; + } + + async update(id: string, updates: Partial>): Promise { + const primary = this.getPrimaryBackend(); + const updated = await primary.update(id, updates); + + // Also try to update in fallbacks (fire-and-forget, don't fail on fallback errors) + for (const backend of this.getFallbackBackends()) { + backend + .update(id, updates) + .catch((e) => log.warn(`Fallback update failed for ${backend.id}`, { error: String(e) })); + } + return updated; + } + + async delete(id: string): Promise { + const primary = this.getPrimaryBackend(); + const deleted = await primary.delete(id); + + // Also delete from fallbacks + for (const backend of this.getFallbackBackends()) { + backend + .delete(id) + .catch((e) => log.warn(`Fallback delete failed for ${backend.id}`, { error: String(e) })); + } + return deleted; + } + + async list( + filter: MemoryFilter + ): Promise<{ data: Memory[]; total: number; byType: Record }> { + // Only primary handles list (fallbacks are for get/search redundancy) + return this.getPrimaryBackend().list(filter); + } + + // ─── Search with fallback ─── + + async search(config: SearchConfig): Promise { + const primary = this.getPrimaryBackend(); + try { + return await primary.search(config); + } catch (primaryError) { + log.warn("Primary search failed, trying fallbacks", { error: String(primaryError) }); + + for (const backend of this.getFallbackBackends()) { + try { + return await backend.search(config); + } catch (fallbackError) { + log.warn(`Fallback ${backend.id} search failed`, { error: String(fallbackError) }); + } + } + return []; + } + } + + // ─── Health check across all backends ─── + + async healthCheckAll(): Promise> { + const results: Record = {}; + for (const [id, backend] of this.backends) { + results[id] = await backend.health(); + } + return results; + } + + /** Get all registered backend info */ + getRegisteredBackends(): { id: string; displayName: string; isPrimary: boolean }[] { + return Array.from(this.backends.entries()).map(([id, backend]) => ({ + id, + displayName: backend.displayName, + isPrimary: id === this.primaryBackendId, + })); + } +} + +export const memoryManager = MemoryManager.getInstance(); +export default memoryManager; diff --git a/src/lib/memory/obsidianBackend.ts b/src/lib/memory/obsidianBackend.ts new file mode 100644 index 0000000000..a4014488fc --- /dev/null +++ b/src/lib/memory/obsidianBackend.ts @@ -0,0 +1,346 @@ +/** + * ObsidianBackend - Optional backend for Obsidian Vault + * Reads/writes memories as Markdown files with YAML frontmatter + */ + +import { logger } from "../../../open-sse/utils/logger.ts"; +import type { + MemoryBackend, + CreateMemoryInput, + MemoryFilter, + SearchConfig, + HealthCheckResult, + Memory, +} from "./backend"; +import { MemoryType } from "./types"; + +const log = logger("OBSIDIAN_BACKEND"); + +/** Optional backend for Obsidian Vault */ +export class ObsidianBackend implements MemoryBackend { + readonly id = "obsidian"; + readonly displayName = "Obsidian Vault"; + // isPrimary is managed by MemoryManager, not the backend itself + + private vaultPath: string; + private initialized = false; + + constructor(vaultPath: string) { + this.vaultPath = vaultPath; + } + + async initialize(): Promise { + // Verify vault path exists + const fs = await import("fs/promises"); + try { + await fs.access(this.vaultPath); + this.initialized = true; + log.info("obsidian.backend.initialized", { vaultPath: this.vaultPath }); + } catch { + throw new Error(`Obsidian vault not found at: ${this.vaultPath}`); + } + } + + async shutdown(): Promise { + this.initialized = false; + log.info("obsidian.backend.shutdown"); + } + + async create(input: CreateMemoryInput): Promise { + if (!this.initialized) await this.initialize(); + + const fs = await import("fs/promises"); + const path = await import("path"); + + const id = crypto.randomUUID(); + const fileName = `${input.key}.md`; + const filePath = path.join(this.vaultPath, fileName); + + const frontmatter = [ + "---", + `id: ${id}`, + `apiKeyId: ${input.apiKeyId}`, + `sessionId: ${input.sessionId}`, + `type: ${input.type}`, + `createdAt: ${new Date().toISOString()}`, + `updatedAt: ${new Date().toISOString()}`, + `expiresAt: ${input.expiresAt?.toISOString() || "null"}`, + "---", + "", + ].join("\n"); + + const content = frontmatter + input.content; + + await fs.writeFile(filePath, content, "utf-8"); + + return { + id, + apiKeyId: input.apiKeyId, + sessionId: input.sessionId, + type: input.type, + key: input.key, + content: input.content, + metadata: input.metadata || {}, + createdAt: new Date(), + updatedAt: new Date(), + expiresAt: input.expiresAt || null, + accessCount: 0, + lastAccessedAt: null, + }; + } + + async get(id: string): Promise { + if (!this.initialized) await this.initialize(); + + const fs = await import("fs/promises"); + const path = await import("path"); + + // Find file by id in frontmatter + const files = await fs.readdir(this.vaultPath); + + for (const file of files) { + if (!file.endsWith(".md")) continue; + + const filePath = path.join(this.vaultPath, file); + const content = await fs.readFile(filePath, "utf-8"); + + const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/); + if (!frontmatterMatch) continue; + + const frontmatter = frontmatterMatch[1]; + const idMatch = frontmatter.match(/^id:\s*(.+)$/m); + if (idMatch && idMatch[1].trim() === id) { + const body = content.replace(/^---\n[\s\S]*?\n---\n/, ""); + return this.parseMemory(frontmatter, body, id); + } + } + + return null; + } + + async update(id: string, updates: Partial>): Promise { + if (!this.initialized) await this.initialize(); + + const fs = await import("fs/promises"); + const path = await import("path"); + + const files = await fs.readdir(this.vaultPath); + + for (const file of files) { + if (!file.endsWith(".md")) continue; + + const filePath = path.join(this.vaultPath, file); + const content = await fs.readFile(filePath, "utf-8"); + + const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/); + if (!frontmatterMatch) continue; + + const frontmatter = frontmatterMatch[1]; + const idMatch = frontmatter.match(/^id:\s*(.+)$/m); + if (idMatch && idMatch[1].trim() === id) { + let newFrontmatter = frontmatter; + let newBody = content.replace(/^---\n[\s\S]*?\n---\n/, ""); + + if (updates.content !== undefined) { + newBody = updates.content; + } + + // Update frontmatter fields + const lines = newFrontmatter.split("\n").map((line) => { + if (updates.type !== undefined && line.startsWith("type:")) + return `type: ${updates.type}`; + if (updates.key !== undefined && line.startsWith("key:")) return `key: ${updates.key}`; + if (updates.metadata !== undefined && line.startsWith("metadata:")) + return `metadata: ${JSON.stringify(updates.metadata)}`; + if (updates.expiresAt !== undefined && line.startsWith("expiresAt:")) + return `expiresAt: ${updates.expiresAt?.toISOString() || "null"}`; + return line; + }); + + newFrontmatter = lines.join("\n"); + newFrontmatter = newFrontmatter.replace( + /^updatedAt:.*$/m, + `updatedAt: ${new Date().toISOString()}` + ); + + const newContent = `---\n${newFrontmatter}\n---\n\n${newBody}`; + await fs.writeFile(filePath, newContent, "utf-8"); + return true; + } + } + + return false; + } + + async delete(id: string): Promise { + if (!this.initialized) await this.initialize(); + + const fs = await import("fs/promises"); + const path = await import("path"); + + const files = await fs.readdir(this.vaultPath); + + for (const file of files) { + if (!file.endsWith(".md")) continue; + + const filePath = path.join(this.vaultPath, file); + const content = await fs.readFile(filePath, "utf-8"); + + const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/); + if (!frontmatterMatch) continue; + + const frontmatter = frontmatterMatch[1]; + const idMatch = frontmatter.match(/^id:\s*(.+)$/m); + if (idMatch && idMatch[1].trim() === id) { + await fs.unlink(filePath); + return true; + } + } + + return false; + } + + async list( + filter: MemoryFilter + ): Promise<{ data: Memory[]; total: number; byType: Record }> { + if (!this.initialized) await this.initialize(); + + const fs = await import("fs/promises"); + const path = await import("path"); + + const files = await fs.readdir(this.vaultPath); + const memories: Memory[] = []; + const byType: Record = {}; + + for (const file of files) { + if (!file.endsWith(".md")) continue; + + const filePath = path.join(this.vaultPath, file); + const content = await fs.readFile(filePath, "utf-8"); + + const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/); + if (!frontmatterMatch) continue; + + const memory = this.parseMemory( + frontmatterMatch[1], + content.replace(/^---\n[\s\S]*?\n---\n/, ""), + "" + ); + if (memory) { + // Apply filters + if (filter.apiKeyId && memory.apiKeyId !== filter.apiKeyId) continue; + if (filter.type && memory.type !== filter.type) continue; + if (filter.sessionId && memory.sessionId !== filter.sessionId) continue; + + memories.push(memory); + byType[memory.type] = (byType[memory.type] || 0) + 1; + } + } + + // Sort by createdAt desc + memories.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime()); + + // Apply pagination + const offset = filter.offset || 0; + const limit = filter.limit || 100; + const paginated = memories.slice(offset, offset + limit); + + return { data: paginated, total: memories.length, byType }; + } + + async search(config: SearchConfig): Promise { + if (!this.initialized) await this.initialize(); + + const fs = await import("fs/promises"); + const path = await import("path"); + + const files = await fs.readdir(this.vaultPath); + const memories: Memory[] = []; + + for (const file of files) { + if (!file.endsWith(".md")) continue; + + const filePath = path.join(this.vaultPath, file); + const content = await fs.readFile(filePath, "utf-8"); + + const frontmatterMatch = content.match(/^---\n([\s\S]*?)\n---/); + if (!frontmatterMatch) continue; + + const body = content.replace(/^---\n[\s\S]*?\n---\n/, ""); + + // Simple text search + if ( + body.toLowerCase().includes(config.query.toLowerCase()) || + file.toLowerCase().includes(config.query.toLowerCase()) + ) { + const memory = this.parseMemory(frontmatterMatch[1], body, ""); + if (memory) { + if (config.apiKeyId && memory.apiKeyId !== config.apiKeyId) continue; + memories.push(memory); + } + } + } + + return memories.slice(0, config.limit || 50); + } + + async health(): Promise { + const start = Date.now(); + try { + const fs = await import("fs/promises"); + await fs.access(this.vaultPath); + return { ok: true, latencyMs: Date.now() - start }; + } catch (e) { + return { ok: false, latencyMs: Date.now() - start, error: String(e) }; + } + } + + private parseMemory(frontmatter: string, body: string, fallbackId: string): Memory | null { + const getField = (key: string): string | null => { + const match = frontmatter.match(new RegExp(`^${key}:\\s*(.+)$`, "m")); + return match ? match[1].trim() : null; + }; + + const id = getField("id") || fallbackId || crypto.randomUUID(); + const apiKeyId = getField("apiKeyId") || ""; + const sessionId = getField("sessionId") || ""; + const type = (getField("type") as MemoryType) || MemoryType.FACTUAL; + const key = getField("key") || ""; + const createdAt = getField("createdAt") ? new Date(getField("createdAt")!) : new Date(); + const updatedAt = getField("updatedAt") ? new Date(getField("updatedAt")!) : new Date(); + const expiresAt = + getField("expiresAt") && getField("expiresAt") !== "null" + ? new Date(getField("expiresAt")!) + : null; + const accessCount = parseInt(getField("accessCount") || "0", 10); + const lastAccessedAt = + getField("lastAccessedAt") && getField("lastAccessedAt") !== "null" + ? new Date(getField("lastAccessedAt")!) + : null; + + let metadata: Record = {}; + const metadataStr = getField("metadata"); + if (metadataStr) { + try { + metadata = JSON.parse(metadataStr); + } catch {} + } + + return { + id, + apiKeyId, + sessionId, + type, + key, + content: body, + metadata, + createdAt, + updatedAt, + expiresAt, + accessCount, + lastAccessedAt, + }; + } +} + +export const createObsidianBackend = (vaultPath: string) => new ObsidianBackend(vaultPath); diff --git a/src/lib/memory/settings.ts b/src/lib/memory/settings.ts index 68fac18e80..dac4c52363 100644 --- a/src/lib/memory/settings.ts +++ b/src/lib/memory/settings.ts @@ -15,6 +15,10 @@ export interface MemorySettings { rerankEnabled: boolean; rerankProviderModel: string | null; vectorStore: "sqlite-vec" | "qdrant" | "auto"; + // Phase 1-2: MemoryBackend provider pattern + primaryBackend: string; + fallbackBackends: string[]; + backendConfigs: Record>; } export const DEFAULT_MEMORY_SETTINGS: MemorySettings = { @@ -37,6 +41,10 @@ export const DEFAULT_MEMORY_SETTINGS: MemorySettings = { rerankEnabled: false, rerankProviderModel: null, vectorStore: "auto", + // Phase 1-2: MemoryBackend defaults + primaryBackend: "sqlite", + fallbackBackends: [], + backendConfigs: {}, }; let cachedMemorySettings: MemorySettings | null = null; @@ -100,13 +108,32 @@ export function normalizeMemorySettings(rawSettings: Record = { rawSettings.memoryTransformersEnabled, DEFAULT_MEMORY_SETTINGS.transformersEnabled ), - staticEnabled: toBoolean(rawSettings.memoryStaticEnabled, DEFAULT_MEMORY_SETTINGS.staticEnabled), - rerankEnabled: toBoolean(rawSettings.memoryRerankEnabled, DEFAULT_MEMORY_SETTINGS.rerankEnabled), + staticEnabled: toBoolean( + rawSettings.memoryStaticEnabled, + DEFAULT_MEMORY_SETTINGS.staticEnabled + ), + rerankEnabled: toBoolean( + rawSettings.memoryRerankEnabled, + DEFAULT_MEMORY_SETTINGS.rerankEnabled + ), rerankProviderModel: normalizeNullableString( rawSettings.memoryRerankProviderModel, DEFAULT_MEMORY_SETTINGS.rerankProviderModel ), vectorStore: normalizeVectorStore(rawSettings.memoryVectorStore), + // Phase 1-2: MemoryBackend fields + primaryBackend: + typeof rawSettings.memoryPrimaryBackend === "string" + ? rawSettings.memoryPrimaryBackend + : DEFAULT_MEMORY_SETTINGS.primaryBackend, + fallbackBackends: Array.isArray(rawSettings.memoryFallbackBackends) + ? rawSettings.memoryFallbackBackends.filter((v): v is string => typeof v === "string") + : DEFAULT_MEMORY_SETTINGS.fallbackBackends, + backendConfigs: + typeof rawSettings.memoryBackendConfigs === "object" && + rawSettings.memoryBackendConfigs !== null + ? (rawSettings.memoryBackendConfigs as Record>) + : DEFAULT_MEMORY_SETTINGS.backendConfigs, }; } @@ -132,6 +159,11 @@ export function toMemorySettingsUpdates( if (settings.rerankProviderModel !== undefined) updates.memoryRerankProviderModel = settings.rerankProviderModel; if (settings.vectorStore !== undefined) updates.memoryVectorStore = settings.vectorStore; + // Phase 1-2: MemoryBackend fields + if (settings.primaryBackend !== undefined) updates.memoryPrimaryBackend = settings.primaryBackend; + if (settings.fallbackBackends !== undefined) + updates.memoryFallbackBackends = settings.fallbackBackends; + if (settings.backendConfigs !== undefined) updates.memoryBackendConfigs = settings.backendConfigs; return updates; } diff --git a/src/lib/memory/sqliteBackend.ts b/src/lib/memory/sqliteBackend.ts new file mode 100644 index 0000000000..a708825896 --- /dev/null +++ b/src/lib/memory/sqliteBackend.ts @@ -0,0 +1,102 @@ +/** + * SQLiteBackend - Thin wrapper around existing store.ts functions + * Implements MemoryBackend interface by delegating to store.ts + */ + +import { logger } from "../../../open-sse/utils/logger"; +import type { + MemoryBackend, + CreateMemoryInput, + MemoryFilter, + SearchConfig, + HealthCheckResult, + Memory, +} from "./backend"; +import { MemoryType } from "./types"; +import { createMemory, getMemory, updateMemory, deleteMemory, listMemories } from "./store"; +import { retrieveMemories } from "./retrieval"; + +const log = logger("SQLITE_BACKEND"); + +export class SQLiteBackend implements MemoryBackend { + readonly id = "sqlite"; + readonly displayName = "SQLite"; + + async initialize(): Promise { + // Tables created by migrations + log.info("sqlite.backend.initialized"); + } + + async shutdown(): Promise { + log.info("sqlite.backend.shutdown"); + } + + // ─── CRUD ─── + + async create(input: CreateMemoryInput): Promise { + return createMemory({ + apiKeyId: input.apiKeyId, + sessionId: input.sessionId, + type: input.type, + key: input.key, + content: input.content, + metadata: input.metadata ?? {}, + expiresAt: input.expiresAt ?? null, + }); + } + + async get(id: string): Promise { + return getMemory(id); + } + + async update(id: string, updates: Partial>): Promise { + return updateMemory(id, updates); + } + + async delete(id: string): Promise { + return deleteMemory(id); + } + + async list( + filter: MemoryFilter + ): Promise<{ data: Memory[]; total: number; byType: Record }> { + const result = await listMemories({ + apiKeyId: filter.apiKeyId, + type: filter.type, + sessionId: filter.sessionId, + query: filter.query, + limit: filter.limit, + offset: filter.offset, + page: + filter.offset && filter.limit ? Math.floor(filter.offset / filter.limit) + 1 : undefined, + }); + return { data: result.data, total: result.total, byType: result.byType }; + } + + // ─── Search ─── + + async search(config: SearchConfig): Promise { + return retrieveMemories(config.apiKeyId, { + query: config.query, + maxTokens: config.maxTokens, + retrievalStrategy: config.strategy ?? "hybrid", + }); + } + + // ─── Health ─── + + async health(): Promise { + const start = Date.now(); + try { + // Try a simple query to verify DB is accessible + const result = await getMemory("health-check-never-exists"); + return { ok: true, latencyMs: Date.now() - start }; + } catch (e) { + return { ok: false, latencyMs: Date.now() - start, error: String(e) }; + } + } +} + +// Export singleton instance +export const sqliteBackend = new SQLiteBackend(); +export default sqliteBackend; diff --git a/src/lib/memory/store.ts b/src/lib/memory/store.ts index 549f61a800..70884612e4 100644 --- a/src/lib/memory/store.ts +++ b/src/lib/memory/store.ts @@ -350,8 +350,7 @@ export async function updateMemory( // Fetch current state to detect content/key change (needed for vector re-gen) const currentRow = db.prepare("SELECT content, key FROM memories WHERE id = ?").get(id) as - | { content: string; key: string | null } - | undefined; + { content: string; key: string | null } | undefined; // Build dynamic update query const fields: string[] = []; @@ -396,8 +395,7 @@ export async function updateMemory( invalidateMemoryCache(id); // Regenerate vector if content or key changed (fire-and-forget) - const contentChanged = - updates.content !== undefined && updates.content !== currentRow?.content; + const contentChanged = updates.content !== undefined && updates.content !== currentRow?.content; const keyChanged = updates.key !== undefined && updates.key !== currentRow?.key; if (contentChanged || keyChanged) { @@ -586,10 +584,7 @@ export function recordMemoryAccess(ids: string[]): void { * predicates read (no content/metadata), ordered oldest-first and bounded by `limit`, so a * sweep never materializes whole memories or scans unboundedly. */ -export function listMemoriesForDecay(filters: { - apiKeyId?: string; - limit: number; -}): { +export function listMemoriesForDecay(filters: { apiKeyId?: string; limit: number }): { id: string; type: MemoryType; accessCount: number; diff --git a/src/lib/memory/summarization.ts b/src/lib/memory/summarization.ts index 472dc75886..f1dcd7e6c4 100644 --- a/src/lib/memory/summarization.ts +++ b/src/lib/memory/summarization.ts @@ -71,13 +71,15 @@ interface MemoryRow { id: string; api_key_id: string; session_id: string | null; - type: string; + type: MemoryType; key: string | null; content: string; metadata: string | null; created_at: string; updated_at: string; expires_at: string | null; + access_count?: number | null; + last_accessed_at?: string | null; } function rowToMemory(row: MemoryRow): Memory { @@ -101,6 +103,8 @@ function rowToMemory(row: MemoryRow): Memory { createdAt: new Date(String(row.created_at)), updatedAt: new Date(String(row.updated_at)), expiresAt: row.expires_at ? new Date(String(row.expires_at)) : null, + accessCount: typeof row.access_count === "number" ? row.access_count : 0, + lastAccessedAt: row.last_accessed_at ? new Date(String(row.last_accessed_at)) : null, }; } diff --git a/src/lib/modelAliasResolver.ts b/src/lib/modelAliasResolver.ts new file mode 100644 index 0000000000..8872019e15 --- /dev/null +++ b/src/lib/modelAliasResolver.ts @@ -0,0 +1,74 @@ +/** + * Model Alias Resolver — maps client-facing model names to OmniRoute provider IDs. + * + * When a client sends `model: "deepseek-chat"`, this resolver looks up the alias + * in the database and rewrites it to the target model ID (e.g. `"ds/deepseek-v4-flash"`) + * before the request reaches the chat handler. + * + * Aliases are stored in the `modelAliases` key-value namespace and seeded by + * `src/lib/modelAliasSeed.ts`. + */ +import { getModelAliases } from "@/lib/db/models/aliases"; + +let cachedAliases: Record | null = null; +let lastFetch = 0; +const CACHE_TTL_MS = 60_000; // 1 minute + +async function loadAliases(): Promise> { + const now = Date.now(); + if (cachedAliases && now - lastFetch < CACHE_TTL_MS) { + return cachedAliases; + } + cachedAliases = await getModelAliases(); + lastFetch = now; + return cachedAliases; +} + +/** + * Resolve a model alias to its target provider model ID. + * If the alias maps to an array, returns the first element. + * If no alias is found, returns the original model name unchanged. + */ +export async function resolveModelAlias( + model: string | null | undefined +): Promise { + if (!model) return model; + + const aliases = await loadAliases(); + const target = aliases[model]; + + if (target === undefined) return model; + + if (typeof target === "string") return target; + + if (Array.isArray(target) && target.length > 0) { + const first = target[0]; + return typeof first === "string" ? first : model; + } + + if (typeof target === "object" && target !== null) { + const t = target as { provider?: string; model?: string }; + if (t.provider && t.model) return `${t.provider}/${t.model}`; + } + + return model; +} + +/** + * Resolve model alias on a parsed request body in-place. + * Mutates `body.model` if an alias is found. + */ +export async function resolveModelAliasOnBody( + body: Record | null | undefined +): Promise { + if (!body || typeof body !== "object") return; + body.model = await resolveModelAlias(body.model as string | null | undefined); +} + +/** + * Invalidate the alias cache (e.g. after a new alias is added). + */ +export function invalidateAliasCache(): void { + cachedAliases = null; + lastFetch = 0; +} diff --git a/src/lib/modelCapabilities.ts b/src/lib/modelCapabilities.ts index c8152b18fb..700d4adfd9 100644 --- a/src/lib/modelCapabilities.ts +++ b/src/lib/modelCapabilities.ts @@ -14,6 +14,8 @@ import { getSyncedCapability } from "@/lib/modelsDevSync"; import { MODELS_DEV_PROVIDER_MAP } from "@/lib/modelsDevSync/transform"; import { getModelContextOverride } from "@/lib/db/modelContextOverrides"; import { getModelCapabilityOverride } from "@/lib/db/modelCapabilityOverrides"; +import { getDbInstance } from "@/lib/db/core"; +import { getKeyValue } from "@/lib/db/models/shared"; import { isVisionModelId } from "@/shared/constants/visionModels"; import { getUnsupportedParams } from "@omniroute/open-sse/config/providerRegistry.ts"; import { @@ -448,18 +450,52 @@ function modalitiesDeclareVision(modalities: readonly string[]): boolean { }); } +/** + * #9195: Read the customModels supportsVision override for a given provider/model + * pair from the database. Returns true/false when an explicit override exists, or + * null if no custom model entry or no explicit flag. Sync read (better-sqlite3). + */ +function getCustomModelVisionOverride(provider: string, model: string): boolean | null { + try { + const db = getDbInstance(); + const row = db + .prepare("SELECT value FROM key_value WHERE namespace = 'customModels' AND key = ?") + .get(provider); + if (!row) return null; + const parsed = getKeyValue(row); + if (!parsed.value) return null; + const models: Array<{ id: string; supportsVision?: boolean }> = JSON.parse(parsed.value); + const entry = models.find((m) => m.id === model); + if (entry && typeof entry.supportsVision === "boolean") { + return entry.supportsVision; + } + return null; + } catch { + return null; + } +} + function resolveVisionCapability( spec: ModelSpec | undefined, registryModel: { supportsVision?: boolean } | null, synced: SyncedCapabilities, modalitiesInput: string[], modalitiesOutput: string[], - modelId?: string + modelId?: string, + customVisionOverride?: boolean | null ): boolean | null { const allModalities = [...modalitiesInput, ...modalitiesOutput].map((entry) => String(entry).toLowerCase() ); + // #9195: explicit custom model supportsVision override (from the dashboard + // "Vision capable" toggle) is the operator's authoritative choice for a + // self-hosted model. Check before the synced/registry/heuristic cascade so + // an operator-flagged vision model is never rejected by the Combo vision filter. + if (typeof customVisionOverride === "boolean") { + return customVisionOverride; + } + // Hard override FIRST: a wrong synced `attachment:true` (or image modality) must not // win for models the vendor documents as text-only. Beats every branch below so an // image request can never be routed to a blind model (#4071). @@ -667,13 +703,21 @@ export function getResolvedModelCapabilities( // fields keep using the non-leaf `spec` from getStaticSpec() above. const visionSpec = getVisionStaticSpec(resolved.model, resolved.rawModel); + // #9195: read the custom model's supportsVision override from the DB so the + // dashboard "Vision capable" toggle affects Combo routing. + const customVisionOverride = + resolved.provider && resolved.model + ? getCustomModelVisionOverride(resolved.provider, resolved.model) + : null; + const supportsVision = resolveVisionCapability( visionSpec, registryModel, synced, modalitiesInput, modalitiesOutput, - lookupKey + lookupKey, + customVisionOverride ); // #8250: when resolve promoted vision over a contradictory attachment=false, diff --git a/src/lib/modelMetadataRegistry.ts b/src/lib/modelMetadataRegistry.ts index 72fd26c67f..0ba5bd981f 100644 --- a/src/lib/modelMetadataRegistry.ts +++ b/src/lib/modelMetadataRegistry.ts @@ -345,13 +345,9 @@ function resolveCatalogPricing( // Consulted only when models.dev returned nothing, matching the order // already implemented in db/settings/pricing.ts::getPricing(). try { - const litellm = getSyncedPricing() as Record< - string, - Record> - >; + const litellm = getSyncedPricing() as Record>>; const providerPricing = - findInsensitive(litellm, provider) || - findInsensitive(litellm, provider.replace(/-cn$/, "")); + findInsensitive(litellm, provider) || findInsensitive(litellm, provider.replace(/-cn$/, "")); if (providerPricing) { const modelPricing = findInsensitive(providerPricing, model) || diff --git a/src/lib/modelsDevSync.ts b/src/lib/modelsDevSync.ts index 32a6e180f6..fbcabe353b 100644 --- a/src/lib/modelsDevSync.ts +++ b/src/lib/modelsDevSync.ts @@ -14,7 +14,12 @@ * 3. LiteLLM sync (`pricing_synced` namespace) * 4. Hardcoded defaults (`pricing.ts`) * - * Opt-in via MODELS_DEV_SYNC_ENABLED=true (default: false). + * Opt-in, default off. Enabled either from Dashboard > Settings > AI or with + * MODELS_DEV_SYNC_ENABLED, which wins over that setting whenever it is set to + * anything non-empty, in either direction, so a deployment can pin the sync on + * or off regardless of what is stored. Unset or empty, it defers to the + * setting. On for "1", "true", "yes" or "on" in any casing; every other value + * is off. */ import { getDbInstance } from "./db/core"; @@ -71,6 +76,8 @@ interface SyncResult { const MODELS_DEV_API_URL = "https://models.dev/api.json"; +const TRUE_ENV_VALUES = new Set(["1", "true", "yes", "on"]); + const parsedInterval = parseInt(process.env.MODELS_DEV_SYNC_INTERVAL || "86400", 10); const SYNC_INTERVAL_MS = Number.isFinite(parsedInterval) && parsedInterval > 0 ? parsedInterval * 1000 : 86400 * 1000; @@ -670,8 +677,32 @@ export async function initModelsDevSync(): Promise { const { getSettings } = await import("./localDb"); const settings = await getSettings(); - if (settings.modelsDevSyncEnabled !== true) { - console.log("[MODELS_DEV] Disabled (enable via Settings > AI)"); + // Until now the docblock above advertised MODELS_DEV_SYNC_ENABLED and nothing + // read it: the only control was the stored setting, so an operator following + // that line got silence whichever value they set. This makes the variable real. + // + // An explicit env value decides, in either direction, and only an unset or + // empty one defers to the setting. That means a deployment can pin the sync + // off from its compose file or unit even when a previous operator left the + // dashboard toggle on, which is the case a force-on-only variable cannot + // express and the reason for choosing this shape. + // + // It is worth being plain that this is a third resolution pattern rather than + // a reuse of an existing one, because the two in the tree solve different + // problems: shared/utils/featureFlags.ts::resolveFeatureFlag puts the DB + // override ABOVE the env var, so a deployment cannot override an operator's + // stored choice at all; db/ccDiscoveryAliases.ts::getCcAliasGlobalState reads + // only "1" and "true" and can force a flag ON, letting every other value + // including "false" fall through to the DB. Neither can turn a + // dashboard-enabled switch off from the environment. Following either one + // here would leave the variable unable to do the thing it is being added for. + const envValue = process.env.MODELS_DEV_SYNC_ENABLED?.trim(); + const enabled = envValue + ? TRUE_ENV_VALUES.has(envValue.toLowerCase()) + : settings.modelsDevSyncEnabled === true; + + if (!enabled) { + console.log("[MODELS_DEV] Disabled (enable via Settings > AI or MODELS_DEV_SYNC_ENABLED=true)"); return; } diff --git a/src/lib/oauth/constants/oauth.ts b/src/lib/oauth/constants/oauth.ts index 1fa5a9f3dc..02df89e7c9 100644 --- a/src/lib/oauth/constants/oauth.ts +++ b/src/lib/oauth/constants/oauth.ts @@ -414,6 +414,17 @@ export const TRAE_CONFIG = { "Authorize via trae.ai in the popup, or sign in to solo.trae.ai and paste the Cloud-IDE-JWT from the Authorization header (~14-day lifetime).", }; +// Raycast Pro AI — reverse-engineered, unofficial API. LOCAL / PERSONAL USE ONLY. +// See docs/security/PUBLIC_CREDS.md pattern: no secrets in repo; credentials from user's Mac. +export const RAYCAST_CONFIG = { + apiEndpoint: "https://backend.raycast.com", + chatEndpoint: "/api/v1/ai/chat_completions", + modelsEndpoint: "/api/v1/ai/models", + clientType: "macos-app", + captureInstructions: + "macOS only: use Auto-Import (Keychain + Raycast DB) or capture Bearer, X-Raycast-DeviceId, and optional X-Raycast-Signature JWT from backend.raycast.com traffic.", +}; + // Windsurf / Devin CLI Configuration // // 2026-05-29 (Phase 1 hotfix): @@ -520,6 +531,10 @@ export const PROVIDERS = { KIRO: "kiro", AMAZON_Q: "amazon-q", CURSOR: "cursor", + // #8895 — registered in src/lib/oauth/providers/index.ts but missing here, so + // every consumer reading PROVIDERS (onboarding wizard, test-connection routing) + // did not know Raycast Pro exists as an OAuth provider. + RAYCAST: "raycast", KILOCODE: "kilocode", CLINE: "cline", CLINEPASS: "clinepass", diff --git a/src/lib/oauth/providers/index.ts b/src/lib/oauth/providers/index.ts index 9a8ede1c4e..06e4813042 100644 --- a/src/lib/oauth/providers/index.ts +++ b/src/lib/oauth/providers/index.ts @@ -22,6 +22,7 @@ import { gitlabDuo } from "./gitlab-duo"; import { kiro } from "./kiro"; import { cursor } from "./cursor"; import { trae } from "./trae"; +import { raycast } from "./raycast"; import { kilocode } from "./kilocode"; import { cline } from "./cline"; import { windsurf } from "./windsurf"; @@ -45,6 +46,7 @@ export const PROVIDERS = { "amazon-q": kiro, cursor, trae, + raycast, kilocode, cline, // clinepass reuses the Cline WorkOS OAuth flow 1:1 (same api.cline.bot host, same token diff --git a/src/lib/oauth/providers/raycast.ts b/src/lib/oauth/providers/raycast.ts new file mode 100644 index 0000000000..85f15bd35c --- /dev/null +++ b/src/lib/oauth/providers/raycast.ts @@ -0,0 +1,37 @@ +/** + * @file raycast.ts + * @description Raycast Pro token-import OAuth provider (reverse-engineered, local dev only). + * + * @changes + * - [2026-07-27] [Composer] - Initial Raycast Pro import_token provider + */ + +import { RAYCAST_CONFIG } from "../constants/oauth"; + +type RaycastRawTokens = { + accessToken?: string; + access_token?: string; + deviceId?: string; + device_id?: string; + aid?: string; + sigSecret?: string; + signatureSecret?: string; + signatureJwt?: string; + expiresIn?: number; +}; + +export const raycast = { + config: RAYCAST_CONFIG, + flowType: "import_token", + mapTokens: (tokens: RaycastRawTokens) => ({ + accessToken: tokens.accessToken || tokens.access_token, + refreshToken: null, + expiresIn: tokens.expiresIn || 30 * 24 * 60 * 60, + providerSpecificData: { + deviceId: tokens.deviceId || tokens.device_id || "", + aid: tokens.aid || "", + sigSecret: tokens.sigSecret || tokens.signatureSecret || "", + authMethod: "imported", + }, + }), +}; diff --git a/src/lib/oauth/services/raycast.ts b/src/lib/oauth/services/raycast.ts new file mode 100644 index 0000000000..cadd9d82a8 --- /dev/null +++ b/src/lib/oauth/services/raycast.ts @@ -0,0 +1,65 @@ +/** + * @file raycast.ts + * @description Raycast Pro credential validation via live models API probe. + * + * @changes + * - [2026-07-27] [Composer] - Initial Raycast import validation service + */ + +import { + decodeAidFromRaycastJwt, + fetchRaycastModels, + type RaycastModelEntry, +} from "@omniroute/open-sse/services/raycast.ts"; + +export class RaycastService { + validateCredentials(input: { + accessToken: string; + deviceId: string; + aid?: string; + signatureJwt?: string; + sigSecret?: string; + }): { aid: string } { + const accessToken = input.accessToken.trim(); + const deviceId = input.deviceId.trim(); + let aid = (input.aid || "").trim(); + + if (!aid && input.signatureJwt?.trim()) { + aid = decodeAidFromRaycastJwt(input.signatureJwt.trim()) || ""; + } + + if (!accessToken) throw new Error("Bearer token is required"); + if (!deviceId) throw new Error("Device ID is required"); + + // AID is optional for current Raycast API — fall back to deviceId when not captured manually. + if (!aid) aid = deviceId; + + return { aid }; + } + + async probeModels(credentials: { + accessToken: string; + deviceId: string; + aid: string; + sigSecret?: string; + }): Promise { + return fetchRaycastModels({ + accessToken: credentials.accessToken, + providerSpecificData: { + deviceId: credentials.deviceId, + aid: credentials.aid, + sigSecret: credentials.sigSecret, + }, + }); + } + + getCaptureInstructions(): string[] { + return [ + "Easiest: click Auto-Import (macOS) — reads Keychain + local Raycast DB.", + "Manual fallback: Proxyman/Charles SSL proxy on backend.raycast.com.", + "Bearer token lives in Keychain: Raycast / raycast-store_credentials.", + "Device ID = analyticsId in ~/Library/Application Support/com.raycast.macos/posthog.distinctId.", + "Signature JWT is optional with current Raycast builds.", + ]; + } +} diff --git a/src/lib/oauth/services/raycastLocal.ts b/src/lib/oauth/services/raycastLocal.ts new file mode 100644 index 0000000000..976a023a39 --- /dev/null +++ b/src/lib/oauth/services/raycastLocal.ts @@ -0,0 +1,198 @@ +/** + * @file raycastLocal.ts + * @description Extract Raycast Pro credentials from local macOS install (Keychain + encrypted DB). + * + * @changes + * - [2026-07-27] [Composer] - Auto-extract bearer token and device ID from local Raycast + */ + +import { execFileSync } from "node:child_process"; +import { createHash } from "node:crypto"; +import { copyFileSync, existsSync, mkdtempSync, readFileSync, rmdirSync, unlinkSync } from "node:fs"; +import { homedir, tmpdir } from "node:os"; +import { join } from "node:path"; + +const RAYCAST_SALT = "yvkwWXzxPPBAqY2tmaKrB*DvYjjMaeEf"; +const RAYCAST_SUPPORT = join(homedir(), "Library", "Application Support", "com.raycast.macos"); +const RAYCAST_DB = join(RAYCAST_SUPPORT, "raycast-enc.sqlite"); +const POSTHOG_DISTINCT = join(RAYCAST_SUPPORT, "posthog.distinctId"); + +export type RaycastLocalCredentials = { + accessToken: string; + deviceId: string; + aid: string; + email?: string; + username?: string; + hasProFeatures?: boolean; + hasBetterAI?: boolean; + source: "keychain+analyticsId" | "keychain+posthog"; +}; + +function readKeychainJson(account: string): Record | null { + try { + const raw = execFileSync( + "security", + ["find-generic-password", "-s", "Raycast", "-a", account, "-w"], + { encoding: "utf-8" } + ).trim(); + return JSON.parse(raw) as Record; + } catch { + return null; + } +} + +function getDatabasePassphrase(): string { + const keyHex = execFileSync( + "security", + ["find-generic-password", "-s", "Raycast", "-a", "database_key", "-w"], + { encoding: "utf-8" } + ).trim(); + return createHash("sha256") + .update(keyHex + RAYCAST_SALT) + .digest("hex"); +} + +function queryEncryptedDb(passphrase: string, sql: string): unknown[] { + if (!existsSync(RAYCAST_DB)) return []; + + const tmpDir = mkdtempSync(join(tmpdir(), "omniroute-raycast-")); + const tmpDb = join(tmpDir, "raycast-enc.sqlite"); + + const cleanup = () => { + for (const ext of ["", "-wal", "-shm"]) { + try { + unlinkSync(tmpDb + ext); + } catch { + // ignore + } + } + try { + rmdirSync(tmpDir); + } catch { + // ignore + } + }; + + try { + copyFileSync(RAYCAST_DB, tmpDb); + for (const ext of ["-wal", "-shm"]) { + const src = RAYCAST_DB + ext; + if (existsSync(src)) copyFileSync(src, tmpDb + ext); + } + + const input = `PRAGMA key = '${passphrase}';\n.mode json\n${sql}`; + const result = execFileSync("sqlcipher", [tmpDb], { input, encoding: "utf-8" }); + const jsonStr = result.startsWith("ok\n") ? result.slice(3) : result; + return JSON.parse(jsonStr.trim() || "[]") as unknown[]; + } catch { + return []; + } finally { + cleanup(); + } +} + +function readAnalyticsIdFromDb(): string | null { + try { + const passphrase = getDatabasePassphrase(); + const rows = queryEncryptedDb( + passphrase, + "SELECT analyticsId FROM user WHERE analyticsId IS NOT NULL LIMIT 1;" + ) as Array<{ analyticsId?: string }>; + const id = rows[0]?.analyticsId?.trim(); + return id || null; + } catch { + return null; + } +} + +function readAnalyticsIdFromPosthog(): string | null { + try { + if (!existsSync(POSTHOG_DISTINCT)) return null; + const parsed = JSON.parse(readFileSync(POSTHOG_DISTINCT, "utf-8")) as { + "posthog.distinctId"?: string; + }; + const id = parsed["posthog.distinctId"]?.trim(); + return id || null; + } catch { + return null; + } +} + +function readUserProfile(): { email?: string; username?: string; hasProFeatures?: boolean; hasBetterAI?: boolean } { + try { + const passphrase = getDatabasePassphrase(); + const rows = queryEncryptedDb( + passphrase, + "SELECT email, username, hasProFeatures, hasBetterAI FROM user LIMIT 1;" + ) as Array<{ + email?: string; + username?: string; + hasProFeatures?: number; + hasBetterAI?: number; + }>; + const row = rows[0]; + if (!row) return {}; + return { + email: row.email, + username: row.username, + hasProFeatures: !!row.hasProFeatures, + hasBetterAI: !!row.hasBetterAI, + }; + } catch { + return {}; + } +} + +export function isRaycastLocalExtractAvailable(): boolean { + if (process.platform !== "darwin") return false; + try { + execFileSync("which", ["sqlcipher"], { encoding: "utf-8" }); + } catch { + return false; + } + return existsSync(RAYCAST_DB) || existsSync(POSTHOG_DISTINCT); +} + +/** + * Pull Raycast Pro credentials from the local macOS install. + * Bearer token: Keychain entry `raycast-store_credentials` → oauth.access_token + * Device ID: user.analyticsId (same as posthog.distinctId) + */ +export function extractLocalRaycastCredentials(): RaycastLocalCredentials { + if (process.platform !== "darwin") { + throw new Error("Raycast auto-import is macOS-only"); + } + + const store = readKeychainJson("raycast-store_credentials"); + const oauth = (store?.oauth || {}) as { access_token?: string }; + const accessToken = oauth.access_token?.trim(); + if (!accessToken) { + throw new Error( + "Raycast bearer token not found in Keychain — open Raycast and sign in first" + ); + } + + const analyticsFromDb = readAnalyticsIdFromDb(); + const analyticsFromPosthog = readAnalyticsIdFromPosthog(); + const deviceId = analyticsFromDb || analyticsFromPosthog; + if (!deviceId) { + throw new Error( + "Raycast device/analytics ID not found — launch Raycast once so it writes local state" + ); + } + + const profile = readUserProfile(); + const user = (store?.user || {}) as { email?: string; username?: string }; + + return { + accessToken, + deviceId, + // V1 JWT aid — chat works without a captured signature JWT; deviceId is a stable fallback. + aid: deviceId, + email: profile.email || user.email, + username: profile.username || user.username, + hasProFeatures: profile.hasProFeatures, + hasBetterAI: profile.hasBetterAI, + source: analyticsFromDb ? "keychain+analyticsId" : "keychain+posthog", + }; +} diff --git a/src/lib/oauth/utils/agyAuthImport.ts b/src/lib/oauth/utils/agyAuthImport.ts index 77ea09c5c4..86edf19d78 100644 --- a/src/lib/oauth/utils/agyAuthImport.ts +++ b/src/lib/oauth/utils/agyAuthImport.ts @@ -214,6 +214,7 @@ export async function createConnectionFromAgyToken( resolvedEmail || "Antigravity CLI (imported)", testStatus: "active", + isActive: true, providerSpecificData: { ...toRecord(existing.providerSpecificData), clientProfile: "cli", diff --git a/src/lib/plugins/hooks.ts b/src/lib/plugins/hooks.ts index 2ad5345308..81e9bfcc2f 100644 --- a/src/lib/plugins/hooks.ts +++ b/src/lib/plugins/hooks.ts @@ -40,6 +40,7 @@ export const BUILTIN_EVENTS = [ "onActivate", "onDeactivate", "onUninstall", + "onStreamComplete", ] as const; export type BuiltinEvent = (typeof BUILTIN_EVENTS)[number]; @@ -227,6 +228,11 @@ export interface PluginContext { model: string; provider: string; apiKeyInfo?: unknown; + /** Client request headers available at the call site. Optional — not all callers + * have access to headers (e.g. internal triggers, retries). Exposed so + * observability/trace-export plugins can read request-scoped context sent by the + * client (trace ids, correlation ids, session markers). */ + headers?: Record; metadata: Record; } @@ -251,6 +257,35 @@ export interface Plugin { onActivate?: (payload: unknown) => Promise | void; onDeactivate?: (payload: unknown) => Promise | void; onUninstall?: (payload: unknown) => Promise | void; + onStreamComplete?: (payload: PluginOnStreamCompletePayload) => Promise | void; +} + +// ── onStreamComplete event types ── + +export type PluginOnStreamCompletePayload = { + status: number; + usage?: { + prompt_tokens?: number; + completion_tokens?: number; + reasoning_tokens?: number; + cache_read_input_tokens?: number; + cache_creation_input_tokens?: number; + }; + timing?: { + latencyMs: number; + ttft?: number; + }; + model?: string; + provider?: string; + errorCode?: string; +}; + +/** + * Run onStreamComplete hooks — fire-and-forget notification with usage/timing data. + * Called when an SSE stream is fully consumed and usage/timing data is available. + */ +export async function runOnStreamComplete(payload: PluginOnStreamCompletePayload): Promise { + await emitHook("onStreamComplete", payload); } /** diff --git a/src/lib/plugins/marketplace.ts b/src/lib/plugins/marketplace.ts index beca410668..39d0f7b1e7 100644 --- a/src/lib/plugins/marketplace.ts +++ b/src/lib/plugins/marketplace.ts @@ -2,6 +2,11 @@ import { getSettings } from "../db/settings"; import dns from "node:dns/promises"; import { isPrivateHost } from "@/shared/network/outboundUrlGuard"; import { safeOutboundFetch } from "@/shared/network/safeOutboundFetch"; +import { pluginManager } from "./manager"; +import { createHash } from "node:crypto"; +import { mkdtemp, writeFile, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { tmpdir } from "node:os"; /** * Plugin Marketplace — browse, search, install plugins from a registry. * @@ -69,6 +74,7 @@ export interface MarketplaceEntry { author: string; license: string; downloadUrl: string; + checksum?: string; // SHA-256 hex (optional — verified when present) repository?: string; tags: string[]; downloads: number; @@ -200,3 +206,48 @@ export async function getMarketplaceEntry(name: string): Promise { + const plugins = await listMarketplacePlugins(); + const entry = plugins.find((p) => p.name === name); + if (!entry) { + throw new Error(`Plugin '${name}' not found in marketplace`); + } + + // Create temp dir for download + const tmpDir = await mkdtemp(join(tmpdir(), "plugin-mp-")); + const tmpFile = join(tmpDir, "plugin.tar.gz"); + + try { + // Download the plugin archive + const response = await safeOutboundFetch(entry.downloadUrl, { guard: "public-only" }); + if (!response.ok) { + throw new Error(`Failed to download plugin '${name}': ${response.status}`); + } + const buffer = Buffer.from(await response.arrayBuffer()); + + // Verify SHA-256 checksum if provided + if (entry.checksum) { + const actual = createHash("sha256").update(buffer).digest("hex"); + if (actual !== entry.checksum) { + throw new Error( + `Checksum mismatch for plugin '${name}': expected ${entry.checksum}, got ${actual}` + ); + } + } + + // Write to temp file + await writeFile(tmpFile, buffer); + + // Delegate to pluginManager.install + const result = await pluginManager.install(tmpDir); + return { name: result.name, version: result.version }; + } finally { + // Cleanup temp dir + await rm(tmpDir, { recursive: true, force: true }).catch(() => {}); + } +} diff --git a/src/lib/providers/catalog.ts b/src/lib/providers/catalog.ts index 7e1a744ba0..47cae957d7 100644 --- a/src/lib/providers/catalog.ts +++ b/src/lib/providers/catalog.ts @@ -10,6 +10,7 @@ import { WEB_COOKIE_PROVIDERS, isClaudeCodeCompatibleProvider, supportsApiKeyOnFreeProvider, + supportsDualAuthProvider, type RiskNoticeVariant, } from "@/shared/constants/providers"; @@ -26,6 +27,15 @@ export type StaticProviderCatalogCategory = | "apikey" | "cloud-agent"; +export interface ProviderNotice { + /** Direct link to the API key management page for this provider. */ + apiKeyUrl?: string; + /** Link to the signup/registration page for this provider. */ + signupUrl?: string; + /** Optional short label (e.g. "Get API key", "Sign up"). */ + text?: string; +} + export interface ProviderCatalogMetadata { id: string; name: string; @@ -44,6 +54,8 @@ export interface ProviderCatalogMetadata { hiddenFromDashboard?: boolean; /** Optional operator-supplied remote icon URL (#2166) for compatible provider nodes. */ iconUrl?: string; + /** Optional registration/API-key URL hints rendered as links on the provider detail page (#9270). */ + notice?: ProviderNotice; [key: string]: unknown; } @@ -88,8 +100,7 @@ export interface ResolvedCompatibleProviderCatalogEntry extends ProviderCatalogM } export type ResolvedProviderCatalogEntry = - | ResolvedStaticProviderCatalogEntry - | ResolvedCompatibleProviderCatalogEntry; + ResolvedStaticProviderCatalogEntry | ResolvedCompatibleProviderCatalogEntry; export const STATIC_PROVIDER_CATALOG_GROUPS: Record< StaticProviderCatalogCategory, @@ -196,22 +207,9 @@ export function resolveStaticProviderCatalogEntry( return null; } -/** - * OAuth-primary providers that ALSO accept a direct BYOK API key (dual-auth), - * admitted through the managed-connection API-key gate independent of the OAuth - * catalog. These are deliberately kept OUT of `FREE_APIKEY_PROVIDER_IDS`: that - * set flips `providerSupportsPat` true, which turns `isOAuth` false and would - * make the dashboard's primary "Connect" button route to the API-key modal - * instead of the OAuth flow. Admitting them here lets POST /api/providers - * persist an `apikey` connection (the reliable BYOK path) while the provider - * stays OAuth-primary (isOAuth=true). clinepass is the dual-auth case: sign in - * with a Cline account OR paste a ClinePass API key. - */ -const DUAL_AUTH_APIKEY_PROVIDER_IDS = new Set(["clinepass"]); - export function isManagedProviderConnectionId(providerId: string): boolean { if (supportsApiKeyOnFreeProvider(providerId)) return true; - if (DUAL_AUTH_APIKEY_PROVIDER_IDS.has(providerId)) return true; + if (supportsDualAuthProvider(providerId)) return true; const entry = resolveStaticProviderCatalogEntry(providerId); return !!(entry && MANAGED_PROVIDER_CONNECTION_CATEGORIES.has(entry.category)); diff --git a/src/lib/providers/requestDefaults.ts b/src/lib/providers/requestDefaults.ts index 84a9bcd666..29689d4128 100644 --- a/src/lib/providers/requestDefaults.ts +++ b/src/lib/providers/requestDefaults.ts @@ -4,6 +4,7 @@ const CLAUDE_CODE_COMPATIBLE_PROVIDER_PREFIX = "anthropic-compatible-cc-"; import { normalizeExcludedModelPatterns } from "@/domain/connectionModelRules"; import { normalizeRoutingTags } from "@/domain/tagRouter"; import { normalizeOpenRouterPreset } from "@/shared/constants/openRouterPreset"; +import { isForbiddenCustomHeaderName } from "@/shared/constants/upstreamHeaders"; export const CODEX_REASONING_EFFORT_VALUES = [ "none", @@ -257,6 +258,30 @@ export function normalizeProviderSpecificData( delete normalized.excluded_models; } + // #8369: connection-level custom upstream headers — sanitize each key against the + // forbidden-header denylist and drop entries with non-string or empty values. + if ("customHeaders" in normalized) { + const raw = normalized.customHeaders; + if (raw && typeof raw === "object" && !Array.isArray(raw)) { + const cleaned: Record = {}; + for (const [key, value] of Object.entries(raw as Record)) { + const trimmedKey = key.trim(); + if (!trimmedKey) continue; + if (isForbiddenCustomHeaderName(trimmedKey)) continue; + if (typeof value === "string" && value.trim().length > 0) { + cleaned[trimmedKey] = value.trim(); + } + } + if (Object.keys(cleaned).length > 0) { + normalized.customHeaders = cleaned; + } else { + delete normalized.customHeaders; + } + } else { + delete normalized.customHeaders; + } + } + return Object.keys(normalized).length > 0 ? normalized : undefined; } diff --git a/src/lib/providers/validation.ts b/src/lib/providers/validation.ts index e9b2cef768..fea39d669c 100644 --- a/src/lib/providers/validation.ts +++ b/src/lib/providers/validation.ts @@ -65,6 +65,7 @@ import { validateDeepgramProvider, validateAssemblyAIProvider, validateRevAiProvider, + validateSonioxProvider, validateElevenLabsProvider, validateInworldProvider, validateKieProvider, @@ -188,6 +189,7 @@ export async function validateProviderApiKey({ provider, apiKey, providerSpecifi deepgram: validateDeepgramProvider, assemblyai: validateAssemblyAIProvider, "rev-ai": validateRevAiProvider, + soniox: validateSonioxProvider, "fal-ai": ({ apiKey, providerSpecificData }: any) => validateImageProviderApiKey({ provider: "fal-ai", apiKey, providerSpecificData }), "stability-ai": ({ apiKey, providerSpecificData }: any) => @@ -211,15 +213,30 @@ export async function validateProviderApiKey({ provider, apiKey, providerSpecifi oci: validateOciProvider, sap: validateSapProvider, bedrock: validateBedrockProvider, - modal: ({ apiKey, providerSpecificData }: any) => - validateOpenAILikeProvider({ + modal: ({ apiKey, providerSpecificData }: any) => { + // Modal is bring-your-own-deploy — it requires a Base URL pointing to the user's + // OpenAI-compatible Modal app. Without it, validateOpenAILikeProvider would build an + // empty probe URL and trip parseOutboundUrl with a raw guard error ("Invalid outbound + // URL: "). Surface an actionable message instead. See #9102. + const baseUrl = (providerSpecificData?.baseUrl || "").trim(); + if (!baseUrl) { + return { + valid: false, + error: + "Modal requires a Base URL pointing to your OpenAI-compatible Modal app " + + "(e.g. https://--.modal.run/v1). " + + "Fill in the \"Base URL override\" field.", + }; + } + return validateOpenAILikeProvider({ provider: "modal", apiKey, providerSpecificData, - baseUrl: normalizeBaseUrl(providerSpecificData?.baseUrl || ""), + baseUrl: normalizeBaseUrl(baseUrl), modelId: MODAL_DEFAULT_VALIDATION_MODEL_ID, isLocal, - }), + }); + }, "nous-research": validateNousResearchProvider, poe: validatePoeProvider, clarifai: validateClarifaiProvider, diff --git a/src/lib/providers/validation/audioMiscProviders.ts b/src/lib/providers/validation/audioMiscProviders.ts index be02b84704..e6df87dc80 100644 --- a/src/lib/providers/validation/audioMiscProviders.ts +++ b/src/lib/providers/validation/audioMiscProviders.ts @@ -80,6 +80,22 @@ export async function validateRevAiProvider({ apiKey, providerSpecificData = {} } } +export async function validateSonioxProvider({ apiKey, providerSpecificData = {} }: any) { + try { + const response = await validationRead("https://api.soniox.com/v1/transcriptions", { + method: "GET", + headers: buildBearerHeaders(apiKey, providerSpecificData), + }); + if (response.ok) return { valid: true, error: null }; + if (response.status === 401 || response.status === 403) { + return { valid: false, error: "Invalid API key" }; + } + return { valid: false, error: `Validation failed: ${response.status}` }; + } catch (error: any) { + return toValidationErrorResult(error); + } +} + export async function validateElevenLabsProvider({ apiKey, providerSpecificData = {} }: any) { try { // Lightweight auth check endpoint diff --git a/src/lib/providers/validation/searchProviders.ts b/src/lib/providers/validation/searchProviders.ts index ecfa79b594..302a792266 100644 --- a/src/lib/providers/validation/searchProviders.ts +++ b/src/lib/providers/validation/searchProviders.ts @@ -173,14 +173,26 @@ export const SEARCH_VALIDATOR_CONFIGS: Record< // Probe each provider's real fetch endpoint with the same Bearer auth the executor // uses; validateSearchProvider maps 200/<500 → valid, 401/403 → invalid key, // >=500 → failure (a credit-exhausted / rate-limited key still validates). - firecrawl: (apiKey) => ({ - url: "https://api.firecrawl.dev/v1/scrape", - init: { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${apiKey}` }, - body: JSON.stringify({ url: "https://example.com", formats: ["markdown"] }), - }, - }), + firecrawl: (apiKey, providerSpecificData = {}) => { + const envBase = process.env.FIRECRAWL_BASE_URL?.trim(); + const baseUrl = envBase + ? envBase.replace(/\/+$/, "") + : typeof providerSpecificData?.baseUrl === "string" && providerSpecificData.baseUrl.trim() + ? providerSpecificData.baseUrl.trim().replace(/\/+$/, "") + : "https://api.firecrawl.dev"; + const headers: Record = { "Content-Type": "application/json" }; + if (apiKey) { + headers["Authorization"] = `Bearer ${apiKey}`; + } + return { + url: `${baseUrl}/v1/scrape`, + init: { + method: "POST", + headers, + body: JSON.stringify({ url: "https://example.com", formats: ["markdown"] }), + }, + }; + }, "jina-reader": (apiKey) => ({ url: "https://r.jina.ai/https://example.com", init: { diff --git a/src/lib/providers/validation/webProvidersB.ts b/src/lib/providers/validation/webProvidersB.ts index ae7f0810cc..d455d34ae7 100644 --- a/src/lib/providers/validation/webProvidersB.ts +++ b/src/lib/providers/validation/webProvidersB.ts @@ -278,8 +278,7 @@ export async function validateGeminiWebProvider({ apiKey, providerSpecificData = return { valid: true, error: null, - warning: - "Cookie accepted. Full verification requires browser test on first chat.", + warning: "Cookie accepted. Full verification requires browser test on first chat.", }; } return { valid: true, error: null }; @@ -342,7 +341,10 @@ export async function validateCopilotWebProvider({ apiKey, providerSpecificData } } -export function extractM365CredentialParts(raw: string, providerSpecificData: Record) { +export function extractM365CredentialParts( + raw: string, + providerSpecificData: Record +) { const text = raw.trim(); const parts: Record = {}; @@ -361,9 +363,10 @@ export function extractM365CredentialParts(raw: string, providerSpecificData: Re if (/^wss:\/\//i.test(text)) { try { const url = new URL(text); - const hostOk = /^(?:[\w-]+\.)*(?:m365\.cloud\.microsoft|copilot\.microsoft\.com|substrate\.office\.com)$/i.test( - url.hostname - ); + const hostOk = + /^(?:[\w-]+\.)*(?:m365\.cloud\.microsoft|copilot\.microsoft\.com|substrate\.office\.com)$/i.test( + url.hostname + ); if (hostOk && url.pathname.startsWith("/m365Copilot/Chathub/")) { parts.access_token ||= url.searchParams.get("access_token") || ""; parts.chathubPath ||= decodeURIComponent( @@ -382,7 +385,9 @@ export function extractM365CredentialParts(raw: string, providerSpecificData: Re (typeof providerSpecificData.access_token === "string" ? providerSpecificData.access_token : "") || - (typeof providerSpecificData.accessToken === "string" ? providerSpecificData.accessToken : ""), + (typeof providerSpecificData.accessToken === "string" + ? providerSpecificData.accessToken + : ""), chathubPath: parts.chathubPath || parts.userTenant || @@ -394,10 +399,7 @@ export function extractM365CredentialParts(raw: string, providerSpecificData: Re } // ── Microsoft 365 Copilot Web token validator ── -export async function validateCopilotM365WebProvider({ - apiKey, - providerSpecificData = {}, -}: any) { +export async function validateCopilotM365WebProvider({ apiKey, providerSpecificData = {} }: any) { const { accessToken, chathubPath } = extractM365CredentialParts( String(apiKey || ""), providerSpecificData diff --git a/src/lib/providers/webCookieAuth.ts b/src/lib/providers/webCookieAuth.ts index b0cbeea326..0796e11fac 100644 --- a/src/lib/providers/webCookieAuth.ts +++ b/src/lib/providers/webCookieAuth.ts @@ -6,15 +6,74 @@ export function stripCookieInputPrefix(rawValue: string): string { return withoutBearer.replace(/^cookie:/i, "").trim(); } -export function normalizeSessionCookieHeader(rawValue: string, defaultCookieName: string): string { - const normalized = stripCookieInputPrefix(rawValue); - if (!normalized) return ""; +/** + * Parse a JSON array of cookie objects and produce a Cookie header string. + * + * Accepts the format exported by browser cookie-editor extensions / DevTools: + * ```json + * [ + * {"name":"sso","value":"eyJ0eXAi...","domain":".example.com","path":"/"}, + * {"name":"sso-rw","value":"eyJOTHER..."} + * ] + * ``` + * + * Only `name` and `value` are required. Extra fields (domain, path, expires, + * httpOnly, secure, sameSite) are silently ignored — they describe the cookie + * but are not part of the `Cookie` request header. + * + * @param rawValue - The user-provided cookie string (possibly JSON). + * @returns A Cookie header string, null if the input is not JSON (pass-through). + * @throws {Error} If a JSON entry is missing the required `name` or `value` field. + */ +export function parseJsonCookiesToHeader(rawValue: string): string | null { + const trimmed = (rawValue || "").trim(); + if (!trimmed || !trimmed.startsWith("[")) return null; - if (normalized.includes("=")) { - return normalized; + let parsed: unknown; + try { + parsed = JSON.parse(trimmed); + } catch { + return null; } - return `${defaultCookieName}=${normalized}`; + if (!Array.isArray(parsed)) return null; + if (parsed.length === 0) return ""; + + const parts: string[] = []; + for (let i = 0; i < parsed.length; i++) { + const entry = parsed[i]; + if (!entry || typeof entry !== "object" || Array.isArray(entry)) { + throw new Error(`Invalid cookie JSON at index ${i}: expected an object`); + } + const record = entry as Record; + + if (typeof record.name !== "string" || !record.name) { + throw new Error(`Invalid cookie JSON at index ${i}: missing required field 'name'`); + } + if (typeof record.value !== "string") { + throw new Error(`Invalid cookie JSON at index ${i}: missing required field 'value'`); + } + + parts.push(`${record.name}=${record.value}`); + } + + return parts.join("; "); +} + +export function normalizeSessionCookieHeader(rawValue: string, defaultCookieName: string): string { + const stripped = stripCookieInputPrefix(rawValue); + if (!stripped) return ""; + + const jsonResult = parseJsonCookiesToHeader(stripped); + if (jsonResult !== null) { + return jsonResult; + } + + if (stripped.includes("=")) { + return stripped; + } + + return `${defaultCookieName}=${stripped}`; } /** diff --git a/src/lib/radar/applyFeed.ts b/src/lib/radar/applyFeed.ts new file mode 100644 index 0000000000..4974a201fc --- /dev/null +++ b/src/lib/radar/applyFeed.ts @@ -0,0 +1,350 @@ +/** + * applyFeed.ts — Read-time overlay merge for the Radar free-model catalog. + * + * The feed is applied OVER the static baseline catalog at read time. + * The baseline (`FREE_MODEL_BUDGETS`) is NEVER mutated. + * + * Merge rules: + * 1. Feed never overwrites a local override. + * 2. `enabled:false` disables the entry with `disabledBy: "radar"` provenance. + * 3. User-added entry NOT in the feed survives untouched. + * 4. User deletion tombstone prevents feed from resurrecting the entry. + */ + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +/** + * A merged catalog entry. Extends the baseline `FreeModelBudget` shape + * with overlay metadata so the UI can render origin badges and explain + * why an entry is disabled. + */ +export interface MergedEntry { + provider: string; + modelId: string; + displayName: string; + monthlyTokens: number; + creditTokens: number; + freeType: + | "recurring-daily" + | "recurring-monthly" + | "recurring-uncapped" + | "recurring-credit" + | "keyless" + | "one-time-initial" + | "discontinued"; + poolKey: string | null; + tos: "ok" | "caution" | "ambiguous" | "avoid" | "unknown"; + trainsOnPrompts?: boolean; + /** Whether the entry is enabled for use. Defaults to true. */ + enabled?: boolean; + /** + * Provenance: where this entry's merged state comes from. + * - "baseline": untouched from the static catalog. + * - "radar": fields were updated by the Radar feed. + * - "local": user has at least one local override on this entry. + */ + origin: "baseline" | "radar" | "local"; + /** + * Present when the entry was disabled by the Radar feed (`enabled: false`). + * Absent for entries disabled by other means or still enabled. + */ + disabledBy?: "radar"; + /** + * Context window size in tokens. Only present on entries that carry feed + * data (origin "radar"/"local" merged from a feed entry); undefined for + * baseline-only entries. + */ + contextWindow?: number | null; + /** Capability flags reported by the feed. Undefined for baseline-only entries. */ + capabilities?: { + tools: boolean; + vision: boolean; + thinking: boolean; + }; + /** Rate/quota limits reported by the feed. Undefined for baseline-only entries. */ + limits?: { + rpm: number | null; + rpd: number | null; + tpm: number | null; + tpd: number | null; + }; + /** Setup guide (key URL + steps) reported by the feed. Undefined for baseline-only entries. */ + setup?: { + keyUrl: string | null; + steps: string[]; + } | null; +} + +/** + * A feed model entry from the Radar catalog payload. + * Matches the shape in `feedSchema.ts` ModelSchema. + */ +export interface FeedModel { + provider: string; + modelId: string; + displayName: string; + familyId: string | null; + freeType: MergedEntry["freeType"]; + budget: + | { kind: "per_model"; tokensPerMonth: number } + | { kind: "shared_pool"; poolId: string; tokensPerMonth: number } + | { kind: "rate_only" }; + limits: { + rpm: number | null; + rpd: number | null; + tpm: number | null; + tpd: number | null; + }; + contextWindow: number | null; + capabilities: { + tools: boolean; + vision: boolean; + thinking: boolean; + }; + trainsOnPrompts: boolean | null; + tosRisk: MergedEntry["tos"]; + setup: { + keyUrl: string | null; + steps: string[]; + } | null; + enabled: boolean; +} + +// --------------------------------------------------------------------------- +// Helpers +// --------------------------------------------------------------------------- + +/** + * Build a composite key for deduplication / override / tombstone lookup. + */ +function entryKey(provider: string, modelId: string): string { + return `${provider}:${modelId}`; +} + +/** + * Convert a FeedModel budget into a `monthlyTokens` number compatible + * with the baseline catalog shape. + */ +function feedBudgetToMonthlyTokens( + budget: FeedModel["budget"], +): number { + if (budget.kind === "per_model") return budget.tokensPerMonth; + if (budget.kind === "shared_pool") return budget.tokensPerMonth; + return 0; // rate_only +} + +/** + * Convert a FeedModel budget into a `poolKey` compatible with the baseline. + */ +function feedBudgetToPoolKey( + budget: FeedModel["budget"], +): string | null { + if (budget.kind === "shared_pool") return budget.poolId; + return null; +} + +// --------------------------------------------------------------------------- +// applyFeed +// --------------------------------------------------------------------------- + +export interface ApplyFeedInput { + /** The static baseline catalog entries. */ + baseline: MergedEntry[]; + /** Feed model entries from the cached Radar payload. */ + feed: FeedModel[]; + /** + * User-local overrides keyed by `provider:modelId`. + * Each value is a partial MergedEntry — only the fields the user explicitly + * customized. Feed values for those fields are skipped. + */ + localOverrides: Map>; + /** + * Composite keys (`provider:modelId`) of entries the user has deleted. + * Feed re-appearance must NOT resurrect them. + */ + tombstones: Set; +} + +/** + * Merge the Radar feed over the baseline catalog, honoring 4 rules: + * + * 1. Feed never overwrites a local override field. + * 2. `enabled:false` disables the entry with provenance. + * 3. User-added entry NOT in the feed survives untouched. + * 4. Tombstone prevents resurrection. + * + * @returns A new array of merged entries (never mutates inputs). + */ +export function applyFeed(input: ApplyFeedInput): MergedEntry[] { + const { baseline, feed, localOverrides, tombstones } = input; + + // Index baseline by composite key for fast lookup + const baselineIndex = new Map(); + for (const entry of baseline) { + const key = entryKey(entry.provider, entry.modelId); + // Rule 4: if tombstoned, skip even baseline entries + if (!tombstones.has(key)) { + baselineIndex.set(key, entry); + } + } + + // Index feed by composite key + const feedIndex = new Map(); + for (const model of feed) { + const key = entryKey(model.provider, model.modelId); + feedIndex.set(key, model); + } + + // Result accumulator — keyed to prevent duplicates + const resultMap = new Map(); + + // Pass 1: process all baseline entries + for (const [key, baseEntry] of baselineIndex) { + const feedEntry = feedIndex.get(key); + const overrides = localOverrides.get(key); + + if (!feedEntry) { + // No feed entry: baseline passes through (rule 3: user-added survives) + resultMap.set(key, { ...baseEntry }); + continue; + } + + // Feed entry exists — merge + const merged = mergeOne(baseEntry, feedEntry, overrides); + resultMap.set(key, merged); + } + + // Pass 2: add feed-only entries (not in baseline) + for (const [key, feedEntry] of feedIndex) { + if (resultMap.has(key)) continue; // already processed + if (tombstones.has(key)) continue; // rule 4 + + // New entry from feed + const overrides = localOverrides.get(key); + const merged = feedModelToMerged(feedEntry, overrides); + resultMap.set(key, merged); + } + + return [...resultMap.values()]; +} + +// --------------------------------------------------------------------------- +// Internal merge helpers +// --------------------------------------------------------------------------- + +/** + * Merge a single baseline entry with a feed entry and optional local overrides. + * Rule 1: local overrides take precedence over feed values. + * Rule 2: feed `enabled: false` disables with provenance. + */ +function mergeOne( + base: MergedEntry, + feed: FeedModel, + overrides: Partial | undefined, +): MergedEntry { + // Start from baseline + const result: MergedEntry = { ...base }; + + // Determine which fields the user has overridden locally + const overriddenKeys = overrides ? new Set(Object.keys(overrides)) : new Set(); + + // Rule 2: feed disable + if (!feed.enabled) { + result.enabled = false; + result.disabledBy = "radar"; + } + + // Merge feed fields that the user has NOT overridden (rule 1) + if (!overriddenKeys.has("displayName")) { + result.displayName = feed.displayName; + } + if (!overriddenKeys.has("monthlyTokens")) { + result.monthlyTokens = feedBudgetToMonthlyTokens(feed.budget); + } + if (!overriddenKeys.has("poolKey")) { + result.poolKey = feedBudgetToPoolKey(feed.budget); + } + if (!overriddenKeys.has("freeType")) { + result.freeType = feed.freeType; + } + if (!overriddenKeys.has("tos")) { + result.tos = feed.tosRisk; + } + if (!overriddenKeys.has("trainsOnPrompts")) { + result.trainsOnPrompts = feed.trainsOnPrompts ?? undefined; + } + if (!overriddenKeys.has("creditTokens")) { + // Feed doesn't have creditTokens; keep baseline + } + if (!overriddenKeys.has("contextWindow")) { + result.contextWindow = feed.contextWindow; + } + if (!overriddenKeys.has("capabilities")) { + result.capabilities = feed.capabilities; + } + if (!overriddenKeys.has("limits")) { + result.limits = feed.limits; + } + if (!overriddenKeys.has("setup")) { + result.setup = feed.setup; + } + + // Apply local overrides (rule 1: they win) + if (overrides) { + if (overrides.displayName !== undefined) result.displayName = overrides.displayName; + if (overrides.monthlyTokens !== undefined) result.monthlyTokens = overrides.monthlyTokens; + if (overrides.creditTokens !== undefined) result.creditTokens = overrides.creditTokens; + if (overrides.freeType !== undefined) result.freeType = overrides.freeType; + if (overrides.poolKey !== undefined) result.poolKey = overrides.poolKey; + if (overrides.tos !== undefined) result.tos = overrides.tos; + if (overrides.trainsOnPrompts !== undefined) result.trainsOnPrompts = overrides.trainsOnPrompts; + if (overrides.enabled !== undefined) result.enabled = overrides.enabled; + if (overrides.contextWindow !== undefined) result.contextWindow = overrides.contextWindow; + if (overrides.capabilities !== undefined) result.capabilities = overrides.capabilities; + if (overrides.limits !== undefined) result.limits = overrides.limits; + if (overrides.setup !== undefined) result.setup = overrides.setup; + } + + // Origin: "local" if user has overrides, else "radar" (feed updated it) + result.origin = overriddenKeys.size > 0 ? "local" : "radar"; + + return result; +} + +/** + * Convert a feed-only model into a MergedEntry. + */ +function feedModelToMerged( + feed: FeedModel, + overrides: Partial | undefined, +): MergedEntry { + const entry: MergedEntry = { + provider: feed.provider, + modelId: feed.modelId, + displayName: overrides?.displayName ?? feed.displayName, + monthlyTokens: overrides?.monthlyTokens ?? feedBudgetToMonthlyTokens(feed.budget), + creditTokens: overrides?.creditTokens ?? 0, + freeType: overrides?.freeType ?? feed.freeType, + poolKey: overrides?.poolKey ?? feedBudgetToPoolKey(feed.budget), + tos: overrides?.tos ?? feed.tosRisk, + trainsOnPrompts: overrides?.trainsOnPrompts ?? (feed.trainsOnPrompts ?? undefined), + enabled: overrides?.enabled ?? feed.enabled, + origin: overrides ? "local" : "radar", + contextWindow: overrides?.contextWindow ?? feed.contextWindow, + capabilities: overrides?.capabilities ?? feed.capabilities, + limits: overrides?.limits ?? feed.limits, + setup: overrides?.setup ?? feed.setup, + }; + + // Rule 2 (feed disable) — but rule 1 (local override wins) takes precedence, + // matching mergeOne(): only force-disable when the user has NOT explicitly + // overridden `enabled` locally. + if (!feed.enabled && overrides?.enabled === undefined) { + entry.enabled = false; + entry.disabledBy = "radar"; + } + + return entry; +} diff --git a/src/lib/radar/autoSync.ts b/src/lib/radar/autoSync.ts new file mode 100644 index 0000000000..a05857fe2c --- /dev/null +++ b/src/lib/radar/autoSync.ts @@ -0,0 +1,27 @@ +/** + * autoSync.ts — pure staleness rule shared by the Radar page (client) and the + * background scheduler (server). + * + * Kept free of any server-only import (db, sync) so the "use client" Radar + * page can consume it directly. + */ + +/** Cache older than this triggers an automatic sync when the page opens. */ +export const AUTO_SYNC_STALE_MS = 6 * 60 * 60 * 1000; // 6h + +/** + * Whether an automatic sync should fire for a cache fetched at `fetchedAt`. + * + * Missing or unparseable timestamps count as stale — the only way to get a + * fresh verdict is a real, recent fetch. + */ +export function shouldAutoSyncOnOpen( + fetchedAt: string | null | undefined, + nowMs: number, + staleMs: number = AUTO_SYNC_STALE_MS +): boolean { + if (!fetchedAt) return true; + const fetchedMs = Date.parse(fetchedAt); + if (!Number.isFinite(fetchedMs)) return true; + return nowMs - fetchedMs >= staleMs; +} diff --git a/src/lib/radar/feedSchema.ts b/src/lib/radar/feedSchema.ts new file mode 100644 index 0000000000..16f7975fe3 --- /dev/null +++ b/src/lib/radar/feedSchema.ts @@ -0,0 +1,213 @@ +/** + * feedSchema.ts — Zod schema for the OmniRoute Radar feed payload. + * + * This is the CLIENT-SIDE mirror of the server's feed schema. The server + * is the source of truth; this schema validates whatever we downloaded + * before caching it locally. + * + * Schema version: 1 + */ + +import { z } from "zod"; + +// --------------------------------------------------------------------------- +// Enums +// --------------------------------------------------------------------------- + +const FreeTypeEnum = z.enum([ + "recurring-daily", + "recurring-monthly", + "recurring-uncapped", + "recurring-credit", + "keyless", + "one-time-initial", + "discontinued", +]); + +const TosRiskEnum = z.enum(["ok", "caution", "avoid"]); + +const SeverityEnum = z.enum(["info", "warn"]); + +const TierEnum = z.enum(["community", "live"]); + +/** + * Exported so `sync.ts` can validate the `x-omniroute-feed-tier` response + * header against the same allowed values, without duplicating the enum. + */ +export const RadarTierSchema = TierEnum; +export type RadarTier = z.infer; + +// --------------------------------------------------------------------------- +// Sub-schemas +// --------------------------------------------------------------------------- + +const IntNullable = z.number().int().nullable(); + +/** + * Budget is a discriminated union on `kind`: + * - per_model: tokensPerMonth (positive int) + * - shared_pool: poolId + tokensPerMonth (positive int) + * - rate_only: no additional fields + */ +const BudgetSchema = z.discriminatedUnion("kind", [ + z.object({ + kind: z.literal("per_model"), + tokensPerMonth: z.number().int().positive(), + }), + z.object({ + kind: z.literal("shared_pool"), + poolId: z.string(), + tokensPerMonth: z.number().int().positive(), + }), + z.object({ + kind: z.literal("rate_only"), + }), +]); + +const LimitsSchema = z.object({ + rpm: IntNullable, + rpd: IntNullable, + tpm: IntNullable, + tpd: IntNullable, +}); + +const CapabilitiesSchema = z.object({ + tools: z.boolean(), + vision: z.boolean(), + thinking: z.boolean(), +}); + +const SetupSchema = z + .object({ + keyUrl: z.string().url().nullable(), + steps: z.array(z.string()), + }) + .nullable(); + +// --------------------------------------------------------------------------- +// Referral (D28 — referral links / free credits) +// --------------------------------------------------------------------------- + +const ReferralKindEnum = z.enum(["fixo", "campanha"]); + +/** Referral URLs are always required to be https:// (never plain http). */ +const HttpsUrlSchema = z + .string() + .url() + .refine((v) => v.startsWith("https://"), { message: "Referral url must use https://" }); + +const RadarReferralSchema = z.object({ + provider: z.string(), + url: HttpsUrlSchema, + kind: ReferralKindEnum, + validUntil: z.string().nullable(), + requiredAction: z.string().nullable(), + isDefault: z.boolean(), +}); + +/** + * `referrals` is a whole-object `.default()` (not just a per-field default) + * so a cached feed downloaded before this section existed on the server + * still parses cleanly — `parsed.referrals` resolves to `{fixed:[], + * campaigns:[]}` instead of failing validation. `campaigns` also defaults + * independently so a feed that has `referrals.fixed` but omits `campaigns` + * (e.g. an intermediate server rollout) still parses. + */ +const RadarReferralsSchema = z + .object({ + fixed: z.array(RadarReferralSchema).default([]), + campaigns: z.array(RadarReferralSchema).default([]), + }) + .default({ fixed: [], campaigns: [] }); + +// --------------------------------------------------------------------------- +// Model +// --------------------------------------------------------------------------- + +const ModelSchema = z.object({ + provider: z.string(), + modelId: z.string(), + displayName: z.string(), + familyId: z.string().nullable(), + freeType: FreeTypeEnum, + budget: BudgetSchema, + limits: LimitsSchema, + contextWindow: z.number().int().nullable(), + capabilities: CapabilitiesSchema, + trainsOnPrompts: z.boolean().nullable(), + tosRisk: TosRiskEnum, + setup: SetupSchema, + enabled: z.boolean(), +}); + +// --------------------------------------------------------------------------- +// Provider +// --------------------------------------------------------------------------- + +const ProviderSchema = z.object({ + id: z.string(), + name: z.string(), +}); + +// --------------------------------------------------------------------------- +// Quirk +// --------------------------------------------------------------------------- + +const QuirkTargetSchema = z.object({ + provider: z.string(), + modelGlob: z.string().nullable(), +}); + +const QuirkSchema = z.object({ + slug: z.string(), + title: z.string(), + body: z.string(), + severity: SeverityEnum, + targets: z.array(QuirkTargetSchema), +}); + +// --------------------------------------------------------------------------- +// Top-level feed schema +// --------------------------------------------------------------------------- + +export const RadarFeedSchema = z.object({ + feed: z.literal("omniroute-radar"), + schemaVersion: z.literal(1), + version: z.string(), + generatedAt: z.string().datetime(), + // NOTE: this body field is ALWAYS "live", by design — the community tier + // is the exact same signed bytes served from an older snapshot, and there + // is only one signed artifact per version (rewriting this field + // server-side per request would break the exact-bytes Ed25519 signature). + // The tier ACTUALLY served is decided by the server per-request based on + // the Authorization key, and is surfaced via the `x-omniroute-feed-tier` + // response header instead. NEVER read this field for UI/display — use the + // served-tier value that `sync.ts` derives from the header (falling back + // to this field only when the header is absent, e.g. an older server). + tier: TierEnum, + counts: z.object({ + providers: z.number().int(), + models: z.number().int(), + }), + providers: z.array(ProviderSchema), + models: z.array(ModelSchema), + quirks: z.array(QuirkSchema), + referrals: RadarReferralsSchema, + totals: z.object({ + dedupedTokensPerMonth: z.number().int(), + modelCount: z.number().int(), + poolCount: z.number().int(), + }), +}); + +// --------------------------------------------------------------------------- +// Inferred types +// --------------------------------------------------------------------------- + +export type RadarFeed = z.infer; +export type RadarModel = z.infer; +export type RadarProvider = z.infer; +export type RadarQuirk = z.infer; +export type RadarBudget = z.infer; +export type RadarReferral = z.infer; +export type RadarReferrals = z.infer; diff --git a/src/lib/radar/index.ts b/src/lib/radar/index.ts new file mode 100644 index 0000000000..37633b8e5d --- /dev/null +++ b/src/lib/radar/index.ts @@ -0,0 +1,199 @@ +/** + * index.ts — Radar client public accessor. + * + * Thin entry point for the UI screens. Returns the merged catalog + * (baseline + feed overlay) when Radar is active, or the raw baseline + * when the flag is off / no cache / corrupt cache. + * + * This module is the ONLY thing the screens import from `@/lib/radar`. + * All heavy lifting (sync, verify, schema, merge) lives in sibling files. + */ + +import { FREE_MODEL_BUDGETS } from "@omniroute/open-sse/config/freeModelCatalog"; +import { RadarFeedSchema, type RadarFeed, type RadarReferral } from "./feedSchema"; +import { applyFeed, type MergedEntry, type FeedModel } from "./applyFeed"; +import { findDefaultReferral } from "./referrals"; +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; +import { getRadarCache } from "@/lib/db/radar"; + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +export interface RadarCatalogResult { + /** Merged catalog entries. */ + entries: MergedEntry[]; + /** Feed metadata — null when falling back to baseline. */ + meta: { + version: string; + tier: string; + fetchedAt: string; + } | null; +} + +/** Injectable deps for testing. */ +export interface GetRadarCatalogDeps { + getFlag?: (key: string) => boolean; + getCache?: () => { version: string; tier: string; payload: string; fetchedAt: string } | null; + baseline?: MergedEntry[]; + localOverrides?: Map>; + tombstones?: Set; +} + +// --------------------------------------------------------------------------- +// Baseline converter +// --------------------------------------------------------------------------- + +/** + * Convert the static `FreeModelBudget[]` into `MergedEntry[]` so the + * merge function has a uniform input shape. + */ +export function baselineToMergedEntries( + budgets: typeof FREE_MODEL_BUDGETS, +): MergedEntry[] { + return budgets.map((b) => ({ + provider: b.provider, + modelId: b.modelId, + displayName: b.displayName, + monthlyTokens: b.monthlyTokens, + creditTokens: b.creditTokens, + freeType: b.freeType, + poolKey: b.poolKey ?? null, + tos: b.tos, + trainsOnPrompts: b.trainsOnPrompts, + enabled: true, + origin: "baseline" as const, + })); +} + +// --------------------------------------------------------------------------- +// getRadarCatalog +// --------------------------------------------------------------------------- + +/** + * Return the merged Radar catalog. + * + * Falls back to the static baseline (no overlay) when: + * - The `RADAR_ENABLED` flag is off. + * - There is no cached feed yet. + * - The cached payload fails defensive re-validation. + * + * @param deps - Injectable dependencies for testing. + */ +export function getRadarCatalog(deps: GetRadarCatalogDeps = {}): RadarCatalogResult { + const { + getFlag = isFeatureFlagEnabled, + getCache: getCacheFn = getRadarCache, + baseline: baselineInput, + localOverrides = new Map(), + tombstones = new Set(), + } = deps; + + // Resolve baseline + const baseline = baselineInput ?? baselineToMergedEntries(FREE_MODEL_BUDGETS); + + // Flag gate + const flagOn = getFlag("RADAR_ENABLED"); + if (!flagOn) { + return { entries: baseline, meta: null }; + } + + // Cache gate + const cache = getCacheFn(); + if (!cache) { + return { entries: baseline, meta: null }; + } + + // Defensive parse + let feed: RadarFeed; + try { + const parsed = JSON.parse(cache.payload); + feed = RadarFeedSchema.parse(parsed); + } catch { + return { entries: baseline, meta: null }; + } + + // Apply overlay + const entries = applyFeed({ + baseline, + feed: feed.models as FeedModel[], + localOverrides, + tombstones, + }); + + return { + entries, + meta: { + version: cache.version, + tier: cache.tier, + fetchedAt: cache.fetchedAt, + }, + }; +} + +// --------------------------------------------------------------------------- +// getRadarReferrals / getDefaultReferralFor +// --------------------------------------------------------------------------- + +export interface RadarReferralsResult { + fixed: RadarReferral[]; + campaigns: RadarReferral[]; +} + +const EMPTY_REFERRALS: RadarReferralsResult = { fixed: [], campaigns: [] }; + +/** Injectable deps for testing — mirrors GetRadarCatalogDeps. */ +export interface GetRadarReferralsDeps { + getFlag?: (key: string) => boolean; + getCache?: () => { version: string; tier: string; payload: string; fetchedAt: string } | null; +} + +/** + * Return the referral links section of the cached Radar feed. + * + * Never throws — returns `{fixed:[],campaigns:[]}` when: the flag is off, + * there is no cache yet, the cached payload fails defensive re-validation, + * or the cached feed predates the `referrals` section (old-feed compat — + * the schema's `.default()` already covers this, this is a second line of + * defense for a payload that fails to parse at all). + */ +export function getRadarReferrals(deps: GetRadarReferralsDeps = {}): RadarReferralsResult { + const { getFlag = isFeatureFlagEnabled, getCache: getCacheFn = getRadarCache } = deps; + + if (!getFlag("RADAR_ENABLED")) { + return EMPTY_REFERRALS; + } + + const cache = getCacheFn(); + if (!cache) { + return EMPTY_REFERRALS; + } + + let feed: RadarFeed; + try { + const parsed = JSON.parse(cache.payload); + feed = RadarFeedSchema.parse(parsed); + } catch { + return EMPTY_REFERRALS; + } + + return feed.referrals ?? EMPTY_REFERRALS; +} + +/** + * Return the fixed, isDefault:true referral link for `provider`, or `null` + * when there isn't one (flag off, no cache, or no matching default). Only + * looks at `fixed` referrals — see `findDefaultReferral` in `./referrals.ts`. + */ +export function getDefaultReferralFor( + provider: string, + deps: GetRadarReferralsDeps = {}, +): RadarReferral | null { + const { fixed } = getRadarReferrals(deps); + return findDefaultReferral(fixed, provider); +} + +// Re-export merge types for convenience +export { applyFeed, type MergedEntry, type FeedModel } from "./applyFeed"; +export { findDefaultReferral } from "./referrals"; +export type { RadarReferral } from "./feedSchema"; diff --git a/src/lib/radar/links.ts b/src/lib/radar/links.ts new file mode 100644 index 0000000000..3641efa763 --- /dev/null +++ b/src/lib/radar/links.ts @@ -0,0 +1,42 @@ +/** + * links.ts — pure config for the two Radar "get a supporter key" outbound + * links (F4/T7): the contributor-claim (GitHub OAuth) flow and the + * supporter-plans (payment) page on the private radar.omniroute.online + * server. + * + * DELIBERATELY DB-FREE and side-effect-free — same shape as the + * `RADAR_FEED_URL` override already used by `./sync.ts`, so forks/self-hosters + * point both links at their own deployment via env vars (see + * docs/frameworks/RADAR.md). + * + * These functions are read server-side only (inside a route handler) and the + * resolved URLs are relayed to the client via GET /api/radar/settings — the + * dashboard page never reads `process.env` itself, matching the pattern the + * D28 referral links already established for the private feed. + * + * No price or monetary value is ever resolved, stored, or exposed here — the + * URLs point at pages that are themselves the ONLY place pricing lives + * (spec D14: no pricing in the OSS repo). + */ + +/** Default contributor-claim entry point — starts the GitHub OAuth flow. */ +const DEFAULT_CONTRIBUTOR_CLAIM_URL = "https://radar.omniroute.online/auth/github"; + +/** Default supporter plans/payment page. */ +const DEFAULT_SUPPORTER_PLANS_URL = "https://radar.omniroute.online/planos"; + +/** + * URL that starts the "I'm a contributor" GitHub OAuth claim flow. + * Override with `RADAR_CONTRIBUTOR_CLAIM_URL` for forks/self-hosters. + */ +export function getContributorClaimUrl(): string { + return process.env.RADAR_CONTRIBUTOR_CLAIM_URL || DEFAULT_CONTRIBUTOR_CLAIM_URL; +} + +/** + * URL for the "Support the project" plans/payment page. + * Override with `RADAR_SUPPORTER_PLANS_URL` for forks/self-hosters. + */ +export function getSupporterPlansUrl(): string { + return process.env.RADAR_SUPPORTER_PLANS_URL || DEFAULT_SUPPORTER_PLANS_URL; +} diff --git a/src/lib/radar/pinnedKeys.ts b/src/lib/radar/pinnedKeys.ts new file mode 100644 index 0000000000..9e04f5d359 --- /dev/null +++ b/src/lib/radar/pinnedKeys.ts @@ -0,0 +1,63 @@ +/** + * pinnedKeys.ts — Pinned Ed25519 public keys for Radar feed signature verification. + * + * The private key lives ONLY on the signing server. The public key is safe + * to commit — it lets clients verify that a feed was signed by the real + * OmniRoute Radar server without any CA or PKI infrastructure. + * + * Fork operators can override the key via the `RADAR_FEED_PUBKEY` env var + * (base64-DER or PEM) so they can point at their own feed server. + */ + +import crypto from "node:crypto"; + +/** + * Pinned Ed25519 SPKI-DER public key (base64-encoded). + * + * This is the DEFAULT key used when `RADAR_FEED_PUBKEY` is not set. + * Array allows key rotation (new keys are prepended; old ones remain + * until all cached feeds have been re-signed). + */ +export const PINNED_FEED_PUBLIC_KEYS: readonly string[] = [ + "MCowBQYDK2VwAyEAgTRJp8E45rtMLo7LiigexGl230wGiV5/sZddXFfQUdY=", +]; + +/** + * Return the active set of feed public keys. + * + * When `RADAR_FEED_PUBKEY` is set (base64-DER or PEM), that single key + * is returned — this is the fork path. Otherwise the pinned array is used. + */ +export function getFeedPublicKeys(): readonly string[] { + const override = process.env.RADAR_FEED_PUBKEY; + if (override && override.trim().length > 0) { + return [override.trim()]; + } + return PINNED_FEED_PUBLIC_KEYS; +} + +/** + * Convert a base64-DER or PEM string to a `crypto.KeyObject` suitable + * for `crypto.verify()`. Returns `null` if the input is malformed. + */ +export function toPublicKey(input: string): crypto.KeyObject | null { + try { + const trimmed = input.trim(); + + // PEM path + if (trimmed.startsWith("-----BEGIN")) { + return crypto.createPublicKey(trimmed); + } + + // base64-DER path + const der = Buffer.from(trimmed, "base64"); + if (der.length === 0) return null; + return crypto.createPublicKey({ + key: der, + format: "der", + type: "spki", + }); + } catch { + return null; + } +} diff --git a/src/lib/radar/referrals.ts b/src/lib/radar/referrals.ts new file mode 100644 index 0000000000..b68b5ba246 --- /dev/null +++ b/src/lib/radar/referrals.ts @@ -0,0 +1,29 @@ +/** + * referrals.ts — pure helpers for the Radar "referral links / free credits" + * feature (D28). + * + * DELIBERATELY DB-FREE: this file must be safe to import from a `"use + * client"` component (e.g. the providers dashboard) without pulling in + * `@/lib/db/*` (better-sqlite3 is Node-only and cannot be bundled into the + * browser). The DB-touching accessors (`getRadarReferrals`, + * `getDefaultReferralFor`) live in `./index.ts` and delegate the actual + * "which referral is the default for this provider" decision back to + * `findDefaultReferral` here, so the logic is defined exactly once and both + * the server accessor and the client UI use the same rule. + */ + +import type { RadarReferral } from "./feedSchema"; + +/** + * Find the fixed, isDefault:true referral link for a provider. + * + * Only looks at `fixed` referrals by design — campaigns are never used as + * the "default" link on the provider name (they are temporary/opt-in extras + * surfaced separately on the Radar "free credits" tab). + */ +export function findDefaultReferral( + fixed: RadarReferral[], + provider: string, +): RadarReferral | null { + return fixed.find((r) => r.provider === provider && r.isDefault === true) ?? null; +} diff --git a/src/lib/radar/scheduler.ts b/src/lib/radar/scheduler.ts new file mode 100644 index 0000000000..7a1b90e047 --- /dev/null +++ b/src/lib/radar/scheduler.ts @@ -0,0 +1,114 @@ +/** + * scheduler.ts — daily background sync for the Radar feed (spec: "GET 1×/dia, + * só quando opt-in"). + * + * Inertia contract: a flag-off boot NEVER creates a timer. The scheduler only + * starts from (a) `initRadarSyncScheduler()` at boot when the flag AND the + * user opt-in are already on, or (b) the settings route right after the user + * opts in. If the flag is later turned off, the next tick stops the timer — + * returning the process to the zero-timer state. + * + * The tick itself is cheap (one flag lookup + one DB row) and only performs a + * network sync when the cache is older than the daily window computed by + * `nextSyncTime()`. `syncRadar()` re-checks flag/opt-in internally, so a + * mid-flight settings change degrades to a no-op instead of an errant fetch. + */ + +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; +import { getRadarCache, getRadarSettings } from "@/lib/db/radar"; +import { nextSyncTime, syncRadar, type SyncStatus } from "./sync"; + +/** How often the scheduler re-evaluates staleness (NOT the sync cadence). */ +export const RADAR_SCHEDULER_TICK_MS = 60 * 60 * 1000; // hourly + +export type RadarTickResult = + | { action: "stopped"; reason: "flag_off" } + | { action: "skipped"; reason: "opt_out" | "not_due" } + | { action: "synced"; result: SyncStatus }; + +export interface RadarSchedulerDeps { + getFlag?: (key: string) => boolean; + getSettings?: () => { optIn: boolean }; + getCache?: () => { fetchedAt: string } | null; + sync?: () => Promise; + now?: () => number; + setIntervalFn?: typeof setInterval; + clearIntervalFn?: typeof clearInterval; +} + +let timer: ReturnType | null = null; + +/** + * One scheduler evaluation. Exported for tests and for the immediate + * post-start tick. + */ +export async function radarSchedulerTick(deps: RadarSchedulerDeps = {}): Promise { + const getFlag = deps.getFlag ?? isFeatureFlagEnabled; + if (!getFlag("RADAR_ENABLED")) { + stopRadarSyncScheduler(deps); + return { action: "stopped", reason: "flag_off" }; + } + + const settings = (deps.getSettings ?? getRadarSettings)(); + if (!settings.optIn) return { action: "skipped", reason: "opt_out" }; + + const cache = (deps.getCache ?? getRadarCache)(); + const nowMs = (deps.now ?? Date.now)(); + if (nowMs < nextSyncTime(cache?.fetchedAt ?? null).getTime()) { + return { action: "skipped", reason: "not_due" }; + } + + const result = await (deps.sync ?? syncRadar)(); + return { action: "synced", result }; +} + +/** + * Start the hourly staleness timer (idempotent). Fires one immediate, + * non-blocking tick so a due sync happens right away instead of waiting a + * full tick interval. Returns whether a new timer was created. + */ +export function ensureRadarSyncScheduler(deps: RadarSchedulerDeps = {}): boolean { + if (timer) return false; + + const tick = () => { + radarSchedulerTick(deps).catch((err: unknown) => { + const msg = err instanceof Error ? err.message : String(err); + console.warn("[RADAR_SYNC] Scheduled sync tick failed (non-fatal):", msg); + }); + }; + + timer = (deps.setIntervalFn ?? setInterval)(tick, RADAR_SCHEDULER_TICK_MS); + // Never keep the process alive just for this timer. + if (timer && typeof timer === "object" && "unref" in timer) { + (timer as { unref?: () => void }).unref?.(); + } + tick(); + return true; +} + +/** Stop the timer (used by the flag-off self-heal and by tests). */ +export function stopRadarSyncScheduler(deps: RadarSchedulerDeps = {}): void { + if (timer) { + (deps.clearIntervalFn ?? clearInterval)(timer); + timer = null; + } +} + +/** + * Boot-time init: only arms the scheduler when the flag AND the opt-in are + * already on (a flag-off install stays byte-identical — no timer, no DB + * polling loop). Never throws. + */ +export function initRadarSyncScheduler(deps: RadarSchedulerDeps = {}): boolean { + try { + const getFlag = deps.getFlag ?? isFeatureFlagEnabled; + if (!getFlag("RADAR_ENABLED")) return false; + const settings = (deps.getSettings ?? getRadarSettings)(); + if (!settings.optIn) return false; + return ensureRadarSyncScheduler(deps); + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + console.warn("[RADAR_SYNC] Scheduler init failed (non-fatal):", msg); + return false; + } +} diff --git a/src/lib/radar/sync.ts b/src/lib/radar/sync.ts new file mode 100644 index 0000000000..863f624ac3 --- /dev/null +++ b/src/lib/radar/sync.ts @@ -0,0 +1,310 @@ +/** + * sync.ts — Radar feed sync: download, verify, validate, cache. + * + * This is the ONLY module that touches the network for Radar. + * Every step is gated: flag off / opt-out / bad sig / bad schema / + * stale version all bail early without touching the cache. + * + * Errors never escape `syncRadar()` — always return a status object. + * Stack traces are never included in the `reason` field. + * + * Deps are injectable for testing. + */ + +import { RadarFeedSchema, RadarTierSchema, type RadarFeed, type RadarTier } from "./feedSchema"; +import { verifyFeedBytes } from "./verify"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; +import { isFeatureFlagEnabled } from "@/shared/utils/featureFlags"; + +// --------------------------------------------------------------------------- +// Constants +// --------------------------------------------------------------------------- + +/** + * Default feed base URL. Forks and self-hosters point this at their own + * signed feed with the `RADAR_FEED_URL` env var (see docs/frameworks/RADAR.md). + */ +const DEFAULT_FEED_BASE_URL = "https://radar.omniroute.online"; + +const SYNC_TIMEOUT_MS = 30_000; + +/** + * Hard cap on the Radar feed response body. The signed feed is a small JSON + * document (KB-scale) — anything past this is either a misconfigured/hostile + * `RADAR_FEED_URL` or an upstream serving garbage. Enforced both via a + * `Content-Length` preflight (skip reading the body entirely when the + * server already declares an oversized payload) AND a running-total check + * while reading the body (an absent/lying Content-Length must not bypass + * the cap). + */ +const MAX_FEED_BYTES = 10 * 1024 * 1024; // 10 MB + +// --------------------------------------------------------------------------- +// Types +// --------------------------------------------------------------------------- + +export type SyncStatus = + | { status: "disabled" } + | { status: "opt_out" } + | { status: "invalid_signature" } + | { status: "invalid_schema" } + | { status: "stale" } + | { status: "too_large" } + | { status: "updated"; version: string; tier: string } + | { status: "error"; reason: string }; + +export interface RadarCacheEntry { + version: string; + tier: string; + payload: string; + signature: string; + fetchedAt?: string; +} + +export interface RadarSettingsSnapshot { + optIn: boolean; + supporterKey: string | null; +} + +export interface SyncDeps { + fetch?: typeof globalThis.fetch; + now?: () => Date; + getFlag?: (key: string) => boolean; + getSettings?: () => RadarSettingsSnapshot; + getCache?: () => RadarCacheEntry | null; + setCache?: (entry: RadarCacheEntry) => void; +} + +// --------------------------------------------------------------------------- +// Served-tier header +// --------------------------------------------------------------------------- + +/** + * Parse & validate the `x-omniroute-feed-tier` response header. + * + * This header is the AUTHORITATIVE source for which tier was actually + * served to this caller — the server decides per-request based on the + * `Authorization` key, and an invalid/expired key degrades to + * `"community"`. The signed body's `tier` field is always `"live"` by + * design (see `feedSchema.ts`) and must never be shown to the user. + * + * Returns `null` when the header is absent, or holds a value that is not + * exactly `"community"` or `"live"` — an arbitrary/garbage header string + * is never trusted into the UI/DB; callers must fall back to the body's + * `tier` field in that case (also covers older servers that predate this + * header). + */ +function parseServedTierHeader(value: string | null): RadarTier | null { + const result = RadarTierSchema.safeParse(value); + return result.success ? result.data : null; +} + +// --------------------------------------------------------------------------- +// Version comparison +// --------------------------------------------------------------------------- + +/** + * Compare two `YYYY.MM.DD.n` version strings numerically. + * + * @returns negative if a < b, 0 if equal, positive if a > b. + */ +export function compareVersions(a: string, b: string): number { + const pa = a.split(".").map(Number); + const pb = b.split(".").map(Number); + const len = Math.max(pa.length, pb.length); + + for (let i = 0; i < len; i++) { + const na = pa[i] ?? 0; + const nb = pb[i] ?? 0; + if (na !== nb) return na - nb; + } + return 0; +} + +// --------------------------------------------------------------------------- +// Scheduling helper (exported for UI/route wiring later) +// --------------------------------------------------------------------------- + +/** + * Compute the next sync time given the last successful sync timestamp. + * Returns a Date that is ~24h after `lastSyncAt`. If `lastSyncAt` is + * null, sync should happen immediately. + */ +export function nextSyncTime(lastSyncAt: string | null): Date { + if (!lastSyncAt) return new Date(0); // epoch = "sync now" + const last = new Date(lastSyncAt); + return new Date(last.getTime() + 24 * 60 * 60 * 1000); +} + +// --------------------------------------------------------------------------- +// syncRadar +// --------------------------------------------------------------------------- + +/** + * Download, verify, validate, and cache the Radar feed. + * + * Steps: + * 1. Feature flag off => `{status:"disabled"}`, no network. + * 2. Opt-in false => `{status:"opt_out"}`, no network. + * 3. GET feed with timeout. + * 4. Verify Ed25519 signature over exact bytes. + * 5. Parse+validate with RadarFeedSchema. + * 6. Version floor: incoming must be strictly newer than cache. + * 7. Cache the result. + * + * @param deps - Injectable dependencies for testing. + */ +export async function syncRadar(deps: SyncDeps = {}): Promise { + const { + fetch: fetchFn = globalThis.fetch, + now = () => new Date(), + getFlag = isFeatureFlagEnabled, + getSettings: getSettingsFn, + getCache: getCacheFn, + setCache: setCacheFn, + } = deps; + + try { + // Step 1: Feature flag gate + const flagOn = getFlag("RADAR_ENABLED"); + if (!flagOn) { + return { status: "disabled" }; + } + + // Step 2: Opt-in gate + let settings: RadarSettingsSnapshot; + if (getSettingsFn) { + settings = getSettingsFn(); + } else { + const mod = await import("@/lib/db/radar"); + settings = mod.getRadarSettings(); + } + if (!settings.optIn) { + return { status: "opt_out" }; + } + + // Step 3: Download feed + const baseUrl = (process.env.RADAR_FEED_URL || DEFAULT_FEED_BASE_URL).replace(/\/+$/, ""); + const url = `${baseUrl}/v1/catalog/latest`; + + const headers: Record = {}; + if (settings.supporterKey) { + headers["Authorization"] = `Bearer ${settings.supporterKey}`; + } + + const res = await fetchFn(url, { + headers, + signal: AbortSignal.timeout(SYNC_TIMEOUT_MS), + }); + + if (!res.ok) { + return { status: "error", reason: `Feed request failed with status ${res.status}` }; + } + + // Step 3b: Content-Length preflight — skip reading an already-oversized + // body entirely. The header is untrusted (may be absent or wrong), so + // this is a fast-path only; the real enforcement is the running-total + // check below. + const contentLengthHeader = res.headers.get("content-length"); + if (contentLengthHeader !== null) { + const declaredLength = Number(contentLengthHeader); + if (Number.isFinite(declaredLength) && declaredLength > MAX_FEED_BYTES) { + return { status: "too_large" }; + } + } + + // Step 4: Read exact bytes + signature header, enforcing MAX_FEED_BYTES + // while reading so an absent/lying Content-Length cannot bypass the cap. + // Concatenating the accumulated chunks preserves the exact bytes needed + // for signature verification below. + let rawBytes: Buffer; + const body = res.body as ReadableStream | null | undefined; + if (body && typeof body.getReader === "function") { + const reader = body.getReader(); + const chunks: Uint8Array[] = []; + let total = 0; + let tooLarge = false; + for (;;) { + const { done, value } = await reader.read(); + if (done) break; + if (value) { + total += value.byteLength; + if (total > MAX_FEED_BYTES) { + tooLarge = true; + await reader.cancel().catch(() => {}); + break; + } + chunks.push(value); + } + } + if (tooLarge) { + return { status: "too_large" }; + } + rawBytes = Buffer.concat(chunks.map((chunk) => Buffer.from(chunk))); + } else { + const buffered = Buffer.from(await res.arrayBuffer()); + if (buffered.byteLength > MAX_FEED_BYTES) { + return { status: "too_large" }; + } + rawBytes = buffered; + } + + const signature = res.headers.get("x-omniroute-feed-signature") ?? ""; + + // Step 5: Verify signature + const sigValid = verifyFeedBytes(rawBytes, signature); + if (!sigValid) { + return { status: "invalid_signature" }; + } + + // Step 6: Parse + validate + let feed: RadarFeed; + try { + const parsed = JSON.parse(rawBytes.toString("utf-8")); + feed = RadarFeedSchema.parse(parsed); + } catch { + return { status: "invalid_schema" }; + } + + // Step 7: Version floor + let existingCache: RadarCacheEntry | null = null; + if (getCacheFn) { + existingCache = getCacheFn(); + } else { + const mod = await import("@/lib/db/radar"); + existingCache = mod.getRadarCache(); + } + + if (existingCache && compareVersions(feed.version, existingCache.version) <= 0) { + return { status: "stale" }; + } + + // Step 8: Resolve the served tier. + // The `x-omniroute-feed-tier` header reflects the tier ACTUALLY served + // (see `parseServedTierHeader`); fall back to the signed body's `tier` + // field only when the header is absent or unrecognized — never trust an + // arbitrary header value into the cache/UI. + const servedTier = parseServedTierHeader(res.headers.get("x-omniroute-feed-tier")) ?? feed.tier; + + // Step 9: Cache the result + const cacheEntry: RadarCacheEntry = { + version: feed.version, + tier: servedTier, + payload: rawBytes.toString("utf-8"), + signature, + fetchedAt: now().toISOString(), + }; + + if (setCacheFn) { + setCacheFn(cacheEntry); + } else { + const mod = await import("@/lib/db/radar"); + mod.setRadarCache(cacheEntry); + } + + return { status: "updated", version: feed.version, tier: servedTier }; + } catch (err: unknown) { + const reason = sanitizeErrorMessage(err) || "Radar sync failed"; + return { status: "error", reason }; + } +} diff --git a/src/lib/radar/verify.ts b/src/lib/radar/verify.ts new file mode 100644 index 0000000000..aa63120fe1 --- /dev/null +++ b/src/lib/radar/verify.ts @@ -0,0 +1,47 @@ +/** + * verify.ts — Ed25519 signature verification for Radar feed bytes. + * + * Critical invariant: verifies the EXACT bytes received over the wire. + * Never re-serializes JSON before verifying. + * + * Returns `false` on any error (malformed input, bad key, bad sig) — + * never throws. + */ + +import crypto from "node:crypto"; +import { getFeedPublicKeys, toPublicKey } from "./pinnedKeys"; + +/** + * Verify that `signatureB64` is a valid Ed25519 signature over `bytes` + * using at least one of the active feed public keys. + * + * @returns `true` if ANY key verifies the signature; `false` otherwise. + */ +export function verifyFeedBytes(bytes: Buffer, signatureB64: string): boolean { + if (!bytes || bytes.length === 0) return false; + if (!signatureB64 || signatureB64.trim().length === 0) return false; + + let sigBytes: Buffer; + try { + sigBytes = Buffer.from(signatureB64, "base64"); + if (sigBytes.length === 0) return false; + } catch { + return false; + } + + const keys = getFeedPublicKeys(); + + for (const keyB64 of keys) { + const keyObj = toPublicKey(keyB64); + if (!keyObj) continue; + + try { + const valid = crypto.verify(null, bytes, keyObj, sigBytes); + if (valid) return true; + } catch { + // malformed key/sig — try next + } + } + + return false; +} diff --git a/src/lib/search/executeWebSearch.ts b/src/lib/search/executeWebSearch.ts index 2cf065dc0e..633d3036fa 100644 --- a/src/lib/search/executeWebSearch.ts +++ b/src/lib/search/executeWebSearch.ts @@ -249,6 +249,8 @@ export async function executeWebSearch( alternateProvider: alternateProviderId, alternateCredentials, log, + connectionId: credentials?.connectionId || undefined, + apiKeyId: input.apiKeyId || undefined, }); if (!result.success || !result.data) { diff --git a/src/lib/services/ServiceSupervisor.ts b/src/lib/services/ServiceSupervisor.ts index 2924f96675..16555f5c75 100644 --- a/src/lib/services/ServiceSupervisor.ts +++ b/src/lib/services/ServiceSupervisor.ts @@ -22,7 +22,13 @@ const CRASH_FAST_THRESHOLD_MS = 5_000; export function buildServiceSpawnOptions( env: NodeJS.ProcessEnv | undefined, cwd: string | undefined -): { env: NodeJS.ProcessEnv | undefined; cwd: string | undefined; detached: boolean; stdio: ["ignore", "pipe", "pipe"]; windowsHide: boolean } { +): { + env: NodeJS.ProcessEnv | undefined; + cwd: string | undefined; + detached: boolean; + stdio: ["ignore", "pipe", "pipe"]; + windowsHide: boolean; +} { return { env, cwd, @@ -39,6 +45,7 @@ export class ServiceSupervisor extends EventEmitter { private startedAt: string | null = null; private lastError: string | null = null; private childProcess: ChildProcess | null = null; + private adopted: boolean = false; private readonly buffer: RingBuffer; private readonly checker: HealthChecker; private operationLock: Promise = Promise.resolve(); @@ -65,6 +72,7 @@ export class ServiceSupervisor extends EventEmitter { health: this.health, startedAt: this.startedAt, lastError: this.lastError, + adopted: this.adopted, }; } @@ -81,6 +89,7 @@ export class ServiceSupervisor extends EventEmitter { this.setState("starting"); this.lastError = null; + this.adopted = false; // Pre-spawn probe (#6205): avoid a raw EADDRINUSE crash when a prior // instance is still holding the port. A healthy instance is adopted; a @@ -91,23 +100,32 @@ export class ServiceSupervisor extends EventEmitter { const decision = decidePreSpawn(probe, this.config.port); if (decision.action === "adopt") { - // Something healthy already serves this port — treat it as running - // rather than spawning a duplicate that would die with EADDRINUSE. - // We didn't spawn it, so there's no ChildProcess handle to read a - // pid from — resolve one from the OS instead. Best-effort: if - // resolution fails, pid stays null rather than blocking adoption, - // but downstream liveness checks that key off pid will only trust - // this instance once a real pid is on record. + // Something healthy already serves this port. We didn't spawn it, + // so there's no ChildProcess handle to read a pid from — resolve + // one from the OS instead. Best-effort: if resolution fails, pid + // stays null rather than blocking adoption, but downstream + // liveness checks that key off pid will only trust this instance + // once a real pid is on record. const adoptedPid = await resolvePortPid(this.config.port); - this.checker.start(); - this.startedAt = new Date().toISOString(); - this.pid = adoptedPid; - this.setState("running"); - await setToolStatus(this.config.tool, "running", adoptedPid ?? undefined); - return this.getStatus(); - } - if (decision.action === "error") { + // Auto-restart-adopted (opt-in, default off): instead of keeping + // the unsupervised process, kill it and fall through to a real + // spawn below so this supervisor actually owns the child and can + // capture its stdout/stderr for the Logs panel. An adopted process + // otherwise stays log-silent for its entire lifetime — adoption + // never attaches a pipe because there's nothing to pipe from. + if (row?.autoRestartAdopted && adoptedPid) { + await this.killAdoptedPid(adoptedPid, this.config.stopTimeoutMs); + } else { + this.checker.start(); + this.startedAt = new Date().toISOString(); + this.pid = adoptedPid; + this.adopted = true; + this.setState("running"); + await setToolStatus(this.config.tool, "running", adoptedPid ?? undefined); + return this.getStatus(); + } + } else if (decision.action === "error") { this.lastError = sanitizeErrorMessage(decision.message); this.setState("error"); await setToolStatus(this.config.tool, "error", undefined, this.lastError); @@ -170,6 +188,7 @@ export class ServiceSupervisor extends EventEmitter { this.pid = null; this.childProcess = null; this.startedAt = null; + this.adopted = false; this.setState("stopped"); await setToolStatus(this.config.tool, "stopped"); @@ -238,6 +257,38 @@ export class ServiceSupervisor extends EventEmitter { }); } + /** + * Kill a process this supervisor did NOT spawn (no ChildProcess handle — + * just a pid resolved from the OS during adoption). Used by the + * auto-restart-adopted path: SIGTERM, poll for exit via the harmless + * signal-0 existence probe, escalate to SIGKILL after `timeoutMs`. Mirrors + * `killChild()`'s SIGTERM→SIGKILL escalation but without a `child.once("exit")` + * event to await, since we don't own the process handle. + */ + private async killAdoptedPid(pid: number, timeoutMs: number): Promise { + try { + process.kill(pid, "SIGTERM"); + } catch { + return; // already gone + } + + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + process.kill(pid, 0); // signal 0: existence probe, throws once the process is gone + } catch { + return; + } + await new Promise((r) => setTimeout(r, 200)); + } + + try { + process.kill(pid, "SIGKILL"); + } catch { + // already gone + } + } + private async handleExit( code: number | null, signal: NodeJS.Signals | null, diff --git a/src/lib/services/apiKey.ts b/src/lib/services/apiKey.ts index 2d58ce1bcb..144cfd290e 100644 --- a/src/lib/services/apiKey.ts +++ b/src/lib/services/apiKey.ts @@ -28,7 +28,10 @@ export async function getOrCreateApiKey(tool: string): Promise { // operator-facing signal. throw new ServiceApiKeyDecryptError(tool); } - const prefix = tool === "9router" ? "nr" : tool === "mux" ? "mx" : "cp"; + // Dario reuses this mechanism to generate+persist its DARIO_ADMIN_TOKEN + // (any long random string works — it gates the /admin/* control plane). + const prefix = + tool === "9router" ? "nr" : tool === "mux" ? "mx" : tool === "dario" ? "da" : "cp"; const key = generateServiceApiKey(prefix); await updateServiceField(tool, "apiKey", encrypt(key) ?? key); return key; diff --git a/src/lib/services/bootstrap.ts b/src/lib/services/bootstrap.ts index 3b776aa8b7..bcf1f69c1b 100644 --- a/src/lib/services/bootstrap.ts +++ b/src/lib/services/bootstrap.ts @@ -12,6 +12,7 @@ import { resolveSpawnArgs as bifrostSpawnArgs, BIFROST_DEFAULT_PORT, } from "./installers/bifrost"; +import { resolveSpawnArgs as darioSpawnArgs, DARIO_DEFAULT_PORT } from "./installers/dario"; import { getOrCreateApiKey } from "./apiKey"; import { scheduleServiceModelSync, stopServiceModelSync } from "./modelSync"; import type { ServiceStatus } from "./types"; @@ -33,6 +34,7 @@ const NINEROUTER_PORT = parseInt( const CLIPROXY_PORT = parseInt(process.env.CLIPROXYAPI_PORT ?? String(CLIPROXY_DEFAULT_PORT), 10); const MUX_PORT = parseInt(process.env.MUX_SERVICE_PORT ?? String(MUX_DEFAULT_PORT), 10); const BIFROST_PORT = parseInt(process.env.BIFROST_PORT ?? String(BIFROST_DEFAULT_PORT), 10); +const DARIO_PORT = parseInt(process.env.DARIO_PORT ?? String(DARIO_DEFAULT_PORT), 10); type ServiceEntry = { tool: string; @@ -81,6 +83,20 @@ const SERVICES: ServiceEntry[] = [ logsBufferBytes: 5_242_880, needsApiKey: false, }, + { + // Dario (@askalf/dario): Claude-subscription proxy, alternative/failover to + // CLIProxyAPI for Claude-Code-shaped traffic. needsApiKey=true → the + // generated key becomes DARIO_ADMIN_TOKEN (gates the /admin/* OAuth control + // plane). /health is 503 "degraded" until the first Claude account is added, + // which is the expected pre-OAuth state (waitForHealthy tolerates it). + tool: "dario", + port: DARIO_PORT, + healthPath: "/health", + healthIntervalMs: 5_000, + stopTimeoutMs: 15_000, + logsBufferBytes: 5_242_880, + needsApiKey: true, + }, ]; function buildSpawnArgsFactory( @@ -96,6 +112,9 @@ function buildSpawnArgsFactory( if (cfg.tool === "bifrost") { return () => bifrostSpawnArgs(cfg.port); } + if (cfg.tool === "dario") { + return () => darioSpawnArgs(apiKey, cfg.port); + } return () => cliproxySpawnArgs(cfg.port); } diff --git a/src/lib/services/installers/dario.ts b/src/lib/services/installers/dario.ts new file mode 100644 index 0000000000..65cd74d622 --- /dev/null +++ b/src/lib/services/installers/dario.ts @@ -0,0 +1,232 @@ +/** + * Dario (@askalf/dario) installer adapter for the ServiceSupervisor framework. + * + * Dario (https://github.com/askalf/dario) is a local, OpenAI- and + * Anthropic-compatible proxy that authenticates with the operator's own + * Claude Pro/Max subscription (Claude Code OAuth) and rebuilds every request + * into Claude Code's exact wire shape so traffic bills to the subscription + * pool rather than per-token API rates. It fills the same role for the + * `claude` provider that CLIProxyAPI's "claude-native" deep-proxy mode does — + * but Dario is npm-published (`@askalf/dario`, `"bin": {"dario":"./dist/cli.js"}`), + * so it is installed like Mux/Bifrost/9Router — `npm install` into a + * DATA_DIR-scoped directory via `runNpm` (Hard Rule #13: no shell + * interpolation, array args + `env` option only) — NOT via the GitHub-release + * binary-download machinery CLIProxyAPI uses. + * + * Binary location: $DATA_DIR/services/dario/node_modules/@askalf/dario/dist/cli.js + * State dir: $DATA_DIR/services/dario/home/.dario (see HOME redirect below) + * DB row: version_manager WHERE tool = 'dario' + */ + +import fs from "node:fs"; +import path from "node:path"; +import { DATA_DIR } from "@/lib/db/core"; +import { upsertVersionManagerTool } from "@/lib/db/versionManager"; +import { runNpm, InstallError } from "./utils"; + +export const DARIO_PACKAGE = "@askalf/dario"; +export const DARIO_DEFAULT_PORT = 3456; +export const DARIO_INSTALL_DIR = path.join(DATA_DIR, "services", "dario"); + +export interface InstallResult { + installedVersion: string; + installPath: string; + durationMs: number; +} + +export interface SpawnArgs { + command: string; + args: string[]; + env: NodeJS.ProcessEnv; + cwd: string; +} + +// In-memory latest-version cache, 1h TTL — mirrors mux.ts / bifrost.ts. +let latestVersionCache: { value: string; expiresAt: number } | null = null; +const VERSION_CACHE_TTL_MS = 3_600_000; + +// Resolve the install dir lazily from the *current* DATA_DIR so a runtime +// DATA_DIR override (operator env change, or a test's tmp-dir isolation) is +// honored — the module-level DARIO_INSTALL_DIR const is frozen at import +// (same reasoning as getBifrostInstallDir in bifrost.ts). +function getDarioInstallDir(): string { + return process.env.DATA_DIR + ? path.join(process.env.DATA_DIR, "services", "dario") + : DARIO_INSTALL_DIR; +} + +// Dario is a scoped package: @askalf/dario → node_modules/@askalf/dario/… +function getCliPath(): string { + return path.join(getDarioInstallDir(), "node_modules", "@askalf", "dario", "dist", "cli.js"); +} + +function getInstalledPkgPath(): string { + return path.join(getDarioInstallDir(), "node_modules", "@askalf", "dario", "package.json"); +} + +/** + * Dario has no env var to relocate its state directory: `dist/accounts.js` + * hardcodes `const DARIO_DIR = join(homedir(), '.dario')`. The only lever is + * `homedir()` itself, which Node resolves from `HOME` on POSIX and + * `USERPROFILE` on Windows. So we scope Dario's `.dario/` account+config store + * under DATA_DIR by pointing HOME/USERPROFILE at a service-owned home dir — + * keeping OAuth account files out of the real OS user's home the way MUX_ROOT + * scopes Mux and DATA_DIR scopes 9Router. See resolveSpawnArgs() below. + */ +export function getDarioHomeDir(): string { + return path.join(getDarioInstallDir(), "home"); +} + +function getInstalledVersionSync(): string | null { + try { + const raw = fs.readFileSync(getInstalledPkgPath(), "utf8"); + const parsed = JSON.parse(raw) as { version?: string }; + return typeof parsed.version === "string" ? parsed.version : null; + } catch { + return null; + } +} + +export async function getInstalledVersion(): Promise { + return getInstalledVersionSync(); +} + +export async function getLatestVersion(): Promise { + if (latestVersionCache && latestVersionCache.expiresAt > Date.now()) { + return latestVersionCache.value; + } + try { + const { stdout } = await runNpm(["view", DARIO_PACKAGE, "version"], { timeoutMs: 30_000 }); + const version = stdout.trim(); + if (version) { + latestVersionCache = { value: version, expiresAt: Date.now() + VERSION_CACHE_TTL_MS }; + } + return version || null; + } catch { + return null; + } +} + +/** + * Download and install Dario from npm. + * Upserts the version_manager row with tool='dario'. + */ +export async function install(version = "latest"): Promise { + const startMs = Date.now(); + const installDir = getDarioInstallDir(); + + // Create install dir + minimal package.json (idempotent) — same shape as mux/bifrost. + fs.mkdirSync(installDir, { recursive: true }); + const hostPkgPath = path.join(installDir, "package.json"); + if (!fs.existsSync(hostPkgPath)) { + fs.writeFileSync( + hostPkgPath, + JSON.stringify( + { name: "omniroute-dario-host", version: "0.0.0", private: true, dependencies: {} }, + null, + 2 + ), + "utf8" + ); + } + + await runNpm( + ["install", `${DARIO_PACKAGE}@${version}`, "--omit=dev", "--no-audit", "--no-fund"], + // `--prefix` is passed via `prefix` (→ npm_config_prefix env) instead of an + // argv path so an install dir with spaces survives the Windows shell (#5379). + { cwd: installDir, prefix: installDir } + ); + + const installedVersion = await getInstalledVersion(); + if (!installedVersion) { + throw new InstallError( + "Could not read installed version from node_modules/@askalf/dario/package.json", + "Dario instalado mas versão não pôde ser lida.", + 500 + ); + } + + await upsertVersionManagerTool({ + tool: "dario", + installedVersion, + binaryPath: getCliPath(), + status: "stopped", + port: DARIO_DEFAULT_PORT, + }); + + // Invalidate cache so next getLatestVersion() re-fetches + latestVersionCache = null; + + return { + installedVersion, + installPath: installDir, + durationMs: Date.now() - startMs, + }; +} + +export async function update(): Promise { + return install("latest"); +} + +/** + * Build spawn args for ServiceSupervisor.start(). + * + * Dario binds to 127.0.0.1 explicitly (never 0.0.0.0) — defense-in-depth + * matching mux.ts / bifrost.ts, and because Dario adds/removes real Claude + * OAuth credentials over its admin API. `apiKey` becomes DARIO_ADMIN_TOKEN: + * with DARIO_ADMIN=1 the proxy mounts its `/admin/*` control plane (headless + * OAuth login-start/complete, account list/remove), and every admin call must + * carry `Authorization: Bearer ` even on loopback. The + * token is passed via env (Dario's documented form), never as a CLI arg, so it + * never appears in `ps`/process listings. + * + * Before any account is configured Dario still starts fine — LLM routes 503 + * with `{"error":"No account configured"}` and /health returns 503 "degraded" + * until the first account lands. That is the expected pre-OAuth state, not a + * startup failure (ServiceSupervisor.waitForHealthy tolerates it). + */ +export function resolveSpawnArgs(apiKey: string, port: number): SpawnArgs { + const cliPath = getCliPath(); + const installDir = getDarioInstallDir(); + + // Scope Dario's `~/.dario` state under DATA_DIR by redirecting the home dir + // (Dario hardcodes join(homedir(),'.dario') with no env override — see + // getDarioHomeDir()). Create it up front so the child never falls back to a + // real home path if the redirect var is somehow dropped. + const darioHome = getDarioHomeDir(); + fs.mkdirSync(darioHome, { recursive: true }); + + return { + command: process.execPath, + args: [cliPath, "proxy", "--host", "127.0.0.1", "--port", String(port)], + env: { + ...process.env, + NODE_ENV: "production", + // Home redirect → Dario's ~/.dario lands under DATA_DIR/services/dario/home. + HOME: darioHome, + USERPROFILE: darioHome, + // Loopback bind (redundant with the CLI flags above; belt-and-braces). + DARIO_HOST: "127.0.0.1", + DARIO_PORT: String(port), + // Headless admin control plane (OAuth login + account management). + DARIO_ADMIN: "1", + DARIO_ADMIN_TOKEN: apiKey, + // Run as a SINGLE Node process — do NOT let Dario relaunch itself under + // Bun. When Bun is present Dario re-execs the proxy as a `bun run` child + // (closer TLS fingerprint to Claude Code), but that child becomes the + // real port holder while ServiceSupervisor only tracks — and SIGTERMs — + // the Node parent. On stop the Bun child orphaned and kept binding the + // port, so the next start fast-crashed with EADDRINUSE ("already + // running"). Clean, deterministic lifecycle for a supervised embedded + // service outweighs the stealth benefit here. Tradeoff: the proxy-mode + // TLS ClientHello diverges from Claude Code's; if that ever proves to + // matter for a real account, revisit with process-group kill semantics + // in ServiceSupervisor rather than re-enabling the orphan. + DARIO_NO_BUN: "1", + // Silence the companion "Bun not installed → TLS fingerprint diverges" + // startup warning so it doesn't spam the log ring buffer every boot. + DARIO_QUIET_TLS: "1", + }, + cwd: installDir, + }; +} diff --git a/src/lib/services/types.ts b/src/lib/services/types.ts index 7e1df54598..8bcea4bc2b 100644 --- a/src/lib/services/types.ts +++ b/src/lib/services/types.ts @@ -24,12 +24,7 @@ export interface ServiceConfig { } export type ServiceState = - | "not_installed" - | "stopped" - | "starting" - | "running" - | "stopping" - | "error"; + "not_installed" | "stopped" | "starting" | "running" | "stopping" | "error"; export type HealthState = "healthy" | "unhealthy" | "unknown"; @@ -41,6 +36,15 @@ export interface ServiceStatus { health: HealthState; startedAt: string | null; lastError: string | null; + /** + * True when the currently-running process was adopted from an + * already-listening instance rather than spawned by this supervisor. An + * adopted process has no piped stdout/stderr (the supervisor never called + * `spawn()` for it), so the Logs panel stays empty until it's replaced by a + * real spawn — either manually (Stop then Start) or automatically if + * `autoRestartAdopted` is enabled for this tool. + */ + adopted: boolean; } export interface LogLine { diff --git a/src/lib/streamingPiiTransform.ts b/src/lib/streamingPiiTransform.ts index 3d9eb381fa..a26eb3fa2e 100644 --- a/src/lib/streamingPiiTransform.ts +++ b/src/lib/streamingPiiTransform.ts @@ -18,7 +18,7 @@ export function createPiiSseTransform(options?: PiiTransformOptions): TransformS toolArgs: "", partialJson: "", }; - choiceBuffers.set(index, buf); + choiceBuffers.set(key, buf); } return buf; }; diff --git a/src/lib/tokenHealthCheck.ts b/src/lib/tokenHealthCheck.ts index 6b4475dd21..ce54c2e675 100644 --- a/src/lib/tokenHealthCheck.ts +++ b/src/lib/tokenHealthCheck.ts @@ -81,14 +81,36 @@ function getCopilotTokenExpiryMs(expiresAt: unknown): number { return 0; } +// Providers whose OAuth flow yields only a GitHub-style access token (no +// refresh_token) plus a short-lived Copilot sub-token: github.com Copilot and +// GHE Copilot (device-code flow against the enterprise host) both fit this +// shape. Keep both in sync — adding a github-token-only provider elsewhere +// (e.g. new GHE-flavored Copilot variant) must also list it here. +const GITHUB_ACCESS_TOKEN_ONLY_PROVIDERS = new Set(["github", "ghe-copilot"]); + function isGitHubAccessTokenOnlyConnection(conn: any): boolean { return ( - String(conn?.provider || "").toLowerCase() === "github" && + GITHUB_ACCESS_TOKEN_ONLY_PROVIDERS.has(String(conn?.provider || "").toLowerCase()) && typeof conn?.accessToken === "string" && conn.accessToken.trim().length > 0 ); } +/** + * Resolve the Copilot token endpoint base URL for a connection. github.com + * Copilot always uses api.github.com; GHE Copilot uses its own per-enterprise + * host stored in providerSpecificData.gheUrl at connect time. + */ +function getCopilotTokenBaseUrl(conn: any): string { + if (String(conn?.provider || "").toLowerCase() === "ghe-copilot") { + const gheUrl = conn?.providerSpecificData?.gheUrl; + if (typeof gheUrl === "string" && gheUrl.trim().length > 0) { + return `${gheUrl.trim().replace(/\/+$/, "")}/api/v3`; + } + } + return "https://api.github.com"; +} + function canClearGitHubNoRefreshTokenState(conn: any): boolean { return ( !conn?.testStatus || @@ -564,7 +586,8 @@ export async function checkConnection(conn) { const copilotResult = await refreshCopilotToken( conn.accessToken, healthCheckLog, - proxyConfig + proxyConfig, + getCopilotTokenBaseUrl(conn) ); if (copilotResult?.token) { refreshedProviderSpecificData = { @@ -604,9 +627,18 @@ export async function checkConnection(conn) { }); } - log( - `${LOG_PREFIX} ${conn.provider}/${getConnectionLogLabel(conn)} has no refresh token but has a GitHub access token; keeping connection active` - ); + // Steady-state ticks stay silent: this path runs once per TICK_MS (60s) for + // EVERY github/ghe-copilot connection, so an unconditional line here emits + // ~1440 entries/day per connection all saying the same nothing-changed thing. + // Only report when the sweep actually did work — a Copilot sub-token refresh + // attempt — so a genuine refresh failure still surfaces in the log. + if (copilotAboutToExpire) { + log( + `${LOG_PREFIX} ${conn.provider}/${getConnectionLogLabel(conn)} Copilot token ${ + refreshedProviderSpecificData ? "refreshed" : "refresh FAILED" + } (no refresh token; connection stays active)` + ); + } return; } diff --git a/src/lib/usage/providerWindowCosts.ts b/src/lib/usage/providerWindowCosts.ts index c92f5dcead..bc62c65080 100644 --- a/src/lib/usage/providerWindowCosts.ts +++ b/src/lib/usage/providerWindowCosts.ts @@ -1,3 +1,11 @@ +/** + * @file providerWindowCosts.ts + * @description Provider weekly USD cost breakdown for the dashboard modal. + * + * @changes + * - [2026-07-24] [Composer] - Aggregate usage_history in SQL instead of loading all rows into JS + */ + import { getCostSummary } from "@/domain/costRules"; import { getApiKeys } from "@/lib/db/apiKeys"; import { getDbInstance } from "@/lib/db/core"; @@ -10,6 +18,27 @@ const RECORDED_COST_MATCH_TOLERANCE_MS = 30_000; type JsonRecord = Record; +interface UsageHistoryFilter { + whereSql: string; + params: Record; +} + +interface AggregatedUsageCostRow { + apiKeyId: string | null; + apiKeyName: string | null; + provider: string; + model: string; + serviceTier: string; + requests: number; + promptTokens: number; + completionTokens: number; + cacheReadTokens: number; + cacheCreationTokens: number; + reasoningTokens: number; + totalTokens: number; + lastUsed: string | null; +} + interface UsageCostRow { id: number; apiKeyId: string | null; @@ -26,6 +55,11 @@ interface UsageCostRow { timestamp: string | null; } +interface RecordedCostSummary { + totalCost: number; + entryCount: number; +} + interface RecordedCostRow { rowId: number; apiKeyId: string; @@ -264,7 +298,7 @@ async function getCurrentApiKeyNames(): Promise> { return names; } -function uniqueApiKeyIds(rows: UsageCostRow[]): string[] { +function uniqueApiKeyIds(rows: Array<{ apiKeyId: string | null }>): string[] { return Array.from( new Set( rows @@ -274,6 +308,162 @@ function uniqueApiKeyIds(rows: UsageCostRow[]): string[] { ); } +function buildUsageHistoryFilter( + providerKey: string, + windowStartAt: string, + nowIso: string, + windowResetAt: string | null, + connectionId: string | null +): UsageHistoryFilter { + const where = [ + "LOWER(provider) = @provider", + "timestamp >= @since", + "timestamp <= @nowIso", + "COALESCE(success, 1) = 1", + ]; + const params: Record = { + provider: providerKey, + since: windowStartAt, + nowIso, + }; + if (windowResetAt) { + where.push("timestamp < @resetAt"); + params.resetAt = windowResetAt; + } + if (connectionId) { + where.push("connection_id = @connectionId"); + params.connectionId = connectionId; + } + return { whereSql: where.join(" AND "), params }; +} + +function fetchAggregatedUsageRows(filter: UsageHistoryFilter): AggregatedUsageCostRow[] { + return getDbInstance() + .prepare( + ` + SELECT + NULLIF(api_key_id, '') as apiKeyId, + NULLIF(api_key_name, '') as apiKeyName, + LOWER(provider) as provider, + LOWER(model) as model, + COALESCE(NULLIF(service_tier, ''), 'standard') as serviceTier, + COUNT(*) as requests, + COALESCE(SUM(tokens_input), 0) as promptTokens, + COALESCE(SUM(tokens_output), 0) as completionTokens, + COALESCE(SUM(tokens_cache_read), 0) as cacheReadTokens, + COALESCE(SUM(tokens_cache_creation), 0) as cacheCreationTokens, + COALESCE(SUM(tokens_reasoning), 0) as reasoningTokens, + COALESCE(SUM(tokens_input + tokens_output), 0) as totalTokens, + MAX(timestamp) as lastUsed + FROM usage_history + WHERE ${filter.whereSql} + GROUP BY + COALESCE(NULLIF(api_key_id, ''), ''), + COALESCE(NULLIF(api_key_name, ''), ''), + LOWER(provider), + LOWER(model), + COALESCE(NULLIF(service_tier, ''), 'standard') + ORDER BY totalTokens DESC + ` + ) + .all(filter.params); +} + +function fetchUsageRequestCountByApiKey(filter: UsageHistoryFilter): Map { + const rows = getDbInstance() + .prepare<{ apiKeyId: string; requestCount: number }>( + ` + SELECT + COALESCE(NULLIF(api_key_id, ''), '') as apiKeyId, + COUNT(*) as requestCount + FROM usage_history + WHERE ${filter.whereSql} + GROUP BY COALESCE(NULLIF(api_key_id, ''), '') + ` + ) + .all(filter.params); + + const counts = new Map(); + for (const row of rows) { + if (!row.apiKeyId) continue; + counts.set(row.apiKeyId, toNumber(row.requestCount)); + } + return counts; +} + +function fetchDetailedUsageRowsForApiKey( + filter: UsageHistoryFilter, + apiKeyId: string +): UsageCostRow[] { + return getDbInstance() + .prepare( + ` + SELECT + id, + NULLIF(api_key_id, '') as apiKeyId, + NULLIF(api_key_name, '') as apiKeyName, + LOWER(provider) as provider, + LOWER(model) as model, + COALESCE(NULLIF(service_tier, ''), 'standard') as serviceTier, + COALESCE(tokens_input, 0) as promptTokens, + COALESCE(tokens_output, 0) as completionTokens, + COALESCE(tokens_cache_read, 0) as cacheReadTokens, + COALESCE(tokens_cache_creation, 0) as cacheCreationTokens, + COALESCE(tokens_reasoning, 0) as reasoningTokens, + COALESCE(tokens_input + tokens_output, 0) as totalTokens, + timestamp + FROM usage_history + WHERE ${filter.whereSql} + AND api_key_id = @apiKeyId + ORDER BY timestamp ASC, id ASC + ` + ) + .all({ ...filter.params, apiKeyId }); +} + +function getRecordedCostSummariesByApiKey( + apiKeyIds: string[], + sinceMs: number, + untilMs: number +): Map { + if (apiKeyIds.length === 0) return new Map(); + + try { + const params: Record = { + sinceMs: Math.max(0, sinceMs - RECORDED_COST_MATCH_TOLERANCE_MS), + untilMs: untilMs + RECORDED_COST_MATCH_TOLERANCE_MS, + }; + const placeholders = appendNamedPlaceholders(params, "apiKey", apiKeyIds); + const rows = getDbInstance() + .prepare<{ apiKeyId: string; totalCost: number; entryCount: number }>( + ` + SELECT + api_key_id as apiKeyId, + COALESCE(SUM(cost), 0) as totalCost, + COUNT(*) as entryCount + FROM domain_cost_history + WHERE api_key_id IN (${placeholders}) + AND timestamp >= @sinceMs + AND timestamp <= @untilMs + GROUP BY api_key_id + ` + ) + .all(params); + + const summaries = new Map(); + for (const row of rows) { + if (!row.apiKeyId) continue; + summaries.set(row.apiKeyId, { + totalCost: Math.max(0, toNumber(row.totalCost)), + entryCount: toNumber(row.entryCount), + }); + } + return summaries; + } catch { + return new Map(); + } +} + function appendNamedPlaceholders( params: Record, prefix: string, @@ -387,6 +577,75 @@ async function getUsageRowCostUsd( ); } +async function getAggregatedGroupCostUsd(row: AggregatedUsageCostRow): Promise { + return roundUsd( + await calculateCost( + row.provider, + row.model, + { + input: toNumber(row.promptTokens), + output: toNumber(row.completionTokens), + cacheRead: toNumber(row.cacheReadTokens), + cacheCreation: toNumber(row.cacheCreationTokens), + reasoning: toNumber(row.reasoningTokens), + }, + { serviceTier: row.serviceTier } + ) + ); +} + +function distributeRecordedCostAcrossGroups( + groups: AggregatedUsageCostRow[], + recordedTotalUsd: number, + groupCalculatedCosts: number[] +): number[] { + const calculatedTotal = groupCalculatedCosts.reduce((sum, value) => sum + value, 0); + if (calculatedTotal <= 0) { + const evenShare = recordedTotalUsd / Math.max(groups.length, 1); + return groups.map(() => roundUsd(evenShare)); + } + return groupCalculatedCosts.map((value) => + roundUsd((recordedTotalUsd * value) / calculatedTotal) + ); +} + +async function buildApiKeyCostAllocations(args: { + groups: AggregatedUsageCostRow[]; + filter: UsageHistoryFilter; + usageRequestCount: number; + recordedSummary: RecordedCostSummary | undefined; + recordedCostsByApiKey: Map; + usedRecordedRows: Set; +}): Promise { + const calculatedCosts = await Promise.all( + args.groups.map((group) => getAggregatedGroupCostUsd(group)) + ); + + if (!args.recordedSummary || args.recordedSummary.entryCount <= 0) { + return calculatedCosts; + } + + if (args.recordedSummary.entryCount === args.usageRequestCount) { + return distributeRecordedCostAcrossGroups( + args.groups, + args.recordedSummary.totalCost, + calculatedCosts + ); + } + + const apiKeyId = args.groups[0]?.apiKeyId; + if (!apiKeyId) return calculatedCosts; + + const detailedRows = fetchDetailedUsageRowsForApiKey(args.filter, apiKeyId); + const rowCosts = await Promise.all( + detailedRows.map((row) => + getUsageRowCostUsd(row, args.recordedCostsByApiKey, args.usedRecordedRows) + ) + ); + const detailedTotal = roundUsd(rowCosts.reduce((sum, value) => sum + value, 0)); + return distributeRecordedCostAcrossGroups(args.groups, detailedTotal, calculatedCosts); +} + export async function getProviderWindowCostBreakdown({ provider, connectionId = null, @@ -402,130 +661,112 @@ export async function getProviderWindowCostBreakdown({ const windowStartAt = new Date(window.startMs).toISOString(); const windowResetAt = window.resetMs ? new Date(window.resetMs).toISOString() : null; const nowIso = new Date(nowMs).toISOString(); - - const where = [ - "LOWER(provider) = @provider", - "timestamp >= @since", - "timestamp <= @nowIso", - "COALESCE(success, 1) = 1", - ]; - const params: Record = { - provider: providerKey, - since: windowStartAt, + const filter = buildUsageHistoryFilter( + providerKey, + windowStartAt, nowIso, - }; - if (windowResetAt) { - where.push("timestamp < @resetAt"); - params.resetAt = windowResetAt; - } - if (connectionId) { - where.push("connection_id = @connectionId"); - params.connectionId = connectionId; - } - - const usageRows = getDbInstance() - .prepare( - ` - SELECT - id, - NULLIF(api_key_id, '') as apiKeyId, - NULLIF(api_key_name, '') as apiKeyName, - LOWER(provider) as provider, - LOWER(model) as model, - COALESCE(NULLIF(service_tier, ''), 'standard') as serviceTier, - COALESCE(tokens_input, 0) as promptTokens, - COALESCE(tokens_output, 0) as completionTokens, - COALESCE(tokens_cache_read, 0) as cacheReadTokens, - COALESCE(tokens_cache_creation, 0) as cacheCreationTokens, - COALESCE(tokens_reasoning, 0) as reasoningTokens, - COALESCE(tokens_input + tokens_output, 0) as totalTokens, - timestamp - FROM usage_history - WHERE ${where.join(" AND ")} - ORDER BY timestamp ASC, id ASC - ` - ) - .all(params); - - const currentApiKeyNames = await getCurrentApiKeyNames(); - const recordedCostsByApiKey = getRecordedCostsByApiKey( - uniqueApiKeyIds(usageRows), - window.startMs, - nowMs + windowResetAt, + connectionId ); + + const aggregatedRows = fetchAggregatedUsageRows(filter); + const usageRequestCounts = fetchUsageRequestCountByApiKey(filter); + const currentApiKeyNames = await getCurrentApiKeyNames(); + const apiKeyIds = uniqueApiKeyIds(aggregatedRows); + const recordedSummaries = getRecordedCostSummariesByApiKey(apiKeyIds, window.startMs, nowMs); + const recordedCostsByApiKey = getRecordedCostsByApiKey(apiKeyIds, window.startMs, nowMs); const usedRecordedRows = new Set(); const byApiKey = new Map(); - for (const row of usageRows) { - const apiKeyId = row.apiKeyId || null; - const apiKeyName = row.apiKeyName || null; - const apiKeyKey = makeApiKeyKey(apiKeyId, apiKeyName); + const groupsByApiKey = new Map(); + for (const row of aggregatedRows) { + const apiKeyKey = makeApiKeyKey(row.apiKeyId, row.apiKeyName); + const list = groupsByApiKey.get(apiKeyKey) ?? []; + list.push(row); + groupsByApiKey.set(apiKeyKey, list); + } + + for (const [apiKeyKey, groups] of groupsByApiKey.entries()) { + const first = groups[0]; + const apiKeyId = first.apiKeyId || null; + const apiKeyName = first.apiKeyName || null; const displayName = (apiKeyId ? currentApiKeyNames.get(apiKeyId) : null) || apiKeyName || apiKeyId || "Unattributed"; - const costUsd = roundUsd( - await getUsageRowCostUsd(row, recordedCostsByApiKey, usedRecordedRows) - ); + const usageRequestCount = apiKeyId + ? (usageRequestCounts.get(apiKeyId) ?? 0) + : groups.reduce((sum, group) => sum + toNumber(group.requests), 0); + const groupCosts = await buildApiKeyCostAllocations({ + groups, + filter, + usageRequestCount, + recordedSummary: apiKeyId ? recordedSummaries.get(apiKeyId) : undefined, + recordedCostsByApiKey, + usedRecordedRows, + }); - let aggregate = byApiKey.get(apiKeyKey); - if (!aggregate) { - let limitUsd: number | null = null; - let limitPeriod: string | null = null; - let budgetResetAt: string | null = null; - if (apiKeyId) { - const summary = getCostSummary(apiKeyId); - if (summary.activeLimitUsd > 0) { - limitUsd = summary.activeLimitUsd; - limitPeriod = summary.resetInterval; - budgetResetAt = - typeof summary.nextResetAt === "number" && Number.isFinite(summary.nextResetAt) - ? new Date(summary.nextResetAt).toISOString() - : null; - } + let limitUsd: number | null = null; + let limitPeriod: string | null = null; + let budgetResetAt: string | null = null; + if (apiKeyId) { + const summary = getCostSummary(apiKeyId); + if (summary.activeLimitUsd > 0) { + limitUsd = summary.activeLimitUsd; + limitPeriod = summary.resetInterval; + budgetResetAt = + typeof summary.nextResetAt === "number" && Number.isFinite(summary.nextResetAt) + ? new Date(summary.nextResetAt).toISOString() + : null; } - aggregate = { - apiKeyKey, - apiKeyId, - apiKeyName: displayName, - requests: 0, - promptTokens: 0, - completionTokens: 0, - totalTokens: 0, - costUsd: 0, - limitUsd, - limitPeriod, - limitUsedPercent: null, - budgetResetAt, - lastUsed: null, - models: [], - modelMap: new Map(), - }; - byApiKey.set(apiKeyKey, aggregate); } - aggregate.requests += 1; - aggregate.promptTokens += toNumber(row.promptTokens); - aggregate.completionTokens += toNumber(row.completionTokens); - aggregate.totalTokens += toNumber(row.totalTokens); - aggregate.costUsd = roundUsd(aggregate.costUsd + costUsd); - if (!aggregate.lastUsed || (row.timestamp && row.timestamp > aggregate.lastUsed)) { - aggregate.lastUsed = row.timestamp || aggregate.lastUsed; - } - const modelKey = `${row.provider}\0${row.model}\0${row.serviceTier}`; - const model = aggregate.modelMap.get(modelKey) ?? { - model: row.model, - provider: row.provider, - serviceTier: row.serviceTier, + const aggregate: ProviderWindowCostAggregateRow = { + apiKeyKey, + apiKeyId, + apiKeyName: displayName, requests: 0, + promptTokens: 0, + completionTokens: 0, totalTokens: 0, costUsd: 0, + limitUsd, + limitPeriod, + limitUsedPercent: null, + budgetResetAt, + lastUsed: null, + models: [], + modelMap: new Map(), }; - model.requests += 1; - model.totalTokens += toNumber(row.totalTokens); - model.costUsd = roundUsd(model.costUsd + costUsd); - aggregate.modelMap.set(modelKey, model); + + groups.forEach((row, index) => { + const costUsd = groupCosts[index] ?? 0; + aggregate.requests += toNumber(row.requests); + aggregate.promptTokens += toNumber(row.promptTokens); + aggregate.completionTokens += toNumber(row.completionTokens); + aggregate.totalTokens += toNumber(row.totalTokens); + aggregate.costUsd = roundUsd(aggregate.costUsd + costUsd); + if (!aggregate.lastUsed || (row.lastUsed && row.lastUsed > aggregate.lastUsed)) { + aggregate.lastUsed = row.lastUsed || aggregate.lastUsed; + } + + const modelKey = `${row.provider}\0${row.model}\0${row.serviceTier}`; + const model = aggregate.modelMap.get(modelKey) ?? { + model: row.model, + provider: row.provider, + serviceTier: row.serviceTier, + requests: 0, + totalTokens: 0, + costUsd: 0, + }; + model.requests += toNumber(row.requests); + model.totalTokens += toNumber(row.totalTokens); + model.costUsd = roundUsd(model.costUsd + costUsd); + aggregate.modelMap.set(modelKey, model); + }); + + byApiKey.set(apiKeyKey, aggregate); } const breakdownRows = Array.from(byApiKey.values()) diff --git a/src/lib/usage/tokenAccounting.ts b/src/lib/usage/tokenAccounting.ts index 4131107902..932d71223a 100644 --- a/src/lib/usage/tokenAccounting.ts +++ b/src/lib/usage/tokenAccounting.ts @@ -191,6 +191,23 @@ export function getReasoningTokensOrNull(tokens: unknown): number | null { return null; } +/** + * Return non-cached (fresh) input tokens, or `null` if the provider didn't + * report any. Command Code reports this as `inputTokenDetails.noCacheTokens`. + * Informational only — the value is already included in prompt_tokens, so it + * must never be added to metering totals (see commandCode.ts usageFromCommandCode). + */ +export function getNoCacheTokens(tokens: unknown): number | null { + const tokenRecord = asRecord(tokens); + const promptDetails = getPromptTokenDetails(tokenRecord); + if (hasAnyKey(tokenRecord, ["no_cache_tokens"]) || hasAnyKey(promptDetails, ["noCacheTokens"])) { + return toFiniteNumber( + tokenRecord.no_cache_tokens ?? promptDetails.noCacheTokens ?? tokenRecord.noCacheTokens + ); + } + return null; +} + export function formatUsageLog(tokens: unknown): string { const input = getLoggedInputTokens(tokens); const output = getLoggedOutputTokens(tokens); diff --git a/src/lib/warmupScheduler.ts b/src/lib/warmupScheduler.ts new file mode 100644 index 0000000000..c0cc77fe71 --- /dev/null +++ b/src/lib/warmupScheduler.ts @@ -0,0 +1,414 @@ +import { getProviderConnections } from "@/lib/db/providers"; +import { getSettings } from "@/lib/db/settings"; +import { resolveProxyForConnection } from "@/lib/db/settings"; +import { extractResolvedProxyConfig } from "@/lib/tokenHealthCheck"; +import { refreshAndUpdateCredentials } from "@/lib/usage/providerLimits"; +import { runWithProxyContext } from "@omniroute/open-sse/utils/proxyFetch"; +import { logger } from "@omniroute/open-sse/utils/logger"; +import { matchesCron } from "@/lib/jobs/cronMatch"; +import { getCircuitBreakerStore } from "./warmupScheduler/circuitBreakerFactory"; +import { TERMINAL_CONNECTION_STATUSES } from "@/lib/quota/connectionRecovery"; +import type { WarmupResult, WarmupFailureKind, WarmupTarget } from "./warmupScheduler/core"; + +export type { WarmupResult, WarmupFailureKind } from "./warmupScheduler/core"; + +interface WarmupConnection { + id: string; + provider?: string; + authType?: string; + email?: string | null; + name?: string | null; + testStatus?: string | null; + accessToken?: string | null; + refreshToken?: string | null; + tokenExpiresAt?: string | null; + providerSpecificData?: unknown; +} + +const log = logger("WarmupScheduler"); +const WARMUP_MESSAGES = ["hi", "hello", "ping", "ready"]; +let messageCounter = 0; + +function getWarmupMessage(): string { + const msg = WARMUP_MESSAGES[messageCounter % WARMUP_MESSAGES.length]; + messageCounter++; + return msg; +} + +declare global { + var __omnirouteWarmupScheduler: { + timer: NodeJS.Timeout | null; + executing: boolean; + lastFireMinute: number; + }; +} +const STATE = (globalThis.__omnirouteWarmupScheduler ??= { + timer: null, + executing: false, + lastFireMinute: -1, +}); + +const TRUE_ENV_VALUES = new Set(["1", "true", "yes", "on"]); + +function isEnabled(): boolean { + const raw = process.env.OMNIROUTE_WARMUP_ENABLED; + return raw ? TRUE_ENV_VALUES.has(raw.trim().toLowerCase()) : false; +} + +function getCron(): string { + return process.env.OMNIROUTE_WARMUP_CRON || "0 7 * * *"; +} + +function getConcurrency(): number { + const raw = process.env.OMNIROUTE_WARMUP_CONCURRENCY; + const parsed = raw ? parseInt(raw, 10) : NaN; + return Math.min(10, Math.max(1, Number.isFinite(parsed) ? parsed : 3)); +} + +function toPacificTime(date: Date): Date { + const parts = new Intl.DateTimeFormat("en-US", { + timeZone: "America/Los_Angeles", + hour12: false, + hourCycle: "h23", + year: "numeric", + month: "numeric", + day: "numeric", + hour: "numeric", + minute: "numeric", + second: "numeric", + }).formatToParts(date); + const get = (t: string) => parseInt(parts.find((p) => p.type === t)?.value || "0", 10); + return new Date( + get("year"), + get("month") - 1, + get("day"), + get("hour"), + get("minute"), + get("second") + ); +} + +export function startWarmupScheduler(): NodeJS.Timeout | null { + if (STATE.timer) return STATE.timer; + if (!isEnabled()) { + log.info("disabled (OMNIROUTE_WARMUP_ENABLED not set)"); + return null; + } + const cron = getCron(); + log.info("scheduler started", { cron, concurrency: getConcurrency() }); + STATE.timer = setInterval(tick, 60_000); + STATE.timer.unref(); + tick(); + return STATE.timer; +} + +export function stopWarmupScheduler(): void { + if (STATE.timer) { + clearInterval(STATE.timer); + STATE.timer = null; + } + STATE.executing = false; + STATE.lastFireMinute = -1; +} + +/** Test-only: reset the globalThis singleton so each test starts fresh. */ +export function __resetWarmupState(): void { + if (STATE.timer) { + clearInterval(STATE.timer); + } + STATE.timer = null; + STATE.executing = false; + STATE.lastFireMinute = -1; +} + +async function tick(): Promise { + if (STATE.executing) return; + const now = new Date(); + const ptNow = toPacificTime(now); + if (!matchesCron(getCron(), ptNow)) { + STATE.lastFireMinute = -1; + return; + } + const minuteKey = Math.floor(ptNow.getTime() / 60_000); + if (minuteKey === STATE.lastFireMinute) return; + STATE.lastFireMinute = minuteKey; + STATE.executing = true; + try { + await executeWarmup(); + } catch (err) { + log.error("tick failed", { err }); + } finally { + STATE.executing = false; + } +} + +async function executeWarmup(): Promise { + const settings = await getSettings(); + const enabledMap = (settings?.claudeWarmup as Record | undefined)?.connections; + const connections = (await getProviderConnections({ + provider: "claude", + isActive: true, + })) as unknown as WarmupConnection[]; + const concurrency = getConcurrency(); + const cbStore = await getCircuitBreakerStore(); + const targets: WarmupTarget[] = []; + const headers = await getWarmupHeaders(); + + for (const conn of connections) { + if (enabledMap?.[conn.id] !== true) { + log.debug("warmup skip", { connectionId: conn.id, reason: "not opted-in" }); + continue; + } + if (classifyForWarmup(conn) !== "subscription") { + log.debug("warmup skip", { connectionId: conn.id, reason: "not subscription" }); + continue; + } + if (conn.testStatus && TERMINAL_CONNECTION_STATUSES.has(conn.testStatus.toLowerCase())) { + log.debug("warmup skip", { + connectionId: conn.id, + reason: "terminal", + status: conn.testStatus, + }); + continue; + } + if (await cbStore.isInBackoff(conn.id)) { + log.debug("warmup skip", { connectionId: conn.id, reason: "backoff" }); + continue; + } + const cbState = await cbStore.get(conn.id); + if (cbState?.lastResult === "forbidden") { + log.debug("warmup skip", { connectionId: conn.id, reason: "forbidden" }); + continue; + } + const proxyResolution = await resolveProxyForConnection(conn.id).catch((err) => { + log.warn("proxy resolution failed, falling back to direct", { connectionId: conn.id, err }); + return null; + }); + const proxyConfig = ( + proxyResolution ? extractResolvedProxyConfig(proxyResolution) : null + ) as WarmupTarget["proxyConfig"]; + targets.push({ + connectionId: conn.id, + label: conn.email || conn.name || conn.id, + accessToken: conn.accessToken, + refreshToken: conn.refreshToken, + tokenExpiresAt: conn.tokenExpiresAt, + authType: conn.authType, + providerSpecificData: + (conn.providerSpecificData as Record | undefined) ?? undefined, + baseUrl: "https://api.anthropic.com/v1/messages", + urlSuffix: "?beta=true", + headers, + proxyConfig, + model: process.env.OMNIROUTE_WARMUP_MODEL || "claude-3-5-haiku-20241022", + }); + } + + if (targets.length === 0) { + log.info("no subscription connections to warm up"); + return; + } + + for (let i = 0; i < targets.length; i += concurrency) { + const chunk = targets.slice(i, i + concurrency); + const results = await Promise.allSettled(chunk.map((t) => executeWarmupTarget(t))); + for (let j = 0; j < chunk.length; j++) { + const target = chunk[j]; + const settled = results[j]; + const result: WarmupResult = + settled.status === "fulfilled" + ? settled.value + : { + success: false, + tokensUsed: 0, + durationMs: 0, + failureKind: "unknown", + error: String(settled.reason), + }; + try { + await cbStore.recordResult(target.connectionId, result); + } catch (err) { + log.error("persist failed", { err, connectionId: target.connectionId }); + } + } + } +} + +async function getWarmupHeaders(): Promise> { + const { getClaudeCliHeaders } = await import("@omniroute/open-sse/config/providers/shared"); + return getClaudeCliHeaders(); +} + +type WarmupPath = "subscription" | "skip"; + +function classifyForWarmup(conn: { + provider?: string; + authType?: string; + accessToken?: string; + providerSpecificData?: unknown; +}): WarmupPath { + if (conn.provider !== "claude") return "skip"; + if (conn.authType === "api_key" || conn.authType === "apikey") return "skip"; + if (conn.authType !== "oauth") return "skip"; + if (!conn.accessToken) return "skip"; + const psd = (conn.providerSpecificData as Record | undefined | null) || {}; + const orgType = psd.organizationType as string | undefined; + const subStatus = psd.subscriptionStatus as string | undefined; + if (["claude_pro", "claude_max", "claude_team", "claude_enterprise"].includes(orgType)) { + return "subscription"; + } + if (orgType === "free") return "skip"; + if (subStatus === "active") return "subscription"; + return "skip"; +} + +async function executeWarmupTarget(target: WarmupTarget): Promise { + const start = Date.now(); + const message = getWarmupMessage(); + + const doFetch = async (accessToken: string): Promise => { + const fetchFn = () => + fetch(`${target.baseUrl}${target.urlSuffix}`, { + method: "POST", + headers: { + ...target.headers, + Authorization: `Bearer ${accessToken}`, + "content-type": "application/json", + }, + body: JSON.stringify({ + model: target.model, + max_tokens: 1, + messages: [{ role: "user", content: message }], + }), + signal: AbortSignal.timeout(10_000), + }); + return target.proxyConfig ? runWithProxyContext(target.proxyConfig, fetchFn) : fetchFn(); + }; + + const cleanupBody = (resp: Response) => { + resp.body?.cancel?.().catch(() => {}); + }; + + try { + let resp = await doFetch(target.accessToken); + if (resp.status === 401) { + const refreshed = await refreshAndUpdateCredentials( + { + id: target.connectionId, + provider: "claude", + authType: "oauth", + accessToken: target.accessToken, + refreshToken: target.refreshToken, + tokenExpiresAt: target.tokenExpiresAt, + providerSpecificData: target.providerSpecificData, + } as any, + { allowRotatingRefresh: true, force: true } + ).catch(() => null); + if (refreshed?.refreshed === true && refreshed.connection?.accessToken) { + cleanupBody(resp); + resp = await doFetch(refreshed.connection.accessToken); + if (resp.ok) { + const tokensUsed = await extractTokens(resp); + cleanupBody(resp); + return { + success: true, + tokensUsed, + durationMs: Date.now() - start, + retryAttempted: true, + }; + } + return classifyResponse(resp, start, true); + } + cleanupBody(resp); + return { + success: false, + tokensUsed: 0, + durationMs: Date.now() - start, + failureKind: "auth", + error: "Token expired (401 after retry)", + retryAttempted: true, + }; + } + return classifyResponse(resp, start, false); + } catch (err) { + const isTimeout = err instanceof Error && err.name === "TimeoutError"; + return { + success: false, + tokensUsed: 0, + durationMs: Date.now() - start, + failureKind: isTimeout ? "network" : "unknown", + error: err instanceof Error ? err.message : "Unknown", + }; + } +} + +async function classifyResponse( + resp: Response, + start: number, + retryAttempted: boolean +): Promise { + const cleanup = () => { + resp.body?.cancel?.().catch(() => {}); + }; + if (resp.ok) { + const tokensUsed = await extractTokens(resp); + cleanup(); + return { success: true, tokensUsed, durationMs: Date.now() - start, retryAttempted }; + } + if (resp.status === 401) { + cleanup(); + return { + success: false, + tokensUsed: 0, + durationMs: Date.now() - start, + failureKind: "auth", + error: "Auth error (401)", + retryAttempted, + }; + } + if (resp.status === 403) { + cleanup(); + return { + success: false, + tokensUsed: 0, + durationMs: Date.now() - start, + failureKind: "forbidden", + error: "Forbidden (403)", + retryAttempted, + }; + } + if (resp.status === 429) { + const retryAfter = resp.headers.get("retry-after"); + const retryAfterSec = retryAfter ? parseInt(retryAfter, 10) : NaN; + cleanup(); + return { + success: false, + tokensUsed: 0, + durationMs: Date.now() - start, + failureKind: "rate_limit", + error: "Rate limited (429)", + retryAfterSeconds: Number.isFinite(retryAfterSec) ? retryAfterSec : undefined, + retryAttempted, + }; + } + cleanup(); + return { + success: false, + tokensUsed: 0, + durationMs: Date.now() - start, + failureKind: "unknown", + error: `HTTP ${resp.status}`, + retryAttempted, + }; +} + +async function extractTokens(resp: Response): Promise { + try { + const body = (await resp.json()) as { + usage?: { input_tokens?: number; output_tokens?: number }; + }; + return (body?.usage?.input_tokens ?? 0) + (body?.usage?.output_tokens ?? 0); + } catch { + return 5; + } +} diff --git a/src/lib/warmupScheduler/backoff.ts b/src/lib/warmupScheduler/backoff.ts new file mode 100644 index 0000000000..0688096bc9 --- /dev/null +++ b/src/lib/warmupScheduler/backoff.ts @@ -0,0 +1,6 @@ +export function getWarmupBackoffUntil(streak: number): string { + const baseMs = 5 * 60 * 1000; + const capMs = 240 * 60 * 1000; + const backoffMs = Math.min(baseMs * Math.pow(2, streak - 1), capMs); + return new Date(Date.now() + backoffMs).toISOString(); +} diff --git a/src/lib/warmupScheduler/circuitBreakerFactory.ts b/src/lib/warmupScheduler/circuitBreakerFactory.ts new file mode 100644 index 0000000000..2e75b435cf --- /dev/null +++ b/src/lib/warmupScheduler/circuitBreakerFactory.ts @@ -0,0 +1,176 @@ +import type { CircuitBreakerStore } from "./circuitBreakerStore"; +import type { WarmupResult } from "./core"; + +type RedisCtor = new (url: string, opts?: Record) => any; + +let storeInstance: CircuitBreakerStore | null = null; +let storeIsRedis = false; +let redisClient: { disconnect?: () => void } | null = null; +/** + * The probe currently in flight, if any. Without it two concurrent callers + * both see a null cache, both build a store, and the loser's Redis client is + * overwritten before anything can close it -- a leaked socket that holds the + * event loop open. Concurrent callers await the first probe instead. + */ +let pending: Promise | null = null; + +/** + * Wraps a Redis-backed store so a runtime Redis failure drops the cached + * instance instead of being served from cache forever. + * + * Without this the cache is a trap: `getCircuitBreakerStore()` returns early on + * `storeInstance`, and the Redis methods do not catch their own errors (only + * the SQLite backup writes inside them do), so once Redis dies every later + * warmup run gets the same dead client and throws again until the process + * restarts. The error still propagates -- the run that hit the outage fails -- + * but the next call re-probes Redis and falls back to SQLite when it is gone. + * + * The three methods are listed explicitly rather than proxied because + * `CircuitBreakerStore` has exactly three, and a missed one would silently keep + * the old behaviour. + * + * Kept as a named class, not an object literal: the factory's own tests + * identify a store by `constructor.name`, so an anonymous wrapper would make a + * Redis-backed store report itself as `Object`. + */ +class RedisCircuitBreakerStoreWithFailureReset implements CircuitBreakerStore { + constructor(private inner: CircuitBreakerStore) {} + + private static onFailure(err: unknown): never { + clearCircuitBreakerStoreOnRedisError(); + throw err; + } + + get(connectionId: string) { + return this.inner.get(connectionId).catch(RedisCircuitBreakerStoreWithFailureReset.onFailure); + } + + recordResult(connectionId: string, result: WarmupResult) { + return this.inner + .recordResult(connectionId, result) + .catch(RedisCircuitBreakerStoreWithFailureReset.onFailure); + } + + isInBackoff(connectionId: string) { + return this.inner + .isInBackoff(connectionId) + .catch(RedisCircuitBreakerStoreWithFailureReset.onFailure); + } +} + +/** + * Returns the circuit-breaker store. Prefers Redis when REDIS_URL is set, + * falls back to SQLite. If Redis was connected once but later fails at + * runtime, clears the cached instance so the next call re-probes Redis + * (or falls back to SQLite if Redis is still down). + * + * Concurrent callers share one probe rather than each starting their own. + * + * Known ceiling, unchanged by that reset: once the SQLite store is cached the + * process keeps it, because only a Redis-backed store is ever evicted. A Redis + * that comes back is picked up on the next process start, not sooner. + */ +export function getCircuitBreakerStore(): Promise { + if (storeInstance) return Promise.resolve(storeInstance); + if (pending) return pending; + + const p = buildStore().finally(() => { + // Only retract our own promise. A reset can already have replaced it, and + // nulling someone else's would let the next caller start a second probe. + if (pending === p) pending = null; + }); + pending = p; + return p; +} + +async function buildStore(): Promise { + const redisUrl = process.env.REDIS_URL; + if (redisUrl) { + try { + const mod = await import("ioredis"); + const RedisCtor = (mod.default ?? mod) as RedisCtor; + const redis = new RedisCtor(redisUrl, { + maxRetriesPerRequest: 3, + connectTimeout: 3000, + lazyConnect: true, + retryStrategy: () => null, + }); + // Hand the client to closeRedisClient's care before anything that can + // throw. connect() and ping() both can, and a client the catch below + // cannot see is a socket nobody ever closes. + redisClient = redis; + await redis.connect(); + await redis.ping(); + const { RedisCircuitBreakerStore } = await import("./redisCircuitBreakerStore"); + storeInstance = new RedisCircuitBreakerStoreWithFailureReset( + new RedisCircuitBreakerStore(redis) + ); + storeIsRedis = true; + return storeInstance; + } catch { + closeRedisClient(); + storeInstance = null; + storeIsRedis = false; + } + } + + const { SqliteCircuitBreakerStore } = await import("./sqliteCircuitBreakerStore"); + storeInstance = new SqliteCircuitBreakerStore(); + storeIsRedis = false; + return storeInstance; +} + +/** + * Call when a Redis store operation fails at runtime. Clears the cached + * instance so the next getCircuitBreakerStore() call re-probes. This + * prevents a transient Redis blip from permanently killing warmup IO. + */ +export function clearCircuitBreakerStoreOnRedisError(): void { + if (storeIsRedis) { + closeRedisClient(); + storeInstance = null; + storeIsRedis = false; + } +} + +/** + * Releases the ioredis handle we are about to stop referencing. `retryStrategy` + * returns null so a dropped client never reconnects on its own, but the socket + * still holds the event loop open, and every re-probe would add another one. + * + * `disconnect()` rather than the graceful `quit()`, on purpose. We only get + * here once the client has been judged dead, so there is no reply worth + * draining -- and `quit()` on a client that never finished connecting is + * queued until it is ready, which `retryStrategy: () => null` guarantees will + * never happen. That promise never settles, so anything chained to it to do + * the actual release never runs and the handle leaks. `disconnect()` closes + * the socket now, whatever state it is in. + */ +function closeRedisClient(): void { + const client = redisClient; + redisClient = null; + if (!client) return; + try { + client.disconnect?.(); + } catch { + /* the handle is already gone; nothing left to release */ + } +} + +/** + * Test hook: forget everything and release the client. + * + * Call it between operations, never while a probe is in flight. Dropping + * `pending` mid-build leaves that build running: it will still assign + * `storeInstance` when it finishes, and a caller arriving in the meantime + * starts a second one, which is the duplicate the pending guard exists to + * prevent. Every call site today either precedes the first + * getCircuitBreakerStore() or sits in a finally after awaiting it, so the + * window stays closed by discipline rather than by machinery. + */ +export function __resetCircuitBreakerFactory(): void { + closeRedisClient(); + storeInstance = null; + storeIsRedis = false; + pending = null; +} diff --git a/src/lib/warmupScheduler/circuitBreakerStore.ts b/src/lib/warmupScheduler/circuitBreakerStore.ts new file mode 100644 index 0000000000..b1a0d71e4b --- /dev/null +++ b/src/lib/warmupScheduler/circuitBreakerStore.ts @@ -0,0 +1,16 @@ +import type { WarmupResult } from "./core"; + +export interface CircuitBreakerState { + connectionId: string; + streak: number; + until: string | null; + lastFailAt: string | null; + lastWarmupAt: string | null; + lastResult: string | null; +} + +export interface CircuitBreakerStore { + get(connectionId: string): Promise; + recordResult(connectionId: string, result: WarmupResult): Promise; + isInBackoff(connectionId: string): Promise; +} diff --git a/src/lib/warmupScheduler/core.ts b/src/lib/warmupScheduler/core.ts new file mode 100644 index 0000000000..cd8f36a4b1 --- /dev/null +++ b/src/lib/warmupScheduler/core.ts @@ -0,0 +1,26 @@ +export interface WarmupTarget { + connectionId: string; + label: string; + accessToken: string; + refreshToken?: string; + tokenExpiresAt?: string | null; + authType: string; + providerSpecificData?: Record; + baseUrl: string; + urlSuffix: string; + headers: Record; + proxyConfig: Record | string | null; + model: string; +} + +export type WarmupFailureKind = "auth" | "forbidden" | "rate_limit" | "network" | "unknown"; + +export interface WarmupResult { + success: boolean; + tokensUsed: number; + durationMs: number; + failureKind?: WarmupFailureKind; + error?: string; + retryAttempted?: boolean; + retryAfterSeconds?: number; +} diff --git a/src/lib/warmupScheduler/redisCircuitBreakerStore.ts b/src/lib/warmupScheduler/redisCircuitBreakerStore.ts new file mode 100644 index 0000000000..37c8452b6a --- /dev/null +++ b/src/lib/warmupScheduler/redisCircuitBreakerStore.ts @@ -0,0 +1,112 @@ +import type { CircuitBreakerStore, CircuitBreakerState } from "./circuitBreakerStore"; +import { getWarmupBackoffUntil } from "./backoff"; +import { + markForbidden as sqliteMarkForbidden, + upsertWarmupState as sqliteUpsertWarmupState, +} from "@/lib/db/connectionRuntimeState"; +import { logger } from "@omniroute/open-sse/utils/logger"; +import { sanitizeErrorMessage } from "@omniroute/open-sse/utils/error"; +import type { WarmupResult } from "./core"; + +const log = logger("WarmupCircuitBreaker"); + +type RedisLike = { + hgetall: (key: string) => Promise>; + hset: (key: string, ...args: any[]) => Promise; + hget: (key: string, field: string) => Promise; + expire: (key: string, seconds: number) => Promise; + persist: (key: string) => Promise; +}; + +const KEY_PREFIX = "omniroute:warmup:cb:"; + +export class RedisCircuitBreakerStore implements CircuitBreakerStore { + constructor(private redis: RedisLike) {} + + async get(connectionId: string): Promise { + const data = await this.redis.hgetall(`${KEY_PREFIX}${connectionId}`); + if (!data || Object.keys(data).length === 0) return null; + return { + connectionId, + streak: parseInt(data.streak, 10) || 0, + until: data.until || null, + lastFailAt: data.lastFailAt || null, + lastWarmupAt: data.lastWarmupAt || null, + lastResult: data.lastResult || null, + }; + } + + async recordResult(connectionId: string, result: WarmupResult): Promise { + if (result.success) { + await this.redis.hset(`${KEY_PREFIX}${connectionId}`, { + streak: "0", + until: "", + lastResult: "success", + lastWarmupAt: new Date().toISOString(), + }); + // Clear any stale forbidden flag in SQLite backup so a Redis eviction + // does not permanently trap the connection in forbidden state. + // upsertWarmupState updates last_warmup_result (unlike clearWarmupCircuit + // which only clears streak/until/lastFailAt columns). + try { + await sqliteUpsertWarmupState(connectionId, { + lastWarmupAt: new Date().toISOString(), + lastResult: "success", + tokensUsed: result.tokensUsed, + }); + } catch (err) { + // Non-fatal for THIS call -- Redis holds the live state -- but not + // harmless: the Redis key carries a TTL (see the expire below), and + // after it is evicted the stale SQLite row is what remains. Losing this + // write silently is exactly how a connection gets stuck in forbidden + // with nothing in the log to explain it. + log.warn("warmup circuit backup write failed (success path)", { + connectionId, + error: sanitizeErrorMessage(err instanceof Error ? err.message : String(err)), + }); + } + return; + } + if (result.failureKind === "forbidden") { + await this.redis.hset(`${KEY_PREFIX}${connectionId}`, { + lastResult: "forbidden", + lastFailAt: new Date().toISOString(), + }); + await this.redis.persist(`${KEY_PREFIX}${connectionId}`); + // Best-effort SQLite backup so a forbidden flag survives Redis eviction; + // Redis is the source of truth, so a backup write failure is non-fatal. + try { + await sqliteMarkForbidden(connectionId, new Date().toISOString()); + } catch (err) { + // Fails open rather than closed (the connection loses its forbidden + // backup instead of gaining a false one), so this is the less dangerous + // of the two, but it is still a lost write and belongs in the log. + log.warn("warmup circuit backup write failed (forbidden path)", { + connectionId, + error: sanitizeErrorMessage(err instanceof Error ? err.message : String(err)), + }); + } + return; + } + const state = await this.get(connectionId); + const streak = (state?.streak ?? 0) + 1; + const until = + result.retryAfterSeconds && Number.isFinite(result.retryAfterSeconds) + ? new Date(Date.now() + result.retryAfterSeconds * 1000).toISOString() + : getWarmupBackoffUntil(streak); + await this.redis.hset(`${KEY_PREFIX}${connectionId}`, { + streak: String(streak), + until, + lastResult: result.failureKind || "unknown", + lastFailAt: new Date().toISOString(), + }); + const ttlMs = Math.max(new Date(until).getTime() - Date.now(), 0) + 24 * 3600 * 1000; + await this.redis.expire(`${KEY_PREFIX}${connectionId}`, Math.ceil(ttlMs / 1000)); + } + + async isInBackoff(connectionId: string): Promise { + const until = await this.redis.hget(`${KEY_PREFIX}${connectionId}`, "until"); + if (!until) return false; + return new Date(until).getTime() > Date.now(); + } +} diff --git a/src/lib/warmupScheduler/sqliteCircuitBreakerStore.ts b/src/lib/warmupScheduler/sqliteCircuitBreakerStore.ts new file mode 100644 index 0000000000..730690b0c4 --- /dev/null +++ b/src/lib/warmupScheduler/sqliteCircuitBreakerStore.ts @@ -0,0 +1,58 @@ +import type { CircuitBreakerStore, CircuitBreakerState } from "./circuitBreakerStore"; +import { + getConnectionRuntimeState, + upsertWarmupState, + upsertWarmupCircuit, + clearWarmupCircuit, + markForbidden, +} from "@/lib/db/connectionRuntimeState"; +import { getWarmupBackoffUntil } from "./backoff"; +import type { WarmupResult } from "./core"; + +export class SqliteCircuitBreakerStore implements CircuitBreakerStore { + async get(connectionId: string): Promise { + const row = await getConnectionRuntimeState(connectionId); + if (!row) return null; + return { + connectionId: row.connectionId, + streak: row.warmupCircuitStreak, + until: row.warmupCircuitUntil, + lastFailAt: row.warmupLastFailAt, + lastWarmupAt: row.lastWarmupAt, + lastResult: row.lastWarmupResult, + }; + } + + async recordResult(connectionId: string, result: WarmupResult): Promise { + if (result.success) { + await clearWarmupCircuit(connectionId); + await upsertWarmupState(connectionId, { + lastWarmupAt: new Date().toISOString(), + lastResult: "success", + tokensUsed: result.tokensUsed, + }); + return; + } + if (result.failureKind === "forbidden") { + await markForbidden(connectionId, new Date().toISOString()); + return; + } + const state = await this.get(connectionId); + const streak = (state?.streak ?? 0) + 1; + const until = + result.retryAfterSeconds && Number.isFinite(result.retryAfterSeconds) + ? new Date(Date.now() + result.retryAfterSeconds * 1000).toISOString() + : getWarmupBackoffUntil(streak); + await upsertWarmupCircuit(connectionId, { + streak, + until, + lastFailAt: new Date().toISOString(), + }); + } + + async isInBackoff(connectionId: string): Promise { + const state = await this.get(connectionId); + if (!state?.until) return false; + return new Date(state.until).getTime() > Date.now(); + } +} diff --git a/src/mitm/manager.ts b/src/mitm/manager.ts index 027d5ac880..452f8d15e5 100644 --- a/src/mitm/manager.ts +++ b/src/mitm/manager.ts @@ -2,7 +2,12 @@ import { spawn, type ChildProcess } from "child_process"; import path from "path"; import fs from "fs"; import { resolveMitmDataDir } from "./dataDir.ts"; -import { removeDNSEntry, removeDNSEntries, checkDNSEntryForAgent, checkDNSEntry } from "./dns/dnsConfig.ts"; +import { + removeDNSEntry, + removeDNSEntries, + checkDNSEntryForAgent, + checkDNSEntry, +} from "./dns/dnsConfig.ts"; import { provisionDnsEntries } from "./dns/provision.ts"; import { generateCert } from "./cert/generate.ts"; import { installCertResult, installCaCert } from "./cert/install.ts"; @@ -229,8 +234,12 @@ const urlPath = ? decodeURIComponent(MITM_SERVER_URL.pathname.slice(1)) : decodeURIComponent(MITM_SERVER_URL.pathname); -const cwdPath = path.join(process.cwd(), "src", "mitm", "server.cjs"); -const MITM_SERVER_PATH = fs.existsSync(cwdPath) ? cwdPath : urlPath; +// Lazy-resolve to avoid module-level fs.existsSync + process.cwd() at module scope, +// which causes Turbopack's NFT tracer to follow the path into the entire src/ tree. +function resolveMitmServerPath(): string { + const cwdPath = path.join(/* turbopackIgnore: true */ process.cwd(), "src", "mitm", "server.cjs"); + return fs.existsSync(cwdPath) ? cwdPath : urlPath; +} // Check if a PID is alive function isProcessAlive(pid: number): boolean { @@ -602,7 +611,7 @@ async function startMitmInternal( } } - serverProcess = spawn(process.execPath, [MITM_SERVER_PATH], { + serverProcess = spawn(process.execPath, [resolveMitmServerPath()], { windowsHide: true, env: { ...process.env, diff --git a/src/server-init.ts b/src/server-init.ts index 3df0aafa9f..bdbcb64dde 100644 --- a/src/server-init.ts +++ b/src/server-init.ts @@ -151,6 +151,16 @@ async function startServer() { } catch (err) { startupLog.warn({ error: getErrorMessage(err) }, "Arena ELO sync could not initialize"); } + + // Radar daily feed sync: only arms itself when RADAR_ENABLED AND the user + // opt-in are already on (a flag-off boot stays timer-free — Radar inertia + // contract). Non-blocking, never fatal. + try { + const { initRadarSyncScheduler } = await import("./lib/radar/scheduler"); + initRadarSyncScheduler(); + } catch (err) { + startupLog.warn({ error: getErrorMessage(err) }, "Radar sync scheduler could not initialize"); + } } // Start the server initialization diff --git a/src/server/authz/policies/management.ts b/src/server/authz/policies/management.ts index a2949f3aa4..10c810482a 100644 --- a/src/server/authz/policies/management.ts +++ b/src/server/authz/policies/management.ts @@ -7,7 +7,10 @@ import { allow, reject } from "../context"; import { extractApiKey, isValidApiKey } from "../../../sse/services/auth"; import { getApiKeyMetadata } from "../../../lib/db/apiKeys"; import { hasManageScope } from "../../../lib/api/requireManagementAuth"; -import { hasMcpConnectOrManageScope, MCP_CONNECT_SCOPE } from "../../../shared/constants/managementScopes"; +import { + hasMcpConnectOrManageScope, + MCP_CONNECT_SCOPE, +} from "../../../shared/constants/managementScopes"; import { evaluateAccessTokenAuth } from "../accessTokenAuth"; import { isInternalServiceRequest } from "../../../lib/api/internalServiceAuth"; import { CLI_TOKEN_HEADER, PEER_IP_HEADER, VIA_PROXY_HEADER } from "../headers"; @@ -146,7 +149,11 @@ export const managementPolicy: RoutePolicy = { // // Anonymous (no Bearer / invalid key / wrong scope / no session) requests // still hit the same 403 LOCAL_ONLY they did before. - if (isLocalOnlyPath(path, ctx.request?.method) && !isLoopbackRequest(ctx) && !isPrivateLanRequest(ctx)) { + if ( + isLocalOnlyPath(path, ctx.request?.method) && + !isLoopbackRequest(ctx) && + !isPrivateLanRequest(ctx) + ) { if (isLocalOnlyBypassableByManageScope(path)) { // Management auth is header-only — a URL-borne token must never satisfy a // manage-scope bypass of a LOCAL_ONLY route. See #3300 follow-up. diff --git a/src/shared/components/Breadcrumbs.tsx b/src/shared/components/Breadcrumbs.tsx index 6df3201e75..0fb7cd6ce7 100644 --- a/src/shared/components/Breadcrumbs.tsx +++ b/src/shared/components/Breadcrumbs.tsx @@ -86,6 +86,8 @@ const PATH_LABELS = { "quota-share": "quotaShare", discovery: "discovery", "free-provider-rankings": "freeProviderRankings", + radar: "radar", + setup: "setup", "free-tiers": "freeTiers", gamification: "gamification", leaderboard: "leaderboard", diff --git a/src/shared/components/ModelSelectModal.tsx b/src/shared/components/ModelSelectModal.tsx index 47ef854927..571456447f 100644 --- a/src/shared/components/ModelSelectModal.tsx +++ b/src/shared/components/ModelSelectModal.tsx @@ -116,9 +116,9 @@ export default function ModelSelectModal({ // modelCompatOverrides.isHidden) from `/api/provider-models`, normalized so // the picker hides every model source the operator flagged — not just custom // rows that carry their own `isHidden` flag. - const [hiddenModelsByProvider, setHiddenModelsByProvider] = useState< - Map> - >(new Map()); + const [hiddenModelsByProvider, setHiddenModelsByProvider] = useState>>( + new Map() + ); // Models discovered live from a custom provider's upstream `/models` endpoint, // keyed by provider id. Merged into the alias/custom/fallback list below and // tagged with the `auto` source badge. Ported from upstream PR @@ -555,11 +555,9 @@ export default function ModelSelectModal({ if ( shouldConfirmSelectAll(toAdd.length) && !confirm( - labelOrFallback( - "selectAllConfirm", - `Add ${toAdd.length} models to this combo?`, - { count: toAdd.length } - ) + labelOrFallback("selectAllConfirm", `Add ${toAdd.length} models to this combo?`, { + count: toAdd.length, + }) ) ) { return; diff --git a/src/shared/components/NoAuthAccountCard.tsx b/src/shared/components/NoAuthAccountCard.tsx index 7d579d5d3c..650b313fe1 100644 --- a/src/shared/components/NoAuthAccountCard.tsx +++ b/src/shared/components/NoAuthAccountCard.tsx @@ -19,6 +19,8 @@ interface NoAuthAccountCardProps { savingEnabled?: boolean; onEnabledChange?: (enabled: boolean) => void; providerProxyControl?: ReactNode; + showManualKeyInput?: boolean; + onManualApiKeyAdd?: (apiKey: string) => Promise; } interface Connection { @@ -99,6 +101,7 @@ export default function NoAuthAccountCard({ savingEnabled = false, onEnabledChange, providerProxyControl, + onManualApiKeyAdd, }: NoAuthAccountCardProps) { const t = useTranslations("noAuthProvider"); const resolvedDescription = description || t("accountDescription"); @@ -116,6 +119,9 @@ export default function NoAuthAccountCard({ const [proxyUsername, setProxyUsername] = useState(""); const [proxyPassword, setProxyPassword] = useState(""); const [savingProxy, setSavingProxy] = useState(false); + const [manualApiKey, setManualApiKey] = useState(""); + const [addingManualKey, setAddingManualKey] = useState(false); + const [showManualKeyInput, setShowManualKeyInput] = useState(false); const popoverRef = useRef(null); const fetchConnections = useCallback(async () => { @@ -212,6 +218,23 @@ export default function NoAuthAccountCard({ } }; + const handleAddManualApiKey = async () => { + if (!manualApiKey.trim()) return; + setAddingManualKey(true); + try { + if (onManualApiKeyAdd) { + await onManualApiKeyAdd(manualApiKey.trim()); + } + setManualApiKey(""); + setShowManualKeyInput(false); + await fetchConnections(); + } catch (err) { + console.error("Failed to add manual API key:", err); + } finally { + setAddingManualKey(false); + } + }; + const handleRemoveAccount = async (accountId: string) => { if (!conn) return; const updated = allAccountIds.filter((id) => id !== accountId); @@ -375,6 +398,45 @@ export default function NoAuthAccountCard({ + {showManualKeyInput && ( +
+ setManualApiKey(e.target.value)} + placeholder="Paste API key..." + className="rounded-md border border-black/10 bg-bg px-2 py-1 text-xs dark:border-white/10" + disabled={addingManualKey || !enabled} + /> + + +
+ )} + {!showManualKeyInput && onManualApiKeyAdd && ( + + )}
@@ -541,12 +603,14 @@ export default function NoAuthAccountCard({ )}
+ {!autoAvailable && ( +

+ Install sqlcipher: brew install sqlcipher +

+ )} +
+ +
+

+ Local dev only. Uses your Raycast Pro subscription via reverse-engineered + API. Not official — may break on Raycast updates. +

+ +
+ + {showManual && ( + <> +
+ +